Engineering Practice Vol. I · Issue 1 · May 5, 2026

The Vibe Coding Reckoning

Shipping code you don’t understand is no longer confined to senior engineers experimenting on weekends. Half of all code in production is now AI-assisted — and the technical debt is being written right now.

There is a term that has crept into the vocabulary of software development over the last two years that deserves more serious examination than it has received. "Vibe coding" — the practice of describing what you want in plain English, accepting whatever the AI generates, and shipping it without deeply understanding the implementation — has gone from an ironic joke on developer Twitter to a genuine description of how a meaningful percentage of production software is now being written.

The joke, when Andrej Karpathy coined the phrase in early 2025, was that he sometimes just vibes with the code. Lets it flow. Doesn't read it too carefully. Accepts what Claude or Copilot suggests and moves on. It was funny because it was honest, and honest because most developers with AI tools had felt that pull — the seductive efficiency of just pressing Tab and shipping.

That was fourteen months ago. The stakes were lower then. The code was smaller. The systems were less critical. And most of the people doing it were senior engineers who had decades of intuition to tell them when something felt wrong, even if they couldn't immediately articulate why.

That is no longer who is doing it.

THE SCALE OF WHAT IS HAPPENING

By early 2026, nearly half of all code in active development is being written with significant AI assistance. That number alone is striking. What it obscures is more striking: not all AI-assisted code is the same.

There is a spectrum. On one end, experienced engineers use AI to accelerate boilerplate — the tedious, repetitive scaffolding that doesn't require judgment. They review what the AI produces, understand it, modify it, test it. The AI is a fast junior associate who needs supervision. On the other end, there are developers — and increasingly non-developers — who describe an outcome, receive code, run it to see if it works, and ship it when it does. They cannot tell you what the code is doing at the level of data flow, memory management, error handling, or edge cases. They know it works in the scenarios they tested. They are vibing.

The uncomfortable truth is that the industry has been quietly tolerant of this second category, for a reason that makes short-term sense: a lot of the time, the code works. The tests pass. The feature ships. The user is happy. Nobody gets paged at 3am. So the question of whether the developer understood what they shipped becomes academic — an engineering philosophy debate, not a production issue.

Until it isn't.

THE INCIDENTS ARE STARTING

The failure modes of vibe coding are not hypothetical. They are showing up in incident reports, post-mortems, and quietly in the conversations that engineers have when they join a new codebase and find something that looks functional but makes no structural sense.

The pattern is consistent. A developer asked an AI to build a feature. The AI built it. It worked in testing. It shipped. Six months later, under conditions the original developer never tested — a specific edge case, a traffic spike, a dependency update, a data type no one anticipated — it fails. And the developer who built it either no longer works there, or cannot reconstruct the reasoning behind the implementation because they didn't have that reasoning when they built it.

Code review is supposed to catch this. The uncomfortable reality is that reviewing AI-generated code for logic correctness is significantly harder than reviewing code a human wrote. Human-written code, even bad human-written code, tends to follow patterns that betray the author's intent. You can read a function and understand what the developer was trying to do, even if they did it poorly. AI-generated code optimizes for correctness in the stated scenario. It may solve the stated problem with a solution that is technically functional but structurally bizarre — an approach that no experienced engineer would have chosen, implemented in a way that creates subtle dependencies or assumptions that only become visible under conditions that weren't anticipated.

Reviewing it requires not just checking whether it works, but reconstructing why it was built this way and whether that why holds up — which requires understanding the implementation deeply enough to have an opinion about it. That is hard. It takes time. And under deadline pressure in an environment where the code passes tests and the feature works, the review becomes perfunctory.

THE SECURITY PROBLEM NOBODY WANTS TO TALK ABOUT

There is a more acute version of this problem that deserves its own paragraph.

Security vulnerabilities in software tend to live in the gap between what the developer intended and what the code actually does. SQL injection, buffer overflows, authentication bypasses, SSRF — these vulnerabilities exist not because developers set out to write insecure code, but because the implementation diverged from the intent in a subtle way that only becomes visible from a certain angle.

