<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://doingsoftwarewrong.com/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Doing Software Wrong</title>
    <link>https://doingsoftwarewrong.com/</link>
    <atom:link href="https://doingsoftwarewrong.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>We work hard, we mean well, we still end up doing software wrong</description>
    <language>en</language>
    <item>
      <title>Nobody reads the Markdown</title>
      <link>https://doingsoftwarewrong.com/blog/nobody-reads-the-markdown/</link>
      <description>&lt;p&gt;Our repositories have stopped being just a safe home for our codebase, they have become a noticeboard.&lt;/p&gt;
&lt;p&gt;Markdown files have appeared everywhere, each one containing another set of instructions for the agents now wandering through the project like contractors on their first day, nodding confidently while having no idea what they are doing.&lt;/p&gt;
&lt;p&gt;Look at any modern code repository and there they are.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AGENTS.md&lt;/li&gt;
&lt;li&gt;CONTRIBUTING.md&lt;/li&gt;
&lt;li&gt;ARCHITECTURE.md&lt;/li&gt;
&lt;li&gt;DECISIONS.md&lt;/li&gt;
&lt;li&gt;HOW_THE_IMPORT_BIT_WORKS.md&lt;/li&gt;
&lt;li&gt;READ_THIS_FIRST.md&lt;/li&gt;
&lt;li&gt;READ_THIS_FIRST_ V2.md&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&#39;t necessarily a bad thing, and here is why.&lt;/p&gt;
&lt;p&gt;Documents are one of the best ways to give AI agents context. Models can write code extremely well. They can translate specifications into implementations, follow patterns, produce tests, and confidently invent a function that already exists three folders away.&lt;/p&gt;
&lt;p&gt;However, they are less adept at knowing what we meant when we gave them the prompt that generated the specification in the first place.&lt;/p&gt;
&lt;p&gt;It is in this intent - what we actually mean – that most of the software&#39;s value lies.&lt;/p&gt;
&lt;h3 id=&quot;its-the-work-around-the-work&quot;&gt;It&#39;s the work around the work.&lt;/h3&gt;
&lt;p&gt;In &lt;a href=&quot;https://doingsoftwarewrong.com/blog/the-forklift-and-stapler/&quot;&gt;The forklift and stapler&lt;/a&gt;, I wrote about task engineering.&lt;/p&gt;
&lt;p&gt;I wrote about why we need to stop giving AI systems tiny instructions and start giving them designed pieces of work; why we need to give them tasks.&lt;/p&gt;
&lt;p&gt;To do that, we need to paint the picture of what we need, define what &#39;done&#39; looks like, and leave room for the agent to make decisions.&lt;/p&gt;
&lt;p&gt;Which sounds excellent until you realise what we have invented.&lt;/p&gt;
&lt;p&gt;More documentation, a developers&#39; arch nemesis.&lt;/p&gt;
&lt;p&gt;We don&#39;t expect developers to write every word themselves. We have AI now, and we can generate 17 pages of technically immaculate prose before someone has finished saying, &amp;quot;Should we document this?&amp;quot;&lt;/p&gt;
&lt;p&gt;But generating documentation is not the difficult bit. The difficult bit is taking responsibility for it. And that responsibility is sitting firmly on your shoulders.&lt;/p&gt;
&lt;h3 id=&quot;agents-are-your-teammates&quot;&gt;Agents are your teammates&lt;/h3&gt;
&lt;p&gt;Your agents can read the code, make changes to it, and sometimes complete an unsettling amount of work. What they can&#39;t do is absorb the invisible information that exists between us humans. This includes historic organisational decisions, past compromises and unwritten rules (i.e. the thing nobody touches because Sarah once said not to).&lt;/p&gt;
&lt;p&gt;For agents the code is visible and readable, whereas the understanding and intent is not.&lt;/p&gt;
&lt;p&gt;Documentation is what we use to fill the gaps that exist between the code of the software and the intent of the system. We need documentation to tell the agents how the system is supposed to work, any constraints that exist and where previous developers discovered holes in the floor.&lt;/p&gt;
&lt;h3 id=&quot;your-tour-guide-is-operating-with-an-outdated-manual&quot;&gt;Your tour guide is operating with an outdated manual&lt;/h3&gt;
&lt;p&gt;Imagine the documentation in your repo is a tour guide showing a new employee (your agent) around a large factory. Reassuring at first.&lt;/p&gt;
&lt;p&gt;&amp;quot;This way to the accounts teams.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Safety equipment is stored in the orange cupboard, marked &#39;Safety&#39;.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;When you finish your shift, press the big red button beside the loading bay.&amp;quot;&lt;/p&gt;
&lt;p&gt;But what if the documentation hasn&#39;t been updated for years, the accounts team changed buildings, the safety cupboard now contains Christmas decorations and a printer nobody remembers buying?&lt;/p&gt;
&lt;p&gt;As for that red button near the loading bay, it&#39;s now blue and pressing it releases a thousand litres of custard.&lt;/p&gt;
&lt;p&gt;Armed with the documentation, the tour guide speaks with unwavering confidence, but they are catastrophically wrong.&lt;/p&gt;
&lt;p&gt;If you gave that same documentation to an agent and asked it to modernise the factory, things would go wrong fast.&lt;/p&gt;
&lt;p&gt;Documentation generated (or otherwise) without ownership is more dangerous than ever because agents trust the documentation.&lt;/p&gt;
&lt;h3 id=&quot;trust-is-new-development-dependency&quot;&gt;Trust is new development dependency&lt;/h3&gt;
&lt;p&gt;For agents to work effectively across a team, the team needs to trust each other&#39;s documentation. This is not simply trust that a document exists. It is trust that a document matters, that it is accurate, it has been reviewed, and trust that it will be kept up to date.&lt;/p&gt;
&lt;p&gt;This work cannot be entirely delegated to the AI that generated it either, in the same way you wouldn&#39;t ask someone to write their own performance review, approve it and award themselves a pay rise accordingly.&lt;/p&gt;
&lt;p&gt;An agent can draft a document, review it against code to find inconsistencies and suggest improvements, but a developer needs to decide whether the document reflects the system, whether it reflects reality.&lt;/p&gt;
&lt;p&gt;A key component of our new role is judgement. The model does more of the typing, we do more of the judging.&lt;/p&gt;
&lt;h3 id=&quot;the-hopefully-useful-bit&quot;&gt;The hopefully useful bit&lt;/h3&gt;
&lt;p&gt;I wanted to share a checklist for evaluating your documents, because most of the bad ones look fine until you check them.&lt;/p&gt;
&lt;p&gt;When you are next working on a document for your project, ask these 5 questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Does this document have a specific purpose?&lt;/strong&gt;
Can you explain who uses it, and what decision or task it helps them complete?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is it still true?&lt;/strong&gt;
Check it against the code, configuration and current behaviour rather than trusting its confident little Markdown smiley face. As I mentioned above this is something AI can help you with, just check its work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Does it explain the intent as well as the mechanics?&lt;/strong&gt;
&amp;quot;The system does this&amp;quot; is useful, but &amp;quot;The system does this because changing it would anger the payment processor&amp;quot; completes the picture.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is it concise and is it understandable?&lt;/strong&gt;
No document is improved by becoming a complete oral history of the repository. A document is also useless if only an agent can understand it. Make sure your non-agent team members would know what the document says.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Is it clear when it needs to be updated?&lt;/strong&gt;
If the document can become stale without any obvious trigger or owner, it will.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If a document fails any of these checks, you should fix it or delete it if the content is no longer relevant.&lt;/p&gt;
&lt;h3 id=&quot;doing-software-wrong-in-plain-text&quot;&gt;Doing software wrong in plain text&lt;/h3&gt;
&lt;p&gt;Markdown files (or other flavours of document) have become very important, especially as agents take on larger pieces of development work.&lt;/p&gt;
&lt;p&gt;But this only works when the documents can be trusted. While AI has made documentation almost free to produce, it hasn&#39;t made it any less expensive to own.&lt;/p&gt;
&lt;p&gt;We as developers need to review the documents, challenge them, and occasionally remove six pages of total nonsense before another agent mistakes it for the constitution. We need to own them, not just ship them.&lt;/p&gt;
&lt;p&gt;Otherwise, we have not painted a better picture for our AI teammates, we have simply automated the production of un-helpful content at a scale previously available only to large government departments.&lt;/p&gt;
&lt;p&gt;As usual, we will be doing software wrong.&lt;/p&gt;
&lt;p&gt;But in Markdown instead of C#.&lt;/p&gt;
</description>
      <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/nobody-reads-the-markdown/</guid>
    </item>
    <item>
      <title>The forklift and stapler</title>
      <link>https://doingsoftwarewrong.com/blog/the-forklift-and-stapler/</link>
      <description>&lt;p&gt;Most developers have become pretty good at using AI, some reluctantly.&lt;/p&gt;
