Definition
Technical debt refers to compromises in design and code that help in the short term but make later changes to the software more expensive or impossible. A company pays the interest as extra effort on every further change. The term comes from Ward Cunningham and mainly concerns maintainability and evolvability.
Key takeaways
- Technical debt is a compromise in design or code that makes later changes cost more. Interest comes due when someone changes that code.
- Across 39 codebases, work on low-quality code took 124% longer on average. There’s no single figure that fits every company.
- Paydown is worth it if the interest saved covers the effort within the remaining service life. Code nobody changes can stay.
- In our example, a 60-hour paydown pays off in about 16 months at 12 changes a year. At two changes a year, it doesn’t pay off in four years.
- Tools mainly estimate the cost of paydown. At Google, none of 117 metrics alone predicted where engineers report technical debt.
What is technical debt?
Technical debt is a compromise in design or code that helps in the short term and makes later changes more expensive. As with a loan, you pay interest: every change to the affected code takes longer. Cleaning up that code is paying off the principal.
The metaphor comes from Ward Cunningham. In a 1992 experience report, he wrote that a little debt speeds up development as long as it’s paid back promptly. “Every minute spent on not-quite-right code counts as interest on that debt,” he added (Cunningham, 1992). The term is often shortened to tech debt.
At a research seminar at Schloss Dagstuhl in 2016, the participants agreed on a working definition. Technical debt, they wrote, is a collection of design or implementation constructs that are expedient in the short term and can make future changes more costly or impossible. Under that definition, its impact is limited to a system’s internal qualities, primarily maintainability and evolvability (Dagstuhl Seminar 16162, 2016).
Martin Fowler shows what the math looks like. A new feature takes four days in a clearly structured module and six in a confusing one. The two days’ difference is the interest. Five days of cleanup would be paying off the principal (Fowler, Technical Debt, 2019). Unlike with a bank loan, you only pay this interest when someone changes that code. SaaS products are usually under continuous development, so you often pay it there. Our guide What is SaaS? explains how SaaS works.
Is technical debt always bad?
No. A debt taken on deliberately can be the right call, for example to meet a deadline, if the team plans to pay it back. It becomes risky when nobody records it or when it builds up unnoticed. Debt-free software isn’t a sensible goal.
Martin Fowler sorts technical debt by two questions: Was it taken on deliberately, and was that prudent or reckless (Fowler, Quadrant, 2009)?
- Deliberate and prudent: The team knows about the compromise and weighs whether an earlier release is worth the later cost.
- Deliberate and reckless: The team knows good practice but skips it for lack of time. Fowler sees this as a misjudgment in most cases, because clean design speeds up the work.
- Inadvertent and reckless: The team lacks knowledge of good design. It doesn’t notice how much debt it’s taking on.
- Inadvertent and prudent: A good team only realizes during the work what the design should have been. According to Fowler, that’s hard to avoid.
According to Google’s Engineering Productivity Research team, taking on debt prudently and deliberately “can be a correct engineering choice.” The same article notes that Cunningham didn’t intend the term as an excuse for bad code (Google, IEEE Software, 2023). At the Dagstuhl seminar, Frank Buschmann of Siemens summed it up this way: the goal is a competitive system, and it doesn’t have to be debt-free.
In a family of surveys with 653 valid responses from six countries, time pressure was the most frequently cited cause of technical debt. The most frequently cited effects were delivery delays, low maintainability and rework (Ramač et al., 2022).
How can you spot technical debt without reading the code?
By its effects on daily work: small changes take longer and longer, promised dates are met less often and only one person still dares to touch certain parts of the software. For small businesses, this starts to matter once a piece of software is under continuous development.
Google asked its engineers to name the causes of their debt and arrived at 10 categories. The ranking depends on the company, but the authors consider the list itself generalizable (Google, IEEE Software, 2023). The table translates all 10 into what you’d notice as the client. The left column is our own interpretation.
| What you notice | Categories at Google |
|---|---|
| Small changes keep getting more expensive and estimates less accurate | Code quality; code degradation |
| Changes break other things and releases get postponed | Testing; release process |
| Only one person knows certain parts and new people take a long time to get up to speed | Team lacks necessary expertise; documentation |
| A version upgrade keeps getting postponed and components cause trouble during updates | Migration needed or in progress; dependencies |
| The old and new solutions keep running side by side | Migration poorly executed or abandoned |
| Features stay in the system even though they’ve been replaced | Dead and/or abandoned code |
Small businesses should pay special attention to the third row, because in small teams, knowledge often sits with just a few people. Our how-to Avoiding developer lock-in shows how to check this. If a small internal tool runs reliably and rarely changes, you pay almost no interest and the issue can wait.
What does technical debt cost?
There’s no reliable blanket figure. In a measurement of 39 codebases, work on code in the lowest quality tier took 124% longer on average than work on healthy code. In a study with repeated self-reports, developers put the time lost to technical debt at 23% of their working time on average. These values don’t automatically apply to your software.
The table sorts well-known figures by how they were produced. The numbers in the “Source” column refer to the source list at the end of this article.
| Figure | Type of data | What it does and doesn’t tell you | Source |
|---|---|---|---|
| 124% longer to work on and 15 times more defects in code in the lowest tier than in healthy code; 78% longer in the middle tier | Measurement: 39 codebases, 30,737 files, data from code and issue tracker, 2022 | A strong correlation; the cause isn’t proven. All systems come from users of the measuring tool, and the lead author works for the tool’s maker. | 7 |
| 23% of working time lost, median 17%; in the replication 29%, median 20% | Self-reports: 43 developers at six companies, twice a week for seven weeks, plus 47 developers at one company in Germany, 2019 | Few participants and wide variation. The authors themselves urge caution. | 8 |
| 10–20% of the budget for new products goes to debt issues; the debt equals 20–40% of the value of the technology estate | Estimate by 50 CIOs of large financial and technology companies, July 2020 | Applies to corporations with more than $1 billion in revenue. The second value refers to the estate; the budget is a different measure. | 9 |
| 13.5 of 41.1 weekly hours spent on technical debt | Developers’ own estimates, 2018; respondents were more than 1,000 developers and more than 1,000 C-level executives in five countries | Respondents gave their impression; nothing was measured. | 10 |
| $1.52 trillion in accumulated technical debt in the US | Estimate by an industry consortium, 2022 | An order of magnitude for an entire economy. It tells a single company nothing. | 11 |
We haven’t found reliable figures for small businesses. Paying down debt doesn’t work automatically, either. In 10 open-source projects of the Apache Software Foundation, most of 4,166 refactorings, meaning changes to the code that add no new functionality, reduced the measured interest. Across all cases, however, no average effect could be shown (Nikolaidis et al., 2022). At Microsoft, developers saw substantial costs and risks in refactoring (Kim et al., 2014). So it comes down to which area of the code you tackle.
When is paying down technical debt worth it?
It’s worth it when the interest you save repays the effort within the software’s remaining service life. For each area of code, calculate changes per year times extra effort per change, plus the cost of defects. Code nobody changes can stay, as long as it isn’t a security risk.
For prioritizing, what counts is where work actually happens. According to the Dagstuhl report, debt in code that will be extended for the next release weighs more than debt in untouched areas. Fowler also leaves stable code alone. A 2024 study recommends preventing new flaws above all in frequently changed files (Borg et al., 2024).
Use these questions to rate an area of code. We compiled the grid from these sources; the buffer and the thresholds are our own judgment.
| Question | How to find the value |
|---|---|
| How often was this area changed in the last 12 months? | Review version control and tickets |
| How much longer does each change take because of the debt? | Ask the team how long it would take in a clean area |
| How many defects trace back to this area, and how long do the fixes take? | Review tickets from the last 12 months |
| How long will the paydown take? | The team’s estimate plus a 50% buffer |
| How much longer will the software be in use? | Your business planning |
That gives you two values:
- Interest per year: changes per year times extra effort per change, plus defects per year times effort per defect.
- Payback period: paydown effort divided by interest per year.
| Result | Decision |
|---|---|
| The area will soon be replaced or shut down | Don’t pay it down, just record it |
| Known security vulnerability, end of support or knowledge held by only one person | Schedule the paydown, even if the math doesn’t work out |
| Payback period under half the remaining service life | Pay it down and put it on the schedule |
| Payback period between half and the full remaining service life | Include it the next time the area is reworked |
| Payback period longer than the remaining service life | Leave it and note it in the list |
The section When are version upgrades due? shows when components reach end of support.
What does a paydown calculation look like?
In our example, paying down one area of code is a one-time effort of 60 hours. At 12 changes and four defects a year, it saves 44 hours a year and pays for itself after about 16 months. At two changes and one defect a year, it doesn’t pay off within four years. All values are assumptions; use your own.
| Case | Changes and defects per year | Interest per year | Pays off after | Balance after four years |
|---|---|---|---|---|
| A: changed often | 12 changes, 4 defects | 44 hours, €5,500 | about 16 months | 116 hours gained, €14,500 |
| B: changed occasionally | 6 changes, 2 defects | 22 hours, €2,750 | about 33 months | 28 hours gained, €3,500 |
| C: changed rarely | 2 changes, 1 defect | 8 hours, €1,000 | 90 months | 28 hours lost, €3,500 |
Here’s how we calculated it:
- Paydown: an estimated 40 hours, or 60 hours with the 50% buffer, one-time and up front. At €125 an hour, that’s €7,500.
- Interest per change: 3 hours, so the work takes 7 hours instead of 4. That’s 75% extra effort; the middle tier in the measurement above came in at 78%.
- Interest per defect: 2 additional hours.
- Hourly rate: €125, the median hourly rate without a maintenance package in our survey of software providers based in Germany.
- Remaining service life: four years.
- Interest over four years: 176 hours in case A, 88 in case B and 32 in case C, that is, four times the interest per year. These are the values in the chart.
- Simplifications: constant interest, no discounting and no cost of outages. These aren’t Datafalke prices or quotes.
Applied to the grid, that means: pay down case A, include case B the next time the area is reworked and leave case C alone. As a check, rerun the numbers with a third fewer changes. Case A would then pay off after about 23 months and stay under half the remaining service life. Case B would land at 45 months, only just inside the four years.
How do you pay down technical debt without rewriting everything?
Pay it down in small steps, starting where the interest is highest. Record each debt in a list, lock in current behavior with tests before you rework anything and combine paydown with changes you’ve already planned. A complete rewrite remains the last resort.
- Keep a list: The arc42 architecture template has its own section for this, with risks and technical debt ordered by priority (arc42, section 11). For each entry, the area, interest, paydown effort, decision and date are enough.
- Add tests first, then rework: Automated tests capture what the code does today, so you’ll notice if the rework changes anything.
- Pay down as you go: Rework an area when a change is already due. That’s where you pay the interest.
- Take on new debt deliberately: A shortcut is fine if it’s on the list and has a date for repayment.
- Don’t rewrite everything: A complete replacement sounds simple. But Fowler has seen that plan “go down in flames most of the time,” in part because existing behavior is hard to pin down. He recommends replacing a legacy system gradually (Fowler, Strangler Fig, 2024).
Sometimes off-the-shelf software is the better replacement. Our comparison Build or buy software? covers that decision.
How is technical debt different from bugs and legacy systems?
A bug shows up in how the software behaves. Technical debt often stays invisible to users and makes later changes more expensive. A legacy system is old but not necessarily in debt, and young software can carry heavy debt. Maintenance is the ongoing work on the software, and refactoring is one way to pay off the principal.
The numbers in the “Source” column refer to the source list at the end of this article.
| Term | Meaning | How it relates to technical debt | Source |
|---|---|---|---|
| Bug (defect) | The software behaves incorrectly. | A matter of behavior. By definition, technical debt affects internal quality. In the measurement above, poor code quality went along with more defects. | 2, 7 |
| Legacy system | Older software that’s still in operation. | Age alone isn’t debt. According to Google, code in Python 2 only becomes debt once a migration is needed. | 5 |
| Maintenance | Work on the software after delivery. | Paydown can be part of maintenance or run as a separate project. Your contract sets that. | – |
| Refactoring | Restructuring code without changing its behavior. | The most direct way to pay off the principal. In practice, developers often mean more by it than the strict definition. | 12, 13 |
Our cost guide How much does software maintenance cost? covers what maintenance includes and what it costs.
From our work: a deliberate debt on this website
This website has taken on technical debt, too. On November 8, 2026, at 4:27 p.m. German time, we uploaded new pages even though the full browser test for the latest version hadn’t been run. Three parts had changed since the last complete run, and we ran only targeted tests on them. In those tests, 17 of 399 navigation test cases failed, all in Firefox. In 15 of them, the focus indicator wasn’t visible while the menu was held open. Other browsers and pages without an open menu weren’t affected.
The 17 cases were defects in behavior. The debt was the missing full test run, because without it every further change would have been riskier. Testing, including missing tests, is also one of Google’s categories of technical debt. We recorded the state of things and assigned the fix to a separate work package, which was finished that same evening. The full test run then passed with 18,607 browser tests, and the fix went live on November 9, 2026, at 12:40 a.m. The debt lasted just over eight hours.
We didn’t need a calculation using the grid above: the gap was named, narrow in scope and already assigned to a work package. So that debt can’t grow unnoticed, fixed limits apply before every release. For instance, a compressed HTML document may be at most 30,720 bytes. When our guide to technical SEO grew too large, we shortened it.
Frequently asked questions
Can a tool measure technical debt?
Only in part. SonarQube, for example, totals the effort to fix all maintainability issues and sets it against the development cost (Sonar, metrics). That’s an estimate of the principal, and it says nothing about the interest. Google examined 117 metrics for three types of debt, and no single metric predicted where engineers report technical debt. The simple models explained less than 1% of the variance, and combined models missed many affected areas. Use tools as an indicator and ask your team.
How much development time should you set aside for paydown?
We haven’t found a study that supports a fixed quota. Some guides give 20% of development time as a rule of thumb. So plan area by area, using the calculation above, and decide who makes the call. It helps to combine paydown with planned changes, because the area is open anyway.
Does AI-generated code create more technical debt?
One large study suggests it does. In 806 open-source projects, static analysis warnings rose by 30% and code complexity by 41% after an AI code editor was adopted, according to the main estimate. The comparison group was similar projects that didn’t use the tool. Both increases persisted, and the gain in speed was gone after two months (He et al., 2026). The study doesn’t answer whether that also holds with careful review. Code that nobody on the team understands is inadvertent debt: it runs, but the next change gets expensive. Vibe coding, where an AI writes the code and nobody reads it, is one source of such code (Willison, 2025).
What should I ask my software provider?
Ask whether there’s a list of known technical debt and who maintains it. Have them name the five areas with the highest extra effort and what paying them down would cost. Ask which components will reach end of support in the next 12 months and how many people can change the software. If there are no answers, that’s a finding in itself. Our custom software development page describes what we include at sign-off.