
Shipping Fast Without Breaking Things
The False Dichotomy
Software Twitter loves this debate: should you ship fast and break things, or move slow and maintain quality?
It's a false choice. We've shipped hundreds of features and products. The best teams do both. They ship constantly and rarely break things. The secret is what you're optimizing for.
Most teams optimize for "features shipped per sprint." That's wrong. It incentivizes big, risky changes. A team that ships one massive PR every two weeks looks productive on paper. They're actually moving slowly and breaking things.
The right metric: "integrations per day." Small changes that flow into production continuously. Each one low-risk, each one easily reversible.
Our Principles
Here are the principles that let us ship multiple times per day while keeping production stable:
1. Small Changes, Always
No PR over 200 lines. If a change is bigger, it hasn't been broken down enough.
Small changes are easier to review. Easier to test. Easier to rollback if something goes wrong. They reduce risk exponentially.
This requires discipline. It feels slower in the moment. But it accelerates you over time.
2. Feature Flags, Not Branches
Long-lived feature branches are where code goes to die. Merge conflicts accumulate. Context gets lost. The eventual merge is terrifying.
We ship incomplete features behind flags. The code is in production, but inactive. We can test it in the real environment, iterate, then enable it when ready.
This means shipping code that "doesn't do anything" yet. That's fine. It's still progress.
3. Test the Right Things
We don't have 100% test coverage. We don't want it. Tests have costs: maintenance time, CI minutes, mental overhead.
We test:
We don't test:
Test strategically, not exhaustively.
4. Production Is the Best Test Environment
Staging environments lie. They have different data, different load, different configurations. A bug that doesn't appear in staging will bite you in production.
We ship to production early and often. With feature flags, we can test with real data but limited exposure. Canary releases to 1% of users catch issues that QA never would.
This requires good observability. You need to know immediately when something is wrong. But it's better to find problems fast than to hide them in staging.
5. Rollbacks Are Features
If you can't rollback in under 5 minutes, you're not ready to ship.
Every deployment should be reversible. Database migrations need backward compatibility. Feature flags need kill switches. Infrastructure changes need previous versions kept warm.
We practice rollbacks. Seriously. Every quarter, we randomly rollback a production change just to make sure we can. It's worth the 10 minutes of disruption to know the system works.
The Mindset Shift
The biggest change isn't technical—it's cultural.
Traditional software development treats production as fragile. Something to be protected. Changes are dangerous.
We treat production as resilient. It's designed to handle change. Small, reversible, observable changes are safe. Big, batched, mysterious changes are dangerous.
This requires trust. Trust that your systems can handle mistakes. Trust that your team can recover quickly. Trust that shipping is good.
What It Feels Like
When this is working, here's what it feels like:
That's the goal. Not velocity metrics. Not perfect uptime. Just the ability to move quickly and confidently.
Start Small
You don't need to rebuild everything. Pick one principle. Implement it for a week. See how it feels.
Maybe start with smaller PRs. Or add one feature flag. Or set up canary deployments for your API.
Each improvement compounds. Six months later, you'll wonder how you ever worked the old way.
The best part? Your users notice. A product that improves weekly feels alive. A product that updates quarterly feels abandoned.
Ship fast. Don't break things. It's possible. We're proof.