Skip to content

From the team

Technical debt: what it is and when to pay it

Technical debt is real, it is not always worth fixing, and the skill is telling the two apart. A guide for the people who approve the budget.

5 min read

Technical debt is the gap between how your software is built and how it should be built to support what you now need from it. This article is for business owners and product managers who keep hearing the phrase from their developers and want to know whether it is a real problem or an excuse, and for developers who need language to explain it to the people who approve budgets. The honest answer: it is real, it is not always worth fixing, and the skill is knowing which is which.

What is technical debt in plain business terms?

The financial metaphor is accurate, which is why it stuck. When a team takes a shortcut to ship faster, it borrows time from the future. The interest is paid every time someone works in that part of the code afterwards: features take longer, bugs appear in unexpected places, and simple changes require careful testing because nobody is confident what else they will affect.

Like a loan, debt is not inherently bad. A shortcut that got the product to market before a competitor was probably the right call. Debt becomes a problem when the interest payments grow larger than the cost of settling it, or when nobody knows how much of it there is.

It is also worth saying what it is not: not a bug, though it causes them, and not something that only happens to badly run teams. Every codebase that has survived long enough to matter carries some.

What is the difference between deliberate and accidental debt?

Deliberate debt is a shortcut taken knowingly, with a note of what was skipped and why. A payment integration hard-coded for one provider because there was only one provider at launch. These are decisions, and decisions can be revisited.

Accidental debt is the shortcut nobody knew they were taking. A data model that made sense for the first version and quietly became wrong when the business changed. A framework version that fell out of support because upgrading kept being postponed.

The difference matters because of visibility. Deliberate debt is usually recorded somewhere and can be scheduled. Accidental debt is discovered, usually at the worst time, and it is the kind that produces the emergency rewrite. A team that keeps a written list of its known shortcuts is in a far better position than one that does not.

How do you spot technical debt without reading code?

You do not need to read the code. You need to watch the symptoms:

  • Estimates keep growing for the same kind of work. A change that took a week last year takes three now.
  • Small changes cause unrelated breakage. Fixing the checkout breaks the reports.
  • The team is afraid of certain areas. If developers talk about a module with dread, or only one person is allowed to touch it, that module is carrying debt.
  • Releases are stressful. Deployments that need a weekend, a rollback plan and a person on standby usually mean the test coverage or the release process is in debt.
  • Upgrades are always "next quarter". Frameworks, language versions and libraries that are several major versions behind are debt with a security cost attached.
  • New developers take a long time to become useful. Onboarding time is a direct measure of how understandable the codebase is.

If you are seeing three or more of these, the debt is material and you should ask for it to be quantified.

When is paying down technical debt worth it?

Pay it when the interest is being charged against something you are about to do.

If the roadmap has a large feature in the module everyone is afraid of, clean that module first. The feature will be cheaper, and the cleanup gets paid for by the work that follows it. If you are about to scale marketing and the release process cannot cope with weekly deployments, fix the release process before the campaign, not during it.

The pattern is that debt repayment should be attached to a business reason and scheduled alongside feature work, not proposed as a standalone "quality" project with no visible outcome. In our own delivery, this is why refactoring is scoped as part of the phased plan rather than as a separate line the client is asked to trust: each two-week iteration ends in a working demo, and the cleanup that made a feature possible is visible in the same demo.

When should you leave the debt alone?

More often than developers would like. Debt in a part of the system that is stable, rarely changed and working does not need to be paid.

Leave it when:

  • The module is scheduled for replacement anyway.
  • No planned work goes near it.
  • The fix would take longer than the remaining life of the product.
  • The team wants to fix it for reasons of taste rather than because it is slowing anything down.

The decision is a financial one, and it belongs to the business with the engineers advising. Ask for the list of known debt, ask what each item costs today in slower work, and ask what it would cost to fix. Then choose, as you would with any other loan.