Vibe Coding: Is it a Fad or the Future of Coding?
Coined by Andrej Karpathy in early 2025, âvibe codingâ describes a hands-off, LLM-driven approach to software development where the programmer acts more like a product director than a traditional coder. Instead of writing detailed logic, developers guide AI with broad prompts, accept most of its output, and iterate based on resultsâprioritizing speed and experimentation over structure or precision. Proponents see it as democratizing coding and accelerating prototyping. Critics argue that itâs reckless, potentially insecure, and undermines engineering rigor. So is it a paradigm shift, or just another tech hype cycle?
Check out đĽđ¸ Fireshipâs humorous take on vibe coding.
âFireship has really taken that whole âduring a gold rush, sell shovelsâ concept to heart.â (credit to Dean Fletcher).
Vibe Coding Meaning
âVibe codingâ is an intriguing naturalâlanguage experiment in AIâdriven (software) development, but itâs far from a silver bullet. Hereâs how I see it:
1. Speed vs. Substance
- Pros: You can spin up prototypes astonishingly fast. Instead of wrestling with syntax or boilerplate, you hand off the grunt work to the LLM and pivot immediately when something doesnât fit your highâlevel or âbig-pictureâ vision.
- Cons: Youâre essentially trading deep understanding for velocity. When you donât know exactly how the code works, debugging and extending it become a game of guessworkâespecially when subtle business rules or edge cases crop up.
2. Lowering the Barrier, Raising the Risk
- Pros: Novices can build ârealâ, feeling-based apps without years of training in software engineering fundamentals, and it democratizes software creation.
- Cons: Security, performance, and maintainability often fall through the cracks. An AI will happily stitch together insecure patterns or inefficient queries unless you specifically call them out. Whoâs accountable when those vulnerabilities go live?
3. The Feedback Loop
- Pros: Iterative âtell me to improve thisâ cycles can refine UI behaviors, generate test scaffolding, or massage data transformations more fluidly than traditional pair programming.
- Cons: Without rigorous tests and reviews, you risk accumulating inferior âblackâboxâ and âbuggyâ code. Over time, the mental model of your system drifts further away from reality, making refactors a nightmare.
4. Skill Atrophy vs. Skill Growth
- Pros: By offloading repetitive chores, you focus on architecture, UX, and user flowsâskills that arguably matter more than memorizing every language idiosyncrasy.
- Cons: If youâre not careful, you stop learning the underlying abstractions. Next thing you know, you canât write a loop or trace an algorithm yourselfâyou just know how to âpromptâ the AI.
Bottom line: I share the ambivalence of many developers. Vibe coding can supercharge creative prototyping, but it shouldnât replace disciplined engineering. If you try it:
- Lock down tests and security audits Use coding paradigms like Test-Driven Development (TDD), and run âmicroâ, encapsulated feature tests, like in Behavior-Driven Development (BDD), before pushing code. By following this approach, developers can ensure that their code is reliable, stable, and functions as expected.
- Keep your own code checkpointsâunderstand every chunk, function, and code block before you ship.
- Use it as an accelerator, not a crutch: learn from what the AI suggests, rather than mindlessly accepting it.
Embrace the vibeâbut donât forget that your strongest asset is your own critical eye.
Skills Still Matter When Youâre Vibe Coding
I feel like itâs a tool that assists you, but you still need the underlying skill setâor at least basic knowledgeâto use LLM-generated code in a production or MVP setting. As the project increases in complexity and features, this becomes even more critical.
The more complex the needs, features, and codebase are, the more context you have to continually provide the LLM, unless you keep features very compartmentalized and isolated (which is where Docker and concepts like OOP come in), but if you donât really know how these underlying technologies work, or interact, the whole âhouse of cardsâ can easily come crashing down.
I liken it to sanding and other manual labor like body work. Sure, a powered tool may help speed up the process, but if you donât know how to properly apply pressure, hold the tool at the right angle, for the right amount of time, or donât know what grit sandpaper to use, then youâll end up causing damage. You need to understand the basics of sanding, with a piece of sandpaper in your hand, before you can graduate to using power tools.
Vibe coding is only as solid as the foundation you build under it:
-
Fundamentals First
- Just as you wouldnât pick up a pneumatic sander, before learning at least the basics of hand sanding, so you canât delegate architecture, dependency management, or state isolation to an LLM you barely understand.
- Without a mental model of Docker networking, OOP design, module boundaries, and data flow, your prompts become scattershot. You end up firefighting mysterious bugs instead of steering the ship.
-
Context Is Currency
- LLMs âforgetâ beyond their context window. As your MVP grows, you must reâsupply module APIs, type definitions, service contracts, environment variables⌠or watch the AI begin to âhallucinateâ broken code.
- Effective compartmentalization (via Docker, microâfrontends, clear interfaces) mitigates thatâbut only if youâve designed those boundaries yourself.
-
Tool, Not Replacement
- Think of AI as a âturbochargerâ for productivity, and not the driving âengineâ for it. You still need to know when to shift gears, how much fuel (tests, linting, CI) to feed it, and when to pull over and inspect under the hood.
- Use AI to scaffold boilerplate, generate tests, or propose refactorsâbut validate every line for security, performance, and maintainability.
-
Escalating Complexity
- Early prototypes thrive on âgive me CRUD for X.â But once you add feature flags, version migrations, multiâtenant auth, or realâtime updates, the safety net vanishes unless you, not the AI, own the design.
- Youâll hit diminishing returns the moment you canât mentally trace the call stack or data flow without retracing fifty AIâgenerated functions.
Takeaway: Vibe coding accelerates you up a gentle slopeâbut when the terrain gets rocky, you need climbing gear. Invest in core skills (architecture, testing, security reviews, modular design) first. Then let AI be your fastâmoving assistant, not your blindfolded âcoâpilotâ (no offense to Microsoft or Github đ¤).
Outdated Training or âKnowledge Gapâ in LLMs
Itâs a good idea to also keep in mind that LLMs often have outdated training models, and take a long time to âadjustâ to code deprecations (like Angular Universal now being called Angular SSR, âversion:â in Docker compose YAML files no longer being used, or writing good Zig code), or even just basic feature updates to languages and libraries that are well-documented. Youâre often left trying to get the LLM up to speed with recent changes. If youâre unaware yourself of the latest documentation, youâll be left scratching your headâwondering why the code doesnât run.
Iâve yet to see an LLM write Zig code that can compile and actually do more than a simple
"hello, world!"
app.
The âAchillesâ Heelâ of Vibe Coding
LLMsâ stale knowledge base is a real Achillesâ heel:
-
Training Cutoffs = Knowledge Gaps
- Most models are frozen on code and docs from months (or years) ago. Theyâll cheerfully spit out deprecated patternsâlike
version:
in Docker Composeâbecause thatâs what they âknowâ, and not whatâs best practice today. - You end up in a bind: youâre either constantly correcting the AI (âNo, use
Angular SSR
, not Universalâ) or debugging cryptic errors when it leans on obsolete APIs.
- Most models are frozen on code and docs from months (or years) ago. Theyâll cheerfully spit out deprecated patternsâlike
-
Onboarding the LLM vs. Onboarding Yourself
- If youâre unfamiliar with recent changes, your prompts lack the specificity to steer the LLM toward modern syntax. Youâll spend more time teaching the AI than writing or fixing code yourself.
- Worse, you canât tell when itâs hallucinating new âfeaturesâ, or sequences of operations, that donât exist.
-
Language-Specific Blind Spots
- Emerging or niche languagesâZig, Crystal, even newer Rust featuresâwill barely register in the model. Getting anything beyond boilerplate âHello, World!â is asking for trouble.
- For those ecosystems, your only recourse is manual reference to upâtoâdate docs or community forums.
-
Workarounds and Mitigations
- Retrieval-Augmented Prompts: Feed the LLM live docs or changelogs alongside your prompt so it has access to the latest specs.
- CI Gates & Linters: Automate checks for deprecated syntax, security issues, and style guide violations. Catch the AIâs misfires before they reach production.
- Pair with Human Review: Reserve the AI for scaffolding and brainstorming, but mandate that every snippet passes through a knowledgeable engineerâs hands.
Bottom line: AI feels magical until you hit the bleeding edge. Its usefulness plummets once you depend on the latest features or less-common languages. Treat the LLM as a convenience for wellâtrodden paths, not a truth oracleâand always keep the official docs and your own expertise front and center.
Vibe Coding Tools
Hereâs how people typically outfit a âvibe codingâ workflowâwith tools that lean into conversational, iterative code generation and help you manage context as your project grows:
-
Chatâbased AI Assistants
- GitHub Copilot Chat (in VSâŻCode or JetBrains): fullâblown chat UI on your codebase, can answer questions, generate functions, refactor, and even propose tests.
- ChatGPT (with Code Interpreter / Advanced Data Analysis): lets you upload snippets or small repos and iteratively refine outputs together.
- Amazon CodeWhisperer Chat: similar to Copilot Chat but tied into AWS docs and IAMâaware suggestions.
-
IDE/Editor âGhostwriterâ Plugins
- Tabnine Compose: multiâline and wholeâfile completions powered by LLMs, plus a chat panel to tweak generated code.
- Replit Ghostwriter: built into Replitâs online IDEâgreat for quickly spinning up full projects via prompts.
- Kite Pro: AIâdriven completions plus documentation lookâup, though more lightweight than a full chat.
-
Local LLM Runtimes & Retrieval
- Ollama + Code Llama or Mistral on your machine: no cloud lockâin, can feed local docs, changelogs, and keep the modelâs context tight.
- LangChain / PromptFlow: orchestrate retrievalâaugmented pipelines so your LLM always has upâtoâdate API docs, design patterns, or your own code snippets.
-
Prompt & Context Management
- PromptBase or Flowise: build, version, and test prompt templates so you donât have to rewrite the same âgenerate Angular SSR routeâ prompt a dozen times.
- MemGPT or Trickle: tools that automatically summarize and index your prior chats and code outputs, letting you recall earlier âvibeâ sessions with a single query.
-
CI/CD & QualityâGate Integrations
- DeepSource, Snyk, or SonarCloud bots: run scans on AIâgenerated code immediately, flagging vulnerabilities or deprecated patterns before they merge.
- GitHub Actions + custom scripts: enforce linting, test coverage, and security scans on every PRâeven if that PR was AIâsourced.
-
Containerized Sandboxes
- Docker Compose / Dev Containers: spin up an isolated environment per feature so you can âvibeâ on a microâservice without polluting your main branch.
- Play with Docker Playground: quick oneâoff testbeds where you paste AI code, see what breaks, iterate.
At their core, theyâre any integrations or utilities that:
- Let you talk to your code, not type it.
- Automate context managementâso your LLM doesnât âforgetâ type definitions, environment settings, or module boundaries.
- Guardrails that catch AI slipâups (security, deprecation, style) early.
- Sandboxing to experiment fearlessly.
Pick the combo that fits your stackâand always layer in tests and reviews on top of the AIâgenerated output.
Github Copilot vs Microsoft Copilot
Both Github and Microsoft Copilot share a name, and both tap into large language models, but theyâre distinct products aimed at different users:
-
Scope & Integration
- GitHub Copilot lives inside your editor or IDE (VSâŻCode, JetBrains, Neovim, Visual Studio, etc.) and is wired into your codebase. Itâs purposeâbuilt to autocomplete code, translate comments into functions, suggest refactorings, even generate testsâall in the context of the files youâre editing (Plain Concepts).
- Microsoft Copilot (often called MicrosoftâŻ365 Copilot or Copilot in Windows) is embedded across Office apps (Word, Excel, PowerPoint, Outlook, Teams) and the Windows shell itself. Its focus is on drafting documents, summarizing data or meetings, automating workflows, and surfacing organizational data via MicrosoftâŻGraph (Dev4Side, TechTarget).
-
Primary Use Cases
- GitHub Copilot â Developers writing code. It âknowsâ your codeâs context, types, dependencies, and can crank out boilerplate or even complex algorithms with a few keystrokes.
- Microsoft Copilot â Knowledge workers creating content and managing data. Need a pivot table analysis in Excel? A slide deck outline? An email draft? Copilot handles that.
-
Underlying Tech & Data Access
- Both lean on OpenAIâs GPTâfamily models (Codex/GPTâ4), but MicrosoftâŻ365 Copilot layers in MicrosoftâŻGraph so it can pull in your organizationâs documents, chats, and emails when generating responses (TechTarget).
- GitHub Copilot is trained on public code (including the massive GitHub corpus) and uses that to predict what youâll type nextâit doesnât natively tap into your private Office data.
-
Pricing & Licensing
- GitHub Copilot: ~$10/userâŻperâŻmonth (individual), with business tiers available.
- MicrosoftâŻ365 Copilot: ~20âŻpppm, but itâs still Officeâcentric.)
Bottom line: Theyâre âcousinsâ under the same Copilot umbrella, but GitHub Copilot is your AI pairâprogrammer in the IDE, while Microsoft Copilot is your AI assistant across Office and Windows for document/report/data tasks.
What is an LLM in Generative AI?
A Large Language Model (LLM) is a program trained on huge amounts of text to predict the next token (piece of a word). That simple skillâpredicting one token after anotherâlets it write emails, explain code, draft SQL, summarize docs, or chat. If youâre wondering llm what is in practice, think: âa very fast autocomplete that learned patterns from billions of sentences.â
How it works (plain version):
It doesnât âlook up factsâ like a database. It generalizes patterns it saw during training. When it lacks context, it can guessâsometimes well, sometimes poorly.
What is an LLM good for?
- Turning messy text into cleaner text (summaries, rewrites, explanations).
- Producing first drafts (emails, docs, unit tests).
- Translating between natural language and code/config (regex, SQL, API calls).
- Tutoring: explaining a concept in steps with examples.
Where it struggles (know these limits):
- Hallucinations: confident but wrong details when your prompt is vague or asks for niche facts.
- Freshness: unless connected to tools/search, it may not know latest versions or news.
- Long contexts: it can lose track in very long inputs; important details should be restated near the end.
- Exactness: strict math, formal proofs, or specs without tests can go sideways.
How to get better answers:
- Provide concrete context (versions, interfaces, error messages).
- Set constraints (no new deps, time/memory limits).
- Ask for a plan first, then code.
- Request citations or doc links for non-obvious APIs.
- Define acceptance checks (âmust return
{items,total}
; handle empty resultsâ).
TL;DR: What is an llm?
The short answer is âa next-token predictor thatâs become a general text engine.â Itâs powerful, but itâs not a source of truth. Treat outputs as drafts; verify with tests, docs, and small run-time checks.
LLM Vibe Coding Tutorial
Hereâs a practical, no-BS guide focused on using LLMs without getting burnedâcopy/paste hygiene, prompts that actually work, testing, and not getting lazy.
1) Ground rule
LLMs are confident, not always correct. Treat every answer as a draft. Your job is to verify, not believe.
2) Copy-paste hygiene (the âno-regretsâ routine)
- Read first. Say out loud what each block does. If you canât explain it, donât paste it.
- Paste in a sandbox (temp file or throwaway branch). Never straight to main.
- Run a tiny test immediately. Donât wire it into the whole app yet.
- Add checks: a couple asserts or
console.log()
s on inputs/outputs. - Diff and comment your own change: why this code, risk, fallback.
- Name your commit with intent (âAdd X; known limitations: âŚâ).
TIP: Try to use a coding language with strict typechecking (like TypeScript or Go) whenever and wherever possible. This helps because even if the LLM doesnât have the full context, and âhullicinatesâ some bad code, you can at least catch the error quickly, and early, while itâs still in developmentâthis is especially true for larger projects spanning multiple files and directories.
Landmines
- Code that imports libs you donât use (or donât know how to use).
- Hidden side effects (globals, singletons, patching prototypes).
- âMagicâ config changes (
tsconfig
,eslint
,babel
) snuck into the answer.
3) Prompts that actually help (fast template)
When you ask for code, include these:
- Goal: what you want.
- Context: framework + version + runtime (e.g., Node 20, Python 3.11).
- Interfaces / data shape: types or example JSON.
- Constraints: perf, readability, no new deps (if true), licensing, security/compliance.
- Error or test output (if any): paste the exact text/stack.
- Acceptance criteria: how weâll know it works (measurable).
- Budget & hardware: time/money caps, CPU/RAM/GPU, hosting limits.
- Assumptions & non-goals: what weâre not doing.
- Output format: âminimal diffâ or âone file only,â with line count cap.
Example
Hereâs a simple example of what an LLM prompt should include:
- Goal: paginate a
/users
endpoint. - Context: Express on Node 20, Postgres 15.
- Data:
User { id:number, name:string }
. - Constraints: no ORM, keep SQL simple, no new deps, pass OWASP input rules.
- Acceptance: returns
{ items, page, pageSize, total }
;total
fromCOUNT(*)
; â¤40 lines handler + SQL shown; handles empty result and page beyond end. - Budget & hardware: Can only invest <1 hour of dev time daily, must run on 0.5 vCPU / 512MB RAM container.
- Assumptions & non-goals: sorting by
id
only; no cursor pagination; no full-text search. - Output format: show SQL first, then the Express handler, as a minimal diff against
routes/users.ts
.
IMPORTANT: Tell the LLM your budget (time + money) and hardware limits. Ask for stack advice under those limits, not âbest overall.â Require a short option trade-off table if multiple stacks are proposed.
Why this works: you reduce guessing. Less guessing = fewer hallucinations, and more correct results.
Ask the model to do this first (guardrails):
- âList unknowns and ask 3 clarifying questions before coding.â
- âPropose a 5-step plan; then wait.â
- âCite docs for each API used (with version).â
- âGive a confidence score and 3 risks with quick checks.â
4) Ask for a plan before code
Bad: âWrite it.â Better: âGive a 5-step plan first, then code. Flag risks and assumptions.â If the plan looks shaky, fix the plan. Then ask for code.
5) Make the model explain, not just dump code
Use it like a tutor:
- âExplain this error like Iâm new, with a 10-line example.â
- âShow the happy path and one common failure path.â
- âList 3 mistakes people make with X and how to avoid them.â
- âQuiz me with 3 questions and give answers after I try.â
If you donât understand, you wonât debug it later. Slow is smooth; smooth is fast.
6) Debugging with an LLM (donât ask for a magic fix)
Give it a Minimal Repro:
- One file, hardcoded input, clear steps to run.
- Paste the exact error + stack trace.
- Ask: âGive 3 likely causes ranked, and for each, a 1-minute check I can run.â
This gives you a decision tree, not a wall of code.
7) Testing after you paste (bare minimum)
- Smoke test: run it with 2â3 typical inputs + 1 nasty edge case.
- Assertions: check the return shape and a key invariant (e.g., sorted order, length matches).
- Runtime check: log timings or one memory reading if perf matters.
- Guardrails: if youâre in JS/TS, add a simple runtime schema (even one
if
check is better than nothing).
Landmines
- âIt compiledâ â âIt works.â
- Skipping the weird case (empty list, null values, huge input).
8) Hallucination red flags (spot them fast)
- APIs that donât exist, wrong import paths, or wrong method names.
- Vague steps: âjust configure Xâ (but no exact lines).
- Old or mixed versions (âuse AngularHttpModuleââŚwhich isnât a thing now).
- Glossing over auth, CORS, or DB transactions.
- âShould workâ language without proof (no tests, no command to run).
Counter-move: âCite docs for each API used. Include version numbers.â If it canât, downgrade trust.
9) Version + environment discipline
Always tell the model:
- Language + version (Node 20 / Python 3.11).
- Framework + version (Angular 18, Express 5).
- Build/runtime (browser vs server, ES modules vs CJS).
- OS if relevant.
Ask for version-specific code. Saves hours.
10) Security + privacy sanity
- Never paste secrets, tokens, or real customer data.
- Ask for code that keeps secrets in env and redacts logs.
- If it touches auth/crypto, ask for a threat list: âList 5 risks and mitigations.â
11) Use LLMs to learn concepts (not just code)
Prompts that work:
- âExplain X in plain words, then show the math/algorithm, then a 10-line example.â
- âCompare X vs Y. When would I choose one over the other? Table please.â
- âShow how data flows through my code. Start at the HTTP request and end at the DB write.â
You want mental models, not just snippets.
12) Review checklist for LLM output (score 1â5)
- Correctness: compiles, runs, passes your tiny tests.
- Compatibility: matches your versions and environment.
- Clarity: names, comments, no magic.
- Complexity: simplest thing that can work?
- Coverage: edge cases considered?
- Security: no obvious leaks or injections.
Anything <4 on any line â ask for a revision.
13) Donât get complacent (anti-drift habits)
- Two-pass rule: first pass for âdoes it run,â second pass for âdo I understand it.â
- Diff-only requests: âGive me a patch against this file.â (Forces minimal change.)
- Weekly no-LLM hour: rebuild a tiny feature from scratch using docs only.
- Read source/docs first for core libs you rely on.
- Keep a âgotchaâ log: every time the model fooled you, write it down and check it next time.
14) Useful prompt mini-library
A) Feature (minimal change)
Hereâs my file and versions: ⌠Goal: ⌠Constraints: no new deps, keep function signatures. Acceptance: ⌠Output: unified diff only; â¤30 lines. Explain 3 risks after the diff.
B) Debug
Minimal repro: ⌠Error: (paste exact) Give 3 ranked causes with a 1-minute check for each. No code yet.
C) Refactor (surgical)
Keep behavior identical. Reduce branches and duplication. Add 1 small test for the trickiest branch. Show before/after complexity (lines, cyclomatic approx).
D) Explain
Teach me X with a real-world analogy, then a precise definition, then a 10-line example, then 3 quiz questions.
E) Tests from code
Read this function. Generate 6 tests: 3 normal, 2 edge, 1 error. Include expected outputs and reasons.
15) Ten-minute âsafe usageâ checklist
- State versions + environment.
- Ask for a plan first.
- Demand minimal diff or one small file.
- Paste into a sandbox/branch.
- Run a smoke test + one edge case (use logging/print statements to debug!).
- Add 1â2 asserts/guards.
- Scan for fake APIs/imports.
- Ask for doc links for anything non-obvious.
- Write a one-line risk note in the commit.
- If it feels too clever, ask for a dumber version.
Conclusion
âVibe codingâ isnât just another passing tech memeâitâs a real shift in how prototypes, apps, and even production code get built in the era of LLMs. Used wisely, it can unlock massive productivity and lower the barriers for new developers. But, as with any shortcut, it comes with hidden costs: skill decay, fragile code, and a dangerous reliance on out-of-date AI knowledge. The best devs will treat vibe coding tools as accelerators, not crutchesâpairing them with rigorous reviews, robust testing, and a sharp understanding of their own stack. Embrace the vibe, but donât outsource your judgment. Your future codebase will thank you.