&lt;p&gt;We paste in an error and ask for an explanation. We ask for unit tests, a regex we will immediately regret, or a slightly less deranged version of a comment we wrote at 11:47pm while bargaining with a build pipeline.&lt;/p&gt;
&lt;p&gt;And it works. The model helps. The developer moves on. Everyone feels faintly productive, like something meaningful has happened.&lt;/p&gt;
&lt;p&gt;Recently I have been feeling like what is being achieved is persuading a very expensive machine to help tie our shoelaces.&lt;/p&gt;
&lt;p&gt;The more I look, the more I see it.&lt;/p&gt;
&lt;p&gt;Developers are not really giving the AI models real work; they are giving it instructions.&lt;/p&gt;
&lt;p&gt;Very precise, mostly small instructions. We have been trained by what are now old limits. Prompts shaped by working with models that punished you the moment you got ambitious.&lt;/p&gt;
&lt;p&gt;Until very recently if you gave a model something too large, too messy, or too close to reality, it would start out with a great plan. It would outline the problem with calm authority. It would list the trade-offs. It would appear to understand the system, the context, the intent, the whole little ecosystem.&lt;/p&gt;
&lt;p&gt;Then, somewhere around step four or five, it would quietly detach from reality and float away like a lost party balloon.&lt;/p&gt;
&lt;p&gt;As developers we adapted, because developers are strange creatures that will build an elaborate ritual around a tool even if it keeps biting them.&lt;/p&gt;
&lt;p&gt;We have become prompt bonsai artists, carefully clipping away ambiguity until the model cannot hurt itself or anyone nearby.&lt;/p&gt;
&lt;p&gt;Prompt engineering was useful, obviously, and sensible for the models we had, but wrong for the models we are getting.&lt;/p&gt;
&lt;p&gt;Models like Claude Fable 5 and Sakana Fugu are not just asking us to write better prompts. They are asking us to engineer better tasks. Not &amp;quot;say the magic words more clearly&amp;quot;, but &amp;quot;define a real piece of work, gather the materials, describe what done looks like, set goals so the model can make judgement calls and leave a trail a human can review afterwards.&amp;quot;&lt;/p&gt;
&lt;p&gt;For me that is a different muscle entirely.&lt;/p&gt;
&lt;p&gt;And I do not think most developers have trained it yet. Not because we are lazy, or stupid, or insufficiently excited about the future of agentic development. It is because we have been trained by smaller models to think &lt;em&gt;small&lt;/em&gt;, to be explicit, hover nearby, and prompt for fragments instead of outcomes.&lt;/p&gt;
&lt;p&gt;We have become excellent at dealing in fragments.&lt;/p&gt;
&lt;p&gt;We are less practised at shaping work.&lt;/p&gt;
&lt;h3 id=&quot;prompt-engineering-was-useful-task-engineering-is-different&quot;&gt;Prompt engineering was useful. Task engineering is different.&lt;/h3&gt;
&lt;p&gt;Don&#39;t get me wrong — clear instructions matter. Context matters. Examples matter. Telling the model what good looks like matters.&lt;/p&gt;
&lt;p&gt;But prompt engineering, as we usually talk about it, belongs to small interactions, it belongs to fragments.&lt;/p&gt;
&lt;p&gt;You ask. It responds. You adjust. It responds again. You both continue this little dance until either the problem is solved or you have spent 40 minutes arguing with an agent about bullet formatting and need to go outside to kick something.&lt;/p&gt;
&lt;p&gt;Task engineering is different.&lt;/p&gt;
&lt;p&gt;Task engineering is not about crafting the perfect prompt. It is about designing a piece of work in a way that a capable model can do it.&lt;/p&gt;
&lt;p&gt;You are not prompting the model.&lt;/p&gt;
&lt;p&gt;You are commissioning work.&lt;/p&gt;
&lt;p&gt;Which feels slightly pompous, so let&#39;s immediately ruin it with a forklift.&lt;/p&gt;
&lt;h3 id=&quot;the-forklift-and-the-stapler&quot;&gt;The forklift and the stapler&lt;/h3&gt;
&lt;p&gt;Imagine someone buys a warehouse forklift.&lt;/p&gt;
&lt;p&gt;A proper big yellow beast. Warning beeper. Rotating light. The kind of machine that gives anyone in a high-vis vest a feeling of authority. It can lift pallets, move heavy loads, rearrange a warehouse, and, if handled poorly, punch a new doorway through a wall.&lt;/p&gt;
&lt;p&gt;Now imagine the team discovers it is useful for moving staplers.&lt;/p&gt;
&lt;p&gt;Someone stands on one side of the office and says, &amp;quot;Can you bring me that stapler?&amp;quot;&lt;/p&gt;
&lt;p&gt;The forklift driver nods, lowers the forks with impressive precision, slides them under the stapler, lifts it with the dignity of a royal procession, reverses slowly, beeping all the way, and delivers the stapler.&lt;/p&gt;
&lt;p&gt;Technically, this is a success.&lt;/p&gt;
&lt;p&gt;The stapler has moved. The forklift performed the task. No one died, which in software counts as a green build.&lt;/p&gt;
&lt;p&gt;But after a while, you would start asking whether perhaps the team had misunderstood the forklift.&lt;/p&gt;
&lt;p&gt;This is where a lot of AI use in development is heading. We have these increasingly capable systems, and we are using them to pass staplers.&lt;/p&gt;
&lt;p&gt;Rename this. Summarise that. Write a helper. Convert this into YAML, the cursed lasagne of configuration formats.&lt;/p&gt;
&lt;p&gt;There is nothing wrong with small tasks. Small tasks exist. Small tasks matter. Sometimes the stapler really does need to be moved, and if the forklift is sitting there, fine, have at it. But if every interaction is a stapler task, the forklift does not change the warehouse. It just makes office stationery more theatrical, and far less economical to share.&lt;/p&gt;
&lt;p&gt;Fable 5 makes the forklift problem obvious. With Fable, tiny tasks are not just wasteful, they are eyewatering expensive.&lt;/p&gt;
&lt;p&gt;Sakana Fugu makes the metaphor worse, because now it is not one forklift. It is a warehouse system that can decide whether the forklift, pallet jack, conveyor belt, barcode scanner, or Dave from dispatch should handle each part of the job.&lt;/p&gt;
&lt;p&gt;Fugu is interesting because it treats orchestration as part of the intelligence.&lt;/p&gt;
&lt;p&gt;That changes the question from &amp;quot;what work should I ask the model to do?&amp;quot; to &amp;quot;how do I design work for a system that can route, coordinate, verify, and combine different kinds of model effort?&amp;quot;&lt;/p&gt;
&lt;p&gt;Which is a much bigger question than &amp;quot;please make this function nicer&amp;quot;.&lt;/p&gt;
&lt;h3 id=&quot;bigger-work-structured-work&quot;&gt;Bigger work, structured work&lt;/h3&gt;
&lt;p&gt;Fable and Fugu point at two different problems hiding inside the same upgrade.&lt;/p&gt;
&lt;p&gt;Fable points at bigger work. What happens when the model can carry more than we know how to hand over?&lt;/p&gt;
&lt;p&gt;The old developer habit is to stay close. Watch the output. Correct every drift. Keep the model inside a safe little paddock where it can graze on helper functions and not frighten the horses. That made sense when the model needed constant supervision, but it becomes a bottleneck when the model can work for longer.&lt;/p&gt;
&lt;p&gt;Instead of hovering over every step, the developer needs to frame the work properly up front and review the result like an owner.&lt;/p&gt;
&lt;p&gt;That is a different kind of discipline.&lt;/p&gt;
&lt;p&gt;Fugu points at structured work. What happens when the model is no longer one thing doing one thing?&lt;/p&gt;
&lt;p&gt;But serious engineering work is rarely one kind of thing.&lt;/p&gt;
&lt;p&gt;Real work to solve real pain needs exploration, planning, code reading, implementation, testing, verification, risk assessment, documentation, and rollback thinking. A single model can attempt all of that, but an orchestrated system can treat the work as a sequence of specialised moves.&lt;/p&gt;
&lt;p&gt;It means developers need to stop thinking only in terms of &amp;quot;the answer I want back&amp;quot; and start thinking in terms of &amp;quot;the work process I want the system to run&amp;quot;.&lt;/p&gt;
&lt;p&gt;Not just &amp;quot;solve this&amp;quot;.&lt;/p&gt;
&lt;p&gt;More like: inspect this, compare options, identify risk, attempt a solution, verify it against the constraints, tell me what remains uncertain, and produce the smallest next step that would let a human decide.&lt;/p&gt;
&lt;p&gt;That sounds suspiciously like engineering, unfortunate for anyone who hoped the future would be less work.&lt;/p&gt;
&lt;h3 id=&quot;the-new-work-is-specifying-work&quot;&gt;The new work is specifying work.&lt;/h3&gt;
&lt;p&gt;A lot of developers are extremely good at implementation and much less practised at saying what the real job is.&lt;/p&gt;
&lt;p&gt;It may feel wasteful to spend an hour or three preparing the material to engineer a task for a seriously big model — it can easily feel wrong because the marketing version of AI productivity is always someone typing a sentence into a glowing box and receiving a miracle before their oat latte gets cold.&lt;/p&gt;
&lt;p&gt;But serious work has never worked like that.&lt;/p&gt;
&lt;p&gt;If you spend three hours building the right context pack and the model saves you two weeks of grinding investigation, that is not inefficiency. That is as close to a miracle as we can get.&lt;/p&gt;
&lt;p&gt;This is also where Fable and Fugu should change how we think about cost. If a model is expensive, slow, or powerful, then using it for cheap little tasks is not disciplined. It is like booking a surgical theatre to trim your fingernails.&lt;/p&gt;
&lt;h3 id=&quot;the-value-is-moving&quot;&gt;The value is moving.&lt;/h3&gt;
&lt;p&gt;As the doing gets cheaper, deciding gets more expensive.&lt;/p&gt;
&lt;p&gt;As implementation gets faster, framing matters more.&lt;/p&gt;
&lt;p&gt;If models can chew through larger chunks of work, the scarce skill becomes knowing which chunks are worth chewing.&lt;/p&gt;
&lt;p&gt;If you were hoping AI would remove the need for judgement, bad news. The judgement bill has arrived, and it has itemised charges.&lt;/p&gt;
&lt;h3 id=&quot;doing-software-wrong-at-the-wrong-size&quot;&gt;Doing software wrong at the wrong size&lt;/h3&gt;
&lt;p&gt;So this is probably the next bit of doing software wrong.&lt;/p&gt;
&lt;p&gt;We will get access to bigger and bigger models. We will keep asking tiny questions. We will spend premium reasoning tokens on boilerplate, summaries, and functions our IDE could have written while asleep. We will complain that the results feel underwhelming.&lt;/p&gt;
&lt;p&gt;Then someone will hand the model a properly scoped, painful, valuable job with enough data and a clear definition of done, and suddenly it will look like witchcraft.&lt;/p&gt;
&lt;p&gt;It will not be witchcraft.&lt;/p&gt;
&lt;p&gt;It will be preparation, which is less exciting but much more useful.&lt;/p&gt;
&lt;p&gt;The future is not developers sitting back while models do everything. The future is developers learning to see larger work. The work that was too big to assign, too boring to prioritise, and too painful to do manually.&lt;/p&gt;
&lt;p&gt;That is the real shift. Not prompt engineering. Not magic. Not job apocalypse. Task engineering.&lt;/p&gt;
&lt;p&gt;The ability to see the bigger job, package it properly, give it to the model, walk away long enough for it to work, and come back ready to judge what it did.&lt;/p&gt;
&lt;p&gt;We will still get it wrong. The model will still get it wrong.&lt;/p&gt;
&lt;p&gt;That is software.&lt;/p&gt;
&lt;p&gt;But maybe we can start getting it wrong at the right size.&lt;/p&gt;
&lt;p&gt;Because if the models are getting bigger and our questions stay tiny, the failure is no longer entirely in the machine.&lt;/p&gt;
&lt;p&gt;The question was too small.&lt;/p&gt;
&lt;p&gt;And as usual, annoyingly, expensively, we are doing software wrong.&lt;/p&gt;
</description>
      <pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/the-forklift-and-stapler/</guid>
    </item>
    <item>
      <title>We’ve Accidentally Created Infinite Features</title>
      <link>https://doingsoftwarewrong.com/blog/weve-accidentally-created-infinite-features/</link>
      <description>&lt;h2 id=&quot;the-productivity-bit-is-real&quot;&gt;The productivity bit is real&lt;/h2&gt;
