6 min read

John Miniadis

Why internal tools built by developers take so long to change

Why internal tools built by developers take so long to change

Why small changes to developer-built internal tools take weeks, and the architecture decisions that cause it.

Blog article header for "PostgreSQL INT4RANGE: Enforce non-overlapping zones in SQL" by Omar Tarek, Stackdrop Engineering
Blog article header for "PostgreSQL INT4RANGE: Enforce non-overlapping zones in SQL" by Omar Tarek, Stackdrop Engineering

Internal tools take weeks to change when the architecture is tightly coupled: queries wired into the interface, and the rules for what the tool does are spread across components with no shared model of how it behaves. The engineers are not slow. The structure makes every small change risky, so each one becomes a careful investigation before anyone touches the code.

Why does a small change to an internal tool take so long?

A small change takes a long time because the cost is not in writing the change; it is in finding out what the change will break. When a query is wired directly into a button, and that query also feeds a table three components away, editing the button means tracing every place the same query is read. The engineer spends a day mapping dependencies and an hour making the edit.

This is the pattern that shows up across builds where the first version was delivered fast and never refactored. A field gets renamed in the database, and four components silently stop rendering because each one referenced the old name in its own place. Nothing flagged it, because the tool has no single layer that knows the shape of the data. The work is real, the engineers are capable, and the time goes into investigation, not the edit itself.

The risk compounds when the tool runs on live data. Changes land on production systems that the operations or support team uses every day, so the engineer cannot move quickly without the chance of breaking a workflow someone depends on. Slow change in that setting is caution, and the caution is rational given the structure.

What architecture decisions make a tool expensive to change?

Three decisions make a tool expensive to change, and all three trace back to coupling. The first is wiring queries straight into the interface so the same data fetch lives inside the component that displays it, which means data and presentation cannot move independently. The second is scattering the logic for what the tool does across component event handlers, where a rule about who can approve a refund sits inside one button and is duplicated, slightly differently, inside another.

The third is the absence of a documented model of how the tool behaves. When the only record of the logic is the running code, every engineer who touches it has to rebuild the mental model from scratch, and the person who built it first is usually the only one who holds it. This is the part of the system that the published work on the logic behind how your tools behave addresses: mapping the workflow logic before building keeps it out of the components and in a place the next engineer can read.

A concrete version of this in a Retool build is logic living inside component event handlers instead of in named queries or a shared resource. The handler approach works on the first pass and turns into a maintenance cost on the tenth, because the rules are distributed across the canvas with no index. Pulling that logic into source-controlled queries against a PostgreSQL layer gives the tool one place to change a rule, which is what makes the rule cheap to change later.

How do you tell if a tool has a change problem or an effort problem?

You tell the difference by looking at where the time goes on a small request, not at how long the request takes end-to-end. An effort problem looks like a queue: the change is straightforward, the engineers understand it, and it is waiting behind other work. A change problem looks like a one-line edit that takes a week, where most of the week is spent reading the existing code to work out what the edit will affect.

The clearest signal is the ratio of investigation time to editing time. When engineers routinely say a change is risky, or ask for a full regression check before shipping a label change, the architecture is telling you it has no separation between the part that changed and the parts that did not. Another signal is dependence on one person; if only the original builder can safely make changes, the knowledge lives in their head and not in the structure, and that is a property of the build, not the team.

Backlog pressure hides this well. A team can read a slow internal tool as a resourcing gap and add engineers, and the new engineers hit the same investigation cost because the cost is structural. More capacity moves the queue; it does not lower the price of each change.

What makes an internal tool cheap to change?

An internal tool is cheap to change when the data, the interface, and the logic are separated, the logic is documented, and there is a shared model of how the tool behaves. Separation means a query can change without touching the components that read it, and a component can change without rewriting the data fetch underneath it. That single property turns most one-line edits back into one-line edits.

Documentation here is not a manual; it is the logic held in named, source-controlled queries and a data model that describes the shape of the tool, so the next engineer reads the structure instead of reverse-engineering it. When the tool is built this way, governance and change speed stop competing: role-based access, audit logging, and source control are part of the structure instead of additions that slow each release. The same discipline that keeps a tool auditable is what keeps it editable.

This is the architecture principle behind building internal software that lasts, and it is closely tied to keeping internal tools fast as they scale, because the separation that makes a tool cheap to change is the same separation that lets you optimise a query without rewriting a screen. If your internal tools have reached the point where small changes feel expensive, talk to us about the build; the fix is usually structural, and it is usually narrower than a full rebuild.

FAQ

Is this a low-code problem or a custom-code problem?

It is an architecture problem, and it appears in both. Hand-written React and a low-code build both slow down when queries, interface, and logic are coupled. The platform changes how the coupling looks, not whether it costs you. A disciplined Retool build with source control and named queries is easier to change than tangled custom code, and a careless one is harder.

Can you fix the change cost without a full rebuild?

Usually, yes. Most of the cost lives in a few coupled areas: logic buried in component handlers, queries duplicated across screens, and a missing data model. Refactoring those in place, with the logic moved into source-controlled queries, brings change cost down without starting over. A full rebuild is the exception, reserved for tools whose data model itself is wrong.

How does governance affect how fast a tool can change?

Governance built in from the start speeds change instead of slowing it. Role-based access, audit trails, and source control give engineers a safe way to make and review changes on live systems, which is where most of the caution comes from. Governance added after the fact slows things down, because it gets bolted onto a structure that was not designed to carry it.

Get monthly insights on building better internal tools, faster.