How to ship fast without shipping a mess

March 24, 20265 min readBy Harman Kamboj
Full-stackEngineering

The fake debate in software is speed versus quality, as if you pick one. I have shipped on tight deadlines for years across very different kinds of work, and the teams that ship fast over a long stretch are usually the ones with the cleanest codebases, not the messiest. Shipping fast and keeping things clean are not enemies. The mess is what slows you down a month later. The trick is knowing which corners are safe to cut and which ones quietly compound into a system nobody wants to touch.

Speed comes from small changes, not heroics

The fastest way to ship is to ship small. A change that touches three files merges today. A change that touches forty files sits in review for a week, picks up merge conflicts, and gets reworked twice. Big batches feel efficient because you are doing a lot at once, but they are slow in every way that matters: slower to review, slower to test, slower to debug when something breaks, because the blast radius is enormous.

I break work into the smallest pieces that still make sense on their own. Ship the data model change. Ship the API. Ship the UI. Each one is reviewable in minutes and reversible in seconds. When something goes wrong, and it will, you are rolling back one small thing, not unwinding a giant tangled merge while users are affected.

Know which corners are safe to cut

Cutting corners is a real skill, not a sin. The mistake is cutting the wrong ones. Some shortcuts are cheap to fix later and some are nearly permanent, and good speed comes from telling them apart on purpose.

Corners I cut without guilt when the deadline is real:

  • Polished UI states for rare edge cases, as long as they fail safely instead of corrupting data
  • Premature abstraction, because the wrong abstraction is far more expensive than a little duplication you clean up once the pattern is clear
  • Optimizing code paths that are not hot yet, since you can measure and fix that later with good information

Corners I almost never cut, because they are brutal to undo: the data model, the API contract other teams depend on, and anything touching money or auth. Those are the foundations. Mistakes there do not stay small. They spread into everything built on top, and the cleanup is a migration, not a patch.

Tests are an accelerator, used selectively

People think tests slow you down. Writing tests for everything when the design is still moving does slow you down. But shipping fast with zero safety net is how you end up scared to change anything, and fear is the real velocity killer. A codebase nobody dares touch is the slowest codebase there is.

My compromise is to test the parts that are expensive to get wrong and stable enough to be worth pinning down. The payment flow gets tests. The core business logic gets tests. The button that might get redesigned next sprint does not. A focused test suite lets me refactor aggressively and ship on Friday without holding my breath, which is exactly the confidence you need to keep moving quickly.

Make the next change easy

There is a line I keep coming back to: the best thing you can do for future speed is leave the code a little easier to change than you found it. Not perfect. Easier. When I touch a file, I try to leave it slightly clearer than it was, a better name here, a function split out there. This is the opposite of a big cleanup project nobody approves. It is small, constant, and it compounds. A codebase maintained this way stays fast to work in for years.

The inverse compounds too. Every TODO you skip, every confusing name you leave, every copy-paste you do not consolidate is a tiny tax on every future change. Mess does not announce itself. It shows up as everything slowly taking longer until one day a one-line feature takes three days and nobody can say exactly why.

Reversibility beats perfection

The thing that actually lets me ship fast and sleep at night is not getting it right the first time. It is being able to undo it fast when I get it wrong. Feature flags, quick rollbacks, small deploys, good monitoring. When reverting a bad change takes thirty seconds, you can take real chances, and taking chances is where speed lives. When a rollback is a scary multi-hour ordeal, every deploy becomes slow and timid because the downside is so painful.

So I invest in the boring machinery that makes mistakes cheap, and then I move quickly on top of it. Ship small, cut the safe corners on purpose, test what hurts to break, and keep the undo button fast. Do that and the speed-versus-quality choice mostly stops being a choice. The clean parts are exactly what let you keep going fast.

Building something where this matters?

I am open to senior full-stack, Web3, or AI engineering roles, fully remote and any timezone. If the hard part of your product is fighting you, that is the work I like.

Get in touch →