Technical Debt: What It Is and When It's Worth It
- ShiftQuality Contributor
- Aug 6, 2025
- 5 min read
Every codebase accumulates shortcuts. A quick fix that skips validation. A copy-paste instead of a proper abstraction. A hardcoded value that should be a config parameter. Each one is small. Together, they compound.
Ward Cunningham coined the term "technical debt" in 1992 to describe this accumulation. The metaphor is financial: shortcuts are like borrowing money. You get something now — faster delivery, a met deadline — and you pay interest later in the form of slower development, harder debugging, and fragile systems.
Like financial debt, technical debt is not inherently bad. A mortgage lets you live in a house before you could afford to buy it outright. A deliberate shortcut lets you ship a feature before you have time to build the ideal architecture. The danger is not in taking on debt. It is in taking it on accidentally, invisibly, or without a plan to pay it back.
How Debt Accumulates
Technical debt comes from four sources, and understanding which type you are dealing with changes how you respond to it.
Deliberate and informed. The team knows the shortcut is a shortcut, makes the choice consciously, and documents it. "We are hardcoding the tax rate because we only operate in one jurisdiction. When we expand, we will need to make this configurable." This is healthy debt. It speeds up delivery and the repayment cost is known.
Deliberate and uninformed. The team takes a shortcut they think is minor, but they don't understand the full implications. "We will just put everything in one database table for now." This seems cheap to fix later. It is not. Schema changes ripple through queries, ORMs, caches, and downstream consumers. The actual repayment cost is much higher than estimated.
Accidental and informed. The team discovers, after the fact, that a past decision was suboptimal. "We chose library X, and now library Y would have been better." This happens constantly and is not really anyone's fault. Technology evolves, requirements change, and hindsight is perfect. The debt exists. The question is whether it is worth paying down.
Accidental and uninformed. The team does not know the debt exists. A junior developer writes a pattern that senior developers would recognize as problematic, but no one reviews it. An architectural flaw goes unnoticed because the system has not yet been stressed. This is the most dangerous type because the team cannot manage what they cannot see.
The Interest Payments
The metaphor's power is in the interest. Financial debt charges interest whether you think about it or not. Technical debt does the same thing.
Every feature that touches a messy part of the codebase takes longer to build. Every bug in a poorly structured module takes longer to diagnose. Every new team member takes longer to onboard because the code does not communicate its intent clearly. These are interest payments, and they compound.
A team carrying heavy technical debt feels it as a constant drag. Estimates inflate. Simple changes require touching unexpected parts of the system. Confidence drops. The team spends an increasing percentage of its time on maintenance and an decreasing percentage on new work.
The worst part is that the payments are invisible unless you are looking for them. Nobody tracks "time spent working around our own shortcuts." The debt hides in the gap between how fast the team should be moving and how fast it actually is.
When Debt Is Worth It
Not all technical debt should be eliminated. Some of it is a rational trade-off.
Startups validating a product idea should take on deliberate debt. If you spend six months building the perfect architecture and the product has no market, you wasted six months. Ship fast, learn fast, and pay down the debt if the product succeeds. If it doesn't, the debt dies with the project and nobody cares.
Teams facing hard deadlines — a regulatory change, a contractual obligation, a competitive window — may need to take on deliberate debt to ship on time. The key is documenting the debt, estimating the repayment cost, and scheduling the repayment. Debt with a plan is manageable. Debt without one is a time bomb.
Features behind feature flags can tolerate more debt because they can be turned off if the quality becomes problematic. Experimental features that might be removed entirely should not receive the same engineering investment as core infrastructure that will run for years.
When Debt Is Not Worth It
Debt in foundational systems — authentication, data integrity, security, core business logic — is almost never worth it. These systems are touched by everything else. Debt in the foundation spreads to every floor of the building.
Debt that nobody documents is not worth it because it cannot be managed. It will be discovered in the worst way, at the worst time, by the person least equipped to handle it.
Debt that the team takes on because "we will fix it later" without any concrete plan for when "later" is — that is not a trade-off. That is avoidance.
Managing What You Owe
If you are going to carry technical debt, manage it like actual debt.
Track it. Keep a list. Every deliberate shortcut gets documented: what it is, why it was taken, what the repayment looks like, and how urgent it is. A simple spreadsheet or a tagged backlog works. The format does not matter. The visibility does.
Budget repayment. Dedicate a percentage of each sprint or development cycle to paying down debt. Ten to twenty percent is common. This is not lost productivity. It is an investment in future velocity.
Prioritize by interest rate. Pay down the debt that charges the most interest first — the shortcuts that slow down the most people, the most often. A messy utility function that everyone uses costs more than a messy script that runs once a month.
The Takeaway
Technical debt is a tool, not a sin. Used deliberately, with documentation and a repayment plan, it lets you move faster when speed matters. Used carelessly, it accumulates invisibly and eventually brings development to a crawl.
The problem is never the technology. It is how you manage the choices you make. Track your debt. Pay the interest. And know the difference between a strategic shortcut and an excuse.
Learning path complete. You've finished the "Thinking Before You Build" series. You understand why architecture matters, which patterns help small teams, how to make build-vs-buy decisions, how to design for your first thousand users, and how to think about technical debt.
From here, the "Quality Architecture" advanced path takes these concepts further — designing systems that are testable, observable, and maintainable by default.



Comments