Blog

Technical Debt Isn't the Problem — Not Knowing Which Debt to Pay Down Is

6 min read

Every founder I talk to apologizes for their codebase before I’ve even opened it. “It’s a mess back there.” “We took shortcuts.” “I know we need to refactor X.”

Here’s the thing: almost every working piece of software has technical debt. That’s not a red flag,it’s a byproduct of shipping. The real problem isn’t that the debt exists. It’s that most teams treat all debt the same way, either ignoring it entirely until something breaks, or trying to fix everything at once and stalling the roadmap for a quarter.

Neither approach works. What you need is a way to tell which debt is quietly fine to live with, and which debt is actively costing you money, speed, or risk. That’s a triage problem, not a cleanup problem — and it’s one of the first things I look at in an architecture review.

Why “just fix it” is the wrong instinct

Engineers are trained to want clean code. Left to their own devices, most engineering teams will over-invest in what we call refactoring: rewriting a service that works fine, chasing 100% test coverage on a feature nobody’s touched in a year, migrating frameworks because the new one is more elegant.

That instinct isn’t wrong, exactly. It’s just untethered from the business. A startup doesn’t have the runway to pay down debt for the sake of code quality alone. Every week spent refactoring is a week not spent on the feature that closes your next round of customers, or the fix that stops churn.

So the question isn’t “should we pay down this debt?” It’s “does paying down this debt buy us something we actually need right now?”. Whether it’s speed, stability, or the ability to hire and onboard faster. If the answer is no, it can usually wait, even if it offends an engineer’s sense of order.

A simple framework: plot debt on two axes

I use a version of this with almost every client in the first few weeks of an engagement. It’s not complicated on purpose. The goal is something a non-technical founder can use to push back on their own team, not just something impressive-looking.

Plot every piece of debt your team is worried about on two axes:

1. Cost of delay : what does it cost you to leave this alone for another quarter? This might be developer time lost to workarounds, a slower onboarding ramp for new hires, or a growing risk of an outage.

2. Blast radius : if this breaks, or if you need to touch this code to ship the next big feature, how much of the system does it affect? A messy internal script that one person touches twice a year has a small blast radius. Your authentication layer or your core data model has a huge one.

That gives you four quadrants:

  • High cost of delay, high blast radius — fix now. This is the stuff that’s actively slowing the whole team down or sitting under everything else you’re building. Your payments flow held together with duct tape. The database schema every new feature has to work around. This is where architecture review time and roadmap slots should go first.
  • High cost of delay, low blast radius — fix opportunistically. Annoying, localized problems — a flaky test suite for one service, a slow admin tool. Worth fixing, but you don’t need to stop the roadmap to do it. Good candidates for “20% time” or the sprint after a big launch.
  • Low cost of delay, high blast radius — watch closely, don’t touch yet. This is the debt that makes engineers nervous but isn’t actually costing you anything today. A core system built on an aging but stable stack. Resist the urge to “fix” this proactively — but keep it on a watchlist, because it’s exactly the kind of thing that becomes urgent fast once you scale, add a second team touching it, or start relying on it for something new.
  • Low cost of delay, low blast radius — ignore it. That messy internal script nobody but one engineer ever opens. Leave it. Every hour spent here is an hour not spent where it matters.

Where founders usually get this wrong

The most common mistake I see isn’t ignoring debt. It’s fixing the wrong quadrant. Teams gravitate toward the debt that’s most visible or most annoying to work in day-to-day (often quadrant two or four), while the debt quietly sitting in quadrant one: high cost, high blast radius, gets deprioritized because it’s scary and nobody wants to touch it.

That’s backwards, and it’s usually a symptom of not having anyone accountable for looking at the codebase from a business-risk lens rather than a “what’s annoying me this week” lens. This is a big part of what a fractional CTO is actually for: someone who can sit down with engineering, map the real cost and blast radius of each piece of debt, and make the call on what gets roadmap time without the bias of having written the code themselves.

The second common mistake is treating this as a one-time exercise. Debt migrates between quadrants as you grow. Something that was low blast radius when you had 5,000 users can become high blast radius at 500,000. Revisit the map every quarter, not just when something breaks.

A quick gut check for your team

If you want to try this yourself before bringing in outside help, ask your engineering lead these three questions about any piece of debt they’re worried about:

  1. If we never touch this again, what actually happens? If the honest answer is “probably nothing,” it’s quadrant four. Move on.
  2. How many other things depend on this? The more surface area it touches, the more it belongs in the “fix now” conversation. Especially if you’re about to build new features on top of it.
  3. Is this slowing down hiring or onboarding? Debt that makes it hard for new engineers to ramp up is a hidden cost that rarely shows up on a roadmap but compounds every time you hire.

If your team can’t answer these with any confidence, that’s usually the real finding. Not a specific piece of debt, but a gap in how technical decisions are being evaluated against the business. That’s worth fixing before any single refactor is.

FAQ

How do I know if my startup has too much technical debt? Technical debt is a problem when it’s slowing down delivery or creating real risk, not simply because it exists. If your team is spending more time working around old code than building new features, or you’re seeing recurring outages tied to the same fragile systems. That’s the signal to prioritize it, not the mere presence of messy code.

Should technical debt block new feature development? Rarely, and only for the highest-risk quadrant: debt with both high cost of delay and high blast radius. Most technical debt can be worked around temporarily while you keep shipping, as long as someone is tracking it so it doesn’t quietly become urgent.

Who should decide which technical debt to prioritize? Ideally someone with both technical depth and visibility into the business roadmap. Often a CTO, VP of Engineering, or Fractional CTO. Leaving this purely to individual engineers tends to over-prioritize code elegance over business impact.

How often should we revisit our technical debt priorities? Quarterly is a reasonable default for an early-stage company, or immediately after any major growth milestone: a funding round, a big new customer, or a jump in usage. Since blast radius and cost of delay both shift as you scale.

Working through this in your own org?

If this hit close to home, that's usually a good first call. Tell me where your team and technology are today.

Book a call