Code Is a Commodity Now. Go Was Designed for That.
In which the author, having worn Rust, Python, Java and TypeScript like regimental colours, watches a machine write all four without saluting, goes looking for a language too difficult to automate, and returns — not saved, but something less flattering and considerably more useful — unremarkable.…a…
Annons
Annons
In which the author, having worn Rust, Python, Java and TypeScript like regimental colours, watches a machine write all four without saluting, goes looking for a language too difficult to automate, and returns — not saved, but something less flattering and considerably more useful — unremarkable.…a gopher, unbothered, possibly asleep…I should declare an interest: this is my fifth conversion, and I would like to announce it with precisely the fervour I am about to describe as the problem.Over nearly two decades I have been, with generously overlapping tenancies, a PHP developer (karmic debt, ongoing), a TypeScript developer (bread, butter, resignation), a Java developer (briefly, mostly to see what all the factories were for), a Python developer (for the machine learning, allegedly) and — loudest of all — a Rust developer. Each time the noun arrived before the verb. “I didn’t use Rust. I was one. I was, I am… Rustacean” I claimed...And now I am going back to Go. Not converting — my therapist has gently suggested I stop converting to things — but returning, the way one returns to sensible shoes after a summer of regrettable sandals.The claim, stated plainly so you can hold me to it: generating code is becoming cheap; understanding it, verifying it and owning its consequences are not. Go was not designed for machines — it predates them by well over a decade — but it was designed for a problem the machines make considerably worse, and that turns out to matter.Oh, get off it, I hear you say — an essay about not identifying with your programming language is itself an act of identifying with one. Quite. The irony is load-bearing, and it has a section of its own near the end, where it is allowed to beat me up properly.I. Regimental Colours (Or: A Brief History of My Conversions)“You need a change of soul rather than a change of climate.”— Seneca, Letter XXVIII, to a friend who kept rewriting his side project in a new language every spring…five regimental colours, slightly moth-eaten, one still in its packaging…Lucilius had been travelling and wrote to Seneca, mildly indignant that his gloom had come along for the ride. Seneca’s reply borrows its sharpest line from Socrates: you always take yourself with you. I have taken myself with me through five languages, each time certain the luggage would stay at the old address.Programming languages, whatever we say at conferences, are not primarily tools. They are regimental colours, each with a cosmology and a characteristic way of looking down on the others. Python ships its scripture inside the interpreter: type import this and nineteen aphorisms recite themselves, like a Gideon Bible in a hotel drawer.Java built an empire of nouns. TypeScript is less a faith than a mortgage. PHP is a penance one serves rather than chooses. Rust is a morality: original sin (aliasing), confession (the compiler error), absolution (a clean cargo build, first time, a small private Te Deum).Each cosmology exists because it solved something real. The trouble starts when the noun swallows the verb. “I use Rust” is a sentence about a project; “I am a Rust developer” is a sentence about a person, and every technical disagreement then becomes a referendum on that person’s worth.Polish has a word English has no proper drawer for: partyzantka — literally partisan warfare, colloquially serious work done by improvisation, off the books, with whatever happened to be lying about in the forest. That was my professional self-image for years, and, I suspect, that of a fair number of people who learnt the trade east of the Oder in the nineties: the one who knows the obscure thing and gets it running when the official channel can’t.The language was the forest; knowing its paths was the identity. Every conversation was a change of forest. Same partisan, same slightly theatrical beard. Then, around the time the models stopped being a party trick, somebody walked into the forest with a map — and the map knew all the paths. So it goes.II. Where Is Your God Now (Or: The Machine Speaks Every Dialect)“God is dead. God remains dead. And we have killed him.”— Friedrich Nietzsche, The Gay Science §125, on the occasion of the first model to satisfy the borrow checker at the first attempt…the forest, freshly mapped, slightly embarrassed about it…The madman in Nietzsche’s parable runs into the marketplace with a lantern in broad daylight, and the bit everyone forgets is that the crowd doesn’t gasp. They laugh. They are unbelievers already; they simply haven’t noticed what it will cost them.That is roughly where many of us are with the models. Nobody is shocked that a machine can produce a Python service, a React component or — with some coaxing and, in my experience, rather more .clone() than necessary — a serviceable Rust command-line tool. If it writes your language without an accent, what exactly is "I am a Rust developer" claiming any more?Not that I can write Rust; so can it. What remains is closer to "I have suffered in a particular way and would like it recognised" — a perfectly human wish, and a terrible thing to put on an invoice. The conference circuit, naturally, assures us the identity isn't dead, merely resting. I'd check whether it has been nailed to its perch.The first reaction, and I had it, is flight: find a denser forest. A language thin in the training data; a runtime whose failure modes require war stories. Zig, perhaps. Surely the map doesn’t reach that far.Honesty clause, as required by house rules: I didn’t merely consider this; I wrote it down. In September I drafted a thesis on why Rust would be my moat and my katana — the language the models would converge on, the place where human supervision would matter most. Parts of it I still believe, and it testifies against me in section XII. But the shape of the reasoning gives it away. It wasn’t “which tool fits the problem”. It was “which tool will let me stay who I am”.Which brings us to the moat — the oldest defensive idea in the book, and one of the least reliable.III. The Moat Fallacy (Or: Zig Won’t Save You Either)“The more labels you have for yourself, the dumber they make you.”— Paul Graham, Keep Your Identity Small, 2009 — eight years after explaining that Lisp had been his secret weapon against the competition…three moats, one drawbridge, no castle…There is no real contradiction in Graham. In “Beating the Averages” (2001), Lisp gave his startup an edge because competitors couldn’t see what they were missing; by 2009, labels made you stupid. The thread between them: the moat was never the language. It was the asymmetry, and it lasted as long as the knowledge stayed scarce.The models are steadily eroding one particular scarcity — the ability to produce working code in a given language — even as they create others: verification, integration, context, accountability. A moat dug out of production difficulty fills in at the rate the training data does.Rust……is the obvious candidate, and the one I bet on. Its difficulty is front-loaded and mechanical — the compiler explains exactly what is wrong — which is precisely the feedback loop a model can iterate against until it passes. The compiler doesn’t make Rust hard for machines. It makes Rust gradeable — not proved right, merely failed often and automatically, like a driving test with no limit on retakes. The worst possible property for a moat and, as section XII will argue at my expense, one of the best for a supervisor.Zig……is younger and wonderfully candid — allocation goes through an allocator you pass in by hand, like a restaurant printing the name of the farm on the menu — and genuinely thin in the training data today. But “the model hasn’t read much of it yet” is a moat with a timestamp.Haskell……has been called a moat for thirty-odd years, mostly by people who don’t write it. Its admirers rightly say it was never about the moat. The difficulty of its abstractions buys something real — the power to model a problem precisely enough that whole classes of mistakes can’t even be expressed — and many of its ideas have since been lifted into everything else. But what made Haskell valuable was the modelling, not the barrier to entry, and only the barrier was ever a moat.Difficulty is a property of the learner; fit is a property of the problem. If difficulty is no defence, what is? Oddly, the best answer comes from the language designed — explicitly, on the record — to have as little of it as possible.IV. The Most Mocked Sentence in Language Design (Or: Pike Was Writing for the Model)“Clear is better than clever.”— Rob Pike, Go Proverbs, Gopherfest 2015, in a talk that was, regrettably, rather clever…a sentence, much quoted, seldom finished…In 2014, at Lang.NEXT, Rob Pike explained who Go was for. Google’s programmers, he said, are not researchers; they are typically young, fresh out of university, having probably learnt Java, maybe C or C++, probably Python. Then the line that has followed Go around ever since like a tin can tied to a cat’s tail: they are “not capable of understanding a brilliant language”. So the language had to be easy to understand and easy to adopt — familiar, roughly C-like, nothing too radical.The internet has spent a decade using this as proof that Go was designed for cogs. The phrasing is not kind. But the point underneath it was about adoption rather than intelligence: a language that a large, constantly changing population can pick up quickly, and in which they can read one another’s code.Now swap one noun. Replace Googlers fresh out of university with a model trained on the public internet, and look at what remains of the brief: an author with wide but shallow exposure, no time to absorb anything radical, producing code that a great many strangers must later read, review and keep alive. That describes, uncomfortably well, what is fast becoming the most prolific contributor to a good many repositories.The longer argument was in Pike’s 2012 paper, Go at Google: Language Design in the Service of Software Engineering. Go was optimised not for the person writing the code but for the one arriving later, knowing nothing, with a pager going off — thousands of engineers, an enormous shared codebase, authors churning through it faster than anyone could learn their habits. Go was designed for interchangeable authors before authorship was cheap.Note what this does not claim. Go was built for humans at scale, not for machines; the resemblance between an unknown colleague and a model is an analogy, not a proof. Nor does tidiness guarantee anything — a gofmt’d bug is just a bug that has made an effort. The claim is narrower, and concerns the other end of the transaction: a language that makes an unknown author’s code legible to an unknown reader is useful when the reader is you, at three in the morning, wondering whose idea this was.Honesty clause, as required by house rules: we are defending the constraint, not the tone. And there is an irony the man himself would not enjoy. On Christmas Day 2025 an AI agent, part of an experiment in “random acts of kindness”, sent Pike an unsolicited thank-you email. His reply on Bluesky was furious, largely unprintable, and aimed at machines that thank him “for striving for simpler software”.I don’t think that is hypocrisy; I think it is this essay in miniature. The simplicity was for people, and so was the meaning. The machine can take the first without ever touching the second, and a thank-you that costs nothing to write is worth precisely that.The design brief has a second half, though — the half that makes Go faintly impossible to love.V. No Romance (Or: Charlotte Lucas Chooses Go)“I am not romantic, you know; I never was. I ask only a comfortable home.”— Jane Austen, Pride and Prejudice, Charlotte Lucas explaining her choice of language to Elizabeth, who has strong opinions about monads…a comfortable home, centrally heated, no view to speak of…Every language you can fall in love with has a founding myth. Lisp has John McCarthy discovering that code and data could be the same thing — an idea Alan Kay later called the Maxwell’s equations of software. Rust has Graydon Hoare in 2006, climbing to his twenty-first-floor flat in Vancouver because the lift’s software had crashed again, deciding this was no way to run a civilisation, and naming his answer after a fungus over-engineered for survival. You could film that.Go’s founding myth: in September 2007 Rob Pike was making a small change to an enormous C++ program at Google, and his compilations took about forty-five minutes. That’s the burning bush. A queue, not a revelation — three distinguished engineers who, faced with a long build, preferred designing a language to sitting through it. It is the linguistic equivalent of meeting your spouse in the post-office queue and agreeing, on balance, that it would be more efficient.Romance needs a better story than that, and Heidegger explains why. The hammer in use withdraws: you notice the nail and the joint, and the hammer disappears into the work. It becomes an object to contemplate only when it breaks or goes missing. Romance is a relationship with an object — you can only love what you are looking at.Rust asks to be looked at; the borrow checker has moods. Go asks you to look at the problem, and seems faintly put out if you look at Go instead. It is a running shoe: good precisely when you can’t feel it, and nobody has ever told a dinner-party story about the pair that didn’t give them blisters.Which brings us to Charlotte Lucas, who accepts the absurd Mr Collins and tells a horrified Elizabeth that she asks only a comfortable home. Readers have pitied her for two centuries; Austen doesn’t. When Elizabeth visits the parsonage, Charlotte has chosen a sitting room at the back of the house, for the excellent reason that her husband is thereby much less often in it. She has arranged the parlour so that she rarely has to look at the thing she married, and got on with her life. That is the Go relationship entire.Two honest takes here… First, the least romantic language in the world was designed by Ken Thompson, co-creator of Unix, with Pike and Robert Griesemer — about as romantic a pedigree as computing has. Go’s plainness is less a lack of breeding than the understatement of old money. Second, and more seriously: the absence of romance is a real cost, not a charming quirk. People leave Go out of sheer boredom, and a language nobody loves is one few people evangelise to their juniors.Pike noticed something telling in 2012. Go had been built by C++ programmers for C++ problems, yet its converts came mostly from Python, and Ruby. His explanation was a question — is less more, or is less less? The romantics, it turned out, thought less was less.The next problem is textual, and it is the one that makes clever people genuinely cross.VI. All Happy Codebases Are Alike (Or: The Junior and the Greybeard Are Indistinguishable)“Happy families are all alike; every unhappy family is unhappy in its own way.”— Leo Tolstoy, Anna Karenina, on gofmt’d repositories, as opposed to my TypeScript from 2019…suspects are sort of alike…Go code is obvious — to a degree that borders on the impolite. It reads like the instructions on the side of a fire extinguisher: what this does, in what order, and what happens if it fails. The clever find this genuinely offensive, and I say so as someone who has, at various points, been the clever.The candour is engineered by subtraction. No exceptions leaping invisibly across six stack frames. No operator overloading, so + cannot secretly be a database call. No macros, no implicit numeric conversions, no inheritance hierarchy from which behaviour descends three floors up like a wardrobe through the ceiling.Generics did arrive — in Go 1.18, in March 2022, a little over twelve years after the language went public, which is roughly how long the Church of England takes to approve a new hymn. And then there is the most mocked construct in the language:if err != nil { return fmt.Errorf("load invoice %s: %w", id, err)}You will write it thousands of times. It is the beige wallpaper of every Go codebase, and also, I have come to think, the most honest three lines in mainstream programming: every time, this can fail, and here is what happens when it does. Obvious to the point of rudeness.With so few ways to say anything, there are very few ways to sound like yourself:$ git blame internal/billing/invoice.go -L 41,443f9a1c07 (intern 2026-09-14 10:12:03 +0200 41) inv, err := store.Load(ctx, id)7be2d410 (coding-agent 2026-09-15 02:47:51 +0200 42) if err != nil {7be2d410 (coding-agent 2026-09-15 02:47:51 +0200 43) return fmt.Errorf("load invoice %s: %w", id, err)e04c9b11 (krzys 2026-09-15 09:30:12 +0200 44) }Three authors, one house style. Try to guess which line cost twenty years of experience. (The closing brace. I’m very proud of it.)The review loop enforces this from both directions. Write something ingenious — an iterator pipeline, say, now that range-over-func has been in the language since Go 1.23 — and see what happens:// The version I wrote to feel something.func Filter[T any](seq iter.Seq[T], keep func(T) bool) iter.Seq[T] { return func(yield func(T) bool) { for v := range seq { if keep(v) && !yield(v) { return } } }}func Map[T, U any](seq iter.Seq[T], f func(T) U) iter.Seq[U] { return func(yield func(U) bool) { for v := range seq { if !yield(f(v)) { return } } }}emails := slices.Collect( Map( Filter(slices.Values(users), isActive), emailOf, ),)// What the model and your colleague will both suggest in review,// independently, within the hour, in almost the same words.var emails []stringfor _, u := range users { if u.Active { emails = append(emails, u.Email) }}The clever version is correct, even rather lovely. And both reviewers — the one made of silicon and the one made of disappointment — will tell you that you’ve overcomplicated it, and both will be right. In Go, the machine and the colleague have converged on the same cultural norm: don’t show off.Honesty clause, as required by house rules: the obviousness has a price. Forty lines of error plumbing to read a config file is not candour; it is noise with good posture, and on bad days you pay for it in scrolling. And sameness of style is not sameness of correctness — a uniformly formatted bug is still a bug, merely a tidier one.But notice what has happened to the greybeard. If his code is indistinguishable from the intern’s and the agent’s, whatever he is being paid for is not in the code. It is in what was decided before the first line, and in what was never written at all.VII. A Simple Language for Complicated Things (Or: Strategy, With Sane Defaults)“Amateurs talk about tactics, but professionals study logistics.”— General Robert H. Barrow, USMC, in 1979 or 1980 depending on whom you ask, and possibly several people before him — which is itself a lesson in supply chains…the quartermaster, unglamorous, holding everything together…This took me longest to see, and it is why the models eating Go code bothers almost nobody. Go is a simple language in which people build complicated things — schedulers, orchestrators, databases, the control planes of whole clouds. The complexity never lived in the syntax. It lives in the composition: what talks to what, what fails together, what must never wait on what. The model can write the handler. It cannot decide that the handler shouldn’t exist.Go manages this by handing tactics to defaults. You don’t choose threads; you write go f() and the runtime multiplexes goroutines onto OS threads as it sees fit. You don't manage memory. The HTTP stack, test runner, formatter and build system come in the box, and arguing about them is regarded as faintly vulgar. Cancellation and deadlines travel down the call chain in a context.The output is usually a single executable, statically linked unless cgo gets involved — and cgo, as another of Pike's proverbs has it, is not Go. The Go 1 compatibility promise of 2012 means code written then still builds now: logistics in the literal sense, the supply lines kept open.What is left for the programmer is strategy: the shape of the system, its boundaries, its failure domains. Pike’s 2012 paper aimed Go squarely at programming in the large, where thousands of people work on millions of lines and nobody holds the whole in their head. At that scale tactics must be standardised, or they eat the strategy alive.Rust makes the opposite bet, and a respectable one: it makes tactics explicit — ownership, lifetimes, allocation, what may cross a thread boundary — and so turns each tactical decision into something the compiler can check. Three properties get muddled in arguments like this one, usually by people with a side to take (hello). Readability: a human grasps the intent quickly — Go’s party piece. Constraint: certain mistakes become impossible, or at least noisy — Rust’s.Verifiability: the thing actually does what was required — which no language wins at all, because it lives in tests, specifications and the one person who remembers what “required” meant before the meeting. When most of the code comes from something tireless and only intermittently right, the second and third start to outrank the first. Hold that thought; it comes back armed in section XII.Honesty clause, as required by house rules — and here it needs a list, because the sane defaults are not uniformly sane.First, the HTTP client. http.DefaultClient has no timeout at all; it will wait for a reply with the patience of a medieval siege. The default transport keeps just two idle connections per host, a tactic nobody consciously chose and many have discovered at three in the morning. The idiomatic fix is rather telling — clone the sane defaults, then overrule the one that isn't:// http.DefaultClient has no timeout. Fine for a script.// Not fine for anything with a pager attached.transport := http.DefaultTransport.(*http.Transport).Clone() // keep the sane defaults...transport.MaxIdleConnsPerHost = 32 // ...overrule the one that isn't (it's 2)client := &http.Client{ Timeout: 10 * time.Second, // the whole exchange: dial, redirects, body Transport: transport,}Second, and my favourite: until Go 1.25, released in August 2025, the runtime set GOMAXPROCS from the CPUs it could see and took no account of the container's cgroup CPU bandwidth limit. The language of cloud infrastructure spent most of its life not knowing how much CPU its container was actually allowed. For years the fix was a blank import of Uber's automaxprocs library, a sort of prosthetic self-awareness. Go 1.25 reads the cgroup limit itself — the limit, mind you, not the request.Third, the collector. In 2020 Discord moved its Read States service from Go to Rust: tens of millions of entries in an in-memory cache, and a Go runtime that forced a collection at least every two minutes regardless of heap growth, producing regular latency spikes on one of the hottest paths in the product.The post is six years old and Go’s collector has moved on considerably since. But the lesson isn’t “Go is slow”. It is narrower: when the tactic is the product, defaults lose, and it is no shame to reach for a different tool. So in Go the human’s job is strategy — which raises an awkward question about what to call the human.VIII. The Plumber Has No Spanner Tattoo (Or: Meaning Is Use)“For a large class of cases — though not for all — in which we employ the word ‘meaning’ it can be defined thus: the meaning of a word is its use in the language.”— Ludwig Wittgenstein, Philosophical Investigations §43, a man who gave away a family fortune to teach in village schools, and therefore knew something about not identifying with one’s assets…one van, no logo on the tools…Try saying, out loud, “I am a Bash developer.”It sounds absurd, and the absurdity is instructive. Almost everyone reading this writes Bash, much of it at night, much of it regrettable. Nobody builds a personality around it. You don’t be Bash. You use it — a verb in your life, never a noun.Go is heading for the same grammatical position, and I think that is the best thing about it. The people who write the most Go are rarely called “Go developers”. They are SREs, platform engineers, backend and infrastructure people — named after what they are responsible for, not after what they type. The language turns up in the job description the way a spanner turns up in a plumber’s: assumed, necessary, and not the reason anyone rang.That is the plumber’s dignity. He doesn’t identify with the adjustable spanner; he identifies with the leak — water, pressure, the alarming noise behind the bathroom wall, the elderly customer who would like a bath tonight. The spanner is adjustable precisely so that he needn’t think about it. Go is an adjustable spanner: it fits most backend problems moderately well and has the good manners not to ask for a name.Wittgenstein hedges his slogan — for a large class of cases, though not for all — and so should we. Plumbers are not immune to tool tribalism; there is, I’m told, an intense devotion in the trades to a certain German pliers wrench. But nobody paints it on the side of the van. The van says plumbing.Nor, to be fair, is identity itself the villain. You can identify with a craft, specialise deeply and still choose your tools on their merits; plenty of people manage it. The trouble starts when the identity is held more tightly than the evidence, and a verb is simply harder to hold that way. “I am a Rust developer” is threatened when the machine writes Rust. “I keep the platform up” is not threatened at all; if anything, it has just acquired an extra pair of hands.If identity follows use, the next question is what Go is actually used for — not on conference stages, but in production. Time for a field report.IX. The Cloud Runs on Unremarkable (A Field Report)“Il faut cultiver notre jardin.”— Voltaire, Candide, after thirty chapters of philosophy, on the subject of Kubernetes operators…the garden, mostly YAML, regrettably well-tended…Candide ends with its hero, having survived earthquakes, war, the Inquisition and an unconscionable amount of optimistic metaphysics, concluding that one must cultivate one’s garden — the most deflating ending of the Enlightenment, and the most correct. So, the garden: what Go is actually used for, as opposed to argued about.Mostly, the floor you are standing on. Kubernetes, Docker, containerd, etcd, Prometheus, Terraform, Vault, Consul. When Justin Cormack, then CTO at Docker, surveyed the Cloud Native Computing Foundation in late 2021, 26 of its 42 graduated and incubating projects were written predominantly in Go. That number is five years old and Rust has been moving in since, so read it as a snapshot, not a census.The people who made those choices are refreshingly unromantic about why. In the same talk Solomon Hykes said Docker chose Go partly for social reasons: they wanted outsiders to contribute, and Go’s syntax wasn’t radical enough to scare them off — not Haskell, not Lisp, which he meant as the highest compliment.The Vitess team at YouTube said they had studied Go’s authors more than the language, and liked that they were contrarian to a taste for complexity then fashionable inside Google. And Derek Collison, who moved NATS from Ruby to Go, gave perhaps the most Go answer ever recorded: when he comes back to a codebase after months away, he immediately knows what he was doing.The Go team’s 2025 developer survey — 5,379 usable responses, collected in September 2025 — fills in the rest. The top uses remain command-line tools and API services; over a third of respondents build cloud infrastructure tooling; 96% deploy to Linux, containers included; satisfaction sits at 91%, as it has since 2019.And the figure I find most telling: 81% had more professional experience than Go experience, and over 80% learned Go only after starting their careers. Go is almost nobody’s first language. People arrive at it, usually for a job, often after a few conversions elsewhere. I am not unusual. I am a demographic.Now the calibration, because a field report that only flatters is a brochure. On the web as such, Go barely registers. W3Techs, on 17 October 2026, puts PHP behind 69.4% of the websites whose server-side language it can detect, and Go behind less than 0.1% — in the same bucket, for what it’s worth, as Erlang and Haskell. Go is the plumbing beneath the web, a kind of prestige nobody sends thank-you notes for, by machine or otherwise. And the survey carries every language team’s caveat: it counts the people who stayed.The community behaves like people who use a tool rather than worship it. Its mascot — Renée French’s gopher, a creature of gentle bewilderment — makes it impossible to identify as a “gopher” without a visible wink. Its members will be the first to call the error handling tedious, and then go back and ship something. Russ Cox put the house philosophy into three words in 2023 — “Boring is good” — boring meaning you get to think about your work, not about the language.None of this is new. Every craft that turned into infrastructure went through precisely this embarrassment.X. The Sinusoid, Priesthood Edition“…a priesthood, guarding skills and mysteries that were far too complex for ordinary people.”— John Backus, at Los Alamos in 1976, describing the people who said FORTRAN would never work — and, with depressing accuracy, my old LinkedIn headline…the same wave, earlier, in a cardigan…Regular readers know the drill: whatever we are currently panicking about, someone panicked about it before, in a cardigan, with a slide rule.In the early 1950s programming meant machine code, and its practitioners were scarce, expensive and — by Backus’s own gentle account — rather pleased with themselves: proud of the hardship, like frontiersmen, and correspondingly conservative. They welcomed mechanical aids for the drudgery but met anything more ambitious with hostility and derision whenever its purpose was to make programming available to more people.FORTRAN shipped in 1957, and the absurdity compiled. The priesthood didn’t vanish; it moved — down into compilers and operating systems, up into numerical methods and the problems themselves. Nobody now introduces themselves as an IBM 704 machine-code developer.So it goes. Nor does anyone think less of the craft for it. When the mathematician John Brillhart, in the audience, agreed with the description but asked to add a caveat, Backus smiled and allowed that the sociology of the priesthood was very complex, needless to say.The wave has come round since, in different hats. Hot-metal compositors, absorbed first by phototypesetting and then by desktop publishing; the craft survived as typography, the job title rather less so. The 1990s webmaster — designer, developer, sysadmin and keeper of the FTP password in one heroic person — dissolved within a decade into half a dozen specialisms.The sysadmin who named servers after Tolkien characters, until the industry popularised pets versus cattle and began numbering them instead. And in 2003 Nicholas Carr argued in the Harvard Business Review that IT was becoming infrastructure, like railways and electricity, and would stop conferring advantage once everyone had it. The industry was furious. The cloud then spent twenty years proving him broadly right.Compressed:a craft becomes cheap → the guild declares it impossible → it happens anyway → the guild declares the result vulgar → the vulgar result becomes infrastructure → the identity migrates to whatever is still scarce → that layer forms a guild of its ownWith respect to code, we are somewhere between the second and fourth arrows, and the guild in question is — honestly — me. I belong to at least three priesthoods, two of them lapsed, and the flight to a harder language in section II is exactly the frontiersman’s reflex Backus was smiling at: if the plains have been fenced, ride further west.Go fits this rather neatly. It pre-emptively surrendered the priesthood: designed for authors who would be numerous, rotating and not especially devout, it gave them nothing to be devout about. When the wave arrives — and it has — there is very little in Go for it to wash away.Which leaves the obvious question. If the identity always migrates to whatever is still scarce, what is still scarce now?XI. The Leak, Not the Spanner (Or: What Doesn’t Commoditise)“A good cook changes his knife once a year — because he cuts.”— Zhuangzi, on Cook Ding, whose knife lasted nineteen years and who never once gave a conference talk about it…four things nobody will generate for you, one of them ringing…Cook Ding carves an ox for his lord with such ease that the lord asks how it is done. When he began, Ding says, he saw only the ox; now he works by spirit rather than sight, following the natural joints and letting the blade pass through the hollows where nothing resists it. A mediocre cook changes his knife once a month, because he hacks. Ding’s has lasted nineteen years and is as sharp as the day it left the grindstone.I used to read that as a parable about craft. I now read it as a parable about changing languages once a month. The knife was never the skill; the skill was knowing where the joints are. And an ox, unlike a knife, is no commodity — each one has to be understood anew. So what is the ox, for us? What stays scarce when the code is cheap?The incident……at three in the morning, when the dashboards disagree with one another and the runbook describes a system that no longer exists. The model can propose hypotheses, increasingly good ones. Someone still has to choose, on partial information, and live with it in the morning. Judgement under uncertainty, with your name attached, is not sold by the token.The domain……what the thing is actually for, which rules are load-bearing and which are folklore, what the customer meant as opposed to what the ticket says. I have long believed that most of the real work happens here, before a line is written — even in the years I insisted on calling myself after a compiler.The “no”……the decision not to build the thing: the service that shouldn’t exist, the abstraction that will cost more than it saves. Generation makes the yes nearly free, which makes a well-placed no more valuable than ever. The cost of a bad yes was never the typing.The pager……or rather, the person it belongs to. It is no accident that the discipline I have lately drifted into, site reliability, is built almost entirely around the leak rather than the spanner. Nobody in SRE is asked which language they are. They are asked what they keep up.Honesty clause, as required (again) by house rules: each of these has been declared the thing the machines can’t do by someone shortly before the machines started doing a fair bit of it. The claim is narrower. They can be assisted, but not owned — not by something that cannot be woken up, held to account, or asked afterwards why. Ownership is the ox. Everything else is the knife.Which is a tidy place to stop, and therefore precisely where an honest essay mustn’t. Tradition is tradition.XII. The Counter-Argument I Can’t Fully Dismiss (Or: Six Witnesses for the Prosecution)“Que sais-je?”— Michel de Montaigne, who had it struck onto a medal in 1576, the most identity-driven way imaginable to express doubt…guilty as charged…Tradition is tradition: the strongest case against everything above, with the objections left standing where they deserve to stand.The anti-identity is an identity……and I concede it outright. “Boring is good” is a slogan, and slogans are banners; Choose Boring Technology went from Dan McKinley’s 2015 talk to conference-slide scripture within a few years. The gopher who is proud of not being proud is still proud. This essay is a flag — a beige one, with a slightly embarrassed rodent on it, but a flag. Montaigne had his doubt minted in silver; I have mine on Medium.My own September thesis……is the most dangerous witness, because I wrote its testimony myself. If the model writes most of the code, the human’s job becomes supervision — and supervision at volume cannot rely on human attention, the resource that runs out first. The guarantees have to live somewhere that doesn’t get tired. In Rust a good many of them live in the type system: change a type and you get a visible, countable cascade of compiler errors rather than a silent degradation three services away.Close the escape hatches — unwrap, the catch-all match arm — with lints in CI, and the compiler becomes a reviewer that never skims. Go's simplicity helps you read generated code; Rust's constraints help you catch some of what is wrong with it. Go's own users feel the gap: in the 2025 survey, respondents complained that nothing in the compiler stops them using a possibly nil pointer, or a value whose error they never checked.I can’t dismiss this. The most I can say is that it argues for Rust as a verifier, not as an identity — a smaller claim than the one I made in September, and a better one. And neither language hands you verifiability proper; that still lives in tests, and in someone who knows what the code was for.The training-data argument……and now the part a lazier essay would omit. Section IV deliberately didn’t claim that models write Go especially well, because I couldn’t find good evidence that they do. The most systematic multi-language benchmark I would trust, MultiPL-E, found in 2022 that code-generation performance broadly tracked a language’s popularity, with niche exceptions — on models that are now museum pieces. Nothing I would bet an essay on has replaced it.The Go team’s 2025 survey is sobering, but it should be read for what it is. 53% of respondents named non-functional code as their main problem with AI tools, 30% said even the working code was poor, and 13% were very satisfied with those tools, against 62% very satisfied with Go itself. These are opinions, not measurements: nobody ran controlled tasks in Go, Rust and Python and counted the defects.They tell you how the tools feel to people who write Go, not how good the tools are at Go, and they cannot settle whether Go is better or worse for machine authorship. That needs an actual experiment — equivalent tasks in three languages, defects counted, review time clocked, maintenance followed for a few months. I mean to attempt it in a later essay rather than pretend I already have.Meanwhile the thesis survives, but smaller. It was always about the reader. Whether the writer is any good is a separate, unsettled and slightly alarming question.Romance is fuel……and the boring language runs on someone else’s. Go’s concurrency comes from Tony Hoare’s CSP of 1978, carried through Pike’s own earlier and far more romantic Newsqueak and Limbo. The unremarkable is downstream of the remarkable; a world that sensibly chose the adjustable spanner would invent no new tools at all.There is a quieter worry in the survey, too: the share of respondents new to Go fell from 21% in 2024 to 13% in 2025, which the Go team suspects reflects the decline in entry-level hiring. Does a language few people fall in love with, recruiting from a shrinking pool of juniors, have a succession problem? The data can’t say, and the explanation is the team’s hypothesis rather than a finding. I leave it as a question, uneasily.Most of us aren’t at scale……so the strategic virtue is largely hypothetical. Go’s case rests on programming in the large, but section IX’s other number was PHP on 69.4% of websites — a great many of them, one suspects, maintained part-time by someone who also does the invoicing. For that person, standardised tactics solve a problem they will never have. The essay argues for a minority that happens to write a lot of essays.The meta-argument……is the one that keeps me up. Perhaps language tribalism was never vanity at all, but a rational signal of competence — the trade’s revealed preference, if you must, for credentials that are cheap and easy to read. In a trade with no reliable ones, “I am a Rust developer” meant I survived something difficult, and you can check. Hiring managers read it; juniors used it to find their people.If commodity code dissolves that signal, we don’t automatically get a meritocracy of judgement in its place. We get a vacuum, and vacuums fill with worse signals — pedigree, networks, the logo on your last badge. The identities I have spent eleven sections teasing may have been the least bad option available. I have no rebuttal. It stays standing.Confidence rating, per series convention: sixty per cent that the thesis holds, forty that September’s Rust was right all along — measured after coffee, which regular readers know inflates my confidence by ten points. Subtract accordingly, and don’t ask me which side to subtract from.One more witness remains — less for the prosecution than a character reference, from an old relative who never once tried to be liked.XIII. Honourable Mention (Or: Ugly, Slow, and Undefeated)“…an ad hoc informally-specified bug-ridden slow implementation of half of Erlang.”— Robert Virding, erlang-questions, January 2008 — to which the very first reply was that this had been done before, the most Erlang thing that has ever happened…the old relative, unshaven, still running :: my impression of Scandinavians may be a bit biased…Errr… Errr… Erlang. Everyone knows or suspects why we have this off-topic here. I’ll say it anyway.Erlang doesn’t need to be pretty, and isn’t. Born at Ericsson in 1986 and first implemented in Prolog, it kept Prolog’s table manners: statements end in a comma, a semicolon, or a full stop, according to a grammar newcomers experience as punctuation roulette. For years its strings were lists of integers. It isn’t fast at arithmetic and has never pretended to be. It has none of the qualities a language is supposed to have in order to be loved — and is loved anyway, which tells you exactly what the love is for.It is for one question: how do you keep a system running when parts of it are failing all the time? Erlang’s answer was to stop pretending they wouldn’t. Processes are cheap and isolated, each with its own heap and its own garbage collection, so one process tidying up after itself doesn’t hold up the rest. (It is tempting to add that this would have spared Discord its latency spikes.Oh, get off it: a cache that size would be built quite differently on the BEAM, and the comparison is a temptation, not an argument.) A process that goes wrong is allowed to crash, and a supervisor restarts it according to a strategy declared in advance. Joe Armstrong’s 2003 thesis — the philosophy, written down — was called Making reliable distributed systems in the presence of software errors, and the important words are the last four.Go standardises almost everything except the failure strategy; Erlang makes the failure strategy the language. Go is the adjustable spanner. Erlang is the pipe threader at the back of the van: heavy, ugly, single-purpose, and the only thing in the vehicle that does what it does.Honesty clause, as required by house rules, and it cuts at Go: goroutines have no supervision. An unrecovered panic in any goroutine takes down the whole process, and the idiomatic answer — errgroup, a context, a restart loop, a health check, Kubernetes restarting the container when all else fails — is Virding's half of Erlang, assembled from parts across three layers of infrastructure. It works. Most of us have built it. It is still half.To be fair to both, those parts are not equivalents of one another. A context carries cancellation and deadlines; it supervises nothing. Supervision, for its part, detects and restarts; it doesn't keep durable state consistent, catch logic errors or save you from a bad config. Fault isolation, restart, business correctness and whole-system recovery are four different jobs, and no runtime does all four for you. Some merely have the decency to admit it.Still, there is an irony here I find genuinely moving. We are entering a period in which a great deal of code will be written quickly by something whose output, on the Go team’s own survey, disappoints its users often enough to be the commonest complaint. The language with the most honest premise for that world is the one that assumed, in 1986, that the code would be wrong.Supervision is containment, not salvation — a process that cheerfully returns the wrong invoice total will not crash, and nothing will restart it. But containment is the right instinct. If anything in this essay deserves a sequel, it is this: in an age of mass-produced code, an architecture’s tolerance for being wrong may matter more than a language’s ergonomics.Why Erlang rather than Elixir? Because Elixir is the charming grandchild. José Valim gave the BEAM a friendly face and, in Phoenix, one of the pleasantest web frameworks anyone has built; Elixir is lovable in a perfectly ordinary, romantic way, which is a compliment, but not the one being handed out here.Erlang never apologised for its face, which is why it is the relative you trust. (Second honesty clause: I am in this particular church — thirty-four minutes on the aqueduct, a postscriptum confessing to Phoenix. The confession stands. Nine nines will not be relitigated.)And so to the ending this essay owes you — which is not a conclusion, because there isn’t one yet.Epilogue: The Longbow on the Weekend“…once you’ve gotten the fish, you can forget the trap.”— Zhuangzi, the only philosopher to anticipate the deprecation notice by two millennia…one bow, unstrung; one pair of wellies, muddied with intent…The ending this essay is supposed to have is: and so, dear reader, learn Go. I won’t write it — partly because it would be the guru’s hat, a costume change too ironic even for me, and partly because it isn’t what changed.At weekends I shoot a reenactment longbow: a weapon gunpowder retired from serious military employment some four centuries ago. So it goes. I keep one anyway, for no reason except that I love it. Nobody has ever asked me whether the longbow will save me from artillery. It is the kind of thing you are allowed to be romantic about precisely because nothing depends on it.That is where mine are going, anyway. Specialists will go on being paid for knowing one thing deeply, and rightly so; it is only the attachment — the bit that was never really about the work — that gets moved to the weekend, like a grandfather clock nobody quite has the heart to throw out.It has happened before, in a small way: the compositors’ craft lives on in private presses, the machine-code priesthood in the demoscene and in people hand-tuning inner loops for the pleasure of watching them go. And Rust — my katana — can stay what it is: a thing I love, practise and am faintly vain about, on Saturday. It just doesn’t get to be the noun on my invoice anymore.On Monday the noun is the leak. The platform. The thing that rings. And for that I want the tool that disappears in my hand, that the intern, the agent and I all write in the same voice, that hands its tactics to sane defaults and leaves me the strategy.Zhuangzi’s fish trap exists for the fish; once you have the fish, you can forget the trap. We spent twenty years mistaking the trap for the catch, building our names out of wicker. The model can weave wicker now, faster and more neatly than any of us. Good. The fish was always the point.So, no coronation — a coronation is precisely the sort of gilt I am trying to get away from. But nor am I going to affect a neutrality I don’t feel; I’m entitled to an opinion, and here it is. Rust is what mechanical verification looks like, and on the days when the tactic is the product I’ll reach for it without ceremony. Erlang is what designing for failure looks like, and it got there first. But of everything I have written for a living, Go does the most to strip the gilt off the logic.And gilt is not harmless. It draws the eye, and an eye on the ornament is an eye off the leak: the clever construct, the elegant abstraction, the type-level party trick all ask to be admired, and while you are admiring them the invoice total is quietly wrong. Go leaves the logic standing there in its vest, faintly embarrassed, with nowhere to hide. That is the whole of its charm, and it is considerable.Yes, yes — section XII has already told me that an anti-identity is still an identity. I conceded. I’m doing it anyway. Choosing Go is not an identity but an anti-identity: not this is who I am, but something closer to what a Polish grandmother says to a grown man hesitating in front of the muck heap: jaśnie pan rączek nie pobrudzi? His lordship wouldn’t want to soil his little hands? Jaśnie pan was how a serf addressed the lord of the manor; it survives chiefly as a way of telling someone to get over himself.Right, then. Enough playing the squire. This isn’t advice; it’s a confession in wellies — wellington boots, for American readers: what you would call rubber boots, named after the first Duke of Wellington, who had the leather original made for him and is not, as far as I know, on record on the subject of muck.Nor do I expect a reward for it. The countess will not glance across the yard, lower her lashes and murmur that she has always longed to spend an afternoon with a man who wears his wellies with such quiet dignity. Still less will she swoon if I start introducing myself as a Senior Pitchfork Engineer — a Widlarz, as it would go in Polish, with the unmistakable ring of a guild.A man who makes a personality out of his pitchfork hasn’t left the regiment; he has merely joined a muddier one, and nobody falls for that, least of all the aristocracy. This is not Lady Chatterley’s Lover, and Go is nobody’s gamekeeper; it has no romance, as section V took some pains to establish.Fork in hand, then. There is muck to shift.An aphorism for the road, as tradition requires:Nobody gilds a pitchfork. That’s how you know it’s for work.…we’ll meet again…Krzyś has spent nearly two decades wrestling unruly code into submission and is still regularly humbled by imposter syndrome. He currently keeps things up for a living, and writes Go with relief, Rust with love, Python by contractual obligation, TypeScript with resignation and bare C for reasons his therapist has asked him to explore further. At weekends he shoots a reenactment longbow and bakes early-medieval Slavic flatbreads, neither of which has yet survived contact with a CV.He also maintains a personal project written entirely in Rust, which he once described as his moat and his katana, and which this essay has just spent several thousand words explaining he doesn’t need. He has no plans to rewrite it.PS: Oh… and last but not least: the first plan of this essay dated Backus’s priesthood remark to 1978, at a different conference, with complete confidence. It was 1976. A priesthood, it turns out, is mostly a group of people who are sure. I am now re-checking every other date in this piece, in Go, with error handling.SourcesFigures and dates as checked in October 2026. Survey numbers are self-reported by self-selected respondents: read them as the views of people who stayed, not as measurements of code quality.Go, its design and its usersRob Pike, “From Parallel to Concurrent”, Lang.NEXT 2014 — the “brilliant language” remark.Rob Pike, Go at Google: Language Design in the Service of Software Engineering, SPLASH 2012.Rob Pike, “Less is exponentially more”, Go SF, June 2012 (text mirror) — the 45-minute build; Python and Ruby converts.Rob Pike, Go Proverbs, Gopherfest 2015 — “Clear is better than clever”, “Cgo is not Go”.Russ Cox, Backward Compatibility, Go 1.21, and Go 2, 2023 — “Boring is good”.Todd Kulesza for the Go team, Results from the 2025 Go Developer Survey, 21 January 2026 (fieldwork 9–30 September 2025, n = 5,379).Go 1.25 release notes, August 2025 — container-aware GOMAXPROCS.Jesse Howarth, Why Discord is switching from Go to Rust, Discord, February 2020.Justin Cormack with Solomon Hykes, Sugu Sougoumarane and Derek Collison, Languages of Cloud Native, QCon Plus, November 2021–26 of 42 CNCF graduated and incubating projects predominantly in Go.W3Techs, Usage statistics of server-side programming languages (17 October 2026: PHP 69.4%; Go, Erlang and Haskell each under 0.1%) and Go. The denominator is websites whose server-side language W3Techs can detect.Simon Willison, How Rob Pike got spammed with an AI slop “act of kindness”, 26 December 2025.Models and benchmarksFederico Cassano et al., MultiPL-E: A Scalable and Polyglot Approach to Benchmarking Neural Code Generation, arXiv 2208.08227 (2022); IEEE TSE 49(7), 2023. The models tested date from 2021–22.HistoryJohn Backus, “Programming in America in the 1950s”, International Research Conference on the History of Computing, Los Alamos, 1976 — via Kyle E. Mitchell’s transcription and The New Stack.Robert Virding, Virding’s First Rule of Programming, erlang-questions, 11 January 2008.Joe Armstrong, Making reliable distributed systems in the presence of software errors, PhD thesis, KTH, 2003.Clive Thompson, How Rust went from a side project to the world’s most-loved programming language, MIT Technology Review, 14 February 2023 — Hoare, the lift, the fungus.General Robert H. Barrow — attribution and dating as discussed in FreightWaves.Nicholas G. Carr, “IT Doesn’t Matter”, Harvard Business Review, May 2003.Paul Graham, “Beating the Averages” (2001) and “Keep Your Identity Small” (2009).Dan McKinley, “Choose Boring Technology” (2015).The usual suspects:Seneca, Moral Letters to Lucilius, XXVIII, trans. Richard Mott Gummere.Nietzsche, The Gay Science §125 (trans. Kaufmann); Heidegger, Being and Time §15; Wittgenstein, Philosophical Investigations §43; Austen, Pride and Prejudice, chs. 22 and 30; Tolstoy, Anna Karenina; Voltaire, Candide; Montaigne’s 1576 medal; Vonnegut, Slaughterhouse-Five, for the refrain; a certain Norwegian Blue; D. H. Lawrence, in passing; Zhuangzi, chs. 3 and 26 (trans. Burton Watson).This story is published under the Generative AI publication. Connect with us on LinkedIn and follow Zeniteq to stay in the loop with the latest AI stories. Let’s shape the future of AI together!Code Is a Commodity Now. Go Was Designed for That. was originally published in Generative AI on Medium, where people are continuing the conversation by highlighting and responding to this story.