Technical Debt, More Than Code, More Than a Metaphor

Where the Term Comes From

Ward Cunningham, one of the original authors of the Agile Manifesto, coined the term technical debt to describe the hidden cost of taking shortcuts in code, decisions that make future changes harder, slower, and more expensive. The idea is simple, when you borrow time by implementing a quick-and-dirty solution now, you incur a debt that must be paid back later through rework, refactoring, or even complete redesign.

The metaphor stuck because it’s relatable, but it can also be misleading. Unlike financial debt, where interest is predictable and structured, the interest on technical debt can grow rapidly and unexpectedly, especially as systems evolve.

A better comparison might be something like running a red light to save time. It’s not just a shortcut, it’s a deliberate, risky decision that can lead to serious consequences. Similarly, cutting corners in software may work in the short term, but if left unchecked, it can cause major problems down the line.

As Alberto Brandolini once put it, technical debt can feel less like owing money to a bank and more like owing a favor to the mafia: if you ignore it, the consequences aren’t just inconvenient, they’re painful.


Is Technical Debt Really Technical?

Many people think technical debt is purely about code. Wrong. Technical debt can exist anywhere in a system, from architecture and infrastructure to testing, deployment processes, and even organizational decisions. It can be:

  • Code-level debt: messy functions, inconsistent naming, duplicated logic.
  • Architectural debt: modules that are tightly coupled, poor separation of concerns.
  • Process debt: lack of automated testing, slow CI/CD pipelines, or undocumented procedures.
  • Business debt: unclear product requirements, scope creep, or temporary feature hacks made to satisfy stakeholders.

Debt often comes from business decisions, cultural habits, or organizational structures.

  • A startup that pushes features at all costs accumulates debt.
  • A business that ignores documentation and knowledge sharing builds people’s debt.
  • A team that avoids cleaning up code because it works for now builds maintenance debt.
  • … It’s unfortunate, but the list of reasons for bad code (and a poor product) is very long ☹. It means the list of unplanned, unintentional, and unwanted reasons for bad code (which leads to a bad product) is very long.

Calling it technical makes it sound like only developers are responsible. So calling it purely technical is misleading. Some people prefer terms like design debt, organizational debt, or software obligations. Each emphasizes a different aspect, but at its core, it’s about unaddressed compromises that make future work more expensive and risky.

I think System debt/Business debt is a better term, the combination of technical, organizational, cultural, and even human factors that shape how fragile or resilient a system is.

I think System debt/Business debt is a better replacement.


The Banking Metaphor and Its Limits

The common and traditional metaphor is debt as a bank loan. Its algorithm is like the following (the algorithm itself is a debt 😉 )

  • Ship faster now.
  • Pay interest in the form of higher future costs.
  • Eventually, repay the principal through refactoring.

But this doesn’t always hold true. Bank debt is linear and predictable. In software, the cost often grows exponentially, ignored bugs lead to hacks, hacks lead to brittle systems, brittle systems lead to outages.

Sometimes or most of the time, it’s like debt to the mafia. You can ignore it for a while, but when it comes due, the payment is catastrophic, outages, lost customers, reputational collapse.


When Taking Debt Is Good

Not all debt is bad. Just like in business, sometimes borrowing makes sense.

  • You can deliberately take debt to ship a prototype faster.
  • You can choose debt when you want to test a market before over-engineering.
  • You can take debt knowing you’ll pay it down later with investment.

The key is intentionality. Conscious debt is strategy. Unconscious debt is risk.


Famous Stories of Technical Debt in the Wild

1. Twitter’s Fail Whale (2007–2012)

In its early years, Twitter ran on a giant Ruby on Rails monolith nicknamed Monorail. Every new feature was crammed into the same codebase. As users grew, scaling broke constantly, giving us the infamous Fail Whale downtime screens.

This was debt born of speed-first culture. Twitter spent years migrating to a more distributed architecture,  repaying debt with years of engineering investment.

2. Facebook’s Move Fast and Break Things

