News

Agentic Engineering vs Vibe Coding

NewsNextwaves Team
37 मिनिट वाचन
Agentic Engineering vs Vibe Coding

Two ways to build with AI

There is a quiet argument running through every team that builds with AI right now, and it usually shows up as a feeling rather than a debate. One person ships a working app in an afternoon by describing what they want and accepting whatever the model produces. Another insists on reading every line, writing tests, and understanding how the thing actually works. Both are using the same tools. They are just playing very different games.

These two games have names now. The fast, loose, describe-and-accept style is called vibe coding. The careful, systematic style of building reliable systems around a model is closer to what people mean by agentic engineering. It is tempting to treat this as a fight, with one side standing for speed and the other for rigor, and to pick a team. That framing misses the point. They are not rivals. They are different tools for different moments, and the real skill is knowing which one you are holding.

The confusion is worth clearing up, because the stakes are rising fast. More and more software is being written with heavy help from models, and the habits people form now will decide whether that software is something we can build on or a pile of code nobody understands. Get the distinction right and AI makes you faster at everything, the throwaway experiments and the serious systems alike. Get it wrong and you either crawl through prototypes that never deserved the care, or you ship production systems held together by guesses.

This piece works through the whole thing: what each mode actually is, why vibe coding is so seductive, where each one earns its place, how to tell them apart in the moment, and how to use both without lying to yourself about which one a given task is asking for. Along the way there is a comparison table, a quick decision check, a few real scenarios, and two checklists you can keep.

What vibe coding is

The term vibe coding comes from Andrej Karpathy, who described a new way of working where you lean all the way into the model, talk to it in plain language, accept its suggestions without sweating the details, and more or less forget that the code exists. You are not reading the diff. You are riding the vibe.

It helps to picture what a session actually looks like. You open a chat or an agent, you describe the thing you want, and code appears. You run it. Something is off, so you paste the error back and ask for a fix, and new code appears. You do not read it closely, maybe not at all. You run it again. It works, or it works enough, and you move on to the next feature and do the same thing. The loop is fast and almost conversational, and at no point do you stop to build a mental model of how any of it fits together. The model holds that, or rather, nobody holds it.

Anyone who has done this knows why it caught on. It is genuinely delightful. You move at the speed of thought, the friction between an idea and a running prototype almost disappears, and you can build things you would never have had the patience to build by hand. A person who could barely write a script can now stand up a working web app. An experienced engineer can explore five approaches in the time it used to take to set up one. For a weekend project, a quick experiment, or a tool only you will ever touch, it can feel like a superpower, and it more or less is.

The defining feature is not the speed though. It is the surrender. In vibe coding you hand over not just the typing but the understanding. You trust that the code works because it seems to work, and you do not particularly care how. That trade is exactly what makes it fast, and it is also exactly where the trouble begins. Hold on to that word, surrender, because almost everything good and bad about vibe coding follows from it.

Why it feels so good

Before getting to where vibe coding goes wrong, it is worth taking seriously why so many capable people fall into it, because the pull is real and pretending otherwise is useless.

The first reason is simply speed, and speed is intoxicating. There is a particular joy in describing something and watching it exist a moment later, and it scratches the same itch that made the work fun in the first place. Writing code by hand has always had long stretches of friction: boilerplate, configuration, looking up an interface you have used a hundred times. Vibe coding collapses that friction to almost nothing, and the absence of friction feels like flying.

The second reason is the feedback loop. Each small request produces a visible result quickly, and fast visible results are about the most reinforcing thing a brain can get. It is the same loop that makes games and feeds compulsive. You ask, you receive, you ask again, and an hour disappears. The loop is so satisfying that stopping to read the code feels like an interruption, like pausing a good run to check your form.

The third reason is the demo. Most of the pressure in software is to show progress, and a vibe coded prototype shows progress beautifully. It looks done. It clicks and responds and impresses people in a meeting. The gap between looking done and being done is invisible from the outside, and invisible problems do not generate urgency. So the incentives quietly reward the thing that looks finished over the thing that is sound, and teams drift toward vibe coding without ever deciding to.

