Photo: free stock photography (Unsplash licence) — see imprint
Debt is a speed tax, and you can measure it
Track how long a small, comparable change took a year ago versus today. When 'add a field to the order' goes from two days to two weeks, you have a number a CFO understands, and it is far more persuasive than any code-quality metric.
Not all debt is worth repaying
The ugly module nobody has touched in three years and which never breaks is fine. Leave it. Repay debt where you are still actively working — the interest is only painful where you keep borrowing.
Refactor with the feature, not instead of it
A three-month 'cleanup project' with no visible outcome will be cancelled in month two. Attach the cleanup to the feature that touches that code anyway — it gets funded, shipped and tested by real usage.
The hiring argument closes the deal
Nobody good wants to maintain a codebase they cannot set up in an afternoon. If your best developer leaves and you cannot replace them, the debt just became an existential problem instead of an engineering one.
- Measure debt as delivery slowdown, not code smell.
- Only repay debt in code you still touch.
- Bundle refactoring into funded features.
Frequently asked questions
As a speed tax, not a code smell. Take a small, comparable change and compare how long it took a year ago against how long it takes now. When 'add a field to the order' goes from two days to two weeks, you have a number a CFO understands. Code-quality dashboards produce numbers nobody outside engineering can act on; delivery slowdown produces one everybody can.
Stop saying the code is messy — that is not a business case. Translate it into three things a board already budgets for: delivery speed, outage risk and hiring cost. The last one usually closes it. Nobody good wants to maintain a codebase they cannot set up in an afternoon, so if your best developer leaves and cannot be replaced, the debt has stopped being an engineering problem and become an existential one.
Usually not, and we will say so even when the project would be ours to run. A three-month cleanup with no visible outcome gets cancelled in month two, when something urgent appears and nothing shippable has come out of it. Attach the cleanup to the feature that touches that code anyway. It gets funded because the feature is funded, and it gets tested by real usage instead of by hope.
No. The ugly module nobody has touched in three years, that never breaks, is fine — leave it alone. Interest only hurts where you keep borrowing, so repay debt in the code you are still actively working in. Rewriting stable code that nobody reads buys you nothing except the risk of breaking something that currently works. Ugly and untouched is a perfectly acceptable end state.
We do this for a living — Shopware, Node.js, React, ERP integration and automation for B2B.
Talk to an engineer