Shipped Beats Pretty, Every Time
Duplessis van Aswegen

Duplessis van Aswegen @duplessisvanaswegen

About: Software engineer | Web dev enthusiast | Side project tinkerer | Music & gaming fan | Always learning & building. Let’s connect!

Joined:
Apr 13, 2024

Shipped Beats Pretty, Every Time

Publish Date: Apr 16
15 9

Many engineers spend days crafting the ideal solution, tweaking every line to be just right. But in the end, they’re left wondering when their code will actually see the light of day.

They open their editor, sip their third coffee of the morning, and then it happens - the spiral. Suddenly they’re refactoring a utility class that hasn’t been touched since the Cretaceous period, reworking some “legacy” logic that’s somehow survived four rebrands and a CTO change, and creating a new architecture pattern that they absolutely must document in a 14-page Notion doc.

Three days later, no code has shipped. But there is a very tidy folder structure and some truly pristine interfaces.

Ladies and gentlemen, this is what we call the perfection trap.

Shipping Is the Job

Software isn’t built to sit in a pristine repo and be admired - it’s meant to solve problems, deliver value, and, crucially, get used. If your obsession with purity means nothing ever gets deployed, you’re not writing great code - you’re just wasting time and money.

There’s a reason “Done > Perfect” is plastered all over engineering walls and startup blogs. It’s not because we hate clean code. It’s because perfect is a moving target, and chasing it is a surefire way to stay stuck in build mode forever. Every day you spend refining an already-good solution is a day you’re not delivering value to your users or your business. And while you’re off in the weeds crafting the perfect pub-sub architecture for a feature that three people might use, the rest of the team is waiting on you to just ship the damn thing.

Done means feedback. Done means progress. Done means you’re actually working on a real product instead of engineering fantasy football.

That said, this isn’t a binary choice between “ship fast” and “build right.” Great teams - and great engineers - learn to balance pragmatism with principles. Speed and craftsmanship aren’t mutually exclusive, but they do trade off over time. The real skill lies in knowing when “clean enough” will unblock a team or deliver value quickly, and when investing in quality will actually accelerate you in the long run. Neither extreme is sustainable on its own.

Good Enough Is Usually More Than Enough

Here’s the uncomfortable truth: users don’t care how clever your code is. They care if the button works. They care if the app loads in under five seconds. They care if their data doesn’t vanish into the abyss when they refresh the page. If you’ve ticked those boxes, they’re happy. You don’t get bonus points for wrapping everything in generics and factories unless it actually improves the product. Which, let’s be honest, it usually doesn’t.

And here’s where the cost-benefit equation comes in: every hour you spend chasing perfection is an hour you’re not spending solving real problems or delivering value. It’s a direct cost to the business and to the end users who need solutions now. The sooner you ship, the sooner you get feedback, the sooner you can iterate and improve.

Learn to Let Go

None of this is a defense of shipping junk. “Quick and dirty” becomes just plain dirty when there's no cleanup plan. The goal isn’t to lower the bar—it’s to focus your effort where it matters most right now. If you're building a foundational piece of the system, yeah, spend the extra time. But if it's a feature with uncertain value or limited impact, optimize for learning. Clean code isn’t the enemy - overengineering is. The sweet spot is shipping well-considered, maintainable code that solves real problems without getting lost in abstract ideals.

And if that offends your inner perfectionist - good. That’s the part of you that’s been slowing everything down.

Comments 9 total

  • david duymelinck
    david duymelinckApr 17, 2025

    creating a new architecture pattern that they absolutely must document in a 14-page Notion doc.

    Developers that write extensive documentation are a rare breed :-)

    • Duplessis van Aswegen
      Duplessis van AswegenApr 17, 2025

      Indeed they are, but I've seen engineers focus on this at the wrong times or in the wrong ways or for the wrong reasons too often.

      Any amount documentation is more useful than none at times, sure, as long as it's accurate and up-to-date, but nodoby will care about your fancy docs if the product doesn't even work properly work, or doesn't solve the problems they have, or if the feature doesn't ship on time or sometimes even at all.

      It's about prioritization.

      Finish the docs after it's shipped, whatever you can make work within your situation, but don't delay the value a feature can add unnecessarily.

      • david duymelinck
        david duymelinckApr 17, 2025

        I don't like documentation to be an afterthought. I burned myself too many times moving on to the next feature without it.

        When doing estimations I always consider three things; the feature code, the test code and documentation. Test code is the documentation for technical people, and documentation is for non technical people.

        When it is a bigger feature it can be necessary to write technical documentation to make it easier to understand how the parts of the feature are related.

        I wouldn't say it has to do with priorities, more with finding the right balance. I agree that good enough is most of the times better than perfect.

        • Duplessis van Aswegen
          Duplessis van AswegenApr 17, 2025

          I agree - I suppose it varies a lot depending on the situation. When doing a single project for a client that has a due date and a handover, of course documentation is most likely part of what they're paying for and couldn't be done after the fact. My post is more directed at engineers working in a product team that operates in a typical agile environment where it could be as simple as just splitting the documentation portion out into a separate ticket that rather goes into the next sprint or is only picked up after the feature itself is deployed. for smaller features the documentation writing abyss is also probably a non-issue. There are many other reasons why things aren't shipped in time though, and not all of them apply always.

  • Ben Halpern
    Ben HalpernApr 18, 2025

    Mhmm

  • Emil
    Emil Apr 23, 2025

    The best developers have a good sense of urgency

    • Duplessis van Aswegen
      Duplessis van AswegenApr 23, 2025

      Most definitely - as long as that urgency doesn't trump stability. Shipping unstable or untested code (except in extreme circumstances) just to get things out the door is probably also not a great idea.. there's a careful balance between "barely usable", "good enough" and "not yet perfect".

Add comment