None of this is a character flaw. It is a rational response to real incentives and a genuinely better experience. The point of naming it is not to feel superior to it. It is to notice the pull so you can decide when to resist it, instead of being carried along by a feeling you never examined.

What agentic engineering is

Agentic engineering is the other posture. It also leans heavily on AI, often more heavily than vibe coding does, because it puts the model inside real systems that take actions on their own. The difference is not how much AI you use. It is how much you stay in control of what the AI produces.

An engineer treats model output the way a careful reviewer treats a confident junior's pull request. The work might be excellent, but it is a draft to be checked, not a truth to be accepted. In practice that becomes a handful of concrete habits. There are tests, so that the behavior you care about is pinned down and a future change cannot quietly break it. There is a way to see what the system did and why, so that when something goes wrong you can trace it instead of guessing. There are limits on what the system can touch, and clear points where a human signs off before anything expensive or irreversible happens. And when the work involves an autonomous agent, there are evals, repeatable tests of whether the whole thing actually does its job across the cases that matter, because an agent that works once in a demo tells you almost nothing about whether it works.

Above all there is understanding. Someone knows how the thing works and can fix it when it breaks, can reason about its edges, can explain to a colleague why it is built the way it is. Understanding is treated as a deliverable in its own right, as much a part of the work as the running code, because a system nobody understands is a system that is already failing. It just has not noticed yet.

If vibe coding is about giving in to the vibe, engineering is about refusing to. It keeps the one habit vibe coding throws away, which is the habit of verifying and understanding before trusting. That single habit is the whole difference, and it is worth looking at directly.

It is a spectrum, not a binary

Before going further, it helps to drop the idea that there are only two options. Vibe coding and full engineering are the ends of a range, and most actual work lives somewhere along it.

Vibe coding AI-assisted Spec-driven Engineering accept output review every diff test to a spec evals and guardrails ← faster, looser safer, more durable →
A dial, not a switch. From left to right you trade raw speed for control, understanding, and durability. The skill is moving the dial on purpose, not leaving it wherever habit set it.

At the far left is pure vibe coding: you accept what the model gives you and never read it. A step in from there is what most people actually do most of the time, AI-assisted coding, where the model writes and you review the diff before accepting it, the way you would review a colleague's work. Further along is something more disciplined, a spec-driven style where you write down clearly what the code must do, let the model implement it, and then check the implementation against the spec with tests. At the far right is full agentic engineering, where the model is woven into a system with evals, observability, and guardrails, and the whole thing is treated as production software that happens to have been written with heavy AI help.

As you move from left to right you trade raw speed for control, understanding, and durability. None of these points is the right answer in general. The mistake people make is not picking the wrong point. It is not realizing there is a dial at all, and leaving it stuck wherever habit or mood happened to set it. A good builder moves the dial on purpose, sliding left to explore and right to harden, and the rest of this piece is really about learning to feel where the dial should be.

The core difference: verification and understanding

Wherever you sit on that range, the thing that changes as you slide along it is one specific step. Put pure vibe coding and real engineering side by side and the contrast is almost embarrassingly simple. Both start by describing what you want and letting the model generate code. Then their paths split. Vibe coding goes straight from generated code to shipping it. Engineering inserts a step in between, the step where you read it, test it, and make sure you understand it before it goes anywhere.

Vibe coding Describe Generate Ship skips review Engineering Describe Generate Read, test, understand Ship
The one difference that matters. Both modes describe a goal and let the model generate code. Engineering keeps the step where you read, test, and understand it before shipping. Vibe coding skips straight to shipping.

That missing step is not a small omission. It is the step where bugs get caught, where security holes get noticed, where you learn what the code actually does rather than what you hoped it would do. It is also where understanding gets created, because reading and testing code is how a human comes to hold a model of it. Skip the step and you skip both the checking and the learning at once. Skipping it is what makes vibe coding fast, and keeping it is what makes engineering slow. Almost everything else in this piece follows from this one choice.

