DEV Community

Steven Stuart
Steven Stuart

Posted on • Originally published at stevenstuartm.com

'Tech Debt' Is a Self-Fulfilling Prophecy

Not all tech debt is equal, but devs know the real pain that it causes and how it can stifle development and the longevity of an organization. Yet, what might be obvious to devs is rarely obvious to leaders and stakeholders.

When developers tell stakeholders "we need to pay down tech debt," stakeholders hear "we want to spend time fixing our own mistakes instead of delivering features." The term positions engineering work as backward-looking cleanup rather than forward-looking value creation. It's defensive, ambiguous, and the work stays deprioritized forever.

The real problem runs deeper. "Tech debt" is a self-fulfilling prophecy. The term itself reinforces the communication gap that often creates the problem in the first place.

Poor communication between developers and stakeholders leads to decisions made under unclear constraints. Those decisions create consequences that need to be addressed. Developers label those consequences "tech debt" and communicate it back using the same ineffective language. Stakeholders don't understand or prioritize the work. The problem festers, communication deteriorates further, and the cycle repeats. If you couldn't communicate effectively enough to prevent the problem, using the same ineffective communication pattern to solve it guarantees failure.

Why "Tech Debt" Guarantees the Problem It Describes

The metaphor itself creates the outcome everyone complains about. The term fails because of how it shapes thinking and behavior.

Ambiguity masks intent. When someone says "tech debt," what do they actually mean? Intentional tradeoffs made under time constraints? Unanticipated consequences of reasonable decisions? Outright mistakes? Code that worked fine but is now outdated due to evolving requirements? Without specificity, the term becomes meaningless. It conflates deliberate strategy with failure, making it impossible to have productive conversations about what to do next.

The vague metaphor obscures actual costs and consequences. Real financial debt has clear terms: borrow $100K at 5% interest, pay it back over 5 years. "Tech debt" has no such clarity. What's the interest rate? When is it due? What happens if we don't pay it? The metaphor lets everyone avoid confronting actual costs and timelines. Without clear costs, there's no urgency. Without clear consequences, there's no accountability. Stakeholders hear "the code is messy" and think "so what?" They don't hear "we're losing $50K per month in support costs, and we can't ship the feature roadmap because every change breaks three other things."

Debt implies inevitability. "We'll always accumulate some debt, that's just how software works." This defeatist framing makes people accept poor decisions as unavoidable rather than asking "why are we making decisions without enough information?" The term normalizes dysfunction instead of demanding clarity.

Debt frames it as engineering's problem. When you say "we have debt to pay down," stakeholders hear "you made a mess, you clean it up." It doesn't invite collaborative problem-solving. It creates an adversarial dynamic where engineering owns the problem and stakeholders reluctantly allocate time to "let them fix their mistakes." The term prevents shared ownership.

Missing architectural context creates assumption of incompetence. When architectural decision records don't exist, future teams assume incompetence rather than recognizing intentional tradeoffs. The original context disappears: why this approach was chosen, what constraints existed at the time, what the intended evolution path was. Without that clarity, the current team either blindly perpetuates a bad pattern because they don't understand the original intent, or rewrites everything because they assume the previous team didn't know what they were doing. Both outcomes are expensive.

If the architect had documented "We chose NoSQL here because we needed to ship in 3 months with the team we had. The long-term design uses relational storage; we've isolated this behind an interface so we can swap it later without touching business logic," the team has a roadmap instead of a mystery.

The architect becomes the translator between constraints, decisions, and evolution paths. Without that translation, the cycle repeats. Poor communication creates problems, vague language prevents fixes, and the gap widens.

The fact that "tech debt" is ubiquitous in the industry and yet rarely gets prioritized proves the point. The term itself guarantees the outcome. It's a communication failure masquerading as a technical problem.

An Alternative: Categories That Communicate Impact

Developers can keep using "tech debt" internally as shorthand within engineering teams. When talking to product owners and stakeholders, consider retiring the term entirely.

One approach is to categorize work by business impact using three categories: Corrections, Optimizations, and Re-Alignments.

Corrections: Problems Causing Harm Now

What it is: Mistakes, tradeoffs, or outdated decisions actively harming the business right now.

Examples:

  • Security vulnerabilities exposing customer data
  • Bugs causing support escalations or customer churn
  • Reliability issues causing downtime or SLA violations

Why this works: Stakeholders already understand bugs and security problems. These are obviously worth fixing because they're causing measurable harm today.

Language to use:

  • "We have a security vulnerability that exposes customer payment data. The fix takes 2 weeks."
  • "This bug is costing us $30K per month in support escalations. Fixing it unblocks the support team."
  • "The authentication service has 99.5% uptime. Our SLA guarantees 99.9%. The gap creates $100K annual credit exposure. Fixing the root cause takes 3 weeks and eliminates the SLA risk."

Corrections communicate urgency. The business is being hurt now, and addressing it stops the bleeding.

Optimizations: Improving Efficiency and Cost

What it is: Mistakes, tradeoffs, or outdated decisions affecting cost, performance, or efficiency.

Examples:

  • Database queries causing slow page loads (affecting conversion rates)
  • Infrastructure configuration costing more than necessary (budget impact)
  • Manual deployment process taking hours per release (velocity impact)
  • Inefficient algorithms causing excessive cloud compute costs

Why this works: Stakeholders understand optimization as improving what exists. It's not "paying debt," it's "increasing margin" or "improving user experience."

