DEV Community

Cover image for Why Your Team Feels Slow (Even If Everyone Is Good)
Gavin Cettolo
Gavin Cettolo

Posted on

Why Your Team Feels Slow (Even If Everyone Is Good)

The engineering manager sat across from me with a look I've seen too many times.

"I don't understand it," he said. "We have good developers. Smart people. Everyone is working hard. But we're always late. We're always behind. Every sprint feels like we're running through mud."

I asked him one question: "When was the last time you mapped how work actually flows through your team, from idea to deployed feature?"

He paused. "We have a board."

"That's not the same thing."

The instinct when a team feels slow is to look at the people. Who isn't pulling their weight? Who is the bottleneck? Who needs to be managed more closely, retrained, replaced?

This instinct is almost always wrong.

In my experience, when a team of good developers feels slow, the problem is never the developers. It's the system they're working inside, the invisible accumulation of process friction, unclear ownership, sequential dependencies, and deployment anxiety that turns individual competence into collective sluggishness.

This article is about finding that system, naming its failure points, and fixing them.


TL;DR

  • Slow teams are almost never caused by slow people. They're caused by systems that create friction, ambiguity, and waiting at every step.
  • The Theory of Constraints tells us that every system has exactly one bottleneck at any given time. Optimizing anywhere else is waste.
  • There are five specific patterns that account for most team slowdowns, and each one has a diagnostic signal that makes it identifiable before it becomes a crisis.
  • The DORA metrics give you four numbers that tell you more about your team's health than any sprint velocity chart.

Table of Contents


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:

  1. Identify the constraint, where does work pile up or slow down?
  2. Exploit the constraint, get the most out of it in its current state.
  3. Subordinate everything else to the constraint, optimize the rest of the system to feed the bottleneck efficiently.
  4. Elevate the constraint, invest in increasing its capacity.
  5. 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
Enter fullscreen mode Exit fullscreen mode

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
Change Failure Rate Percentage of deployments causing incidents 0–15%
Time to Restore Service How long to recover from a failure Less than one hour

These four numbers tell you more about the health of your engineering system than any sprint velocity chart or story point count.

A team that scores well on all four is a team with short feedback loops, low deployment anxiety, and high confidence in their ability to ship and recover. A team that scores poorly on any one of them has a constraint worth investigating.

The most important insight from the DORA research: these four metrics are not trade-offs. Elite teams don't sacrifice stability for speed, or speed for stability. They achieve both simultaneously, because they've invested in the systems (CI/CD, test coverage, observability, deployment automation) that make high-frequency, low-risk delivery possible.

If your team scores poorly on deployment frequency and lead time, the bottleneck is almost certainly in your delivery pipeline. If you score poorly on change failure rate and time to restore, the bottleneck is in your testing, observability, or incident response process.

Measure these four numbers. They will tell you exactly where to look.


What to Do Once You've Found the Bottleneck

Finding the constraint is the hard part. Fixing it is usually more straightforward, because once the problem is named precisely, the solution space narrows dramatically.

A few principles that hold across most bottleneck types:

Fix the system before adding people. Hiring into a constrained system increases queue depth, not throughput. Before adding headcount, ask whether the new person would be blocked by the same constraint as everyone else.

Make the constraint visible. A bottleneck that everyone can see is one that creates shared urgency to fix. A board column labeled "Waiting for Review" that grows visibly throughout the sprint is more motivating than a manager saying "we need to improve our review process."

Protect the constraint. In the Theory of Constraints, the bottleneck should never be starved or idle. In engineering terms: if code review is your constraint, the highest-value activity during downtime is clearing the review queue, not starting new features that will just wait behind the existing backlog.

Invest asymmetrically. Small improvements to the constraint have outsized system-wide effects. A 20% improvement to your deployment pipeline speed might translate to a 40% improvement in team throughput if deployment was the limiting factor. The same effort applied elsewhere would have almost no measurable impact.

This connects directly to what we explored in The Hidden Cost of "It Works": quick fixes applied to non-bottleneck areas don't just fail to improve the system, they create an illusion of progress that delays addressing the real constraint.


Final Thoughts

Good developers in a broken system produce mediocre results.

This is not a comfortable truth, especially if you're the person responsible for the system. It's easier to believe the problem is a specific person, a specific team, a specific bad decision. Those are visible and actionable. The system is invisible and systemic.

But the data is clear. The Theory of Constraints, the DORA research, Deming's quality work, they all point in the same direction. Speed is a property of systems, not individuals.

The teams that ship fastest are not the ones with the most talented developers. They are the ones that have invested in removing the friction that slows talented developers down.

Short feedback loops. Clear ownership. Deployment that's routine, not stressful. Review that's a first-class activity, not an afterthought. Schedules designed for makers, not just for managers.

These are not soft concerns. They are engineering infrastructure, and they deserve the same investment and rigor as the code itself.

Find your bottleneck. Fix the system. Repeat.


Further Reading

  • The Goal - Eliyahu Goldratt (1984)
  • Accelerate - Nicole Forsgren, Jez Humble, Gene Kim (2018)
  • Deep Work - Cal Newport (2016)

Where does work pile up in your team right now?

Be specific if you can. Is it review? Deployment? Dependencies? A single person who is the bottleneck for too many decisions?

The conversation in the comments on these articles is always more useful than the article itself, because the specific details of real teams are where the real learning happens.

If this resonated, a ❤️ or a 🦄 helps it reach more tech leads who need to read it.
And follow along for the next article in the series.

Top comments (0)