<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Dewald Els</title>
    <description>The latest articles on DEV Community by Dewald Els (@dewald-els).</description>
    <link>https://dev.to/dewald-els</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F665367%2F85acc93b-6f15-49e7-94b7-d5c2620973b8.jpg</url>
      <title>DEV Community: Dewald Els</title>
      <link>https://dev.to/dewald-els</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dewald-els"/>
    <language>en</language>
    <item>
      <title>The Unstoppable Current: Why Change Is the Only Constant You Can Count On</title>
      <dc:creator>Dewald Els</dc:creator>
      <pubDate>Fri, 17 Apr 2026 05:42:48 +0000</pubDate>
      <link>https://dev.to/dewald-els/the-unstoppable-current-why-change-is-the-only-constant-you-can-count-on-3nda</link>
      <guid>https://dev.to/dewald-els/the-unstoppable-current-why-change-is-the-only-constant-you-can-count-on-3nda</guid>
      <description>&lt;p&gt;&lt;em&gt;Riding the wave of technological transformation — before it rides you.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Change doesn't ask for permission. It doesn't wait for you to finish reading the manual on the last thing that changed. It arrives, reshapes everything around you, and moves on — leaving you holding documentation for something that's already obsolete.&lt;/p&gt;

&lt;p&gt;We are living through one of the most compressed periods of transformation in human history. And the uncomfortable truth? We don't have time to fully understand it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things Change. Always. That's the Deal.
&lt;/h2&gt;

&lt;p&gt;Change is not new. Seasons change. Empires rise and fall. Languages evolve, die, and get replaced. The wheel, the printing press, electricity, the internet — each one arrived and rewired how humanity functioned.&lt;/p&gt;

&lt;p&gt;But here's what &lt;em&gt;is&lt;/em&gt; new: the &lt;strong&gt;speed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Technology is now changing faster than our collective ability to understand it. We barely grasp the possibilities, limitations, and risks of one wave before the next one is already breaking. We don't fully understand large language models yet — and multi-agent systems are already being deployed in production. We haven't resolved the ethical implications of deepfakes — and real-time AI video generation is already here.&lt;/p&gt;

&lt;p&gt;There is no finish line where we finally "get it." The course keeps changing mid-race.&lt;/p&gt;




&lt;h2&gt;
  
  
  We Don't Love Change. We Love &lt;em&gt;New&lt;/em&gt;.
&lt;/h2&gt;

&lt;p&gt;Here's a nuance worth sitting with: humans don't actually love &lt;em&gt;change&lt;/em&gt;. Change is uncomfortable, disruptive, even threatening. What we love is &lt;strong&gt;novelty&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;New gadget. New feature. New model. New release. That dopamine hit when something feels fresh and exciting — that's not logic. That's biology.&lt;/p&gt;

&lt;p&gt;Neuroscience is clear on this. When the brain encounters something potentially rewarding, neurons in the ventral tegmental area (VTA) activate and release dopamine — the brain's primary "reward" neurotransmitter. That dopamine burst travels to the nucleus accumbens and sends a signal to the prefrontal cortex, the part of the brain responsible for decision-making and planning. &lt;em&gt;(Brain Reward System, Simply Psychology)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In other words, the &lt;em&gt;anticipation&lt;/em&gt; of something new triggers a reward response &lt;strong&gt;before&lt;/strong&gt; your rational mind has had a chance to evaluate whether the new thing is actually good, safe, or worth it.&lt;/p&gt;

