
{"id":167588,"date":"2026-05-19T06:24:09","date_gmt":"2026-05-19T06:24:09","guid":{"rendered":"https:\/\/mycryptomania.com\/?p=167588"},"modified":"2026-05-19T06:24:09","modified_gmt":"2026-05-19T06:24:09","slug":"vibe-coding-vs-agentic-engineering-which-one-should-you-actually-use-in-2026","status":"publish","type":"post","link":"https:\/\/mycryptomania.com\/?p=167588","title":{"rendered":"Vibe Coding vs Agentic Engineering: Which One Should You Actually Use in 2026?"},"content":{"rendered":"<p>A year ago, you typed code. Today, you talk about\u00a0it.<\/p>\n<p>Somewhere between Andrej Karpathy\u2019s now-famous February 2025 tweet about \u201cvibe coding\u201d and the explosion of tools like Claude Code, Cursor, and Windsurf, the way developers build software changed. We stopped writing every line by hand and started having conversations with AI\u00a0instead.<\/p>\n<p>But here\u2019s where it gets messy. People started calling everything \u201cvibe coding,\u201d from a Saturday-night side project to the way Anthropic engineers ship production code. Karpathy himself came back in February 2026 to clean it up. He proposed a better name for the serious version: <strong>agentic engineering<\/strong>.<\/p>\n<p>So which one are you actually doing? And which one <em>should<\/em> you be\u00a0doing?<\/p>\n<p>This guide breaks down both, shows you what they look like in real code, walks through the security traps nobody warns you about, and helps you figure out where each approach actually fits. No buzzwords. No hype. Just the stuff you need to know before your next pull\u00a0request.<\/p>\n<h3>What Is Vibe\u00a0Coding?<\/h3>\n<p>Vibe coding is exactly what it sounds like. You describe what you want in plain English, the AI builds it, and you ship it without reading every\u00a0line.<\/p>\n<p>You\u2019re going with the flow. The AI is the engineer. You\u2019re the product manager who says \u201cmake the button blue\u201d and trusts the\u00a0result.<\/p>\n<p><strong>It looks something like\u00a0this:<\/strong><\/p>\n<p>You:<em> \u201cBuild me a to-do app where users can add tasks, mark them done, and filter by\u00a0status.\u201d<\/em>AI:<em> <\/em>Generates 200 lines of React\u00a0code.You:<em> \u201cCool, ship\u00a0it.\u201d<\/em><\/p>\n<p>That\u2019s vibe coding. No code review. No questions about architecture. No checking what dependencies got pulled in. Just\u00a0vibes.<\/p>\n<p>And honestly? It works great for a lot of things. Weekend hacks. Throwaway prototypes. That landing page you need by Friday. A tool only you will ever\u00a0use.<\/p>\n<p>The problem starts when \u201cship it\u201d means \u201cdeploy to a server with real users and real\u00a0data.\u201d<\/p>\n<h3>What Is Agentic Engineering?<\/h3>\n<p>Agentic engineering keeps the same AI tools but adds something vibe coding throws away: <strong>your judgment<\/strong>.<\/p>\n<p>You\u2019re still not typing every keystroke. You\u2019re directing AI agents that read your codebase, run tests, fix failures, and open pull requests. But you scope the work, you review the output, and you own the\u00a0result.<\/p>\n<p>Karpathy split the term into two halves on purpose. <em>Agentic<\/em> means agent-driven, you\u2019re orchestrating the work, not doing it. <em>Engineering<\/em> means there\u2019s still craft, judgment, and expertise involved. The agent is your collaborator, not your replacement.<\/p>\n<p>A typical agentic engineering session looks more\u00a0like:<\/p>\n<p>Write a clear specification (often in a file like AGENTS.md or CLAUDE.md)Ask the agent to plan before it\u00a0codesLet the agent implement and run the test\u00a0suiteReview the diff like you would any teammate\u2019s pull\u00a0requestIterate when something\u2019s off<\/p>\n<p>Less \u201cmake me an app.\u201d More \u201chere\u2019s the architecture, here are the constraints, here are the tests, now\u00a0go.\u201d<\/p>\n<h3>The Real Difference, In One\u00a0Sentence<\/h3>\n<p>Vibe coding optimizes for the <strong>speed of getting something working<\/strong>. Agentic engineering optimizes for <strong>confidence that what got built will keep\u00a0working<\/strong>.<\/p>\n<p>That\u2019s it. That\u2019s the whole framework.<\/p>\n<p>Speed matters when you\u2019re testing an idea. Confidence matters when other people depend on the thing you\u00a0built.<\/p>\n<h3>Real-Life Code\u00a0Examples<\/h3>\n<p>Let\u2019s get concrete. Here\u2019s the same task handled both ways, so you can see where the gap actually shows\u00a0up.<\/p>\n<p><strong>The task:<\/strong> Build an API endpoint that lets users update their email\u00a0address.<\/p>\n<h3>Vibe Coding\u00a0Approach<\/h3>\n<p>You\u2019d type something like: <em>\u201cAdd an endpoint to update a user\u2019s\u00a0email.\u201d<\/em><\/p>\n<p>The AI gives you\u00a0this:<\/p>\n<p>app.post(&#8216;\/update-email&#8217;, async (req, res) =&gt; {<br \/>  const { userId, newEmail } = req.body;<br \/>await db.users.update({<br \/>    where: { id: userId },<br \/>    data: { email: newEmail }<br \/>  });<br \/>  res.json({ success: true });<br \/>});<\/p>\n<p>It runs. Postman returns a 200. You move\u00a0on.<\/p>\n<p>But look at what\u2019s missing. Anyone who knows a userId can change anyone&#8217;s email. There&#8217;s no authentication check. No validation that the email is actually an email. No rate limiting. No verification email. The user could enter &#8220;haha not an email&#8221; and it would\u00a0save.<\/p>\n<p>This is the vibe coding trap. The code <em>works<\/em> in the narrow sense that it doesn\u2019t crash. It\u2019s also a security incident waiting to\u00a0happen.<\/p>\n<h3>Agentic Engineering Approach<\/h3>\n<p>You write a spec first. Something like:<\/p>\n<p># Task: Email Update Endpoint<\/p>\n<p>## Requirements<br \/>&#8211; Authenticated users can update their own email only<br \/>&#8211; New email must be validated (RFC 5322)<br \/>&#8211; Send a verification email to the new address before committing<br \/>&#8211; Old email should remain active until verification<br \/>&#8211; Rate limit: 3 attempts per hour per user<br \/>&#8211; Audit log entry for the change<br \/>## Tests Required<br \/>&#8211; Unauthorized requests rejected with 401<br \/>&#8211; Cross-user updates rejected with 403<br \/>&#8211; Invalid email format rejected with 400<br \/>&#8211; Rate limit returns 429 after 3 attempts<\/p>\n<p>You hand this to the agent. It plans, implements, runs the tests, and produces something more\u00a0like:<\/p>\n<p>import rateLimit from &#8216;express-rate-limit&#8217;;<br \/>import { z } from &#8216;zod&#8217;;<br \/>import { requireAuth } from &#8216;.\/middleware\/auth.js&#8217;;<br \/>import { sendVerificationEmail } from &#8216;.\/services\/email.js&#8217;;<br \/>import { auditLog } from &#8216;.\/services\/audit.js&#8217;;<\/p>\n<p>const emailSchema = z.object({<br \/>  newEmail: z.string().email()<br \/>});<br \/>const limiter = rateLimit({<br \/>  windowMs: 60 * 60 * 1000,<br \/>  max: 3,<br \/>  message: &#8216;Too many email change attempts&#8217;<br \/>});<br \/>app.post(&#8216;\/update-email&#8217;, requireAuth, limiter, async (req, res) =&gt; {<br \/>  const result = emailSchema.safeParse(req.body);<br \/>  if (!result.success) {<br \/>    return res.status(400).json({ error: &#8216;Invalid email format&#8217; });<br \/>  }<br \/>  const { newEmail } = result.data;<br \/>  const userId = req.user.id; \/\/ from auth middleware, not request body<br \/>  const token = await createVerificationToken(userId, newEmail);<br \/>  await sendVerificationEmail(newEmail, token);<br \/>  await auditLog.record({ userId, action: &#8217;email_change_requested&#8217;, newEmail });<br \/>  res.json({<br \/>    message: &#8216;Verification email sent. Please confirm to complete the change.&#8217;<br \/>  });<br \/>});<\/p>\n<p>Same feature. Roughly the same effort on your end. Massively different outcome.<\/p>\n<p>The agent did the typing. You did the thinking about what \u201cupdate an email\u201d actually means in a system real humans\u00a0use.<\/p>\n<h3>When Vibe Coding Is Actually the Right\u00a0Call<\/h3>\n<p>Vibe coding gets dunked on a lot, but it has a real place. Use it\u00a0when:<\/p>\n<p><strong>You\u2019re prototyping an idea.<\/strong> Speed matters more than polish. You\u2019ll throw the code away\u00a0anyway.<strong>It\u2019s a personal tool.<\/strong> A script that organizes your photos doesn\u2019t need an audit\u00a0log.<strong>The blast radius is tiny.<\/strong> No real users, no real data, no integrations with anything that\u00a0matters.<strong>You\u2019re learning.<\/strong> Sometimes you just need to see code working to understand how something fits together.<strong>It\u2019s a one-off.<\/strong> A migration script, a data cleanup, a quick analysis.<\/p>\n<p>Vibe coding is a hammer. Useful, but not for every\u00a0problem.<\/p>\n<h3>When Agentic Engineering Is the Right\u00a0Call<\/h3>\n<p>Pretty much everything else. Specifically:<\/p>\n<p><strong>Production systems.<\/strong> Anything users depend\u00a0on.<strong>Anything touching money, identity, or health data.<\/strong> Mistakes here aren\u2019t bugs, they\u2019re incidents.<strong>Multi-developer codebases.<\/strong> Consistency matters when other humans have to read what got\u00a0built.<strong>Long-lived projects.<\/strong> Code you\u2019ll maintain for years deserves the upfront\u00a0thought.<strong>Anything regulated.<\/strong> Healthcare, finance, government, education. Auditors don\u2019t care that \u201cthe AI did\u00a0it.\u201d<\/p>\n<p>The deeper truth: most professional code falls into the agentic engineering bucket. Vibe coding is the exception, not the\u00a0default.<\/p>\n<h3>Security: The Part Everyone Glosses\u00a0Over<\/h3>\n<p>This is where vibe coding goes from risky to genuinely dangerous, and it\u2019s the section most blog posts hand-wave through. Let\u2019s\u00a0not.<\/p>\n<h3>The Numbers<\/h3>\n<p>Recent research isn\u2019t kind to AI-generated code. Studies have found that around <strong>45% of AI-generated code contains classic vulnerabilities<\/strong> from the OWASP Top 10, and that figure has barely budged in two years. Roughly <strong>20% of vibe-coded apps ship with serious vulnerabilities or misconfigurations<\/strong> baked\u00a0in.<\/p>\n<p>Researchers at Georgia Tech\u2019s School of Cybersecurity built a scanner that hunts for AI-introduced vulnerabilities in public security advisories. They\u2019ve already confirmed dozens of cases, with critical and high-risk severity\u00a0ratings.<\/p>\n<p>This isn\u2019t a future problem. It\u2019s already happening.<\/p>\n<h3>What Actually Goes\u00a0Wrong<\/h3>\n<p>Here are the security failures that show up over and over in vibe-coded apps:<\/p>\n<p><strong>Hardcoded secrets.<\/strong> API keys, database passwords, and tokens end up directly in the source code. The AI doesn\u2019t know what\u2019s a secret, so it just leaves placeholders that developers forget to\u00a0remove.<\/p>\n<p><strong>Authentication that gets quietly weakened.<\/strong> During iterative prompting (\u201cmake it work without the login for now\u201d), auth checks get removed and never put back. Endpoints stay\u00a0exposed.<\/p>\n<p><strong>SQL injection and similar attacks.<\/strong> AI-generated code often concatenates user input directly into queries instead of using parameterized statements. It compiles. It runs. It\u2019s also wide\u00a0open.<\/p>\n<p><strong>Slopsquatting.<\/strong> This one\u2019s wild. AI sometimes hallucinates package names that don\u2019t exist. Attackers register those exact names with malicious code inside, knowing the AI will keep suggesting them. Your app installs malware on npm\u00a0install.<\/p>\n<p><strong>Authorization holes.<\/strong> The AI builds the happy path. It rarely checks \u201cshould this user be allowed to do this?\u201d The endpoint above (where you can change anyone\u2019s email by passing their userId) is a textbook\u00a0example.<\/p>\n<p><strong>Dependency bloat.<\/strong> AI pulls in whatever library makes the code work fastest. You end up with hundreds of transitive dependencies you\u2019ve never reviewed, each one a potential entry\u00a0point.<\/p>\n<h3>What Actually\u00a0Helps<\/h3>\n<p>Security in AI-assisted development isn\u2019t about banning the tools. It\u2019s about building habits that catch what AI\u00a0misses:<\/p>\n<p><strong>Run AI-generated code through static analysis.<\/strong> Tools like Semgrep, Snyk, or your existing SAST scanner. Treat AI output the same way you\u2019d treat code from a junior contractor: assume nothing, verify everything.<\/p>\n<p><strong>Use prompt-level guardrails.<\/strong> Add security requirements to your spec files. Things like \u201call endpoints require authentication,\u201d \u201call user input must be validated with a schema,\u201d \u201cnever log secrets.\u201d Modern coding agents respect these when they\u2019re in CLAUDE.md or AGENTS.md.<\/p>\n<p><strong>Pin dependencies and review what gets installed.<\/strong> Don\u2019t let the agent freely add packages. Require approval for new dependencies, even if it slows you\u00a0down.<\/p>\n<p><strong>Test the running app, not just the code.<\/strong> Dynamic Application Security Testing (DAST) tools probe your actual deployed app for vulnerabilities. They catch the stuff that looks fine in code but is exploitable at\u00a0runtime.<\/p>\n<p><strong>Keep humans in the review loop.<\/strong> Especially for anything touching authentication, payments, or personal data. The agent can implement; a human still needs to\u00a0approve.<\/p>\n<p>The bottom line: AI doesn\u2019t know your threat model. You do. Don\u2019t outsource that\u00a0part.<\/p>\n<h3>How to Make the Switch (If You Need\u00a0To)<\/h3>\n<p>If you\u2019ve been vibe coding and want to level up to agentic engineering, you don\u2019t have to overhaul everything tomorrow. A reasonable path:<\/p>\n<p><strong>Start writing specs.<\/strong> Even a paragraph helps. Tell the agent what you want, the constraints, and how you\u2019ll know it\u00a0worked.<strong>Add an AGENTS.md or CLAUDE.md to your repo.<\/strong> Describe your stack, your conventions, your security requirements. Every agent that touches the repo will read\u00a0it.<strong>Make tests non-optional.<\/strong> If the agent can\u2019t write a passing test for the change, the change isn\u2019t\u00a0done.<strong>Review the diff before merging.<\/strong> Even a five-minute scan catches a\u00a0lot.<strong>Run a security scan in CI.<\/strong> Set it up once, benefit\u00a0forever.<\/p>\n<p>You\u2019ll move slower for a week. You\u2019ll move faster for the rest of the\u00a0project.<\/p>\n<h3>Conclusion<\/h3>\n<p>Vibe coding and agentic engineering aren\u2019t enemies. They\u2019re tools for different jobs.<\/p>\n<p>If you\u2019re sketching, exploring, or building something that nobody but you will ever use, vibe coding is fine. Have fun. Move\u00a0fast.<\/p>\n<p>If you\u2019re shipping software that other people will run, depend on, or trust with their data, agentic engineering is the bar. The AI still does most of the typing. You still do the engineering.<\/p>\n<p>The shift happening in 2026 isn\u2019t really about AI replacing developers. It\u2019s about what \u201cbeing a developer\u201d means now. Less time writing for-loops, more time writing specs. Less time debugging syntax errors, more time reviewing pull requests from agents. Less typing, more thinking.<\/p>\n<p>Pick the right approach for the work in front of you. And whatever you do, please run a security scan before you\u00a0deploy.<\/p>\n<h3>Quick Reference<\/h3>\n<p><em>Found this useful? The agentic engineering field is moving fast; what\u2019s true today might shift in three months. Bookmark this and check back, or experiment with both approaches on your next side project to feel the difference firsthand.<\/em><\/p>\n<p><a href=\"https:\/\/medium.com\/coinmonks\/vibe-coding-vs-agentic-engineering-which-one-should-you-actually-use-in-2026-6cafa7676d72\">Vibe Coding vs Agentic Engineering: Which One Should You Actually Use in 2026?<\/a> was originally published in <a href=\"https:\/\/medium.com\/coinmonks\">Coinmonks<\/a> on Medium, where people are continuing the conversation by highlighting and responding to this story.<\/p>","protected":false},"excerpt":{"rendered":"<p>A year ago, you typed code. Today, you talk about\u00a0it. Somewhere between Andrej Karpathy\u2019s now-famous February 2025 tweet about \u201cvibe coding\u201d and the explosion of tools like Claude Code, Cursor, and Windsurf, the way developers build software changed. We stopped writing every line by hand and started having conversations with AI\u00a0instead. But here\u2019s where it [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":167589,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-167588","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-interesting"],"_links":{"self":[{"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/posts\/167588"}],"collection":[{"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=167588"}],"version-history":[{"count":0,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/posts\/167588\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=\/wp\/v2\/media\/167589"}],"wp:attachment":[{"href":"https:\/\/mycryptomania.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=167588"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=167588"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mycryptomania.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=167588"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}