Your Pipeline Is Lying to You About How Fast You Ship
There's a particular kind of pain that doesn't announce itself. It doesn't throw an error. It doesn't page you at 2 a.m. It just... costs you. A few minutes here. A retry there. A developer who stops bothering to push small changes because the feedback loop takes long enough to break their flow state.
That's what a slow CI/CD pipeline does. And the insidious part? Most teams have fully normalized it.
You hear it in the language. "Our builds are just kind of slow." "Yeah, that test flakes sometimes, we ignore it." "Deploys take a while, just grab a coffee." These aren't complaints anymore — they're accepted facts, baked into how the team operates. And that acceptance is exactly where the real cost hides.
The Compounding Math Nobody Does
Let's get concrete for a second. Say your pipeline takes 18 minutes from push to green. That might not sound alarming. But if your team of six engineers each trigger four pipeline runs a day — a totally reasonable number — you're burning through 432 developer-minutes daily just waiting. That's over seven hours. Every single day.
Now factor in the context-switching. Engineers don't just sit there watching a progress bar. They switch tasks, get pulled into Slack, start reviewing something else. When the build finally finishes, they have to reload their mental context before acting on the result. The pipeline isn't just slow — it's actively interrupting the rhythm of work.
Over weeks and months, this compounds into something harder to measure but very real: a team that unconsciously starts batching changes to "make the wait worth it," which means bigger diffs, harder reviews, and riskier deploys. You wanted to ship small and often. The pipeline trained you out of it.
The Usual Suspects (And Why They Get a Pass)
So what's actually causing the drag? A few culprits show up again and again.
Flaky tests are probably the most culturally corrosive. A test that fails 15% of the time isn't just annoying — it's a trust-destroyer. Developers learn to re-run pipelines on failure without investigating, which means real failures get the same treatment. The fix isn't complicated: track flaky tests explicitly, quarantine them from the main gate, and treat fixing them as actual engineering work rather than cleanup.
Bloated dependency installation is another slow burn. That npm install or pip install step that takes four minutes because nobody's pruned the dependency tree in two years. Or because the cache key is set up in a way that busts on every run. Caching strategies for dependencies are one of the highest-ROI pipeline optimizations available, and they're chronically underused.
Sequential steps that could run in parallel account for a surprising amount of wasted time. Unit tests, linting, security scans, and integration tests often run one after another in pipelines that were set up quickly and never revisited. Most modern CI platforms — GitHub Actions, CircleCI, GitLab CI — have solid support for parallelism. Using it can cut wall-clock time dramatically without changing a single line of application code.
Artifact bloat is the quieter offender. Build artifacts, Docker layers, and test result archives accumulate over time. Without a retention policy, storage fills, cleanup jobs run during pipelines, and upload/download times creep up. It's not glamorous work, but auditing what you're actually storing — and why — regularly pays off.
How to Actually Find the Drag
Here's a practical approach that doesn't require a dedicated platform engineering team.
Start by instrumenting what you have. Most CI platforms expose timing data per step. Pull that data for the last 30 days and look for the steps with the highest average duration and the highest variance. High variance is a signal of flakiness or resource contention — both worth fixing. High average with low variance means you've found a reliably slow step that's a candidate for optimization or parallelization.
Next, run a "pipeline archaeology" session with whoever set up your current config. The goal isn't blame — it's understanding. A lot of pipeline decisions made two years ago made sense then and are just never revisited. What was the original reason for that sequential ordering? Does it still apply? Is that Docker base image still the right one, or did someone just copy it from a blog post?
Then establish a baseline and treat it like a metric. Pipeline duration should live on a dashboard somewhere, right next to deploy frequency and error rates. If it's not visible, it won't be prioritized. Teams optimize what they measure, and right now most teams aren't measuring this at all.
The Cultural Side of This
It's worth naming something that purely technical fixes won't address: slow pipelines are partly a culture problem.
When engineers accept slowness as inevitable, they stop seeing it as something worth fighting. That learned helplessness is contagious. New engineers join, observe that nobody complains about the 20-minute build, and conclude that this is just how things are. The institutional knowledge that "it used to be faster" fades. Eventually you've got a team that's genuinely surprised when they visit another company and see a 3-minute pipeline.
Fighting this requires treating pipeline performance as a first-class engineering concern — not a DevOps problem, not an infra team problem, but something the whole team owns. That means celebrating wins when someone shaves five minutes off a build. It means including pipeline health in sprint retrospectives. It means making it socially acceptable to file a ticket that just says "our linting step is too slow and here's how I want to fix it."
Where to Start Tomorrow
You don't need a full audit to make progress. Pick one thing.
If you've got a test that fails intermittently, quarantine it today and schedule a fix for this sprint. If you haven't looked at your dependency caching config in the last six months, look at it tomorrow morning. If your pipeline steps are all sequential, spend an afternoon identifying which ones could safely run in parallel.
The goal isn't perfection. It's momentum. Every minute you shave off the pipeline is a minute returned to your engineers — and more importantly, it's a signal that this stuff matters, that slow isn't inevitable, and that the team is paying attention.
Build. Ship. Repeat. But only if the pipeline isn't making you dread all three.