&lt;p&gt;Recently, I had one of those deeply suspicious moments in my software career where something starts working so well you immediately stop trusting it.&lt;/p&gt;
&lt;p&gt;Not in the dramatic sense. Nothing caught fire. Nobody sent an email that made me feel nauseous. There wasn’t even a keynote involved, which already puts it ahead of most modern technical revolutions. It was just the quiet, disorienting realisation that working with AI had made me, and the team around me, noticeably more productive. Properly productive. The kind of productive where work that used to take a hard week is done before lunch, and looking smug about it.&lt;/p&gt;
&lt;p&gt;I don’t mean this in the vague nonsense way people say “productivity” when they really mean they’ve cancelled three meetings and ordered a nicer chair. I mean actual progress. The work moves. You can get from rough idea to plausible feature much faster than before. You can explore options without feeling like every experiment is going to cost three days and a minor emotional collapse. You can spend less time chiselling individual lines of code out of the side of a mountain and more time thinking about what the feature is supposed to do in the first place.&lt;/p&gt;
&lt;p&gt;One of the best side effects of AI in a development team is that your focus gets to shift upward. Away from the time consuming business of writing code and more towards understanding the shape of the thing. What does this feature actually need to do? How should it behave? What are users trying to achieve? Where are the awkward bits? What happens when the normal happy flow goes off-road and ends up upside down in a ditch?&lt;/p&gt;
&lt;p&gt;That is good work. Proper work, even. Software has always improved when developers spend less time doing syntax carpentry and more time trying to describe what the thing is actually supposed to do.&lt;/p&gt;
&lt;p&gt;But for years, we quietly defined the job as the code.&lt;/p&gt;
&lt;p&gt;That was the craft. The identity. The bit you could point at and say, “this is what I do.”&lt;/p&gt;
&lt;p&gt;AI has made that definition feel incomplete.&lt;/p&gt;
&lt;p&gt;Because now the code turns up quickly, sometimes suspiciously quickly, and you’re left staring at the bit we used to treat as more of a side quest: deciding what should exist in the first place, and whether it’s going to behave itself once real people get involved.&lt;/p&gt;
&lt;p&gt;There is a massive benefit here. Most of the effort has moved from typing to thinking, which is lovely, because typing was never really where the value lived. It was just where the back pain lived.&lt;/p&gt;
&lt;h2 id=&quot;finishing-is-now-the-hard-part&quot;&gt;Finishing is now the hard part&lt;/h2&gt;
&lt;p&gt;But, and this is where software once again shuffles onstage wearing a fake moustache and pretending not to be the same old problem, the productivity uplift is now the new problem.&lt;/p&gt;
&lt;p&gt;Because once you can produce work at warp speed, once the barrier between “we could do this” and “here is a working version of this” gets low enough, your brain starts doing what human brains always do when presented with new power. It becomes insufferably optimistic. You stop seeing a feature as a bounded piece of work and start seeing a thousand adjacent possibilities bobbing around it like overexcited ducklings.&lt;/p&gt;
&lt;p&gt;You sit down to finish one thing and suddenly you’re not really finishing it anymore. You’re expanding it. Improving it. Noticing three other things nearby that could also be improved while you’re in the area. You are five minutes away from adding a form and somehow end up halfway through redesigning a workflow because the machine made the first bit easy and now your mind has wandered off into a nearby field, drunk on possibility.&lt;/p&gt;
&lt;p&gt;I know this because I do it myself. I’m not reporting from a great height here like some stern Victorian headmaster of software discipline. I am one of the idiots in the room getting excited.&lt;/p&gt;
&lt;p&gt;This is where finishing starts to suffer.&lt;/p&gt;
&lt;p&gt;Not because people care less. Almost the opposite, really. It’s because people care so much, and can suddenly imagine so much more, that the satisfying, boring, necessary business of finishing one thing completely begins to feel a bit provincial. A bit small. A bit like staying home to do your taxes when there’s a whole theme park outside and someone has just handed you unlimited ride tokens.&lt;/p&gt;
&lt;p&gt;And the sometimes unpleasant truth about software is that finishing is the job.&lt;/p&gt;
&lt;p&gt;Not starting. Not ideating. Not marvelling at all the wonderful things we might be able to build before the kettle boils. Finishing. Rounding it out. Closing the gaps. Checking the edges. Dealing with the weird state transitions, the ugly error cases, the boring validation, the miserable user path where somebody uploads the wrong file, double-clicks the button, loses their connection, and then phones support as if you personally have hidden their documents in the woods.&lt;/p&gt;
&lt;p&gt;That work still exists. AI has not made it disappear. It can help with parts of it, obviously. It can help generate tests, suggest edge cases, document behaviour, untangle logic, and generally act like a very keen assistant who never gets hungry or asks whether any of this is really the best use of our brief time on earth. But even with that help, there is still a big chunk of evaluation and validation that has to be done by people who understand the system, the product, the trade-offs, and the various exciting ways in which reality tends to ignore our assumptions.&lt;/p&gt;
&lt;p&gt;Currently that evaluation, at least for me, does not move at the same speed as generation.&lt;/p&gt;
&lt;p&gt;That’s the mismatch.&lt;/p&gt;
&lt;p&gt;Because the more AI helps you produce, the easier it is for the team to start feeling that everything can be fixed just as easily. The logic goes a bit like this: if it took less time to build, surely it will take less time to repair. If changes are cheaper, maybe mistakes are less serious. If iteration is faster, perhaps caution is a touch old-fashioned, like adding your name to a waitlist for a new VHS release at Blockbuster.&lt;/p&gt;
&lt;p&gt;This is where your brain tries to start skipping steps.&lt;/p&gt;
&lt;p&gt;Not in some villainous way. Nobody sits there twirling a moustache saying, right, let’s recklessly under-test a feature and see whether we can make support cry. It’s subtler than that. You just feel the temptation to move on a little sooner. You tell yourself the final pass can happen later. The edge case can be tightened up in the next round. The weirdness in the workflow probably isn’t weirdness, it’s just one of those things that feels odd because it’s new. Besides, if it is broken, we can fix it quickly. We’re fast now.&lt;/p&gt;
&lt;p&gt;Maybe you can. In fact, many times you can. That is what makes it dangerous.&lt;/p&gt;
&lt;p&gt;Because once “we can fix it quickly” enters the room, process starts getting treated like a polite suggestion. The last twenty percent of the feature, which was already less glamorous than the first eighty, starts to look almost optional. Not entirely optional, obviously. Just a bit flexible. Something to circle back to after this one interesting idea, and then the next one.&lt;/p&gt;
&lt;h2 id=&quot;ai-has-given-the-team-jet-skis&quot;&gt;AI has given the team jet skis&lt;/h2&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://doingsoftwarewrong.com/img/9leJ2pvg1z-1536.avif 1536w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://doingsoftwarewrong.com/img/9leJ2pvg1z-1536.webp 1536w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://doingsoftwarewrong.com/img/9leJ2pvg1z-1536.png&quot; alt=&quot;AI has given the team jet skis&quot; width=&quot;1536&quot; height=&quot;1024&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The metaphor that keeps turning up in my head is that AI has basically given the whole team jet skis.&lt;/p&gt;
&lt;p&gt;Now, a jet ski is undeniably fun. I have never seen a sad person on a jet ski. That’s part of the issue straight away. It is fast, responsive, and deeply exciting to the person operating it. You do not gently potter about on a jet ski reflecting on the virtues of restraint. You zip. You skim. You turn aggressively for no real reason. You become, for a brief and stupid period, the sort of person who thinks spray counts as progress.&lt;/p&gt;
&lt;p&gt;That’s a lot like my current feeling of building with AI. You can move so quickly across the surface of things that it all starts to feel thrillingly manageable. More features. More variations. More experiments. More tight turns and bursts of speed. Everyone’s having a marvellous time, carving elegant loops across the water and shouting, “look how fast we’re going”.&lt;/p&gt;
&lt;p&gt;The problem, unfortunately, is that software is not a nice open ocean on a sunny afternoon. It is a marina full of posts, ropes, hidden debris, tired old structures, and other people trying to do something sensible nearby. There are rules. There are depth markers. There are bits where you’re absolutely meant to slow down, though nobody likes admitting that. There is also, somewhere off to one side, the poor users standing on the shore, trying to work out why six new vehicles have appeared, all of them half-fuelled, one of them parked at a café, and none of them apparently having passed a proper inspection.&lt;/p&gt;
&lt;p&gt;Then because this is a metaphor and I have clearly lost control of it, support is the harbourmaster, operations is a rescue boat, the product owner is shouting that one of the jet skis was only supposed to be a paddle board, and the executive team is asking whether this means we now have capacity to open a water park.&lt;/p&gt;
&lt;p&gt;That’s roughly where we are.&lt;/p&gt;
&lt;p&gt;Not doomed. Not ruined. The uplift is real. The shift from writing code to understanding and describing functionality is real. The increased ability to explore ideas is real.&lt;/p&gt;
&lt;p&gt;It’s just that the bottleneck has moved, and moved in a way that messes with your head.&lt;/p&gt;
&lt;p&gt;The problem is no longer just getting software produced. The problem is holding your attention steady enough to finish what you started when five more exciting options are now within arm’s reach. Validation still takes time. Judgment still takes time. None of the old boring responsibilities have gone away just because the front end of the process has become dramatically more fluid. Speed creates optimism, and optimism has always been one of the leading causes of software being done wrong.&lt;/p&gt;
&lt;p&gt;So I think that’s the new version of the old mistake.&lt;/p&gt;
&lt;p&gt;For years we thought the pain was in getting the code to work, and now that some of that pain has lifted, we’re discovering the deeper discomfort was elsewhere all along. It was in deciding clearly. It was in finishing properly. It was in resisting the urge to wander off halfway through the feature because another shinier idea just popped out of the machine wearing sequins.&lt;/p&gt;
&lt;p&gt;AI has made teams more capable. I believe that. It has also made distraction more productive, which is an absolutely ridiculous sentence to have to write but seems to be true. You can now make a surprising amount of progress in the wrong direction before lunch, and do it with such confidence that by the time anyone notices, the room is full of half-rounded features and cheerful explanations about how easy it will be to sort them out later.&lt;/p&gt;
&lt;p&gt;Sure, maybe it will be easy.&lt;/p&gt;
&lt;p&gt;But later is where software goes to become expensive.&lt;/p&gt;
&lt;p&gt;So yes, enjoy the uplift. Use it. Shift your attention upward into understanding the product better, because that is where the real value has been hiding all along. Just keep an eye on the other thing AI has quietly made easier, which is getting so excited about what could be built next that you forget to finish the thing right in front of you.&lt;/p&gt;
&lt;p&gt;Because it turns out the hard part was never really writing the code. It was knowing when to stop doing loops of the bay at speed and come back to the shore.&lt;/p&gt;
</description>
      <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/weve-accidentally-created-infinite-features/</guid>
    </item>
    <item>
      <title>Confessions of a reluctant Luddite</title>
      <link>https://doingsoftwarewrong.com/blog/reluctant-luddite/</link>
      <description>&lt;p&gt;I had a moment this week where I genuinely considered becoming a Luddite. Not in a dramatic, delete-all-my-accounts way. In a proper, roll-up-the-sleeves, gather-the-villagers and smash the machinery sort of way.&lt;/p&gt;
