Somewhere in the mid-aughts eXtreme Programming (XP) practices became widely-discussed in software. From that time forward, a strange chasm emerged in the discourse.
I would stumble across large pockets of programmers discussing—with full confidence—the fact that “nobody is actually doing TDD”, “pairing all the time is a myth”, “no one can actually succeed with those practices, it’s just hype”. Meanwhile, I was writing all my code test-first, spending nearly all of my time pair-programming, and by all accounts succeeding greatly. Not to mention enjoying coding more than ever.
It was like living in parallel universes. In my universe, XP practices were a welcome way of life, making my employers happy with delivery. In this other universe, I was some kind of hype-huckster employed by the Agile Mafia to … I dunno, sell Pivotal Tracker subscriptions???
I’m unexpectedly finding myself on the same side of a similar divide about agentic coding.
I am not what I would call an enthusiast about this technology. I was not the earliest adopter. I am deeply troubled by the externalities. When it comes to creative end-products—art, music, prose—I think the description of AI startups as “strip-mining the entirety of human creativity and selling it back to us” is accurate. And I am frankly disgusted at 90% of the arbitrary insertion of LLMs into every facet of software that never needed it and does not benefit.
About the only thing LLMs do in a way that is (to me) self-evidently useful, empowering, and frankly transformative is writing code.
I’m not ignorant of how badly LLM-assisted coding can go. I’ve watched in horror as junior developers turned their brains off, accepted agent suggestions, and created wads of buggy, hard-to-change code of which they had no real comprehension. I’ve untangled naive, broken agent-generated PRs.
But I can also honestly say that I haven’t only delivered more code in the last year than I ever could have dreamed of before. Much of it has also been some of the most well-factored, robust, rigorously tested, and yes, elegant code I’ve ever delivered at scale. I’ve accomplished projects that up til recently were fully off-the-map-of-the-possible with the available resources, both for myself and for clients. And I’ve done it at a level of quality and maintainability that I’m generally quite happy with.
It’s not just greenfield or new-feature work either. I’ve also delivered fixes on numerous longstanding bugs and accomplished large refactorings which were previously out-of-scope.
Mind you, none of this has been accomplished through anything that could remotely be called “vibe coding”. I did some experiments in that direction, and quickly determined I had no use for it other than for small proofs-of-concept. Which are then discarded, retaining only the lessons-learned about how to better-specify a robust production project.
No vibes here; it has all been close collaboration and steadily building out what Annie Veila calls “The Middle Loop“. Review, direction, standards, tests, guidance, skills, blocking hooks on linters and code-quality metrics. All the rigor that accelerated development reveals the holes in. As Chad Fowler writes:
everything that lets you throw code away without fear: the properties that define correctness, the contracts that specify interfaces, the monitors that detect drift.
So that’s my world now. It’s an adjustment for sure; as someone who is best known for my writings on the pleasures of the fine-grained coding idiom, there’s a grieving process.
(Albeit one I had perhaps been preparing for longer than others. For most of my career I held it as an article of faith that I would not finish my coding career working at the same level of abstraction that I started; I just wasn’t sure what form that shift would take until now.)
The point is, when it comes to code, for better or worse this shit works, and it works well, and it works better every month. What confuses me are not the criticisms of AI slop, or foisted AI misfeatures, or of the environmental impact, or of the political ramifications, or of the AI behemoth’s circular accounting; all of that makes sense to me. What baffles me is seeing developers assuming it doesn’t and can’t work. That all AI-generated code is crap, an accumulating ball of mud that is leading to zero actual productivity or delivery gains.
I should specify that on that latter point I don’t mean to say they are hallucinating: I have seen several reports suggesting that, indeed, in many organizations AI coding investment is not delivering ROI. Which I am then seeing very smart, experienced developers use as a reason to not even touch the technology because it’s “nothing but hype”.
I was talking to Jessitron the other day about why our experience seems so categorically different than some other programmers’ experiences. She suggested that just as with TDD and pair-programming, in those programmers’ organizations it is not possible to succeed with these techniques. And I think she may be right.
But as developers it does nothing helpful for the conversation to conflate “GenAI is an ugly business on many levels” or “some organizations are not structured to succeed with it” with “it doesn’t work“. As someone who heel-dragged my way into using it, I can say that it is a personal force-multiplier for building and refactoring robust code at scale the likes of which I have never before experienced. As a chronically overwhelmed over-leveraged solo parent supporting two households and working 11-hour days, it has given me personal leverage to accomplish code-driven projects I had written-off as unattainable a couple years ago.
For writing and wrangling code, GenAI is a mind-bogglingly effective tool, full stop. That leaves plenty of vital debates open: from large-scale questions about environmental impact, political sway, labor protections, and the cementing of oligarchic control; to more immediate questions like “what about this specific organization makes us incapable of leveraging coding agents effectively?”. These are relevant and essential questions to ask.
But if you are standing on the outside saying “no one is really getting value from these tools”, that by itself is not a principled stand. It’s more like principled myopia. And I worry that it’s causing some folks to self-sideline, when we could really use their voices in the thick of it.
That, and also: this my long-form once-for-all answer to why I won’t engage with arguments that start from the premise that it agentic coding doesn’t work and can only deliver crap. It’s a flawed premise, and we need more incisive criticism than that.
P.S. I did not set out to write this as an ad, but I would be remiss if I didn’t mention that Jessitron and I are building a course from our concrete experiences working with coding agents. Subscribe to our newsletter if you want to stay in the loop!
@avdi i think a lot of people hate the externalities, tried it over a year ago, and can't comprehend how much has changed, so they extrapolate their experience from a year ago.
I think you may be right. It’s kind of breathtaking how different the experience is today from what it was just a year or so ago.