&lt;p&gt;When this system is in full swing, executive brain regions like the prefrontal cortex can become suppressed, while deeper reward-tracking areas like the nucleus accumbens are overemphasised — meaning we can lose the ability to properly weigh consequences because the dopamine signal overrides more rational assessments. &lt;em&gt;(Addictive Behaviors Restructure Your Brain's Dopamine System, Medium / AI_ML)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is not a character flaw. It is a feature of being human. But it is something we should be &lt;em&gt;aware&lt;/em&gt; of — especially when the thing triggering our dopamine is a new AI tool promising to change everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI and the Long Arc of How We Record Thought
&lt;/h2&gt;

&lt;p&gt;To understand where we are with AI, it helps to zoom all the way out.&lt;/p&gt;

&lt;p&gt;Human beings have always searched for better ways to externalise thought — to get ideas out of our heads and into the world.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Around &lt;strong&gt;3400 BCE&lt;/strong&gt;, the Sumerians developed &lt;strong&gt;cuneiform&lt;/strong&gt; — pressing a reed stylus into wet clay tablets to create wedge-shaped marks. It was slow, physical, and permanent.&lt;/li&gt;
&lt;li&gt;Ink and papyrus gave way to faster, lighter writing. Then came the codex — the bound book.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;printing press&lt;/strong&gt; in the 1440s didn't just speed things up. It democratised the creation and distribution of knowledge in a way that reshuffled power across entire civilisations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typewriters&lt;/strong&gt; mechanised the act of writing. &lt;strong&gt;Computers&lt;/strong&gt; digitised it. The keyboard became the universal interface for thought.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And now? We are at another inflection point.&lt;/p&gt;

&lt;p&gt;We still use the keyboard — but increasingly, we are describing &lt;em&gt;what we want written&lt;/em&gt; rather than writing it ourselves. The act of producing text is being abstracted away. Instead of pressing a key to produce a character, we are prompting a model to produce a document, a function, an argument, a strategy.&lt;/p&gt;

&lt;p&gt;The analogy isn't perfect — a Sumerian scribe pressing clay had intent, craft, and judgment baked into every mark. We should be careful not to lose that judgment as we hand more of the &lt;em&gt;execution&lt;/em&gt; to machines. But the direction of travel is clear: each era found a way to make the recording of thought faster, more scalable, and more accessible. AI is the latest step on that path — and arguably the most discontinuous one yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Is Not Just a Tool. It's a Driver.
&lt;/h2&gt;

&lt;p&gt;Previous technologies augmented human effort. AI is beginning to &lt;em&gt;substitute&lt;/em&gt; for it — at least in certain domains. Code gets written. Emails get drafted. Analyses get generated. Decisions get informed.&lt;/p&gt;

&lt;p&gt;This creates a genuinely new set of questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do we lose?&lt;/strong&gt;&lt;br&gt;
Craft. Deep comprehension. The slow-burn understanding that comes from struggling with a problem yourself. The junior developer who never has to debug anything may become the senior developer who doesn't understand why anything works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do we gain?&lt;/strong&gt;&lt;br&gt;
Speed. Accessibility. The ability for one person to do what previously required a team. Reduced barriers to entry. More time to focus on higher-order thinking — &lt;em&gt;if&lt;/em&gt; we choose to use it that way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who decides the return on investment?&lt;/strong&gt;&lt;br&gt;
This is the question nobody is asking loudly enough. When AI writes your code, who owns the quality bar? When an agent ships a feature, who is accountable for what it does in production? The efficiency gains are real — but they don't distribute evenly, and the risks don't either. The developer, the team, the organisation, and ultimately the user all have skin in the game. The ROI calculation isn't just financial. It's about skill atrophy, dependency risk, and what happens when the model gets it confidently wrong.&lt;/p&gt;


&lt;h2&gt;
  
  
  Practical: Embracing the Change Without Losing the Plot
&lt;/h2&gt;

&lt;p&gt;Understanding the shift is one thing. Operating effectively inside it is another. Here's how to engage with AI-driven development in a grounded, productive way.&lt;/p&gt;


&lt;h3&gt;
  
  
  Using Agents
&lt;/h3&gt;

&lt;p&gt;An &lt;strong&gt;AI agent&lt;/strong&gt; is a system that can take actions autonomously to complete a goal — not just answer a question, but execute a sequence of steps: reading files, writing code, running tests, calling APIs, and iterating based on results.&lt;/p&gt;

&lt;p&gt;Where a standard chat interaction is a single exchange, an agent is a loop. You give it a goal; it works toward that goal across multiple steps, using tools along the way.&lt;/p&gt;

&lt;p&gt;Agents are powerful precisely because of that autonomy — and risky for exactly the same reason. A well-scoped agent with the right tools and guardrails is enormously productive. A poorly scoped one can make confident, cascading mistakes.&lt;/p&gt;


&lt;h3&gt;
  
  
  Tools: Claude Code, Codex, OpenCode and Others
&lt;/h3&gt;

&lt;p&gt;The agentic coding landscape is growing fast. A few of the key players:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; (Anthropic) — A command-line agentic coding tool that operates in your terminal, reads your codebase, writes and edits files, runs tests, and interacts with git. It is designed to work on real engineering tasks with full project context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex&lt;/strong&gt; (OpenAI) — OpenAI's coding-focused model, now powering a cloud-based agent that can work on tasks in an isolated sandbox environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenCode&lt;/strong&gt; — An open-source, terminal-based AI coding assistant that supports multiple LLM backends. Lightweight, flexible, and designed for developers who want control over their tooling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not autocomplete tools. They are systems that can reason about your codebase and act on it.&lt;/p&gt;



&lt;p&gt;Understanding these concepts is one thing — but the best way to internalise them is to actually get your hands dirty. The tools available today are more accessible than they've ever been, and you don't need to architect a full multi-agent system to start benefiting from agentic workflows. The smartest move is to start small: pick one tool, get it running in a real project, and observe how it reasons. Build your intuition before you build your pipeline. With that in mind, let's walk through setting up &lt;strong&gt;OpenCode&lt;/strong&gt; — one of the most developer-friendly entry points into agentic coding. It's open-source, runs in your terminal, supports multiple LLM backends, and gets you from zero to agentic in under five minutes.&lt;/p&gt;


&lt;h3&gt;
  
  
  Let's Build: Your First Agentic Setup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18 or higher&lt;/li&gt;
&lt;li&gt;An API key for at least one supported LLM provider (Anthropic, OpenAI, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Install OpenCode&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; opencode-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Configure your API key&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenCode uses environment variables for authentication. Set your preferred provider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For Anthropic (Claude)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_api_key_here

&lt;span class="c"&gt;# For OpenAI&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_api_key_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can add these to your &lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt;, or equivalent shell config to persist them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Launch OpenCode in your project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Navigate to your project directory and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This opens the interactive TUI (terminal user interface) inside your project context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Configure your model (optional)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenCode supports a config file (&lt;code&gt;opencode.json&lt;/code&gt; or via the TUI settings) where you can specify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your preferred model (e.g., &lt;code&gt;claude-sonnet-4-5&lt;/code&gt;, &lt;code&gt;gpt-4o&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Context window behaviour&lt;/li&gt;
&lt;li&gt;Tool permissions (file reads, shell execution, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Give it a task&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inside the TUI, describe what you want done in plain language:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add input validation to the user registration form and write tests for it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpenCode will read your codebase, propose a plan, and — with your approval — execute it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips for working with OpenCode effectively:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be specific about scope. "Fix the authentication module" is worse than "Fix the JWT expiry bug in &lt;code&gt;auth/token.js&lt;/code&gt;."&lt;/li&gt;
&lt;li&gt;Review every diff before approving. Agents can be confidently wrong.&lt;/li&gt;
&lt;li&gt;Use it iteratively. Small, focused tasks outperform large, vague ones.&lt;/li&gt;
&lt;li&gt;Keep your repo clean before starting. Agents work better with clear git history.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Something Else Worth Looking Into: Orchestrators
&lt;/h2&gt;

&lt;p&gt;Once you've spent some time with a single agentic tool and you're comfortable with how agents reason and act, there's a natural next question: &lt;em&gt;what happens when one agent isn't enough?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's where &lt;strong&gt;orchestrators&lt;/strong&gt; come in — and it's a rabbit hole worth going down when you're ready.&lt;/p&gt;

&lt;p&gt;An orchestrator is the layer that coordinates multiple agents, tools, or models to accomplish a complex task. A single agent is a specialist. An orchestrator is the manager — breaking large goals into subtasks, delegating to the right agents, handling failures, and synthesising everything into a result.&lt;/p&gt;

&lt;p&gt;It's a step up in complexity, but also a step up in what becomes possible. Frameworks like &lt;strong&gt;LangChain&lt;/strong&gt;, &lt;strong&gt;LangGraph&lt;/strong&gt;, &lt;strong&gt;CrewAI&lt;/strong&gt;, and &lt;strong&gt;AutoGen&lt;/strong&gt; are popular starting points. Anthropic's documentation also covers orchestration patterns using Claude as a directing model over a set of specialised sub-agents.&lt;/p&gt;

&lt;p&gt;The key principle to carry with you: &lt;strong&gt;the orchestrator doesn't do the work. It coordinates who does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's not something you need on day one. But once single-agent workflows start feeling like a limitation, you'll know it's time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Change is not coming. Change is already here, already reshaping what it means to write software, create content, and solve problems. The question is never &lt;em&gt;whether&lt;/em&gt; to adapt — it's &lt;em&gt;how&lt;/em&gt; to adapt with intention.&lt;/p&gt;

&lt;p&gt;The developers and teams that will thrive are not the ones who adopt every new tool reflexively — chasing that dopamine hit of novelty — nor the ones who resist change out of comfort. They are the ones who engage critically: understanding what they gain, naming what they risk losing, asking hard questions about accountability, and then building deliberately with the best tools available.&lt;/p&gt;

&lt;p&gt;The arc from clay tablet to keyboard to AI agent is long. We are privileged to be standing at one of its most remarkable bends.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Don't fear the current. Learn to navigate it. The future belongs to those who stay curious, stay critical, and keep building.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;#AIChange #FutureOfCoding #AgenticAI #TechEvolution #DeveloperTools&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Image: Photo by &lt;a href="https://unsplash.com/@ryoji__iwata" rel="noopener noreferrer"&gt;Ryoji Iwata&lt;/a&gt; on &lt;a href="https://medium.com/p/ed66892709ea?postPublishedType=initial#:~:text=Image%3A%20Photo%20by%20Ryoji%20Iwata%20on%20Unsplash" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Vibe Coding vs. Guided AI Coding: Why Your Dog's Treat App Depends on Who's Typing</title>
      <dc:creator>Dewald Els</dc:creator>
      <pubDate>Thu, 05 Mar 2026 19:21:33 +0000</pubDate>
      <link>https://dev.to/dewald-els/vibe-coding-vs-guided-ai-coding-why-your-dogs-treat-app-depends-on-whos-typing-3gij</link>
      <guid>https://dev.to/dewald-els/vibe-coding-vs-guided-ai-coding-why-your-dogs-treat-app-depends-on-whos-typing-3gij</guid>
      <description>&lt;p&gt;There's a moment every new "vibe coder" eventually hits. You've seen the tweets. Someone built a SaaS in a weekend with nothing but ChatGPT and a dream. So you open up Claude Code, crack your knuckles, and type something like:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"make me an app"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And the AI, bless its heart, tries. It makes something. Maybe it even looks kind of impressive at first glance. But three prompts later you're staring at broken code you don't understand, asking the AI to fix the thing it just built, which breaks two other things, and suddenly your weekend SaaS is a weekend crisis.&lt;/p&gt;

&lt;p&gt;This isn't a hit piece on beginners. Everyone starts somewhere. This is an honest look at why AI coding tools — Claude Code, OpenCode, Codex, Cursor, take your pick — are not a great equalizer so much as a &lt;em&gt;multiplier&lt;/em&gt;. And multiplying zero still gives you zero.&lt;/p&gt;

&lt;p&gt;Let's explore this with the most important app idea of our generation: &lt;strong&gt;an on-demand treat ordering app for dogs.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Vibe Coder Enters the Chat
&lt;/h2&gt;

&lt;p&gt;Our protagonist, let's call him Dave, has never written a line of code. Dave has a dog named Gerald. Gerald wants treats. Dave has seen the demos. Dave is ready.&lt;/p&gt;

&lt;p&gt;Dave opens Claude Code and types his first prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make an app where dogs can order treats
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI now has to make approximately forty decisions Dave hasn't thought about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this a web app? Mobile? Desktop?&lt;/li&gt;
&lt;li&gt;What's the backend? Is there even a backend?&lt;/li&gt;
&lt;li&gt;How do dogs "order"? Is there a UI? Who actually uses it — the dog or the owner?&lt;/li&gt;
&lt;li&gt;What kind of treats? Is there a catalog?&lt;/li&gt;
&lt;li&gt;Is there payment? Delivery? Just a wishlist?&lt;/li&gt;
&lt;li&gt;What language? What framework? What database?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI isn't psychic. It picks React because that's a safe guess. It invents a treat catalog. It adds a shopping cart. It skips authentication because Dave didn't mention users. It skips a database because Dave didn't mention persistence. It generates about 200 lines of code that renders nicely in a browser and does absolutely nothing when you press "Order."&lt;/p&gt;

&lt;p&gt;Dave sees the UI and thinks it's almost done. Dave types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;now make it actually work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Assumption Avalanche
&lt;/h2&gt;

&lt;p&gt;This is where vibe coding really starts to wobble. Every vague prompt forces the AI to assume. Every assumption it makes is one more thing Dave doesn't know about, doesn't control, and will eventually need to fix without knowing how.&lt;/p&gt;

&lt;p&gt;Here's a small gallery of classic vibe-coding prompts and what the AI silently decides on your behalf:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; &lt;code&gt;add a login&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;AI assumes:&lt;/em&gt; JWT tokens, localStorage, no refresh token strategy, no rate limiting, passwords hashed with bcrypt but stored with no salting config documented, email as username.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; &lt;code&gt;connect it to a database&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;AI assumes:&lt;/em&gt; SQLite locally (fine for now, nightmare later), no migrations, no indexes, a schema it invented that may not match what you actually need.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; &lt;code&gt;make it look better&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;AI assumes:&lt;/em&gt; You want Tailwind, a color palette it picked, a layout that overrides your existing CSS, and three new dependencies added to your project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; &lt;code&gt;add payments&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;AI assumes:&lt;/em&gt; Stripe, test mode only, no webhook handling, no error states, no refund logic, and a hardcoded API key it politely warns you to move to an env file — which Dave does not know how to do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are wrong decisions necessarily. But they're all &lt;em&gt;decisions&lt;/em&gt;. Dozens of them. Silently made. And when something breaks — and it will break — Dave has no map of the territory.&lt;/p&gt;

&lt;p&gt;The AI built a house. Dave doesn't know where the load-bearing walls are.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter the Expert
&lt;/h2&gt;

&lt;p&gt;Now let's watch a senior developer — let's call her Priya — tackle the same dog treat app. Priya has ten years of experience. She knows what she wants before she types a word. Her first prompt looks a little different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm building a Next.js 14 app using the App Router. I want to scaffold a 
treat ordering feature for a pet e-commerce platform. 

For now I need:
- A /treats route with a static product listing page (server component)
- Each treat card should have: name, image, price, and an "Add to Cart" button
- Cart state managed client-side with Zustand — no persistence yet
- TypeScript throughout, strict mode on
- Tailwind for styling, keep it minimal for now

Don't add auth, payments, or a database yet. I'll handle those in later 
sessions. Start with the file structure and the Zustand store, then we'll 
build the components.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at what Priya has done here. She has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Named the framework and version&lt;/li&gt;
&lt;li&gt;Named the specific routing paradigm within that framework&lt;/li&gt;
&lt;li&gt;Drawn a hard boundary around &lt;em&gt;scope&lt;/em&gt; (no auth, no payments, no DB — yet)&lt;/li&gt;
&lt;li&gt;Named her state management library&lt;/li&gt;
&lt;li&gt;Specified the type system&lt;/li&gt;
&lt;li&gt;Asked for a specific &lt;em&gt;starting point&lt;/em&gt;, not the whole thing at once&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI doesn't have to guess at a single architectural decision. It executes. The output is clean, idiomatic, and slotted perfectly into a larger system Priya already has in her head.&lt;/p&gt;

&lt;p&gt;Here's roughly what that Zustand store looks like when the AI generates it to Priya's spec:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// store/cartStore.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zustand&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Treat&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
  &lt;span class="nx"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CartItem&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Treat&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CartStore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CartItem&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="nx"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;treat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Treat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
  &lt;span class="nx"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
  &lt;span class="nx"&gt;clearCart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;
  &lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useCartStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CartStore&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;treat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;treat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;treat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;treat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;removeItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;})),&lt;/span&gt;
  &lt;span class="na"&gt;clearCart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is production-quality code. No hand-waving. No placeholders. It handles the edge case of adding a duplicate item. It has a derived &lt;code&gt;total()&lt;/code&gt; function. It's typed. Dave's version had a &lt;code&gt;useState([])&lt;/code&gt; and a button that logged "add to cart" to the console.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Same Tool, A Different Universe
