What tech debt actually tells you about your team and your system

Tech debt comes up constantly: in mentoring conversations, consulting work, conference Q&A, and inside my own teams. I’m always a little surprised by how often it’s treated as a moral failure rather than what it usually is: a set of trade-offs made under real constraints.
That framing matters because tech debt isn’t inherently good or bad. It’s a consequence of shipping. If you’re delivering real value, especially in an environment that values learning and iteration, you’re accumulating debt all the time. Every line of code you ship today is tomorrow’s constraint.
The question isn’t whether you have tech debt. The question is whether you understand why it exists and what it’s doing to your system.
Early in my career, I thought tech debt meant someone made a bad decision. Experience taught me otherwise. Some debt is deliberate. Some is benign. Some is dangerous. And some isn’t really about code at all, it’s a signal that something upstream is broken.
Tech debt as a leadership problem
The real leadership tension around tech debt is that it all looks the same in a backlog. Engineering feels the pain and wants to fix it. Product wants to hit dates. Executives want predictable results. From the outside, “we need to spend three sprints on tech debt” just sounds like unpredictability.
I’ve lived this from both sides. Early in my career, after inheriting a large, aging codebase that was genuinely holding a company back, I swung too far in the other direction at my next startup. Determined not to repeat that experience, I over-architected for a future we hadn’t earned yet. We built systems for a five?year horizon when we were still trying to survive the next six months.
Eventually, reality caught up with us. The complexity slowed us down more than the hypothetical debt ever would have. The lesson stuck: avoiding tech debt at all costs can be just as damaging as ignoring it entirely. Both mistakes stem from treating tech debt as a moral rather than a contextual issue.
That tension exists because tech debt covers very different underlying realities. Deliberate shortcuts, accidental architectural drift, aging technology choices, and systemic organizational issues all surface the same way: as work engineers would like to do.
If you don’t distinguish between those causes, you’ll either fix the wrong things or fail to fix what actually matters.
Four kinds of tech debt
Over time, I’ve found it useful to think about tech debt through four lenses, based on intent and impact. This framing isn’t a framework so much as a way to avoid treating very different problems as if they were the same.
Pragmatic (intentional) debt. This is debt you take on by choice: because you’re validating an idea, avoiding premature optimization, or buying time to learn. Healthy teams do this constantly. It’s a sign of good judgment, not sloppiness. The failure mode here isn’t taking on the debt; it’s taking it on invisibly or failing to revisit the decision.
A helpful test is simple: did we understand the trade-off when we made it?
Required debt. This is debt that actively constrains the business: reliability issues, security risks, scalability limits, or architectural bottlenecks that slow delivery. This debt isn’t optional. Avoiding it just increases the eventual cost.
The key question here isn’t “does this bother engineers?” It’s “does this prevent the business from moving in a strategic direction?” If the answer is yes, and you can measure it, you have required work.
Incidental debt. Every mature codebase has code that isn’t pretty, isn’t modern, and isn’t fun to work on, but works reliably and is rarely touched. This debt is usually safe to ignore.
Refactoring something simply because you don’t like it is frustration, not strategy. The cost of touching stable code is often higher than the cost of living with it.
The question to ask is: is fixing this cheaper than leaving it alone?
Symptomatic debt. This is the most dangerous kind. It’s debt that keeps reappearing because of unclear strategy, constant priority shifts, fractured ownership, or organizations that leave no capacity for anything but delivery.
Fixing the code doesn’t fix the problem. The system that produced the debt will just generate more of it somewhere else.
Here, the real question is: what system is creating this debt?
Why teams get stuck
Most teams struggle because they treat all tech debt as equally urgent or equally ignorable. Neither is true. Only one of these categories demands immediate action. The rest require judgment, patience, or leadership intervention outside the codebase.
I’ve seen this play out repeatedly. A monolith that was absolutely the right choice for a small team slowly becomes a deployment bottleneck as the organization grows. What was once enabling starts constraining. The mistake isn’t the original decision—it’s failing to recognize when the context changed.
I’ve also seen the opposite: teams over-architecting far into the future, building complexity they don’t yet need, because they’re trying to avoid hypothetical debt five years out while ignoring the real problem six months away.
Both mistakes come from the same place: losing sight of intent.
Making better tech debt decisions
Treat tech debt decisions like any other strategic trade-off. They deserve the same level of judgment, visibility, and follow-through as product or organizational decisions. Make them deliberate, visible, and tied to business outcomes.
If you want support from product partners, executives, or peers, you must speak the language of impact. Reliability, cycle time, risk, and optionality are business concerns, not engineering preferences.
A few practical heuristics help:
- Track intentional debt and revisit it deliberately.
- Prioritize required debt alongside roadmap work, not as an afterthought.
- Leave incidental debt alone unless it becomes chronic.
- For symptomatic debt, stop coding and start examining structure, incentives, and capacity.
Mapping how work actually flows through your organization is often more revealing than reviewing the code. Consistent friction points usually point to systemic issues, not isolated mistakes.
The human layer
Most tech debt isn’t about code. It’s about pressure.
Engineers feel guilty about shortcuts unless leaders normalize intentional debt as a legitimate tool. Product partners need clarity that some debt is an investment in learning faster. Executives need visibility into which debt threatens outcomes and which doesn’t.
When leaders promise to revisit a debt decision, they have to follow through, even if the answer is still “we’re leaving it.” Broken promises push teams toward overbuilding today because they don’t trust tomorrow.
Teams under constant delivery pressure don’t accumulate debt because they lack skill. They do it because the system leaves them no alternative. Left unaddressed, that pressure undermines morale and code quality.
How to apply this tomorrow
You don’t need a multi?quarter initiative to start improving how your team handles tech debt. A few small, deliberate moves can immediately change the conversation.
Start by identifying the top three sources of recurring pain your team complains about. Not everything, just the things that keep coming up sprint after sprint. Categorize each one honestly: pragmatic, required, incidental, or symptomatic. The act of naming the type often clarifies the decision.
For any intentional debt, write down why you chose it, what problem it solved, and when you’ll revisit it. Put a reminder on the calendar. If you say you’ll come back in six months, actually do it.
For debt that feels urgent, force a business?impact discussion. What does this slow down? What risk does it introduce today, not someday? If you can’t connect it to outcomes, it probably isn’t required yet.
And if you see the same kinds of problems appearing across multiple areas of the system, pause before opening another refactoring ticket. Ask what incentives, structures, or capacity constraints are creating that pattern. That’s a leadership problem, not a coding task.
These steps won’t eliminate tech debt. They will make it legible. And once tech debt is legible, it becomes manageable.
Tech debt as a diagnostic
There’s a line I come back to often when thinking about this:
Tech debt is code telling you a people story.
The shape of your codebase reflects the incentives, constraints, and trade-offs your teams live with every day. Some debt exists because you chose speed over elegance. Some exists because the business changed direction. Some exists because no one ever had the space to step back and ask if the system still made sense.
Seen this way, tech debt becomes less about cleanliness and more about comprehension. It tells you where judgment was exercised well, where context shifted, and where leadership attention is overdue.
These days, I look at tech debt less as a technical flaw and more as a diagnostic signal. How much of it was intentional? How much is benign? How much is actively constraining outcomes? And how much is a warning that the organizational system, not the software system, needs work?
Start with intent. Then look at the system. Only then decide what to fix.
Reading the Signal
Tech debt isn’t inherently good or bad. It’s information.
If you treat every piece of debt as a defect, you’ll waste time and erode trust. If you treat every piece as harmless, you’ll create fragility that eventually surfaces at the worst possible moment. The leverage comes from understanding why the debt exists and what it reveals about your team and your organization.
Tech debt doesn’t derail teams. Unexamined tech debt does.
When you slow down enough to interpret the signal, rather than react to the symptom, you make better decisions for your team, your product, and your company.
Originally published in my newsletter at https://kevingoldsmith.substack.com/p/tech-debt-is-a-signal-not-a-sin



