Types of Tech Debt

Intentional: "We'll use a simple solution now and refactor when we scale." This is strategic — you're trading future work for present speed. Unintentional: Poor design decisions made due to inexperience or time pressure. Bit rot: Code that was once good but has degraded as requirements changed. Dependency debt: Outdated libraries, unsupported frameworks, security vulnerabilities. Understanding the type helps prioritize — intentional debt with a plan is fine; unintentional debt with no plan is dangerous.

Identifying Tech Debt

Signs: (1) Features take 3x longer than expected in a specific area, (2) Same bugs keep recurring, (3) New developers struggle to understand the code, (4) Deployment is fragile and scary, (5) Tests are flaky or missing. Tools: SonarQube for code quality metrics, dependency audit for outdated packages, git log analysis for high-churn files. Ask your team: "What code do you dread working in?" — developers know where the debt lives.

Prioritization Framework

Score each debt item on: (1) Impact: How much does it slow development? (2) Risk: Can it cause outages or security issues? (3) Effort: How long to fix? (4) Frequency: How often do developers encounter this? High-impact, low-effort items go first. Security vulnerabilities are always urgent. A legacy API that nobody touches is low priority even if it's ugly. Use a simple spreadsheet or Linear project to track and rank debt items.

Payment Strategies

Boy Scout Rule: Leave code better than you found it — small improvements with every PR. Dedicated sprints: One "tech debt sprint" per quarter for large refactors. 20% time: Allocate 15-20% of each sprint to debt. Piggyback: When building a feature in a debt-heavy area, include cleanup in the estimate. Strangler fig: Build new system alongside old, gradually migrate. The best strategy combines daily small improvements with periodic focused effort.

Communicating to Stakeholders

Don't say: "We need to refactor the codebase." Say: "This area has accumulated complexity that's causing 40% slower feature delivery and 2x more bugs. A 2-week investment will save us 3 weeks over the next quarter." Frame debt in business terms: velocity impact, bug rates, onboarding time, outage risk. Track metrics before and after debt reduction to demonstrate ROI. Product managers respond to data, not developer frustration.

Preventing New Debt

Code reviews that enforce standards. Automated linting and formatting. Architecture decision records (ADRs) for major choices. Definition of "done" includes tests and documentation. Realistic sprint planning — rushing creates debt. Investment in developer tooling — slow builds, flaky tests, and poor DX create systemic debt. Prevention costs less than cure.

Building a Debt-Aware Culture

Make tech debt visible — dashboard showing debt items, age, and impact. Celebrate debt reduction alongside feature delivery. Include "technical health" in sprint retrospectives. Never blame individuals for creating debt — it's usually a systemic issue (time pressure, unclear requirements). The goal isn't zero debt — it's managed debt at a sustainable level that doesn't slow the team down.