Skip to main content
Test Double company logo
Services
Services Overview
Holistic software investment consulting
Software Delivery
Accelerate quality software development
Product Impact
Drive results that matter
Legacy Modernization
Renovate legacy software systems
Pragmatic AI
Solve business problems without hype
Upgrade Rails
Update Rails versions seamlessly
DevOps
Scale infrastructure smoothly
Technical Recruitment
Build tech & product teams
Technical & Product Assessments
Uncover root causes & improvements
Case Studies
Solutions
Accelerate Quality Software
Software Delivery, DevOps, & Product Delivery
Maximize Software Investments
Product Performance, Product Scaling, & Technical Assessments
Future-Proof Innovative Software
Legacy Modernization, Product Transformation, Upgrade Rails, Technical Recruitment
About
About
What's a test double?
Approach
Meeting you where you are
Founder's Story
The origin of our mission
Culture
Culture & Careers
Double Agents decoded
Great Causes
Great code for great causes
EDI
Equity, diversity & inclusion
Insights
All Insights
Hot takes and tips for all things software
Leadership
Bold opinions and insights for tech leaders
Developer
Essential coding tutorials and tools
Product Manager
Practical advice for real-world challenges
Say Hello
Test Double logo
Menu
Services
BackGrid of dots icon
Services Overview
Holistic software investment consulting
Software Delivery
Accelerate quality software development
Product Impact
Drive results that matter
Legacy Modernization
Renovate legacy software systems
Pragmatic AI
Solve business problems without hype
Cycle icon
DevOps
Scale infrastructure smoothly
Upgrade Rails
Update Rails versions seamlessly
Technical Recruitment
Build tech & product teams
Technical & Product Assessments
Uncover root causes & improvements
Case Studies
Solutions
Solutions
Accelerate Quality Software
Software Delivery, DevOps, & Product Delivery
Maximize Software Investments
Product Performance, Product Scaling, & Technical Assessments
Future-Proof Innovative Software
Legacy Modernization, Product Transformation, Upgrade Rails, Technical Recruitment
About
About
About
What's a test double?
Approach
Meeting you where you are
Founder's Story
The origin of our mission
Culture
Culture
Culture & Careers
Double Agents decoded
Great Causes
Great code for great causes
EDI
Equity, diversity & inclusion
Insights
Insights
All Insights
Hot takes and tips for all things software
Leadership
Bold opinions and insights for tech leaders
Developer
Essential coding tutorials and tools
Product Manager
Practical advice for real-world challenges
Say hello
Leadership
Leadership
Leadership
AI

We're about to unwind fifty years of "Progress"

Every programming language, framework, and abstraction we've built exists to solve the same problem: humans have limited cognitive bandwidth. As agents become the primary authors of code, the rationale for all that scaffolding starts to weaken.
Doc Norton
|
March 31, 2026
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Part three of a three-part series on agentic coding and what it means for the profession. Part one set the stage. Part two looked at what changes in how we work. This one follows the logic to where it leads. If you think I'm wrong, start with part one.

I want to make a prediction that is going to make a lot of people uncomfortable.

The programming languages, frameworks, and abstractions we've spent decades building are going to start collapsing. Not all at once. Not overnight. But the direction is clear, and the pace is faster than most people want to admit. Within a decade, possibly sooner, the tools we use to build software will look fundamentally different from what they look like today. And the driving force behind that transformation isn't a better language. It's the fact that the primary author of code is changing.

Let me take you through how we got here, because the destination only makes sense if you understand the journey.

We built languages for humans

In the beginning, there was the machine. If you wanted to tell a computer what to do, you talked to it in its own language. Assembly. Binary. You managed registers directly. You tracked memory addresses by hand. You kept the hardware's mental model in your head at all times, because the computer wasn't going to meet you halfway.

It worked. It was brutally effective. And it was completely inaccessible to most humans, which created a ceiling on how much software the world could produce and how fast.

So we built abstractions. FORTRAN gave scientists a way to express mathematical formulas without thinking about machine instructions. COBOL let business programmers write something that almost read like English. C gave systems programmers a way to work close to the hardware without living in it entirely. Each of these was a deliberate trade: we gave up some efficiency, some directness, some closeness to the metal, in exchange for something a human could approach, learn, reason about, and maintain.

