May 14, 2023
Table of Contents
I recently gave a presentation at my company about tech debt - sharing knowledge, techniques, and experiences on how to manage it properly and efficiently. The response convinced me to write this up for a broader audience. What surprised me wasn’t the technical content resonating - engineers already know tech debt is a problem. What surprised me was how many product managers and stakeholders came up afterward saying, “I never understood why the team kept asking for refactoring time. Now it makes sense.”
That reaction told me something important: the problem with tech debt isn’t that we don’t know how to fix it. It’s that we don’t know how to talk about it to the people who control the priorities. And that communication gap costs more than the debt itself.

What Actually Counts as Tech Debt?
Technical debt is the accumulation of extra work that arises when you intentionally take a shortcut in implementation to achieve a specific goal, or when systems become technically obsolete over time. Like financial debt, you’re borrowing against the future for short-term gains. Common examples include bad naming, poorly structured code, low test coverage, hard coding, compatibility issues, scalability bottlenecks, and security gaps.
Here’s where the definition gets misused: not every problem in software is debt. Inherent complexity, incomplete features, bugs, and performance issues from unexpected load are not tech debt - they’re the nature of building complex systems. Calling everything “tech debt” dilutes the term and makes it harder to get stakeholder buy-in when real debt needs attention. So how do you tell the difference?
How Do You Spot It?
flowchart TD
A[Warning Signs] --> B[Changes take longer than expected]
A --> C[Consistently missed deadlines]
A --> D[Recurring defects in same areas]
A --> E[High maintenance costs]
A --> F[System feels bloated]
B & C & D & E & F --> G[Investigate: Is it tech debt?]
G -->|Intentional shortcut or obsolescence| H[Yes - Track it]
G -->|Bug or inherent complexity| I[No - Different approach needed]
Proactive identification through code review and static analysis tools catches debt before it compounds. In my team, I make it a practice to tag tech debt items during code review - creating visibility before they become emergencies. According to Stripe’s Developer Coefficient report, developers spend an average of 33% of their time dealing with technical debt and bad code. That’s a third of your engineering capacity going to workarounds instead of building value. But recognizing the debt is only half the battle - why should anyone care enough to fix it?
Why Should Stakeholders Care?

| Impact | How It Hurts |
|---|---|
| Increased maintenance costs | Shortcuts require more work to fix later, compounding over time |
| Longer development times | Teams spend more time working around debt than building features |
| Scalability issues | Architecture shortcuts break under growth |
| Lost sales opportunities | Customers choose more reliable competitors |
| Decreased confidence | Developers and stakeholders lose faith in the system |
| Security vulnerabilities | Shortcuts in security create exploitable gaps |
| Brand damage | Outages and data breaches erode customer trust |
When Is Debt Actually Acceptable?
Not all tech debt is bad. Strategic debt - taken intentionally with a plan to repay - is a legitimate business tool:
- Proof of concept - Testing feasibility before investing in production quality
- MVP launches - Getting to market fast to validate demand
- Rapid prototyping - Quick experiments to test hypotheses
- Resource constraints - Pragmatic trade-offs when capacity is limited
- Strategic experimentation - Testing new technologies or business models
The key distinction: intentional debt with a repayment plan versus accidental debt from negligence. The first is a business decision. The second is a liability. If the debt is real and the impact is clear, how do you get the people who control the roadmap to prioritize it?
How Do You Get Buy-In?
This is where most engineers fail. They explain tech debt in technical jargon that stakeholders don’t understand or care about. “We need to refactor the service layer” means nothing to a VP of Product. But “this change will reduce our deployment time from 2 hours to 15 minutes, freeing the team to ship features 3x faster” - that gets attention.
The approach that works:
| Step | Engineer’s Instinct | What Actually Lands |
|---|---|---|
| Speak their language | “We need to refactor the service layer” | “This reduces deployment time from 2 hours to 15 minutes” |
| Quantify the impact | “The code is messy and hard to work with” | “This costs us 8 engineer-hours/week - roughly $20K/month in lost productivity” |
| Frame as investment | “We need time to fix this” | “2 sprints now saves us from a 6-week outage recovery later” |
| Show ROI | “Trust me, it’s important” | ROI calculation alongside feature work in the same backlog |
McKinsey’s research on tech debt found that the average organization spends 10-20% of its technology budget on tech debt maintenance. That’s not a technical problem - it’s a financial one. And once stakeholders see it that way, the conversation changes entirely.
How Do You Manage It?
A comprehensive approach that I’ve found works well:
- Track everything. Maintain a tech debt register. Items you don’t track silently compound.
- Communicate roadmaps. Share the repayment plan with stakeholders - transparency builds trust.
- Automate quality gates. CI/CD pipelines with linting, static analysis, and test coverage thresholds prevent new debt from entering.
- Invest in test coverage. Not just code coverage - meaningful test coverage that catches regressions.
- Practice continuous improvement. Dedicate a fixed percentage of each sprint to debt reduction.
- Follow established practices:
- Clean Code - Readable, maintainable code following SOLID principles
- Clean Architecture - Modular, layered systems with clear boundaries
- The 12-Factor App - Practices for cloud-native, maintainable applications
Key Takeaways
- Tech debt is a financial concept, not a technical one. Communicate it in terms of business impact - cost, risk, velocity.
- Not all debt is bad. Strategic, intentional debt with a repayment plan is a legitimate tool. Accidental debt from negligence is a liability.
- Prevention beats cure. Clean code practices, code review, and automated quality gates are cheaper than retroactive refactoring.
- Track and prioritize. A tech debt register with business-impact scoring keeps the conversation objective and actionable.
- Make it visible. Stakeholders can’t support what they can’t see. Transparency is your most powerful tool for getting buy-in.
Your homework for this week: pick the single most painful piece of tech debt in your codebase and translate it into a one-paragraph business case. Include the cost per month (in engineer-hours or dollars) and the ROI of fixing it. Share it with your product manager. The conversation that follows will tell you everything about whether your organization is ready to take debt seriously.
Share :
You May Also Like

What Can We Do With Self-Hosted ChatGPT
A few weeks ago, I started running my own version of ChatGPT on my homelab. The first attempt was Meta’s LLaMA model in its Alpaca-6B variant - and honestly, the response quality left a lot to …
Read More
The Modern Leader
There’s a pattern I’ve seen play out more than once. A team ships a big release, leadership celebrates, and within weeks the strongest engineers start disengaging. They become quieter in …
Read More