Skip to main content
Home
HexagonalGuru

Technical Debt: What It Really Is, When It's Good and How to Pay It Down

HexagonalGuru's avatar

HexagonalGuru

Technical Debt: What It Really Is, When It's Good and How to Pay It Down

"We have a lot of technical debt" is one of the most uttered and least understood phrases in the industry. Developers use it to say "this code hurts". Managers hear it as "I want time for things that don't sell". And between the two readings, technical debt becomes a useless concept: everything is debt, nothing is a priority, and the conversation always ends in "we'll talk about that later".

Ward Cunningham's original metaphor was far more precise — and far more useful: technical debt is borrowing speed from the future. Like all debt, it can be a brilliant lever or a deadly trap. The difference isn't how much you have, but whether you know how much you have, why you took it on and how it gets paid. This guide puts that in order, for engineers and for business.

What Technical Debt Actually Is

Technical debt is the distance between the code you have and the code you'd need for the next change to be cheap. It's not "ugly code": it's code whose current structure makes every change cost more than it should.

The financial metaphor works because it fits in three details most people forget:

  1. You take it on for a reason. Nobody gets a mortgage out of boredom: you get one because buying a house outright is impossible. Technical debt is taken on to ship earlier, validate a market, honour a contract. The loan has a purpose — and if it didn't, it wasn't debt: it was carelessness.
  2. It accrues interest. Every new feature on badly structured code costs a bit more than the last. The interest shows on no invoice: it shows in the team's velocity, decaying month after month with nobody able to explain why.
  3. You amortise it or it eats you. A debt without payments grows. Code doesn't improve by itself over time; it worsens, because every rushed change adds more distance.

The Four Types (Not All Debt Is Equal)

Martin Fowler's classic quadrant splits debt along two axes: whether it was deliberate and whether it was prudent. It's worth it because each quadrant is managed differently:

Technical debt quadrant: deliberate or inadvertent, prudent or reckless, with examples of each type and how to manage it
  1. Deliberate and prudent: "We're shipping without retries or a queue because we need to validate the market this month; if the product works, we do it properly in Q2." This is healthy debt: decided, documented and with a repayment plan. Every team that ships on time uses it.
  2. Deliberate and reckless: "There's no time for tests, there's never time for tests." That's not strategy: it's a bad decision on repeat. You recognise it because nobody documents it and nobody talks about when it gets paid.
  3. Inadvertent and prudent: "Now that we understand the domain, we see the model should have been different." It's inevitable and it's a sign of learning — the team designs better today than yesterday. You manage it by refactoring as you pass through the area.
  4. Inadvertent and reckless: "We didn't know this was a problem." Unnecessary layers, fashionable abstractions, badly copied patterns. The most expensive of all, because nobody knows it exists until it blows up.

The diagnosis matters: deliberate debt with a plan isn't a problem, it's a tool. Inadvertent debt is what demands an audit.

How to Know How Much You Have (Without Smoke Metrics)

Forget "code smell" counters as a measure of debt. The signals that actually correlate with expensive debt:

  • Declining delivery velocity: if comparable features take longer and longer, you're paying interest. It's the metric business understands without translation.
  • Hotspots: the files that change the most and have the worst structure. Your git history hands them to you for free — and they're usually the 5% of the code causing 50% of the pain.
  • Localised fear: ask the team "which part of the code do you avoid touching?". The answer is a free, surprisingly accurate debt map.
  • Onboarding time: if a new person takes months to become productive, the debt is charging admission.

If you need a formal, external snapshot, that's exactly what a code audit reviews: measured dimensions, hotspots with evidence and a prioritised backlog.

How to Pay It Down: Strategies That Work

Strategies for paying down technical debt: boy scout rule, a fixed 20% quota, strangler fig for critical modules and the big rewrite as a last resort
  1. The boy scout rule (continuous payment): leave every file you touch a bit better than you found it. Rename the confusing, extract the giant method, add the missing test. It won't pay off structural debt, but it slows the interest — and requires nobody's permission.
  2. The fixed quota (planned payment): 15-20% of each sprint's capacity reserved for debt, chosen by the technical team from a visible backlog. It works if the quota is sacred; if it's negotiated every sprint, it's not a quota: it's an illusion.
  3. The strangler fig (structural payment): for critical modules, don't rewrite: strangle. Build the new path around the old one, migrate flow by flow, and the legacy code dies of disuse. It's slower than a rewrite and infinitely less risky.
  4. The big rewrite (technical bankruptcy): throw it away and start over. Sometimes it's the right answer — when the domain changed so much the model no longer represents the business — but it's the option with the most corpses in software history. If you choose it, do it with evidence, not frustration.

In practice, healthy teams combine the first three: boy scout always, fixed quota for known debt, strangler for the monsters.

How to Explain It to Business (Without Sounding Whimsical)

The conversation that works translates debt into money and velocity, never into aesthetics:

  • "It's not that the code is ugly: it's that every feature costs 30% more than a year ago." The velocity curve is the argument no director dismantles.
  • "We can keep not paying it, but compound interest doesn't negotiate." Technical debt is one of the few debts whose interest rate rises on its own.
  • "Paying it isn't a project: it's a mortgage with a fixed instalment." Asking for "six months to redo everything" sounds like a whim; asking for 15% of every sprint sounds like management.
  • "The visible alternative is failure; the invisible one is slowness." Systems rarely explode from debt; they become so expensive to change that the business loses opportunities without noticing.

Common Mistakes

  1. Calling everything you dislike debt. If everything is debt, nothing is a priority. Debt is the distance that makes change expensive; the rest is aesthetic preference.
  2. Taking it on without documenting it. Undocumented deliberate debt becomes inadvertent within two quarters: nobody remembers it was a decision or what the repayment plan was.
  3. Paying it away from the product. Isolated "refactoring sprints" always fail: they lose the budget battle the first time a deadline squeezes. The quota inside the sprint survives; the debt sprint doesn't.
  4. Prioritising by ugliness instead of impact. The ugliest code in the module nobody touches costs zero euros a year. Debt is prioritised where change happens.
  5. Believing you can reach zero. A living system always has debt: the goal isn't zero, it's a level where the interest doesn't slow the business.

In Summary

Technical debt is speed borrowed from the future: useful when deliberate and documented, lethal when inadvertent or without a repayment plan. It's measured in delivery velocity, hotspots and localised fear — not code smells. And it's paid like a mortgage: continuous instalments (boy scout), planned instalments (15-20% per sprint) and the strangler fig for the structural. The question isn't whether you have debt — you do — but whether you manage it or it manages you.

If your team is losing velocity without a clear explanation, or the technical-debt conversation with management always goes badly, we can help with both: the technical evidence and its translation into business. Tell us about your case →

Keep reading: The testing pyramid: a practical guide for suites that don't fall apart.

  • #quality
  • #technical-debt

Related articles

Shall we start?

Ready to build something that grows with your business?

Tell us your goals and together we will map the design, development and technology route that takes you from vision to measurable results.