Technical Debt Is a Business Decision, Not a Technical Failure
November 8, 2024
Every production codebase carries technical debt. The variable that separates a healthy codebase from a struggling one is whether the debt was taken deliberately with a repayment position, or accumulated by default and left to compound.
Taking on debt is frequently the correct decision. Shipping a workable implementation in six weeks rather than the correct one in twelve is sound when time to market carries real value. A fix that restores production at 2 AM is sound when the alternative is prolonged downtime. The shortcut is not the problem. The absence of any record that it was taken is.
The compounding math
Unmanaged debt is expensive because the cost is recurring and the baseline is invisible.
A shortcut that saved one week in year one adds a surcharge to every subsequent change routed through that code. At a 20% surcharge on affected work, the accumulated cost passes the original saving within roughly two years and continues past it indefinitely. Over five years the total can exceed the original saving by an order of magnitude.
Leadership observes the current maintenance cost. What is not observable is the counterfactual — what equivalent work would cost in a codebase without that debt. Absent that comparison, the elevated cost reads as the normal cost of software, and no one has reason to fund a change.
The measurement that restores the comparison is the time ratio: elapsed effort for a change in the affected area against an equivalent change in a clean area of the same system. That ratio is the interest rate, and it is collectible from completed work.
Maintaining the ledger
Treat debt the way a finance function treats liabilities: an itemized register, a rate attached to each item, and a repayment order.
Each entry records:
- What was deferred, in one sentence
- Why, and under what pressure
- The rate — the measured or estimated surcharge on work touching it
- Change frequency — how often work routes through this area
- Remediation estimate
- Risk if it is never addressed
Rate multiplied by change frequency produces the ongoing cost, and that product is the ordering key. It is not the same ordering as code quality.
High-rate debt is the debt that touches most changes: the shared infrastructure every request passes through, the object that mediates too many responsibilities, the schema requiring four tables to represent one record. It is repaid first because it generates the most continuous cost.
Low-rate debt — awkward configuration, a helper that grew past its purpose in code touched twice a year — stays on the register and does not compete for sprint capacity. The register entry exists so the item is not rediscovered as a surprise.
Presenting the tradeoff
Framed as a comparison of quantities, the decision belongs to the business and is resolvable in a meeting.
"Four weeks with shortcuts that will cost roughly one week per quarter in slower development for two years, or eight weeks built correctly" states both sides in the same unit. Eight weeks of future engineering against four weeks of current schedule. That is a decision a non-technical executive can make correctly.
Either outcome is legitimate. Sometimes the shortcut is right, and a business with a funding milestone or a contractual date has reasons engineering does not have visibility into. The requirement is that the choice is made with the cost on the table, and that the resulting entry goes on the register.
What the register changes
An organization with a maintained debt register can answer three questions it otherwise cannot: what the current portfolio of deferred work is, what it is costing per quarter, and what the repayment order is.
Debt that is recorded and rated is a managed liability. Debt that is not recorded is still a liability, still accruing, and paid out of velocity that no one has attributed to it.
Working through a problem like this?
Describe the system and where it's stuck. I'll tell you what the work actually involves.
Get in touch