Engineering Leadership

Why most technical debt is really organisational debt

Code rarely becomes hard to maintain because engineers wanted it that way. More often the architecture is just a faithful record of the incentives, constraints and decisions of the organisation around it.

· 6 min read

Updated with images and a diagram.
Editorial cover: technical debt as the small visible tip of a much larger organisational mass An iceberg: a small "technical debt" tip sits above the waterline; the large mass below the surface is organisational debt: incentives, ownership, prioritisation, handoffs. incentives unclear ownership prioritisation pressure handoffs & approvals single-expert risk competing priorities technical debt what everyone sees what actually drives it

Technical debt is the usual suspect whenever software delivery starts to drag. Features take longer than they should. Incidents creep up. Changes that ought to be routine start to feel risky. Eventually someone points at the codebase and declares technical debt the culprit.

They're usually right. Just rarely in the way they mean.

The code is usually the symptom

When engineers talk about technical debt, the conversation almost always lands on the software itself: poor abstractions, duplicated logic, a legacy framework two majors behind, an architecture that drifted, tests that were never written. All of it real. All of it genuinely painful to work in.

But most of it is a symptom, not a cause. Codebases very seldom rot because an engineer sat down one morning and chose complexity for the fun of it. They rot because the organisation around them kept rewarding the short-term outcome over the durable one, sprint after sprint, until the accumulated weight of all those sensible little decisions became something nobody could lift. The code is simply where that history becomes legible.

Every shortcut was rational at the time

Part of what makes this so hard to unpick is that the debt rarely came from bad decisions. It came from good ones.

A launch date that could not move. A regulatory change with a statutory deadline. A production incident that needed a workaround in the next hour, not the next sprint. A commercial opportunity that appeared on a Thursday and had to ship by Monday. Looked at in isolation, the overwhelming majority of debt-creating decisions were entirely reasonable, and I'd have signed off most of them myself.

The catch is that software keeps the receipts. The organisation banks the benefit and moves on; the engineering team inherits the cost and pays it down, with interest, for years. A pawn sacrifice is perfectly sound when you meant it and have the initiative to show for it. The trouble is the positions where nobody decided to sacrifice anything; the material just leaked away, one reasonable trade at a time.

Architecture follows incentives

Engineers like to believe architecture is the product of technical decisions. More often it's the product of organisational behaviour that has set, over time, into technical form.

Take a company that rewards feature delivery, finds platform work almost impossible to prioritise, writes quarterly objectives entirely in terms of product output, and measures success by how much shipped rather than how well it holds up. You can predict the architecture that organisation will grow without reading a single line of its code.

Two columns joined by arrows. What the organisation rewards on the left maps to what the architecture becomes on the right: ship features fast to shortcuts that shipped, platform work hard to fund to weak foundations, output over maintainability to duplication and drift, deadlines beat design to leaky abstractions.

It won't be elegant, and that won't be because the engineers lacked the skill to make it so. It'll be because the system was optimised, relentlessly and successfully, to produce something other than elegance. The architecture did precisely what it was told.

Ownership debt is worse than technical debt

Here's the part that surprises people - a remarkable amount of "technical" debt evaporates the moment ownership becomes clear.

The most miserable systems I've worked on tended to share a profile, and it was rarely about the code. Several teams contributed changes; none owned the roadmap. Incidents bounced between rotas like an unwanted parcel. The docs were last accurate during a previous reorg. Every improvement was real, agreed, and perpetually deferred to "next quarter".

Software survives genuinely poor design for years when someone owns it and cares. Even beautifully designed systems decay when nobody does. Strong ownership is the thing holding most codebases together, and diluted ownership is the thing pulling them apart. It just never shows up in a static analysis report.

The debt nobody tracks

Organisations are pretty good at spotting technical debt now. There are tools, dashboards, a whole vocabulary for it. What they're far worse at is naming the organisational debt sitting right next to it.

A team that depends on a single person who understands the payments flow. An approval chain that needs three handoffs to change a config value. Two departments that have to coordinate for anything to ship. Decision-making authority so unclear that nobody's sure who can actually say yes. Three stakeholders pulling the same roadmap in different directions. None of that appears in a repository. All of it shapes delivery, and frequently it shapes delivery far more than the software ever could. I've made a related argument about metrics: the things that most affect a delivery system are usually the ones least visible on a dashboard.

Refactoring the organisation

When delivery slows, the reflex is to schedule a technical debt initiative, carve out a quarter, and send the engineers in to tidy up. Sometimes that's exactly right and the codebase really is the primary problem.

More often the debt keeps accruing because the conditions that produced it never changed. The organisation still rewards speed over sustainability. The ownership model is still vague. The same prioritisation pressure is still bearing down every planning cycle. You can send a team to repair the symptoms, but if the mechanism generating them is left running, the result is utterly predictable - the debt comes straight back, and the engineers learn that cleanup is theatre.

You cannot refactor your way out of an organisational problem. You have to refactor the organisation.

Look beyond the code

The best engineering organisations I've been around treat maintainability as a business concern rather than a purely engineering one. They accept that ownership needs real investment, that platform work is leverage rather than overhead, that engineering capacity is finite, and that delivery speed and maintainability are allies far more often than they're rivals.

Most of all, they stop treating technical debt as evidence of engineering failure. It's evidence of trade-offs, and trade-offs are the job. The only question worth asking is whether a given trade was deliberate, understood and proportionate, or whether it just happened to everyone while they were looking the other way.

So when a codebase becomes hard to change, by all means look at the software. Sometimes that's where the answer is. Often it isn't. The incentives, the deployment processes, the ownership boundaries and the org chart all leave their fingerprints on a system, and over time those fingerprints set hard and get filed under "technical debt". Which is why the most useful question is almost never "why does the code look like this?" It's the more uncomfortable one:

What conditions made this the rational thing to build?

The answer, more often than not, is sitting somewhere well outside the codebase.

Further reading

  • Technical Debt (Martin Fowler): the clearest short explanation of the metaphor and why it credits Ward Cunningham, who coined it.
  • Conway's Law (Mel Conway): the original statement that a system's structure mirrors the communication structure of the organisation that built it.
  • Team Topologies: the canonical reference for structuring teams and ownership so that delivery stops fighting the org chart.

Human (you) in the loop

New writing, now and then

Occasional notes on platform engineering, building dependable software and that constant buzz word we doom scroll past on LinkedIn! No cadence promised.

Prefer a reader? Subscribe via RSS.

← All Articles

Jump to

32 articles