{
    "archive_path": "archive/1765850455.799908",
    "base_url": "kerrick.blog/articles/2025/ship-software-that-does-nothing",
    "basename": "",
    "bookmarked_date": "2025-12-16 02:00",
    "canonical": {
        "archive_org_path": "https://web.archive.org/web/kerrick.blog/articles/2025/ship-software-that-does-nothing",
        "dom_path": "output.html",
        "favicon_path": "favicon.ico",
        "git_path": "git/",
        "google_favicon_path": "https://www.google.com/s2/favicons?domain=kerrick.blog",
        "headers_path": "headers.json",
        "htmltotext_path": "htmltotext.txt",
        "index_path": "index.html",
        "media_path": "media/",
        "mercury_path": "mercury/content.html",
        "pdf_path": "output.pdf",
        "readability_path": "readability/content.html",
        "screenshot_path": "screenshot.png",
        "singlefile_path": "singlefile.html",
        "warc_path": "warc/",
        "wget_path": null
    },
    "domain": "kerrick.blog",
    "downloaded_at": "2025-12-16T02:00:59.238436+00:00",
    "downloaded_datestr": "2025-12-16 02:00",
    "extension": "",
    "hash": "12WQVCJX15TS8DEC4RVP",
    "history": {
        "archive_org": [
            {
                "cmd": [
                    "/usr/bin/curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--proxy",
                    "socks5://tor-socks-proxy:9150",
                    "--head",
                    "--max-time",
                    "60",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "https://web.archive.org/save/https://kerrick.blog/articles/2025/ship-software-that-does-nothing/"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-16T02:03:13.787534+00:00",
                "index_texts": null,
                "output": "TimeoutExpired: Command '['/usr/bin/curl', '--silent', '--location', '--compressed', '--proxy', 'socks5://tor-socks-proxy:9150', '--head', '--max-time', '60', '--user-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)', 'https://web.archive.org/save/https://kerrick.blog/articles/2025/ship-software-that-does-nothing/']' timed out after 60 seconds",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:02:13.715243+00:00",
                "status": "failed"
            }
        ],
        "dom": [
            {
                "cmd": [
                    "/usr/bin/chromium-browser",
                    "--proxy-server=socks5://tor-socks-proxy:9150",
                    "--disable-features=DarkMode",
                    "--run-all-compositor-stages-before-draw",
                    "--hide-scrollbars",
                    "--autoplay-policy=no-user-gesture-required",
                    "--no-first-run",
                    "--use-fake-ui-for-media-stream",
                    "--use-fake-device-for-media-stream",
                    "--simulate-outdated-no-au='Tue, 31 Dec 2099 23:59:59 GMT'",
                    "--headless=new",
                    "--no-sandbox",
                    "--no-zygote",
                    "--disable-dev-shm-usage",
                    "--disable-software-rasterizer",
                    "--disable-sync",
                    "--window-size=1440,2000",
                    "--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "--user-data-dir=/data/personas/Default/chrome_profile",
                    "--profile-directory=Default",
                    "--dump-dom",
                    "https://kerrick.blog/articles/2025/ship-software-that-does-nothing/"
                ],
                "cmd_version": "131.0.6778",
                "end_ts": "2025-12-16T02:01:32.063741+00:00",
                "index_texts": null,
                "output": "output.html",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:01:12.315687+00:00",
                "status": "succeeded"
            }
        ],
        "favicon": [
            {
                "cmd": [
                    "/usr/bin/curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--proxy",
                    "socks5://tor-socks-proxy:9150",
                    "--max-time",
                    "60",
                    "--output",
                    "favicon.ico",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "https://www.google.com/s2/favicons?domain=kerrick.blog"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-16T02:01:03.631933+00:00",
                "index_texts": null,
                "output": "favicon.ico",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:01:00.384032+00:00",
                "status": "succeeded"
            }
        ],
        "git": [],
        "headers": [
            {
                "cmd": [
                    "/usr/bin/curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--proxy",
                    "socks5://tor-socks-proxy:9150",
                    "--head",
                    "--max-time",
                    "60",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "https://kerrick.blog/articles/2025/ship-software-that-does-nothing/"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-16T02:01:04.335870+00:00",
                "index_texts": null,
                "output": "headers.json",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:01:03.783329+00:00",
                "status": "succeeded"
            }
        ],
        "htmltotext": [
            {
                "cmd": [
                    "(internal) archivebox.extractors.htmltotext",
                    "./{singlefile,dom}.html"
                ],
                "cmd_version": "0.8.5rc51",
                "end_ts": "2025-12-16T02:01:57.625930+00:00",
                "index_texts": [
                    "Ship Software That Does Nothing - Kerrick Long (blog) (https://kerrick.blog/articles/2025/ship-software-that-does-nothing/) (//fonts.googleapis.com) (Kerrick Long (blog) \u00bb Feed) (https://kerrick.blog/feed/) (Kerrick Long (blog) \u00bb Comments Feed) (https://kerrick.blog/comments/feed/) (Kerrick Long (blog) \u00bb Ship Software That Does Nothing Comments Feed) (https://kerrick.blog/articles/2025/ship-software-that-does-nothing/feed/) (oEmbed (JSON)) (https://kerrick.blog/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fkerrick.blog%2Farticles%2F2025%2Fship-software-that-does-nothing%2F) (oEmbed (XML)) (https://kerrick.blog/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fkerrick.blog%2Farticles%2F2025%2Fship-software-that-does-nothing%2F&format=xml) (https://kerrick.blog/wp-includes/css/dist/block-library/style.min.css?ver=6.9) (https://kerrick.blog/wp-content/plugins/webmention/assets/css/webmention.css?ver=5.5.0) (//fonts.googleapis.com/css?family=Lato%3A400%2C400i%2C700%2C900&subset=latin%2Clatin-ext&display=swap&ver=6.9) (https://kerrick.blog/wp-content/themes/shift/assets/font-awesome/css/all.min.css?ver=6.9) (https://kerrick.blog/wp-content/themes/shift/style.css?ver=6.9) (https://kerrick.blog/wp-json/) (JSON) (https://kerrick.blog/wp-json/wp/v2/posts/291) (RSD) (https://kerrick.blog/xmlrpc.php?rsd) (https://kerrick.blog/?p=291) (Search Kerrick Long (blog)) (https://kerrick.blog/wp-json/opensearch/1.1/document) (ActivityPub (JSON)) (https://kerrick.blog/?p=291) (https://kerrick.blog/wp-content/uploads/2025/11/cropped-avatar-32x32.jpeg) (https://kerrick.blog/wp-content/uploads/2025/11/cropped-avatar-192x192.jpeg) (https://kerrick.blog/wp-content/uploads/2025/11/cropped-avatar-180x180.jpeg) (https://kerrick.blog/wp-json/webmention/1.0/endpoint) (https://kerrick.blog/wp-json/webmention/1.0/endpoint)  Press \"Enter\" to skip to content (https://kerrick.blog) Kerrick Long (blog)  Articles about programming, learning, code, books, and teams  open menu          (https://kerrick.blog) Home  (https://kerrick.blog/subscribe/) Get Notified  (https://kerrick.blog/category/articles/) Articles  (https://kerrick.blog/category/posts/) Quick Posts  (https://kerrick.blog/privacy-policy/) Privacy Policy     (https://ruby.social/@kerrick) (twitter)  twitter   (https://www.facebook.com/kerrick.long/) (facebook)  facebook   (https://bsky.app/profile/kerrick.blog) (bluesky)  bluesky   (https://www.linkedin.com/in/kerricklong/) (linkedin)  linkedin   (https://www.youtube.com/@KerrickLong) (youtube)  youtube   (https://kerrick.blog/feed/) (rss)  rss   (mailto:hello@kerrick.blog) (email)  email   (https://github.com/Kerrick) (github)  github   (https://www.goodreads.com/user/show/71980231-kerrick) (goodreads)  goodreads   (https://news.ycombinator.com/user?id=Kerrick) (hacker-news)  hacker-news   (https://stackoverflow.com/users/126329/kerrick) (stack-overflow)  stack-overflow        Ship Software That Does Nothing (Kerrick Long) (https://kerrick.blog/author/kerrick_b36zd7/) Kerrick Long   (https://kerrick.blog/2025/04/) April 13, 2025   (https://kerrick.blog/articles/2025/ship-software-that-does-nothing/#comments) 6 Comments     (A photo of a blank white sheet of paper laying on a wrinkled brown paper surface.)  Last updated on November 28, 2025  You should ship software that does nothing. Absolutely nothing. I\u2019m not being cheeky about this. I have no hidden meaning. The very first thing you should deliver when you start a new web application is absolutely nothing. Many people will tell you to ship a minimum viable product. Others say to ship a prototype to get feedback. Not me. I think you should ship a blank page to your production servers on day one.  Consider the alternative. You could spend a day debating your architecture: (https://www.jimmybogard.com/vertical-slice-architecture/) (Vertical Slice Architecture) slices , (https://llorllale.github.io/posts/clean-architecture/) (Clean Architecture: A Craftsman's Guide to Software Structure and Design) layers , (https://web.archive.org/web/20140329201018/http://alistair.cockburn.us/Hexagonal+architecture) (Hexagonal architecture) shapes , (https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/) (The Onion Architecture : part 1) vegetables , or (https://en.wikipedia.org/wiki/Model\u2013view\u2013controller) (Model\u2013view\u2013controller) smalltalk . You could spend several days (https://www.goodreads.com/book/show/762542.The_Four_Steps_to_the_Epiphany) (The Four Steps to the Epiphany: Successful Strategies for Products that Win) eliminating the biggest risks by (https://www.goodreads.com/book/show/67833.Extreme_Programming_Explained) (Extreme Programming Explained: Embrace Change) building proofs-of-concept to eliminate unknowns . You could spend a week figuring out how you\u2019ll (https://www.postgresql.org) (PostgreSQL: The World's Most Advanced Open Source Relational Database) store , (https://lucene.apache.org) (Apache Lucene is the search core of both Apache Solr\u2122 and Elasticsearch\u2122.) search , and (https://valkey.io) (Valkey: an open source, in-memory data store) cache data and which (https://postmarkapp.com) (Postmark: The email delivery service that people actually like) third \u2013(https://stripe.com) (Stripe: Financial infrastructure to grow your revenue) party (https://www.twilio.com/en-us/messaging/apis/programmable-messaging-api) (Twilio: a multichannel API to send and receive transactional SMS, MMS, RCS, and WhatsApp messages.) integrations you\u2019ll need. You could spend a couple weeks creating mockups and (https://www.goodreads.com/book/show/10127019-the-lean-startup) (The Lean Startup) getting feedback from potential users . You could spend a month building an end-to-end product that (https://userpilot.medium.com/how-a-land-and-expand-strategy-can-help-you-drive-growth-14c06d5bb937) (How a Land and Expand Strategy Can Help You Drive Growth) focuses on the highest-ROI feature for a niche target market . No matter what, you still have to ship. And no matter what, you could\u2019ve shipped nothing first. You can (https://www.jamesshore.com/v2/books/aoad2/incremental_design) (AoAD2 Practice: Incremental Design) evolve your nothingness, feature by feature, into your preferred architecture . You can build your riskiest features in the blank space you created by shipping nothing. You can add tools and providers one by one as your features demand. You can ship your mockups to production to drive your user interviews. All of this is made easier and lower risk by shipping nothing first. Shipping nothing is (https://idioms.thefreedictionary.com/nothing+to+sneeze+at) () nothing to sneeze at . Delivering a blank page to production means you\u2019ve made a lot of important decisions. You must take risky actions early, which is the best time to take risks. And once you\u2019ve shipped software that does nothing, making it do something is easy. You can\u2019t ship a webpage that does nothing until you have a place to ship to. You\u2019ll have to decide whether you\u2019re deploying to cloud VMs, rented bare metal, a rack in the datacenter down the street, or a serverless function. You\u2019ll pick your programming language. You might pick a framework, a web server, and a containerization strategy. Shipping nothing pushes you to set up (https://www.informit.com/store/continuous-delivery-reliable-software-releases-through-9780321601919) (Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation by Jez Humble and David Farley) deployment automation immediately. You solve your administrative burdens\u2014domain name, certificates, billing\u2014when it\u2019s easy. When there\u2019s no pressure. Your stakeholders aren\u2019t pressuring you to ship because it\u2019s been no time at all. Your users aren\u2019t clamoring for access because they haven\u2019t seen anything yet. Ship software that does nothing, and ship it to nobody. If you ship nothing to nobody, it\u2019s guaranteed to work. You won\u2019t hear the phrase \u201c(https://blog.codinghorror.com/the-works-on-my-machine-certification-program/) (The \u201cWorks on My Machine\u201d Certification Program) but it worked on my machine. \u201d Once you\u2019ve delivered nothing, every bit of something goes right to production. You\u2019ll notice anything that doesn\u2019t work before it becomes expensive to fix. You\u2019ll notice because you\u2019ll automate the shipping. Creating a repeatable build process for nothing is easy. It has no dependencies. Nobody has ever configured a production server by hand. There\u2019s nothing to audit, and nothing has been done that makes automation tricky. Automate your deployment to production before you can produce anything more than a blank page. A blank page is also easy to test. (https://http.dev/200) (HTTP response status code 200 OK is returned by the server to indicate success.) 200? OK. For the same reason automating delivery was easy, automate integration as well. Creating your health check infrastructure is much easier when you only have to check one thing. The same goes for setting up (https://www.informit.com/store/continuous-integration-improving-software-quality-and-9780132651165) (Continuous Integration: Improving Software Quality and Reducing Risk by Paul M. Duvall, Steve Matyas, and Andrew Glover) continuous integration . And since you\u2019ve set up continuous integration, that means you\u2019ve set up version control. There\u2019s no need to decide between (https://trunkbaseddevelopment.com) (Trunk Based Development: resist pressure to create long-lived development branches) trunk-based development , (https://nvie.com/posts/a-successful-git-branching-model/) (A successful Git branching model) git flow , or (https://martinfowler.com/articles/branching-patterns.html#feature-branching) (Feature Branching - Patterns for Managing Source Code Branches) feature branches yet. Nothing is in progress. There is only main . So, set up a continuous integration pipeline to test main on every commit. Set up a (https://learning.oreilly.com/library/view/continuous-deployment/9781098146719/) (Continuous Deployment: Enable Faster Feedback, Safer Releases, and More Reliable Software by Valentina Servile) continuous deployment pipeline to deliver main to production every time the tests pass. Configure alerts so that everybody knows when something fails. Notice how much is involved in shipping software that does nothing. This work will come around eventually. The later you do it, the riskier it is. When your system has few dependencies, there is little chance you forgot one. When your application has no functionality, you can\u2019t have features that aren\u2019t covered by tests. When you establish an automatic delivery pipeline before you have users, everybody is accustomed to frequent, tiny changes. But if you wait, these all get harder. Building software that does something and then figuring out how to ship is risky. Shipping software that does nothing slices that risk into tiny pieces. You address one piece of risk\u2014possibly the largest\u2014when you ship software that does nothing to production. After that, each feature you add addresses a bit more of the risk. When you ship a feature that requires persistence, you\u2019ll add a persistence mechanism. You\u2019ll cover each feature with automated tests. \u201cIt\u2019s just one small feature, I might as well.\u201d You\u2019ll build toward your desired architecture bit-by-bit. No single task ever becomes a burden. Every commit makes it to production. Soon you\u2019ll have your (Minimum Viable Product) MVP . There will be no moment of panic, no mad dash to the finish line. In fact, there never has to be a finish line. You can invite your first users to try features immediately. You get valuable feedback that can shape your roadmap. Users get some of the value sooner than they would\u2019ve otherwise. By shipping software that does nothing, you\u2019ve figured out how to ship the right something , sooner. Get notified when I publish new articles Get notified when I post new articles. (https://kerrick.blog/privacy-policy/) Privacy policy applies. (you@example.com) Subscribe Please wait\u2026  Thanks! You\u2019ll receive emails when new articles are published.  Oops! Something went wrong, please try again  \u2190 Back    Categories: (https://kerrick.blog/category/articles/advice/) (View all posts in Advice) Advice  (https://kerrick.blog/tag/agile/) (View all posts tagged Agile) Agile  (https://kerrick.blog/tag/automated-tests/) (View all posts tagged Automated Tests) Automated Tests  (https://kerrick.blog/tag/continuous-delivery/) (View all posts tagged Continuous Delivery) Continuous Delivery  (https://kerrick.blog/tag/continuous-deployment/) (View all posts tagged Continuous Deployment) Continuous Deployment  (https://kerrick.blog/tag/continuous-integration/) (View all posts tagged Continuous Integration) Continuous Integration  (https://kerrick.blog/tag/extreme-programming/) (View all posts tagged Extreme Programming) Extreme Programming  (https://kerrick.blog/tag/lean/) (View all posts tagged Lean) Lean  (https://kerrick.blog/tag/risk/) (View all posts tagged Risk) Risk  (https://kerrick.blog/tag/architecture/) (View all posts tagged Software Architecture) Software Architecture    Previous Post (https://kerrick.blog/articles/2025/kerricks-wager/) Kerrick\u2019s Wager: on the Future of Manual Programming  Next Post (https://kerrick.blog/articles/2025/confessions-of-a-software-developer-no-more-self-censorship/) Confessions of a Software Developer: No More Self-Censorship     6 Comments   (Dan Schnau) (https://danschnau.com) Dan Schnau   \ud83e\udd14 I think you\u2019re on to something. Making an MVP, then figuring out how to ship it has been a big time suck for me.  April 14, 2025 Reply    (Sam Jones) Sam Jones  What you just described is known as the Walking Skeleton ((https://wiki.c2.com/?WalkingSkeleton) https://wiki.c2.com/?WalkingSkeleton ). Others know it as the Steel Thread. It is hands down the most effective way to start a software project that has a goal of real production use. I\u2019m glad to see it is getting more exposure.  April 14, 2025 Reply   (Kerrick Long) (https://kerrick.blog) Kerrick Long   Thanks for the link and terms! I found a good description of Steel Thread here: (https://www.rubick.com/steel-threads/) https://www.rubick.com/steel-threads/   April 14, 2025 Reply   (Jane Doe) Jane Doe  This is similar to Tracer Bullet Development, mentioned in Pragmatic Programmer: (https://medium.com/@remind.stephen.to.do.sth/targeting-success-the-power-of-tracer-bullets-in-pragmatic-software-engineering-cd6c53758986) https://medium.com/@remind.stephen.to.do.sth/targeting-success-the-power-of-tracer-bullets-in-pragmatic-software-engineering-cd6c53758986  Although I concede that Steel Thread is a much better, descriptive name. Also nice to see things I learned \u201cin anger\u201d being talked about explicitly!  April 21, 2025 Reply        (Nabil) Nabil  Wow! This is something I\u2019ve always thought of doing.  April 15, 2025 Reply    (Z. I.) Z. I.  I\u2019d never thought about starting a project this way, by sending \u201cnothing\u201d live. It makes sense to make sure the infrastructure is okay before filling it with stuff.  December 6, 2025 Reply     Reposts () (https://newsmast.community/@architecture) () \u267b\ufe0f  Architecture & Design Channel     Leave a Reply (/articles/2025/ship-software-that-does-nothing/#respond) Cancel reply   Your email address will not be published. Required fields are marked *   Comment   Name* (Jane Doe) ()  Email* (name@email.com) ()  Website (http://google.com) ()  (yes) Save my name, email, and website in this browser for the next time I comment.    (Post Comment)  (291) (0)  (fbf9c8a803)  \u0394  (1765850483823)    To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. ((https://indieweb.org/webmention) Find out more about Webmentions. )  URL/Permalink of your article  (Ping me!)  (html) (https://kerrick.blog/articles/2025/ship-software-that-does-nothing/)      Sidebar Email Newsletter Get notified when I post new articles. (https://kerrick.blog/privacy-policy/) Privacy policy applies. (you@example.com) Subscribe Please wait...  Thanks! You'll receive emails when new articles are published.  Oops! Something went wrong, please try again  \u2190 Back    Search () () Search    Recent Articles (https://kerrick.blog/articles/2025/i-vibe-coded-a-wordpress-plugin-and-shipped-it-to-production/) I Vibe Coded a WordPress Plugin and Shipped it to Production December 1, 2025  (https://kerrick.blog/articles/2025/confessions-of-a-software-developer-no-more-self-censorship/) Confessions of a Software Developer: No More Self-Censorship November 28, 2025  (https://kerrick.blog/articles/2025/ship-software-that-does-nothing/) Ship Software That Does Nothing April 12, 2025  (https://kerrick.blog/articles/2025/kerricks-wager/) Kerrick\u2019s Wager: on the Future of Manual Programming April 2, 2025  (https://kerrick.blog/articles/2025/24-books-asp-net-blazor-front-matter/) What Books Should I Read to Learn ASP.NET Core and Blazor? March 30, 2025      Recent Quick-Posts (https://kerrick.blog/posts/2025/re-more-fluent-method-signatures-in-ruby/) Re: More Fluent Method Signatures in Ruby December 13, 2025  (https://kerrick.blog/posts/2025/this-great-tool-helps-you-name-any-hex-color/) This Great Tool Helps You Name Any Hex Color December 13, 2025  (https://kerrick.blog/posts/2025/did-37signals-just-accidentally-make-writebook-open-source/) Did 37Signals Just Accidentally Make Writebook Open Source? December 9, 2025  (https://kerrick.blog/posts/2025/a-new-best-practice-for-user-friendly-404-pages/) A New Best Practice for User Friendly 404 Page Design? December 6, 2025  (https://kerrick.blog/posts/2025/peter-coad-slams-alexanders-pattern-theory-is-he-right/) Peter Coad Slams Alexander\u2019s \u201cPattern\u201d Theory. Is He Right? December 5, 2025  (https://kerrick.blog/posts/2025/re-emily-bache-on-ward-cunninghams-fearless-refactoring/) Re: Emily Bache on Ward Cunningham\u2019s Fearless Refactoring December 3, 2025  (https://kerrick.blog/posts/2025/acceptance-tests-and-unit-tests-as-documents-first-tests-second/) Acceptance Tests and Unit Tests as Documents First, Tests Second December 3, 2025  (https://kerrick.blog/posts/2025/learning-to-code-without-a-map-mentorship-and-entry-paths-in-the-post-bootcamp-era/) Learning to Code Without a Map: Mentorship and Entry Paths in the Post-Bootcamp Era December 2, 2025  (https://kerrick.blog/posts/2025/re-one-soft-navigation-per-page-load/) Re: One Soft Navigation per Page Load December 1, 2025  (https://kerrick.blog/posts/2025/the-big-oops-anatomy-of-a-thirty-five-year-mistake/) The Big OOPs: Anatomy of a Thirty-five-year Mistake November 30, 2025              Recent Comments () (https://ruby.social/@veganstraightedge) Shane Becker on (https://ruby.social/@veganstraightedge/115716367637040412) Re: More Fluent Method Signatures in Ruby December 13, 2025  @kerrick @kerrick@kerrick.blog ah, gotcha bug report?    () (https://ruby.social/@kerrick) Kerrick Long (code) on (https://ruby.social/@kerrick/115716363780385942) Re: More Fluent Method Signatures in Ruby December 13, 2025  @veganstraightedge @kerrick@kerrick.blog It's actually just a WordPress blog with the Automattic's ActivityPub plugin [0]. The code in my post body\u2026    () (https://ruby.social/@veganstraightedge) Shane Becker on (https://ruby.social/@veganstraightedge/115716354751621157) Re: More Fluent Method Signatures in Ruby December 13, 2025  @kerrick @kerrick@kerrick.blog that's rude of it \ud83d\ude2cAre you using a Markdown parser on the post content? Is it Kramdown?    () (https://ruby.social/@kerrick) Kerrick Long (code) on (https://ruby.social/@kerrick/115716346932923728) Re: More Fluent Method Signatures in Ruby December 13, 2025  @veganstraightedge @kerrick@kerrick.blog Looks like it doesn't. Oddly, it seems to think you want &ldquo;    () (https://ruby.social/@veganstraightedge) Shane Becker on (https://ruby.social/@veganstraightedge/115716297685667777) Re: More Fluent Method Signatures in Ruby December 13, 2025  @kerrick I'm curious\u2026 does your indieweb post on your site format my post/note's content if I use code fences with\u2026    () I. I. A. on (https://kerrick.blog/posts/2025/peter-coad-slams-alexanders-pattern-theory-is-he-right/#comment-1431) Peter Coad Slams Alexander\u2019s \u201cPattern\u201d Theory. Is He Right? December 11, 2025  An interesting critique of a foundational concept. It's good to revisit these debates that shape our field.    () A. C. P. on (https://kerrick.blog/posts/2025/automated-tests-as-waste-vs-needed/#comment-1423) Automated Tests as Waste vs. Needed December 9, 2025  The quote about unit tests stopping the line is spot on!    () A. A. on (https://kerrick.blog/articles/2025/i-vibe-coded-a-wordpress-plugin-and-shipped-it-to-production/#comment-1412) I Vibe Coded a WordPress Plugin and Shipped it to Production December 7, 2025  A fascinating read on how AI can streamline development, even for rusty skills    () Z. I. on (https://kerrick.blog/articles/2025/ship-software-that-does-nothing/#comment-1410) Ship Software That Does Nothing December 6, 2025  I'd never thought about starting a project this way, by sending \"nothing\" live. It makes sense to make sure the\u2026    () (https://bpavuk.neocities.org) Bohdan Pavuk on (https://kerrick.blog/articles/2025/confessions-of-a-software-developer-no-more-self-censorship/#comment-1389) Confessions of a Software Developer: No More Self-Censorship November 29, 2025  > A lack of automated tests tends to make change harder, but it doesn\u2019t doom the software. Maybe, that's because\u2026    () Warren Henning on (https://kerrick.blog/articles/2025/confessions-of-a-software-developer-no-more-self-censorship/#comment-1388) Confessions of a Software Developer: No More Self-Censorship November 29, 2025  Some typos here: \"test project\" -> \"test coverage\", \"new library, C\" -> \"new library, Sokol\", \"fault detection\" -> \"fault injection\".\u2026    () (https://lesleylai.info/) Lesley Lai on (https://kerrick.blog/articles/2025/confessions-of-a-software-developer-no-more-self-censorship/#comment-1387) Confessions of a Software Developer: No More Self-Censorship November 29, 2025  Good article! Regarding the knowledge gap, it reminds me of the Venn diagram for imposter syndrome. We thought we didn't\u2026    () Warren Henning on (https://kerrick.blog/articles/2025/confessions-of-a-software-developer-no-more-self-censorship/#comment-1383) Confessions of a Software Developer: No More Self-Censorship November 28, 2025  As you saw from your own experience, unit tests are not necessary for a quality, successful software product. Considering many\u2026    () (https://kerrick.blog) Kerrick Long on (https://kerrick.blog/articles/2025/confessions-of-a-software-developer-no-more-self-censorship/#comment-1379) Confessions of a Software Developer: No More Self-Censorship November 28, 2025  Thanks! I plan to keep writing :-)    () (https://kerrick.blog) Kerrick Long on (https://kerrick.blog/articles/2025/confessions-of-a-software-developer-no-more-self-censorship/#comment-1377) Confessions of a Software Developer: No More Self-Censorship November 28, 2025  That perspective is helpful, thank you. The production code I've shipped, even without tests, has also been economically successful. A\u2026        Email Newsletter Get notified when I post new articles. (https://kerrick.blog/privacy-policy/) Privacy policy applies. (you@example.com) Subscribe Please wait...  Thanks! You'll receive emails when new articles are published.  Oops! Something went wrong, please try again  \u2190 Back      (https://www.competethemes.com/shift/) Shift WordPress Theme by Compete Themes.        "
                ],
                "output": "htmltotext.txt",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:01:57.341895+00:00",
                "status": "succeeded"
            }
        ],
        "media": [
            {
                "cmd": [
                    "/usr/local/bin/yt-dlp",
                    "--restrict-filenames",
                    "--trim-filenames",
                    "128",
                    "--write-description",
                    "--write-info-json",
                    "--write-annotations",
                    "--write-thumbnail",
                    "--no-call-home",
                    "--write-sub",
                    "--write-auto-subs",
                    "--convert-subs=srt",
                    "--yes-playlist",
                    "--continue",
                    "--no-abort-on-error",
                    "--ignore-errors",
                    "--geo-bypass",
                    "--add-metadata",
                    "--format=(bv*+ba/b)[filesize<=750m][filesize_approx<=?750m]/(bv*+ba/b)",
                    "--skip-download",
                    "--cache-dir=/data/yt-dlp-cache/",
                    "--cookies=/data/yt-dlp-cache/cookies.txt",
                    "--proxy=socks5://tor-socks-proxy:9150",
                    "--no-playlist",
                    "https://kerrick.blog/articles/2025/ship-software-that-does-nothing/"
                ],
                "cmd_version": "2024.10.7",
                "end_ts": "2025-12-16T02:02:13.596926+00:00",
                "index_texts": [],
                "output": "media/",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:02:01.704789+00:00",
                "status": "succeeded"
            }
        ],
        "mercury": [
            {
                "cmd": [
                    "/home/archivebox/.npm/bin/postlight-parser",
                    "https://kerrick.blog/articles/2025/ship-software-that-does-nothing/"
                ],
                "cmd_version": "2.2.3",
                "end_ts": "2025-12-16T02:01:57.190257+00:00",
                "index_texts": null,
                "output": "mercury/",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:01:52.173456+00:00",
                "status": "succeeded"
            }
        ],
        "pdf": [],
        "readability": [
            {
                "cmd": [
                    "/home/archivebox/.npm/bin/readability-extractor",
                    "/tmp/tmp5p9qxejy",
                    "https://kerrick.blog/articles/2025/ship-software-that-does-nothing/"
                ],
                "cmd_version": "0.0.11",
                "end_ts": "2025-12-16T02:01:39.379614+00:00",
                "index_texts": [
                    "Last updated on November 28, 2025 \t\t\t\nYou should ship software that does nothing. Absolutely nothing. I\u2019m not being cheeky about this. I have no hidden meaning. The very first thing you should deliver when you start a new web application is absolutely nothing.\n\n\n\nMany people will tell you to ship a minimum viable product. Others say to ship a prototype to get feedback. Not me. I think you should ship a blank page to your production servers on day one.\n\n\n\nConsider the alternative. You could spend a day debating your architecture: slices, layers, shapes, vegetables, or smalltalk. You could spend several days eliminating the biggest risks by building proofs-of-concept to eliminate unknowns. You could spend a week figuring out how you\u2019ll store, search, and cache data and which third\u2013party integrations you\u2019ll need. You could spend a couple weeks creating mockups and getting feedback from potential users. You could spend a month building an end-to-end product that focuses on the highest-ROI feature for a niche target market. No matter what, you still have to ship. And no matter what, you could\u2019ve shipped nothing first.\n\n\n\nYou can evolve your nothingness, feature by feature, into your preferred architecture. You can build your riskiest features in the blank space you created by shipping nothing. You can add tools and providers one by one as your features demand. You can ship your mockups to production to drive your user interviews. All of this is made easier and lower risk by shipping nothing first.\n\n\n\nShipping nothing is nothing to sneeze at. Delivering a blank page to production means you\u2019ve made a lot of important decisions. You must take risky actions early, which is the best time to take risks. And once you\u2019ve shipped software that does nothing, making it do something is easy.\n\n\n\nYou can\u2019t ship a webpage that does nothing until you have a place to ship to. You\u2019ll have to decide whether you\u2019re deploying to cloud VMs, rented bare metal, a rack in the datacenter down the street, or a serverless function. You\u2019ll pick your programming language. You might pick a framework, a web server, and a containerization strategy. Shipping nothing pushes you to set up deployment automation immediately. You solve your administrative burdens\u2014domain name, certificates, billing\u2014when it\u2019s easy. When there\u2019s no pressure. Your stakeholders aren\u2019t pressuring you to ship because it\u2019s been no time at all. Your users aren\u2019t clamoring for access because they haven\u2019t seen anything yet. Ship software that does nothing, and ship it to nobody.\n\n\n\nIf you ship nothing to nobody, it\u2019s guaranteed to work. You won\u2019t hear the phrase \u201cbut it worked on my machine.\u201d Once you\u2019ve delivered nothing, every bit of something goes right to production. You\u2019ll notice anything that doesn\u2019t work before it becomes expensive to fix. You\u2019ll notice because you\u2019ll automate the shipping.\n\n\n\nCreating a repeatable build process for nothing is easy. It has no dependencies. Nobody has ever configured a production server by hand. There\u2019s nothing to audit, and nothing has been done that makes automation tricky. Automate your deployment to production before you can produce anything more than a blank page.\n\n\n\nA blank page is also easy to test. 200? OK. For the same reason automating delivery was easy, automate integration as well. Creating your health check infrastructure is much easier when you only have to check one thing. The same goes for setting up continuous integration. And since you\u2019ve set up continuous integration, that means you\u2019ve set up version control. There\u2019s no need to decide between trunk-based development, git flow, or feature branches yet. Nothing is in progress. There is only main. So, set up a continuous integration pipeline to test main on every commit. Set up a continuous deployment pipeline to deliver main to production every time the tests pass. Configure alerts so that everybody knows when something fails.\n\n\n\nNotice how much is involved in shipping software that does nothing. This work will come around eventually. The later you do it, the riskier it is. When your system has few dependencies, there is little chance you forgot one. When your application has no functionality, you can\u2019t have features that aren\u2019t covered by tests. When you establish an automatic delivery pipeline before you have users, everybody is accustomed to frequent, tiny changes. But if you wait, these all get harder. Building software that does something and then figuring out how to ship is risky. Shipping software that does nothing slices that risk into tiny pieces.\n\n\n\nYou address one piece of risk\u2014possibly the largest\u2014when you ship software that does nothing to production. After that, each feature you add addresses a bit more of the risk. When you ship a feature that requires persistence, you\u2019ll add a persistence mechanism. You\u2019ll cover each feature with automated tests. \u201cIt\u2019s just one small feature, I might as well.\u201d You\u2019ll build toward your desired architecture bit-by-bit. No single task ever becomes a burden. Every commit makes it to production. Soon you\u2019ll have your MVP. There will be no moment of panic, no mad dash to the finish line.\n\n\n\nIn fact, there never has to be a finish line. You can invite your first users to try features immediately. You get valuable feedback that can shape your roadmap. Users get some of the value sooner than they would\u2019ve otherwise. By shipping software that does nothing, you\u2019ve figured out how to ship the right something, sooner.\n\n\n\nGet notified when I publish new articlesGet notified when I post new articles. Privacy policy applies."
                ],
                "output": "readability/",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:01:33.802268+00:00",
                "status": "succeeded"
            }
        ],
        "screenshot": [],
        "singlefile": [],
        "title": [
            {
                "cmd": [
                    "/usr/bin/curl",
                    "--silent",
                    "--location",
                    "--compressed",
                    "--proxy",
                    "socks5://tor-socks-proxy:9150",
                    "--max-time",
                    "60",
                    "--user-agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)",
                    "https://kerrick.blog/articles/2025/ship-software-that-does-nothing/"
                ],
                "cmd_version": "8.10.1",
                "end_ts": "2025-12-16T02:01:33.096175+00:00",
                "index_texts": null,
                "output": "Ship Software That Does Nothing - Kerrick Long (blog)",
                "pwd": "/data/archive/1765850455.799908",
                "schema": "ArchiveResult",
                "start_ts": "2025-12-16T02:01:33.017828+00:00",
                "status": "succeeded"
            }
        ],
        "wget": []
    },
    "icons": null,
    "is_archived": true,
    "is_static": false,
    "latest": {
        "archive_org": "TimeoutExpired: Command '['/usr/bin/curl', '--silent', '--location', '--compressed', '--proxy', 'socks5://tor-socks-proxy:9150', '--head', '--max-time', '60', '--user-agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 ArchiveBox/{VERSION} (+https://github.com/ArchiveBox/ArchiveBox/)', 'https://web.archive.org/save/https://kerrick.blog/articles/2025/ship-software-that-does-nothing/']' timed out after 60 seconds",
        "dom": "output.html",
        "favicon": "favicon.ico",
        "git": null,
        "media": "media/",
        "pdf": null,
        "screenshot": null,
        "singlefile": null,
        "title": "Ship Software That Does Nothing - Kerrick Long (blog)",
        "warc": null,
        "wget": null
    },
    "link_dir": "/data/archive/1765850455.799908",
    "newest_archive_date": "2025-12-16T02:02:13.715243+00:00",
    "num_failures": 1,
    "num_outputs": 8,
    "oldest_archive_date": "2025-12-16T02:01:00.384032+00:00",
    "path": "/articles/2025/ship-software-that-does-nothing/",
    "schema": "Link",
    "scheme": "https",
    "snapshot_abid": "snp_01KCJE77RT2DABF68501H6G1K4",
    "snapshot_id": "b57f8758-c1b3-4806-85b0-29cc62680664",
    "sources": [
        "/data/sources/1765850454-import.txt"
    ],
    "tags": null,
    "tags_str": "",
    "timestamp": "1765850455.799908",
    "title": "Ship Software That Does Nothing - Kerrick Long (blog)",
    "url": "https://kerrick.blog/articles/2025/ship-software-that-does-nothing/"
}