&lt;p&gt;Because I realised something slightly unsettling.&lt;/p&gt;
&lt;p&gt;I am in a new Industrial Revolution, and I am the one weaving the textiles.&lt;/p&gt;
&lt;p&gt;Last time I wrote here, I was still comfortably speculating that the change in my job was coming “soon.” Soon is a wonderfully stretchy word. It gives you room. Soon can mean next year. Soon can mean after the next roadmap. Soon can mean once everyone else has figured it out.
Now it just means today.&lt;/p&gt;
&lt;p&gt;I’ve been working with the latest generation of AI models recently. Not here to start a pub brawl about which brand is superior. What matters is the step change. The jump from “helpful autocomplete with good manners” to something that feels like a suspiciously competent colleague who has quietly read your entire codebase and formed opinions.&lt;/p&gt;
&lt;p&gt;Large, complex parts of our system are becoming easy to modify.
And that word, &#39;easy&#39;, feels like a betrayal.&lt;/p&gt;
&lt;p&gt;This is a codebase that grew the way coral reefs grow. Slowly. Layered. Accreted through time and compromise. It contains old architectural ideas, half-finished refactors, comments marked “temporary” that have survived multiple federal governments. Changing it used to require care. You didn’t just edit a file. You negotiated with history. You reasoned through side effects. You felt your way through it like someone defusing a bomb built by your past self.
That was the craft.&lt;/p&gt;
&lt;p&gt;Writing code wasn’t just output. It was the thing. The careful but clumsy naming. The shaping of a function so it read cleanly. The quiet satisfaction of refactoring something awkward into something almost elegant. You chase a kind of singularity of perfection that you never quite reach, but you enjoy the pursuit. You refine that over decades. You build a career on it. If I’m honest, you build a bit of your identity, your “being” on it.&lt;/p&gt;
&lt;p&gt;And now I can describe a change in English in a simple prompt, hand it to a small pool of AI agents, and they go off like diligent mill workers. They update functions, adjust tests, restructure modules, and return with a pull request and a tidy summary of what they did and why. I review. I merge. I move on.&lt;/p&gt;
&lt;p&gt;It feels like I’ve been hand-weaving textiles for years, obsessing over thread tension and pattern symmetry, and suddenly someone wheels in a steam-powered loom. Not just any loom, either. One that reads your sketches, suggests improvements, fixes your inconsistencies, and doesn’t get tired.
I am still in the factory. But I am no longer holding the shuttle.&lt;/p&gt;
&lt;p&gt;That’s the Industrial Revolution part. Not in a smoky Dickensian way. There are no soot-covered children and no factory whistles. There is just a quiet shift in who does the weaving and at what speed.&lt;/p&gt;
&lt;p&gt;Part of me is genuinely thrilled. I have always loved new technology. I was the kid mesmerised by a CD-ROM encyclopaedia because it had moving pictures on a screen that wasn’t monochrome. Later I was burning my own CDs like some suburban DJ convinced I had bent the universe to my will. New tools have always felt like magic to me.&lt;/p&gt;
&lt;p&gt;But magic hits differently when it starts absorbing the part of your craft you loved most.&lt;/p&gt;
&lt;p&gt;I didn’t expect to feel a small grief about writing code. Yet here it is. The act itself, the slow shaping of logic, the wrestling match with a tricky bug, the quiet flow state of getting something just right, that was arguably the most fun and creative part of the job. The bit I’ve spent decades refining.&lt;/p&gt;
&lt;p&gt;Now I spend less time writing and more time describing. Less time implementing and more time directing. The creativity hasn’t vanished, but it has moved up a level. It’s in the framing of problems, the clarity of instruction, the judgement about what should exist at all.
When code becomes cheap, judgement becomes expensive.&lt;/p&gt;
&lt;p&gt;And that is both exciting and unnerving.&lt;/p&gt;
&lt;p&gt;There is a part of me that wants to gather a small band of romantics and smash the machines. To insist that craftsmanship matters, that hand-written code has soul, that we will not surrender our looms without a fight. But this is not 1812. The machines are not in a shed down the road. They are in global data centres the size of suburbs. You cannot smash them. You can barely conceptualise them.&lt;/p&gt;
&lt;p&gt;So the Luddite fantasy fades quickly into practicality.&lt;/p&gt;
&lt;p&gt;The real shift is not that I am being replaced. It’s that my role is dissolving and reforming around me. I am less the carpenter and more the foreman of a factory floor full of robotic arms. They are tireless, context-aware, occasionally wrong but fixable in minutes. They do not care about the poetry of a well-named variable. They care about producing output.&lt;/p&gt;
&lt;p&gt;If I zoom out, this is exactly what an Industrial Revolution looks like. The skill doesn’t disappear. It gets abstracted. It gets scaled. It gets embedded into machinery so that fewer people need to practice it directly.&lt;/p&gt;
&lt;p&gt;We will, of course, handle this badly. We will measure success by pull request volume. We will generate more code than we can sensibly own. We will confuse velocity with value because the graphs look impressive. We will industrialise the wrong parts first, because that is our particular gift as an industry.&lt;/p&gt;
&lt;p&gt;The turning point has already happened for me. The change I thought might take another year or two is in my repo today. My job is not vanishing, but the part I loved most is being quietly automated away.&lt;/p&gt;
&lt;p&gt;I am still excited. I am still that kid staring at a glowing screen thinking this is magic.
I am just also aware that I am no longer weaving every thread myself.
And if history tells us anything, it’s that we are about to do software wrong on a scale previously reserved for textiles.&lt;/p&gt;
</description>
      <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/reluctant-luddite/</guid>
    </item>
    <item>
      <title>I won’t have a job soon. Apparently.</title>
      <link>https://doingsoftwarewrong.com/blog/I-wont-have-a-job-soon/</link>
      <description>&lt;p&gt;There’s been a weird tone creeping into all my conversations lately.&lt;/p&gt;
