Back to Blog

The Coming Revolution in How We Build Software: Why Programming Languages as We Know Them May Be Obsolete

For over 25 years, I've been writing code in languages designed for human minds—languages carefully architected with abstractions that help us think, debug, and maintain complex systems. But here's what I've been wrestling with lately: what if the fundamental way we construct software is about to change completely? As someone who builds agent orchestration systems and leads conversations about AI's transformation of software development, I'm watching the ground shift beneath our feet in ways most engineers aren't yet acknowledging.

A branching diagram of programming language abstraction layers rising from binary through assembly to modern high-level languages, with the topmost layer dissolving — illustrating how abstractions built for human cognition may not survive an AI-native future

The History of Abstraction Was Always About Us

Let's step back and look at how we got here. In the beginning, we had binary—ones and zeros that directly represented machine states. Working at that level was brutally difficult for human cognition, so we created assembly language to give us mnemonics and slightly more readable instructions. But assembly was still tedious and error-prone for building anything complex, so we developed higher-level languages like C, then object-oriented languages, then modern frameworks that let us work at even higher levels of abstraction. Each step up this ladder was motivated by a single driving force: making it easier for human developers to conceptualize, build, and maintain software systems. We created these abstraction layers because our brains needed them, not because the computer needed them.

Here's the critical insight: every programming language we've ever designed has been optimized for human cognitive limitations. We break programs into functions because we can't hold too many details in our working memory at once. We create design patterns because they give us recognizable structures that reduce cognitive load. We favor simplicity over complexity not because simple code runs better—often it doesn't—but because simple code is easier for us to read, understand, and debug six months later when we've forgotten why we wrote it that way. We choose variable names that are descriptive to human readers even though the computer couldn't care less whether something is called "x" or "userAuthenticationCredentials." The entire edifice of modern software development is built on the foundation of accommodating human neurology.

LLMs Don't Have Our Limitations

Now we're in an era where large language models can write code, and this changes everything. LLMs don't have the same cognitive constraints that drove us to create our current abstraction layers. They don't get confused by complexity the way we do. They don't need descriptive variable names to remember what something does. They don't need to break things into small, manageable functions because they can't hold the whole program in their head—they can process massive contexts that would overwhelm any human developer. The fundamental reason we built our programming languages the way we did simply doesn't apply to how LLMs operate.

In theory, an LLM could write directly in binary or assembly and not face the cognitive burden that made those approaches untenable for us. Now, I'm not saying that's necessarily the right approach—there are questions about debugging, optimization, and whether that's actually the right abstraction layer for building robust, scalable applications. But the point is that the constraints are completely different. We're asking LLMs to write in languages we designed for ourselves, and that may be fundamentally mismatched to how they could most effectively construct software. It's like insisting that a bird walk everywhere because that's how humans get around, when the bird could simply fly.

What Changes When the Builder Changes

Through my work building agent orchestration systems in property tech, I've seen firsthand how AI is already reshaping the software development lifecycle. But I think we're still in the very early stages of understanding the implications. Right now, we're mostly using LLMs as sophisticated autocomplete—they write code in Python, JavaScript, Go, or whatever language we're already using. They follow our patterns, our idioms, our ways of structuring applications. We're essentially teaching them to think like us, to work within the frameworks we built for human minds.

But what if we flipped that equation? What if, instead of teaching LLMs to write human-optimized code, we started building systems that are optimized for how LLMs naturally work? I believe we're going to see entirely new programming paradigms emerge—languages and frameworks designed not for human readability but for LLM effectiveness. These might look nothing like what we're used to. They might have radically different abstraction layers, ones that leverage the strengths of AI systems rather than compensating for human weaknesses. The applications themselves might be structured in ways that would be incomprehensible to a human reading the raw code, but that's okay if humans aren't the ones maintaining them at that level.

The Great Extinction and Renaissance

Here's where this gets really interesting—and potentially unsettling if you've spent decades mastering current languages like I have. We may be facing the extinction of many programming languages as we know them. Not immediately, and not all at once, but the trajectory is clear. Languages that were designed to be human-readable and human-maintainable may become legacy systems, maintained but not actively developed for new projects. Why would we continue building in abstractions designed for human cognition when the primary builders no longer have those limitations?

This doesn't mean programming is dead or that software engineers become obsolete—far from it. But our role is evolving dramatically. Instead of spending our time writing individual functions and debugging syntax errors, we'll be architecting systems at a higher level, defining requirements and constraints, and orchestrating AI agents that do the actual code generation. We'll be the conductors rather than the musicians. The languages we'll need to master may be less about syntax and more about effectively communicating intent to AI systems, specifying desired behaviors and outcomes rather than implementation details.

Building for an AI-Native Future

From my vantage point working with agent orchestration, I see hints of this future already emerging. The most effective way to work with AI in software development isn't to have it replicate exactly how a human would code. It's to let it approach problems differently, to leverage its strengths rather than forcing it into our molds. We're experimenting with different ways of specifying what we want to build, different methods of validation and testing, different approaches to ensuring reliability and scalability. These experiments are the early prototypes of what software development will become.

I think we're going to see a Cambrian explosion of new languages and frameworks specifically designed for LLM-native development. Some will focus on making it easier to specify high-level requirements in ways LLMs can reliably interpret and implement. Others might operate at radically lower levels of abstraction, letting LLMs optimize at the machine code level in ways no human ever could. Still others might create entirely new paradigms that don't fit our current mental models at all. The key insight is that these tools won't be constrained by the need to be readable or understandable to human developers at every level—they'll be designed for machines that think differently than we do.

The Questions We Need to Ask

As someone who's been building software for over a quarter century, I'll admit this transition raises profound questions. What does it mean to "understand" a codebase when the code itself isn't designed for human understanding? How do we debug and maintain systems that operate on principles foreign to human intuition? What's the right balance between human oversight and AI autonomy in software development? Where should the abstraction layer sit that allows humans to effectively direct and validate what AI systems build, even if we can't read the underlying implementation?

I don't have all the answers yet, and I don't think anyone does. We're in uncharted territory. But I do know this: the programming languages and development paradigms we've used for decades were solutions to human problems. As the builders change, the solutions must change too. Fighting that evolution means clinging to abstractions that no longer serve our actual needs. Embracing it means being part of defining what software development becomes in an AI-native world.

Moving Forward

The revolution in how we build software isn't coming—it's already here, we're just in the very early stages of recognizing it. The current programming languages aren't going to disappear overnight, and there will always be contexts where human-readable code matters. But the trajectory is clear: we're moving toward a future where the primary author of code is AI, and the languages and tools we use will reflect that new reality. For engineers like me who've spent careers mastering current approaches, this is both exciting and humbling. We get to be part of inventing entirely new ways of creating software, but we also have to let go of the assumption that the methods we know are the only—or even the best—ways to build.

The abstraction layers we created from binary up through modern high-level languages served us brilliantly for decades. They were exactly what we needed when humans were the builders. Now the builders are changing, and it's time for our abstractions to evolve too. The question isn't whether this will happen—it's whether we'll be active participants in shaping what comes next or passive observers watching our tools become obsolete.