Your team estimated three days. It took three weeks. Nobody was lazy, nobody was incompetent, and the post-mortem — if there was one — blamed "unexpected complexity."

Then it happened again on the next feature. And the one after that.

When delivery slows down without an obvious cause, the cause is very often technical debt. Not in the way most founders picture it — a few messy files a developer wants to tidy up — but as something more expensive: a growth constraint that quietly consumes a large share of your engineering capacity and, if nobody manages it, starts making technical decisions on your behalf.

This post is about seeing that cost clearly, measuring it, and paying it down without stopping the roadmap.

What technical debt actually is

Ward Cunningham introduced the term in 1992, in an experience report about a financial software product called WyCash. His framing was deliberately financial:

"Shipping first time code is like going into debt."

The metaphor works because of what comes next. Cunningham continued: "Every minute spent on not-quite-right code counts as interest on that debt" — and "the danger occurs when the debt is not repaid."

Martin Fowler sharpened the idea of interest: "The extra effort that it takes to add new features is the interest paid on the debt." He also pointed out where the metaphor breaks down, and it matters for founders. Financial interest accrues with time. Technical interest is only paid when someone works in the affected part of the system. Debt in a corner of the product nobody touches costs almost nothing. Debt in the code every new feature passes through is charged on every single feature you build.

That is the first thing to understand about the hidden cost: it is concentrated exactly where your roadmap is.

The hidden metric: how much capacity debt consumes

Technical debt rarely appears on a dashboard, which is why it is so easy to underestimate. But it has been measured.

In Stripe's Developer Coefficient study, published in September 2018 and conducted with Harris Poll among more than 1,000 developers and more than 1,000 C-level executives, developers estimated that they spend an average of 13.5 hours of a 41.1-hour working week on technical debt — roughly a third of their time — and another 3.8 hours on bad code.

Treat that as a survey estimate, not a law of nature; your team's number may be lower or considerably higher. But the order of magnitude is the point. If anything close to a third of your engineering capacity goes to working around past decisions, then a team of six is effectively shipping like a team of four — and you are paying for six.

Fowler makes a related point about how quickly this sets in. In Is High Quality Software Worth the Cost? (2019), he writes that "developers find poor quality code significantly slows them down within a few weeks." This is not a problem that waits years to show up. It starts compounding almost as soon as the shortcuts are taken.

The reason it stays hidden is simple: as Fowler notes, "customers and users cannot perceive the architecture of the software." Neither, usually, can founders. What you perceive is the symptom — the three-day feature that took three weeks — not the cause.

How unmanaged debt makes decisions on your behalf

The most expensive effect of technical debt is not the hours. It is the decisions it takes away from you.

When debt goes unmanaged long enough, the system starts answering questions that should be business decisions:

  • Which features you can build. A data model that cannot represent what your largest prospect needs means the answer to "can we support multi-location accounts?" is no longer a product decision. It is "not without a rewrite."
  • How fast you can respond. If every change requires touching a dozen tightly coupled files, a competitor's two-week response to a market shift becomes your two-month response.
  • Which technology you run on. Frameworks and libraries reach end of life. If upgrading is too risky because nothing is covered by tests, you stay on the old version — and inherit its security vulnerabilities — not because anyone chose to, but because the debt chose for you.
  • Who can work on the product. Code that only one person understands turns that person into a bottleneck and a retention risk, and makes onboarding new engineers slow and expensive.
  • What your estimates mean. When every estimate carries an unknown amount of debt, planning stops being reliable, and the roadmap you present to your board or customers becomes a guess.

None of these show up as "technical debt" in a meeting. They show up as missed deadlines, lost deals, delayed launches and engineering hires that do not seem to increase output.

Not all debt is bad

Debt is not a moral failing, and a codebase with zero debt usually belongs to a product that shipped too late.

In 2009, Fowler classified technical debt along two axes — deliberate or inadvertent, prudent or reckless. Prudent, deliberate debt is a team knowingly taking a shortcut to hit a launch window, with an understanding of what it will cost to repay. That is a legitimate business decision, the same way taking a loan to fund growth is.

Even excellent teams also accumulate prudent, inadvertent debt: once a product has been in front of real users for a while, the team learns what the design should have been. Fowler calls this kind of debt inevitable.

The dangerous kind is reckless debt — shortcuts taken without understanding their cost, or messes created because nobody knew better. Fowler's verdict on the latter is blunt: "a mess is not a debt." It has no repayment plan. It just compounds.

The goal is not zero debt. The goal is debt that was chosen, recorded and is being paid down — instead of debt that is choosing for you.

Symptoms you can spot without reading the code

You do not need to be technical to see the warning signs. Look for patterns, not single incidents:

  • Estimates are missed by multiples, not percentages. Every team misses estimates. Consistently missing them by 3–5× suggests the system is fighting the team.
  • Small changes have large blast radiuses. A change to one feature breaks something apparently unrelated.
  • Bugs come back. Fixes do not stick, because the underlying structure keeps producing the same class of problem.
  • "We'd need to refactor that first" is a common answer. Occasionally, it is normal. As the default answer to new requests, it is a signal.
  • Upgrades and security patches keep getting postponed. This is debt accruing in its most dangerous form.
  • Adding engineers does not increase output. New people spend months learning the workarounds before they can contribute.
  • Product decisions are framed around what the system allows. "We can't do it that way" has replaced "should we do it that way?"

