Problem
“We have tech debt” is a black box that founders can't reason about
Every engineering team has technical debt — that's not a problem, it's the natural result of building software under time and resource constraints. The problem is when it becomes the standing explanation for slow delivery, high defect rates, and engineering team attrition, but no one can quantify what it actually costs or which parts of it matter most. At that point, “tech debt” has become a black box: real enough that you can't ignore it, vague enough that you can't prioritize against it.
Most founders respond to this ambiguity by treating tech debt as an engineering concern and deferring indefinitely. That instinct is understandable — if you can't evaluate the claim, it's hard to fund the solution. But deferral compounds the cost. Technical debt grows faster when it's unaddressed because every new feature built on top of a weak foundation inherits the fragility. Teams slow down, defects increase, and eventually the debt becomes so structural that addressing it requires a rewrite rather than incremental cleanup.
The fix isn't to fund everything engineers describe as debt — it's to develop a framework for distinguishing which debt is creating real business cost and which is creating engineering frustration. Those aren't the same thing, and conflating them is how companies end up spending engineering cycles on cosmetic refactoring while business-blocking problems go unaddressed.
Requirements
The three categories of debt — and why they're different
Technical debt splits into three meaningfully different categories. Deliberate debt is a shortcut taken knowingly to ship faster — a hard-coded configuration value that should be dynamic, a batch job that runs nightly when it should run in real time, a feature flag system built by hand because building it properly would have taken two extra weeks. This debt is fine. It was a reasonable business decision, and it becomes a problem only if it never gets addressed.
Accidental debt is poor design discovered later — often after the original authors have left and the system has grown in ways that expose early assumptions as wrong. A data model that made sense for your first 10 customers but breaks under multi-tenancy, an authentication system built before you added enterprise SSO requirements, a monolithic database that was fine at 10,000 users but creates contention at 500,000. This debt is the most dangerous because it often isn't visible until it's actively causing problems. Bit rot is the third category — code that decays as the environment around it changes. Dependencies that go unmaintained, integrations to APIs that have been deprecated, build tooling that no new hire knows how to operate.
The business impact of debt isn't determined by which category it falls into — it's determined by what it prevents. Ask your engineering team to frame debt in terms of decisions you can't make, features you can't ship, and engineers you can't retain. “We can't launch the mobile app without rebuilding the authentication layer first” is actionable. “The codebase is messier than it should be” is not.
Process
How to get business-legible debt accounting from your engineering team
Start by asking your engineering lead to produce a debt inventory in business terms, not engineering terms. The right question isn't “what parts of the codebase need improvement?” — it's “what can we not do today because of decisions we made earlier, and what would it cost to change that?” This reframes debt as a set of business constraints rather than a measure of code quality, and it makes prioritization possible.
Good answers look like: “We can't support EU data residency without splitting our database, which is a two-month project” or “Every time we change the pricing model, the billing module takes four weeks to update because it wasn't designed for flexibility.” These are claims with business stakes and cost estimates. Bad answers look like: “The legacy code is untestable” or “We need to refactor the service layer.” Push back on vague answers until you have concrete consequences.
Once you have a business-legible inventory, the next step is triage. Which items are actively blocking a revenue path or creating live customer incidents? Which are slowing velocity but not preventing anything critical? Which are cosmetic — things engineers find frustrating but that don't visibly affect output or reliability? Assign every item to one of those buckets before you decide how to fund them. The buckets drive very different responses.
Structure
A 2x2 for deciding what to fix and when
Map every item in your debt inventory on two axes: business impact (high vs. low) and remediation cost (high vs. low). The resulting quadrants give you a clear prioritization framework. High impact, low cost: fix now, these are quick wins that are almost certainly worth doing. High impact, high cost: plan and fund explicitly — these need to be on the roadmap with dedicated time and resourcing, not squeezed into sprint buffers. Low impact, low cost: fix opportunistically when engineers are working in that area anyway. Low impact, high cost: leave it alone until the impact changes.
The most common mistake is letting engineering teams spend time on low-impact, low-cost cosmetic refactoring — improving code that already works, adopting new patterns for their own sake, standardizing formatting — while high-impact debt goes unaddressed because it's harder to schedule. Engineers gravitate toward cosmetic work because it's satisfying, incremental, and low-risk. That's understandable, but it means the debt inventory never actually shrinks where it matters.
The other failure mode is treating all debt as urgent. Some debt is fine to carry indefinitely if the business impact is low. A legacy API wrapper written in a style the team no longer uses, a deprecated feature that still has a handful of users, an internal tool built quickly four years ago — none of these need to be addressed unless they're actively causing problems. Spending engineering time on them is waste. Your job as a founder is to make sure debt gets addressed in proportion to the business cost it creates, not in proportion to how much it bothers your engineers aesthetically.
Learn this properly, not just for one decision
In-depth courses and books that teach you to think like an engineer — not a one-off answer you'll need to look up again next time.
Frequently asked questions
How much engineering time should we allocate to tech debt reduction?
There's no universal rule, but a common starting point is 20% of each sprint. The more useful framing is to tie the allocation to business outcomes: if a specific area of debt is causing customer incidents or blocking a revenue-generating feature, it justifies dedicated time outside of normal sprint work. If the debt isn't visibly costing you anything, 20% is probably too much. If engineers are spending more than 30–40% of their time managing the consequences of past decisions, that's a signal the baseline allocation is too low and the debt has crossed into structural drag.
How do I know if an engineer is using 'tech debt' as an excuse for slow delivery?
Ask for specifics. "The codebase has a lot of tech debt" is unfalsifiable. "We can't add a second payment provider without rewriting the billing module because it hard-codes Stripe IDs throughout" is a claim you can evaluate. If an engineer can't translate a technical debt concern into a concrete business constraint — a feature that can't ship, a reliability problem that affects customers, a hiring barrier — that's a signal the concern may be aesthetic rather than operational. That doesn't mean it's wrong; it means it shouldn't compete with business-blocking work for prioritization.