It is worth being honest that the step has a real cost. It is slower, it is less fun, and a lot of the time the generated code was fine and the review turns up nothing. That is precisely why people skip it. The question is never whether verification is annoying. It always is. The question is whether the thing you are building is one where a missed bug is a shrug or a disaster, and that question has different answers on different days.

At a glance

Before the deeper dive, here is the whole contrast on one screen. Read it as a summary, not a verdict. Neither column is the good one. Each is the right one in the right place.

Optimizes forSpeed and explorationReliability over time
The core moveAccept the outputVerify and understand it first
Best forPrototypes, throwaways, personal toolsProduction and anything others depend on
SpeedVery fast up frontSlower up front, steadier later
Who understands itOften no oneA person, on purpose
The hidden costCode you cannot safely changeTime spent verifying
When it hurtsWhen the stakes rise and it does not stopRarely, mostly when applied to throwaways
Typical failureSilent bugs, security holes, dead-weight codeOver-engineering things that did not need it

The rest of the piece is mostly an unpacking of this table: why each row is true, what it costs to get the choice wrong, and how to make the right call without thinking too hard about it every time.

Where vibe coding shines

It would be a mistake to read all this as vibe coding being the lazy option and engineering being the responsible one. Plenty of the time, vibe coding is simply the correct call, and reaching for full engineering rigor would be a waste of everyone's time.

When you are exploring, vibe coding is unmatched. Most ideas are wrong, and the fastest way to find out is to build a rough version and look at it. Spending a day writing tests for a prototype you will throw away tomorrow is not discipline, it is procrastination dressed up as virtue. The same logic covers a whole category of work: personal tools, one-off scripts, internal hacks, learning exercises, and anything where you are the only person who will ever be affected if it breaks. If the worst case of a bug is that you personally are mildly inconvenienced for ten minutes, the cost of careful engineering is simply not worth paying.

There is also a subtler value, one that even disciplined engineers should respect. Vibe coding is often the best way to find the shape of a solution. You do not always know what you are building until you have built a draft of it, and a model that lets you generate three rough versions in an hour teaches you more about the real problem than a day of careful design on paper. The first version is a question, not an answer. You build it to learn what you actually need, and then, if the thing deserves to live, you build it properly with everything you just learned. Used this way, vibe coding is not the opposite of good engineering. It is the reconnaissance that good engineering depends on, and skipping it can be its own kind of waste, the waste of carefully building the wrong thing.

There is even a place for it inside serious codebases, in the small. A throwaway script to check a hypothesis about your data, a quick visualization to understand a bug, a scratch implementation to feel out an interface before committing to it. These are vibe coding inside an engineered project, and they are fine precisely because they are scoped to not matter. The danger is never vibe coding. It is vibe coding something that turned out to matter without ever noticing that it had.

Where it breaks

The trouble starts when the stakes quietly rise and the vibe coding does not stop. A prototype gets shown to a customer, then to a few more, and one day it is the product, still held together by code nobody has ever read. The mode that was perfect for the experiment is now running something real, and the bill for the skipped step comes due all at once.

The bill arrives in several forms, and it helps to see them separately rather than as one vague sense of dread.

The first is the bugs you never looked for. Skipping review does not make defects go away, it just delays meeting them until they show up in front of a user instead of in front of you. The model is good but not perfect, and the failures it produces are often the quiet kind: the off-by-one, the unhandled edge case, the assumption that holds in your one test and breaks on real data. You did not catch them because catching them was the step you skipped.

The second is security. A model will cheerfully write code with an injection hole, a leaked secret, a missing authorization check, or an unsafe default, and it will do so while looking completely confident and ordinary. Security problems are exactly the kind that stay invisible until they are exploited, which means vibe coding, where invisible problems sail straight through, is almost designed to let them in. For anything exposed to the internet or handling other people's data, this alone is often enough to take vibe coding off the table.

