Skip to content
← Blog

Technical Debt: When to Pay It Down and When to Leave It Alone

Technical debt is not always bad and paying it down is not always the right decision. The question is which debt is slowing the business and which is just aesthetically uncomfortable for engineers.

Technical debt gets talked about as if it is uniformly bad — a problem to be eliminated, a sign of poor engineering, a thing that accumulates through carelessness and gets paid down through discipline.

This framing is wrong in a useful way. Some technical debt is intentional, rational, and should be left in place. Some is genuinely costly and should be addressed urgently. Most engineering teams have trouble distinguishing between the two, which leads to either ignoring debt that is slowing them down or refactoring code that did not need to be touched.

What Technical Debt Actually Is

Ward Cunningham’s original metaphor is more specific than it is usually remembered. He was describing the deliberate choice to write code that works now but will need to be redesigned when the understanding of the problem matures — and committing to do that redesign later.

The debt is the cost of the future redesign. Like financial debt, it accrues interest in the form of slower development, more bugs, and harder maintenance. Also like financial debt, taking it on strategically — when you need to move fast and can afford the future cost — is not inherently wrong.

The problem is debt that was not intentional. Code written poorly because of time pressure with no plan to revisit. Systems whose architecture was not designed for the scale they reached. Dependencies that were never updated until they became security risks.

The Debt That Actually Slows You Down

Not all debt has the same interest rate. The categories that compound most aggressively:

Core domain complexity. The code that models your core business logic — pricing, user permissions, billing, the primary product workflow. When this is tangled, every feature that touches it is harder, slower, and riskier to build. The business pays a tax on every sprint.

Test coverage gaps in critical paths. Without tests around the behaviour that matters most, changes in one part of the system break things in another and nobody finds out until a customer reports it. This creates a culture of fear around changes, which slows development across the board.

Dependency drift. Libraries and frameworks that are multiple major versions behind are not just technical discomfort — they are security vulnerabilities, incompatibility time bombs, and an increasing block on hiring engineers who work with modern tooling.

Undocumented tribal knowledge. The system that only one engineer fully understands. When they leave, or when they are unavailable, everything that touches that system slows to a stop.

The Debt That Can Wait

Aesthetically imperfect but functional code. If the code is not causing bugs, not slowing down development, and not confusing the people who maintain it, refactoring it is satisfying but not valuable. Engineers often find code that offends their sensibility and want to clean it up. This is not always a good use of time.

Architecture that is wrong for a scale you have not reached. Microservices designed for a hundred engineering teams add coordination overhead that a five-person team cannot justify. Premature optimisation for scale you do not have is debt in itself — the complexity of the solution is the debt.

Old features that still work. If a five-year-old part of the codebase still functions, has users, and is not blocking anything, the business case for rewriting it requires more than “the code is old.”

How to Decide

The decision framework is business impact, not engineering aesthetics.

Does this debt slow the delivery of features that matter to the business? Is it creating bugs that affect users? Is it a security or compliance risk? Is it blocking the ability to hire or onboard engineers effectively?

If yes to any of these, pay it down — deliberately, scoped to the area causing the problem, not as a sprawling “refactor everything” initiative that has no defined end state.

If no, add it to a backlog, review it quarterly, and leave it alone while you build things that matter.


PNK WORKS architects systems with sustainable foundations and is honest about when to refactor and when not to. Start a project.

Ready to work together?

Start a Project →