← All posts

Opinion Architecture

Technical debt isn’t the problem—unclear ownership is.

Technical debt gets the blame, but unclear ownership is why bad code never gets fixed. Here is the real diagnosis.

Tangled cables running between office desks while engineers on either side look away, ignoring the shared problem

Every engineering team has a version of the same complaint: the codebase is a mess, progress is slow, and technical debt is crushing velocity. The diagnosis is always debt. The prescription is always a cleanup sprint, a refactor roadmap, or a rewrite proposal. And yet, in most teams I have seen, the cleanup sprint gets deprioritized, the refactor roadmap collects dust, and the rewrite never ships. The debt remains. The complaint repeats. Nothing changes.

Here is what I think is actually happening: technical debt ownership is the real problem, not technical debt itself. Bad code that belongs to someone gets fixed. Bad code that belongs to everyone—which means it belongs to no one—stays broken indefinitely. The issue is not that teams lack the skill or the intention to address debt. It is that the organizational conditions for fixing it never exist, because nobody is clearly accountable for the outcome.

What technical debt actually is versus what we blame it for

Technical debt is a useful metaphor, but it gets stretched to cover too much. Ward Cunningham coined the term to describe a specific, deliberate tradeoff: ship something now with the intention of cleaning it up later, accepting the carrying cost. That is a legitimate engineering decision when made consciously.

What most teams call technical debt is something different: accumulated decisions made without full context, code written under time pressure with no plan to revisit it, abstractions that made sense for a product that no longer exists, and dependencies nobody remembers choosing. That is not strategic debt. That is just entropy. And entropy is a consequence of building software at speed. It is not the root cause of slow teams.

The teams I have seen genuinely paralyzed by their codebases were not paralyzed because the code was bad. They were paralyzed because when something needed to change, nobody knew who should change it, nobody felt safe making the call, and nobody was going to be held accountable either way. The bad code was the symptom. The ownership vacuum was the disease.

Why unclear ownership is more destructive than bad code

Bad code with a clear owner gets better over time. The owner feels the pain directly. They touch the code regularly. They have both the context to improve it and the incentive to do so, because living with broken tooling is its own punishment. I have watched engineers quietly transform genuinely terrible codebases over six to twelve months simply because they owned the domain and cared about their own quality of life.

Unclear ownership produces the opposite dynamic:

  • Nobody fixes it proactively because fixing something you do not own is a risk with no reward. If the change breaks something, it is your fault. If it does not, the credit diffuses into the team.
  • Everybody works around it instead of through it. Workarounds accumulate faster than the original debt. The system becomes progressively harder to reason about.
  • Context evaporates. When code has no owner, the institutional memory of why it was written that way disappears with whoever last touched it. Future engineers are left guessing.
  • Cleanup proposals die in planning. Refactor initiatives require someone to champion, scope, and deliver them. Without ownership, there is no natural champion. The work sits in the backlog next to seventeen other important things nobody is accountable for.
  • Blame circulates but responsibility does not. Teams get very good at explaining why the debt is someone else's fault and very bad at doing anything about it.

The counterargument: some debt is genuinely structural

I want to take the opposing view seriously because it has real merit. Some technical debt is not an ownership problem. It is an architectural problem that no amount of clear ownership easily solves.

If your data model was designed for a product that no longer exists and every feature now requires contorting that model in painful ways, that is structural debt. Assigning an owner does not make the migration easier. If your deployment pipeline was built for a monolith and you have since decomposed into services, that mismatch creates friction that ownership clarity alone cannot resolve.

There is also the problem of inherited systems where the original context is genuinely unrecoverable. Assigning ownership of a black-box legacy system to an engineer who did not write it and cannot fully understand it does not magically produce improvement. It produces a frustrated engineer and a system that still does not improve.

These are real constraints. I am not dismissing them. But I notice that even in structurally difficult codebases, the teams that make progress are the ones with clear ownership and accountability. The owner may not be able to fix everything. They can still prioritize ruthlessly, contain the blast radius, document the dark corners, and push for the resources to address the root when the opportunity exists. The owner turns a passive problem into an active one. That shift matters enormously.

What good ownership actually looks like

Ownership is not just a name on a wiki page. It is a set of conditions that have to be true simultaneously:

The owner has the authority to make decisions

If an engineer is listed as the owner of a service but needs three approvals to change the schema, they are not really the owner. Ownership without authority is just blame assignment. Real ownership means the person can make calls within agreed boundaries without running every decision up the chain.

The owner feels the consequences

Ownership works when the person responsible for a system also lives with its failures. On-call rotations, user escalations, and performance reviews that reflect the health of owned systems create the feedback loop that motivates care. When owners are insulated from consequences, ownership becomes a title rather than a practice.

Ownership is explicit and visible to the whole team

Code ownership tools like CODEOWNERS files, service catalogs, and runbook assignments are underused in most organizations. When anyone on the team can answer "who owns this?" in thirty seconds, the social contract around accountability becomes enforceable. When the answer requires an archaeology expedition through old Slack threads, it is not.

Owners have dedicated time to address debt

This is where most ownership models break down. Teams assign owners and then immediately fill every sprint with feature work. If owners are never given capacity to act on technical debt ownership responsibilities, the ownership is theoretical. Twenty percent time for health work, explicit tech debt tickets with real priority, and engineering managers who protect that capacity—these are what turn paper ownership into actual improvement.

The organizational habit that keeps this broken

Most engineering organizations have a structural incentive problem. Features ship visibly. Debt reduction ships invisibly. Product managers measure velocity on new capabilities. Engineers are rewarded for building things users see. Nobody gets promoted for cleaning up an authentication module that was causing subtle bugs nobody had formally reported yet.

This incentive gap is why ownership conversations alone are not enough. Leadership has to actively value and measure codebase health. Not with vanity metrics like lines of code deleted or test coverage percentages, but with outcome signals: incident rates, deploy frequency, time to onboard a new engineer to a domain, time to implement a change in a given area. When those metrics are tracked and connected to team performance conversations, ownership starts to mean something.

Where I land

I have stopped leading with "we need to address technical debt" in engineering conversations because it points at the wrong thing. Debt is the output. Ownership is the input. Fix the ownership structure and most teams will address debt naturally, because the people closest to the pain will finally have both the authority and the incentive to do something about it.

If your team is drowning in technical debt, I would ask before anything else: who owns the systems that hurt the most? Do they have real authority over those systems? Do they feel the consequences of their current state? Do they have time to act? If the answer to any of those questions is no or unclear, you do not have a debt problem. You have an ownership problem wearing a debt costume.

Fix that first. The code will follow.