Vibe coding has a ceiling, and it’s not the model
A weekend of VPS hardening, what experience actually buys, and why the gap between vibe coding and engineering isn’t closing on its own.
Three rough tiers of people use Claude to write software. The two ends are easy to describe. The middle is the part worth talking about.
At one end, people who use Claude like a search engine. They paste a question, copy an answer, move on. Useful in its way. Not what this post is about.
At the other end, experienced engineers who treat Claude as a thinking partner and an execution partner. They know what they’re trying to build, what the constraints are, and what counts as good. The model accelerates them. It doesn’t direct them.
In between, the vibe coders. Shipping faster than they ever have. Building real things, sometimes very well. The interesting question isn’t whether they’re “real engineers” or not. It’s where their ceiling is, and why it’s closer than they think.
The model is not the ceiling
A recent example. The VPS that runs my agents got a hardening pass last weekend. Nothing dramatic. SSH key auth, port 22 the only open port, unattended-upgrades enabled, fail2ban running, a separate user account for agent work, the API key in a mode 600 env file, permission scoping in the skill files so the agent can do its job and nothing else.
Claude wrote most of it. Cheerfully, fluently, in the right order. If I’d asked it to keep going, off-site backups, snapshot schedules with a stated RPO and RTO, a documented recovery runbook, replication for the state store, an audit of the cron jobs, key rotation on a schedule, it would have done all of that too. Beautifully. Probably better than I’d have written it from cold.
It didn’t volunteer any of it. It did exactly what I asked.
That’s the entire move. The skill wasn’t writing a fail2ban config. The skill was knowing fail2ban needed to exist. Knowing what RPO and RTO mean, and what numbers are acceptable for what you’re protecting. Knowing why “I have it on GitHub” isn’t a backup strategy. Knowing the difference between a snapshot and a backup, between replication and redundancy, between hardening and security theatre. That’s the question Claude can’t generate for you if you don’t know to ask.
What industry knowledge actually is
When people defend the value of experience right now, the language tends to drift. “Twenty years in the industry” doesn’t mean much by itself. Years served is not the asset.
The asset is pattern recognition. Failure modes you’ve seen, near-misses you remember, architectures that look elegant in the diagram and fall apart at 9am on a Monday. The asset is awareness of constraints that don’t appear anywhere in the code: compliance regimes, audit trails, cost ceilings, latency budgets, regulatory footprints, the human factors that emerge once a system has actual users.
These are the questions that shape every real architectural decision. None of them are visible in a code review. Claude will respect every one of them once you raise it. It won’t surface them on your behalf, because it doesn’t know your environment, your stakes, or your scars.
This isn’t a swipe at the model. It’s a swipe at the assumption that “the model is good enough” is the same thing as “I am good enough.”
A second case in point
The trading bot I run on the same VPS has been paper trading for months. The strategy isn’t complicated. The reason it’s still in paper is that the only way to find the edge cases in the plumbing is to wait for them to happen. An order fills at 3:47pm. The partial fills behave differently to what the API docs implied. The position state goes briefly inconsistent with the broker’s view. You learn something you couldn’t have asked Claude in advance because you didn’t yet know it was a question.
That’s industry knowledge in microcosm. Not “I’ve read the API docs.” More: “I’ve seen this kind of thing fail in shapes the docs don’t describe, and I know to wait for those shapes.”
Vibe coding, by contrast, tends to ship at the moment the demo works. Industry-grade thinking ships when the failure modes have been considered, instrumented, and bounded.
Where Claude does outperform experience
It would be lazy to leave this as a one-sided argument. Claude is genuinely better than I am at several things, and pretending otherwise would be silly.
Bash. Anything beyond a one-liner, with proper quoting, signal handling, and the awkward edge cases, takes me longer than it should. Claude writes it fluently first time. Bulk refactors across hundreds of files where the change is mechanical but the context is large. Recall of APIs I half-remember from a project I touched two years ago.
For these, Claude is a clear acceleration. The vibe coder isn’t wrong to lean on it heavily. The mistake is mistaking acceleration for direction.
What thinking partnership actually looks like
The most useful Claude exchanges I have aren’t of the form “write me X.” They’re of the form “here’s what I’m trying to do, here are my constraints, here’s a rough draft, what am I missing?” The model pushes back, surfaces options, points out something I’d half-noticed but not articulated.
The code is a byproduct. The real value is the conversation that tightens my own thinking before any code gets written. Faster output is the obvious win. The bigger win is that the architecture is sharper than it would have been if I’d simply sat down and started typing.
That’s what an experienced engineer does with the model. It augments organic thinking. It doesn’t replace it.
So what
Two practical takes.
For companies, the temptation to hire fewer engineers because Claude makes everyone faster is a trap. Speed without judgment ships brittle systems faster, not better systems. The right move is to hire experienced engineers and give them a force multiplier. The marginal value of judgment goes up in this environment, not down.
For junior engineers, the escape route isn’t competing on speed. You’ll lose. The route is investing hard in the things the model can’t generate from prompts: pattern recognition, failure modes, infrastructure thinking, the boring fundamentals. Senior is still senior. The path just runs faster now, and the gap between someone who has the questions and someone who doesn’t is suddenly very visible.
The ceiling
The ceiling on vibe coding isn’t the model getting smarter. The model is already very smart, and getting smarter quickly. The ceiling is the question you don’t know to ask. That bit is still on you.