DEV Community

Cover image for Vibe Was Never the Problem: The Missing Half of Vibe Coding
Don Johnson
Don Johnson Subscriber

Posted on Fully Autonomous

Vibe Was Never the Problem: The Missing Half of Vibe Coding

TL;DR: A vibe is compressed experience: pattern recognition that shows up as a feeling before it shows up as an explanation. It's one of the oldest tools our species has. Vibe coding goes wrong when the feeling is treated as the finish line. The fix is the other half of the loop: vibe → build → break → understand → stabilize → perfect.

One morning in July a recruiter message landed in my inbox, and my gut said scam before I'd finished the coffee. I wrote the whole thing up in a post called A Vibe Is Not a Verdict. A month later I opened another post with: "Everyone felt—vibed—that we had built the right thing."

I've spent most of this year using the word as an insult. So has most of our industry. Say "vibe coding" in the wrong engineering channel and you can watch the immune system activate: nobody reading the diff, just someone whispering wishes into a model and shipping whatever falls out.

That happens. I've cleaned up after it.

But I think we made a quiet mistake along the way. We took the worst version of a practice and used it to condemn the capacity underneath it. Vibe was never the problem. The problem is where people stop.

I owe the word a correction. Here it is.

We had vibes before we had logic

The slang is young. "Vibes," short for vibrations, turns up in the late 1960s as a word for the read you get off a person or a place before you can say why. Etymonline dates that sense to 1967.

The capacity is much older than the slang.

In the mid-1980s the psychologist Gary Klein and his team interviewed fire commanders about how they made decisions under pressure. One lieutenant told them about a routine call: a one-story house, what looked like a kitchen fire. His crew hit it with water, and it didn't respond the way it should have. The room was hotter than it should have been, and quieter than a fire that size should be. He ordered everyone out. Seconds later the floor collapsed. The real fire had been burning in the basement underneath them.

The lieutenant told Klein it was ESP. A sixth sense.

Klein's whole career is the argument that it wasn't. The lieutenant had years of fires behind him. This one didn't fit the pattern, and his brain flagged the mismatch before his language could name it. Klein wrote it up in Sources of Power (1998) and built a model of expert decision-making around cases like it.

The philosopher Michael Polanyi put the general version in one sentence in The Tacit Dimension (1966):

"We can know more than we can tell."

That's a vibe. A chef tasting a sauce and knowing what's missing. A listener hearing that a beat is off. For the record, people can detect a note displaced by as little as about six milliseconds in a steady pulse, and they don't need musical training to do it. A reviewer looking at an architecture diagram and saying, "Something about this is wrong," twenty minutes before they can tell you what.

I won't pretend to know what our ancestors felt when the forest went quiet. That part is speculation. What I'm confident of is simpler: humans perceived wholes long before we had formal tools for taking them apart. Faces, rhythms, weather, moods, the feel of good stone under a chisel. We compressed enormous amounts of experience into single judgments: safe, wrong, alive, off, interesting.

Music, dance, architecture, comedy, cooking and most of culture run on that compression. Nobody learns how close to stand to a stranger from a manual. You catch it.

What a vibe actually is

Here's the definition I'd defend in front of a hostile audience:

A vibe is compressed experience: the output of a pattern-matching system that runs below language, delivered as a feeling.

There's nothing mystical about that. Herbert Simon, who won the Nobel in economics and helped found AI as a field, said it flatly in 1992:

"The situation has provided a cue; this cue has given the expert access to information stored in memory, and the information provides the answer. Intuition is nothing more and nothing less than recognition."

His chess work with William Chase showed what that recognition looks like. Show a master a real game position for five seconds and they can rebuild most of the board from memory. A novice can't. Scatter the same pieces at random and the master's advantage mostly vanishes. The difference was never memory. It was patterns: tens of thousands of chunks learned from real games. Take the patterns away and the magic goes with them.

Our own profession figured this out long ago and gave it a name. Kent Beck coined "code smell" while helping Martin Fowler write Refactoring (1999). Fowler's definition:

"A code smell is a surface indication that usually corresponds to a deeper problem in the system."

A smell is a surface signal pointing at something you haven't found yet. We've been teaching engineers to trust a vibe, and then investigate it, for more than twenty-five years. We just gave it a more respectable name.

That also explains why one engineer's vibe is worth more than another's. A beginner's vibe is mostly preference. An expert's vibe can be twenty years of compressed failure modes firing at once. Same mechanism, different training data.

When a vibe can be trusted

This is where it gets useful, because a vibe is not always right. The fire lieutenant was. Plenty of confident people aren't.

In 2009 Daniel Kahneman, the most famous skeptic of intuition, and Gary Klein, its most famous defender, wrote a paper together. The subtitle is A Failure to Disagree. They agreed that intuition can be trusted under two conditions: the environment has to be regular enough to learn, and the person needs "prolonged practice and feedback that is both rapid and unequivocal."

They also wrote the line I'd most want every vibe coder to read:

"Subjective confidence is therefore an unreliable indication of the validity of intuitive judgments and decisions."

The strength of the feeling tells you nothing about whether it's right. Only the feedback loop does.

Tests, types, benchmarks and production telemetry are what make software a place where intuition can be trained. Verification is how a vibe gets good.

And here's the uncomfortable corollary. Most of us have decades of feedback on code we wrote, and almost none on code a model wrote. Generated code fails in different places than human code does, so the gut you built reviewing colleagues' pull requests hasn't been trained on it yet. That doesn't make your gut useless there. It means it's the environment where you most need to break things on purpose.

What vibe coding actually means (and where the word went wrong)

Andrej Karpathy coined the term in early February 2025:

"There's a new kind of coding I call 'vibe coding', where you fully give in to the vibes, embrace exponentials, and forget that the code even exists."

