Why Your Team Feels Slow (Even If Everyone Is Good)
The Fundamental Mistake: Optimizing People Instead of Systems
When a team is slow, the natural response is to add process. More standups. More status updates. More detailed ticket descriptions. More approval gates. More documentation requirements before work can begin.
Each of these feels like a solution. Each one adds friction. And friction, compounded across a team of ten developers over a six-month project, is exactly what turns a fast team slow.
W. Edwards Deming, the quality systems theorist whose work transformed manufacturing in the twentieth century, estimated that 94% of problems in organizations are caused by the system, not the people operating within it. His famous formulation: "A bad system will beat a good person every time."
This isn't a comfortable idea for engineering managers. It means that when your team is slow, the first place to look is at the systems you designed and maintain, not at the developers you hired. It also means that hiring better developers into a broken system doesn't fix the system. It just gives you better developers who are frustrated by the same constraints.
The question is not: "who is slowing us down?" The question is: "where does work get stuck, and why?"
The Theory of Constraints, Applied to Engineering Teams
Eliyahu Goldratt introduced the Theory of Constraints in his 1984 novel The Goal, which is, unusually for a management book, actually worth reading. The central insight is simple and powerful:
Every system has exactly one constraint at any given time. The throughput of the entire system is limited by that constraint. Improving anything that is not the constraint does not improve the system's throughput.
Goldratt called this constraint "the bottleneck." The metaphor he used was a chain: the strength of a chain is determined entirely by its weakest link. Making the other links stronger doesn't make the chain stronger.
Applied to engineering teams, the implication is stark: if your bottleneck is the code review process, hiring more developers doesn't help. You now have more code waiting for the same constrained review capacity. The queue gets longer. The team feels slower. If your bottleneck is the deployment pipeline, which takes forty-five minutes and fails intermittently, faster developers just means more frequent encounters with the same broken pipeline.
The Theory of Constraints gives us a five-step process:
- Identify the constraint - where does work pile up or slow down?
- Exploit the constraint - get the most out of it in its current state.
- Subordinate everything else to the constraint - optimize the rest of the system to feed the bottleneck efficiently.
- Elevate the constraint - invest in increasing its capacity.
- Repeat - once the bottleneck is resolved, a new one will emerge somewhere else.
This is not a one-time fix. It's a continuous process of finding and resolving the current limiting factor. The goal is never to eliminate all constraints - that's impossible. The goal is to keep finding and resolving them, one at a time.
The Five Patterns That Make Good Teams Feel Slow
Based on real team dynamics, and consistent with the research in Accelerate (Forsgren, Humble, Kim - 2018), here are the five patterns that most reliably turn capable developers into a slow team.
Pattern 1: The Review Queue Bottleneck
Code review is one of the highest-value practices in software development. It's also one of the most common bottlenecks.
The signal: PRs sit open for more than a day before receiving a first review. Developers context-switch to new tasks while waiting, then have to rebuild mental context when reviews finally arrive. Merge conflicts accumulate. Features that were "done" two weeks ago still haven't shipped.
This pattern typically emerges not because reviewers are lazy, but because review is treated as a secondary activity - something you do when you have a free moment, after your "real work" is done.
The structural problem: in most teams, there is no explicit capacity allocated to code review. It competes with feature development for the same cognitive budget, and feature development always wins because it's the visible, measured activity.
The diagnostic question: "What is the average time between a PR being opened and receiving a first substantive review comment?" If the answer is more than four hours, review is your bottleneck.
Pattern 2: The Unclear Ownership Trap
A feature is "almost done" for three weeks. Nobody is blocked, exactly. Work is happening. But the feature never quite reaches the finish line. It lives in a permanent state of near-completion because the final steps - cross-team sign-off, a dependency on another service, a design decision that nobody has authority to make alone - are nobody's clear responsibility.
This pattern is described in Accelerate as a symptom of low psychological safety combined with diffuse ownership: everyone assumes someone else is handling the final piece, and nobody wants to be the person who pushes the decision through without authority.
The structural problem: accountability without authority. The developer who owns the ticket doesn't own the decisions needed to close it.
The diagnostic question: "For the last five features that took longer than estimated, where specifically did they slow down, and who had the authority to unblock them?" If the answer is consistently "we were waiting for [another person / team / stakeholder]," unclear ownership is your bottleneck.
Pattern 3: The Sequential Dependency Chain
The frontend is waiting for the backend API. The backend is waiting for the database schema. The database schema is waiting for the product decision about the data model. The product decision is waiting for the design mockup.
Everything is blocked. Everyone is waiting. And somehow, in the planning meeting two weeks ago, all of this was estimated as parallelizable work.
Sequential dependencies are the engineering equivalent of what Goldratt described as "dependent events with statistical variation": each step in a chain introduces delay, and those delays don't average out. They compound.
The structural problem: work is scoped and estimated as if dependencies don't exist, then the dependencies appear and everything stalls.
The diagnostic question: "In our last three sprints, how many tickets were blocked at some point, and what were they blocked on?" If blocked tickets account for more than 20% of the sprint, dependency management is your bottleneck.
Pattern 4: The Deployment Anxiety Loop
The team ships features at a reasonable pace. But the features don't reach users at the same pace. Deployments are infrequent - weekly at best, monthly in some cases - because deploying is stressful. The pipeline is slow, flaky, or poorly understood. Rolling back is a manual process. The last three deployments each caused at least one incident.
So the team batches changes. A deployment includes two weeks of accumulated work. The blast radius of any single bug is now "everything we've built in two weeks." The fear of deployment increases. Deployments become less frequent. The batch size grows. The fear grows.
This is a reinforcing feedback loop, and it's one of the most reliably damaging patterns in software delivery. Accelerate identified deployment frequency and lead time for changes as two of the four key metrics that distinguish high-performing engineering teams from low-performing ones. Teams that deploy more frequently have fewer incidents, not more, because each deployment is smaller, the blast radius of any failure is smaller, and rollback is faster.
The structural problem: the pain of deployment is treated as a reason to deploy less often, when it's actually a signal to invest in making deployment safer and more routine.
The diagnostic question: "How long does a typical deployment take, and what is the failure rate of our last ten deployments?" If a deployment takes more than thirty minutes or fails more than 20% of the time, deployment friction is your bottleneck.
Pattern 5: The Meeting Saturation Problem
A developer's calendar has four recurring meetings per day. By the time the meetings are done, the remaining time is fragmented into blocks of forty-five minutes or less. Forty-five minutes is not enough time for deep work. It's barely enough time to rebuild the context from the last session. The developer spends the day feeling busy, because they are busy, while producing a fraction of what they're capable of.
This is not a time management problem. It's a system design problem. Cal Newport's research on deep work and Paul Graham's essay on the maker's schedule vs. the manager's schedule both point to the same underlying reality: creative technical work requires long, uninterrupted blocks of focused time. A schedule fragmented by meetings doesn't just reduce available hours - it destroys the cognitive conditions required for complex problem-solving.
The structural problem: meeting schedules are designed around the manager's calendar, not the maker's cognitive needs.
The diagnostic question: "How many developers on the team have at least two uninterrupted blocks of three or more hours per day, on most days?" If the answer is "most don't," calendar fragmentation is your bottleneck.
The Diagnostic Framework: Finding Your Bottleneck
Before you can fix the system, you have to know which constraint is actually limiting your throughput right now. Here's a practical process for finding it.
Step 1: Map the value stream
Draw, physically or digitally, every step that a piece of work goes through from "idea" to "in production." Include the waiting time between steps, not just the active work time.
A typical value stream for a feature might look like:
Idea → Refinement → Design → Dev → Code Review → QA → Staging → Approval → Deploy → Production
For each transition, estimate: "On average, how long does work wait here before moving forward?"
Most teams are surprised by what they find. The actual development time is often a small fraction of the total cycle time. Work spends most of its life waiting - for reviews, for approvals, for deployment windows, for someone to pick it up.
Step 2: Find the pile-up
The bottleneck is almost always where work accumulates. Look at your board right now. Where is the largest column? Where do tickets sit the longest? That's your constraint.
If you have access to cycle time data from your project management tool - time a ticket spends in each column - even better. Sort by average wait time per stage. The stage with the longest average wait is your bottleneck.
Step 3: Validate with the team
The board tells you where work piles up. The team tells you why. Run a focused retro with a single question: "Where do you spend time waiting, and what are you waiting for?"
Don't conflate this with a general complaints session. Keep it specific to flow. Where does the work stop? What would need to change for it to stop stopping there?
Step 4: Apply the Theory of Constraints sequence
Once you've identified the bottleneck, resist the temptation to fix everything at once. Pick the single largest constraint and work through Goldratt's five steps:
| Step | Question to ask |
|---|---|
| Identify | Where does work consistently pile up or slow down? |
| Exploit | How can we get more throughput from this constraint without additional investment? |
| Subordinate | What else in the system should we adjust to serve the bottleneck better? |
| Elevate | What investment would increase the capacity of this constraint? |
| Repeat | Now that this is resolved, where is the new constraint? |
The Four DORA Metrics: The Numbers That Actually Matter
The research behind Accelerate identified four metrics that reliably distinguish high-performing engineering teams from low-performing ones. These are now known as the DORA metrics (from the DevOps Research and Assessment program):
| Metric | What it measures | Elite benchmark |
|---|---|---|
| Deployment Frequency | How often you deploy to production | On-demand (multiple times per day) |
| Lead Time for Changes | Time from code commit to production | Less than one hour |
| Mean Time to Restore (MTTR) | How long to recover from a failure | Less than one hour |
| Change Failure Rate | Percentage of deployments causing a failure | 0–15% |
These four numbers tell you more about your team's health than any sprint velocity chart.
Comments
No comments yet. Start the discussion.