<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://duggan.ie/tag/software-development/</id>
  <title type="text">@duggan — software-development</title>
  <updated>2026-06-15T09:17:19.000Z</updated>
  <author>
    <name>Ross Duggan</name>
    <uri>https://duggan.ie/</uri>
  </author>
  <icon>https://duggan.ie/favicon.ico</icon>
  <link href="https://duggan.ie/tag/software-development/atom.xml" rel="first"/>
  <link href="https://duggan.ie/tag/software-development/atom.xml?page=1" rel="last"/>
  <link href="https://duggan.ie/tag/software-development/atom.xml" rel="self"/>
  <logo>https://duggan.ie/og-image.png</logo>
  <rights type="text">All rights reserved 2026, Ross Duggan</rights>
  <subtitle type="text">Posts tagged software-development</subtitle>
  <entry>
    <id>https://duggan.ie/posts/the-dream-of-v2</id>
    <title type="text">The dream of v2</title>
    <updated>2026-06-15T09:17:19.000Z</updated>
    <author>
      <name>Ross Duggan</name>
      <uri>https://duggan.ie/</uri>
    </author>
    <content type="html">&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Joel Spolsky &lt;/span&gt;&lt;a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/" rel="noreferrer"&gt;&lt;span style="white-space: pre-wrap;"&gt;once called it&lt;/span&gt;&lt;/a&gt;&lt;span style="white-space: pre-wrap;"&gt; &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;"the single worst strategic mistake that any software company can make"&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt;, and not for nothing:&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="white-space: pre-wrap;"&gt;"When you throw away code and start from scratch, you are throwing away all that knowledge. All those collected bug fixes. Years of programming work."&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Even twenty years into my career, despite understanding, both &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;logically&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt; and from experience that a rewrite is a high-risk move with limited chance of success–&amp;nbsp;I still find myself daydreaming about it.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;It's easy enough to dismiss other people's mistakes, or even your own, as not applicable, even easily avoidable. But software is built in a time and a place and under very specific conditions. You don't get to reset to the same preconditions and try again. Every retry is a completely different game.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Fred Brooks described one variation of this as the &lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Second-system_effect" rel="noreferrer"&gt;&lt;span style="white-space: pre-wrap;"&gt;second-system effect&lt;/span&gt;&lt;/a&gt;&lt;span style="white-space: pre-wrap;"&gt; in &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;The Mythical Man Month&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt;:&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="white-space: pre-wrap;"&gt;"...the tendency for a successful first system (often small and relatively elegant) to be followed by a second system that becomes over-engineered or bloated."&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Perhaps it's because I've mostly worked in startups, but the &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;first systems&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt; I'm familiar with are &lt;/span&gt;&lt;span&gt;&lt;span style="white-space: pre-wrap;"&gt;big balls of mud&lt;/span&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/span&gt;&lt;span style="white-space: pre-wrap;"&gt; &lt;/span&gt;&lt;span&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/span&gt;&lt;span style="white-space: pre-wrap;"&gt;that accrue from generalists and novices building products while still trying to understand the domain –&amp;nbsp;and of course find their customers.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;As far as I can gather, this is par for the course in startups. It's rarer than perhaps it was in 1976 for a company to start with a team of seasoned specialists working on a domain they fully understand, for a customer that is well defined. Of course, even that is no guarantee of success.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;There is also a helpful corollary:&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="white-space: pre-wrap;"&gt;"Brooks separately argues that teams should often expect to build a pilot (or throwaway) system to learn what is actually needed; the management question is whether to plan for that throwaway in advance or to mistakenly ship it as the final product."&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;I don't think I've ever seen a pilot that does not become the first version of the product. Again, perhaps this is because I've worked mostly in smaller companies, but generally a &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;working artefact&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt; for a real problem is too valuable to discard.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;I can imagine companies and products where this is different, though they all live in a cozy 90s corner of my imagination where release cycles are multi-year, cash is plentiful, and in defiance of Euclidean geometry, every office is a corner office.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;For startups you often &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;must&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt; first build a big ball of mud, and you &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;cannot&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt; throw it away.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Until now, maybe?&lt;/span&gt;&lt;/p&gt;&lt;h2 id="fast-good-cheap" class="group relative"&gt;&lt;a href="#fast-good-cheap" class="absolute -left-6 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity duration-200 text-gray-400 hover:text-gray-600 no-underline"&gt;#&lt;/a&gt;&lt;span style="white-space: pre-wrap;"&gt;Fast, good, cheap&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;&lt;figure class="image-wrapper" style="width: fit-content; margin-left: auto; margin-right: auto; text-align: center"&gt;&lt;img src="/files/0467e040a2fafd9e.svg#theme-invert" alt="Project-triangle-en.svg" width="inherit" height="inherit" style="max-width: 100%; height: auto;"&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;There is a project management model called the &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;iron triangle&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt; which will be familiar to many software developers. If you don't know it, the basic idea is that there are trade-offs when building something. If you want it done faster, it's going to cost more, if you want it to do more, it's going to take more time, etc. Fast, good, cheap: pick two.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Coding assistants are rapidly changing how we write software. The adage that you can only pick two of &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;fast, good, and cheap&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt;, is going to be tested.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;In particular, the bar for quality will be permanently raised. In some sense this is not too different from the way that the quality bar for an app or website has risen in the last 30 years – just at a faster rate.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Software is now cheaper to produce; more niche software can be produced by people who don't need to be seasoned software developers. I think this will be good, on balance. There will be more crap, but also more &lt;/span&gt;&lt;a href="https://github.com/MaximeRivest/Riddle" rel="noreferrer"&gt;&lt;span style="white-space: pre-wrap;"&gt;interesting esoterica&lt;/span&gt;&lt;/a&gt;&lt;span style="white-space: pre-wrap;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;This also means that at least some of the risk of a rewrite should be going down commensurately.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;My own timeline for delivering functionality and fixes has gone down, sometimes by an order of magnitude. Code I would comfortably predict would take several weeks to write, test and iterate on in 2025 can usually be produced in a matter of days now. Bug fixing, which often has a higher cognitive burden since it requires more reading than writing, has often become a background task while I'm doing something else.&lt;/span&gt;&lt;/p&gt;&lt;h2 id="a-golden-era-of-rewrites" class="group relative"&gt;&lt;a href="#a-golden-era-of-rewrites" class="absolute -left-6 top-1/2 -translate-y-1/2 opacity-0 group-hover:opacity-100 transition-opacity duration-200 text-gray-400 hover:text-gray-600 no-underline"&gt;#&lt;/a&gt;&lt;span style="white-space: pre-wrap;"&gt;A golden era of rewrites?&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;There's still no magic pipeline to pour in a big ball of mud and have polished marble come out the other side. However, making the process cheaper and easier is going to bring it into the realm of attainability for some projects.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;There are techniques being developed, producing results like &lt;/span&gt;&lt;a href="https://simonwillison.net/2026/Mar/5/chardet/" rel="noreferrer"&gt;&lt;span style="white-space: pre-wrap;"&gt;the quasi-clean-room rewrite of chardet&lt;/span&gt;&lt;/a&gt;&lt;span style="white-space: pre-wrap;"&gt;, or the rewrite of &lt;/span&gt;&lt;a href="https://simonwillison.net/2026/May/14/mitchell-hashimoto/" rel="noreferrer"&gt;&lt;span style="white-space: pre-wrap;"&gt;Bun from Zig to Rust&lt;/span&gt;&lt;/a&gt;&lt;span style="white-space: pre-wrap;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Reproducing a piece of software, or transliterating from one language to another is one thing;&amp;nbsp;a rewrite to me though suggests something that, at minimum, is fixing deep architectural debt. Ideally, it's unlocking new avenues for development, such as faster delivery or improved functionality.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;This is a higher bar to reach than mere reproduction. Partly this is because what defines a piece of software, a product, is in people's heads. It's in the various expectations of customers, developers, and business owners, amongst others. It's also the case that providing the original code to an LLM will inevitably anchor the rewrite to the original in ways that may be undesirable.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;That said, I have found an agent-based full rewrite valuable even when not shipping the final result. First, it has given me a chance to test out ideas that would have been difficult to retrofit even into a feature branch –&amp;nbsp;the kind of stuff that means tearing out whole subsystems or redesigning the architecture.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Since it's so fast to do, it allowed me to get to a working state very quickly, become more ambitious, and discover things that I might never have done by incrementally improving the original codebase. Some of those ideas were then ported to the original system.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;It was also truly cathartic to fix all the things that I feel are broken or badly designed in the original code.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Also, if I'm honest it helped me touch grass a bit and appreciate the value of a functioning system. Sometimes it's easy to forget how much work has been done when all you can see are the flaws.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Certainly it is now easier to produce something complex and polished. However, it still takes time, effort, and money. It still has to be deployed, improved, and maintained. There will still be bugs. Most importantly it still has to be built with intention, and serve customers. It can't just be whatever the agent decides is good enough.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Everywhere you look people are still buying software. They are still complaining about software.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Nobody has the time or money to rewrite every piece of software they use on demand. It may take the market a while to realize that, though.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div class="footnotes"&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="white-space: pre-wrap;"&gt;A Big Ball of Mud is a haphazardly structured, sprawling, sloppy, duct-tape-and-baling-wire, spaghetti-code jungle. These systems show unmistakable signs of unregulated growth, and repeated, expedient repair. Information is shared promiscuously among distant elements of the system, often to the point where nearly all the important information becomes global or duplicated.&lt;/span&gt;&lt;br&gt;&lt;span style="white-space: pre-wrap;"&gt;– laputan.org https://www.laputan.org/mud/mud.html#BigBallOfMud&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;br&gt;&lt;span style="white-space: pre-wrap;"&gt;–&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</content>
    <link href="https://duggan.ie/posts/the-dream-of-v2" rel="alternate"/>
    <published>2026-07-07T10:49:31.141Z</published>
    <summary type="html">&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Joel Spolsky once called it "the single worst strategic mistake that any software company can make", and not for nothing:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;"When you throw away code and start from scratch, you are throwing away all that knowledge. All those collected bug fixes. Years of programming work."&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Even twenty years into my career, despite understanding, both &lt;/span&gt;&lt;i&gt;&lt;em class="italic" style="white-space: pre-wrap;"&gt;logically&lt;/em&gt;&lt;/i&gt;&lt;span style="white-space: pre-wrap;"&gt; and from experience that a rewrite is a high-risk move with limited chance of success–&amp;nbsp;I am still often tempted.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="white-space: pre-wrap;"&gt;Coding assistants are making it more tantalizing than ever, and maybe, just maybe, even attainable.&lt;/span&gt;&lt;/p&gt;</summary>
  </entry>
</feed>