&lt;p&gt;Not loud panic. Not screaming. Just… a moderate, constant hum. The kind you notice when you stop and realise everyone around you is talking a bit faster than usual.&lt;/p&gt;
&lt;p&gt;Friends ask how work’s going, but they don’t really mean it. Colleagues phrase things like questions that are actually stress tests. People who’ve been calm for years suddenly say things like, “So… how worried are you, actually?”&lt;/p&gt;
&lt;p&gt;And it’s not just tech. Markets are wobbling. Numbers on screens are doing that thing where they drop and bounce and drop again. The price of gold has gone absolutely bananas, which historically means humans have collectively decided they do not trust &lt;em&gt;anything&lt;/em&gt; anymore.&lt;/p&gt;
&lt;p&gt;Gold only does that when people are scared.&lt;br&gt;
Not rational scared.&lt;br&gt;
Primal scared.&lt;br&gt;
Cave-painting scared.&lt;/p&gt;
&lt;p&gt;And in software, that fear has found a very specific shape.&lt;/p&gt;
&lt;h3 id=&quot;is-this-still-a-job&quot;&gt;“Is this… still a job?”&lt;/h3&gt;
&lt;p&gt;Nobody phrases it dramatically. That would be embarrassing.&lt;/p&gt;
&lt;p&gt;Instead it comes out sideways.&lt;/p&gt;
&lt;p&gt;“I’ve noticed fewer junior roles lately.”&lt;br&gt;
“Are you using AI much?”&lt;br&gt;
“Do you think it’s still worth learning to code?”&lt;/p&gt;
&lt;p&gt;These are not technical questions. They’re career survival questions wearing hoodies.&lt;/p&gt;
&lt;p&gt;Underneath all of them is the same thought:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Is this thing I’ve built my life around about to quietly disappear while I’m still paying off a laptop?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And look - it’s not helped by the constant drumbeat of predictions. Software engineering is always apparently six months away from being dead. If you’ve been in the industry long enough, you’ve heard this announcement so often it’s started to feel seasonal, like flu warnings or end-of-year performance reviews.&lt;/p&gt;
&lt;p&gt;But this time it’s different, they say.&lt;/p&gt;
&lt;p&gt;Because this time there’s AI.&lt;/p&gt;
&lt;h3 id=&quot;i-ve-already-been-obsolete-once&quot;&gt;I’ve already been obsolete once&lt;/h3&gt;
&lt;p&gt;The thing is, this isn’t even the first time I’ve been told my career was ending.&lt;/p&gt;
&lt;p&gt;The last time this happened - or at least the last time it happened &lt;em&gt;this loudly&lt;/em&gt; - it was app builders.&lt;/p&gt;
&lt;p&gt;You might remember them. Or maybe you’ve successfully repressed the memory.&lt;/p&gt;
&lt;p&gt;They were going to democratise software.&lt;br&gt;
They were going to empower “regular business users”.&lt;br&gt;
They were going to let anyone drag, drop, and click their way to software supremacy.&lt;/p&gt;
&lt;p&gt;No developers required.&lt;/p&gt;
&lt;p&gt;That was the pitch.&lt;/p&gt;
&lt;p&gt;Somewhere around the early 2010s, every second demo involved a smiling product manager assembling an app on stage like it was IKEA furniture.&lt;/p&gt;
&lt;p&gt;Look - a button.&lt;br&gt;
Look - a form.&lt;br&gt;
Look - an entire mobile application built in fifteen minutes while a developer quietly contemplated retraining as a barista.&lt;/p&gt;
&lt;p&gt;They had friendly names. App builders. Visual builders. Low-code. No-code. Tools that promised software without software people.&lt;/p&gt;
&lt;p&gt;And for a while, the panic was real.&lt;/p&gt;
&lt;p&gt;Because the promise was always the same one we’re hearing now:&lt;/p&gt;
&lt;p&gt;“Why would you need developers when the business can just build it themselves?”&lt;/p&gt;
&lt;h3 id=&quot;what-actually-happened-last-time&quot;&gt;What actually happened last time&lt;/h3&gt;
&lt;p&gt;Here’s what didn’t happen.&lt;/p&gt;
&lt;p&gt;Developers did not disappear.&lt;br&gt;
Software did not magically become simple.&lt;br&gt;
Complex systems did not politely collapse into drag-and-drop rectangles.&lt;/p&gt;
&lt;p&gt;What &lt;em&gt;did&lt;/em&gt; happen was familiar.&lt;/p&gt;
&lt;p&gt;These tools were great at simple things.&lt;br&gt;
Internal tools.&lt;br&gt;
Forms.&lt;br&gt;
Dashboards.&lt;br&gt;
Prototypes that looked convincing enough to get budget approval.&lt;/p&gt;
&lt;p&gt;And then reality showed up.&lt;/p&gt;
&lt;p&gt;Because the moment someone asked for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;real integrations&lt;/li&gt;
&lt;li&gt;real security&lt;/li&gt;
&lt;li&gt;real performance&lt;/li&gt;
&lt;li&gt;real edge cases&lt;/li&gt;
&lt;li&gt;or anything involving “just one small exception”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…a developer was summoned. Usually urgently. Usually late.&lt;/p&gt;
&lt;p&gt;The business-built apps either grew until they needed engineering help, or quietly died and were replaced by something “more robust”, which is management speak for “we’re hiring engineers again”.&lt;/p&gt;
&lt;p&gt;The tools didn’t kill the profession.&lt;/p&gt;
&lt;p&gt;They just changed the edges of it.&lt;/p&gt;
&lt;p&gt;Which should sound extremely familiar right now.&lt;/p&gt;
&lt;h3 id=&quot;the-mistake-we-always-make&quot;&gt;The mistake we always make&lt;/h3&gt;
&lt;p&gt;The mistake we always make is pretending this is a purely technical question.&lt;/p&gt;
&lt;p&gt;Every discussion about AI replacing developers eventually lands on the same argument:&lt;/p&gt;
&lt;p&gt;“Is the technology good enough yet?”&lt;/p&gt;
&lt;p&gt;Can it write code?&lt;br&gt;
Can it debug?&lt;br&gt;
Can it design systems?&lt;br&gt;
Can it replace people?&lt;/p&gt;
&lt;p&gt;But that’s only half the problem. The other half is people. And people are the reason software has never behaved the way the diagrams said it would.&lt;/p&gt;
&lt;p&gt;Here’s the uncomfortable truth:&lt;/p&gt;
&lt;p&gt;Even if AI-generated code was terrible - for example, didn’t compile, hallucinated APIs, confidently broke production - it still wouldn’t stop companies from trying to replace engineers with it.&lt;/p&gt;
&lt;p&gt;Because leaders don’t adopt technology based on technical correctness. They adopt it based on optimism, pressure, and the haunting fear of being the last person at the table not “doing AI”.&lt;/p&gt;
&lt;p&gt;So whether AI can replace programmers is only 50% of the equation.&lt;/p&gt;
&lt;p&gt;Whether people &lt;em&gt;believe&lt;/em&gt; it can is the other 50%.&lt;/p&gt;
&lt;p&gt;And belief has a long, proud history of ignoring reality.&lt;/p&gt;
&lt;h3 id=&quot;like-many-things-its-a-spectrum&quot;&gt;Like many things it&#39;s a spectrum&lt;/h3&gt;
&lt;p&gt;At one end of the spectrum, AI automates every technical job, the economy collapses, and it doesn’t matter what you studied because society has turned into a slow-moving apology.&lt;/p&gt;
&lt;p&gt;At the other end, AI never improves beyond today, companies lose interest, and everything stays basically the same forever.&lt;/p&gt;
&lt;p&gt;Neither of those is going to happen.&lt;/p&gt;
&lt;p&gt;Reality, as always, is messier and more annoying.&lt;/p&gt;
&lt;h3 id=&quot;the-job-survives-but-stops-looking-like-the-job&quot;&gt;The job survives, but stops looking like the job&lt;/h3&gt;
&lt;p&gt;My prediction is the job survives, but stops looking like the job.&lt;/p&gt;
&lt;p&gt;What’s already happening - quietly, unevenly - is that AI is eating the boring parts of programming.&lt;/p&gt;
&lt;p&gt;The loops.&lt;br&gt;
The boilerplate.&lt;br&gt;
The test scaffolding.&lt;br&gt;
The documentation.&lt;br&gt;
The deployment pipelines.&lt;br&gt;
The code you never loved but had to write anyway.&lt;/p&gt;
&lt;p&gt;Developers aren’t vanishing. They’re just typing less.&lt;/p&gt;
&lt;p&gt;The job shifts toward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;making architectural decisions&lt;/li&gt;
&lt;li&gt;translating vague human desires into something a system can survive&lt;/li&gt;
&lt;li&gt;debugging when the AI confidently claims it fixed the issue and absolutely did not&lt;/li&gt;
&lt;li&gt;understanding how large systems fail in ways nobody predicted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is why the junior market feels strange. The traditional “learn syntax by suffering” path is shrinking, while the ability to reason about systems is becoming the actual work much earlier.&lt;/p&gt;
&lt;p&gt;What we used to call “senior skills” are slowly turning into table stakes.&lt;/p&gt;
&lt;h3 id=&quot;coding-isn-t-the-job-anymore-it-s-the-literacy&quot;&gt;Coding isn’t the job anymore. It’s the literacy.&lt;/h3&gt;
&lt;p&gt;When people ask if it’s still worth learning to code, they’re usually asking the wrong question.&lt;/p&gt;
&lt;p&gt;The real question is whether it’s still worth understanding how software works.&lt;/p&gt;
&lt;p&gt;And the answer to that is yes - because everything else depends on it.&lt;/p&gt;
&lt;p&gt;You can’t debug what you don’t understand.&lt;br&gt;
You can’t supervise AI output if you don’t know when it’s lying politely.&lt;br&gt;
You can’t make good decisions about systems you can’t read.&lt;/p&gt;
&lt;p&gt;Typing code might become optional.&lt;/p&gt;
&lt;p&gt;Understanding it will not.&lt;/p&gt;
&lt;h3 id=&quot;or-the-job-disappears-and-comes-back-with-a-new-name&quot;&gt;Or the job disappears and comes back with a new name&lt;/h3&gt;
&lt;p&gt;Another possibility - maybe later down the track - is that the job disappears and reappears under a different name.&lt;/p&gt;
&lt;p&gt;There’s a future where “software engineer” quietly stops being a title, not because the work is gone, but because it’s reorganised.&lt;/p&gt;
&lt;p&gt;Instead of writing code, technical people:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;oversee AI systems&lt;/li&gt;
&lt;li&gt;investigate when those systems build the wrong thing&lt;/li&gt;
&lt;li&gt;design workflows that stop automation from amplifying mistakes&lt;/li&gt;
&lt;li&gt;explain to leadership why “just let the AI handle it” has again caused fire&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because even in a heavily automated world, decision-makers still want a human to tell them what to do. Accountability doesn’t scale as well as software does.&lt;/p&gt;
&lt;p&gt;And the future - whatever else it is - is still extremely technical.&lt;/p&gt;
&lt;h3 id=&quot;the-uncomfortable-boring-conclusion&quot;&gt;The uncomfortable, boring conclusion&lt;/h3&gt;
&lt;p&gt;If your dream was a career spent typing code by hand forever, untouched by automation, then yes - that’s probably a risky bet.&lt;/p&gt;
&lt;p&gt;But if you’re comfortable adapting, learning, and doing work that sits &lt;em&gt;around&lt;/em&gt; code rather than &lt;em&gt;inside&lt;/em&gt; it, then no. It’s not too late.&lt;/p&gt;
&lt;p&gt;The fear is understandable. When markets shake and gold spikes, everyone starts scanning the horizon for exits. Software people are no different.&lt;/p&gt;
&lt;p&gt;But software has always been wrong.&lt;br&gt;
The predictions have always been wrong.&lt;br&gt;
And the job has always changed faster than the headlines admit.&lt;/p&gt;
&lt;p&gt;If you feel unsettled, uncertain, and slightly behind no matter what you do - congratulations.&lt;/p&gt;
&lt;p&gt;You’re not failing.&lt;/p&gt;
&lt;p&gt;You’re just falling into the trap of thinking you are doing software wrong.&lt;/p&gt;
&lt;p&gt;Exactly like the rest of us.&lt;/p&gt;
</description>
      <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/I-wont-have-a-job-soon/</guid>
    </item>
    <item>
      <title>Process is not your saviour</title>
      <link>https://doingsoftwarewrong.com/blog/process-is-not-your-saviour/</link>
      <description>&lt;p&gt;Sometimes there is that person in a meeting - the one whose Miro board is a web of arrows and sticky notes like a detective’s evidence board - who announces that the reason everything is on fire is because we are not following &lt;strong&gt;The Process™&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you have ever been part of a development team you are probably familiar with the moment.&lt;/p&gt;
&lt;p&gt;Everyone else is staring at the floor, wondering if now a good time is to fake a coughing fit or a heart attack, and this person is pointing earnestly at a burndown chart like it’s the missing map to the Ark of the Covenant and they are Indiana Jones.&lt;/p&gt;
&lt;p&gt;According to them, all we need to do is follow the steps.&lt;/p&gt;
&lt;p&gt;Stand-ups, retros, peer reviews, planning poker, Fibonacci fibbing, sprint planning, Kanban cleansing, whatever the ritual is.&lt;/p&gt;
&lt;p&gt;Just follow &lt;strong&gt;The Process™&lt;/strong&gt; and all shall be well; the fires will be extinguished and software delivered on time.&lt;/p&gt;
&lt;p&gt;It is adorable, honestly.&lt;/p&gt;
&lt;h2 id=&quot;the-part-no-one-wants-to-admit&quot;&gt;The part no one wants to admit&lt;/h2&gt;
&lt;p&gt;Want to know a secret?&lt;br&gt;
&lt;strong&gt;The process barely matters.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I know, it’s heresy. Put the pitchforks away - at least for a moment.&lt;/p&gt;
&lt;p&gt;Of course, a good process helps. It brings order to the chaos and avoids the need for late-night emergency “HOTFIX” commits on a broken build.&lt;/p&gt;
&lt;p&gt;But a process only works when the people using it actually want to work together.&lt;/p&gt;
&lt;p&gt;When the team cares about the problem. When they want to solve it, not just move tickets around like they’re playing a Scrum-themed shell game.&lt;/p&gt;
&lt;p&gt;There is no process in the world that can fix a team that fundamentally does not want to be a team.&lt;/p&gt;
&lt;p&gt;This is the part missed in many methodology books.&lt;/p&gt;
&lt;p&gt;You won’t find it highlighted in the Agile Manifesto or any of the glossy product-management presentations that look like they were designed by a TED Talk intern.&lt;/p&gt;
&lt;p&gt;Software is less a project with an end date and more a &lt;a href=&quot;https://doingsoftwarewrong.com/blog/deploy-and-done&quot;&gt;relationship&lt;/a&gt; that never really ends, no matter how much you want it to.&lt;/p&gt;
&lt;p&gt;Software is a relationship
Between humans.
Who are famously terrible at aligning on anything.&lt;/p&gt;
&lt;h2 id=&quot;developers-vs-the-real-problem&quot;&gt;Developers vs the real problem&lt;/h2&gt;
&lt;p&gt;In my experience developers love a good technical puzzle.&lt;/p&gt;
&lt;p&gt;Give them a weird concurrency issue or an API that returns something that looks like JSON but smells like pain, and they’re happy for days.&lt;/p&gt;
&lt;p&gt;But people problems?
&lt;em&gt;&lt;strong&gt;Holy shit.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You’d think you’d asked them to refactor their childhood trauma.&lt;/p&gt;
&lt;p&gt;The minute the challenge becomes interpersonal instead of technical - misaligned expectations, unclear decisions, passive-aggressive Slack messages, that one product owner who schedules meetings at 4:30pm on a Friday - developers disengage.&lt;/p&gt;
&lt;p&gt;They retreat back into the safe warm glow of their editor windows, where the only arguments are the ones in their own code.&lt;/p&gt;
&lt;p&gt;This is also why I believe support and production work turns so many developers into functioning adults. It forces them to confront… people. Real ones. With feelings. And caps-lock keys.&lt;/p&gt;
&lt;h2 id=&quot;row-row-row-your-boat&quot;&gt;Row, row, row your boat&lt;/h2&gt;
&lt;p&gt;Imagine your team is a rowing crew.&lt;/p&gt;
&lt;p&gt;Now, imagine half the team is rowing, a quarter is arguing about whether rowing is technically the right process for going forward, one person is refactoring the oar because “the old one was inefficient”, and another person is scared of conflict, so they’ve quietly slid off the boat and are swimming beside it hoping no one notices.&lt;/p&gt;
&lt;p&gt;And the process consultant - clipboard, sun-visor, the whole aesthetic - is yelling from the riverbank:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“You’re not following the process; your stroke is not in the correct sequence!”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mate, the stroke sequence is the least of our problems.&lt;/p&gt;
&lt;p&gt;We’re sinking. Some of us are literally in the water.&lt;/p&gt;
&lt;p&gt;A rowing process only works when the crew wants to row in the same direction.&lt;/p&gt;
&lt;p&gt;Software is no different.&lt;/p&gt;
&lt;p&gt;Humans first, technique second, oars third, and maybe a boat if we’re lucky.&lt;/p&gt;
&lt;h2 id=&quot;it-s-never-about-the-process&quot;&gt;It’s never about the process&lt;/h2&gt;
&lt;p&gt;Yes, follow a process - it might help you sleep at night.&lt;/p&gt;
&lt;p&gt;But don’t build a shrine to it.&lt;/p&gt;
&lt;p&gt;Don’t pretend it’s going to rescue you from miscommunication, apathy, or that one teammate who reads Jira tickets with all the focus of a cat glancing at a vacuum cleaner: vaguely aware something is happening, but absolutely not engaging.&lt;/p&gt;
&lt;p&gt;Software is hard because &lt;strong&gt;people&lt;/strong&gt; are hard.&lt;/p&gt;
&lt;p&gt;The tech is always the easy bit. Tech problems sit still and wait to be solved.&lt;/p&gt;
&lt;p&gt;People problems multiply like well-fed gremlins after midnight. They’re renewable, persistent, and forever eager to ruin your day.&lt;/p&gt;
&lt;p&gt;The teams that manage to get it right - or at least less wrong - are the ones who actually give a shit.&lt;/p&gt;
&lt;p&gt;They want to build something together.&lt;/p&gt;
&lt;p&gt;They treat collaboration as a team sport instead of an optional side quest.&lt;/p&gt;
&lt;p&gt;They tolerate each other’s habits long enough to get the thing out the door.&lt;/p&gt;
&lt;p&gt;Almost any process works to deliver software &lt;strong&gt;when the people care&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Not a single one works when they don’t.&lt;/p&gt;
&lt;p&gt;If that sounds grumpy? Good.&lt;/p&gt;
&lt;p&gt;If it sounds dismissive of &lt;strong&gt;The Process™&lt;/strong&gt;? Also good.&lt;/p&gt;
&lt;p&gt;Because if you are building software and trusting &lt;strong&gt;The Process™&lt;/strong&gt;, you’re almost certainly doing it wrong - exactly on schedule.&lt;/p&gt;
</description>
      <pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/process-is-not-your-saviour/</guid>
    </item>
    <item>
      <title>The framework isn’t for you. You’re just along for the voyage.</title>
      <link>https://doingsoftwarewrong.com/blog/javascript-frameworks/</link>
      <description>&lt;p&gt;I was trying to build a survey form. Just a text box or two, a dropdown maybe, and a button.
