The Project of Software is Complete
what is progress, when there are no more unique arrangements of 0s and 1s?
You are aware, I imagine, of “vibe coding.” The large language models that have received so much fanfare in the past four years have thus far not delivered on the outsized promises that have been made on their behalf; limitless free energy, an end to hunger, and immortality have all conspicuously eluded us. One thing that LLMs really appear able to do well, though, is to write code. And this proficiency has gotten sufficiently advanced that many people now write software solely through directing an LLM, without necessarily having any actual programming skills themselves. The overwhelming majority of the output of this effort is useless or redundant or barely functional, true, but the mere fact that people can do it is an interesting statement on what “AI” is actually good at. And for stupid meme reasons we call this practice vibe coding.
So, in the past two-ish years, several hundred million human beings acquired the ability to write software by speaking to a machine in ordinary language. This was heralded (correctly, in a narrow technical sense) as a great democratization: a notoriously Byzantine skillset had been suddenly made available to vastly more people. A capacity once reserved for a priesthood of specialists, a relatively small society of craftsmen, has been distributed suddenly and nearly for free to baristas, accountants, fourteen-year-olds, retirees, you, me…. We have been told that the instruments now available to the general public are staggeringly powerful. The era of citizen coding is upon us! A reasonable person, informed of this, would have braced for the consequences. Surely something would have to change, right? A wave of brilliant new apps? A flowering of new affordances granted by software? Any visible change to daily life commensurate with the scale of the gift of vibe coding? All of the above, no doubt. All of the above and more.
Well, take a look around and tell me… where is it? What are the fruits of all of this vibe coding? What difference has it made? What is the great application that has emerged from all this liberated capacity? What new thing does our species now do with its hours that it did not do three years ago? What old thing does our species not have to do that it had to do three years ago? What chores have been eliminated, what friction has been smoothed over, what corner of ordinary existence been reshaped by the sudden arrival of hundreds of millions of amateur programmers? There’s been a great deal of activity, some of it quite frantic. There’s been a steady churn of half-built to-do apps and Wordle clones and boutique email clients that do nothing the old standbys can’t, weekend RPG projects that flare and vanish, and at the end of it, there’s a world essentially unchanged. And to give the teams at Anthropic and OpenAI their flowers, this has not been a failure of their tools. The tools work, more or less. This is all about something stranger and more important than a failure of the LLMs: the necessary work of software has already been done. We haven’t seen a lot of new types of software because we already have what we need. You can’t flood a vessel that’s already full, and the amateurs, God bless them, have been pouring this new power into a jug that we’ve been frantically filling throughout the 21st century.
The project of software is complete. Not decelerating, not maturing, not entering some new and humbler phase, but complete. Complete in the way that the map of the Earth is complete, which is to say complete in the sense that the great blank spaces have been filled and what remains is the labeling of tributaries and the correcting of coastlines, mapping and remapping the parts of the globe that are in a state of permanent flux, responding to changing conditions without altering our conception of the Earth. I’m aware of how this all sounds. In particular, I’m not naive to the fact that for those who write code for a living (whose number is growing, not shrinking, despite doomsaying) it’s going to sound provoking rather than provocative. I’m also aware that some are going to mistake my saying that the project of software is complete for somehow belittling the achievements of software. This is not the case! I assure you that I’m aware that I’m typing my argument into a machine that would have been indistinguishable from sorcery to my grandparents and then transmitting it through a lattice of code so vast and so intricate that no living person could comprehend more than a sliver of it. I am aware that software enables my current economic existence, however ambivalent I have become about that relationship. No, I’m not claiming that the global project of satisfying humanity’s appetite for software is in any sense unimportant. I am however claiming that it’s finished. It has been accomplished.
Perhaps better than the map analogy is a comparison to the periodic table. The seven rows are complete. Following the synthesis of element 118, the seventh row of the periodic table has been filled in, running from hydrogen to onagesson. It sure looks done. But technically, yes, there’s more elements to be discovered; there are, I’m sure, any number of teams out there trying to will the 119th into being as we speak. But those temporarily undiscovered elements are synthetic, the product of human will, and exist only to satisfy human curiosity. They disappear faster than you can possibly imagine. There’s no natural, meaningful hole in the periodic table, no organic need to satisfy; there’s just our insatiable desire to keep looking for more, for the next horizon. You don’t extend the periodic table through a more clever arrangement of the symbols you already have, you extend it by going into the substrate and slamming atoms together to coax other atoms out of the wreckage. In other words, it’s a matter problem, a problem at the ragged edge of physical possibility, and it’s brutally expensive and slow. The abstraction itself? The table, the pattern, the predicted groups? That’s been complete, in every way that matters, for decades. Or put it this way: the frontier of the periodic table is invented, not discovered. And this is what I mean by software being complete. We will keep building out of our desire to build, and we’ll have a lot of maintenance to do, but we won’t be building out of need. As I keep telling you, we live in an era of refinement we insist on calling an era of innovation.
So, here’s the tedious “to be sure” part. I don’t mean that no new programs will be written; programs will be written until the Earth swallows the sun. There will be new video games, new and often worse versions of applications you already own, new interfaces bolted onto old functions, new skins on old bones, a permanent and profitable churn of updates that move the buttons around and call it progress, and most of it will come with a subscription fee. And, yes, professional human software engineers will be a thing tomorrow and next week and in five years and in ten. What I mean is narrower but far-reaching and profound: the era of new software categories is over. There is no more true need for new types of software than there is need for new lines on the periodic table. The taxonomy is now a closed system; the great kingdoms and phyla of what code can do for human beings - communication, calculation, storage, retrieval, simulation, coordination - were largely determined decades ago, those taxonomic ranks have been filled in the 21st century thanks to the investment of trillions of dollars and the effort of our whole civilization, and what’s left to do is to pencil in new populations of programs within genera within phyla within kingdoms that have already been named. This might not sound like a big deal. I think it’s a very big deal, personally, if you truly grasp it.
Consider the test I’ve offered up in this newsletter before: when was the last time you wanted your phone to do something that it might reasonably someday do and yet could not? Not something silly like “give me infinite money,” but something a phone could reasonably do with enough power and with good enough software within the boundaries of what’s sensible. Honestly, what? What do you want your phone to do that it can’t? I’m not talking about your phone getting better at something it currently does badly; I’m talking about something that you want it to do that it currently does not do at all, an unoccupied category, a genuine absence. I’ve asked plenty of people this question and watched them reach, and reach, and return with what amounts to putting fresh paint on the same house - a better keyboard, a settings menu that’s easier to navigate, an app that already exists but which they wish was free. You want Spotify to not have ads? That’s an economic constraint, not a software constraint. You want your robot vacuum to not suck? That’s a mechanical problem, a robotics problem, an atoms problem rather than a bits problem. You want Instagram to let you see pictures of your friends instead of all the shit the algorithm feeds you instead? Meta could do that tomorrow, of course. They just won’t. You want Tinder to give you more attractive matches and to lead to better dates? I’m afraid that’s up to the dictates of the heart. What’s an app you’re missing? What problem do you have that could actually be fixed with the production of new code in any plausible near future?
What do you want your car to do that it can’t now do? Drive itself, you say. Well, that’s coming, although it’s going to take longer and be more expensive than you’ve been told. Waymos drive themselves, but with a far larger amount of “calling home” for human guidance than the media wants to admit, and in tightly bound geofenced locales, and only in certain kinds of places in certain kinds of climates…. These are problems, some of them software-sensitive, but full self-driving is not ultimately a software problem; it’s the problem of a two-ton object moving through a physical world of infinite and lethal contingency, full of people who can and will sue, and no quantity of code will conjure the sensors, the redundancy, the regulations, the whole material and legal substrate that reality stubbornly withholds. More to the point, once full self-driving is everywhere, that will be one more solved software problem, and the result will be a moderately-meaningful change in corporeal reality but one that pales in comparison to the birth of the railroad or the transition from horses to cars, another example of the indoor plumbing test. Self-driving cars will eventually provide ordinary people with digital chauffeurs. That’s cool. But it obviously fails the tests for genuinely revolutionary technology I keep posing.
Wanting more from software certainly has not stopped, and some wants will be filled by code. But the organic, natural demand for new categories of software has stopped. We’ve failed to notice, largely because Silicon Valley would very much like if everyone believed that we’re forever on the cusp of a new era of human experience. They keep the hype cycle going, they keep the churn of breathless media coverage and irresponsible speculation going, the kabuki of adding a little more CPU power and memory to phones that only need more because we keep making the software they run less efficient, then calling that innovation. It’s the work of trying to convince the world that laptop and smartphone development haven’t been stuck in the same place for a long, long time. All of that is loud and lucrative and it can sometimes look like progress. But ask yourself: what is the program that you can imagine that can do plausible things that you can’t do now? What is the new actual frontier of where software has to go? Remember when everyone was going to get rich making iPhone apps? Well, nobody really talks about that anymore. Because what apps do you not have that you need?
L.L.M.s can do many things with astounding proficiency, but they can’t do the vast majority of human jobs without skidding into disaster here and there. No upgrades or new model rollouts are going to change that.
The exceptions to that rule are jobs that occupy formal or verifiable domains. Coding is one such job. It relies on a structured, formal language that can be tested in real time. That’s why we’re seeing such impact in the coding jobs market. The same goes for any other kind of work in which output is either verifiably right or wrong, functional or not functional, and can be definitively checked through an automated process. An overwhelming number of jobs, however, don’t work like that - Zeynep Tufecki
Every technology travels a curve. The curve is, generally, not exponential in the way tech evangelists imagine. Instead it’s the logistic curve, the S-shaped curve. A logistic curve begins flat, in the long dark of the laboratory and the failed prototype, then it turns upward into the steep, delirious, world-remaking steep middle where it seems the growth will never end and the word “exponential” seems like an honest assessment and then - and this is the part the evangelists always forget, because they’re always standing in that delirious steep middle when they speak, whether in reality or in their imaginations - the curve bends over. This is usually imperceptible as it happens but is often very obvious in retrospect. The resources that were consumed in the heady steep part, whatever they were (engineer time, compute, electricity, bandwidth, take your pick) runs low, and the curve flattens into a new and permanent plateau. The bacterial colony fills the dish; the rumor reaches everyone who will ever want to hear it; he transistors stop shrinking; (I am aware that I am engaging in wild leaps of metaphor here, but let’s go with it.) What’s particularly risky about the S-curve is that from any point along it, the recent past looks exactly like the near future; we can’t shake the memory of the steep middle part, which persists long after the curve itself has gone flat. We are, I’m suggesting, standing on the (or a) plateau of software and convincing ourselves that we’re still climbing.
And, look, yes, when one S-curve saturates, another sometimes begins - progress continues, in other words, because one plateau becomes the start of a new climbing curve. Vacuum tubes gave way to transistors which gave way to integrated circuits, and each could be considered its own curve, and if you stack them together you get something like the smooth exponential we called Moore’s Law. (Which will be called dying or dead and then declared very much alive in competing essays until the end of time.) Well, yes, sometimes the plateau of one S curve is just the beginning of another, sure. This is true and kind of, sort of, precisely my worry: for the end of one S-curve to become the beginning of another requires that a new reality that’s waiting underneath the old one. My claim is that software, having reached the ceiling of natural human need in anything like the recognizable human world, has no new reality move into. There’s no more fundamental layer of computation to migrate to. The next curve, if it comes, won’t be built on top of more code. Instead we need a different kind of new development, one which will come in the world of atoms, not the world of bits, which means we’re stuck in the same problem. On the first quarter-decade of the 21st century, humanity invested everything it had in computing, what a professor of mine once called ubiquitous silicon-based algorithmic orchestration. We reached the limits of what it was possible in Java or C++. Now we need something to be developed outside of computing to have a new world to grow into, in order for a new S-curve to start. And, like… where is that thing? What is that thing?
What the maximalists keep insisting is that it goes the other way, that new code will lead to new frontiers. But there’s just no reason at all to believe that they’re right, and every day of an LLM-saturated world that doesn’t much change is a piece of evidence against them. How many more years are we supposed to keep waiting? We’re already being told that AGI 2027 has been delayed. Maybe the new prediction is right. Or maybe we’re in an Duke Nukem Forever situation here.
This is the hot new thing, where you have the model make something, you see if it gets verified by a compiler or other software testing tool, and then it tries again. And you hear the senior AI people be like, “I write loops now. I didn’t even write prompts. I write loops. And off it goes and it does its own thing….” And you just kind of look at this and you’re like, does this extend to anything else? If you want to build a bridge, do you know how you verify that a bridge won’t collapse? There’s many, many other domains in the world where the verifiability and the ability to make a loop against that verifier happens outside of a computer. I always use the legal system as an example. The verification in the legal system is a judge. Who are very unpredictable! And you can’t be like, “Well we’re gonna run that again, judge.” No, you’re going to jail. The judge says, “Off to jail with you.” There’s no loop that will occur here, my friend.
And this is my worry with the AI industry: they try to generalize everything from the experience of software engineering over and over and over again. None of this is the thing that we were promised from AI. - Nilay Patel
The biologist Stuart Kauffman coined a term that was intended for use in the science of evolution, but which is easily and usefully portable to technology: the adjacent possible. At any moment, a system (a chemical system, say, or an ecosystem, or an economy of ideas, push the boundaries into fuzzier spaces as you wish) is surrounded by a shell of conditions that do not yet exist but that could exist through some series of changes to the things already do exist. The adjacent possible is the set of all next steps. And it is, I would emphasize, not an abstraction but a physical reality. Evolution doesn’t leap, or at least not in the ordinary natural selection-driven way; evolution colonizes the adjacent possible one door at a time, and each door it opens reveals further doors that were not previously reachable. And here’s why I say this isn’t an abstraction: the adjacent possible is not a fixed perimeter waiting to be reached but a boundary that expands as you make contact with it. Each change itself becomes a new unit of raw material available for the next change, so that entering a door does not merely amount to investigating a possibility but creates the possibility of others rooms that could not have been imagined from the hallway. If you follow me.
Sounds great, right? Sounds like how we get to the stars, right? No. Again, this metaphor comes from evolution. And while evolution has produced incredibly variety and some astonishing forms of life, it also has clear and insurmountable limits. We have bioluminescent algae and translucent deep sea creatures and carnivorous plants, but we don’t have birds that can fly to the moon or rabbits that can travel through time or frogs that shoot lava from their butts. Billions of years of evolution have led to some remarkable organisms, and we will see more, but evolution can only expand life into the adjacent possible, not the imaginable possible. There are limits. What I’m arguing is that the adjacent possible in software is remarkably constrained and largely similar to what we’ve already gotten. For most of the history of computing, the adjacent possible was enormous, the American frontier in 1800, the blank part of the map, Mendeleev’s periodic table. Every new category (the spreadsheet, the browser, the search engine, the social network, the smartphone) flung open a new wing of rooms that each had their own closets and each closet their own shelves…. But sooner or later you get to the point where you’re the explorer in an era of satellite photography, you know? You find that you’re a chemist trying to invent the 119th chemical because you want tenure or a grant or bragging rights - you’re looking to expand into the adjacent possible because you want to, not because you need to.
This is the sensation we’ve mistaken for the permanent nature of software, the sensation of a frontier. But a frontier is a permanently-contracting thing; they pretty much never grow. What made the early categories of software so fertile was precisely that each was a general instrument and not a finished use. The spreadsheet was not just an application but a surface upon which so many new possibilities could be imagined; the web browser was not an empty notebook but a bookshelf onto which you could place a new notebook into which you could then write your own story. Each opened wing of computing, for awhile, held up the wings above it - there’s no internet without the database and no YouTube without the internet and no Twitch without YouTube…. The categories we generate now are terminal. A habit tracker (which appears to be one of the most common vibe coding projects) might be very useful but they don’t open onto any other rooms; a habit tracker has no next frontier. A meal-planning app is a leaf, not a branch, a completed structure rather than raw material for other things. The adjacent possible of software is looking pretty damned saturated to me; the new things we make have ceased to be the building blocks of newer things. The doors we open now open onto rooms we’ve already stood in.
This is why the vibe-coders, the newly minted programmers who can summon a working program by talking to a machine and have lofty ambitions about what they’ll accomplish, have with all their liberated capacity produced so stunningly little worth caring about: almost all of them are creating for its own sake. I appreciate the romance of that. But what does it tell you, that one of the most asked questions in vibe coding subreddits is “What should I vibe code?”
“The limits of my language mean the limits of my world.”
- Ludwig Wittgenstein
Software is an abstraction. It’s a layer of pure symbol laid over the physical world, and its power, its real and consequential power, is the ability to rearrange itself at no cost and at nearly the speed of light. But software itself can only ever manipulate symbols. Software can’t touch physical reality itself, only through intermediaries. And it happens that every one of the civilizational prizes we actually long for, the ones for which we seek to invent the future in the first place, lie in the real and not in the symbolic. We want the end of cancer; that’s a problem of proteins and cells and the maddening three-dimensional origami of wet matter, and you can’t refactor a tumor. (You definitely don’t get to try that loop again….) We want limitless clean energy; that is (probably?) really a problem of confining a plasma hotter than the core of the sun inside a container literally made out of magnetism, and no elegant code can do that for you, no cool algorithm can change the bare physics. We want to defeat death; that’s the bits vs atom problem in its purest and most total form. The flesh is weak, or so I’m told. We want the flying car, the space elevator, the cure, the fountain of youth… and we’ve spent forty or fifty years pouring our collective genius into this one kind of abstract endeavor, which by its very nature can build none of these things. Because it’s made of nothing! Because it’s all symbols on top of symbols on top of symbols.
Software was never going to deliver the future. Software was the thing we did instead of the future, because it has orderly rules, because it’s cheap to make, because inside its narrow confines the returns come fast and the failures are easy to identify and contain. And we really did remake human interiority along the way; I once talked to a very smart person who told me that the fundamental problem of modernity is that we mistake everything for information, which sounded wise even though I didn’t really understand him. I think the idea is that the computing age has caused us to forget that reality comes before abstraction, that intelligence is a powerful tool for manipulating language and symbols but far far more limited when it comes to manipulating the stuff of the universe, matter, atoms, reality. Computer science is seductive because code is easy to manipulate. Code looks like it can be whatever we want it to be. It’s a “streelight effect” type thing. In a world of non-compliant atoms we put our faith in code, which was so obedient. We built an abstraction layer on top of our planet and optimized that layer to perfection precisely because we couldn’t crack the base reality - and then, having perfected the abstraction, we told ourselves the pleasant bedtime story that the abstraction was where the future had been hiding all along.
Digital stuff as we have known it has a brittle quality that forces people to conform to it, rather than assess it. We’ve all endured the agony of watching some poor soul at a doctor’s office struggle to do the expected thing on a front-desk screen. The face contorts; humanity is undermined. - Jaron Lanier
One more goofy analogy: the financial derivative and the actual asset. A derivative, broadly defined, is a symbol referencing a symbol referencing the asset - think of a mortgage bond, a CDO, a synthetic whatever made up of other whatevers, each layer pure abstraction stacked on the layer of pure abstraction below it…. The financial system can compound and elaborate the abstractions essentially without limit, at the speed of some coked-out finance guy’s keyboard… right up until someone has to cash out the abstraction and get to the thing itself. That’s what happened in the financial crisis - the actual houses, the actual borrowers who couldn’t make their payments, the actual real-world economy, it turned out that couldn’t be manipulated like the abstraction layer. The ruined homeowner tossing the keys into the foreclosed home and walking away? Yeah, turns out he was real. And somehow people were stupid enough, or greedy enough, to leave him out of their immensely complicated software models. My admittedly too-precious argument here is that, if you go up one level, you see that our entire relationship to computing functions the same way: we make the abstractions more and more complicated so that we can avoid seeing how far from the material world we really are.
I’d like to suggest that the large language model is the most complete and most seductive expression of the software trap I’ve been talking about. At the heart of the large language model, you have a training corpus, software trained on the output of other software, symbols distilled from the accumulated symbols of our entire species, an abstraction whose raw material is other abstractions. When an LLM goes looking for something it inevitably finds itself, you might say. An LLM, can be a mirror that we mistake for the reality it reflects. And notice the direction that the hype points towards: not outwards, towards matter, towards things, towards our recalcitrant physical world, but inwards and downwards - into even more code!, more chips! more compute!, more layers of abstraction on abstraction on abstraction…. To repeat myself, LLMs produce redundant abundance: what they’re actually good at making is things that we already had an immense amount of, (digital) writing, (digital) artwork, (digital) music, (digital) video, and code, code, and more code. The LLM era is perverse because you have this whole cult of maximalists who truly believe they’re going to have their own asteroid farm someday but the technology they’ve nominated to get them there is just another abstraction generator. We’re pouring our money, our attention, and our most brilliant young minds into the most recursive, most inward-facing, most reality-indifferent technology ever constructed, and waiting for the Rapture.
I’m hardly the first to say this, but - the point is not that artificial intelligence has limits we won’t admit. The point is that intelligence has limits we won’t admit. I keep sharing this brilliant Kim Stanley Robinson essay, which systematically demolishes the idea that we will one day colonize other solar systems. I find it relevant and poignant because Robinson so artfully demonstrates that these dreams crash against the rocks of physics no matter how smart we are. Because yes, folks, there are problems so hard nobody can be smart enough to solve them.
Look, nobody can stand inside a curve and measure its arc with certainty, and if I’m saying that about the AI charlatans I have to say it about myself too. It remains possible that some genuinely new undiscovered category of software waits out there for us in the unlit dark, and that I will appear foolish in a few years. Sure, maybe. But I’ll just say what I’ve been saying since the beginning: show me. Show me! Show me LLMs slipping the surly bonds of earth and doing something out here in meatspace, in the world of atoms, in the grubby land of iron and sand and bone that we actually live in, rather than in the magical land of Honalee that is the increasingly unhinged imagination of Silicon Valley. Prove it. Show me something instead of constantly telling me what you think is going to happen and then rolling your eyes at my skepticism. I need proof because I’ve become quite sure that the answer to our exhaustion isn’t more of the thing that’s exhausted us. The next phase - of our technology, of our prosperity, of our existence - is not going to be written by LLMs because it’s not going to be written at all. It’s going to be built, in atoms, in matter, in a grubby and unglamorous real world that doesn’t yield just because the code is elegant. People will be writing software as long as there are people, but in a very real way we’ve finished software, at least until we get to the Jetsons world of teleporters and warp drive, and we almost certainly can’t get there.
The map of plausible short-term technological progress appears to be complete. And I get that that’s scary. I get that it’s inconvenient for the stock market. I get that it seems depressing. Personally, I’m content to live in this world, so long as we’re willing to make life better for everyone with the tedious work of politics and solidarity, but I get why you might long for the stars. But wishing doesn’t make it so, and as the AI titan Peter Norvig once said, pursuing artificial intelligence can be like trying to reach the moon by climbing a tree: for awhile, you can report steady progress. I’m here suggesting that we’re coming very close to grasping the highest branch.