Technical Debt: Tracking and Prioritization

December 10, 2018

Technical debt is inevitable. Decisions that made sense at the time become burdens as requirements change and systems evolve. Shortcuts taken under pressure accumulate interest. The question isn’t whether you have technical debt—it’s whether you’re managing it intentionally.

Here’s how to track, prioritize, and address technical debt systematically.

Understanding Technical Debt

Types of Technical Debt

Deliberate debt: Conscious shortcuts taken for speed.

Accidental debt: Debt created without awareness.

Bit rot: Debt from lack of maintenance.

Environmental debt: Debt from external changes.

Why Debt Accumulates

Time pressure: Ship now, fix later. Knowledge gaps: Didn’t know a better way. Changing requirements: What was right became wrong. Team changes: Original authors left. Growth: What worked at small scale doesn’t at large scale.

Cost of Debt

Technical debt has real costs:

Velocity: Slower feature development Quality: More bugs, harder testing Morale: Frustrating developer experience Onboarding: Longer time to productivity Risk: Security vulnerabilities, outages

Tracking Technical Debt

Debt Inventory

Create a living document of known debt:

# Technical Debt Registry

## High Priority

### [TD-001] Legacy authentication system
**Impact:** Security risk, slow development
**Effort:** Large (3-4 weeks)
**Area:** auth-service
**Owner:** Security Team
**Status:** Approved, waiting for capacity

### [TD-002] N+1 queries in order service
**Impact:** Performance degradation at scale
**Effort:** Medium (1 week)
**Area:** order-service
**Owner:** Orders Team
**Status:** In backlog

## Medium Priority

### [TD-003] Inconsistent error handling
**Impact:** Harder debugging, poor user experience
**Effort:** Medium (spread across teams)
**Area:** All services
**Owner:** Platform Team
**Status:** RFC in progress

Categories

Organize debt by:

Impact type:

Urgency:

Effort:

Tracking in Issue Tracker

Use your existing issue tracker:

# Issue: [Tech Debt] Migrate to structured logging

## Description
Current logging is unstructured, making debugging difficult.
We should migrate to structured JSON logging.

## Impact
- Debugging takes 2-3x longer
- Log aggregation is unreliable
- Alert precision is poor

## Proposed Solution
1. Add structured logging library
2. Update logging calls in each service
3. Update log aggregation config

## Effort Estimate
2 weeks across services

## Labels
tech-debt, observability, medium-priority

Metrics

Track debt health:

Leading indicators:

Lagging indicators:

Prioritization Framework

Impact vs. Effort Matrix

         High Impact
              │
    Quick     │    Strategic
    Wins      │    Investments
              │
─────────────────────────────
              │
    Fill Time │    Probably
    Tasks     │    Don't Do
              │
         Low Impact

   Low Effort ─────────── High Effort

Quick Wins: Do these immediately Strategic: Plan and schedule Fill Time: Do when available Don’t Do: Accept or remove from list

Scoring Model

debt_priority_score = (
    impact_score * impact_weight +
    risk_score * risk_weight +
    (1 / effort_score) * effort_weight
)

# Example weights
impact_weight = 0.4
risk_weight = 0.3
effort_weight = 0.3

Score dimensions:

Decision Framework

When to prioritize debt:

Fix now:

Schedule soon:

Batch later:

Accept:

Paying Down Debt

Dedicated Time

Allocate regular time for debt:

Percentage allocation:

Debt sprints:

Tech debt days:

Opportunistic Paydown

Pay debt while building features:

Boy Scout Rule: Leave code better than you found it.

# While implementing feature, clean up:
# - Extract method
# - Improve names
# - Add missing tests
# - Update outdated comments

Scope creep vs. opportunistic improvement:

Incremental Migration

Large migrations done incrementally:

Week 1: New approach alongside old
Week 2-4: Migrate service by service
Week 5: Remove old approach

Feature flags enable safe migration:

if feature_flags.new_auth_system:
    return new_auth.authenticate(user)
else:
    return legacy_auth.authenticate(user)

Making Debt Visible

Stakeholders need to understand debt:

In planning:

In retrospectives:

In roadmaps:

Prevention

Design Reviews

Catch debt before it’s created:

Code Review Focus

Review for future maintenance:

Quality Standards

Prevent debt accumulation:

Regular Audits

Periodic debt assessment:

# Quarterly Tech Debt Audit

## New Debt Identified
- [TD-015] Performance regression in search

## Debt Paid Down
- [TD-003] Inconsistent error handling (50% complete)

## Debt Status Changes
- [TD-007] Upgraded from Medium to High priority

## Overall Trend
- New debt: 3 items
- Resolved: 5 items
- Trend: Improving

Key Takeaways

Technical debt is a tool. Used consciously, it enables speed. Left unmanaged, it cripples productivity.