Nothing crazy – no fancy gradients, no animations that make buttons behave like they are auditioning for a Pixar film. Just a boring, run-of-the-mill form with a button that says “Submit”.&lt;/p&gt;
&lt;p&gt;Five minutes of work, I thought. Maybe ten if I forgot how HTML works again.&lt;/p&gt;
&lt;p&gt;Many hours later I had installed a CLI, a bundler, selected a starter template, and more packages than Santa delivers to the nice kids at Christmas.
It started as a tiny task, and now I’m in dependency purgatory wondering if the form even needs to exist.&lt;/p&gt;
&lt;p&gt;At some point, while watching my editor freeze under the weight of its own &lt;code&gt;node_modules&lt;/code&gt; folder, I started suspecting the form was no longer in my control. It had outgrown me.&lt;/p&gt;
&lt;p&gt;It had ambitions.
This wasn’t a form anymore.
This was a journey.
A voyage.&lt;/p&gt;
&lt;p&gt;And the framework, whatever it was, had quietly promoted itself to captain.&lt;/p&gt;
&lt;h2 id=&quot;the-realisation-that-the-framework-has-its-own-agenda&quot;&gt;The realisation that the framework has its own agenda&lt;/h2&gt;
&lt;p&gt;This is the part no one tells you when you reach for a JavaScript framework: &lt;strong&gt;it wasn’t built for you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Oh, it wants you to think it was. It wants you to feel special. It whispers sweet promises like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Look how fast we hot-reload!”&lt;/li&gt;
&lt;li&gt;“Look how elegant our file structure is!”&lt;/li&gt;
&lt;li&gt;“Look how little code you have to write!”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But that’s bait. Pure developer catnip.&lt;/p&gt;
&lt;p&gt;Because frameworks are built for a lot of reasons, and almost none of those reasons are &lt;em&gt;“so your product will be delightful, stable, and low maintenance for you or for your users.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The reasons frameworks are built are one or more of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the maintainers’ careers&lt;/li&gt;
&lt;li&gt;corporate influence&lt;/li&gt;
&lt;li&gt;ecosystem dominance&lt;/li&gt;
&lt;li&gt;conference applause&lt;/li&gt;
&lt;li&gt;and the irresistible urge to reinvent a perfectly functional wheel using 80% configuration and a touch of YAML - also known as the “I can do that better” argument.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What about your users, your deadlines, and your actual business needs?&lt;/p&gt;
&lt;p&gt;They weren’t even in the room.&lt;/p&gt;
&lt;p&gt;Frameworks are entire worlds bent around the desires of the people who build them. And that’s fine, mostly. As long as you understand the deal.&lt;/p&gt;
&lt;h2 id=&quot;why-frameworks-are-free-and-why-that-should-concern-you-slightly&quot;&gt;Why frameworks are free, and why that should concern you slightly&lt;/h2&gt;
&lt;p&gt;They are free because if they weren’t, nobody would use them.&lt;/p&gt;
&lt;p&gt;They are free because adoption equals power.&lt;/p&gt;
&lt;p&gt;They are free because “free” lets creators test ideas on thousands of unsuspecting developers who just wanted a dropdown.&lt;/p&gt;
&lt;p&gt;And when something is free, &lt;strong&gt;you are not the customer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You are the product.&lt;/p&gt;
&lt;p&gt;You wouldn’t download a free dog and then complain that it barks. You wouldn’t be gifted a free house only to demand they repaint it mauve.&lt;/p&gt;
&lt;p&gt;But with frameworks, we not only look the proverbial gift horse in the mouth - we complain about its breath.&lt;/p&gt;
&lt;p&gt;We act shocked that we don’t have any say in how they evolve.&lt;/p&gt;
&lt;p&gt;Why would you? It’s free.&lt;/p&gt;
&lt;h2 id=&quot;this-is-how-you-end-up-the-reluctant-owner-of-a-cargo-ship&quot;&gt;This is how you end up the reluctant owner of a cargo ship&lt;/h2&gt;
&lt;p&gt;At some point in my little form adventure I had a realisation:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I didn’t pick a framework. I boarded a cargo ship. A cargo ship that I own but I am not in charge of.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I wanted a small rowboat - something small and calm, something simple. Yes, it may be a bit leaky, but it would be fine for my purposes.&lt;/p&gt;
&lt;p&gt;But instead, I ended up on a vessel that can only turn if the moon is in the correct phase.&lt;/p&gt;
&lt;p&gt;The framework is enormous.
It has opinions.
It has mechanisms.
It has interfaces that interface with other interfaces that you never asked to interface with anything.&lt;/p&gt;
&lt;p&gt;It wasn’t built for my tiny cross-the-river errand.
It was built for transoceanic routes, shipping lanes, ballast calculations, and complex global logistics I will never understand.&lt;/p&gt;
&lt;p&gt;And just like a real cargo ship, it’s going to require a crew, a maintenance schedule, a surprisingly large amount of fuel, and a commitment to learning what all those buttons do.&lt;/p&gt;
&lt;p&gt;One does not simply “add a form” on a cargo ship.
One schedules a deployment window, checks the tide, files the documentation, rebalances the containers, and hopes the weather holds.&lt;/p&gt;
&lt;h2 id=&quot;the-twist-it-s-okay-as-long-as-you-know-the-deal&quot;&gt;The twist? It’s okay, as long as you know the deal&lt;/h2&gt;
&lt;p&gt;Here’s the thing. Frameworks aren’t bad. They aren’t villains. They aren’t plotting against you, even if the documentation occasionally feels like a trap.&lt;/p&gt;
&lt;p&gt;They’re just… &lt;strong&gt;not for you.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They’re built for the ecosystem, for the maintainers, for the job market, for the people who love building frameworks.&lt;/p&gt;
&lt;p&gt;You’re allowed on board. You’re even encouraged to wander around and touch the machinery. But you are &lt;strong&gt;not steering the ship.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The moment you accept that, everything becomes less frustrating.&lt;/p&gt;
&lt;p&gt;Yes, the framework will change in ways that inconvenience you.
Yes, the next major version will break something, if not everything important.
Yes, the migration guide will be vague in all the places you needed it to be specific.&lt;/p&gt;
&lt;p&gt;But that’s the price of being a passenger on someone else’s vessel.&lt;/p&gt;
&lt;p&gt;Your job is to get your form built and shipped without falling overboard.&lt;/p&gt;
&lt;h2 id=&quot;doing-software-wrong-nautical-edition&quot;&gt;Doing software wrong, nautical edition&lt;/h2&gt;
&lt;p&gt;We all want to believe we are in control of our tools. That the choices we make are rational and centred around our users. That a framework is a partner who has our backs, rather than a large industrial machine humming under our feet with little care if we succeed or fail.&lt;/p&gt;
&lt;p&gt;But the truth is simpler, and slightly funnier:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sometimes you’re not doing software so much as hitching a ride on someone else’s engineering adventure.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And that’s fine.&lt;/p&gt;
&lt;p&gt;It’s wrong, of course. But it’s the kind of wrong that everyone is doing, loudly, proudly, and with a nauseating number of dependencies.&lt;/p&gt;
&lt;p&gt;Now if you’ll excuse me, I need to update my form. Which, judging by the size of this vessel, is probably going to require a couple of tugboats, and a local pilot, and maybe a bribe.&lt;/p&gt;
</description>
      <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/javascript-frameworks/</guid>
    </item>
    <item>
      <title>Plug it in and make it magic</title>
      <link>https://doingsoftwarewrong.com/blog/plug-in-ai-magic/</link>
      <description>&lt;p&gt;There’s a new phase in the corporate lifecycle - somewhere between “we need to modernise” and “someone please find the person who owned this spreadsheet” - where an executive suddenly sits up, eyes glowing with the confidence of someone who has not read a single technical document since 2009, and declares:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“We need AI.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It’s said with the certainty of a man spotting a new cordless tool in Bunnings. They don’t know what it does, but they want, no, they need it in the garage.&lt;/p&gt;
