Why Development Velocity Declines
July 25, 2024
Velocity declines for systemic reasons, and the three dominant causes have distinct signatures. Identifying which one applies determines the intervention, and applying the wrong intervention costs a quarter.
The explanations that surface first — the team is overwhelmed, the team needs more people — describe the condition rather than the cause. Both are compatible with all three causes below, which is why they do not lead anywhere useful.
Cause 1: Accumulated technical debt
Signature: overruns cluster in specific modules; developers add buffer they cannot itemize; equivalent work takes materially longer in some areas than others.
Debt does not block work. It adds a fixed surcharge to every change routed through the affected code, and the surcharge compounds as more changes route through it. The cost is invisible in any single estimate and obvious in the aggregate.
Intervention: protected sprint capacity for debt reduction, on the order of 20%, allocated to the areas with the highest change frequency rather than the worst code quality. Those are different lists, and the first one is where the return is.
Why it fails when attempted informally: debt reduction scheduled as "when we have time" does not occur, because there is no state in which a delivery team has time. It requires a line item that survives sprint planning.
Cause 2: Knowledge concentration
Signature: velocity in a domain tracks the availability of one person; work queues behind individuals rather than behind capacity; a departure produces an immediate and lasting drop.
One person understands the payment integration. Another owns reporting. A third remembers why the legacy import behaves as it does. Each domain moves at the rate of its single owner, and stops when that person is unavailable. The problem predates any departure — the departure only makes it visible.
Intervention:
- Pair on changes in single-owner domains, with the non-owner writing the code
- Rotate ownership deliberately, on a schedule, before it is forced
- Require that any change in a concentrated domain include documentation of the decision context, not just the code
These are slower per task and faster over any horizon longer than a quarter. Measure the bus factor per domain and treat a value of one in a high-traffic domain as a defect.
Cause 3: Verification cost
Signature: changes to shared code are treated as events requiring coordination; refactoring is avoided; a substantial share of the cycle is manual regression testing; defect rates rise with change volume.
Below a certain codebase size, manual verification is viable. Past it, every change carries regression risk that must be checked by hand, and the checking cost grows with the code, not with the change. Teams in this state slow continuously and cannot identify a specific cause, because the cause is distributed across every task.
Intervention: integration tests on critical business paths first, unit tests on complex calculation logic second. Coverage percentage is not the target; the target is that a developer can change shared code and know within minutes whether they broke something. Prioritize by what the business cannot tolerate being wrong.
Why adding developers is rarely the first move
Headcount addresses a capacity constraint. All three causes above are throughput constraints, and adding people to a throughput constraint increases coordination overhead without relieving it.
Each new developer in a high-debt codebase requires onboarding time from existing developers, then produces work at the same surcharged rate. In a codebase with knowledge concentration, the new developer routes questions to the same overloaded owner. With poor verification, more parallel change means more regressions.
Headcount becomes the right answer after the constraint is removed, not before.
The diagnostic
The question that separates the causes: for the last several tasks, what specifically consumed the time?
- "Understanding the existing code" → technical debt
- "Waiting for the one person who knows" → knowledge concentration
- "Testing that nothing else broke" → verification cost
- "Waiting for a decision or access" → coordination and ownership, which is an organizational fix rather than an engineering one
Ask it about completed work with specifics attached, not as a retrospective prompt. The answers cluster, and the cluster identifies the constraint.
Working through a problem like this?
Describe the system and where it's stuck. I'll tell you what the work actually involves.
Get in touch