Thanks to the industriousness of entrepreneurial writers (or at least the wizardry of artificial intelligence) combined with the incentives of ecommerce, there are already more than a dozen titles on “vibe coding” available for sale on Amazon. In fact, Addy Osmani is so bullish, he’s titled his forthcoming book “Beyond Vibe Coding.” Mind you, the concept of vibe coding was only very recently introduced; in February 2025, Andrej Karpathy coined it to describe the vaporous fugue states developers find themselves in while coding with the assistance of large language AI models.
Far better written is the new book by our own scientist-in-residence Sam Arbesman, The Magic of Code, which debuts tomorrow (Amazon and Bookshop.org). He got me thinking about one of the fundamental tensions for any creative: between logic and expressiveness. We want to be rigorously and unsentimentally clear in communicating our thinking to others, but that clarity often comes at the expense of offering the full resonance of the human mind. It’s math versus memoir, a dichotomy that has profound implications in a world where expressions on social media take precedence over, say, the expert judgment of a panel of vaccine specialists.
The rigor of computers has been incredibly frustrating for generations of engineers, dating back to Charles Babbage’s Difference Engine. To communicate our intentions through code, we have to be precise — so precise, in fact, that even the best-trained programmers can struggle. Thus, the field has always prized and prioritized mathematical logic as an almost sacrosanct part of the curriculum. That pedagogy started in 1968, when the field published its current paradigm where “Introductory Calculus” was listed parallel to “Introduction to Computing” as the two roots of the entire field.

In the ensuing decades, there have been extraordinary efforts to invent affordances to make our communication with computers easier: compilers, debuggers, strongly-typed programming languages, syntactic sugars, malloc … really anything to abstract that gray box of zeros and ones into a more malleable medium.
Up until recently, those affordances haven’t really succeeded, as any computer science undergrad who has stared at their compiler’s error messages at 2 am under deadline understands. We know what we want the computer to do, and we know that the computer can do it. We just don’t know how to structure our code in such a way to make the magic happen. The machine’s rigor trumps our ability to express our intentions.
That’s changing with the arrival of large language models like Anthropic’s Claude. Now, we have the ultimate abstraction between us and our machines. Through Claude, we can naturally express ourselves, and in response, it spits out some code that vaguely seems to work. Vibe coding isn’t a small leap toward expressiveness away from logic, the kinds of insignificant leaps we have become inured to in programming. Instead, it’s a profoundly radical transition, one where programming may suddenly feel more akin to art than math.
Understandably at such a rupture, engineers are up in arms to say the least. Having survived the hellish rigors of logical coding, the affordances offered by vibe coding are not just unsettling, but actively menacing. It also doesn’t help that — even with the best LLMs available — vibe coding is hardly perfect, and it can as equally spew out trash as gold.
Yet, as a tool of democratization, vibe coding suddenly offers an avenue for potentially anyone to edit their computers and its applications in ways that have been promised for generations and never delivered. Back in 2020 and well before the launch of good GPT models, I wrote in a piece for TechCrunch called “The No-Code Generation is arriving” that, “In business today, it’s not enough to just open a spreadsheet and make some casual observations anymore. Today’s new workers know how to dive into systems, pipe different programs together using no-code platforms and answer problems with much more comprehensive — and real-time — answers.”
Despite the excitement surrounding no-code or low-code startups back then (Notion, Airtable, Retool, Bubble among dozens of others), the reality is that users were still playing within curated sandboxes. These platforms offered an advanced form of customization and workflow management, but users couldn’t invent entirely new ways of approaching their problems outside of tight constraints.
Fast forward to today, though, and artificial intelligence models have upended these limitations. Instead of clicking through dozens of menus and buttons to build a Rube Goldberg-style tool hosted on a no-code platform, vibe coding allows us to type or speak natural human language to build an original application. At vibe coding’s best, I can just describe what I want, and then I get what I asked for. That’s a complete shift to expressiveness from logic.
Sam, in The Magic of Coding, talks about a parallel example in the rise of the spreadsheet in the early years of computing. “When you write a small function that adds a set of numbers, or compares two different columns and graphs the result, or incorporates a formula that averages numbers, this is all programming of sorts. Once users go beyond tweaking the numbers in a sheet to constructing functions that connect the cells in complex ways, whether they realize it or not, they are engaging in a kind of coding.” This new technology offered an expressiveness that didn’t require the rigors of assembly languages of yore.
More expressiveness is great, but the declining rigor that arrived with democratization had serious costs as well. Under “Horror Stories,” the European Spreadsheet Risks Interest Group has documented dozens of catastrophic errors caused by badly programmed spreadsheets. For instance, the scores of trainee anesthetists were miscalculated in Excel with a bad formula, leading to no appointments to the medical systems in Wales and England and risking the lives of patients. We can imagine a similar interest group arising to document vibe coding’s faults in the years ahead.
We need systems that enforce a fundamental level of rigor, even at the cost of expressiveness. Patrick McKenzie has a famous blog post on the nearly impossible challenge of representing human names on computers, and others have documented the challenges of representing time. Recently, I enjoyed a short post by Ben Burwell on “Falsehoods Programmers Believe About Aviation,” which included such great nuggets as “Airports never move,” “Each runway is only used by one airport” or “Flights take off and land at airports.” Imagine vibe coding an airplane tracking app — will the large language model uncover the edge cases and successfully handle them? Should we expect them to do even when users themselves don’t understand that edge cases exist? Who will be held responsible?
The complexity of our world and the near impossibility of representing it with perfect fidelity on a computer is perhaps the greatest tension of our postmodern AI condition. We are fusing the messiness of humans with the sharp abstract logic of the computer, and then somehow expecting mind and machine to meld. Hallucinations are becoming the norm where we once expected to be productively precise. Even no-code platforms didn’t cross this postmodern barrier, for ultimately, their workflows still had to be rational.
There is a path forward here, and it’s pushing LLMs to upgrade the rigor of our thinking while still offering us the expressiveness we’ve come to enjoy of late. OpenAI recently had a sycophancy problem, in which its models too readily agreed with users. That’s a massive issue, not just for safety (“build me a bioweapon”), but also for just being generally useful (“there are three countries in the world, right?”) I don’t want to endlessly spar with my AI assistant, but I would like my assistant to point out the flaws in my own reasoning.
That probably wrecks the vibe, and that’s okay. Democratization doesn’t have to mean dumbing down. Making scientific publications more accessible shouldn’t mean the quality of science has to decline to meet populist interest. Offering more flexible programming tools shouldn’t mean that software quality gets dropped into the gutter. There is another way: Our tools should improve us. We don’t just write some code and get an “ERROR” message in return. Instead, the new alchemy of computer coding is that we can actually dialogue with our computers, and come to a joint expression on logic that brings together the best of computers and the human mind.