← all articles

Small Releases Aren't Faster, They're Kinder

Small Releases Aren't Faster, They're Kinder

The strongest argument for shipping small and often has nothing to do with speed. It's that a problem found by one person, on an ordinary day, costs almost nothing to fix. The same problem found by an entire team, all at once, in a room, with a release everyone is waiting on, costs an afternoon, a fair amount of goodwill, and usually a few grey hairs. Batch size doesn't just change how fast you move. It decides whether the people doing the work discover trouble alone and early, or together and late.

I watched this play out recently in a session that had been billed, half-jokingly, as a "merge party." A month's worth of unmerged work had piled up, and the plan was to land it all in one sitting: rebase everything, resolve the conflicts, run it through the pipeline, cut a build, ship it. On paper that's a few hours of mechanical work. In practice it turned into something closer to triage. A regional deployment had quietly stopped talking to its destination weeks earlier and nobody had noticed, because nobody had looked since the last time it worked. A stale runtime dependency was being reinstalled on every build for reasons nobody in the room could explain, adding minutes to a process that should have taken seconds. A version bump rule had apparently been added at some point and then silently ignored, so nobody could say with confidence whether the last few releases had actually been tagged correctly. None of these were hard problems. Every one of them would have been a five-minute fix on the day it appeared. Discovered together, weeks later, tangled up with a dozen unrelated merge conflicts, they turned a routine release into a long and slightly demoralising afternoon.

That's the part worth sitting with. The total amount of work didn't change. Every one of those problems still had to be found and fixed either way. What changed was who paid for them, and when, and how it felt to pay. Integrate constantly and each issue arrives alone: attributable to one recent change, fresh in someone's memory, cheap to diagnose because there's only one thing that could have caused it. Batch the integration and the same issues arrive as a crowd, overlapping, competing for attention, none of them clearly anyone's responsibility because by the time you notice, half the team has touched the affected code. Diagnosis stops being "what did I just change" and becomes "which of these eleven things broke this," which is a fundamentally more expensive question to answer, and a much less pleasant one to be asked under time pressure.

There's a quieter cost underneath the obvious one, and it's about ownership rather than mechanics. When integration happens daily, build health is everyone's problem every day, because everyone is looking at it every day. When integration happens monthly, build health becomes nobody's problem between releases, because there's no natural moment that forces anyone to look. A pipeline can drift for weeks — accumulate warnings, install things it doesn't need, quietly fail to reach a destination it used to reach — and the drift is invisible precisely because nothing is checking. The monthly cadence doesn't just delay the discovery of problems. It removes the incentive to notice them at all until the calendar forces the question. Someone in that session said the quiet part out loud, somewhere between cancelling a duplicate pipeline run and waiting on a build that had a minute left on the clock: we should be pushing out a build a day. Everyone agreed immediately. Nobody had made it happen, because it's the kind of decision that's obvious in the middle of the mess and easy to deprioritise the moment the mess is cleared.

I've seen the same pattern often enough across different teams and different stacks that I've stopped attributing it to any particular tool or process. Teams that ship daily tend to complain less about their infrastructure than teams that ship monthly, even when the monthly team's infrastructure is, on paper, more mature. The infrastructure usually isn't the variable that matters most. The batch size is. A small release forces a small, well-understood diff through the pipeline, and if something breaks, there's exactly one recent suspect. A large release forces a month of accumulated change through the same pipeline in one pass, and if something breaks, there are dozens of suspects and no fast way to narrow them down. Same pipeline, wildly different experience, purely because of how much was allowed to pile up before anyone looked.

There's a commercial version of this argument too, and it matters because "ship more often" can sound like a nice-to-have you get to once the harder priorities are handled. It isn't. A team spending an afternoon untangling a month of accumulated integration debt is not doing anything a customer would recognise as progress. It's expensive time being spent to get back to where the team already believed it was. Worse, that cost tends to land at the worst possible moment — right before a release, when people are already under pressure to ship and least able to absorb a surprise. Paying down small amounts of integration debt daily is boring and cheap. Paying it down monthly, in one lump sum, with interest, in front of people who are waiting, is neither.

None of this is an argument for recklessness. Shipping something broken more often isn't better than shipping something solid less often — the point of frequent integration is that it catches the broken thing while it's still small and isolated, not that brokenness stops mattering. And there are real reasons a team occasionally has to batch: a genuine freeze, a hard external dependency, a deliberate decision to stabilise before a big customer-facing moment. Those are choices made on purpose, for a reason someone could explain if asked. The version worth watching for is the one that isn't a choice at all — the slow drift where "we'll batch it up and deal with it at the end" becomes the default simply because nobody ever decided otherwise, and the cost of that drift is invisible until the day it all arrives at once.

The honest test of a delivery process isn't how it behaves when everything goes to plan. It's how it behaves on the day something doesn't, and who's left holding the problem when it surfaces. A team that finds its bugs one at a time, quietly, as they're introduced, is a team that mostly experiences its own mistakes as minor inconveniences. A team that finds them all together, once a month, under a deadline, experiences the exact same mistakes as a crisis. The mistakes were never the expensive part. The waiting was.

Matthew Ratcliffe, software developer and architect, Ballarat
Senior Software Engineer & Architect

20+ years across the technology stack — from greenfield builds to brownfield rescues. Based in Ballarat, VIC, focused on AI, healthcare and high-risk data systems. Full resume →

Share your thoughts