&lt;/h2&gt;

&lt;p&gt;Both Dave and Priya used an AI coding assistant. Both asked it to build a treat ordering app. The outputs are not in the same category. Not even close.&lt;/p&gt;

&lt;p&gt;This is the part the viral "built a SaaS in a weekend" tweets leave out. The person doing it has usually been coding for a decade. They're not discovering what an API is — they're offloading the &lt;em&gt;tedious parts&lt;/em&gt; of work they already know how to do. The AI is a force multiplier for their existing knowledge.&lt;/p&gt;

&lt;p&gt;When Priya hits a bug, she can read the code the AI wrote and understand it. She can spot where the AI made a trade-off she disagrees with. She knows when to push back, when to accept, and when to throw the output away entirely and ask again with tighter constraints.&lt;/p&gt;

&lt;p&gt;Dave cannot do any of that. Dave is entirely at the mercy of what the AI produced. When it breaks, he can only prompt his way deeper into the maze.&lt;/p&gt;




&lt;h2&gt;
  
  
  This Doesn't Mean Beginners Should Give Up
&lt;/h2&gt;

&lt;p&gt;To be fair: there are valid use cases for vibe coding even without experience. Automating a personal spreadsheet. Building a simple form that emails you results. Making a quick prototype to show a client. These are achievable.&lt;/p&gt;

