On the quiet craft of shipping
2026-04-12 · #craft #writing #systems
There is a kind of software that doesn’t shout. It boots quickly, does what it says, and gets out of the way. It has small, comprehensible parts and clear seams between them. You can read it in an afternoon and remember the shape of it for years.
We don’t make enough of it.
The pull toward bigness
Every piece of working software has gravity. Once it exists, it pulls features into orbit. A field becomes a form. A form becomes a flow. A flow becomes a wizard, then a dashboard, then a platform. Each step feels obvious in the moment and indefensible in retrospect.
The way out isn’t restraint exactly - restraint sounds like virtue, and virtue is an unreliable load-bearing material. The way out is a different default. Make the small thing first. Ship it. Live with it. Let actual use, not imagined use, decide what comes next.
Three rules I keep coming back to
- The interface is the product. If someone has to read a manual to use it, you wrote the wrong thing.
- Boring code, interesting product. Save your cleverness for the parts the user can see. The rest should be aggressively unsurprising.
- Finish. A 60% feature in production beats a 99% feature in a branch.
// A small thing, finished, beats a large thing in motion.
fn ship(thing: Thing) -> Result<Live, Stalled> {
if thing.is_done_enough() {
Ok(thing.deploy())
} else {
Err(Stalled::WaitingForPerfect)
}
}
On calm
The opposite of busy is not idle - it’s calm. A calm interface holds your attention without demanding it. It tells you what you need when you need it, and doesn’t blink at you the rest of the time.
Make tools that respect their users’ attention. Treat every notification, every modal, every animation as a small theft you have to justify.
I don’t always get this right. Nobody does. But it’s the standard worth aiming at, the one that separates software you tolerate from software you’d actually miss.
Small things. Shipped. Intentionally.