A Framework for Measuring and Prioritizing Technical Debt

Stop arguing about tech debt in the abstract—quantify it with this data-driven framework that ties engineering health to business outcomes.

#technical-debt#engineering-management#metrics#prioritization
Cover image for the article: A Framework for Measuring and Prioritizing Technical Debt

Every engineering team knows they have technical debt. Few can quantify it. Fewer still can articulate its business cost in terms a CFO would understand.

I spent three years developing a technical debt quantification framework after watching my teams burn cycles on "tech debt sprints" that never moved the needle. The problem wasn't effort—it was that we were paying down the wrong debt. We were treating all debt as equal when some of it was costing us $200K/month in engineer time and some of it was a mild annoyance.

Why Traditional Approaches Fail

Most teams manage tech debt through one of three broken approaches:

The Backlog Graveyard. Tech debt tickets accumulate in Jira. They never get prioritized because there's no way to compare "refactor the payment module" against "build the new onboarding flow." Business always wins because debt has no quantified cost.

The Percentage Allocation. "We'll spend 20% of each sprint on tech debt." This feels fair but is actually wasteful. You're spending time on debt that might not matter while ignoring debt that's actively bleeding velocity.

The Hero Sprint. Once a quarter, the team does a "tech debt sprint." Engineers pick whatever annoys them most. Leadership feels virtuous. Nothing structurally changes.

All three fail because they lack a common unit of measurement. You can't prioritize what you can't measure.

The DICE Framework

I developed the DICE framework (Drag, Impact, Complexity, Expansion) to give every piece of technical debt a quantified score that maps to business cost.

DICE Framework overview

D — Drag (Time Tax)

Drag measures how much engineering time this debt costs per week. Not hypothetically—actually.

To measure drag, track these signals over a 4-week window:

SignalMeasurement MethodExample
Extra time per featureCompare velocity in affected vs clean areasFeatures in legacy auth take 3x longer
Incident frequencyCount incidents attributed to this systemPayment module: 4 incidents/month
Workaround maintenanceHours spent on patches and workarounds8 hours/week maintaining data sync scripts
Onboarding frictionTime for new engineers to become productive hereNew hires avoid payment code for 3 months

Convert drag to a weekly dollar cost: Drag Cost = Hours/Week x Average Engineer Hourly Rate (fully loaded)

At our fintech startup, we found that our legacy authentication system had a drag cost of $12,400/week. That's $645K/year—enough to justify a 3-month rewrite that we'd been deferring for two years.

I — Impact (Blast Radius)

Impact measures how many teams, services, or customers are affected by this debt.

Score impact on a 1-5 scale:

ScoreCriteriaExample
1Single engineer, single serviceMessy test helpers in one repo
2One team, one servicePoorly structured API routes
3One team, multiple servicesInconsistent error handling across microservices
4Multiple teams, critical pathShared library with breaking API
5Entire engineering org, customer-facingMonolithic deployment blocking all teams

C — Complexity (Payoff Difficulty)

Complexity estimates the effort required to resolve the debt. This is your investment cost.

ScoreEffortTypical Scope
1< 1 week, 1 engineerRename, restructure, add types
21-2 weeks, 1 engineerRefactor a module, add abstraction layer
32-4 weeks, 2-3 engineersRewrite a service, migrate data
41-2 months, dedicated teamSystem redesign, major migration
53+ months, multiple teamsArchitecture overhaul, platform migration

E — Expansion (Growth Rate)

Expansion captures how fast this debt is getting worse. Some debt is stable—annoying but not growing. Other debt compounds weekly as more code builds on a bad foundation.

ScoreGrowth RateSignal
1StableHasn't changed in 6 months
2Slow growthOccasional new code touches it
3Moderate growthNew features regularly add to it
4Fast growthEvery sprint makes it worse
5ExponentialBlocking architectural decisions, forcing workarounds everywhere

Calculating the DICE Score

The prioritization formula:

DICE Priority = (Drag x Impact x Expansion) / Complexity