The trade kept going. With each generation, the abstraction layer got thicker. C++ brought object-oriented programming to systems work, letting developers model the world in terms of objects and relationships rather than memory and pointers. Java took that further and threw in garbage collection, "write once run anywhere" portability, and a type system designed to keep programmers from shooting themselves in the foot. Python traded explicit typing and raw performance for readability so clean that it became the first language many people learn today.

And it didn't stop at languages. We started building frameworks on top of languages. Spring on top of Java. Rails on top of Ruby. Django on top of Python. React on top of JavaScript. Then frameworks on top of frameworks. Abstractions on top of abstractions. Each layer hiding more of the machinery beneath, each layer letting developers work with higher-level concepts rather than lower-level mechanics.

We called all of this progress. And by one measure, it genuinely was. The number of people who could build software exploded. The speed at which applications could be developed accelerated dramatically. Ideas that would have taken a team of specialists years to implement could be built by a small team in months.

But every single one of these abstractions was built to solve the same underlying problem: humans have limited cognitive bandwidth, and raw machines don't care.

The frameworks didn't exist because they made the software better. They existed because they made the software more approachable. More writable. More readable. More maintainable by the humans who had to work with it. Every layer of abstraction was a subsidy paid to human cognition, funded by hardware performance and infrastructure complexity.

The bill we've been running up

There's a cost to all of this that we don't talk about enough, because for most of the last fifty years it felt like the right trade.

All those abstractions require hardware to compensate. Interpreted languages are slower than compiled ones. Garbage collection introduces latency. Layers of framework indirection add overhead. Virtual machines and containers and cloud infrastructure exist in large part to give us enough headroom to run software that is, by any objective measure, far less efficient than it could be if humans weren't the ones writing and reading it.

We bought human approachability with CPU cycles, memory, and kilowatt hours. At scale, that bill is enormous. We've built data centers full of hardware whose primary job is to make up for the inefficiency introduced by decades of abstractions designed around human cognitive limits.

Again: that was a reasonable trade. The alternative, keeping everything close to the metal, would have meant far less software, far fewer developers, far slower progress. The abstraction tax was worth paying.

The question now is whether it still is.

The assumption that's breaking

Every layer of abstraction in our stack rests on the same assumption that the last post in this series examined from a different angle: that a human is on the other end.

Python is readable because humans need to read it. Rails is opinionated because humans benefit from convention. TypeScript added types to JavaScript because humans make fewer mistakes with guardrails. React's component model exists because humans think in composable, reusable pieces.

Take the human out of the picture and most of these justifications evaporate.

Agentic coding systems don't need readable syntax. They don't benefit from opinionated conventions designed to constrain human error. They don't struggle to hold a complex dependency graph in their head. They don't need the language to express intent at a human-comfortable level of abstraction, because their level of comfortable abstraction is simply different from ours.

They can read assembly. They can reason about memory layouts. They can track register states. They can optimize at a level of detail that would exhaust a human developer in minutes.

And as they become the primary authors and maintainers of code, the rationale for building languages and frameworks around human approachability starts to weaken.

What comes next

I expect the next generation of programming tooling to start optimizing in a different direction.

Not away from human involvement entirely. Humans will still direct, review, understand at a system level, and take responsibility for what the software does. But the layer where code actually gets written and maintained will increasingly belong to agents. And the tools built for that layer will be built for agents, not for us.

That means languages optimized for processing efficiency rather than human readability. Frameworks that minimize abstraction overhead rather than hiding complexity from developers. Compilation targets that don't need to accommodate the cognitive limits of the person writing the code, because the entity writing the code doesn't have those limits.

In practical terms: I expect we'll see a gradual movement back toward the metal. Not a sudden abandonment of Python and JavaScript and the frameworks we've built on them. But over the next decade, as agentic coding matures, the competitive advantage will shift. The teams and organizations that allow agents to work at lower levels of abstraction, closer to the hardware, will produce software that is faster, cheaper to run, and more efficient by orders of magnitude compared to teams still running their agent-generated code through layers of human-friendly abstraction.

We'll also see new languages emerge that are designed from the start with non-human authors in mind. What that looks like exactly, I genuinely don't know. But I'd expect them to prioritize formal verifiability, explicit behavioral contracts, and machine-readable intent over anything resembling natural language syntax. The goal won't be for a human to sit down and read a file. The goal will be for an agent to produce provably correct, maximally efficient output that a human can understand at the right level of abstraction without needing to read every line.

The disruption nobody Is talking about

Here's what bothers me about where the industry conversation is right now.

