A recent article by Xipu Li, “The Last Programmers,” caught my eye on Hacker News this morning, and it puts a sharp point on a feeling that’s been quietly circling in the back of my head for a while. Li argues that we are the last generation of people who will manually translate ideas into code. It’s a bold claim, but one paragraph, in particular, resonated with me.
He observes his younger colleagues, who seem to code by conversing with AI, and notes how the old guard might see them as “lazy” or “soft.” But he pushes back with an insight that feels like a fundamental law of our craft:
“But here’s what I’ve realized watching them: they’re not lazy. They’re just following the natural path that technology has always followed. Every major advancement in programming has been about abstracting away complexity so humans can focus on higher-level problems. We moved from machine code to assembly to high-level languages to frameworks to libraries. Each step made things ‘easier’ and each step had people complaining that developers were getting soft.”
This is it, right here. The entire history of software development is a story of climbing a ladder of abstraction. Each new rung—from the raw bits of machine code to the expressive power of modern frameworks—was built to hide complexity, freeing us up to think about bigger, more human problems.
And at every step of that climb, there were gatekeepers who insisted that “real” programming was being lost. The assembly wizards scoffed at C, believing true mastery meant wrestling with the machine on its own terms. The C veterans, in turn, often viewed those using Python or JavaScript with suspicion, as if the convenience of garbage collection was a crutch for those who couldn’t handle the raw power of manual memory management.
Today, we’re seeing the same story play out with the rise of AI-assisted development, or “vibe coding.” The idea of talking to an AI to build software feels like the next logical, almost inevitable, rung on that ladder. It allows us to stand even further from the implementation details and closer to the core of what we’re trying to solve. The focus shifts from how the code is written to what the code must achieve.
This is the very territory I’m exploring in my upcoming series on AI agents. When we treat AI not just as a code generator but as a true partner in the development process, the level of abstraction shifts dramatically. Our role begins to morph from meticulous coder to systems thinker and architect—someone who guides intelligent agents to build, test, and deploy. We are no longer just writing instructions; we are defining outcomes.
This transition won’t be seamless. It demands new skills: the art of the prompt, the discipline of high-level system design, and a deep, intuitive feel for collaborating with non-human partners. But this isn’t a sign of the craft weakening. It’s a sign of it maturing.
By embracing this next layer of abstraction, we aren’t getting softer. We’re just getting started on the real work.