The numerator captures the total cost of inaction—high drag, wide impact, and fast growth mean the debt is actively destroying value. The denominator represents the cost of action. Dividing by complexity means easy wins with high impact surface to the top.

Real Example: Scoring Our Top 5 Debt Items

When I ran this exercise at our logistics platform, here's what we found:

Debt ItemDrag ($/wk)ImpactComplexityExpansionDICE Score
Monolithic deploy pipeline$8,20054441,000
Legacy auth module$12,40033224,800
Inconsistent API contracts$4,10042541,000
Manual data migration scripts$3,60021321,600
Untested payment integration$6,8003316,800

The results surprised us. The untested payment integration—which kept us up at night—scored lowest because it wasn't expanding and had moderate impact. The inconsistent API contracts, which nobody was complaining about loudly, scored highest because they affected four teams and were getting worse every sprint.

Running a DICE Assessment

Step 1: Debt Inventory (1 week)

Ask every engineer to list their top 3 "things that slow me down." Deduplicate and consolidate. You'll typically get 15-30 unique items from a team of 30 engineers.

Step 2: Drag Measurement (2 weeks)

For each item, instrument your workflow to measure actual time cost. Use cycle time data, incident logs, and engineer self-reporting. Don't guess—measure.

Step 3: Scoring Workshop (Half day)

Bring tech leads together to score Impact, Complexity, and Expansion. Use calibration examples to ensure consistency. A good calibration question: "Would you bet $10K that this score is within 1 point of correct?"

Step 4: Prioritize and Plan (1 day)

Sort by DICE score. The top 3-5 items are your tech debt roadmap for the next quarter. Present the business case using drag costs—leadership understands "$645K/year in lost productivity" better than "the auth module is bad."

Communicating Debt to Leadership

The DICE framework's greatest value isn't internal prioritization—it's translation. When you can say "this technical debt costs us $1.2M/year in lost engineering productivity and is getting 15% worse every quarter," the conversation with your CEO or board changes entirely.

I present tech debt to non-technical stakeholders using three numbers:

  1. Current annual cost — Sum of weekly drag costs x 52
  2. Growth rate — Projected cost in 12 months if unaddressed
  3. Resolution cost — Engineering investment to fix, based on complexity scores

If current annual cost is $1.2M, growth rate projects to $1.8M next year, and resolution costs $400K in engineering time—the ROI is obvious. You're not asking for permission to do "engineering stuff." You're presenting a business case with a 3:1 return.

Tech debt ROI visualization

Cadence and Governance

Run a full DICE assessment quarterly. Between assessments, track drag metrics monthly to catch new debt that's growing fast.

Establish a tech debt budget—not as a percentage of sprints, but as a dollar amount you're willing to invest per quarter based on ROI calculations. This shifts the conversation from "can we afford to fix tech debt?" to "which debt gives us the best return this quarter?"

Pitfalls to Avoid

Don't score everything. If a debt item has drag below $500/week, it's not worth the overhead of tracking. Set a threshold.

Don't let perfect measurement block progress. Drag estimates within 50% accuracy are good enough for prioritization. You don't need exact numbers—you need relative ranking.

Don't ignore developer happiness. Some debt doesn't show up in cycle time metrics but destroys morale. Add a "frustration multiplier" for items that engineers repeatedly cite as painful. Happy engineers ship faster.

Don't treat this as a one-time exercise. Debt is dynamic. New debt accumulates, old debt gets resolved, expansion rates change. Quarterly reassessment keeps your priorities current.

Actionable Takeaways

  1. Stop treating all tech debt as equal. Score it with DICE and prioritize by ROI.
  2. Measure drag in dollars, not story points. Leadership doesn't understand story points. They understand cost.
  3. Focus on expansion rate. Stable debt can wait. Growing debt cannot.
  4. Run quarterly assessments. Tech debt priorities shift as your product and team evolve.
  5. Present debt as a business case. Frame every debt resolution as an investment with a measurable return.

Technical debt isn't an engineering problem—it's a business problem that manifests in engineering. Treat it like one, and you'll never struggle to get buy-in for fixing it again.

Comments

    No comments yet. Be the first to share your thoughts.