&lt;p&gt;No one asks what problem AI is supposed to solve.&lt;br&gt;
No one asks whether the data is ready.&lt;br&gt;
No one asks why the company still can’t reliably onboard a new starter without summoning three separate departments and a ritual sacrifice.&lt;/p&gt;
&lt;p&gt;Because asking questions complicates things. And executives don’t want complexity.&lt;/p&gt;
&lt;p&gt;They want magic.&lt;/p&gt;
&lt;h2 id=&quot;the-comforting-illusion-of-the-ai-strategy-slide&quot;&gt;The comforting illusion of the ‘AI Strategy’ slide&lt;/h2&gt;
&lt;p&gt;There’s something soothing about the idea that AI will glide into the organisation like a benevolent wizard, tap its wand on the servers, and suddenly all the messy, human, organisational nonsense will sort itself out.&lt;/p&gt;
&lt;p&gt;Staff will stop entering dates in 14 different formats.&lt;/p&gt;
&lt;p&gt;Old processes will melt away like snow in spring.&lt;/p&gt;
&lt;p&gt;Those systems nobody has touched since all the monitors were big ivory boxes will become “integrated”.&lt;/p&gt;
&lt;p&gt;In the executive imagination, AI arrives the same way the hero does in a Marvel movie:
just in time, perfectly choreographed, hair blowing in the breeze.&lt;/p&gt;
&lt;p&gt;Never mind that the data is a series of disconnected puddles in a swamp of different machines.&lt;/p&gt;
&lt;p&gt;Never mind that your workflows require a map, a compass, and emotional resilience.&lt;/p&gt;
&lt;p&gt;Never mind that half your systems communicate via Excel export as attachments and hope.&lt;/p&gt;
&lt;p&gt;Magic is appealing. Reality is not.&lt;/p&gt;
&lt;h2 id=&quot;but-reality-keeps-poking-its-head-round-the-door&quot;&gt;But reality keeps poking its head round the door&lt;/h2&gt;
&lt;p&gt;The uncomfortable truth is that AI is perfectly capable of solving problems -
just probably not your problems.&lt;/p&gt;
&lt;p&gt;At least not until you fix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the processes everyone follows differently&lt;/li&gt;
&lt;li&gt;the workflows nobody owns&lt;/li&gt;
&lt;li&gt;the data pipelines held together with sticky tape&lt;/li&gt;
&lt;li&gt;the reporting layer built entirely by Bob, who retired without handover&lt;/li&gt;
&lt;li&gt;the documentation last updated just after the dinosaurs died.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Companies want AI the same way people want a robot vacuum: press the button, walk away, and imagine the house is gently tidying itself while you contemplate your leadership principles.&lt;/p&gt;
&lt;p&gt;But AI is not the robot vacuum itself. AI is more the moment you finally buy a robot vacuum, set it loose, and discover that your home is 60% cable spaghetti, 20% abandoned socks, and 20% “mysterious debris.”&lt;/p&gt;
&lt;p&gt;The robot doesn’t clean - it loudly and enthusiastically alerts you to every corner of your home you have neglected for a decade.&lt;/p&gt;
&lt;p&gt;And AI behaves the same way:&lt;/p&gt;
&lt;p&gt;You didn’t want a vacuum.&lt;/p&gt;
&lt;p&gt;You wanted the comforting illusion that your mess would remain theoretical.&lt;/p&gt;
&lt;h2 id=&quot;the-magic-button-problem&quot;&gt;The “Magic Button” problem&lt;/h2&gt;
&lt;p&gt;There is always - always - someone who asks if AI can just “look at all our data and tell us what’s wrong.”&lt;/p&gt;
&lt;p&gt;This is organisational astrology. They want the AI equivalent of reading star charts: “Your KPIs are low because Mercury is in retrograde… and also Karen keeps overriding the CRM data manually.”&lt;/p&gt;
&lt;p&gt;They want a glowing dashboard that says:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI SUMMARY: EVERYTHING IS FINE EXCEPT THAT ONE TEAM YOU SECRETLY SUSPECTED ANYWAY.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They want the machine to be omniscient, decisive, and conveniently aligned with their pre-existing biases.&lt;/p&gt;
&lt;p&gt;And maybe, one day in the far future, when our brains are uploaded to servers and nobody uses spreadsheets anymore because we’ve evolved past pain - maybe then AI will tell you your organisational destiny.&lt;/p&gt;
&lt;p&gt;But today?&lt;/p&gt;
&lt;p&gt;AI is basically the world’s most sophisticated amplifier. Whatever mess you give it, it will give you back a louder, more expensive version of that mess.&lt;/p&gt;
&lt;h2 id=&quot;ai-as-a-metaphorical-house-renovation&quot;&gt;AI as a metaphorical house renovation&lt;/h2&gt;
&lt;p&gt;Think of AI like hiring a tradie to renovate your kitchen.&lt;/p&gt;
&lt;p&gt;You call them in, expecting new worktops and sleek appliances, the whole Pinterest perfect fantasy.&lt;/p&gt;
&lt;p&gt;But the tradie walks in, looks at the walls, taps a few beams, and says: “Yes, lovely idea, but your house is actually… well… a bit shit.”&lt;/p&gt;
&lt;p&gt;Then they take out their iPad full of photos of all the flaws, faults and expensive f#$k ups in your house you didn’t want to see.&lt;/p&gt;
&lt;p&gt;This is what most AI projects are: a very polite professional pointing at everything structurally wrong with your organisation.&lt;/p&gt;
&lt;p&gt;The data silos? Rotten floorboards.&lt;br&gt;
The 87-step approval process? A load-bearing mistake.&lt;br&gt;
The operational workflow written by someone who left in 2014? An electrical hazard wrapped in nostalgia.&lt;/p&gt;
&lt;p&gt;AI reveals the nonsense. It does not cover it up with quartz countertops.&lt;/p&gt;
&lt;h2 id=&quot;the-deeply-unsexy-prerequisites-of-being-ready-for-ai&quot;&gt;The deeply unsexy prerequisites of “being ready for AI”&lt;/h2&gt;
&lt;p&gt;If companies truly want AI to work - really work - they need to do the things that never make it into keynote speeches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;define a process&lt;/li&gt;
&lt;li&gt;stick to the process&lt;/li&gt;
&lt;li&gt;pick a single source of truth&lt;/li&gt;
&lt;li&gt;clean the data&lt;/li&gt;
&lt;li&gt;centralise the data&lt;/li&gt;
&lt;li&gt;stop emailing Excel sheets around like digital carrier pigeons&lt;/li&gt;
&lt;li&gt;retire systems old enough to vote&lt;/li&gt;
&lt;li&gt;document everything - literally everything.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI is not the prize you get for announcing ambition. AI is the prize you get for doing the boring, tedious, organisational homework that everyone has avoided for years.&lt;/p&gt;
&lt;p&gt;And yes, this is exactly why so few companies actually get value from it.&lt;/p&gt;
&lt;h2 id=&quot;doing-software-wrong-but-now-with-a-robot&quot;&gt;Doing software wrong… but now with a robot&lt;/h2&gt;
&lt;p&gt;This is just the next chapter of the same saga we always live through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the belief that software becomes “done” just because it ships&lt;/li&gt;
&lt;li&gt;the belief that support is someone else’s problem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI doesn’t replace these delusions. It simply adds a shiny chrome finish.
You’re not supposed to get it perfect. You’re supposed to get it less wrong than yesterday.&lt;/p&gt;
&lt;p&gt;Fix your data. &lt;br&gt;
Fix your processes. &lt;br&gt;
Fix the ancient systems quietly decaying in the corner like a neglected house plant withered and drying to dust.&lt;/p&gt;
&lt;p&gt;Then - and only then - AI will stop being a corporate fantasy and start being genuinely useful.&lt;/p&gt;
&lt;p&gt;And if that feels disappointing, congratulations.&lt;br&gt;
You’re doing software wrong. Exactly as intended.&lt;/p&gt;
</description>
      <pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/plug-in-ai-magic/</guid>
    </item>
    <item>
      <title>The best education your developers never got</title>
      <link>https://doingsoftwarewrong.com/blog/support-as-learning/</link>
      <description>&lt;p&gt;I didn’t start my career thinking I’d one day be yelled at by a stranger because a button didn’t do what they expected. Or that I’d have managers calling me demanding to know why someone’s data had &amp;quot;f%$ked off into the ether”, as though the system had achieved sentience and developed a personal grudge.&lt;/p&gt;