How to measure it

What gets measured gets managed — and debt that is only felt, never measured, tends to get managed last.

Track delivery performance. DORA, the research programme behind the Accelerate State of DevOps reports, defines five software delivery metrics that make the cost of debt visible over time:

  • Change lead time — how long it takes a committed change to reach production.
  • Deployment frequency — how often you deploy.
  • Failed deployment recovery time — how long it takes to recover when a deployment fails.
  • Change fail rate — the share of deployments that need immediate intervention, such as a rollback or hotfix.
  • Deployment rework rate — the share of deployments that are unplanned and caused by a production incident.

Rising lead times and fail rates with a stable team are one of the clearest quantitative signals that debt is accumulating faster than it is being paid down.

Build a debt inventory. Ask the team to list known debt items, where they live, what they slow down and roughly what it would take to address each one. An inventory turns a vague complaint into a backlog that can be prioritised alongside features — and it is one of the first things we look for in a technical review, as covered in our technical due diligence checklist.

Find the hotspots. Not all debt is equally expensive. In Your Code as a Crime Scene, Adam Tornhill describes using version-control history to find development hotspots and prioritise technical debt — intersecting how complex a piece of code is with how often the team actually changes it. Complex code that nobody touches can wait. Complex code that changes every sprint is where the interest is being paid.

How to pay it down without stopping the roadmap

The instinct, once the cost becomes visible, is a dramatic fix: a feature freeze, or a rewrite from scratch. Both are usually the most expensive option available.

Joel Spolsky called rewriting from scratch "the single worst strategic mistake that any software company can make," using Netscape as his example — a company whose last major release had shipped almost three years before he wrote his essay in 2000. As he put it, when you throw away working code, "you are throwing away all that knowledge. All those collected bug fixes."

What works instead is continuous, targeted repayment:

  1. Stop adding reckless debt. Agree on a definition of done that includes tests for new code, code review, and no new shortcuts without a recorded reason and a plan to repay. This halts the compounding.
  2. Reserve capacity every cycle. Treat debt repayment as a standing allocation in every sprint, not a project that competes with features once a year. The right share depends on how much debt you have; the important part is that it is consistent and protected.
  3. Spend that capacity on hotspots first. Pay down debt where the team works most, because that is where each hour of repayment saves the most future hours.
  4. Refactor on the way through. When a feature touches an area with known debt, include improving that area in the feature's scope. The roadmap keeps moving and the most-used code improves first.
  5. Track the metrics. If lead time and fail rate improve over a few months, the repayment is working. If they do not, the debt is in places the plan is not reaching.

A short checklist for founders

If your team's velocity has dropped without an obvious reason, these five questions will tell you a lot:

  • Do we have a written inventory of known technical debt — and who owns it?
  • Do we track change lead time and change fail rate, and are they getting better or worse?
  • What share of each sprint is explicitly reserved for paying down debt?
  • Which parts of the codebase change most often, and how healthy are they?
  • Which business decisions in the last six months were shaped by "the system can't do that"?

If the honest answers are "no," "no," "none," "not sure" and "several," your technical debt is not a maintenance cost. It is a growth ceiling — and it is already making decisions for you.

Sources

business2point helps founders turn technical debt from a hidden constraint into a managed backlog — senior, CTO-level assessment of where the debt is, what it costs and what to pay down first. Start the conversation →

Frequently Asked Questions

How much does technical debt actually cost a development team?
Estimates vary by company, but the best-known survey data is from Stripe's 2018 Developer Coefficient study: developers estimated they spend about 13.5 hours of a 41-hour working week on technical debt — roughly a third of their time — plus several more hours on bad code. The cost shows up as slower delivery, missed estimates and work that keeps getting re-opened, not as a line item in the budget.
How do I know if technical debt is slowing my team down?
Look for patterns rather than single incidents: estimates that keep getting missed by multiples, small changes that require touching many files, bugs that return after being fixed, features scoped around what the system can do rather than what customers need, and upgrades or security patches that keep getting postponed. DORA's delivery metrics — change lead time, deployment frequency, change fail rate, failed deployment recovery time and deployment rework rate — turn those patterns into numbers you can track.
Should we stop building features to pay down technical debt?
Rarely. A feature freeze or a full rewrite usually costs more than it saves. The approach that works is to pay debt down continuously and selectively: reserve a share of every cycle for it, and concentrate that effort on the parts of the codebase that change most often, because that is where the interest is highest.
Is all technical debt bad?
No. Debt taken on deliberately — a known shortcut to hit a launch, with an understanding of what it will cost to fix — can be a sound business decision. The problem is debt nobody chose, nobody recorded and nobody is paying down. That kind of debt does not stay a code problem; it becomes a constraint on the product and the business.

Let's build what matters.

Ready to discuss how these insights apply to your company? Our team is here to help you navigate your technical challenges.

Start the conversation

Stay in the loop

Get actionable insights on technical leadership, AI, and engineering strategy — delivered monthly.