All insights

Article17 Nov 20247 min read

Shipping fast without breaking trust

Speed and reliability are usually framed as a trade-off. The data says otherwise, and so does every fast team I've been part of. The engineering habits that let a small team move quickly and still sleep at night.

Kayley SmithEngineering Team Lead
Written by
Kayley SmithEngineering Team Lead

Kayley leads teams shipping resilient, production-grade software - with a bias for shipping and little patience for flaky systems.

At some point in every planning conversation, somebody reaches for the dial metaphor - as if there's a knob on the wall marked 'fast' at one end and 'careful' at the other, and management's job is to argue about where to set it. It's a comfortable picture, and it's wrong, not just in my experience but in the largest dataset we have on the question. DORA's research programme has spent a decade surveying tens of thousands of engineers, and it keeps finding the same thing: the teams deploying most frequently also have the lowest change failure rates and the fastest recovery times. Deploy frequency and stability move together rather than against each other, which matches what I've watched on every fast team I've run - and that's not a talent anomaly, it's a set of habits, and habits can be listed.

The dial picture fails because it assumes speed is achieved by skipping safety work, when in practice almost all lost speed goes somewhere else entirely: into waiting, into fear, and into cleaning up. Waiting for the big release to assemble, fear of touching the module nobody understands, weeks lost to the incident that a test would have caught in seconds. Remove those and a team gets faster and safer in the same motion, which is why the habits below don't split into 'speed habits' and 'safety habits'. Each one buys both.

Ship small, ship constantly

The foundational habit is batch size. A release containing three days of work from one person is a small, legible thing - easy to review, easy to test, and above all easy to diagnose when something goes wrong, because the suspect list has one name on it. A release containing six weeks of work from five people is a crime scene, and the difference between the two is the difference between a five-minute rollback and a war room with pizza.

Small batches also change the emotional economics of shipping, which matters more than teams admit. When releases are rare they become events, events attract ceremony, ceremony attracts sign-off meetings, and soon the release itself is the scariest thing the team does - so they do it less, which makes each one bigger and scarier still. It's a doom loop, and the exit is unglamorous: ship something small this week, then again next week, until deploying is about as dramatic as sending an email. Boring deploys are the entire goal.

A big release is a crime scene. A small one has a suspect list of one.

Separate shipping from launching

The second habit is realising that deploying code and releasing a feature don't have to be the same event. Feature flags split them apart: the code ships dark, sits in production behind a switch, and the launch becomes a business decision rather than an engineering one - flipped on for staff first, then five percent of users, then everyone, with the metrics watched at every step and an off switch that works in seconds rather than a redeploy under pressure.

Staged rollouts convert what used to be a cliff edge into a ramp. The bug that would have greeted every user at 9am on launch day instead meets two percent of them on a quiet Tuesday, gets caught by the dashboards, and becomes a ticket instead of an apology - and the confidence that builds compounds, because a team that knows it can retreat safely will advance far more boldly.

Make production tell you first

Trust dies fastest when customers become your monitoring system, and any team whose incidents begin with a support ticket is running blind. The third habit is observability as part of the feature, not the platform backlog: every slice ships with its logs, its metrics and its alert thresholds, written by the person who built it, because they're the one who knows what 'wrong' looks like for this particular thing.

The standard we hold is simple to say and demanding to keep - production should tell us before users do. Getting there is mostly a matter of respecting the alert channel (every alert is actionable, or it gets deleted, because a noisy channel is a muted channel) and rehearsing the response: knowing who looks where when the graph bends, so the first five minutes of an incident are procedure rather than improvisation.

Types, tests and the boring stack

Underneath all of it sits the floor: strong types, tests around the behaviour that matters, and review on every change. None of this is exciting, which is rather the point - the floor is what lets everything above it move quickly, because a strongly typed codebase turns a whole category of production incidents into compile errors, and a good test suite is a permission slip to refactor without fear. Fear is the real speed killer on ageing codebases; engineers slow down not because the work is hard but because they can't tell what will break, and types plus tests are how a codebase stays legible to people who didn't write it.

The same logic drives our bias toward boring technology. The novel framework spends your innovation budget on plumbing, and its failure modes are undocumented precisely when you need answers at 2am - whereas the boring choice has a decade of answered questions behind it, and saves the excitement for the product, where it belongs. We pick new tools when they solve a real problem we actually have, and we let someone else be the pioneer the rest of the time.

When it breaks anyway

Everything above reduces incidents; nothing eliminates them, and the last habit is about what happens next. The post-mortem is blameless - not to be nice, but because blame is operationally useless: the moment individuals are in the dock, information stops flowing, and the same failure returns wearing a different jersey. The interesting question is never who, it's what made the mistake easy, and the answer is usually a missing guard rail that a day of work can install permanently.

Handled that way, incidents become the cheapest training a team ever gets, and something subtler happens to the relationship with the client: reliability starts being something you can demonstrate rather than promise. Trust, it turns out, isn't built by never breaking - everyone breaks - it's built by catching it first, fixing it fast, and visibly becoming harder to break each time.

So no, we don't accept the dial. Speed and reliability are the same discipline viewed from two sides - small batches, flags, observability, a typed and tested floor, boring tools and honest post-mortems - and a team that practises them gets to keep both. The teams still arguing about where to set the knob are usually getting neither.