Facebook’s early motto encouraged shipping over polish. That worked for growth, but created:

  • Duplicated internal tools
  • Inconsistent features
  • Hard-to-maintain code

By 2014, the motto changed to Move Fast with Stable Infrastructure. The culture matured because unmanaged debt slowed innovation instead of enabling it.

3. Knight Capital’s $440 Million Bug (2012)

Knight Capital lost $440 million in 45 minutes due to a software deployment error.

  • Old, unused zombie code wasn’t removed.
  • A new deployment accidentally reactivated it.
  • Automated trades spiraled out of control.

This was more than technical debt. It was organizational debt: lack of cleanup, no deployment safety nets. The company collapsed.

4. Healthcare.gov Launch (2013)

At launch, Healthcare.gov failed under load.

  • Over 50 contractors built separate modules with no alignment.
  • Integrations were hacked together.
  • There was no single architectural owner.

This was cultural and organizational debt. The lack of unified architecture caused chaos. Stabilizing the system required massive rework.

5. Banking Systems and COBOL Debt

Many banks still rely on COBOL systems from the 1970s.

  • They work, but are hard to extend.
  • Developers with COBOL expertise are retiring.
  • Regulatory changes take months instead of weeks.

This is legacy debt,  not just technical, but also people debt. When skills vanish, the system’s fragility grows.


How Culture Shapes Technical Debt

Technical debt doesn’t exist in a vacuum. Team culture, organizational habits, and individual mindset play a massive role:

  1. Team Discipline: Teams with strong code reviews, automated testing, and collective ownership naturally accumulate less debt.
  2. Organizational Pressure: Companies prioritizing speed over quality often normalize debt. Management may reward feature delivery but ignore the hidden costs.
  3. Individual Mindset: Developers’ personal practices, naming conventions, modularity, documentation, affect the accumulation of debt over time.

A healthy culture treats debt like a visible, manageable artifact, not a taboo subject. Teams should track it, discuss trade-offs, and schedule repayment cycles. Unhealthy cultures hide debt, creating technical time bombs.

The Team and Personal Level

Debt is also about habits and culture at the team level:

  • Do developers feel safe raising refactoring needs?
  • Do product owners respect time for cleanup?
  • Do individuals cut corners because they’re rushed, or because it’s expected?

A culture that treats developers as feature factories accumulates invisible debt. A culture that values sustainable pace makes intentional trade-offs.

There’s also a personal dimension: ignoring small to-dos eventually turns them into not-to-dos. Those ignored tasks accumulate silently until they become crises.


What Should We Call It?

Technical debt is too narrow. Real systems face:

  • Architectural debt
  • Cultural debt
  • Organizational debt
  • People/knowledge debt

As mentioned above, maybe the better umbrella is System Debt, because the entire system (tech, people, processes, culture) creates fragility or resilience.

How to Deal With Debt

  • Make debt visible: track it, discuss it openly.
  • Be intentional: sometimes it’s worth taking on.
  • Build a culture where paying it down is respected.
  • Remember: not paying it is rarely neutral, the cost grows, often exponentially.

Final Thought

Debt is inevitable. The real question is:

  • Will you manage it consciously like a banker?
  • Or ignore it until it comes back like the mafia?

The stories of Twitter, Facebook, Knight Capital, Healthcare.gov, and banks show this:
Unpaid debt doesn’t just slow you down. It can define, or even destroy, your system’s future.


Key Takeaways

  • Technical debt is not just code problems; it spans architecture, processes, and organizational decisions.
  • The classic bank loan metaphor is useful but incomplete, debt compounds faster and behaves more like a complex network of obligations.
  • Intentional debt is fine; accidental debt is dangerous.
  • Team culture, organizational priorities, and individual habits profoundly influence debt accumulation and management.
  • Make debt visible, prioritize repayment, and integrate it into planning cycles (to-do => not-to-do).
  • Managing debt well is a competitive advantage, allowing teams to move fast today without sacrificing tomorrow.

Leave a Reply

Your email address will not be published. Required fields are marked *