In the last couple of months at my previous job, I would use to joke with a marketing voice that “we are building tomorrow’s legacy code, today.” The overwhelming majority of software projects I’ve been involved, or witnessed, ended up as legacy code after a few years. In any non-trivial interaction I’ve had with anyone working in software development, I’ve always asked questions to gauge if this was also what they experienced themselves. The overwhelming majority of them said yes (though that’s perhaps my set of tinted glasses I cannot put down).
Elsewhere I defined legacy code as code that has grown so complex that is very difficult to understand; yet code that runs in production and must be kept going.
The irruption of AI in software development has a major consequence: you can now get to legacy code in a few weeks just by yourself, instead of after years of development by a larger team. This happens because of two reasons: 1) AI works very, very fast. 2) AI seems to be oblivious to system-level complexity – it is good at simplifying a particular aspect, but it doesn’t seem to be able to grasp the whole (in the sense of Christopher Alexander).
I don’t know if this is a permanent feature of LLMs, or just a temporary limitation. For now, all my efforts to make AI work in a way that creates a simple, coherent whole have failed. LLMs are incredibly useful as sparring partners and reference manuals, even as editors. But when they are the ones driving (whether you’re riding shotgun or asleep at the back seat), I have very seldom seen them take the vehicle in the direction of simplicity.
Many (most?) software companies are economically viable running mostly legacy software. If AI-generated legacy software is not appreciably different from normal legacy code, it is to be expected that most economically productive software will be generated by AI. I don’t know how the quality penny will drop: AI can make overwhelmingly stupid assumptions that superficially seem correct. On the other hand, AIs are great at detecting issues, particularly security issues. So I think this will probably depend on how AI is being used. Organizations that use AI judiciously will increase their quality, whereas those who are cavalier about quality will experience staggering losses. AI will probably increase the spread in quality, in the same way that it has increased the spread the pace of velocity across companies, teams and individuals.
Because of the sheer speed of development and the lack of attention to the entire system, it is possible that our software will become more deadening and less engaging to use than what it already is. However, nothing is stopping teams from strongly guiding AI to better constructed interfaces. Here, AI might just widen the gap between the great and the mediocre.
Legacy code is like slop work (most internal presentations, most emails, “content” generated to get eyeballs on a product website). With AI, mediocre outcomes are done much faster, much cheaper and considerably better. They’re still not great outcomes. But they get a pass. In this, we need to acknowledge that LLMs + natural language extend the tradition of previous jumps up the abstraction layer. Systems seem to be able to bear more complexity while remaining economically viable. It feels hateful, but with certain detachment I can find a certain fascination in that fact.
My actionable takes:
- If you want to build a business quickly and you don’t particularly care about complexity, AI is the way to go. You might be able to create a viable business and your team will eventually find a way to deal with the complexity you created in the first place.
- If you want to lower the level of complexity of a system, you need to be at the driving seat. If you want to keep the level of complexity more or less the same as what it is, you have to at least ride shotgun.