Crafting Software in the age of AI
I keep thinking about how weird it is that most of the rules we grew up with in software don’t really fit anymore. Stuff like DRY or KISS made sense when humans were the ones writing every line of code. But if most of the code is generated by AI, maybe the old rules are just… not the right ones. It feels like we’re playing a new game but still quoting the old rulebook.
When I look at an AI-generated codebase, the parts that make sense to me are the ones that act like Lego blocks—small, clean pieces with clear in and out connectors. Everything else turns into a mess fast. Instead of a big web of files talking to each other, I want modules that I can throw away, regenerate, and snap back in without breaking the whole thing. The architecture shifts from “how do we reuse this code forever” to “how do we make it easy to replace tomorrow.”
And then there’s this other layer: the intent. It’s not just the code anymore, it’s the prompts, the constraints, the little notes you give the AI so it spits out the right thing every time. That’s as important as the code itself. Almost like version control for thoughts, not just files. If we don’t track that, we’re flying blind when something changes.
The workflow also feels lighter. Instead of weeks of spec, design, and careful development, it’s closer to: prompt → generate → test → tweak. You don’t polish the first draft, you just keep regenerating until it feels right. And because the cost of trying is so low, it actually feels easier to experiment, even with big stuff like data models. Schemas change more often, migrations are constant, but that’s okay if the system is built for it.
I don’t have the full picture yet. Honestly, it’s all half-baked in my head. But I can feel the shift: from permanent code to disposable code, from “don’t repeat yourself” to “don’t worry, just regenerate,” from humans writing syntax to humans shaping intent. The exciting part is we get to figure out the new principles as we go.