Skip to content

henu-wang/technical-debt-decisions

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 

Repository files navigation

Technical Debt Decisions

A practical guide for engineering teams on when to pay down technical debt vs. ship new features. Includes assessment frameworks, prioritization matrices, and communication templates for stakeholders.

Table of Contents

Understanding Technical Debt

Technical debt is the implied cost of future rework caused by choosing an expedient solution now instead of a better approach. Like financial debt, it accrues interest: the longer you wait, the more expensive it becomes.

But not all technical debt is bad. Sometimes taking on debt deliberately is the right business decision. The key is making these trade-offs consciously and tracking them.

Types of Technical Debt

Type Description Example
Code debt Poor code quality, duplication, complexity Spaghetti code, no abstractions
Architecture debt Structural limitations Monolith that needs to be a service
Test debt Insufficient or brittle tests Manual QA bottleneck, flaky CI
Dependency debt Outdated libraries and frameworks Security vulnerabilities, EOL runtime
Documentation debt Missing or stale docs New hires can't onboard
Infrastructure debt Manual processes, outdated tooling No CI/CD, manual deployments

The Debt Quadrant

Martin Fowler's technical debt quadrant:

                Deliberate              Inadvertent
           ┌─────────────────────┬─────────────────────┐
  Prudent  │ "We know this is    │ "Now we know how we  │
           │  a shortcut, we'll  │  should have done it"│
           │  fix it next sprint"│                      │
           ├─────────────────────┼─────────────────────┤
  Reckless │ "We don't have time │ "What's a design     │
           │  for clean code"    │  pattern?"           │
           └─────────────────────┴─────────────────────┘
  • Prudent-Deliberate: Strategic debt. Acceptable if tracked.
  • Prudent-Inadvertent: Learning debt. Natural and unavoidable.
  • Reckless-Deliberate: Negligent. Avoid this.
  • Reckless-Inadvertent: Skills gap. Address through training.

Assessment Framework

Debt Impact Score

Rate each debt item on three dimensions (1-5 each):

Debt Impact Score = Developer Pain × Business Risk × Compound Rate
Dimension 1 (Low) 3 (Medium) 5 (High)
Developer Pain Minor annoyance Slows feature work Blocks development
Business Risk No user impact Degraded experience Outage potential
Compound Rate Stable Growing slowly Accelerating

Priority Matrix

Score Range Priority Action
75-125 Critical Fix now, delay features if needed
40-74 High Schedule in next 2 sprints
15-39 Medium Add to quarterly planning
1-14 Low Track, address opportunistically

When to Pay Debt vs Ship

Pay Debt When

  • Developer velocity has measurably declined
  • The debt area is on the critical path for upcoming features
  • Security vulnerabilities exist in outdated dependencies
  • On-call burden is increasing due to system fragility
  • New team members cannot be productive within 2 weeks

Ship Features When

  • Market window is closing
  • The debt is in a stable, rarely-touched area
  • Revenue depends on the feature shipping by a deadline
  • The debt can be contained and doesn't spread
  • You're validating product-market fit (pre-PMF)

The Decision Matrix

                    High Feature Urgency    Low Feature Urgency
High Debt Impact  │ Negotiate scope +      │ Pay debt first
                  │ minimal debt fix       │
──────────────────┼────────────────────────┼──────────────────
Low Debt Impact   │ Ship feature           │ Ship feature,
                  │                        │ then debt sprint

Making these trade-offs explicit is crucial. Teams that use a structured decision framework like KeepRule to document their ship-vs-fix decisions can identify patterns over time and calibrate better for future trade-offs.

Measuring Technical Debt

Leading Indicators

Metric How to Measure Warning Threshold
Lead time Time from commit to production > 2x historical average
Deployment frequency Deploys per week < 50% of target
Change failure rate % of deploys causing incidents > 15%
Time in code review Average PR review cycle > 48 hours
Build time CI/CD pipeline duration > 15 minutes

Lagging Indicators

Metric How to Measure Warning Threshold
Incidents per sprint Production incidents Trending upward
On-call pages After-hours alerts > 2 per week
Sprint velocity trend Story points completed Declining 3+ sprints
Bug-to-feature ratio % of work that's bug fixes > 40%

Developer Survey

Quarterly anonymous survey with questions like:

  • "How confident are you deploying on Friday?" (1-5)
  • "How often does existing code slow you down?" (daily/weekly/monthly/rarely)
  • "Which system would you rewrite first?"

Communicating with Stakeholders

The Interest Rate Metaphor

"We have $200K in tech debt. The interest rate is ~15% —
meaning every sprint, we lose 15% of our capacity to debt
maintenance. Paying down $50K of debt this quarter would
reduce the interest rate to ~8%, giving us more capacity
for features in Q3."

Stakeholder Presentation Template

## Technical Debt Status: Q1 2026

### Current State
- Feature velocity: Down 20% over 6 months
- Incident rate: Up 35% over 6 months
- Developer satisfaction: 3.1/5 (was 4.2/5)

### Proposal
- Dedicate 30% of Q2 capacity to debt reduction
- Focus areas: CI/CD pipeline, authentication service, test coverage

### Expected Outcomes
- Feature velocity recovery: +15% by Q3
- Incident reduction: -40% by end of Q2
- Developer satisfaction target: 3.8/5

Paydown Strategies

1. The 20% Rule

Allocate 20% of every sprint to debt reduction. Sustainable and predictable.

2. Debt Sprints

Dedicate entire sprints to debt. Good for large refactors but requires stakeholder buy-in.

3. Boy Scout Rule

Leave every file better than you found it. Small improvements compound over time.

4. Strangler Fig Pattern

Gradually replace legacy systems piece by piece rather than doing a big-bang rewrite.

5. Debt Budgets

Each team gets a quarterly "debt budget" in story points. Teams decide how to spend it.

Case Studies

Case 1: The Deployment Bottleneck

Situation: Deployments took 4 hours with manual steps. Shipping features was slow. Decision: 2-sprint investment in CI/CD automation. Result: Deployments reduced to 15 minutes. Feature velocity increased 40%. Lesson: Infrastructure debt has the highest ROI when it affects every feature.

Case 2: The Premature Microservice

Situation: Team wanted to split monolith into microservices at 5 engineers. Decision: Tracked the debt but decided the monolith was appropriate at current scale. Result: Team stayed productive. Revisited at 15 engineers when the pain was real. Lesson: Not all perceived debt needs immediate action.

Documenting these decisions and their outcomes helps teams build intuition. A decision journal or a tool like KeepRule makes it easy to review past trade-offs and see which types of debt investments paid off.

Resources

  • A Philosophy of Software Design by John Ousterhout
  • Refactoring by Martin Fowler
  • Accelerate by Forsgren, Humble, Kim
  • Martin Fowler's TechnicalDebt bliki entry

Contributing

Share your team's tech debt decision frameworks and war stories. Real-world examples are especially valuable.

License

MIT License - see LICENSE for details.

About

When to pay tech debt vs ship features — assessment frameworks, measurement, stakeholder communication, and paydown strategies.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors