{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/ghuntley-com/2026-10-02-software-doesn-t-need-to-be-readable-anymore-it-needs-to-be/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "I sat down with the folks at AI21 Labs for their YAAP podcast at the AI:Engineer World Fair, and we went deep on something I've been chewing on for most of this year: almost every decision in computing for the last forty years was made with a human in the loop, as the reader, the writer, or the operator. What happens when that stops being true?\n\n[YAAP | Your Code Doesn't Need to Be Readable Anymore](https://www.youtube.com/watch?v=vrCE5m2MRys)\n\nYAAP by AI21 Labs — \"Your Code Doesn't Need to Be Readable Anymore\" (21 minutes)\n\nHere's the gist, written up properly, plus chapter links at the bottom if you want to jump into a specific part of the conversation.\n\n> Software doesn't need to be readable by a human. It needs to be explainable to a human.\n\n## the economics of AI are cooked, and I still haven't written code by hand in two years\n\nThe opening hot take was that AI economics are absolutely cooked because adoption is nowhere near what is needed to achieve ROI on the amount of capital deployed. This is why all the labs are hiring aggressively to staff up professional services organizations around the world right now. Go read Ed Zitron's [Where's Your Ed At](https://www.wheresyoured.at/?ref=ghuntley.com) if you want the long version.\n\nSo far, the only reliable ways anyone has found to make money with AI are reselling tokens with a markup (and competing directly against the labs while you do it) or selling the infrastructure around them: sandboxes and the like.\n\nBoth things can be true at once. The economics can be cooked, *and* how I develop software has completely, fundamentally changed. I haven't written code by hand for two years. These models generate code better than most employers can actually hire for.\n\nWhat changes is how you think about spend. The thing we're all going to discover over the next year is **where we actually need frontier intelligence and where we don't**. Frontier intelligence is expensive, and you don't need it for every single task.\n\n- The models have been good enough for at least a year. There was a real jump from Sonnet 3.5 to the Opus 4-ish range; since then it's been marginal. The hype and hysteria around alignment and security change, but the capability mostly hasn't. These models have always known how to drive Kali and Burp Suite.\n- Personally, I run a mix of GPT 6.1 sol on no or low reasoning, and GLM/Kimi. I use programming languages that let me get away with that (more on that below).\n- Find the right model for the task, then buy those tokens wherever they're cheapest. Take an open-weights model like GLM, run it on Baseten, and it costs a fraction as much.\n- If you're a company, check for zero data retention. At home? Just get your tokens cheap. There was a time when Z.ai's yearly GLM plan was $300 AUD a *year*, compared with $300 a *month* for the big labs' plans. Some of the smartest engineers I know bought twenty of them and ripped with concurrency.\n\nIt's not about the model anymore. It's about how you use the model.\n\n## the last forty years of computing were designed around humans\n\nWhy does a computer have a console? Because we used to have mainframe operators. A whole lot of what we consider \"how computers work\" is really \"how computers were made legible to people.\"\n\nBack in March I took a detour, picked OCaml back up because it has an effect system built in, and started playing with unikernels via [MirageOS](https://mirage.io/?ref=ghuntley.com).\n\nMost applications run *on* an operating system. What if the application *was* the operating system — a very thin one, with almost no overhead? Most software gets breached either through an exploit in the OS layer or through the app layer as a foothold into the OS. Delete the OS layer, and you delete that class of problem.\n\nI ended up rebuilding essentially Erlang as a distributed operating system. Is that a dead end? Maybe. Sometimes these experiments are. But knowing what's possible, and where it works and where it doesn't, lets you rethink the last forty years and ask a better question: **can we delete instead of build?**\n\nHumans aren't operating machines anymore either. You hand a Docker container to a Kubernetes cluster and an operator control loop manages it. Once the human is out of the loop, the design decisions that existed for the human are up for renegotiation.\n\nI truly think Unikernels are going to come back into fashion hard over the next couple of years for security reasons. All the friction... that existed when architecting an application with this design no longer exists.\n\n## readable vs explainable\n\nPeople are still saying, very loudly, that code should be readable so that humans can understand it. I no longer think that's the goal.\n\nTry this for fun: go play with Haskell this weekend. It doesn't matter if you've never touched it. The LLMs know it. There's a lot of dogma out there about things being hard to learn. Well, they're now false. Learning things like Nix and Haskell used to be pushing shit uphill and unachievable in a single sitting. But now the LLM knows it's easy.\n\nBelow, you'll find a function that I have deliberately obfuscated....\n\n```haskell\nf :: String -> String\nf = g . h\n  where\n    h []     = []\n    h (x:xs) = h xs ++ [x]\n    g x =\n      let (y, z) = p x\n      in if y then z else g z\n    p []       = (True, [])\n    p [x]      = (True, [x])\n    p (x:y:xs)\n      | x > y     = let (a, b) = p (x:xs) in (False, y:b)\n      | otherwise = let (a, b) = p (y:xs) in (a, x:b)\n```\n\nRight now you're probably looking at the code and going... What the actual ... is this?\n\nNow copy that function into an LLM and prompt it to *\"explain this function to me as if you were explaining it to my son or daughter but in Python as a reference.\"*\n\nAll of a sudden it becomes accessible. It reads like Python.\n\n> This Haskell turns a string into its letters in alphabetical order. It does that in two steps: flip the string backwards, then keep bubbling letters into order until nothing moves.\n\n```python\ndef flip(letters):\n    \"\"\"Put the string backwards. 'cat' becomes 'tac'.\"\"\"\n    if letters == \"\":\n        return \"\"\n    first = letters[0]\n    rest = letters[1:]\n    return flip(rest) + first\n\ndef one_pass(letters):\n    \"\"\"\n    Walk the letters once.\n    Whenever a bigger letter is sitting in front of a smaller one,\n    slide the smaller one forward.\n    Also report whether anything moved.\n    \"\"\"\n    if len(letters) <= 1:\n        return True, letters  # already tidy\n\n    first = letters[0]\n    second = letters[1]\n    rest = letters[2:]\n\n    if first > second:\n        # smaller one goes in front; keep comparing the bigger one\n        moved, after = one_pass(first + rest)\n        return False, second + after\n    else:\n        # these two are fine; check the rest\n        moved, after = one_pass(second + rest)\n        return moved, first + after\n\ndef tidy_up(letters):\n    \"\"\"Keep doing one pass until a whole pass changes nothing.\"\"\"\n    done, letters = one_pass(letters)\n    if done:\n        return letters\n    return tidy_up(letters)\n\ndef f(text):\n    return tidy_up(flip(text))\n```\n\nThat's the shift. The artifact doesn't need to be optimized for a human to read cold. It needs to be something a model can explain to a human on demand.\n\n## types are back pressure\n\nIf you want a codebase that agents can maintain, you'll notice something quickly: **a Rust codebase is far more maintainable with agents than a Python one**. Types are a form of verification. They provide [back pressure](https://ghuntley.com/pressure/): compiler errors that the LLM picks up and fixes automatically, every loop.\n\nThink of it as a continuum of power. Up one end, Haskell is even stricter than Rust. At the other end, you've got Ruby, Python, PHP, and Perl, where types were never a first-class citizen and are hard to bolt on after the fact.\n\nThis is also why I can get away with cheaper models. Pick a language that does the verification for you, and you need less intelligence to stay on the rails.\n\n## programming languages move at the speed of human learning\n\nLanguages evolve through committees, and the pace of language development has been deliberately slowed to match the rate at which humans can learn new concepts.\n\nI remember when monads arrived in .NET — LINQ in 3.5, championed by Erik Meijer. We're talking about `SelectMany`, flat map, to be blunt. It took an easy five to eight years before people were comfortable with it. Now it's everywhere in every programming language.\n\nOr look at Python 2 to 3. It's been about fifteen years, and there are still wounds. The lesson the industry took was \"you must not break users,\" so nobody makes breaking changes.\n\nBut what happens if the language designer ships a skills pack alongside the breaking change, and the agent just does the migration?\n\n> If humans aren't the target audience, we don't have to dumb down the language for adoption, and the LLMs have the entire corpus of programming language theory — what can we do with that?\n\nThere are maybe ten or twelve truly great applied programming language designers in the world, and most of them have **specialized their careers in human accessibility**.\n\nIt's going to take people on the fringe of comp sci (the ones who were told, \"you can't do that, nobody will learn it\") to hear that this is now false. You can take research that's twenty years old, put it together, and the LLM will do it for you.\n\nI've been collecting other nerds who are thinking along the same lines. No results to show yet. We're all just playing with this new substrate.\n\n> If coding agents will write most of our code, what happens with our communities and sense of ergonomics? How does it impact our compilers and tools? [https://t.co/DaYCSHFUBY](https://t.co/DaYCSHFUBY?ref=ghuntley.com)\n>\n> — José Valim (@josevalim) [September 24, 2026](https://x.com/josevalim/status/2103133294317445290?ref_src=twsrc%5Etfw&ref=ghuntley.com)\n\nHighly recommend reading this article. Programming language authors who build their languages around agent-first rather than human-first will get ahead. Those who don't will fall behind and end up like Solaris.\n\n## languages are fungible now\n\nConsider being a CTO before AI...\n\n> \"We need to hire a Ruby person. Over here it's .NET, so that's a separate team. And the company we acquired is Java.\"\n\nThe end business impact is that you are maintaining three teams, or teams of teams, on tribal ideology about programming languages.\n\nNow you can [run loops](https://ghuntley.com/loop/) to port from one language to the next. A founder in the medical space in Australia had an old ASP.NET Web Forms app on IIS. Terrible, terrible, terrible; I've done it, I know. I challenged him to run some loops himself, then go back to his team the next morning without telling them and ask for an estimate on the rewrite. They said years. A week later the migration was done. He did it all himself and completely mogged his engineering team.\n\nPorting is easy when the end result is easy to verify. Stealing an idea from a Go library and wanting it in Rust is easy now, and has been for at least a year.\n\n[Can a LLM convert C, to ASM to specs and then to a working Z/80 Speccy tape? Yes.](https://ghuntley.com/z80)\n\n✨Daniel Joyce used the techniques described in this post to port ls to rust via an objdump. You can see the code here: https://github.com/DanielJoyce/ls-rs. Keen, to see more examples - get in contact if you ship something! Damien Guard nerd sniped me and other folks wanted\n\n![](https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/icon/A-black-and-white--low-angle-digital-illustration-in-a-symbolic-traditional-tattoo-art-style.--A-bald--light-skinned-man-with-a-bushy-beard--prominent-eyebrows--and-a-friendly-expression-wears-denim-overalls--2--c4421c9b-5f3c-40dc-838c-40b5235ce4e8.jpg)Geoffrey Huntley Geoffrey Huntley\n\n![](https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/thumbnail/bafkreiftzmpb7bbkej76rac3kuijg2mcuyjxxhtnqdie5qq6rbrc45v2iu-1-a7544c4e-6d21-416a-898f-997162311d6f.jpg)\n\nIt is provably true that languages are fungible, and it makes no business sense to carry so many of them in your business today.\n\nOperating systems went through a convergence event: AIX, Solaris, HP-UX and IRIX all collapsed into Mac, Linux and Windows. I expect programming languages to converge the same way: down to a couple of gilded languages, or something new rises from the dust.\n\n## the V8 hot rod\n\nThe usual objection to a new programming language is adoption. But you don't necessarily need adoption now when deciding whether to use a language, now that we have AI. Like, what libraries exist in this ecosystem don't factor into my decision to create a new project these days.\n\n[what is the point of libraries now that you can just generate them?](https://ghuntley.com/libraries)\n\nIt’s a meme as accurate as time. The problem is that our digital infrastructure depends upon just some random guy in Nebraska. Open-source, by design, is not financially sustainable. Finding reliable, well-defined funding sources is exceptionally challenging. As projects grow in size, many maintainers burn out and\n\n![](https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/icon/A-black-and-white--low-angle-digital-illustration-in-a-symbolic-traditional-tattoo-art-style.--A-bald--light-skinned-man-with-a-bushy-beard--prominent-eyebrows--and-a-friendly-expression-wears-denim-overalls--2--c23bc14e-360c-4106-9896-e25298235b65.jpg)Geoffrey Huntley Geoffrey Huntley\n\n![](https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/thumbnail/A-symbolic-traditional-tattoo-art-print-of-a-software-library-in-vibrant-retro-colors-with-complex-ornamental-details.-Creative-light-art-is-used-to-achieve-an-abstract-pattern-with-complimentary-colors--balance-36436c4b-e2ea-4613-85eb-539cecd7bc7d.jpg)\n\nIf you'd built some sick V8 hot rod and everyone else was on a horse, would you care whether they adopted it? \"Yeah, enjoy that horse, mate.\"\n\nThat's why this area is interesting. Not \"is there a faster programming language,\" but: can we incorporate more ideas from verification into our languages, stop optimizing for humans, and start optimizing for agents? Is there a way to go faster? I don't know yet. I guess we'll have to find out.\n\n## what I'm building in the meantime\n\nSince January, I've been talking about Loom and the idea of a software factory, something that optimizes a whole business function. It's on GitHub, it's not really usable, and it's not intended to be; it's research.\n\nSoftware factories are very, very hard to do right now. For the last six months, my view has been that we need one of: better models, better programming languages, or a revival of some old computer science techniques like simulators.\n\nUltimately, I want to replace GitHub. I want to bring back something like Phabricator, the engineering system that predates GitHub and came out of Facebook's early days. Google has Piper and Rosie for large-scale refactoring. Meta has EdenFS, Mononoke and Sapling. If GitHub is the only thing you've seen, it seems fine. It's not good enough. I think Git is somewhat end-of-life; I really wish people would stop trying to extend Git's lifespan.\n\nSo right now I've got loops running that are rebuilding a source control system where:\n\n- contents are encrypted;\n- agents get a claim, which provides a materialized view of the repository;\n- that means real ACLs. Share a sub-path with a contractor, much like Windows file permissions, instead of \"the Git repo has everything.\"\n\nIt's a distributed system, so I'm building it in Rust and building **the simulator first**, then driving the agent to validate everything through the simulator. That has kept the agent on the rails remarkably well.\n\n## chapters\n\n- [0:55](https://www.youtube.com/watch?v=vrCE5m2MRys&t=55s&ref=ghuntley.com) — the economics of AI are cooked\n- [2:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=150s&ref=ghuntley.com) — where you actually need frontier intelligence\n- [4:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=270s&ref=ghuntley.com) — get your tokens cheap\n- [5:31](https://www.youtube.com/watch?v=vrCE5m2MRys&t=331s&ref=ghuntley.com) — Loom and software factories\n- [7:01](https://www.youtube.com/watch?v=vrCE5m2MRys&t=421s&ref=ghuntley.com) — rebuilding source control; Git is end of life\n- [8:31](https://www.youtube.com/watch?v=vrCE5m2MRys&t=511s&ref=ghuntley.com) — simulator-first development\n- [9:00](https://www.youtube.com/watch?v=vrCE5m2MRys&t=540s&ref=ghuntley.com) — OCaml, unikernels and forty years of human-centric computing\n- [10:50](https://www.youtube.com/watch?v=vrCE5m2MRys&t=650s&ref=ghuntley.com) — readable vs explainable\n- [13:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=810s&ref=ghuntley.com) — types as back pressure\n- [14:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=870s&ref=ghuntley.com) — languages designed by committee\n- [16:00](https://www.youtube.com/watch?v=vrCE5m2MRys&t=960s&ref=ghuntley.com) — languages are fungible\n- [19:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=1170s&ref=ghuntley.com) — the V8 hot rod\n- [20:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=1230s&ref=ghuntley.com) — optimise for agents, not humans\n\nKeep curious.\n",
  "authors": [
    "Geoffrey Huntley"
  ],
  "captured_at": "2026-10-02T08:58:34.290726633+00:00",
  "category": "programming",
  "content_html": "<p>I sat down with the folks at AI21 Labs for their YAAP podcast at the AI:Engineer World Fair, and we went deep on something I've been chewing on for most of this year: almost every decision in computing for the last forty years was made with a human in the loop, as the reader, the writer, or the operator. What happens when that stops being true?</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys\">YAAP | Your Code Doesn't Need to Be Readable Anymore</a></p>\n<p>YAAP by AI21 Labs — &quot;Your Code Doesn't Need to Be Readable Anymore&quot; (21 minutes)</p>\n<p>Here's the gist, written up properly, plus chapter links at the bottom if you want to jump into a specific part of the conversation.</p>\n<blockquote>\n<p>Software doesn't need to be readable by a human. It needs to be explainable to a human.</p>\n</blockquote>\n<h2>the economics of AI are cooked, and I still haven't written code by hand in two years</h2>\n<p>The opening hot take was that AI economics are absolutely cooked because adoption is nowhere near what is needed to achieve ROI on the amount of capital deployed. This is why all the labs are hiring aggressively to staff up professional services organizations around the world right now. Go read Ed Zitron's <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.wheresyoured.at/?ref=ghuntley.com\">Where's Your Ed At</a> if you want the long version.</p>\n<p>So far, the only reliable ways anyone has found to make money with AI are reselling tokens with a markup (and competing directly against the labs while you do it) or selling the infrastructure around them: sandboxes and the like.</p>\n<p>Both things can be true at once. The economics can be cooked, <em>and</em> how I develop software has completely, fundamentally changed. I haven't written code by hand for two years. These models generate code better than most employers can actually hire for.</p>\n<p>What changes is how you think about spend. The thing we're all going to discover over the next year is <strong>where we actually need frontier intelligence and where we don't</strong>. Frontier intelligence is expensive, and you don't need it for every single task.</p>\n<ul>\n<li>The models have been good enough for at least a year. There was a real jump from Sonnet 3.5 to the Opus 4-ish range; since then it's been marginal. The hype and hysteria around alignment and security change, but the capability mostly hasn't. These models have always known how to drive Kali and Burp Suite.</li>\n<li>Personally, I run a mix of GPT 6.1 sol on no or low reasoning, and GLM/Kimi. I use programming languages that let me get away with that (more on that below).</li>\n<li>Find the right model for the task, then buy those tokens wherever they're cheapest. Take an open-weights model like GLM, run it on Baseten, and it costs a fraction as much.</li>\n<li>If you're a company, check for zero data retention. At home? Just get your tokens cheap. There was a time when Z.ai's yearly GLM plan was $300 AUD a <em>year</em>, compared with $300 a <em>month</em> for the big labs' plans. Some of the smartest engineers I know bought twenty of them and ripped with concurrency.</li>\n</ul>\n<p>It's not about the model anymore. It's about how you use the model.</p>\n<h2>the last forty years of computing were designed around humans</h2>\n<p>Why does a computer have a console? Because we used to have mainframe operators. A whole lot of what we consider &quot;how computers work&quot; is really &quot;how computers were made legible to people.&quot;</p>\n<p>Back in March I took a detour, picked OCaml back up because it has an effect system built in, and started playing with unikernels via <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mirage.io/?ref=ghuntley.com\">MirageOS</a>.</p>\n<p>Most applications run <em>on</em> an operating system. What if the application <em>was</em> the operating system — a very thin one, with almost no overhead? Most software gets breached either through an exploit in the OS layer or through the app layer as a foothold into the OS. Delete the OS layer, and you delete that class of problem.</p>\n<p>I ended up rebuilding essentially Erlang as a distributed operating system. Is that a dead end? Maybe. Sometimes these experiments are. But knowing what's possible, and where it works and where it doesn't, lets you rethink the last forty years and ask a better question: <strong>can we delete instead of build?</strong></p>\n<p>Humans aren't operating machines anymore either. You hand a Docker container to a Kubernetes cluster and an operator control loop manages it. Once the human is out of the loop, the design decisions that existed for the human are up for renegotiation.</p>\n<p>I truly think Unikernels are going to come back into fashion hard over the next couple of years for security reasons. All the friction... that existed when architecting an application with this design no longer exists.</p>\n<h2>readable vs explainable</h2>\n<p>People are still saying, very loudly, that code should be readable so that humans can understand it. I no longer think that's the goal.</p>\n<p>Try this for fun: go play with Haskell this weekend. It doesn't matter if you've never touched it. The LLMs know it. There's a lot of dogma out there about things being hard to learn. Well, they're now false. Learning things like Nix and Haskell used to be pushing shit uphill and unachievable in a single sitting. But now the LLM knows it's easy.</p>\n<p>Below, you'll find a function that I have deliberately obfuscated....</p>\n<pre><code class=\"language-haskell\"><span class=\"code-snippet\" data-language=\"Haskell\"><span class=\"syntax-source syntax-haskell\"><span class=\"syntax-meta syntax-function syntax-type-declaration syntax-haskell\"><span class=\"syntax-entity syntax-name syntax-function syntax-haskell\">f</span> <span class=\"syntax-keyword syntax-other syntax-double-colon syntax-haskell\">::</span> <span class=\"syntax-storage syntax-type syntax-haskell\">String</span> <span class=\"syntax-keyword syntax-other syntax-arrow syntax-haskell\">-&gt;</span> <span class=\"syntax-storage syntax-type syntax-haskell\">String</span>\nf <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> </span>g <span class=\"syntax-keyword syntax-operator syntax-haskell\">.</span> h\n  <span class=\"syntax-keyword syntax-other syntax-haskell\">where</span>\n    h <span class=\"syntax-constant syntax-language syntax-empty-list syntax-haskell\">[]</span>     <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> <span class=\"syntax-constant syntax-language syntax-empty-list syntax-haskell\">[]</span>\n    h (x<span class=\"syntax-keyword syntax-operator syntax-haskell\">:</span>xs) <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> h xs <span class=\"syntax-keyword syntax-operator syntax-haskell\">++</span> [x]\n    g x <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span>\n      <span class=\"syntax-keyword syntax-other syntax-haskell\">let</span> (y<span class=\"syntax-punctuation syntax-separator syntax-comma syntax-haskell\">,</span> z) <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> p x\n      <span class=\"syntax-keyword syntax-other syntax-haskell\">in</span> <span class=\"syntax-keyword syntax-control syntax-haskell\">if</span> y <span class=\"syntax-keyword syntax-control syntax-haskell\">then</span> z <span class=\"syntax-keyword syntax-control syntax-haskell\">else</span> g z\n    p <span class=\"syntax-constant syntax-language syntax-empty-list syntax-haskell\">[]</span>       <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> (<span class=\"syntax-constant syntax-other syntax-haskell\">True</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-haskell\">,</span> <span class=\"syntax-constant syntax-language syntax-empty-list syntax-haskell\">[]</span>)\n    p [x]      <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> (<span class=\"syntax-constant syntax-other syntax-haskell\">True</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-haskell\">,</span> [x])\n    p (x<span class=\"syntax-keyword syntax-operator syntax-haskell\">:</span>y<span class=\"syntax-keyword syntax-operator syntax-haskell\">:</span>xs)\n      <span class=\"syntax-keyword syntax-operator syntax-haskell\">|</span> x <span class=\"syntax-keyword syntax-operator syntax-haskell\">&gt;</span> y     <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> <span class=\"syntax-keyword syntax-other syntax-haskell\">let</span> (a<span class=\"syntax-punctuation syntax-separator syntax-comma syntax-haskell\">,</span> b) <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> p (x<span class=\"syntax-keyword syntax-operator syntax-haskell\">:</span>xs) <span class=\"syntax-keyword syntax-other syntax-haskell\">in</span> (<span class=\"syntax-constant syntax-other syntax-haskell\">False</span><span class=\"syntax-punctuation syntax-separator syntax-comma syntax-haskell\">,</span> y<span class=\"syntax-keyword syntax-operator syntax-haskell\">:</span>b)\n      <span class=\"syntax-keyword syntax-operator syntax-haskell\">|</span> otherwise <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> <span class=\"syntax-keyword syntax-other syntax-haskell\">let</span> (a<span class=\"syntax-punctuation syntax-separator syntax-comma syntax-haskell\">,</span> b) <span class=\"syntax-keyword syntax-operator syntax-haskell\">=</span> p (y<span class=\"syntax-keyword syntax-operator syntax-haskell\">:</span>xs) <span class=\"syntax-keyword syntax-other syntax-haskell\">in</span> (a<span class=\"syntax-punctuation syntax-separator syntax-comma syntax-haskell\">,</span> x<span class=\"syntax-keyword syntax-operator syntax-haskell\">:</span>b)\n</span></span></code></pre>\n<p>Right now you're probably looking at the code and going... What the actual ... is this?</p>\n<p>Now copy that function into an LLM and prompt it to <em>&quot;explain this function to me as if you were explaining it to my son or daughter but in Python as a reference.&quot;</em></p>\n<p>All of a sudden it becomes accessible. It reads like Python.</p>\n<blockquote>\n<p>This Haskell turns a string into its letters in alphabetical order. It does that in two steps: flip the string backwards, then keep bubbling letters into order until nothing moves.</p>\n</blockquote>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-storage syntax-type syntax-function syntax-python\">def</span> <span class=\"syntax-entity syntax-name syntax-function syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">flip</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-begin syntax-python\">(</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">letters</span><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-function syntax-begin syntax-python\">:</span></span>\n    <span class=\"syntax-comment syntax-block syntax-documentation syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-python\">&quot;&quot;&quot;</span>Put the string backwards. &#39;cat&#39; becomes &#39;tac&#39;.<span class=\"syntax-punctuation syntax-definition syntax-comment syntax-end syntax-python\">&quot;&quot;&quot;</span></span>\n    <span class=\"syntax-meta syntax-statement syntax-if syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-conditional syntax-python\">if</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-python\">==</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-block syntax-conditional syntax-python\">:</span></span>\n        <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span>\n    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">first</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">0</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span>\n    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">rest</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">1</span><span class=\"syntax-punctuation syntax-separator syntax-slice syntax-python\">:</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span>\n    <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">flip</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">rest</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">+</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">first</span></span>\n\n<span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-storage syntax-type syntax-function syntax-python\">def</span> <span class=\"syntax-entity syntax-name syntax-function syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">one_pass</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-begin syntax-python\">(</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">letters</span><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-function syntax-begin syntax-python\">:</span></span>\n    <span class=\"syntax-comment syntax-block syntax-documentation syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-python\">&quot;&quot;&quot;</span>\n    Walk the letters once.\n    Whenever a bigger letter is sitting in front of a smaller one,\n    slide the smaller one forward.\n    Also report whether anything moved.\n    <span class=\"syntax-punctuation syntax-definition syntax-comment syntax-end syntax-python\">&quot;&quot;&quot;</span></span>\n    <span class=\"syntax-meta syntax-statement syntax-if syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-conditional syntax-python\">if</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">len</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-python\">&lt;=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">1</span><span class=\"syntax-punctuation syntax-section syntax-block syntax-conditional syntax-python\">:</span></span>\n        <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-constant syntax-language syntax-python\">True</span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span>  <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> already tidy\n</span>\n    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">first</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">0</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span>\n    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">second</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">1</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span>\n    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">rest</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">2</span><span class=\"syntax-punctuation syntax-separator syntax-slice syntax-python\">:</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span>\n\n    <span class=\"syntax-meta syntax-statement syntax-if syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-conditional syntax-python\">if</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">first</span></span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-python\">&gt;</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">second</span></span><span class=\"syntax-punctuation syntax-section syntax-block syntax-conditional syntax-python\">:</span></span>\n        <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> smaller one goes in front; keep comparing the bigger one\n</span>        <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">moved</span></span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">after</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">one_pass</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">first</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">+</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">rest</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n        <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-constant syntax-language syntax-python\">False</span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">second</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">+</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">after</span></span>\n    <span class=\"syntax-meta syntax-statement syntax-conditional syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-conditional syntax-python\">else</span><span class=\"syntax-punctuation syntax-section syntax-block syntax-python\">:</span></span>\n        <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> these two are fine; check the rest\n</span>        <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">moved</span></span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">after</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">one_pass</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">second</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">+</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">rest</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n        <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">moved</span></span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">first</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">+</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">after</span></span>\n\n<span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-storage syntax-type syntax-function syntax-python\">def</span> <span class=\"syntax-entity syntax-name syntax-function syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">tidy_up</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-begin syntax-python\">(</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">letters</span><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-function syntax-begin syntax-python\">:</span></span>\n    <span class=\"syntax-comment syntax-block syntax-documentation syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-python\">&quot;&quot;&quot;</span>Keep doing one pass until a whole pass changes nothing.<span class=\"syntax-punctuation syntax-definition syntax-comment syntax-end syntax-python\">&quot;&quot;&quot;</span></span>\n    <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">done</span></span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">one_pass</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n    <span class=\"syntax-meta syntax-statement syntax-if syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-conditional syntax-python\">if</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">done</span></span><span class=\"syntax-punctuation syntax-section syntax-block syntax-conditional syntax-python\">:</span></span>\n        <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span>\n    <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">tidy_up</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">letters</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-storage syntax-type syntax-function syntax-python\">def</span> <span class=\"syntax-entity syntax-name syntax-function syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">f</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-begin syntax-python\">(</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">text</span><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-function syntax-begin syntax-python\">:</span></span>\n    <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">tidy_up</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">flip</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">text</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n</span></span></code></pre>\n<p>That's the shift. The artifact doesn't need to be optimized for a human to read cold. It needs to be something a model can explain to a human on demand.</p>\n<h2>types are back pressure</h2>\n<p>If you want a codebase that agents can maintain, you'll notice something quickly: <strong>a Rust codebase is far more maintainable with agents than a Python one</strong>. Types are a form of verification. They provide <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ghuntley.com/pressure/\">back pressure</a>: compiler errors that the LLM picks up and fixes automatically, every loop.</p>\n<p>Think of it as a continuum of power. Up one end, Haskell is even stricter than Rust. At the other end, you've got Ruby, Python, PHP, and Perl, where types were never a first-class citizen and are hard to bolt on after the fact.</p>\n<p>This is also why I can get away with cheaper models. Pick a language that does the verification for you, and you need less intelligence to stay on the rails.</p>\n<h2>programming languages move at the speed of human learning</h2>\n<p>Languages evolve through committees, and the pace of language development has been deliberately slowed to match the rate at which humans can learn new concepts.</p>\n<p>I remember when monads arrived in .NET — LINQ in 3.5, championed by Erik Meijer. We're talking about <code>SelectMany</code>, flat map, to be blunt. It took an easy five to eight years before people were comfortable with it. Now it's everywhere in every programming language.</p>\n<p>Or look at Python 2 to 3. It's been about fifteen years, and there are still wounds. The lesson the industry took was &quot;you must not break users,&quot; so nobody makes breaking changes.</p>\n<p>But what happens if the language designer ships a skills pack alongside the breaking change, and the agent just does the migration?</p>\n<blockquote>\n<p>If humans aren't the target audience, we don't have to dumb down the language for adoption, and the LLMs have the entire corpus of programming language theory — what can we do with that?</p>\n</blockquote>\n<p>There are maybe ten or twelve truly great applied programming language designers in the world, and most of them have <strong>specialized their careers in human accessibility</strong>.</p>\n<p>It's going to take people on the fringe of comp sci (the ones who were told, &quot;you can't do that, nobody will learn it&quot;) to hear that this is now false. You can take research that's twenty years old, put it together, and the LLM will do it for you.</p>\n<p>I've been collecting other nerds who are thinking along the same lines. No results to show yet. We're all just playing with this new substrate.</p>\n<blockquote>\n<p>If coding agents will write most of our code, what happens with our communities and sense of ergonomics? How does it impact our compilers and tools? <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://t.co/DaYCSHFUBY?ref=ghuntley.com\">https://t.co/DaYCSHFUBY</a></p>\n<p>— José Valim (@josevalim) <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://x.com/josevalim/status/2103133294317445290?ref_src=twsrc%5Etfw&amp;ref=ghuntley.com\">September 24, 2026</a></p>\n</blockquote>\n<p>Highly recommend reading this article. Programming language authors who build their languages around agent-first rather than human-first will get ahead. Those who don't will fall behind and end up like Solaris.</p>\n<h2>languages are fungible now</h2>\n<p>Consider being a CTO before AI...</p>\n<blockquote>\n<p>&quot;We need to hire a Ruby person. Over here it's .NET, so that's a separate team. And the company we acquired is Java.&quot;</p>\n</blockquote>\n<p>The end business impact is that you are maintaining three teams, or teams of teams, on tribal ideology about programming languages.</p>\n<p>Now you can <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ghuntley.com/loop/\">run loops</a> to port from one language to the next. A founder in the medical space in Australia had an old ASP.NET Web Forms app on IIS. Terrible, terrible, terrible; I've done it, I know. I challenged him to run some loops himself, then go back to his team the next morning without telling them and ask for an estimate on the rewrite. They said years. A week later the migration was done. He did it all himself and completely mogged his engineering team.</p>\n<p>Porting is easy when the end result is easy to verify. Stealing an idea from a Go library and wanting it in Rust is easy now, and has been for at least a year.</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ghuntley.com/z80\">Can a LLM convert C, to ASM to specs and then to a working Z/80 Speccy tape? Yes.</a></p>\n<p>✨Daniel Joyce used the techniques described in this post to port ls to rust via an objdump. You can see the code here: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/DanielJoyce/ls-rs\">https://github.com/DanielJoyce/ls-rs</a>. Keen, to see more examples - get in contact if you ship something! Damien Guard nerd sniped me and other folks wanted</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/icon/A-black-and-white--low-angle-digital-illustration-in-a-symbolic-traditional-tattoo-art-style.--A-bald--light-skinned-man-with-a-bushy-beard--prominent-eyebrows--and-a-friendly-expression-wears-denim-overalls--2--c4421c9b-5f3c-40dc-838c-40b5235ce4e8.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture>Geoffrey Huntley Geoffrey Huntley</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/thumbnail/bafkreiftzmpb7bbkej76rac3kuijg2mcuyjxxhtnqdie5qq6rbrc45v2iu-1-a7544c4e-6d21-416a-898f-997162311d6f.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>It is provably true that languages are fungible, and it makes no business sense to carry so many of them in your business today.</p>\n<p>Operating systems went through a convergence event: AIX, Solaris, HP-UX and IRIX all collapsed into Mac, Linux and Windows. I expect programming languages to converge the same way: down to a couple of gilded languages, or something new rises from the dust.</p>\n<h2>the V8 hot rod</h2>\n<p>The usual objection to a new programming language is adoption. But you don't necessarily need adoption now when deciding whether to use a language, now that we have AI. Like, what libraries exist in this ecosystem don't factor into my decision to create a new project these days.</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ghuntley.com/libraries\">what is the point of libraries now that you can just generate them?</a></p>\n<p>It’s a meme as accurate as time. The problem is that our digital infrastructure depends upon just some random guy in Nebraska. Open-source, by design, is not financially sustainable. Finding reliable, well-defined funding sources is exceptionally challenging. As projects grow in size, many maintainers burn out and</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/icon/A-black-and-white--low-angle-digital-illustration-in-a-symbolic-traditional-tattoo-art-style.--A-bald--light-skinned-man-with-a-bushy-beard--prominent-eyebrows--and-a-friendly-expression-wears-denim-overalls--2--c23bc14e-360c-4106-9896-e25298235b65.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture>Geoffrey Huntley Geoffrey Huntley</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/thumbnail/A-symbolic-traditional-tattoo-art-print-of-a-software-library-in-vibrant-retro-colors-with-complex-ornamental-details.-Creative-light-art-is-used-to-achieve-an-abstract-pattern-with-complimentary-colors--balance-36436c4b-e2ea-4613-85eb-539cecd7bc7d.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>If you'd built some sick V8 hot rod and everyone else was on a horse, would you care whether they adopted it? &quot;Yeah, enjoy that horse, mate.&quot;</p>\n<p>That's why this area is interesting. Not &quot;is there a faster programming language,&quot; but: can we incorporate more ideas from verification into our languages, stop optimizing for humans, and start optimizing for agents? Is there a way to go faster? I don't know yet. I guess we'll have to find out.</p>\n<h2>what I'm building in the meantime</h2>\n<p>Since January, I've been talking about Loom and the idea of a software factory, something that optimizes a whole business function. It's on GitHub, it's not really usable, and it's not intended to be; it's research.</p>\n<p>Software factories are very, very hard to do right now. For the last six months, my view has been that we need one of: better models, better programming languages, or a revival of some old computer science techniques like simulators.</p>\n<p>Ultimately, I want to replace GitHub. I want to bring back something like Phabricator, the engineering system that predates GitHub and came out of Facebook's early days. Google has Piper and Rosie for large-scale refactoring. Meta has EdenFS, Mononoke and Sapling. If GitHub is the only thing you've seen, it seems fine. It's not good enough. I think Git is somewhat end-of-life; I really wish people would stop trying to extend Git's lifespan.</p>\n<p>So right now I've got loops running that are rebuilding a source control system where:</p>\n<ul>\n<li>contents are encrypted;</li>\n<li>agents get a claim, which provides a materialized view of the repository;</li>\n<li>that means real ACLs. Share a sub-path with a contractor, much like Windows file permissions, instead of &quot;the Git repo has everything.&quot;</li>\n</ul>\n<p>It's a distributed system, so I'm building it in Rust and building <strong>the simulator first</strong>, then driving the agent to validate everything through the simulator. That has kept the agent on the rails remarkably well.</p>\n<h2>chapters</h2>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=55s&amp;ref=ghuntley.com\">0:55</a> — the economics of AI are cooked</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=150s&amp;ref=ghuntley.com\">2:30</a> — where you actually need frontier intelligence</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=270s&amp;ref=ghuntley.com\">4:30</a> — get your tokens cheap</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=331s&amp;ref=ghuntley.com\">5:31</a> — Loom and software factories</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=421s&amp;ref=ghuntley.com\">7:01</a> — rebuilding source control; Git is end of life</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=511s&amp;ref=ghuntley.com\">8:31</a> — simulator-first development</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=540s&amp;ref=ghuntley.com\">9:00</a> — OCaml, unikernels and forty years of human-centric computing</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=650s&amp;ref=ghuntley.com\">10:50</a> — readable vs explainable</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=810s&amp;ref=ghuntley.com\">13:30</a> — types as back pressure</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=870s&amp;ref=ghuntley.com\">14:30</a> — languages designed by committee</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=960s&amp;ref=ghuntley.com\">16:00</a> — languages are fungible</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=1170s&amp;ref=ghuntley.com\">19:30</a> — the V8 hot rod</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.youtube.com/watch?v=vrCE5m2MRys&amp;t=1230s&amp;ref=ghuntley.com\">20:30</a> — optimise for agents, not humans</li>\n</ul>\n<p>Keep curious.</p>\n",
  "content_markdown": "I sat down with the folks at AI21 Labs for their YAAP podcast at the AI:Engineer World Fair, and we went deep on something I've been chewing on for most of this year: almost every decision in computing for the last forty years was made with a human in the loop, as the reader, the writer, or the operator. What happens when that stops being true?\n\n[YAAP | Your Code Doesn't Need to Be Readable Anymore](https://www.youtube.com/watch?v=vrCE5m2MRys)\n\nYAAP by AI21 Labs — \"Your Code Doesn't Need to Be Readable Anymore\" (21 minutes)\n\nHere's the gist, written up properly, plus chapter links at the bottom if you want to jump into a specific part of the conversation.\n\n> Software doesn't need to be readable by a human. It needs to be explainable to a human.\n\n## the economics of AI are cooked, and I still haven't written code by hand in two years\n\nThe opening hot take was that AI economics are absolutely cooked because adoption is nowhere near what is needed to achieve ROI on the amount of capital deployed. This is why all the labs are hiring aggressively to staff up professional services organizations around the world right now. Go read Ed Zitron's [Where's Your Ed At](https://www.wheresyoured.at/?ref=ghuntley.com) if you want the long version.\n\nSo far, the only reliable ways anyone has found to make money with AI are reselling tokens with a markup (and competing directly against the labs while you do it) or selling the infrastructure around them: sandboxes and the like.\n\nBoth things can be true at once. The economics can be cooked, *and* how I develop software has completely, fundamentally changed. I haven't written code by hand for two years. These models generate code better than most employers can actually hire for.\n\nWhat changes is how you think about spend. The thing we're all going to discover over the next year is **where we actually need frontier intelligence and where we don't**. Frontier intelligence is expensive, and you don't need it for every single task.\n\n- The models have been good enough for at least a year. There was a real jump from Sonnet 3.5 to the Opus 4-ish range; since then it's been marginal. The hype and hysteria around alignment and security change, but the capability mostly hasn't. These models have always known how to drive Kali and Burp Suite.\n- Personally, I run a mix of GPT 6.1 sol on no or low reasoning, and GLM/Kimi. I use programming languages that let me get away with that (more on that below).\n- Find the right model for the task, then buy those tokens wherever they're cheapest. Take an open-weights model like GLM, run it on Baseten, and it costs a fraction as much.\n- If you're a company, check for zero data retention. At home? Just get your tokens cheap. There was a time when Z.ai's yearly GLM plan was $300 AUD a *year*, compared with $300 a *month* for the big labs' plans. Some of the smartest engineers I know bought twenty of them and ripped with concurrency.\n\nIt's not about the model anymore. It's about how you use the model.\n\n## the last forty years of computing were designed around humans\n\nWhy does a computer have a console? Because we used to have mainframe operators. A whole lot of what we consider \"how computers work\" is really \"how computers were made legible to people.\"\n\nBack in March I took a detour, picked OCaml back up because it has an effect system built in, and started playing with unikernels via [MirageOS](https://mirage.io/?ref=ghuntley.com).\n\nMost applications run *on* an operating system. What if the application *was* the operating system — a very thin one, with almost no overhead? Most software gets breached either through an exploit in the OS layer or through the app layer as a foothold into the OS. Delete the OS layer, and you delete that class of problem.\n\nI ended up rebuilding essentially Erlang as a distributed operating system. Is that a dead end? Maybe. Sometimes these experiments are. But knowing what's possible, and where it works and where it doesn't, lets you rethink the last forty years and ask a better question: **can we delete instead of build?**\n\nHumans aren't operating machines anymore either. You hand a Docker container to a Kubernetes cluster and an operator control loop manages it. Once the human is out of the loop, the design decisions that existed for the human are up for renegotiation.\n\nI truly think Unikernels are going to come back into fashion hard over the next couple of years for security reasons. All the friction... that existed when architecting an application with this design no longer exists.\n\n## readable vs explainable\n\nPeople are still saying, very loudly, that code should be readable so that humans can understand it. I no longer think that's the goal.\n\nTry this for fun: go play with Haskell this weekend. It doesn't matter if you've never touched it. The LLMs know it. There's a lot of dogma out there about things being hard to learn. Well, they're now false. Learning things like Nix and Haskell used to be pushing shit uphill and unachievable in a single sitting. But now the LLM knows it's easy.\n\nBelow, you'll find a function that I have deliberately obfuscated....\n\n```haskell\nf :: String -> String\nf = g . h\n  where\n    h []     = []\n    h (x:xs) = h xs ++ [x]\n    g x =\n      let (y, z) = p x\n      in if y then z else g z\n    p []       = (True, [])\n    p [x]      = (True, [x])\n    p (x:y:xs)\n      | x > y     = let (a, b) = p (x:xs) in (False, y:b)\n      | otherwise = let (a, b) = p (y:xs) in (a, x:b)\n```\n\nRight now you're probably looking at the code and going... What the actual ... is this?\n\nNow copy that function into an LLM and prompt it to *\"explain this function to me as if you were explaining it to my son or daughter but in Python as a reference.\"*\n\nAll of a sudden it becomes accessible. It reads like Python.\n\n> This Haskell turns a string into its letters in alphabetical order. It does that in two steps: flip the string backwards, then keep bubbling letters into order until nothing moves.\n\n```python\ndef flip(letters):\n    \"\"\"Put the string backwards. 'cat' becomes 'tac'.\"\"\"\n    if letters == \"\":\n        return \"\"\n    first = letters[0]\n    rest = letters[1:]\n    return flip(rest) + first\n\ndef one_pass(letters):\n    \"\"\"\n    Walk the letters once.\n    Whenever a bigger letter is sitting in front of a smaller one,\n    slide the smaller one forward.\n    Also report whether anything moved.\n    \"\"\"\n    if len(letters) <= 1:\n        return True, letters  # already tidy\n\n    first = letters[0]\n    second = letters[1]\n    rest = letters[2:]\n\n    if first > second:\n        # smaller one goes in front; keep comparing the bigger one\n        moved, after = one_pass(first + rest)\n        return False, second + after\n    else:\n        # these two are fine; check the rest\n        moved, after = one_pass(second + rest)\n        return moved, first + after\n\ndef tidy_up(letters):\n    \"\"\"Keep doing one pass until a whole pass changes nothing.\"\"\"\n    done, letters = one_pass(letters)\n    if done:\n        return letters\n    return tidy_up(letters)\n\ndef f(text):\n    return tidy_up(flip(text))\n```\n\nThat's the shift. The artifact doesn't need to be optimized for a human to read cold. It needs to be something a model can explain to a human on demand.\n\n## types are back pressure\n\nIf you want a codebase that agents can maintain, you'll notice something quickly: **a Rust codebase is far more maintainable with agents than a Python one**. Types are a form of verification. They provide [back pressure](https://ghuntley.com/pressure/): compiler errors that the LLM picks up and fixes automatically, every loop.\n\nThink of it as a continuum of power. Up one end, Haskell is even stricter than Rust. At the other end, you've got Ruby, Python, PHP, and Perl, where types were never a first-class citizen and are hard to bolt on after the fact.\n\nThis is also why I can get away with cheaper models. Pick a language that does the verification for you, and you need less intelligence to stay on the rails.\n\n## programming languages move at the speed of human learning\n\nLanguages evolve through committees, and the pace of language development has been deliberately slowed to match the rate at which humans can learn new concepts.\n\nI remember when monads arrived in .NET — LINQ in 3.5, championed by Erik Meijer. We're talking about `SelectMany`, flat map, to be blunt. It took an easy five to eight years before people were comfortable with it. Now it's everywhere in every programming language.\n\nOr look at Python 2 to 3. It's been about fifteen years, and there are still wounds. The lesson the industry took was \"you must not break users,\" so nobody makes breaking changes.\n\nBut what happens if the language designer ships a skills pack alongside the breaking change, and the agent just does the migration?\n\n> If humans aren't the target audience, we don't have to dumb down the language for adoption, and the LLMs have the entire corpus of programming language theory — what can we do with that?\n\nThere are maybe ten or twelve truly great applied programming language designers in the world, and most of them have **specialized their careers in human accessibility**.\n\nIt's going to take people on the fringe of comp sci (the ones who were told, \"you can't do that, nobody will learn it\") to hear that this is now false. You can take research that's twenty years old, put it together, and the LLM will do it for you.\n\nI've been collecting other nerds who are thinking along the same lines. No results to show yet. We're all just playing with this new substrate.\n\n> If coding agents will write most of our code, what happens with our communities and sense of ergonomics? How does it impact our compilers and tools? [https://t.co/DaYCSHFUBY](https://t.co/DaYCSHFUBY?ref=ghuntley.com)\n>\n> — José Valim (@josevalim) [September 24, 2026](https://x.com/josevalim/status/2103133294317445290?ref_src=twsrc%5Etfw&ref=ghuntley.com)\n\nHighly recommend reading this article. Programming language authors who build their languages around agent-first rather than human-first will get ahead. Those who don't will fall behind and end up like Solaris.\n\n## languages are fungible now\n\nConsider being a CTO before AI...\n\n> \"We need to hire a Ruby person. Over here it's .NET, so that's a separate team. And the company we acquired is Java.\"\n\nThe end business impact is that you are maintaining three teams, or teams of teams, on tribal ideology about programming languages.\n\nNow you can [run loops](https://ghuntley.com/loop/) to port from one language to the next. A founder in the medical space in Australia had an old ASP.NET Web Forms app on IIS. Terrible, terrible, terrible; I've done it, I know. I challenged him to run some loops himself, then go back to his team the next morning without telling them and ask for an estimate on the rewrite. They said years. A week later the migration was done. He did it all himself and completely mogged his engineering team.\n\nPorting is easy when the end result is easy to verify. Stealing an idea from a Go library and wanting it in Rust is easy now, and has been for at least a year.\n\n[Can a LLM convert C, to ASM to specs and then to a working Z/80 Speccy tape? Yes.](https://ghuntley.com/z80)\n\n✨Daniel Joyce used the techniques described in this post to port ls to rust via an objdump. You can see the code here: https://github.com/DanielJoyce/ls-rs. Keen, to see more examples - get in contact if you ship something! Damien Guard nerd sniped me and other folks wanted\n\n![](https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/icon/A-black-and-white--low-angle-digital-illustration-in-a-symbolic-traditional-tattoo-art-style.--A-bald--light-skinned-man-with-a-bushy-beard--prominent-eyebrows--and-a-friendly-expression-wears-denim-overalls--2--c4421c9b-5f3c-40dc-838c-40b5235ce4e8.jpg)Geoffrey Huntley Geoffrey Huntley\n\n![](https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/thumbnail/bafkreiftzmpb7bbkej76rac3kuijg2mcuyjxxhtnqdie5qq6rbrc45v2iu-1-a7544c4e-6d21-416a-898f-997162311d6f.jpg)\n\nIt is provably true that languages are fungible, and it makes no business sense to carry so many of them in your business today.\n\nOperating systems went through a convergence event: AIX, Solaris, HP-UX and IRIX all collapsed into Mac, Linux and Windows. I expect programming languages to converge the same way: down to a couple of gilded languages, or something new rises from the dust.\n\n## the V8 hot rod\n\nThe usual objection to a new programming language is adoption. But you don't necessarily need adoption now when deciding whether to use a language, now that we have AI. Like, what libraries exist in this ecosystem don't factor into my decision to create a new project these days.\n\n[what is the point of libraries now that you can just generate them?](https://ghuntley.com/libraries)\n\nIt’s a meme as accurate as time. The problem is that our digital infrastructure depends upon just some random guy in Nebraska. Open-source, by design, is not financially sustainable. Finding reliable, well-defined funding sources is exceptionally challenging. As projects grow in size, many maintainers burn out and\n\n![](https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/icon/A-black-and-white--low-angle-digital-illustration-in-a-symbolic-traditional-tattoo-art-style.--A-bald--light-skinned-man-with-a-bushy-beard--prominent-eyebrows--and-a-friendly-expression-wears-denim-overalls--2--c23bc14e-360c-4106-9896-e25298235b65.jpg)Geoffrey Huntley Geoffrey Huntley\n\n![](https://storage.ghost.io/c/06/e5/06e5d12b-0328-469d-a0d0-3a0f0ba34c46/content/images/thumbnail/A-symbolic-traditional-tattoo-art-print-of-a-software-library-in-vibrant-retro-colors-with-complex-ornamental-details.-Creative-light-art-is-used-to-achieve-an-abstract-pattern-with-complimentary-colors--balance-36436c4b-e2ea-4613-85eb-539cecd7bc7d.jpg)\n\nIf you'd built some sick V8 hot rod and everyone else was on a horse, would you care whether they adopted it? \"Yeah, enjoy that horse, mate.\"\n\nThat's why this area is interesting. Not \"is there a faster programming language,\" but: can we incorporate more ideas from verification into our languages, stop optimizing for humans, and start optimizing for agents? Is there a way to go faster? I don't know yet. I guess we'll have to find out.\n\n## what I'm building in the meantime\n\nSince January, I've been talking about Loom and the idea of a software factory, something that optimizes a whole business function. It's on GitHub, it's not really usable, and it's not intended to be; it's research.\n\nSoftware factories are very, very hard to do right now. For the last six months, my view has been that we need one of: better models, better programming languages, or a revival of some old computer science techniques like simulators.\n\nUltimately, I want to replace GitHub. I want to bring back something like Phabricator, the engineering system that predates GitHub and came out of Facebook's early days. Google has Piper and Rosie for large-scale refactoring. Meta has EdenFS, Mononoke and Sapling. If GitHub is the only thing you've seen, it seems fine. It's not good enough. I think Git is somewhat end-of-life; I really wish people would stop trying to extend Git's lifespan.\n\nSo right now I've got loops running that are rebuilding a source control system where:\n\n- contents are encrypted;\n- agents get a claim, which provides a materialized view of the repository;\n- that means real ACLs. Share a sub-path with a contractor, much like Windows file permissions, instead of \"the Git repo has everything.\"\n\nIt's a distributed system, so I'm building it in Rust and building **the simulator first**, then driving the agent to validate everything through the simulator. That has kept the agent on the rails remarkably well.\n\n## chapters\n\n- [0:55](https://www.youtube.com/watch?v=vrCE5m2MRys&t=55s&ref=ghuntley.com) — the economics of AI are cooked\n- [2:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=150s&ref=ghuntley.com) — where you actually need frontier intelligence\n- [4:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=270s&ref=ghuntley.com) — get your tokens cheap\n- [5:31](https://www.youtube.com/watch?v=vrCE5m2MRys&t=331s&ref=ghuntley.com) — Loom and software factories\n- [7:01](https://www.youtube.com/watch?v=vrCE5m2MRys&t=421s&ref=ghuntley.com) — rebuilding source control; Git is end of life\n- [8:31](https://www.youtube.com/watch?v=vrCE5m2MRys&t=511s&ref=ghuntley.com) — simulator-first development\n- [9:00](https://www.youtube.com/watch?v=vrCE5m2MRys&t=540s&ref=ghuntley.com) — OCaml, unikernels and forty years of human-centric computing\n- [10:50](https://www.youtube.com/watch?v=vrCE5m2MRys&t=650s&ref=ghuntley.com) — readable vs explainable\n- [13:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=810s&ref=ghuntley.com) — types as back pressure\n- [14:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=870s&ref=ghuntley.com) — languages designed by committee\n- [16:00](https://www.youtube.com/watch?v=vrCE5m2MRys&t=960s&ref=ghuntley.com) — languages are fungible\n- [19:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=1170s&ref=ghuntley.com) — the V8 hot rod\n- [20:30](https://www.youtube.com/watch?v=vrCE5m2MRys&t=1230s&ref=ghuntley.com) — optimise for agents, not humans\n\nKeep curious.\n",
  "dateCreated": "2026-10-02T08:58:34.290726633+00:00",
  "date_created": "2026-10-02T06:06:40+00:00",
  "date_modified": "2026-10-02T06:06:40+00:00",
  "date_published": "2026-10-02T06:06:40+00:00",
  "description": "Forty years of computing was designed around humans as the reader, writer and operator. On AI21's YAAP podcast I argued that's no longer a design goal, and what that means for programming languages.",
  "external_url": "https://ghuntley.com/readable/",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/ghuntley-com/2026/10/2026-10-02-software-doesn-t-need-to-be-readable-anymore-it-needs-to-be.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/ghuntley-com/2026/10/2026-10-02-software-doesn-t-need-to-be-readable-anymore-it-needs-to-be.md"
  },
  "id": "urn:aggr:item:02ee3a8af37d0bd9f255f700b7fc06f2564c4bdf",
  "isBasedOn": {
    "@id": "https://ghuntley.com/readable/"
  },
  "mainEntity": {
    "@id": "https://ghuntley.com/readable/",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/ghuntley-com/2026-10-02-software-doesn-t-need-to-be-readable-anymore-it-needs-to-be/#webpage"
    },
    "author": [
      {
        "@type": "Person",
        "name": "Geoffrey Huntley"
      }
    ],
    "dateModified": "2026-10-02T06:06:40+00:00",
    "datePublished": "2026-10-02T06:06:40+00:00",
    "headline": "software doesn't need to be readable anymore. it needs to be explainable.",
    "timeRequired": "PT12M",
    "url": "https://ghuntley.com/readable/",
    "wordCount": 2502
  },
  "name": "Archived snapshot: software doesn't need to be readable anymore. it needs to be explainable.",
  "preview": null,
  "reading_minutes": 12,
  "replicated_at": null,
  "source": "ghuntley-com",
  "source_name": "Geoffrey Huntley",
  "summary": "Forty years of computing was designed around humans as the reader, writer and operator. On AI21's YAAP podcast I argued that's no longer a design goal, and what that means for programming languages.",
  "tags": [
    "ai"
  ],
  "temporalCoverage": "2026-10-02T08:58:34.290726633+00:00",
  "title": "software doesn't need to be readable anymore. it needs to be explainable.",
  "url": "https://aggr.aymericbeaumet.com/items/ghuntley-com/2026-10-02-software-doesn-t-need-to-be-readable-anymore-it-needs-to-be/",
  "word_count": 2502
}