Technical Debt Triage: A Framework for Prioritization

December 18, 2017

Technical debt is inevitable. The question isn’t whether you have debt—it’s whether you’re managing it strategically. Paying down all debt isn’t realistic; resources are limited. Ignoring all debt accelerates decline. The answer lies in prioritization: knowing which debt matters and which doesn’t.

Categorizing Debt

By Type

Prudent-deliberate: Conscious decisions to take shortcuts for business reasons. “We know this doesn’t scale past 10K users, but shipping now matters more.”

Prudent-inadvertent: Debt discovered after the fact. “Now we know a better approach, but our original design was reasonable given what we knew.”

Reckless-deliberate: Taking shortcuts knowing they’re harmful. “We don’t have time for tests.” This is the most damaging type.

Reckless-inadvertent: Bad design due to ignorance. “I didn’t know about SOLID principles.” Often found in legacy systems from earlier team stages.

By Location

Core domain: Debt in your most important business logic. Changes here are frequent; debt compounds rapidly.

Supporting systems: Debt in necessary but non-differentiating systems. Lower change frequency; debt compounds slower.

Infrastructure: Debt in deployment, monitoring, development tools. Affects everything but may be stable.

Legacy: Debt in systems planned for replacement. Investment questionable if replacement is imminent.

The Prioritization Matrix

Score debt on two dimensions:

Impact Score (1-5)

How much does this debt hurt?

Change Frequency Score (1-5)

How often do you work in this area?

Priority Calculation

Priority = Impact × Change Frequency

Range: 1-25

High priority (15-25): Address soon. High impact in frequently changed areas.

Medium priority (8-14): Plan to address. Schedule in upcoming work.

Low priority (1-7): Accept or defer. May never justify investment.

Example Triage

Debt ItemImpactFrequencyPriority
User service has no tests4520
Legacy payment code tangled5210
Admin dashboard slow224
Inconsistent naming conventions2510
Monolith deployment process4416
Old authentication system313

This triage suggests:

  1. User service tests (20) - highest priority
  2. Deployment process (16) - significant impact, frequent pain
  3. Naming conventions and payment code (10 each) - plan for later
  4. Admin dashboard and auth (4, 3) - accept for now

Debt Decay

Not all debt gets worse over time. Consider:

Increasing debt: In areas with active development, debt compounds. Workarounds accumulate. Knowledge fragments.

Stable debt: In stable areas, debt neither improves nor worsens. It’s annoying but contained.

Naturally resolving debt: Debt in systems planned for replacement or deprecation will disappear without investment.

Factor decay trajectory into prioritization. Increasing debt needs attention sooner.

Strategic Approaches

Opportunistic Paydown

When working in an area, improve it. The “boy scout rule”—leave code better than you found it.

This works for small debts. It doesn’t work for large refactorings that can’t be done alongside feature work.

Dedicated Allocation

Reserve capacity for debt paydown. Common approaches:

Dedicated allocation ensures debt receives attention despite feature pressure.

Bundling with Features

When features require touching debt-ridden areas, include paydown in the estimate.

“Feature X touches the user service. We’ll also add tests as part of this work.”

This ties debt paydown to visible feature delivery, making it easier to justify.

Big Bets

Some debt requires significant, focused investment. Complete rewrites, major architectural changes, infrastructure replacements.

Big bets need clear business justification, dedicated resources, and executive support. They’re appropriate for high-priority debt that can’t be addressed incrementally.

Communicating About Debt

To Leadership

Frame debt in business terms:

Leaders need to understand impact, not implementation details.

To Engineers

Be specific about what debt exists and why:

Transparency builds understanding and prevents frustration.

Tracking Debt

Maintain a debt inventory:

ItemTypeImpactFrequencyPriorityOwnerStatus

Review periodically. Remove addressed items. Re-score items as understanding evolves.

When to Accept Debt

Some debt doesn’t deserve attention:

Low priority debt: If Impact × Frequency < 5, accept it. The investment doesn’t justify the return.

Debt in dying systems: If the system is being replaced within a year, don’t invest in improving it.

Cosmetic debt: Inconsistent formatting, suboptimal variable names—annoying but not impactful.

Speculative debt: “This might cause problems someday.” Without concrete impact, defer.

Accepting debt is a valid decision. Strategic acceptance is different from negligent accumulation.

Key Takeaways