AI-generated code has a particular relationship with this category of failure. Current language models have been trained on enormous amounts of code, including enormous amounts of code with security vulnerabilities. They reproduce patterns — including vulnerable patterns — with high fidelity. The code they produce is not systematically more or less secure than human-written code; the research on this is genuinely mixed. But when a developer ships AI-generated code without understanding it, they also ship without the ability to reason about its security properties. They cannot tell you, under adversarial questioning, why the authentication check is positioned where it is, what happens if the token validation fails silently, or what the attack surface of the API endpoint looks like.

That inability to reason about the code is fine until someone with adversarial intent starts asking exactly those questions — not in words, but in carefully crafted inputs.

WHO IS ACTUALLY DOING THIS

It is tempting to frame this as a junior developer problem — inexperienced people taking shortcuts they shouldn't be taking. That framing is wrong, or at least incomplete.

Vibe coding is happening at every level of the industry. Senior engineers do it when they're under pressure. Technical founders do it to ship MVPs. Non-technical founders do it with the explicit goal of not needing engineers at all. Data scientists do it to build infrastructure they were never trained to build. Product managers do it to prototype features they want to show in demos.

This is not a failure of individual discipline. It is the rational response to an incentive structure that rewards shipping over understanding. If the code works, you shipped. If you shipped, you were productive. If you were productive, you advance. The question of whether you can defend the implementation in a future postmortem is not yet on the scorecard — but it will be.

The non-technical founder case deserves particular attention because it represents something genuinely new. For the first time in the history of software, it is possible to build and ship functioning software products without anyone involved having a deep understanding of the software. The AI generates the code. The founder tests the happy path. The product ships. The VC writes a check.

This is not uniformly bad. It democratizes software creation in real ways, allows novel products to be built with smaller teams, and surfaces ideas that would previously have been bottlenecked by engineering capacity. But it also creates a new category of technical debt that doesn't look like technical debt from the outside — systems that function until they don't, built by people who have no framework for anticipating the conditions under which they'll stop functioning.

THE DEBT IS BEING WRITTEN RIGHT NOW

Technical debt is the gap between the system you have and the system you need. It accrues invisibly, paid down eventually in engineering time — usually at the worst possible moment, when the system is under stress and the team is already stretched.

The vibe coding debt being written in 2026 is of a specific and pernicious kind. It is not the debt of a rushed implementation that a competent engineer could refactor with a week of focused effort. It is the debt of an implementation that no one on the current team fully understands, built by a developer who has since left or moved on, in a codebase that has accumulated other AI-generated additions on top of the first one.

Refactoring code you don't understand is not refactoring. It is rewriting. And rewriting is expensive, risky, and humbling — it requires admitting that the system was more fragile than it appeared, and building it again from a position of greater understanding. Companies that have been moving fast on the back of vibe-coded systems will eventually hit this wall. The ones that hit it at scale — when the system is load-bearing, when customers depend on it, when it is entangled with other systems — will hit it hard.

THE REASONABLE RESPONSE

None of this is an argument against AI-assisted development. The productivity gains are real, the cost reductions are real, and the democratization of software creation is genuinely valuable. The argument is against the specific practice of shipping code you don't understand as if the understanding doesn't matter.

The reasonable response is not "understand every line before you ship it" — that standard was never realistic and is less realistic now. It is something more precise: understand the failure modes of what you're shipping. Know what happens when it breaks. Know where the load-bearing logic is. Know which parts were AI-generated and haven't been deeply reviewed. Flag them. Test them harder. Watch them more carefully in production.

The engineering teams that will do best in an AI-assisted world are not the ones that ship fastest. They're the ones that have developed judgment about which parts of their AI-generated code to trust and which parts to interrogate — and who maintain that judgment discipline even when the code looks fine and the tests are passing.

Karpathy's original vibe coding confession was charming because it was self-aware. He knew what he was trading. He understood the risks and chose to accept them for a specific category of low-stakes experimentation.

The problem is not the vibe. The problem is shipping the vibe into production without acknowledging what you traded to get there.

More signal, less noise. Delivered weekly.

The Token Review's deep-dive analysis, written for practitioners. No press-release rewrites. No AI-generated summaries of AI news.

Subscribe Free