Donβt call it technical debt unless youβre going to go back and fix it. Otherwise, youβre just giving the team permission to do things the wrong way.
We need to stop using the term βtechnical debtβ as an excuse.
Ward Cunningham coined the term and gave it a precise meaning. For Cunningham, technical debt was a conscious decision.Β The development team, while realizing that there is a better, more βcorrectβ way of doing the job, chooses a more expedient way that has costs down the line.Β Those costs, of course, are more bugs and more difficulty in maintaining the βwrongβ way of doing things.Β
This decision is usually made to speed things up, with the understanding that the development team will go back and βfixβ things laterβhence the notion of βowing a debt.β One could argue that it isnβt really technical debt unless you have a Jira ticket in the backlog to fix the deliberately bad chunk of code.
But letβs be honest here. Weβve twisted the term so far, itβs become meaningless.Β Not every pile of crappy code in your repository is technical debt.Β We call it that, but how much of it was a deliberate decision?Β How much of it has a plan in your backlog to fix it? Not much, right?
Technical undebt
The term βtechnical debtβ has lost its meaning.Β Now, we use the term to mean βall of the awful code we have in our system that we know weβll never go back and fix because it is both too costly and too risky to change.βΒ
All of this crappy code has three origins:
- Technical debt: This is the code that you know is sub-par, but that you decided to write for good reasons, and that you have a plan for correcting. Letβs face itβhardly any code out there fits this description. How many development teams actually have a plan for paying back technical debt? Not a lot.
- Accidental complexity: Fred Brooks coined this term, which perfectly describes code that isnβt right and that results not from negligence or bad coding skills, but because no one understood the system and made bad decisions. Maybe the team chose a framework that was way too heavy for the task at hand.Β Maybe the team created unnecessary abstractions or added a feature in a way that doesnβt match the system. Sadly, this is the kind of thing that doesnβt appear until well after the fact.
- Just bad code: Most of what gets called technical debt is just rushed, slapped-together, or βemergencyβ code that was never reviewed, or was glossed over because it βworkedβ and the customer was screaming. band-aids for customer fire drills, critical bug fixes that were checked in over the weekend, or artifacts of developers working without enough time, clarity, or support.
A pretty label
The problem with calling it all technical debt is that it puts a pretty label on avoidable problems.Β We give ourselves an excuse to do the wrong thing because we can give it a fancy name that implies weβll βpay it backβ later, when everyone knows that we never will.Β When the team is allowed to use the term to justify not doing things the right way, youβve got a culture in decline.Β
In addition, labeling all the bad stuff technical debt can lead to justifying bad decisions and practices.Β It can hide problems like under-investment in engineering and toxic, constant deadline pressure.Β
So letβs stop doing it.Β Letβs all agree that we canβt call it technical debt unless we actually have a backlog item to fix it. Real technical debt should have a work ticket, a correction plan, and a deadline. Anything else should be recognized for what it is:Β crappy code.Β Letβs build a culture where we have real technical debt, and where we call everything else by the right name.Β Letβs reserve βtechnical debtβ for what it actually is: a conscious tradeoff with a repayment plan.
Everything else? Itβs not technical debt. Itβs plain old code rot.