The third is the debugging wall. The day the vibe coded system breaks in a way that is not obvious, you sit down to fix it and discover that you cannot, because you never understood how it worked. There is no mental model to fall back on, only a wall of generated code you are now reading for the first time under pressure, while it is on fire. The speed you gained up front is repaid with interest at the worst possible moment.

The fourth is the maintenance tax. Software is never finished. It needs changes, and every change to code you do not understand is a gamble, because you cannot predict what it will affect. Fear creeps in. People stop wanting to touch the fragile parts, work routes around them, and the system slowly calcifies into something that technically runs but can no longer be changed, which for living software is a slow death.

The fifth is the bus factor. When the model wrote it and forgot it, and the one person who shipped it never really learned it, the understanding of the system lives nowhere at all. A new teammate cannot be brought up to speed on knowledge that does not exist. The original author, six months later, is effectively a stranger to their own code. The organization now owns a system that no human comprehends, which is a strange and dangerous thing to depend on.

Underneath all of these is the same root. Vibe coding produces software you do not understand, and code you do not understand is code you cannot safely change, cannot confidently secure, and cannot fix when it fails. None of it was a problem while the thing was a toy, and all of it becomes a problem the instant other people depend on it. That is not a codebase, it is a liability with a nice user interface. The vibes were never the problem. The problem was riding them past the point where the cost of being wrong became real.

Why the damage compounds

It would be easier to manage if these costs stayed small and local. They do not. The defining feature of skipped understanding is that it compounds, and compounding is why the situation can go from fine to unrecoverable without an obvious moment in between.

Think of it as debt, because it behaves exactly like debt. Each time you accept code you do not understand, you borrow a little speed today against a payment later. A single small loan is harmless. The problem is that the loans accumulate, and worse, they accumulate on top of one another. New vibe coded features get built on top of old vibe coded features that nobody understood either, so the misunderstanding does not just add up, it multiplies. You end up reasoning about a system whose every layer is a guess resting on another guess.

Understanding decays on its own too, even for code you once knew. Memory of how something worked fades over weeks, and in a vibe coded system there was never much understanding to begin with, so it decays to nothing fast. The window in which you could have cheaply learned the code closes quietly, and once it closes, learning the code means reverse engineering it from scratch, which can cost more than rewriting it would have.

The cruelest part is the shape of the cost curve. Early on, when the system is small and changes are easy, vibe coding feels almost free, and the feeling is honest, the cost really is low right then. But the cost of an unknown system rises steeply as it grows and as more comes to depend on it, so by the time the pain is obvious, you are already deep in the expensive region, holding a large system you do not understand and cannot easily afford to fix or replace. The decision that hurt you was made cheaply, months ago, back when stopping would have been easy and nothing yet forced your hand. That is exactly why the discipline has to come before the pain. By the time the pain arrives, the cheap moment to act has already passed.

Choosing the mode

So the useful question is not which approach is better. It is which one this particular piece of work calls for, and that turns out to depend on two things: how long the thing has to live, and how much it costs when it breaks.

Slow down even for a one-off Engineer it properly Vibe code it. Go fast. Vibe first, then harden what lasts Disposable Durable High stakes Low stakes
Match the mode to the work. The axes are how long the thing must live and what a failure costs. Vibe freely in the disposable, low stakes corner. Engineer properly in the durable, high stakes one. The edges need judgment.

Down in the corner where something is disposable and low stakes, vibe code it without guilt and move on. The care would be wasted and the speed is the whole point. Up in the corner where it is durable and the cost of failure is real, engineer it properly, and accept the slowness as the price of something you can trust. Those two corners are easy. The interesting cases are the edges. A throwaway script that touches production data is short-lived but high-stakes, and deserves care it would not otherwise need, because short-lived does not mean harmless when the blast radius is large. A long-lived tool that only you use sits in the other awkward spot, durable but low-stakes, and can be happily vibed into existence and then tidied only in the specific places where its roughness actually starts to cost you something.