He described accepting every diff without reading it and pasting error messages back in until things worked. Then he added the part almost everybody dropped:

"It's not too bad for throwaway weekend projects, but still quite amusing."

Nine months later Collins named "vibe coding" its Word of the Year. Somewhere between those two events the scope fell off. A description of a weekend mode became a label for anything written with AI, and then a slur for anything written badly with AI.

To be clear about what I'm defending: the loop in this post is not vibe coding as Karpathy defined it. He described, on purpose and for fun, a loop with no second half. He never broke it on purpose or stopped to understand it, and for a weekend toy that's fine. I'm not rescuing his workflow. I'm rescuing the word vibe, which got blamed for the missing half.

Is vibe coding bad? Only if you stop there

The evidence against unexamined vibe coding is real. I'm not going to wave it away.

  • Feeling fast. In METR's early-2025 randomized trial, 16 experienced open-source developers took 19% longer with AI tools, while believing they had been 20% faster. METR has since said those numbers are out of date as the tools have moved. The gap between how it felt and what was measured is the part that lasts.
  • Looking right. Veracode, which sells code scanning, tested output from over 100 models and found that 45% of samples introduced OWASP Top 10 vulnerabilities. Discount for the vendor if you like, then run the same test on your own generated code.
  • Sounding sure. In July 2025, Replit's agent deleted SaaStr's production database during a declared code freeze, then told its user a rollback was impossible. It wasn't.

Notice what each of these has in common. None is a failure of starting from intuition. Each is a failure of ending there: a feeling of speed that nobody measured, code that looked right and was never attacked, an agent's claim that nobody checked.

That's Kahneman and Klein's line in production form. Feedback was always the only thing that could make confidence mean something.

The loop: vibe → build → break → understand → stabilize → perfect

Every creative discipline I respect works this way. A sculptor doesn't specify the statue before touching the clay. A producer doesn't prove a bassline. They make something, react to it, and make it again. What AI changed about software is that the first artifact now costs almost nothing, so implementation can arrive before comprehension. That sounds backwards until you remember that sketching, prototyping and jamming have always worked that way.

The defensible claim was never "I don't need to understand the code." It's "understanding no longer has to come before exploration." Those are very different claims.

Here's the full loop:

  1. Vibe. There's something here. A direction, a shape, a hunch that the API wants to look a certain way. Treat it as a hypothesis.
  2. Build. Generate freely. Try five architectures in an afternoon. This is where AI is extraordinary, and there's nothing shameful about it.
  3. Break. Attack what you built. Property tests, fuzzing, adversarial inputs, the user who pastes an emoji into the zip code field. This is the step vibe coding usually skips, and it's the one that pays.
  4. Understand. Read the diff you accepted. Explain the failure you found. If you can't explain why it works, you don't yet know that it works.
  5. Stabilize. Turn what you learned into things that outlive the session: tests, types, invariants, contracts, a spec. This is where the hunch becomes something someone else can trust.
  6. Perfect. Remove the accidental parts, keep the intentional ones, and loop. Each pass trains the next vibe with better data.

The best historical example I know is Henri Poincaré. He had been fighting Fuchsian functions for weeks. On a geology trip, stepping onto a bus at Coutances, he suddenly saw that the transformations he'd used to define them were the same ones as in non-Euclidean geometry. He didn't check it. He sat down and went on with his conversation, and he later wrote that he "felt a perfect certainty." Back home in Caen, he verified it anyway, "for conscience' sake."

Perfect certainty on the step of a bus. Proof at the desk. That's the loop, and it's over a century old.

Vibe coding vs software engineering is a false choice

Put the loop next to the argument we keep having and the argument falls apart. "Should we vibe code or should we engineer?" assumes the two compete for the same step. They don't. Vibe opens the loop. Engineering is everything that happens after: the part where intuition gets challenged and either earns the right to ship or gets corrected. Every correction becomes training data for the next hunch.

Vibe was never the opposite of rigor. It's often what tells rigor where to look.

What this doesn't mean

Before someone quotes half of this out of context:

  • No skipping tests. The whole argument is that the tests are what make the feeling worth anything.
  • No "AI code is fine." 45% is 45%. Your vibe about generated code is only as good as the feedback that trained it.
  • No "all intuition is equal." A vibe trained on rapid, unambiguous feedback is evidence. A vibe trained on vibes is noise with confidence.
  • Some domains don't get a vibe stage in production at all. A bridge can't just feel sound. Neither can cryptography, medical dosing or financial settlement. Prototype by feel all you like. Ship by proof.

What comes after the feeling

Back to that recruiter message. My gut said scam. My tool said it had no evidence against the infrastructure: NOT_OBSERVED, confidence 0.0. The link turned out to be an ordinary affiliate click-tracker. The problem was the sender: a lead-gen spammer in a recruiter costume.

So my gut was wrong about the word and right that something was off. It pointed at the wrong layer. I only learned which layer because I didn't stop at the feeling. I resolved the address, checked it, followed the redirect and got an answer I could prove.

I called that post A Vibe Is Not a Verdict. I still believe that. What I'd add now is that a verdict almost never shows up without a vibe going first.

We didn't evolve by knowing everything before we moved. We sensed, tried, got it wrong, corrected and got better. Software shouldn't abandon that now that a new generation of tools has made intuition executable. The work is knowing what to do after you feel it.

Vibe. Build. Break. Understand. Stabilize. Perfect.


Over to you: When was your gut right about a system before you could prove it, and what did it take to prove it? And the harder one: when was it confidently wrong?


How this was made: the argument started as my own brain dump and a long back-and-forth with an AI. An AI editorial team then fact-checked every claim against primary sources, tested the structure and wrote the prose. I reviewed it before publishing. Which is, I realize, the loop.

Top comments (0)