Fractional CTO
Back to Blog
Engineering

Technical Debt Is a Capital Allocation Problem

The cost of paying technical debt is the opportunity you give up to do it.

A finite set of red tokens split between repairing an old circuit board and funding three new systems

Every technical debt conversation seems to begin the same way. Engineers describe a codebase that is hard to change. Product points to a roadmap that is already late. A founder asks how many sprints it will take to "clean everything up."

That framing almost guarantees a bad decision.

Cleanup sounds finite: remove the mess, get the code clean, and return to normal work. Software does not work that way. Customers change. Markets change. Teams change. The code keeps changing with them. So the question is whether fixing debt is a better use of the team's time than everything else it could do.

Technical debt is not primarily a code-quality problem. It is a decision about where the company should invest its next dollar and its next engineering hour.

Waiting is holding an asset

Debt is useful when it buys something more valuable than it costs. Technical debt works the same way. A startup may accept a manual process, a tightly coupled module, or an architecture that will not support ten times the current traffic because that growth may never happen. Shipping sooner may buy customer learning, revenue, or another funding round.

This is the economic argument behind YAGNI. As Kent Beck recently explained, "You Aren't Gonna Need It" was never about saving the effort of writing code. It is about committing to a design before you have the information you need.

Building for a predicted future has two costs. The first is lost optionality. When you design for a future feature, customer, or scale problem, you give up the option to wait and learn. Even if your prediction is right, you committed earlier than needed. If it is wrong, you pay again to change or remove the design.

The second is net present value. A design built today for a feature due in three months brings the cost forward and delays the return. Suppose doing something "right" costs $100,000 today. A narrower solution costs $50,000 now and another $100,000 to replace two years later. The narrow solution looks wasteful if you only compare engineering costs. But $50,000 today may be runway the company cannot recover. It may fund the experiment that tells you whether the product needs to scale at all. Two years later, the same $100,000 may be a much smaller share of revenue or capital.

AI does not remove either cost. It can generate the framework or service almost for free, which makes building ahead more tempting. But cheap code is not a cheap commitment. The company still gives up options, maintains more code, delays other work, and may understand less of the system it now owns.

The value of waiting is not the code you avoid writing. It is the option to make a better decision once reality has supplied more information.

The narrower solution only makes sense when the company understands the debt, can replace it later, and gets enough value from waiting. Unplanned debt is usually negligence. Deliberate debt can be strategy.

What the debt costs

Financial debt becomes dangerous when interest leaves no money to invest. Technical debt becomes dangerous when its cost leaves no time to change the product.

That interest rarely appears as a line item called "technical debt." It appears as:

An ugly module that has not changed in three years may cost almost nothing. A clean service touched by six teams every week may cost a fortune. Code-smell inventories and "percentage of debt" dashboards miss this. They measure what engineers can see, not what the business pays for.

I treat the technical roadmap as a portfolio. A team can spend its time on four kinds of work:

Product

Features, experiments, new use cases, and anything else customers will pay for.

Scale

Work that lets the product handle more customers, transactions, integrations, or complexity.

Risk

Work that reduces the chance or cost of outages, security incidents, compliance failures, and lost trust.

Speed

Automation, observability, internal tools, and other work that makes the next change cheaper or faster.

Most companies spend too much on the first category because features are visible and always have a sponsor. Everything else gets dumped into "tech debt." A security hole, a scaling limit, a flaky deployment pipeline, and an engineer's dislike of an old framework end up competing as if they were the same problem.

Naming the result changes the conversation. "Refactor the billing service" describes work. "Cut the time needed for a pricing experiment from three weeks to two days" describes a return. Founders can compare that return with a feature.

How I decide what to fix

For each piece of debt, I ask five questions.

  1. What does it cost now? Count delays, incidents, manual work, lost deals, cloud spend, and cognitive load. Ignore problems that exist only in theory.
  2. How quickly is that cost growing? Debt in a stable component and debt in the fastest-changing part of the product have different interest rates.
  3. When does it become too expensive or risky? Name the customer, financial, operational, or regulatory limit that forces action.
  4. Can we reverse the decision? A throwaway internal tool is different from a data model used by every workflow or a vendor that owns your core data.
  5. What will we delay to fix it? Name the feature, experiment, customer, or runway you are giving up.

This does not produce a universal debt ratio or a rule that says "reserve 20% of every sprint." Fixed allocations ignore context. A startup searching for product-market fit and a regulated scale-up should not make the same choices. The same company may make a different choice after signing a large enterprise customer.

Debt moves up the list when:

Sometimes waiting is the right decision. The code may be stable. The product assumption may still be unproven. A replacement may consume runway the company needs elsewhere. Or a planned product change may remove the debt on its own.

Both choices can be correct. "Always fix debt" is not a strategy. Neither is "move fast until it breaks." Strategy means knowing which limit matters now and which options the company needs later.

From technical debt to technical capital

Reducing friction has a ceiling. Once the codebase works well enough, another round of tidying brings little value.

Luca Rossi calls the alternative technical capital: engineering work that keeps paying back through cheaper, faster, or safer changes. A deployment platform, an experimentation system, an internal tool, a reusable integration layer, or better observability can remove debt and make the next piece of work easier.

Companies do not win by having the cleanest code. They win by learning and shipping faster without taking risks that can kill them.

The next time someone proposes a technical debt sprint, ask what it returns, what risk it removes, and what you will delay to fund it.

Enjoyed this article?

Subscribe to get notified when I publish next.

Ezequiel Actis Grosso

Ezequiel Actis Grosso

Fractional CTO

I help startups turn architecture, technical risk, and engineering constraints into business decisions. 25+ years shipping software.

Follow on LinkedIn

Which Technical Debt Is Actually Costing You?

A technical debt assessment should produce an investment roadmap, not a list of code smells. I help founders decide what to fix, what to carry, and what to build next.

Book a Free Consultation