&lt;p&gt;But here we are.&lt;/p&gt;
&lt;p&gt;If you’ve never supported software, you probably imagine an inbox with a few polite bug reports. Maybe a suggestion here, a gentle query there. Lovely.&lt;/p&gt;
&lt;p&gt;What you actually get is a crash course in human emotion under duress.&lt;/p&gt;
&lt;p&gt;That’s where developers really learn how software works - not on their expensive laptops in perfect conditions, but in the messy, angry, unpredictable wild.&lt;/p&gt;
&lt;h2 id=&quot;the-moment-everything-falls-apart&quot;&gt;The moment everything falls apart&lt;/h2&gt;
&lt;p&gt;You can write code for years without realising what it’s like on the support side of the fence. The side where user emotions are raw, stakes are high, and people have absolutely no interest in whether your sprint velocity improved this quarter.&lt;/p&gt;
&lt;p&gt;I still remember the emails.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The angry ones.&lt;/li&gt;
&lt;li&gt;The ones written entirely in CAPITAL LETTERS.&lt;/li&gt;
&lt;li&gt;The ones that arrive at 6:13am before you’ve had a Red Bull and are essentially hate mail directed at a function you refactored three months ago.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And then there are the managers who absolutely &lt;strong&gt;lose their shit&lt;/strong&gt; because a user spent hours entering data that “just disappeared”. You try to explain that the workflow wasn’t designed to do that, or that their browser session expired, or that pressing back three times and refreshing does not do what they think it does.&lt;/p&gt;
&lt;p&gt;They don’t care.
They’ve lost tens of thousands of dollars.
And they want someone - ideally you - to explain how this could possibly happen in software that was “done”.&lt;/p&gt;
&lt;p&gt;Nothing teaches you faster.
Nothing teaches you harder.&lt;/p&gt;
&lt;p&gt;It’s character building in the same way being chased by a magpie is “good exercise”.&lt;/p&gt;
&lt;h2 id=&quot;support-is-the-real-classroom&quot;&gt;Support is the real classroom&lt;/h2&gt;
&lt;p&gt;Once you’ve spent time supporting a live product - not imagining support, not simulating it, actually &lt;em&gt;living inside it&lt;/em&gt; - your entire perspective shifts.&lt;/p&gt;
&lt;p&gt;You start to realise:&lt;/p&gt;
&lt;h3 id=&quot;logs-are-not-optional&quot;&gt;&lt;strong&gt;Logs are not optional.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;They’re the forensic evidence you need when someone insists the system “ate” their data. Without logs, you’re arguing with ghosts.&lt;/p&gt;
&lt;h3 id=&quot;metrics-are-oxygen&quot;&gt;&lt;strong&gt;Metrics are oxygen.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;You suddenly care deeply about memory spikes, queue lengths, request times, error ratios, and that one mysterious metric that starts climbing for no reason at 2am.&lt;/p&gt;
&lt;h3 id=&quot;monitoring-helps-prevent-disasters&quot;&gt;&lt;strong&gt;Monitoring helps prevent disasters.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;A simple alert can save you from an awkward call where someone asks, “How long has the system been down?” and you realise the truthful answer is, “Longer than I’d like to admit.”&lt;/p&gt;
&lt;h3 id=&quot;user-behaviour-is-chaos&quot;&gt;&lt;strong&gt;User behaviour is chaos.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;You build a feature expecting users to do A → B → C.
In production, they do B → C → X → pray → restart their computer.&lt;/p&gt;
&lt;p&gt;Designing software without ever supporting it is like parenting by only reading the books, and never raising a child.&lt;/p&gt;
&lt;p&gt;In theory, it’s all very orderly.
In reality, something shitty is happening, and someone is crying.&lt;/p&gt;
&lt;h2 id=&quot;developers-who-only-build-don-t-know-how-to-build-for-reality&quot;&gt;Developers who only build don’t know how to build for reality&lt;/h2&gt;
&lt;p&gt;When a developer has never supported a product, they tend to think:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“The requirements were met. Job done.”&lt;/li&gt;
&lt;li&gt;“This edge case is unlikely.”&lt;/li&gt;
&lt;li&gt;“The logs are fine, I only needed then to test this worked anyway”&lt;/li&gt;
&lt;li&gt;“We don’t need that alert - we’ll notice the issue.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is how systems go down silently at 3am.
This is how users lose work.
This is how expensive, reputation-denting mistakes happen.&lt;/p&gt;
&lt;p&gt;A developer who has &lt;em&gt;felt&lt;/em&gt; production pain starts coding differently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They add logs everywhere because every missing log becomes a future argument.&lt;/li&gt;
&lt;li&gt;They write error messages with the clarity of someone who has been yelled at.&lt;/li&gt;
&lt;li&gt;Exceptions are really that, an exception, something completely unexpected.&lt;/li&gt;
&lt;li&gt;They guard against edge cases because they’ve learned users &lt;em&gt;live&lt;/em&gt; in edge cases.&lt;/li&gt;
&lt;li&gt;They create dashboards and alerts before adding fancy features.&lt;/li&gt;
&lt;li&gt;They think about recovery steps, not just happy paths.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Support turns developers into grown-ups, sometimes traumatised grown-ups, but grown-ups nonetheless.&lt;/p&gt;
&lt;h2 id=&quot;the-product-mindset-or-owning-your-shit&quot;&gt;The product mindset or owning your shit&lt;/h2&gt;
&lt;p&gt;Support forces a shift from &lt;strong&gt;project mindset&lt;/strong&gt; to &lt;strong&gt;product mindset&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Project mindset:&lt;/strong&gt;
“We built it. Ship it. Move on.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Product mindset:&lt;/strong&gt;
“We built it. Now we protect it, improve it, and learn from it.”&lt;/p&gt;
&lt;p&gt;Project thinking is tidy, convenient, and great for executive presentations.&lt;/p&gt;
&lt;p&gt;Product thinking is messy and real, because it acknowledges that software is never finished, and that users will always find new and exciting ways to break things.&lt;/p&gt;
&lt;p&gt;If you’ve never supported a system, you can’t truly design a good one.&lt;/p&gt;
&lt;p&gt;You don’t know what’s coming.&lt;/p&gt;
&lt;p&gt;You haven’t lived through the 2am outage, the frantic rollback, the weird bug triggered only by people using Internet Explorer 9 on a hospital kiosk.&lt;/p&gt;
&lt;p&gt;You’re doing software wrong unless your developers know the world beyond the Dev, Test and UAT.&lt;/p&gt;
&lt;h2 id=&quot;in-the-end-you-ll-still-be-wrong-just-less-wrong-than-before&quot;&gt;In the end, you’ll still be wrong - just less wrong than before&lt;/h2&gt;
&lt;p&gt;Supporting your own software doesn’t make you perfect.&lt;/p&gt;
&lt;p&gt;It makes you humble.&lt;br&gt;
It makes you aware.&lt;br&gt;
It makes you better.&lt;br&gt;&lt;/p&gt;
&lt;p&gt;You will still be wrong.&lt;br&gt;
Users will still complain.&lt;br&gt;
Something will still go wrong at an inconvenient time involving a stakeholder who begins every sentence with “I thought we agreed…”&lt;/p&gt;
&lt;p&gt;But developers who’ve supported their own work are wrong in &lt;em&gt;smarter&lt;/em&gt; ways.
They’re wrong with better logs, better alerts, and better assumptions.
They’re wrong - but recoverable.&lt;/p&gt;
&lt;p&gt;And that’s the quiet truth behind &lt;strong&gt;Doing Software Wrong&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;You’ll never do it right in everyone’s eyes.
But supporting what you build gives you a fighting chance of doing it &lt;em&gt;less wrong&lt;/em&gt; than the day before.&lt;/p&gt;
</description>
      <pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/support-as-learning/</guid>
    </item>
    <item>
      <title>Just hit deploy and you’re done</title>
      <link>https://doingsoftwarewrong.com/blog/deploy-and-done/</link>
      <description>&lt;p&gt;There’s a particular moment in every software project where someone leans back in their chair, exhales deeply and says, “Well. It’s done.”
It’s said with the confidence of someone who has not yet opened their inbox the next morning.&lt;/p&gt;
&lt;p&gt;The idea that software becomes &lt;em&gt;“complete”&lt;/em&gt; the moment it goes live is weirdly persistent. It’s held by people who should know better and people who definitely don’t, and it offers the same seductive comfort as believing that buying gym membership automatically gives you fitness. If only the universe worked like that.&lt;/p&gt;
&lt;p&gt;But software has never obeyed the rules of “finished”. Even the U.S. Defense Innovation Board, who are famously not known for whimsical metaphors, describe software as something that is never truly done and must be “managed as an enduring capability”. They talk about it the way you might talk about a heritage building or a problematic uncle. It’s always going to need work.&lt;/p&gt;
&lt;p&gt;It’s always going to need attention.&lt;/p&gt;
&lt;p&gt;Developers know this. Designers know it. Anyone who’s ever tried to upgrade an operating system knows it. But for some reason, the myth survives, the belief that the release is the exhale after a long sprint rather than the inhale before the next one.&lt;/p&gt;
&lt;h3 id=&quot;the-comforting-deception-of-done&quot;&gt;The comforting deception of “Done”&lt;/h3&gt;
&lt;p&gt;There’s something very soothing about the illusion of completion. It makes budgets look tidy. It makes roadmaps appear achievable. It reassures board members who would prefer not to hear the word “iteration” ever again.&lt;/p&gt;
&lt;p&gt;But the moment you treat software like a finished sculpture, you’ve already guaranteed it will age badly. Software lives out in the world. It reacts to things. Browsers update. Phones change shape. A third-party library quietly rots in a corner. Users behave in ways no rational person could predict. Suddenly your app is coughing like a toddler who has just started daycare, and everyone is wondering who approved the design.&lt;/p&gt;
&lt;p&gt;The truth is much closer to what Henrik Warne wrote in his blog about maintenance: software doesn’t have two phases - development followed by maintenance - it’s all the same continuous process. New code becomes old code very quickly. “Maintenance” is just the polite word for “keeping this thing alive because we have unleashed it into reality”.&lt;/p&gt;
&lt;h3 id=&quot;software-as-something-that-breathes-and-sometimes-wheezes&quot;&gt;Software as something that breathes… and sometimes wheezes&lt;/h3&gt;
&lt;p&gt;Think of software like a garden. You can’t just plant a row of tomatoes and walk away forever. Leave it alone long enough and the bugs move in, the weeds throw a rave, and soon the whole thing is unusable. Software behaves the same way. Ignore it and it decays, even when nothing “breaks” in the traditional sense.&lt;/p&gt;
&lt;p&gt;Security “bugs” arrive with alarming enthusiasm. Standards evolve. User expectations creep in and take over like weeds. The world never stays still, and your product is dragged along with it whether you like it or not.&lt;/p&gt;
&lt;h3 id=&quot;the-marriage-you-didn-t-realise-you-entered&quot;&gt;The marriage you didn’t realise you entered&lt;/h3&gt;
&lt;p&gt;This is where the marriage analogy comes in handy. People joke about “committing to a codebase”, but the comparison is fairly solid. The launch is the wedding day - lots of excitement, many photos, perhaps a small cake. But the real work happens afterward.&lt;/p&gt;
&lt;p&gt;If you don’t keep showing up, the relationship suffers. Things get brittle. Things drift. You find yourself one day staring at a giant, expensive mess and wondering how it all fell apart. Some companies even go through the tech equivalent of divorce - a full rewrite - and emerge poorer, wiser, and promising never to let it get this bad again.&lt;/p&gt;
&lt;p&gt;It’s not glamorous, but it’s honest: if you want to get value out of your software, you have to contribute to it continuously. If you don’t, the software will eventually pack its bags and find someone who will. Or, more likely, your customers will.&lt;/p&gt;
&lt;h3 id=&quot;what-this-means-for-anyone-actually-building-things&quot;&gt;What this means for anyone actually building things&lt;/h3&gt;
&lt;p&gt;If you’re running a company, leading a team, or founding something ambitious, the mindset shift is simple. You’re not building a product that ends. You’re stewarding a product that grows.&lt;/p&gt;
&lt;p&gt;This affects how you plan. It affects how you budget. It affects who you hire and how long you expect them to stay. It means acknowledging that the moment you ship version 1.0, version 1.1 is already knocking politely in the hallway.&lt;/p&gt;
&lt;p&gt;It also means resisting the urge to cram in everything at launch, because there will be time later. Iteration is not a punishment, it’s your friend. You don’t need to achieve perfection in the first go, it’s impossible. Even the best teams and the most experienced leaders all discover that something they believed to be true before launch is later revealed to be… extremely wrong.&lt;/p&gt;
&lt;p&gt;And you know what? It’s fine.
It’s the whole premise of Doing Software Wrong. You will always be wrong in someone’s eyes. A user, a reviewer, an engineer on the internet with a suspicious amount of free time. The point is not to be right forever. The point is to care enough to keep improving.&lt;/p&gt;
&lt;h3 id=&quot;if-you-think-you-re-done-you-re-already-behind&quot;&gt;If you think you’re done, You’re already behind&lt;/h3&gt;
&lt;p&gt;The release isn’t the end. It’s the beginning of the part that actually matters.&lt;/p&gt;
&lt;p&gt;If you claim your software is finished, all you’re really saying is that you’ve stopped paying attention. And in this industry, not paying attention is the fastest path to becoming a cautionary tale.&lt;/p&gt;
&lt;p&gt;Celebrate the launch. Enjoy the moment. But don’t imagine for a second that you’ve reached the final chapter. You’ve just turned the page to the part with more footnotes, more deadlines, and more unexpected plot twists.&lt;/p&gt;
&lt;p&gt;You’re not done. You never will be. That’s the fun and the frustration of it. If you feel slightly uneasy about everything you’re doing… congratulations. You’re doing software and you’re probably doing it wrong, exactly as intended.&lt;/p&gt;
</description>
      <pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate>
      <dc:creator>Steve Townsend</dc:creator>
      <guid>https://doingsoftwarewrong.com/blog/deploy-and-done/</guid>
    </item>
  </channel>
</rss>