Business logo
Coding
AI
Learning

How to Vibe Code Like a Senior Engineer

Isaiah Marc Sanchez
April 9, 2026
7 min read

Vibe coding lets almost anyone turn an idea into working software. Doing it well, rather than just quickly, still depends on the same judgment good engineers have always relied on.

The term "vibe coding" entered the vocabulary in early 2025, when Andrej Karpathy described the experience of building software by simply telling an AI what you want and going along with what it produces, trusting the vibes rather than reading every line yourself. It is a genuinely remarkable shift, and we say that as people who have been writing code since 2008, long before any of this was possible. The speed is real, and so is the leverage it gives a single person. But the same fluency that makes vibe coding feel effortless is also what makes it easy to produce a great deal of code that looks finished and is quietly wrong. The difference between someone who uses these tools to move fast and someone who generates a pile of slop has very little to do with which model they happen to be using. It comes down to judgment, and judgment is the thing a senior engineer brings to the keyboard whether or not an AI is sitting in the loop. What follows is less a set of tricks than a way of working, and most of it is about keeping your understanding intact while you move quickly.

Think with the model before you build with it

The first thing worth internalizing about these models is that they are confident in a way that does not always track with being right. Ask one how to structure a feature and it will hand you a clean, plausible answer almost immediately, delivered with the same assurance whether the approach is genuinely sound or whether it has quietly ignored a constraint that matters to you. This is not the model being deceptive. It is optimizing for a response that feels complete and helpful, which is not the same as the response that has actually weighed every tradeoff in your particular situation. A senior engineer reads that first answer as a proposal to interrogate, not a decision to start implementing.

So before any code gets written, it is worth having a real conceptual conversation with the agent, the kind you might have with a colleague standing at a whiteboard. Push on what it gives you. Ask what it is recommending and why, and how it intends to get there. Ask what alternatives it considered and what led it to set them aside. Ask it to compare two approaches honestly, and to argue against the one it seems to prefer. This back and forth matters because it teases the idea apart while the idea is still cheap to change. Once code exists, it develops a kind of gravity, and reworking an approach after a few hundred lines have been committed to it is far harder than reconsidering it in conversation. Left to its own momentum, a model will rarely stop to tell you that the foundation itself is the problem, so that scrutiny has to come from you.

Give the agent the context it cannot infer

These models do their best work when they understand the shape of what they are building, not only the task immediately in front of them, and the simplest way to give them that understanding is to plan the work before you start it. The most useful artifact for this is a PRD, short for product requirements document. A PRD is just a written description of what you are building, who it is for, why it exists, what it needs to do, and, just as importantly, what it will deliberately not do. You can draft one together with the agent, in a format as simple as markdown or XML, over the course of a short conversation, and then hold onto it.

Writing this down pays off in two ways that compound over time. In the moment, it keeps both you and the model anchored to a clear goal and an ordered set of steps, rather than drifting wherever the next prompt happens to lead. Over a longer stretch of work, it becomes foundational context you can carry from one conversation into the next, so a new session does not begin from nothing and you are not re-explaining the whole project every time you return to it. It works best when you treat it as a living document and revise it as your understanding of the problem changes, rather than freezing it the moment it is written.

The reason any of this matters becomes obvious the first time you skip it. Without a plan, you and the model end up chasing symptoms, and an agent that is trying hard to be helpful will tend to paper over each specific bug with another narrow conditional instead of stepping back to ask whether the design itself is wrong. It will also scatter explanatory comments throughout the code, attempting to transfer knowledge it has no other way of holding between turns. What you are left with is bloated, brittle code that technically runs and that nobody, including you, genuinely understands. Leaning on the model that heavily feels productive in the moment, but it tends to walk you down an indefinite rabbit hole and leave you with slop at the bottom of it, along with no real grasp of how any of it works.

Decide in advance what the agent must never do

If one habit matters more than the rest, it is setting guardrails, and setting them before you actually need them. Frontier models have become genuinely good at following directions, good enough that it is easy to forget they will still hallucinate and still take initiative you never asked for. A model will sometimes decide on its own that a step is unnecessary and quietly skip it, or conclude that something drastic is required and simply act on that conclusion. The cautionary stories here are not hypothetical. We have watched agents delete entire codebases, and in more than one widely shared incident, wipe a production database along with its backups, for no deeper reason than that nothing in front of them said it was off limits.

The protection is to state clearly, ahead of time, what the agent is never permitted to do, and to put that somewhere the agent treats as part of its own working identity. The convention that has emerged for this is a file called AGENTS.md, kept at the root of your project, which tells the agent how things are done here, what the conventions are, and where the hard boundaries sit. The most effective guardrails tend to be specific and prohibitive rather than vague and aspirational. Telling an agent never to run a destructive command without confirming first, never to touch production, never to delete migrations or backups, and always to ask before doing anything irreversible will do far more than a paragraph of general encouragement to be careful. None of this comes from distrusting the model. It comes from recognizing that a capable and eager collaborator does its best work inside a clear boundary, and that the boundary costs almost nothing to write compared to the price of the one time it would have saved you.

The discipline outlasts the tools

What is striking about all of this, once you have lived it for a while, is how little of it is actually new. Vibe coding rewards the same things good engineering has always rewarded: thinking a problem through before building, writing down what you genuinely intend, and knowing where the dangerous edges are so you do not wander off them in the dark. The tools have changed what a single person can build in an afternoon, and that is worth being excited about rather than precious over. What has not changed is that the understanding still has to live somewhere. The engineers who keep it close, instead of handing it wholesale to the model, are the ones who get the speed without inheriting the wreckage that so often comes with it.

A senior engineer uses AI-assisted development with structure and intent—combining planning, context, guardrails, and critical thinking to turn “vibe coding” into reliable software engineering.

 

Share this post