&lt;p&gt;Gerald the dog might very well get a functional treat ordering page eventually. With enough iteration, enough patience, and a tolerant AI, Dave could get something working.&lt;/p&gt;

&lt;p&gt;But "working" and "good" are miles apart. And "good" and "maintainable" are miles further. Anyone can drive a car through a field. That doesn't make them a racing driver.&lt;/p&gt;

&lt;p&gt;The ceiling for what an inexperienced prompter can build is low — not because AI is hard to use, but because building software is hard to &lt;em&gt;think about&lt;/em&gt;. The AI is fluent in code. The bottleneck is always the ideas, the architecture, the constraints, and the judgment being fed into it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Beginners Can Actually Do
&lt;/h2&gt;

&lt;p&gt;If you're Dave and you want to get better results, here are a few things that help:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be specific about what you don't want.&lt;/strong&gt; "Don't add authentication yet" is as powerful as "add a login page." Scope control is everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask the AI to explain its decisions.&lt;/strong&gt; "Before you write any code, tell me what approach you're planning and why." This forces the AI to surface assumptions before they're baked into 300 lines of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Work in tiny slices.&lt;/strong&gt; Don't ask for the whole app. Ask for one component. Get it working. Then ask for the next one. Gerald's treat catalog before Gerald's checkout flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learn just enough to read the output.&lt;/strong&gt; You don't need to be a developer to recognize that a function with no error handling is going to cause problems. A little literacy goes a long way.&lt;/p&gt;




&lt;h2&gt;
  
  
  In Conclusion
&lt;/h2&gt;

&lt;p&gt;AI coding tools are extraordinary. They've genuinely changed what a single developer can build. But they haven't changed what it takes to build something &lt;em&gt;well&lt;/em&gt;. They've made the execution cheaper, not the thinking.&lt;/p&gt;

&lt;p&gt;In the hands of an expert, Claude Code or OpenCode or Codex is like giving a master chef a robot sous-chef that never sleeps. In the hands of someone who's never cooked, it's a kitchen full of sharp knives and high heat.&lt;/p&gt;

&lt;p&gt;Gerald deserves better than a broken treat app with no database and a hardcoded Stripe test key.&lt;/p&gt;

&lt;p&gt;And frankly, so does Dave.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The gap between vibe coding and guided AI coding isn't about intelligence — it's about knowledge. The good news is that knowledge is learnable. The even better news is that while you're learning, the AI is a pretty great teacher too. Just maybe don't ask it to build your production app on day one.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://unsplash.com/@tamasp?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Tamas Pap&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/brown-and-black-long-coated-small-dog-AMRVK6UINy8?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>learning</category>
      <category>promptengineering</category>
    </item>
  </channel>
</rss>