We're spending enormous energy debating which current language or framework is best positioned for the agentic era. Python versus Rust. JavaScript versus TypeScript. FastAPI versus Django. As if the question is which of our existing human-approachability tools will win.

That's the wrong frame entirely.

The disruption isn't about which current abstraction layer survives. It's about whether the entire rationale for building thick abstraction layers holds. And I think the honest answer is that it holds for less and less of the stack with each passing year.

This is going to be uncomfortable for a lot of people. Entire careers have been built on expertise in specific languages and frameworks. Vast ecosystems of tooling, training, hiring pipelines, and organizational knowledge are wrapped up in the current stack. Nobody wants to hear that the thing they've spent a decade mastering is being optimized away.

But the history of software is the history of exactly this kind of disruption. Assembly programmers didn't disappear overnight when C arrived. COBOL programmers were still employed for decades after Java showed up. The transitions are slow until suddenly they're not. And the people who see the direction early and start repositioning are the ones who shape what comes next rather than being displaced by it.

What you should actually do with this

I'm not suggesting you abandon your current stack. I'm not suggesting you stop learning modern frameworks or that everything you know is about to become worthless.

I'm suggesting you pay attention to the direction. Watch how agents perform when given more latitude to work at lower levels of abstraction. Pay attention to where the efficiency gains are showing up. Notice when a framework convention that exists to protect human developers from themselves starts to feel like unnecessary overhead in an agentic workflow.

And start thinking about where your value actually lives. If your expertise is in the syntax and conventions of a particular framework, that's a more exposed position than it was two years ago. If your expertise is in understanding systems, defining problems clearly, knowing what good outcomes look like, and holding the human judgment layer that agents can't provide, that's a more durable position than it's ever been.

We spent fifty years building upward, away from the machine, toward the human. The next decade is going to start pulling in the other direction.

That's not a loss. It's a renegotiation. And the people who thrive will be the ones who recognize what was always the point, and what was always just scaffolding.

Doc Norton is Vice President of Delivery at Test Double and has extensive experience in building great software and great teams, including focuses within his career in software development, software architecture, product management, technology leadership, agile coaching, organizational agility, and systems thinking.

Need help navigating?

We embed to understand your system, clearly define the most important problems, and solve them to drive outcomes that matter.

Find out more

Related Insights

🔗
This has happened before. It's happening again.
🔗
What does "Good Code" even mean now?
🔗
Quality you can’t generate: AI is only as good as your constraints
🔗
Speed is a side effect of making the system work

Explore our insights

See all insights
Developers
Developers
Developers
Red-Green-Refactor your context

You committed the fix. But everything you learned along the way went nowhere. A practice borrowed from TDD's red-green-refactor loop gives that hard-won knowledge somewhere to land.

by
Rick Reilly
Leadership
Leadership
Leadership
This has happened before. It's happening again.

Doc Norton has navigated two genuine sea changes in software development—mainframes to PCs and desktop to web. Agentic coding is the third, but unlike the prior shifts that expanded the profession, this one compresses it. The timeline to move is shorter than you think.

by
Doc Norton
Developers
Developers
Developers
Three Amigos with AI: Stop building the wrong thing faster

AI coding assistants are remarkably fast at building the wrong thing. This post adapts the Three Amigos practice to give AI an unambiguous contract—before the first commit, not after the fifty-seventh.

by
Andy Vida
Letter art spelling out NEAT

Join the conversation

Technology is a means to an end: answers to very human questions. That’s why we created a community for developers and product managers.

Explore the community
Test Double Executive Leadership Team

Learn about our team

Like what we have to say about building great software and great teams?

Get to know us
Test Double company logo
Improving the way the world builds software.
What we do
Services OverviewSoftware DeliveryProduct StrategyLegacy ModernizationPragmatic AIDevOpsUpgrade RailsTechnical RecruitmentAssessments
Who WE ARE
About UsCulture & CareersGreat CausesEDIOur TeamContact UsNews & AwardsN.E.A.T.
Resources
Case StudiesAll InsightsLeadership InsightsDeveloper InsightsProduct InsightsPairing & Office Hours
NEWSLETTER
Sign up hear about our latest innovations.
Your email has been added!
Oops! Something went wrong while submitting the form.
Standard Ruby badge
614.349.4279hello@testdouble.com
Privacy Policy
© 2020 Test Double. All Rights Reserved.

Need help navigating?

We embed to understand your system, clearly define the most important problems, and solve them to drive outcomes that matter.

Find out more