Two failure patterns show up again and again, and they are mirror images of each other. One is vibe coding straight into production, where the speed that felt like a gift early turns into a system nobody can maintain later. The other is over-engineering a weekend prototype, where rigor that belongs in production strangles an experiment that should have stayed light and fast. Both come from the same root error, which is applying a mode out of habit instead of choosing it on purpose. The careful engineer who writes exhaustive tests for a throwaway is making the same kind of mistake as the vibe coder who ships unread code to production. They have both let their default override the actual stakes in front of them. The whole skill is in pausing long enough to notice which corner you are really in, and then matching the mode to the corner rather than to your temperament.

A two-minute check before you start

The quadrant is the idea. Here is the version you can actually run in your head before you open the editor. Five questions, a few seconds each, and your answers point to a mode.

  1. How long does this need to live? One use, a few weeks, or indefinitely?
  2. Who depends on it? Just you, your team, or customers and the public?
  3. What happens if it is wrong? A mild annoyance, some lost time or money, or real harm such as lost data, a security breach, or someone getting hurt?
  4. Does it touch anything dangerous? Authentication, payments, deletion, personal data, or anything in production?
  5. Will you need to change it later? Never, maybe, or constantly?

Reading the answers is simple. If your answers sit at the easy end across the board, short-lived, only you, harmless if wrong, touches nothing dangerous, then vibe it freely and do not feel bad about it. As your answers slide toward the hard end, slide your mode toward engineering to match, and you do not have to move the whole project, only the parts that earned it.

There is one override that beats the rest. If the work touches something dangerous, or other people will depend on it, treat those parts with care no matter how the other questions came out. A one-line script can be short-lived, personal, and unlikely to be changed, and still deserve a careful read if that one line deletes production data. When in doubt, the cost of being wrong is the question that decides, because it is the one the world is going to enforce whether you considered it or not.

What it looks like in practice

The abstractions land harder with real shapes attached. Three short scenarios, one for each way this tends to play out.

The prototype that quietly became the product. A founder vibe codes a working app over a weekend. Customers like it, more sign up, and nobody ever goes back to read the code, because why would you, it works. A year later a billing bug double-charges a batch of customers, and when the team sits down to fix it, no one understands the payment code the model wrote a year ago. The fix takes a tense week and costs real trust. The lesson is not that vibe coding caused the bug. It was right to vibe the first version. The mistake was never graduating it, and the bug was not bad luck, it was the predictable interest on a year of skipped understanding.

The one-off script that touched production. An engineer needs to clean up some bad rows in the live database. It is a single use, it will never run again, so the instinct is to vibe it and move on. But it touches production data, which means the blast radius is enormous even though the script is disposable. They generate it, run it without reading the part that selects rows, and it matches far more than intended because of an edge case they never saw. Real data is gone. The lesson is that short-lived and low-stakes are not the same thing. This belonged in the careful corner despite being a one-off, and reading the ten lines that did the deleting would have caught it in thirty seconds.

The graduation done right. A small team vibe codes a feature to test whether users even want it. They do. Instead of stacking three more features on the soft foundation, the team spends a single deliberate day: they read the core, write tests for the parts that matter, add logging so they can see what it does in production, and write down how it works so a new teammate can pick it up. It is slow and a little boring for that one day. Then the feature runs for two years without drama, gets extended without fear, and survives the original author moving on. The lesson is the arithmetic. The graduation cost a day and saved a year, and it is exactly the step teams skip, which is why skipping it is the most expensive habit in software.

The graduation problem

In practice, most real software does not start in one corner and stay there. It starts as vibes and graduates. You vibe code to explore, to find the shape of the thing, and to prove it is worth building at all. Then, for the parts that turn out to matter, you switch into engineering: you read what the model wrote, you understand it, you test it, and you make it something other people can depend on.

