Your team shipped five features last quarter. This quarter, with the same team, you will ship three. Next quarter, two. The features are not getting harder — your codebase is getting heavier. Every shortcut taken under deadline pressure added invisible weight to your software. That weight has a name: technical debt. And like financial debt, it compounds.
What Technical Debt Actually Is (And What It Is Not)
Ward Cunningham coined the term in 1992 as a metaphor: just as financial debt lets you buy something today that you pay for tomorrow, technical shortcuts let you ship today but slow you down tomorrow. The metaphor is precise — technical debt even has an “interest rate” in the form of increased development time.
What technical debt is not: bad code written by incompetent developers. Some of the most dangerous technical debt is written by excellent engineers making rational trade-offs under legitimate time pressure. The CTO who says “ship it now, refactor later” is making a calculated bet. The problem is that “later” rarely arrives.
The four quadrants of technical debt:
- Deliberate and prudent — “We know this is not ideal, but we need to ship by Tuesday to close the enterprise deal.” This is strategic debt with a clear payoff.
- Deliberate and reckless — “We do not have time for tests.” This is engineering negligence disguised as speed.
- Inadvertent and prudent — “Now that we have built it, we realise a better approach.” This is the natural cost of learning.
- Inadvertent and reckless — “What is a design pattern?” This is a skills gap, not a strategic choice.
Only quadrant one is acceptable. The rest are symptoms of deeper organisational problems.
The Compound Interest of Bad Code
Technical debt does not sit quietly. It compounds. A study by Stripe in collaboration with Harris Poll found that developers spend an average of 33% of their time dealing with technical debt — not building features, not innovating, but maintaining and working around shortcuts taken months or years ago.
For a 10-person development team costing €1.2 million per year, that is €400,000 annually spent servicing debt instead of creating value. Over three years, that is €1.2 million — enough to fund an entirely new product line.
How debt compounds in practice:
- Sprint 1: A developer hardcodes a configuration value instead of using environment variables. Time saved: 30 minutes.
- Sprint 5: Another developer copies the pattern because “that is how it is done here.” The hardcoded value now exists in 12 places.
- Sprint 12: A client needs a different configuration. A developer must find and modify all 12 instances, breaking two in the process. Time spent: 6 hours plus 4 hours debugging.
- Sprint 20: New developers refuse to touch the module. It is now “legacy code” — untested, undocumented, and feared.
The original 30-minute shortcut has cost 40+ developer-hours and created a permanent drag on velocity.
The Five Warning Signs Your Debt Is Critical
Technical debt becomes critical when it transitions from a nuisance to an existential threat. Watch for these indicators:
1. Feature velocity is declining despite stable team size. If you shipped 15 story points per sprint six months ago and now consistently deliver 8, your debt interest payments are consuming your capacity. Track velocity over a rolling 6-sprint window — a downward trend is the clearest signal.
2. Bug fix time is increasing. When a simple bug fix that should take 2 hours consistently takes 2 days because the developer must understand 15 intertwined modules before making a change, your architecture has become a liability.
3. Onboarding time exceeds 3 months. If new developers cannot make meaningful contributions within their first month, your codebase has become a maze. Every month of extended onboarding costs €8,000-€12,000 in unproductive salary for a mid-senior developer in Western Europe.
4. Developers avoid certain modules. When your team routes around specific files or services — “don’t touch the billing module” — those modules are debt landmines. The avoidance creates further debt as workarounds accumulate at the edges.
5. Deployment frequency has dropped. Teams confident in their codebase deploy daily. Teams drowning in debt deploy monthly (or less), because every deployment is a high-risk event requiring extensive manual testing.
The Refactoring Budget: 20% Is Not Optional
The most effective engineering organisations allocate 15-20% of every sprint to debt reduction — not as a separate “tech debt sprint” that gets cancelled when deadlines loom, but as a permanent, non-negotiable allocation within every sprint.
How to implement the 20% rule:
- Make debt visible. Create a “Tech Debt” column on your project board. Every time a developer takes a shortcut, they create a card with an estimated payoff time.
- Prioritise by pain. Rank debt items by how frequently they cause problems. A rarely-touched module with bad code is less urgent than a core module with a fragile test suite.
- Attach debt to features. When building a new feature that touches a debt-heavy module, include refactoring in the feature estimate. “Build the search filter (3 points) + refactor the search index (2 points) = 5 points total.”
- Track the debt ratio. Measure what percentage of sprint capacity goes to debt reduction versus new features. Below 15% means you are accumulating debt faster than you are paying it off.
The Rewrite Trap: Why Starting Over Almost Never Works
When debt reaches critical mass, leadership often proposes the nuclear option: “Let us rewrite from scratch.” This is almost always a catastrophic mistake.
Joel Spolsky called this “the single worst strategic mistake that any software company can make.” Why?
- The rewrite takes 2-3x longer than estimated. Always. The original system took years to build, and it contains thousands of edge cases discovered through production usage. The rewrite team will rediscover each one painfully.
- The original system continues accumulating requirements. While the rewrite team builds version 2, the maintenance team adds features to version 1. By the time version 2 launches, it is already behind.
- Institutional knowledge is lost. The “ugly” code in the old system often encodes critical business logic that nobody documented. Deleting it means deleting knowledge.
The alternative: the strangler fig pattern. Named after the tropical fig that gradually envelops its host tree, this approach replaces the old system piece by piece. Build new modules alongside old ones, route traffic to the new module, validate it works, then decommission the old module. Over 12-18 months, the old system is gradually replaced without a single big-bang migration.
Measuring Debt: From Gut Feel to Data
Stop relying on developer complaints to gauge debt severity. Use these quantitative metrics:
Tools like SonarQube, CodeClimate, and Codacy can automate most of these measurements. The key is tracking trends over time, not absolute numbers — a codebase trending toward worse metrics needs intervention regardless of where it sits today.
Managing Debt Across Distributed Teams
When your engineering team operates across time zones — as Manifera’s teams do between Amsterdam and Ho Chi Minh City — technical debt management requires additional discipline.
What changes for distributed teams:
- Coding standards must be explicit and automated. You cannot rely on informal team norms when half the team is 6 hours ahead. Use linters, formatters, and pre-commit hooks that enforce standards mechanically.
- Architecture Decision Records (ADRs) are mandatory. Every significant design decision must be documented with context, alternatives considered, and rationale. When a developer in Vietnam encounters debt-laden code at 2 AM Amsterdam time, the ADR explains why it exists and what the intended fix was.
- Refactoring must be coordinated. Uncoordinated refactoring across time zones creates merge conflicts and confusion. Assign debt items to specific developers and communicate changes clearly in async standups.
Manifera’s way of working embeds technical debt management into every sprint — combining Dutch engineering discipline with Vietnam’s deep talent pool to ensure debt never silently accumulates.
Talk to our Amsterdam team about your codebase health — manifera.com/contact-us.
FAQs
How do we convince the CEO that technical debt reduction is worth investing in? (Scenario: CTO trying to justify 20% sprint allocation for refactoring to a non-technical board)
Translate debt into financial language: “Our team costs €120,000/month. Currently, 33% of their time is spent on debt — that is €40,000/month wasted. A 6-month focused investment of 20% sprint time (€24,000/month) will reduce debt servicing to 15%, saving €22,000/month thereafter — a 12-month ROI of 180%.” Always present debt as a financial liability with calculable interest payments, not as a vague engineering complaint.
Should we stop all new feature development to pay down technical debt? (Scenario: VP Engineering considering a “tech debt sprint” after velocity dropped 40%)
No. Feature freezes destroy stakeholder trust and rarely achieve their goals because debt was not created in one sprint and cannot be fixed in one sprint. Instead, implement the 20% rule permanently. If velocity has dropped 40%, temporarily increase the allocation to 30% for 2-3 sprints, then return to 20%. Consistent, sustainable investment beats heroic one-time efforts every time.
How do we prevent technical debt from accumulating in the first place? (Scenario: Engineering Manager building processes for a new team)
Three non-negotiable practices: (1) Mandatory code reviews — no PR merges without at least one approval. This catches 60-70% of potential debt before it enters the codebase. (2) Definition of Done includes test coverage — a feature without tests is not done. (3) Architectural review for any change touching more than 3 files — prevents local optimisations that create global problems. These three practices add 15-20% to initial development time but reduce total lifetime cost by 40-60%.
What tools help track and manage technical debt? (Scenario: CTO building a tech debt dashboard for quarterly board reports)
Use SonarQube or CodeClimate for automated code quality metrics (complexity, duplication, coverage). Use your project management tool (Jira, Linear) with a dedicated “Tech Debt” label or board — every shortcut creates a card with estimated payoff time. Use Codacy or DeepSource for automated PR analysis that flags new debt as it enters the codebase. The dashboard should show: total debt items, debt added this sprint, debt resolved this sprint, and the net debt trend line.
Is it ever acceptable to deliberately take on technical debt? (Scenario: Startup founder needing to ship a prototype to close a funding round in 3 weeks)
Yes — this is quadrant one (deliberate and prudent) debt. The key requirements: (1) The business justification is real and time-bound — “we must demo for investors by March 15.” (2) The debt is documented explicitly — every shortcut creates a ticket with a description and estimated fix time. (3) Repayment is scheduled immediately — block time in the sprint after the deadline to address the shortcuts. Deliberate debt with a repayment plan is a legitimate business tool. Deliberate debt without a repayment plan is negligence.
Suggested Posts
How useful was this post?
Share it with your friends
Get our latest articles here!
Do you have any questions?
Help us improve the content of this Insightful blog by asking us questions. Manifera's team of experts will help you answer these questions as soon as possible.








