How to Estimate Technical Debt Without the Drama
ScrumPoi · · 11 min read
“We’ll Fix It Later” Is How Products Die
Most teams don’t underestimate technical debt—they ignore it until it’s on fire.
Then someone asks the worst possible question:
“Can you estimate how much tech debt we have?”
Cue:
- Hand-wavy guesses (“Uh… 30% of the codebase?”)
- Endless debates about definitions
- Architects writing 40-page “debt registers” no one reads
- Product owners quietly thinking, “Is this just devs not wanting to ship features?”
The drama isn’t about the debt.
It’s about the way we try to estimate it.
You don’t need a perfect number.
You need a consistent, low-drama way to size, prioritize, and negotiate technical debt work.
Let’s do that.
What Technical Debt Really Is (And Isn’t)
If you can’t define it simply, you can’t estimate it.
A Practical Definition You Can Actually Use
Forget the academic definitions. For planning and prioritization:
Technical debt is any internal quality issue that:
- Makes change slower, riskier, or more expensive
- Is known to the team
- Is fixable without rewriting the whole product
That includes:
- Messy, duplicated, or tightly coupled code
- Missing or flaky tests
- Outdated dependencies and libraries
- Manual deployment or release steps
- “Temporary” hacks that became permanent
It does not include:
- “I don’t like this pattern” personal preferences
- Major architectural rethinks with no clear business driver
- Perfectionism disguised as “engineering excellence”
If it doesn’t slow you down or increase risk in a measurable way, it’s not debt—it’s taste.
Why Estimating Tech Debt Is So Hard
The difficulty isn’t technical, it’s social:
-
Invisible to non-engineers
Stakeholders don’t see “spaghetti controllers”; they see “features shipped.” -
No shared unit of measure
Features have story points, revenue, and users. Debt has… vibes. -
Engineers are bad at saying “no”
So they say “yes, but we need to pay down tech debt” and it sounds like a stall tactic.
You fix this by:
- Making debt visible in business terms
- Estimating in relative impact, not fantasy precision
- Turning arguments into repeatable, boring rituals
Stop Chasing a Single “Tech Debt Number”
If your CTO is asking, “What percentage of our backlog is tech debt?” you’ve already lost.
There is no meaningful single metric like:
- “We are 42% in debt”
- “We need three months to clean everything up”
- “We have 500 story points of tech debt”
Those numbers are:
- Easy to game
- Quickly outdated
- Useless for real decisions
Instead, you want to answer three practical questions:
- Where does tech debt hurt us the most right now?
- How much faster/safer could we move if we fixed this specific thing?
- What’s the smallest investment that gives us a noticeable improvement?
That means your estimates should be:
- Local (per area/module/epic)
- Relative (comparisons, not absolutes)
- Tied to cycle time, defects, or risk
A Simple, Low-Drama Framework for Estimating Tech Debt
Here’s a pragmatic approach I’ve seen work across multiple teams.
Step 1: Map Your “Hot Spots”
You don’t need to scan the entire codebase. Start where it hurts.
Ask the team:
- “Where do we dread making changes?”
- “What parts of the system blow up the most?”
- “Which modules take way longer to change than they should?”
Then pull some quick data:
- Lead time / cycle time by component or area
- Defects per component (production bugs, incident history)
- Frequency of changes (how often you touch that area)
You’ll quickly spot:
- A few modules that change often and cause pain
- Some areas that are stable and not worth worrying about
Focus on the top 3–5 hot spots. Ignore the rest for now.
Step 2: Use a Simple “Debt Impact Score”
For each hot spot, score three things on a 1–5 scale:
-
Change Cost – How much slower is work here compared to “normal”?
- 1 = Same as anywhere else
- 3 = Roughly 2x slower
- 5 = 3–4x slower, lots of rework
-
Defect / Incident Risk – How likely are changes here to break things?
- 1 = Rarely causes issues
- 3 = Occasional production bugs
- 5 = Frequent incidents, late-night pages
-
Business Criticality – How important is this to users/revenue?
- 1 = Low usage, internal-only
- 3 = Important but not core
- 5 = Core flows, money-makers, compliance, SLAs
Then compute:
Debt Impact Score = (Change Cost + Risk) × Criticality
Example:
| Area | Change Cost | Risk | Criticality | Score |
|---|---|---|---|---|
| Payments service | 4 | 5 | 5 | 45 |
| Admin panel reports | 3 | 2 | 2 | 10 |
| Notification templates | 2 | 3 | 3 | 15 |
| Legacy auth module | 5 | 4 | 4 | 36 |
This is not science. It’s structured judgment.
But it’s enough to say: “Payments and auth are killing us; reports can wait.”
Step 3: Estimate the “Speed Gain,” Not the Cleanup Cost
Don’t ask, “How long to clean all this up?”
Ask:
“If we invest 1–2 sprints in this area, how much faster could we deliver future work there?”
Use a simple scale:
- S = 0–10% faster (nice to have)
- M = 10–25% faster
- L = 25–50% faster
- XL = >50% faster or major risk reduction
Then tie it to upcoming work:
- “We have three big epics touching payments in the next quarter.”
- “If we get an L improvement here, those epics land 20–30% faster and safer.”
That’s a conversation product people understand:
- “Invest 2 weeks now to save 4–6 weeks over the next 3 months.”
Step 4: Turn Debt Into Regular, Sized Backlog Items
Stop creating vague tickets like “Refactor payment service.”
Instead, write concrete, testable debt stories:
- “Reduce payment integration test runtime from 40 minutes to <10 minutes.”
- “Introduce contract tests between service A and B to cut integration bugs by 50%.”
- “Replace custom auth logic with library X and add coverage for Y scenarios.”
Then:
- Estimate them like normal work (story points or t-shirt sizes)
- Track them in the same backlog
- Link them to related product epics (“supports faster checkout improvements”)
Debt work shouldn’t be a mysterious side project. It’s just another form of product investment.
Common Mistakes When Estimating Technical Debt
Mistake 1: Treating “Tech Debt” as a Sacred, Unquestionable Bucket
If your argument is basically, “We need to pay down tech debt because… tech debt,” expect pushback.
Anti-patterns:
- 20–40% of every sprint reserved for “tech debt” with no clear outcomes
- Vague language like “clean up,” “modernize,” “stabilize” with no metrics
- Using “tech debt” as a shield to avoid uncomfortable conversations
Fix it by:
- Always tying debt work to specific, measurable benefits: faster delivery, fewer incidents, lower on-call pain
- Being explicit: “This work should reduce average lead time for feature X by 20%.”
Mistake 2: Giant Audits and “Debt Registers”
Some teams spend months on:
- Full codebase scans
- Architecture review documents
- Massive spreadsheets listing every “issue”
By the time they’re done:
- Half the system has changed
- Priorities have shifted
- No one wants to maintain the document
Instead:
- Use just-in-time assessment: estimate debt when you’re about to touch an area
- Keep a lightweight list of hot spots, not a catalog of every smell
Mistake 3: Mixing Up “Weird” With “Bad”
Not all legacy code is debt.
-
A “weird” but stable module that never changes and never breaks?
That’s not debt. That’s just history. -
A beautifully architected module that takes weeks to extend because of overengineering?
That’s debt.
Estimate based on:
- Change frequency
- Pain when changing
- Impact when it breaks
Not how “clean” it looks to a new hire.
Mistake 4: Going All-Or-Nothing
“Let’s stop new features for three months and pay down debt” is almost always a terrible plan.
Why it fails:
- Business loses momentum
- Scope explodes once you’re “in there anyway”
- You emerge with cleaner code but no clear business win
Instead:
- Slice debt work into small, outcome-focused chunks
- Pair debt stories with related feature work in the same area
- Aim for continuous improvement, not a one-time “debt purge”
Tactical Ways to Estimate Tech Debt Without the Drama
Here’s how to make this work in the day-to-day.
1. Add a “Debt Check” to Refinement
When refining a story, ask:
- “Does this touch any known hot spots?”
- “If yes, what small debt item could we bundle with this work?”
Example:
- Story: “Add support for new payment provider.”
- Debt item: “Extract payment provider configuration into separate module to avoid duplication.”
Estimate both together:
- “This is 5 points for the feature, 3 points for the debt improvement.”
Now you’re not “slowing down for tech debt.” You’re:
- Doing the feature
- Making the next similar feature cheaper
2. Use Lightweight Team Voting for Debt Impact
Once per sprint or per month, run a quick session:
- List the top 5–10 suspected hot spots
- Have the team vote (anonymously if possible) on:
- Change Cost (1–5)
- Risk (1–5)
- Criticality (1–5)
Average the votes, compute the scores, and pick the top 2–3 to address over the next few sprints.
Anonymous voting helps avoid:
- Senior devs anchoring everyone
- Architects dominating the conversation
Tools that support anonymous voting for planning poker or retrospectives make this painless.
3. Track a Few Simple Indicators
You don’t need full-blown DORA metrics to get value. Track:
- Lead time for changes in key areas (average days from dev start to prod)
- Incidents / bugs per area
- Rework rate: how often do you have to revisit a story due to underlying mess?
Then, when you do debt work, watch:
- “Did lead time for payments go from 8 days to 5?”
- “Did incident frequency drop in that module?”
That’s your ROI story.
4. Make Tradeoffs Explicit With Product
Don’t say: “We need to clean this up.”
Say:
- “We can ship this feature in 2 weeks as-is, but future changes here will stay slow and risky.”
- “Or we take 3 weeks now, including 1 week of debt work, and future features in this area should be 20–30% faster.”
Frame it like:
- Option A: Short-term speed, long-term drag
- Option B: Slight delay, long-term acceleration
Then let product and stakeholders choose with eyes open.
How to Talk About Tech Debt So People Actually Listen
Translate Engineering Pain Into Business Language
Instead of:
- “The codebase is a mess.”
- “We need time to refactor.”
Say:
- “Changes in this area take 3x longer than they should.”
- “This module is responsible for 40% of our production incidents.”
- “If we don’t address this, we’ll struggle to deliver these three roadmap items on time.”
Use:
- Percentages
- Incident counts
- Lead time comparisons
Stakeholders don’t need to understand the code; they need to understand the tradeoffs.
Be Honest About Uncertainty
You will be wrong sometimes. That’s fine.
Say things like:
- “This is a rough estimate based on our current understanding.”
- “We’ll timebox the first week and reassess.”
- “If this takes more than X, we’ll stop and report back.”
That builds trust faster than pretending you have perfect foresight.
Use Tools to Support the Conversation, Not Replace It
You don’t need a “tech debt AI scanner” to get started.
You do need:
- A backlog that can hold debt stories
- A way to run quick, unbiased estimation and prioritization sessions
- A simple place to capture your top hot spots and scores
For example, teams often use planning poker tools with anonymous voting—like ScrumPoi, which also supports retrospectives and Jira integration—to estimate both features and tech debt without hierarchy or loud voices skewing the numbers.
Wrap-Up: Make Tech Debt Boring (In a Good Way)
Estimating technical debt doesn’t need to be dramatic, philosophical, or perfect.
You just need to:
- Define it pragmatically: known, fixable problems that slow you down or increase risk
- Focus on hot spots, not the whole universe
- Estimate impact, not perfection: how much faster/safer will this make us?
- Integrate debt work into normal planning, with clear, measurable outcomes
If your tech debt conversations feel like a recurring argument, that’s a process problem, not a code problem.
Turn it into a routine:
- Small, regular assessments
- Simple scoring
- Concrete stories
- Visible impact
Do that, and “How much tech debt do we have?” stops being a trap question—and becomes the start of a useful, grown-up conversation.