explore fast (vibe) build to last (engineer) Vibe prototype Find what matters Engineer the core Trusted system
The healthy path. Most software starts as vibes and graduates. Explore fast to find the shape, then engineer the parts that turn out to matter. The danger is never making the switch.

The graduation is the part teams get wrong, and they get it wrong in a very specific way. The danger is not vibe coding the prototype. That is the right way to start, and starting with heavy engineering would be the mistake we just discussed. The danger is never making the switch, letting the explore-fast code quietly become the production system without anyone ever stopping to harden it. The transition almost never announces itself. There is no moment where the prototype stands up and declares that it is now load-bearing. It just slowly becomes load-bearing while everyone is busy shipping the next feature, and one day it breaks and you discover, too late, that the foundation of something important was a draft written in an afternoon.

The reason this is so common is that the incentives all point the wrong way at the exact moment you should switch. The prototype works. It is making people happy. Stopping to rewrite or harden code that visibly functions feels like going backward, like spending effort to produce no new visible progress. So the choice that feels rational is always to keep adding features on the soft foundation, and that choice is correct right up until it is catastrophic.

Knowing when, and how, to graduate

The hard part of graduation is that no clock tells you when. So instead of a rule, keep two short lists: one for noticing the moment, and one for what to actually do when it arrives.

Signs the thing has crossed the line, whether you decided so or not:

  • Someone other than you now relies on it.
  • It touches real money, real data, or real users.
  • An outage would now cost something you can measure.
  • You have started to feel afraid to change it.
  • A new person could not understand it without you in the room.
  • It has quietly lived a lot longer than you ever expected it to.

If two or more of those are true, the thing has graduated already, and the only question is whether you treat it that way before or after the incident that forces you to.

What hardening actually means, roughly in order of return:

  • Read the whole thing once, slowly, until a human genuinely understands it.
  • Read the security-sensitive parts twice: anything touching auth, permissions, payments, personal data, or deletion.
  • Write tests for the behavior that matters, so a future change cannot silently break it.
  • Add logging or tracing, so you can see what it does in production instead of guessing.
  • Turn on the cheap automatic checks: types, a linter, and the compiler.
  • Write down how it works and why, so the understanding lives somewhere other than one person's memory.
  • Replace the parts that are too tangled to understand rather than patching around them.

You do not have to do all of it at once, and trying to can be its own form of over-engineering. Start with understanding and tests for the riskiest parts, the places where being wrong is expensive, and let the rest follow as the thing proves it deserves the investment.

How to vibe code without getting burned

All of this can make it sound like vibe coding is a trap to be avoided. It is not. It is a powerful tool that you can use far more safely with a few habits that cost almost nothing and preserve most of the speed. The goal is not to stop vibe coding. It is to vibe code in a way that does not quietly mortgage your future.

Keep the blast radius small. The single most protective habit is to make sure that when vibe coded code is wrong, the damage is contained. Run it where it cannot touch production data or real money, give it the narrowest permissions that let it do its job, and put real boundaries between the part you vibed and the parts you depend on. Most of the horror stories are not really about bad code. They are about bad code with too much access.

Treat it as disposable by default. Go in assuming the prototype will be thrown away, because most should be, and you will make different and healthier choices than if you secretly intend to keep it. The ones that earn their keep can graduate later, deliberately, through the door of actual engineering. What you want to avoid is the accidental keeper, the prototype that becomes permanent because nobody ever decided that it should.

Read the parts that bite. You do not have to read everything to avoid the worst outcomes. You have to read the parts where a mistake is expensive: anything touching authentication, permissions, payments, deletion, or user data. Skim the rest if you like, but slow down and actually understand the handful of places where the model's confident mistake would be a real problem. This is the eighty-twenty of safe vibe coding.

