Ben Sutherland

Ben Sutherland

Head of Engineering & CTO

Read Resume
Articles
8 min read
Technical StrategyEngineering LeadershipDeliveryArchitecture

Technical Debt Is a Balance Sheet, Not a Sin

Treating tech debt as a moral failing leads to guilt-driven rewrites and paralysis. Treat it as a balance sheet — taken deliberately, tracked, and serviced where you're about to build.

Technical Debt Is a Balance Sheet, Not a Sin

There is a conversation every engineering team eventually has.

The roadmap is full. The business needs something shipped. The team can see the mess under the surface. Someone says, "We really need to stop and fix the tech debt."

Then the room splits.

Engineering argues that the system is getting harder to change. Product argues that customers are waiting. Leadership wants to know whether this is genuinely urgent or just engineers wanting time to clean up code they do not like.

Everyone is partly right.

That is why I think the way we talk about technical debt matters.

Too often, debt is treated like a moral failing. The code is "bad." The team "let it happen." The responsible thing is to stop, clean it up, and get back to a healthier state.

Sometimes that is true. But as a general frame, I do not find it useful.

Technical debt is not a sin.

It is a balance sheet.

Some debt is taken deliberately to move faster. Some debt is accidental. Some has low interest. Some quietly compounds until every change costs more than it should. Some should be paid down immediately. Some is acceptable as long as everyone knows it exists.

The leadership skill is not pretending debt is always bad.

The skill is knowing what debt you have, what it is costing you, and when paying it down creates more leverage than carrying it.

Not all debt is equal

The first mistake is putting every form of debt into the same bucket.

There is a world of difference between deliberate debt and accidental debt.

Deliberate debt is when the team makes a conscious trade-off. We know the implementation is narrower than the ideal version. We know the abstraction will not hold forever. We know the manual process will not scale. We accept it because the market window matters, the risk is low enough, and we have a clear trigger for revisiting it.

That can be good engineering.

Reckless or inadvertent debt is different. That is the mess nobody chose. The coupling nobody noticed. The permission model that grew sideways. The service boundary that was never really designed. The repeated shortcut that became architecture by accident.

Those should not be spoken about the same way.

If we moralise all debt, teams become afraid to make pragmatic trade-offs. If we normalise all debt, teams stop noticing when the system is getting harder to operate.

The useful question is not "do we have debt?"

Of course we do.

The useful question is: did we take it deliberately, and are we servicing it?

Debt can be the right financing

Sometimes technical debt is the right financing.

If taking a shortcut gets the product into market sooner, validates an assumption, wins a customer, or buys the business time, that may be a completely rational decision.

The problem is not taking debt.

The problem is pretending you did not.

This is where the balance-sheet metaphor helps. A business understands financing. You might take on debt to fund growth. You might accept a short-term liability for a larger opportunity. But you do not pretend the liability does not exist, and you do not ignore the interest forever.

Engineering debt should be treated the same way.

If we choose a narrower implementation to hit a date, write it down. If we accept a manual operational process for the first ten customers, write it down. If we defer a deeper platform investment until usage proves the need, write it down.

That does not make the debt disappear. It makes the trade-off visible.

And visible trade-offs can be managed.

Invisible trade-offs become folklore, frustration, and eventually surprise.

Track the interest, not just the principal

When people talk about technical debt, they often focus on the principal: the thing we need to fix.

This module needs rewriting. This service needs splitting. This framework needs upgrading. This abstraction needs cleaning up. This workflow needs automating.

That matters, but it is not the most important number.

The important number is the interest.

What is this debt costing us every week?

Is delivery slower in this part of the system? Are defects more common? Are reviews harder? Are new engineers confused? Are releases riskier? Are incidents taking longer to diagnose? Are teams avoiding changes because the area feels unsafe?

That is the cost that matters.

A messy piece of code nobody changes may not be worth fixing today. It may offend our taste, but if it is stable, isolated, and not on the roadmap, the interest may be low.

A slightly messy area that every upcoming initiative depends on is different. Even if the principal looks smaller, the interest is high because the team keeps paying it.

This is why I do not like blanket cleanup arguments.

"We need to fix the debt" is too vague.

