Every dev I know is shipping faster than ever. Nobody wants to talk about what the codebase looks like six weeks later.
We're in the golden age of AI-assisted development. You can go from idea to working feature in hours instead of days. Payment integrations, auth flows, CRUD scaffolding — LLMs eat that stuff for breakfast. But I keep noticing the same pattern. The fast part stays fast. The hard part gets harder.
The Speed Is Real
I'm not here to be a hater. AI-generated code has genuinely changed how quickly you can move through the boring stuff.
No more boilerplate code required and developers no longer have to write repetitive glue code. The payment integration that previously required a week to read the documentation? Developers are now saying they can deliver that in a tiny fraction of the time.
I know, right? I mean, you're not joking. This is awesome!
The Debt Is Also Real
This is when things start to look messy. LLMs are excellent at producing code that works. They're terrible at producing code that fits.
They handle boilerplate well but struggle with system design and abstractions. They don't understand your domain boundaries. They don't know why you split that service in two last quarter. They generate plausible-looking architecture that quietly fights against the grain of your system.
You deliver the feature. Tests pass. PM is satisfied. And somewhere in the guts of your codebase, you now have a chunk of code that nobody fully understands — including the person who prompted it into existence.
Vibe Debt Is Not Tech Debt
There is a term I recently heard that I feel really captures this: vibe debt.
Vibe debt is different from tech debt. Tech debt is a decision you make, a conscious trade-off: “I know I’m going to regret this shortcut, but it’s worth it because we’re going to overhaul this component soon.” Vibe debt is what happens when you ship code that you never quite had a handle on to begin with.
The distinction is important:
→ Tech debt: "We hardcoded this config because launch is Friday. We'll fix it next sprint."
→ Vibe debt: "The AI wrote this service layer and it works but I couldn't explain the design decisions if you asked me."
Vibe debt is invisible because every test passed and management happily ticked off Jira stories. You don't notice it until something breaks in a way that requires you to actually reason about the system. And suddenly you're staring at code that has no coherent design philosophy because it was generated piecemeal by a model optimizing for "make the test pass."
Accidental vs. Essential Complexity
This is the crux of the issue. Vibe coding selects hard for speed on accidental complexity — the stuff that's tedious but not intellectually difficult. Configuration files, API...
However, it actually undermines your capability to manage essential complexity — the real important things like domain modeling, state management across boundaries, and making decisions about what not to build.
LLMs can't do the work for you. And if all you do is prompt and not think, you lose the muscle for it. 🧠
I've seen teams move incredibly fast for two months and then hit a wall where every new feature takes longer than it would have without AI. Because the codebase has no coherent shape. It's a patchwork of locally correct, globally incoherent decisions.
What I Actually Think You Should Do
I'm not suggesting we abandon AI. That ship has sailed and honestly it would be dumb to stop.
Approach AI-generated code like you would a pull request from a junior developer. Take the time to read it. Challenge the architecture. Refactor it into your existing patterns before merging. The ten minutes you spend reshaping AI-generated code saves you days of confusion later.
Also, be honest with yourself about what you actually understand. If you can't explain why the code is written the way it is, you haven't shipped a feature. You've shipped a liability. 💀
So here's my question: have you already hit a vibe debt wall? Or are you still in the honeymoon phase where everything feels fast and free?
Top comments (0)