Add tests after the fact for anything you keep. The moment a vibe coded piece looks like it is going to stay, write tests for what it should do, even if you write them after the code. Tests are how you pin behavior down so you can change the code later without fear, and they are also how you find out whether you actually understand what the code does, because writing a real test for code you do not understand is surprisingly hard.

Lean on the cheap automatic checks. Type checkers, linters, and the compiler catch a whole class of the model's mistakes for free, without you reading a line. They are the closest thing there is to having your speed and your safety at once, and turning them on is one of the highest-return things you can do when working fast.

None of these turn vibe coding into engineering, and they are not meant to. They are guardrails that let you keep most of the speed while cutting off the tail of outcomes that turn a fun afternoon into a painful quarter. The spirit of all of them is the same: be fast where it is safe to be fast, and spend your small amount of care exactly where being wrong would actually hurt.

Doing the in-between modes well

Most real work does not live at either extreme. It lives in the two middle modes from the spectrum, AI-assisted and spec-driven, and both reward a little technique. Here is how to get more out of each.

Reviewing what the model writes, without it taking all day:

  • Read the diff like a reviewer, not a reader. Ask what could go wrong here, not just does this look reasonable.
  • Aim your attention at the risky parts. You do not have to scrutinize boilerplate as hard as the logic that touches data or money.
  • Be suspicious of confidence. The model's most dangerous output is not the code that looks wrong, it is the wrong code that looks completely normal.
  • Ask the model to explain its own code, then check the explanation against what the code actually does. The gaps are where bugs and your own misunderstandings hide.
  • Keep each change small enough that you can actually review it. A giant generated diff is one you will rubber-stamp, which is just vibe coding with extra steps.

Telling the model what you want, so it builds the right thing:

  • Say it precisely before you ask for code. The inputs, the outputs, the edge cases, the constraints. Vague requests get plausible code that is subtly wrong.
  • Give examples of correct behavior. A couple of concrete cases pin down your intent better than a paragraph of description.
  • State the non-obvious requirements out loud, the performance need, the security rule, the thing that must never happen. The model will not infer what you did not say.
  • Verify the result against what you asked for, ideally with tests, rather than trusting that it matched.
  • Treat the spec as the durable artifact. It outlives any single generation and lets you regenerate or refactor later without starting from a guess.

Both habits are really the same habit wearing two hats. Stay close enough to the work to keep your judgment in the loop, whether you are checking the output after or shaping it before. That closeness is the entire difference between using the model and being used by it.

The skill that is actually changing

Step back from the specific advice and there is a larger shift underneath all of this, one worth naming because it changes what it means to be good at building software.

For most of the history of the craft, the scarce and valuable skill was writing code, producing correct instructions in a formal language. That skill is quietly becoming abundant. The model can produce the instructions, often faster and sometimes better than a person. What does not become abundant, and in fact becomes more valuable, is everything around the writing: knowing what to build, judging whether what was built is any good, understanding how the pieces fit, and deciding what to trust.

This is why the engineer who reviews and directs is not being replaced by the model but amplified by it. The bottleneck moves from production to judgment. The questions that matter are no longer can you write this function, but should this exist, is this implementation sound, what will it do on the input you did not think of, and is this a place where a mistake is cheap or catastrophic. Those are questions of taste, system thinking, and verification, and they are exactly the questions vibe coding tempts you to skip.

There is a real risk hidden in this shift, especially for people learning the craft now. If you only ever vibe code, you never build the understanding that lets you judge the output, and judgment is precisely the skill that is becoming the whole job. You can end up able to produce working programs while being unable to tell a sound one from a fragile one, which is a weak place to stand when sound versus fragile is the entire game. The way through is not to refuse the tools. It is to use them while keeping yourself in the loop enough to keep learning, to read the code sometimes even when you could skip it, to ask the model why and not only what, so that the understanding the model has does not become understanding that exists nowhere in you.

The builders who thrive will be the ones who let the model do the writing and refuse to let it do the understanding. They will be fast because the tool is fast, and trustworthy because they never outsourced the part that was actually theirs to keep.

