The first time I used ChatGPT to code, back in early 2023, I was reminded of โThe Monkeyโs Paw,โ a classic horror story about an accursed talisman that grants wishes, but always by the most malevolent path โ the desired outcome arrives after exacting a brutal cost elsewhere first. With the same humorless literalness, ChatGPT would implement the change Iโd asked for, while also scrambling dozens of unrelated lines. The output was typically over-engineered, often barnacled with irrelevant fragments of code. There were some usable lines in the mix, but untangling the mess felt like a detour.
When I started using AI-assisted tools earlier this year, I felt decisively outmatched. The experience was like pair-programming with a savant intern โ competent yet oddly deferential, still a tad too eager to please and make sweeping changes at my command. But when tasked with more localized changes, it nailed the job with enviable efficiency.
The trick is to keep the problem space constrained. I recently had it take a dozen lines of code, each running for 40 milliseconds in sequence โ time stacking up โ and run them all in parallel so the entire job finished in the time it used to take for just one. In a way, itโs like using a high-precision 3D printer to build an aircraft: use it to produce small custom parts, like hydraulic seals or O-rings, and it delivers flawlessly; ask it for something less localized like an entire cockpit, and you might get a cockpit-shaped death chamber with a nonfunctional dashboard and random knobs haphazardly strung together. The current crop of models is flexible enough for users with little-to-no coding experience to create products of varying quality through whatโs called โ in a billion-dollar buzzword โ vibe-coding. (Google even released a separate app for it called Opal.)
Yet, one could argue that vibe-coding isnโt entirely new. As a tool for nonprofessionals, it continues a long lineage of no-code applications. As a mode of programming that involves less prefrontal cortex than spinal reflex, any honest programmer will admit to having engaged in a dishonorable practice known as โshotgun debugging.โ Like mindlessly twisting a Rubikโs Cube and wishing the colors would magically align, a programmer, brain-fried after hours of fruitless debugging, starts arbitrarily tweaking code โ deleting random lines, swapping a few variables, or flipping a Boolean condition โ re-runs the program, and hopes for the correct outcome. Both vibe-coding and shotgun debugging are forms of intuitive flailing, substituting hunches and luck for deliberate reasoning and understanding.
Weโve used machines to take the load off cognition, but for the first time, we are offloading cognition itself to the machine.
As it happens, itโs not considered good form for a self-respecting programmer to engage in shotgun debugging. Soon, I came to see that the most productive form of AI-assisted coding may be an editorial one โ much like how this essay took shape. My editor assigned this piece with a few guiding points, and the writer โ yours truly โ filed a serviceable draft that no sober editor would run as-is. (Before โprompt and pray,โ there was โassign and wait.โ)
Likewise, a vibe-coder โ a responsible one, that is โ must assume a kind of editorship. The sprawling blocks of code produced by AI first need structural edits, followed by line-level refinements. Through a volley of prompts โ like successive rounds of edits โ the editor-coder minimizes the delta between their vision and the output.
Often, what I find most useful about these tools isnโt even writing code but understanding it. When I recently had to navigate an unfamiliar codebase, I asked for it to explain its basic flow. The AI generated a flowchart of how the major components fit together, saving me an entire afternoon of spelunking through the code.
Iโm of two minds about how much vibe-coding can do. The writer in me celebrates how it could undermine a particular kind of snobbery in Silicon Valley โ the sickening smugness engineers often show toward nontechnical roles โ by helping blur that spurious boundary. But the engineer in me sees that as facile lip service, because building a nontrivial, production-grade app without grindsome years of real-world software engineering experience is a tall order.
Iโve always thought the best metaphor for a large codebase is a city. In a codebase, there are literal pipelines โ data pipelines, event queues, and message brokers โ and traffic flows that require complex routing. Just as cities are divided into districts because no single person or team can manage all the complexity, so too are systems divided into units such as modules or microservices. Some parts are so old that itโs safer not to touch them, lest you blow something up โ much like the unexploded bombs still buried beneath European cities. (Three World War II-era bombs were defused in Cologne, Germany, just this summer.)
If developing a new product feature is like opening a new airline lounge, a more involved project is like building a second terminal. In that sense, building an app through vibe-coding is like opening a pop-up store in the concourse โ the point being that itโs self-contained and requires no integration.
Vibe-coding is good enough for a standalone program, but the knottiest problems in software engineering arenโt about building individual units but connecting them to interoperate. Itโs one thing to renovate a single apartment unit and another to link a fire suppression system and emergency power across all floors so they activate in the right sequence.
These concerns extend well beyond the interior. The introduction of a single new node into a distributed system can just as easily disrupt the network, much like the mere existence of a new building can reshape its surroundings: its aerodynamic profile, how it alters sunlight for neighboring buildings, the rerouting of pedestrian traffic, and the countless ripple effects it triggers.
The security concerns around vibe-coding, in my estimation, are something of a bogeyman.
Iโm not saying this is some lofty expertise, but rather the tacit, hard-earned kind โ not just knowing how to execute, but knowing what to ask next. You can coax almost any answer out of AI when vibe-coding, but the real challenge is knowing the right sequence of questions to get where you need to go. Even if youโve overseen an interior renovation, without standing at a construction site watching concrete being poured into a foundation, you canโt truly grasp how to create a building. Sure, you can use AI to patch together something that looks functional, but as the software saying goes: โIf you think good architecture is expensive, try bad architecture.โ
If you were to believe Linus Torvalds, the creator of Linux, thereโs also a matter of โtasteโ in software. Good software architecture isnโt just drawn up in one stroke but emerges from countless sound โ and tasteful โ micro-decisions, something models canโt zero-shot. Such intuition can only be developed as a result of specific neural damage from a good number of 3AM on-call alerts.Perhaps these analogies will only go so far. A few months ago, an AI could reliably operate only on a single file. Now, it can understand context across multiple folders and, as Iโm writing this, across multiple codebases. Itโs as if the AI, tasked with its next chess move, went from viewing the board through the eyes of a single pawn to surveying the entire game with strategic insight. And unlike artistic taste, which has infinitely more parameters, โtasteโ in code might just be the sum of design patterns that an AI could absorb from OโReilly software books and years of Hacker News feuds.
When the recent Tea app snafu exposed tens of thousands of its usersโ driverโs licenses โ a failure that a chorus of online commenters swiftly blamed on vibe-coding โ it felt like the moment that vibe-coding skeptics had been praying for. As always, we could count on AI influencers on X to grace the timeline with their brilliant takes, and on a certain strain of tech critics โ those with a hardened habit of ritual ambulance chasing โ to reflexively anathematize any use of AI. In a strange inversion of their usual role as whipping boys, software engineers were suddenly elevated to guardians of security, cashing in on the moment to punch down on careless vibe-coders trespassing in their professional domain.
When it was revealed that vibe-coding likely wasnโt the cause, the incident revealed less about vibe-coding than it did about our enduring impulse to dichotomize technical mishaps into underdogs and bullies, the scammed and fraudsters, victims and perpetrators.
At the risk of appearing to legitimize AI hype merchants, the security concerns around vibe-coding, in my estimation, are something of a bogeyman โ or at least the net effect may be non-negative, because AI can also help us write more secure code.
Sure, weโll see blooper reels of โapp slopโ and insecure code snippets gleefully shared online, but I suspect many of those flaws could be fixed by simply adding โrun a security audit for this pull requestโ to a checklist. Already, automated tools are flagging potential vulnerabilities. Personally, using these tools has let me generate far more tests than I would normally care to write.
Further, if a model is good enough, when you ask, โHey, I need a database where I can store driverโs licenses,โ an AI might respond:
โSure, but you forgot to consider security, you idiot. Hereโs code that encrypts driverโs license numbers at rest using AES-256-GCM. Iโve also set up a key management system for storing and rotating the encryption key and configured it so decrypting anything requires a two-person approval. Even if someone walks off with the data, theyโd still need until the heat death of the universe to crack it. Youโre welcome.โ
In my day job, Iโm a senior software engineer who works on backend mainly, on machine learning occasionally, and on frontend โ if I must โ reluctantly. In some parts of the role, AI has brought a considerable sense of ease. No more parsing long API docs when a model can tell me directly. No more ritual shaming from Stack Overflow moderators who deemed my question unworthy of asking. Instead, I now have a pair-programmer who doesnโt pass judgment on my career-endingly dumb questions.
The evolution of software engineering is a story of abstraction.
Unlike writing, I have little attachment to blocks of code and will readily let AI edit or regenerate them. But I am protective of my own words. I donโt use AI for writing because I fear losing those rare moments of gratification when I manage to arrange words where they were ordained to be.
For me, this goes beyond sentimental piety because, as a writer who doesnโt write in his mother tongue โ โexophonicโ is the fancy term โ I know how quickly an acquired language can erode. Iโve seen its corrosive effects firsthand in programming. The first language I learned anew after AI arrived was Ruby, and I have a noticeably weaker grasp of its finer points than any other language Iโve used. Even with languages I once knew well, I can sense my fluency retreating.
David Heinemeier Hansson, the creator of Ruby on Rails, recently said that he doesnโt let AI write code for him and put it aptly: โI can literally feel competence draining out of my fingers.โ Some of the trivial but routine tasks I could once do under general anesthesia now give me a migraine at the thought of doing them without AI.
Could AI be fatal to software engineering as a profession? If so, the world could at least savor the schadenfreude of watching a job-destroying profession automate itself into irrelevance. More likely in the meantime, the Jevons Paradox โ greater efficiency fuels more consumption โ will prevail, negating any productivity gain with a higher volume of work.
Another way to see this is as the natural progression of programming: the evolution of software engineering is a story of abstraction, taking us further from the bare metal to ever-higher conceptual layers. The path from assembly language to Python to AI, to illustrate, is like moving from giving instructions such as โrotate your body 60 degrees and go 10 feet,โ to โturn right on 14th Street,โ to simply telling a GPS, โtake me home.โ
As a programmer from what will later be seen as the pre-ChatGPT generation, I canโt help but wonder if something vital has been left behind as we ascend to the next level of abstraction. This is nothing new โ itโs a familiar cycle playing out again. When C came along in the 1970s, assembly programmers might have seen it as a loss of finer control. Languages like Python, in turn, must look awfully slow and restrictive to a C programmer.
Hence it may be the easiest time in history to be a coder, but itโs perhaps harder than ever to grow into a software engineer. A good coder may write competent code, but a great coder knows how to solve a problem by not writing any code at all. And itโs hard to fathom gaining a sober grasp of computer science fundamentals without the torturous dorm-room hours spent hand-coding, say, Dijkstraโs algorithm or a red-black tree. If youโve ever tried to learn programming by watching videos and failed, itโs because the only way to internalize it is by typing it out yourself. You canโt dunk a basketball by watching NBA highlight reels.
The jury is still out on whether AI-assisted coding speeds up the job at all; at least one well-publicized study suggests it may be slower. I believe it. But I also believe that for AI to be a true exponent in the equation of productivity, we need a skill Iโll call a kind of mental circuit breaker: the ability to notice when youโve slipped into mindless autopilot and snap out of it. The key is to use AI just enough to get past an obstacle and then toggle back to exercising your gray matter again. Otherwise, youโll lose the kernel of understanding behind the taskโs purpose.
On optimistic days, I like to think that as certain abilities atrophy, we will adapt and develop new ones, as weโve always done. But thereโs often a creeping pessimism that this time is different. Weโve used machines to take the load off cognition, but for the first time, we are offloading cognition itself to the machine. I donโt know which way things will turn, but I know there has always been a certain hubris to believing that oneโs own generation is the last to know how to actually think.
Whatever gains are made, thereโs a real sense of loss in all this. In his 2023 New Yorker essay โA Coder Considers the Waning Days of the Craft,โ James Somers nailed this feeling after finding himself โwanting to write a eulogyโ for coding as โit became possible to achieve many of the same ends without the thinking and without the knowledge.โ It has been less than two years since that essay was published, and the sentiments he articulated have only grown more resonant.
For one, I feel less motivated to learn new programming languages for fun. The pleasure of learning new syntax and the cachet of gaining fluency in niche languages like Haskell or Lisp have diminished, now that an AI can spew out code in any language. I wonder whether the motivation to learn a foreign language would erode if auto-translation apps became ubiquitous and flawless.
Software engineers love to complain about debugging, but beneath the grumbling, there was always a quiet pride in sharing war stories and their clever solutions. With AI, will there be room for that kind of shoptalk?
There are two types of software engineers: urban planners and miniaturists. Urban planners are the โbig pictureโ type, more focused on the system operating at scale than with fussing over the fine details of code โ in fact, they may rarely write code themselves. Miniaturists bring a horologistโs care for a fine watch to the inner workings of code. This new modality of coding may be a boon for urban planners, but leave the field inhospitable to miniaturists.
I once had the privilege of seeing a great doyen of programming in action. In college, I took a class with Brian W. Kernighan, a living legend credited with making โHello, worldโ into a programming tradition and a member of the original Bell Labs team behind Unix. Right before our eyes, he would live-code on a bare-bones terminal, using a spartan code editor called vi โ not vim, mind you โ to build a parser for a complex syntax tree. Not only did he have no need for modern tools like IDEs, he also replied to email using an email client running in a terminal. There was a certain aesthetic to that.
Before long, programming may be seen as a mix of typing gestures and incantations that once qualified as a craft. Just as we look with awe at the old Bell Labs gang, the unglamorous work of manually debugging concurrency issues or writing web server code from scratch may be looked upon as heroic. Every so often, we might still see the old romantics lingering over each keystroke โ an act thatโs dignified, masterful, and hopelessly out of time.
1 Comment


