Paying the Interest: How to Prioritize Technical Debt
"We'll clean it up later." It's the most common lie in software development. That "later" becomes a backlog item, then a legacy system, and finally, a reason why you can't ship new features. But not all technical debt is bad. Sometimes, taking on debt is a strategic decision to capture market share. The problem arises when you stop paying the interest.
The Financial Metaphor
Ward Cunningham coined the term "technical debt" to explain to non-technical stakeholders why refactoring is necessary. Just like financial debt, technical debt incurs interest. The "interest" is the extra time it takes to implement new features because of the messy code. If you don't pay down the principal (refactor), the interest eventually consumes 100% of your engineering capacity.
Not All Debt is Created Equal
Treating all technical debt as urgent is a mistake. Some messy code is fine if it lives in a module that is rarely touched. Other messy code is a ticking time bomb.
How do you decide what to refactor? Use the Impact/Effort matrix.
1. The High Interest Loans (High Impact, Low Effort)
This is debt that slows you down every day but is relatively easy to fix.
- Example: A slow CI/CD pipeline that wastes 10 minutes per deploy.
- Action: Fix immediately. The ROI is massive.
2. The Mortgage (High Impact, High Effort)
This is structural debt. A monolithic architecture that needs to be microservices, or a database schema that doesn't scale.
- Example: Migrating from a legacy framework.
- Action: Plan carefully. This is a Strategic Initiative. Don't try to squeeze it in between features. Dedicate a quarter or a specific team to it.
3. The Penny Stocks (Low Impact, Low Effort)
Ugly code in a feature nobody uses.
- Example: A typo in a variable name in an admin script.
- Action: Ignore it. Or fix it only if you are already in that file ("The Boy Scout Rule"). Do not create a ticket for it.
4. The Trap (Low Impact, High Effort)
Rewriting a working system just because the code is "ugly" or uses an older library.
- Example: Rewriting the entire frontend in the newest JS framework when the current one works fine.
- Action: Avoid. This is "Resume Driven Development," not business value.
Communicating with Stakeholders
Never ask for permission to refactor. Refactoring is part of writing code, just like washing dishes is part of cooking dinner. However, for large "Mortgage" type debt, you need buy-in. Frame it in terms of risk and velocity: "If we don't fix this, feature X will take 3 weeks instead of 1 week."
Struggling to prioritize?
Stop guessing what to work on next. Use the Impact/Effort Matrix to identify quick wins and strategic initiatives.
Open Priority Matrix