Will better models make this moot?

A fair objection runs through all of this. The models keep getting better. If they get good enough, does the whole distinction collapse, leaving vibe coding as simply the way everyone builds everything?

It is the right question, and the honest answer is that better models move the line without erasing it. As models improve, more things become safe to vibe code, because the output is more often correct and the tail of disasters gets thinner. The boundary in the quadrant slides outward, and work that needed careful engineering last year can be vibed this year. That is real, it will keep happening, and it is genuinely good.

But the distinction itself does not depend on how good the model is. It depends on the cost of being wrong, and that cost is set by the world, not by the model. No matter how capable the model becomes, there will be systems where a rare failure is catastrophic, where a person needs to be accountable for understanding what was deployed, where the question is not how likely is this to be right but can we live with the case where it is not. In those settings you will still want verification and understanding, not because you distrust the model's average, but because the average is not the thing that matters when the worst case is severe enough. A model that is right ninety nine percent of the time is wonderful and still not something you accept unread when the other one percent deletes a hospital's records.

There is also the matter of understanding itself, which does not become less necessary just because code becomes easier to produce. Someone has to be able to reason about a system, explain it, evolve it, and answer for it, and a perfect code generator does not supply that. It supplies code. The human responsibility to comprehend what one has built and shipped is not a limitation of current models that better models will lift. It is a property of taking responsibility at all.

So the line will keep moving, and the wise response is to keep moving with it, vibing the growing set of things that are now safe to vibe, and reserving real engineering for the shrinking but never empty set of things where being wrong is not survivable. What will not change is the need to know which set you are in.

The synthesis

The best builders right now are not the ones who have chosen a side. They are the ones who hold both modes and switch between them so naturally that they barely notice doing it. They vibe code the morning's experiment without a trace of guilt, and they engineer the afternoon's production change without a hint of cutting corners, and they do not confuse the two. The fluency is in the switching, not in loyalty to either.

What makes that fluency possible is dropping the moral framing entirely. Vibe coding is not reckless and engineering is not virtuous. They are a fast, loose tool and a slow, careful tool, and a builder who only owns one of them is limited in exactly the way a carpenter with only a hammer is limited. The mistake is never using one of them. The mistake is using the wrong one for the moment, and then defending the choice as if it were a principle rather than a habit you never examined.

In the end the dividing line was never vibe coding versus engineering. It was thoughtless versus deliberate. You can vibe code thoughtfully, knowing exactly why speed is the right call here, what you are choosing not to know, and where you have kept the blast radius small enough that not knowing is safe. You can also engineer thoughtlessly, piling on tests and process and ceremony that no one needs because rigor has become a reflex instead of a judgment. Neither the speed nor the rigor is the virtue. The judgment is.

So the thing worth getting good at is not vibe coding, and it is not engineering. It is the honest, unglamorous act of looking at the task in front of you and asking how long this has to live, who depends on it, and what it costs if it breaks, and then choosing your mode from the answer instead of from your mood. Do that consistently and the old argument simply dissolves. There was never a right side. There was only the right tool for the work, and the wisdom to tell which was which.

हा लेख सामायिक करा

हा लेख उपयुक्त होता का?

संबंधित लेख

RFID vs Barcode: You Are Probably Asking the Wrong Question

RFID vs Barcode: You Are Probably Asking the Wrong Question

Agentic Engineering: Building AI Systems That Act

Agentic Engineering: Building AI Systems That Act

Nextwaves Brings the Retail Kit RFID to Tokyo for the Vietnam - Japan Incubation Program 2026

Nextwaves Brings the Retail Kit RFID to Tokyo for the Vietnam - Japan Incubation Program 2026

RFID वापरण्यासाठी मला RFID प्रिंटर खरेदी करणे आवश्यक आहे का?

RFID वापरण्यासाठी मला RFID प्रिंटर खरेदी करणे आवश्यक आहे का?

ब्लॉगवर परत