"Every change in onboarding is taking twice as long because the state model is unclear, and the next quarter's roadmap depends on onboarding" is a much better conversation.

Now we are talking about investment.

Make the debt visible

The practical habit I like is a lightweight debt register.

Not a giant process. Not a guilt list. Not a dumping ground for every annoyance in the codebase.

A simple register.

What is the debt? What impact is it having? Where is the interest showing up? What would trigger paying it down? Who owns the decision?

That last part matters. A trigger turns debt from a complaint into a portfolio decision.

Maybe the trigger is "when we build the next workflow in this area." Maybe it is "when incidents happen twice in a quarter." Maybe it is "when onboarding time for this team exceeds a week." Maybe it is "when usage reaches this scale." Maybe it is "before we add another customer segment."

The register does not need to be perfect.

It needs to make the debt discussable.

Without visibility, technical debt becomes a vibe. Engineers feel it. Leaders hear frustration. Product sees delays. Nobody has a shared picture.

With visibility, the conversation changes.

We can decide what to carry, what to pay down, and what to refinance.

Pay it down where you are about to build

One of the best rules I have found is to service debt where you are about to invest.

If the next quarter's roadmap depends heavily on an area of the system, that is where debt paydown matters most. Clean the path before you send more work through it.

This is usually better than a blanket cleanup sprint.

Cleanup sprints feel satisfying, but they often spread effort across areas that are not about to change. The team improves things, but the business does not feel the return. Then the next time engineering asks for debt paydown, the request is harder to defend.

Paying down debt near upcoming work is different.

The connection to value is clear. The team can move faster on the roadmap. The risk reduction is immediate. The business can understand why this cleanup matters now.

This also keeps the work grounded.

We are not refactoring for aesthetic purity. We are reducing drag in the part of the system we are about to depend on.

That is a much stronger argument.

Beware the rewrite trap

The most expensive form of guilt-driven debt management is the big rewrite.

Sometimes rewrites are necessary. I do not want to pretend they never are. There are systems where the accumulated cost, risk, or architectural mismatch is so high that replacement is rational.

But big-bang rewrites are usually sold with more certainty than they deserve.

The old system has debt, but it also has knowledge. It has edge cases. It has production behaviour. It has years of awkward business reality encoded into it. A rewrite often rediscovers that complexity slowly, then reintroduces a new version of the same debt with fresher bugs.

That is why I prefer incremental refinancing.

Strangle the old path. Replace the riskiest seam. Move ownership gradually. Create a new boundary. Pay down debt in the areas where change is already happening. Keep the system delivering while you improve its shape.

That approach — incremental modernisation over the big-bang rewrite — deserves its own piece, but the principle is the same here: do not chase a guilt-driven clean slate if a staged refinancing gets you the leverage with less risk.

Speak in investment and risk

Technical debt conversations often fail because engineering speaks in code quality while executives hear delay.

That is not because executives do not care. It is because "the code is messy" is not a business case.

The better frame is investment and risk.

This debt is slowing delivery in the part of the product we are about to grow. This debt is increasing incident risk. This debt makes onboarding harder. This debt means every enterprise feature will cost more until we fix the underlying permission model. This debt is acceptable for now because the interest is low and the area is stable.

That language lands differently.

It turns the conversation from indulgence into portfolio management.

We are not asking for time to make engineers feel better. We are deciding whether carrying this liability is still a good trade.

Sometimes the answer will be yes. Carry it.

Sometimes the answer will be no. Pay it down.

Both are legitimate if the reasoning is explicit.

The goal is leverage under control

I do not want engineering teams to feel guilty for every shortcut.

I also do not want teams to hide behind pragmatism while the system becomes harder to change every month.

The balance is deliberate debt, visible interest, and disciplined servicing.

Take debt when it buys something real. Write it down. Track the drag it creates. Pay it down where you are about to build. Avoid the big rewrite unless the case is genuinely strong. Explain the work in terms of investment, risk, and delivery.

Debt is not a sin.

It is financing.

Used deliberately, it can create leverage. Ignored, it compounds. Moralised, it creates guilt-driven rewrites and paralysis.

The goal is not a perfectly clean balance sheet.

The goal is leverage under control.

2026 Ben Sutherland