Photo by prashant hiremath on Unsplash
Feature Flags Ate the Deployment Pipeline
Ask a platform engineer what tool they’d least like to lose and there’s a decent chance the answer isn’t their CI system or their orchestrator. It’s their feature flagging service. What started as a simple way to hide unfinished code behind an if-statement has grown into a control plane for how software actually reaches users, and that shift says a lot about where deployment practices are heading.
From Toggle to Control Plane
The original use case was modest: wrap a half-built feature in a conditional so it could merge to main without going live. That solved a real problem, letting teams keep a single trunk branch instead of maintaining long-lived feature branches that rot while they wait for QA. But once a flag exists, it turns out to be useful for a lot more than hiding work in progress.
Flags let you separate two things that used to be bolted together: deploying code and releasing a feature. Deployment becomes a low-stakes, frequent event, since new code paths sit dormant until a flag flips them on. Release becomes a business decision, made by whoever owns the feature, independent of whatever the deploy schedule looks like. That decoupling is the actual insight behind “continuous deployment” as it’s practiced at most serious engineering orgs. Shipping code constantly only works if shipping code and exposing a feature are different events.
Progressive Delivery
Once flags control exposure, the obvious next move is to make that exposure gradual instead of binary. Roll a change out to 1% of traffic, watch error rates and latency, then widen to 10%, then 50%, then everyone. If something looks wrong, flip it back off instantly, no rollback deploy required. This pattern, often called progressive delivery or canary release, turns a risky all-or-nothing launch into a series of small, reversible bets.
The targeting logic is where flagging systems earn their complexity. Rollouts aren’t just percentage-based; they key off user attributes, account tiers, geographic region, or device type. A feature might go to internal employees first, then beta customers, then everyone on the new pricing plan, with each cohort defined by rules rather than by separate deploys. That’s a meaningfully different mental model from the old “staging then production” pipeline, where the only lever was time.
The Experimentation Overlap
Feature flags and A/B testing share a mechanism even though they start from different goals. A flag decides whether a user sees variant A or variant B; an experimentation platform decides what to conclude from the fact that they did. Because the targeting and bucketing logic is nearly identical, a lot of teams end up consolidating both onto the same infrastructure, layering statistical analysis on top of what began as a deployment safety net. That convergence is part of why flagging vendors now market themselves as experimentation platforms as much as release tools.
The Cost Nobody Advertises
None of this is free. Every flag is a branch point that has to be reasoned about, tested, and eventually removed. Codebases that flag aggressively without cleaning up accumulate a kind of shadow complexity: conditionals nobody’s sure are still load-bearing, combinations of flags that were never tested together, and a config service that quietly becomes as critical as the database. Stale flags are the tech-debt equivalent of dead code that’s too scary to delete because someone might be depending on it.
The practical response is treating flags as inventory with a lifecycle: every flag gets an owner and an expected removal date, and dashboards surface flags that have been at 100% or 0% for months. Teams that skip this step tend to learn the lesson the expensive way, debugging an incident that turns out to be three interacting flags nobody remembered existed.
Why It’s Sticking Around
The reason feature flags have staked out a permanent spot in the infrastructure stack, rather than fading as a niche technique, is that they answer a question every growing engineering org eventually asks: how do you ship fast without every release being a high-stakes event? Decoupling deploy from release, and making rollout gradual and reversible, is a general-purpose answer to that question, not a fad tied to one framework or language. That’s usually the sign a piece of infrastructure is here to stay.