Language to use:

  • "Our cloud costs are $50K per month. A 3-week optimization brings that to $20K per month—$360K annual savings."
  • "Checkout page loads in 8 seconds. Optimizing to 2 seconds increases conversion by 15% based on industry benchmarks. The work takes 4 weeks and projects to $500K additional annual revenue."
  • "Automating deployments cuts release time from 4 hours to 15 minutes, letting us ship features faster. The automation work takes 2 weeks and doubles deployment frequency."

Optimizations communicate efficiency gains. The business improves margins, performance, or velocity with measurable ROI.

Re-Alignments: Unlocking Future Capabilities

What it is: Mistakes, tradeoffs, or outdated decisions that, when fixed, unblock new features, integrations, or business capabilities.

Examples:

  • Monolithic architecture preventing independent team scaling
  • API design preventing mobile app development
  • Data model preventing real-time analytics feature
  • Vendor lock-in preventing multi-cloud strategy
  • Legacy authentication system preventing enterprise SSO integrations

Why this works: Stakeholders understand opportunity cost. If the current architecture blocks a $2M revenue opportunity, fixing it isn't "paying debt"—it's "unlocking growth."

Language to use:

  • "We can't build the mobile app until we redesign the API. The redesign takes 6 weeks and unblocks a $2M annual opportunity."
  • "Our current data model prevents real-time dashboards (top customer request). Re-aligning the schema takes 4 weeks and delivers the feature."
  • "The monolith prevents us from scaling the checkout team independently. Splitting it out takes 8 weeks and doubles that team's velocity."
  • "Moving to OAuth 2.0 unblocks enterprise SSO integrations. The $500K deal waiting on this capability closes once we deliver it. The migration takes 5 weeks."

Re-Alignment communicates strategic value. The business unlocks capabilities that enable growth, close deals, or meet customer demands.

The Shift in Framing

The difference between "tech debt" and the alternative framework is the difference between defensive justification and strategic investment. When you say "we have tech debt that needs to be paid down" or "we need to slow down feature delivery to clean things up," you're asking stakeholders to accept past mistakes and fund backward-looking cleanup. When you say "we can save $360K annually with a 3-week optimization" or "we can unlock $2M in revenue by redesigning the API," you're presenting forward-looking opportunities with clear ROI. Stakeholders invest in opportunities. They resist paying for past mistakes.

Preventing the Problem: The Architect's Proactive Role

The alternative framework addresses existing problems, but architects can prevent much of the problem from forming in the first place. This requires proactive communication, mentoring, and governance.

Communicate business value from the start. When proposing architectural decisions, lead with business impact rather than technical elegance. Instead of "we should use microservices because they provide better separation of concerns," say "microservices let us scale the checkout team independently, which doubles their velocity and unblocks the mobile payment feature." Train developers to think and communicate this way. The habit of translating technical decisions into business value prevents the communication gap that creates the prophecy.

Mentor developers on effective stakeholder communication. Developers often communicate poorly with stakeholders because no one taught them how. Show them the difference between "we need to refactor the payment module" and "the current payment module blocks PCI compliance certification. Re-architecting it takes 4 weeks and eliminates the $200K compliance risk." This isn't just about vocabulary; it's about thinking in terms of stakeholder priorities.

Implement governance that enforces quality standards. Code reviews, architecture reviews, and automated quality gates prevent low-quality implementations from accumulating. When a pull request lacks tests, violates established patterns, or introduces tight coupling, governance catches it before it becomes a problem. This isn't bureaucracy; it's preventing technical problems from forming in the first place. The communication problem here is that teams often skip these standards under pressure, then later label the accumulated mess "tech debt" and ask for time to fix it. Enforce the standards at every increment, and the problem never accumulates.

Use Architectural Decision Records to prevent context loss. Much of what becomes "tech debt" starts as reasonable decisions made under real constraints. The problem isn't the decision; it's the missing context about why it was made and how it should evolve. Without that context, future teams assume incompetence. The adversarial dynamic forms, and the self-fulfilling prophecy begins.

Document the context (what problem, what constraints), the decision (what approach), and the consequences (what you gain, what you defer, when and how to revisit). When future teams understand why an approach was chosen and what the intended evolution path is, they have a roadmap instead of a mystery. No one assumes incompetence, and the communication gap never forms.

When you're forced into a corner because of time constraints or leadership overrides, the ADR becomes even more critical. Document the constraint, the tradeoff, and the intended evolution. This clarity prevents short-term shortcuts from becoming long-term disasters and turns non-ideal implementations into pivot points for future improvement rather than permanent technical anchors.

Breaking the Cycle

The self-fulfilling prophecy persists because both sides perpetuate it. Developers use vague language, stakeholders ignore vague requests, and the cycle continues.

Consider breaking it by being the solution:

  • Replace "tech debt" with Corrections, Optimizations, and Re-Alignments when talking to stakeholders
  • Communicate business value from the start in architectural proposals and decisions
  • Mentor developers on translating technical concerns into stakeholder priorities
  • Enforce quality standards at every increment through code reviews, architecture reviews, and quality gates
  • Document decisions with ADRs so context doesn't disappear and future teams have roadmaps

All of these approaches prevent the prophecy by demanding clear communication. When you replace vague language with business impact, mentor developers to do the same, enforce quality standards that prevent accumulation, and document decisions so context doesn't disappear, the communication gap never forms.

These aren't debts to be paid; they're opportunities for value. If the term itself guarantees the problem, replace it.

Top comments (0)