<?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: Maryam Zare</title>
    <description>The latest articles on DEV Community by Maryam Zare (@maryam_zare_3fd580d8abbb1).</description>
    <link>https://dev.to/maryam_zare_3fd580d8abbb1</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4107820%2F84799787-f2e6-4e34-904a-b7150eef4f28.jpeg</url>
      <title>DEV Community: Maryam Zare</title>
      <link>https://dev.to/maryam_zare_3fd580d8abbb1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maryam_zare_3fd580d8abbb1"/>
    <language>en</language>
    <item>
      <title>Vibe Was Never the Problem. But the Missing Half Starts Before the Build.</title>
      <dc:creator>Maryam Zare</dc:creator>
      <pubDate>Tue, 29 Sep 2026 21:41:23 +0000</pubDate>
      <link>https://dev.to/maryam_zare_3fd580d8abbb1/vibe-was-never-the-problem-but-the-missing-half-starts-before-the-build-5m2</link>
      <guid>https://dev.to/maryam_zare_3fd580d8abbb1/vibe-was-never-the-problem-but-the-missing-half-starts-before-the-build-5m2</guid>
      <description>&lt;p&gt;&lt;em&gt;Why vibe coding needs software engineering before we let the agents loose.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Don's loop gets the post-build part right.&lt;/p&gt;

&lt;p&gt;With coding agents, though, I think a lot of the damage can happen before we ever get there.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://dev.to/copyleftdev/vibe-was-never-the-problem-the-missing-half-of-vibe-coding-50mi"&gt;Vibe Was Never the Problem: The Missing Half of Vibe Coding&lt;/a&gt;, &lt;a href="https://dev.to/copyleftdev"&gt;Don Johnson&lt;/a&gt; argues that intuition isn't what goes wrong in vibe coding. Stopping at intuition is.&lt;/p&gt;

&lt;p&gt;His fix is a loop:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vibe → Build → Break → Understand → Stabilize → Perfect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I agree with nearly all of it, especially the &lt;strong&gt;Break → Understand → Stabilize&lt;/strong&gt; middle. That is exactly the part many AI-assisted projects skip.&lt;/p&gt;

&lt;p&gt;My addition is about sequence.&lt;/p&gt;

&lt;p&gt;Don's loop eventually produces a spec. It appears during Stabilize, alongside tests, types, contracts, and other things that turn an experiment into something trustworthy.&lt;/p&gt;

&lt;p&gt;I think some version of that spec needs to exist &lt;strong&gt;before the build too&lt;/strong&gt;, not only after it.&lt;/p&gt;

&lt;p&gt;My version would be:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vibe → Spec → Break the Design → Build → Break the Build → Understand → Stabilize → Perfect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The difference looks small.&lt;/p&gt;

&lt;p&gt;I think it matters a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why sequence matters more now
&lt;/h2&gt;

&lt;p&gt;Don makes a good case for exploration before full understanding.&lt;/p&gt;

&lt;p&gt;A sculptor doesn't completely specify the statue before touching the clay. A musician doesn't prove a bassline before playing it.&lt;/p&gt;

&lt;p&gt;For exploration, I agree.&lt;/p&gt;

&lt;p&gt;But clay is cheap to reshape.&lt;/p&gt;

&lt;p&gt;And clay doesn't install twelve dependencies while you are getting coffee.&lt;/p&gt;

&lt;p&gt;A coding agent can.&lt;/p&gt;

&lt;p&gt;One Build step today can produce twenty files, new packages, infrastructure configuration, a database migration, authentication logic, retries, background jobs, and, occasionally, an abstraction that apparently needed its own abstraction.&lt;/p&gt;

&lt;p&gt;When understanding comes after all of that, we are no longer simply reviewing generated code.&lt;/p&gt;

&lt;p&gt;We are reverse-engineering our own system.&lt;/p&gt;

&lt;p&gt;A lightweight spec up front changes the division of labor.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI designs → AI builds → human discovers what happened&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;we get:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human defines intent and boundaries → AI builds → human verifies&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without that step, we can now create architectural debt faster than we have ever created code.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can test a bad architecture very well
&lt;/h2&gt;

&lt;p&gt;This is where I think Don's &lt;strong&gt;Break&lt;/strong&gt; step is necessary, but not sufficient.&lt;/p&gt;

&lt;p&gt;Breaking an implementation asks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this thing fail?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A design review asks a different question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should we have built it this way at all?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I learned this lesson earlier in my career while leading testing for a cardiovascular device.&lt;/p&gt;

&lt;p&gt;We had a test environment that could tell us whether the device behaved correctly under the conditions we had defined.&lt;/p&gt;

&lt;p&gt;The problem was that one of those conditions was wrong.&lt;/p&gt;

&lt;p&gt;We were using water where the real operating environment involved blood, which behaves differently.&lt;/p&gt;

&lt;p&gt;We could have continued testing.&lt;/p&gt;

&lt;p&gt;We could have generated more test cases.&lt;/p&gt;

&lt;p&gt;We could have produced more data.&lt;/p&gt;

&lt;p&gt;And we would have become increasingly confident in a model of the system that did not adequately represent the real environment.&lt;/p&gt;

&lt;p&gt;The important question had to come before the test:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this test environment actually represent the system we are designing for?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That experience stayed with me because it showed how easily a team can validate an implementation while missing an assumption at the system level.&lt;/p&gt;

&lt;p&gt;Sometimes the thing you need to break first is not the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is the model of the problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same issue becomes even more important with AI systems.&lt;/p&gt;

&lt;p&gt;Imagine an application handling sensitive enterprise documents.&lt;/p&gt;

&lt;p&gt;You can fuzz the retrieval endpoints, run adversarial prompts, test latency, and achieve excellent coverage.&lt;/p&gt;

&lt;p&gt;None of that fixes an architecture where sensitive documents should never have crossed a particular service boundary in the first place.&lt;/p&gt;

&lt;p&gt;It doesn't fix authorization being copied into a second store when it should have been checked against the authoritative source.&lt;/p&gt;

&lt;p&gt;And it doesn't fix giving an agent a tool permission it never needed.&lt;/p&gt;

&lt;p&gt;Sometimes the bug isn't in the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's in the architecture.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Break twice
&lt;/h2&gt;

&lt;p&gt;So I would break the system twice.&lt;/p&gt;

&lt;h3&gt;
  
  
  First: Break the design
&lt;/h3&gt;

&lt;p&gt;Do it before implementation becomes expensive.&lt;/p&gt;

&lt;p&gt;Attack the assumptions.&lt;/p&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What if this assumption is wrong?&lt;/li&gt;
&lt;li&gt;What happens at 10x scale?&lt;/li&gt;
&lt;li&gt;What happens when the downstream service is unavailable?&lt;/li&gt;
&lt;li&gt;What if the user is malicious?&lt;/li&gt;
&lt;li&gt;What if the model is confidently wrong?&lt;/li&gt;
&lt;li&gt;Where are the trust boundaries?&lt;/li&gt;
&lt;li&gt;What should the model decide?&lt;/li&gt;
&lt;li&gt;What should stay deterministic?&lt;/li&gt;
&lt;li&gt;What requires human review?&lt;/li&gt;
&lt;li&gt;What are we optimizing for?&lt;/li&gt;
&lt;li&gt;What are we giving up?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the cheap Break.&lt;/p&gt;

&lt;p&gt;Nothing exists yet.&lt;/p&gt;

&lt;p&gt;A bad answer might cost a whiteboard edit instead of a rewrite.&lt;/p&gt;

&lt;h3&gt;
  
  
  Then: Break the build
&lt;/h3&gt;

&lt;p&gt;This is Don's step, and I would keep it.&lt;/p&gt;

&lt;p&gt;Test it.&lt;/p&gt;

&lt;p&gt;Fuzz it.&lt;/p&gt;

&lt;p&gt;Inject failures.&lt;/p&gt;

&lt;p&gt;Attack it.&lt;/p&gt;

&lt;p&gt;Load-test it.&lt;/p&gt;

&lt;p&gt;Test the security boundaries.&lt;/p&gt;

&lt;p&gt;Give it malformed inputs.&lt;/p&gt;

&lt;p&gt;Give it adversarial inputs.&lt;/p&gt;

&lt;p&gt;And, of course, give it the user who pastes an emoji into the ZIP code field.&lt;/p&gt;

&lt;p&gt;The two Break stages answer different questions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Break the Design:&lt;/strong&gt; Is this the right system?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Break the Build:&lt;/strong&gt; Did we implement that system correctly?&lt;/p&gt;

&lt;p&gt;We need both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where exploration ends
&lt;/h2&gt;

&lt;p&gt;None of this means you cannot build before the spec.&lt;/p&gt;

&lt;p&gt;A throwaway spike can absolutely come first.&lt;/p&gt;

&lt;p&gt;Build three versions in an afternoon if that is how you discover the shape of the problem.&lt;/p&gt;

&lt;p&gt;That is one of the most exciting things coding agents give us.&lt;/p&gt;

&lt;p&gt;AI makes architectural experimentation dramatically cheaper.&lt;/p&gt;

&lt;p&gt;But at some point the spike stops being an experiment and starts becoming something another person may have to &lt;strong&gt;trust, operate, or maintain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is where I want the spec.&lt;/p&gt;

&lt;p&gt;The spec marks the transition from:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Let's see if this works."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"We may actually ship this."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without defined users, boundaries, requirements, and success criteria, five prototypes are still just five opinions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The spec is one page, not 47
&lt;/h2&gt;

&lt;p&gt;There is an obvious danger in what I am proposing.&lt;/p&gt;

&lt;p&gt;If every vibe needs a six-week architecture review, three governance committees, twelve Jira epics, and a 47-page design document before anyone can touch the keyboard, then congratulations:&lt;/p&gt;

&lt;p&gt;We have solved vibe coding by making sure nobody codes.&lt;/p&gt;

&lt;p&gt;That is not the proposal.&lt;/p&gt;

&lt;p&gt;For many AI projects, the high-level spec can fit on one or two pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Problem and users&lt;/li&gt;
&lt;li&gt;Requirements and non-goals&lt;/li&gt;
&lt;li&gt;Major components and boundaries&lt;/li&gt;
&lt;li&gt;Data flow: what comes in, where it goes, and what gets stored&lt;/li&gt;
&lt;li&gt;Key assumptions&lt;/li&gt;
&lt;li&gt;Failure modes&lt;/li&gt;
&lt;li&gt;Permissions: what the agent or application can access&lt;/li&gt;
&lt;li&gt;Success criteria&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then review it.&lt;/p&gt;

&lt;p&gt;But review it for &lt;strong&gt;disagreement&lt;/strong&gt;, not ceremony.&lt;/p&gt;

&lt;p&gt;A good design review is not ten people saying, "Looks good to me."&lt;/p&gt;

&lt;p&gt;It is one person asking the uncomfortable question that makes everyone stare at the architecture diagram for thirty seconds.&lt;/p&gt;

&lt;p&gt;Those thirty seconds can save three months.&lt;/p&gt;

&lt;p&gt;The spec also gives us something the build loop cannot provide by itself.&lt;/p&gt;

&lt;p&gt;There are two fundamentally different questions in software engineering:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did we build it right?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did we build the right thing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI is becoming extraordinarily good at accelerating the first one.&lt;/p&gt;

&lt;p&gt;Generate.&lt;/p&gt;

&lt;p&gt;Test.&lt;/p&gt;

&lt;p&gt;Fix.&lt;/p&gt;

&lt;p&gt;Repeat.&lt;/p&gt;

&lt;p&gt;But an AI agent can execute the wrong requirement with impressive efficiency.&lt;/p&gt;

&lt;p&gt;A beautifully engineered solution to the wrong problem is still the wrong solution.&lt;/p&gt;

&lt;p&gt;The spec gives us something to evaluate the implementation against.&lt;/p&gt;

&lt;h2&gt;
  
  
  When code is cheap, judgment becomes scarce
&lt;/h2&gt;

&lt;p&gt;This may be the bigger shift behind vibe coding.&lt;/p&gt;

&lt;p&gt;When implementation was expensive, much of engineering naturally centered around:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can we build this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI changes the economics of that question.&lt;/p&gt;

&lt;p&gt;Increasingly, the harder questions move somewhere else:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should we build this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should the system boundary be?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should the model decide?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should remain deterministic?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where does a human need to stay in the loop?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where do we need a hard control instead of a prompt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens outside the happy path?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Those are engineering questions.&lt;/p&gt;

&lt;p&gt;They are product questions.&lt;/p&gt;

&lt;p&gt;And increasingly, they are governance questions.&lt;/p&gt;

&lt;p&gt;They are also questions a coding agent will happily answer on your behalf if you do not answer them first.&lt;/p&gt;

&lt;p&gt;That is the part that concerns me.&lt;/p&gt;

&lt;p&gt;Not that AI can write code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That it can quietly make architectural decisions while appearing to simply write code.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vibe and engineering were never opposites
&lt;/h2&gt;

&lt;p&gt;This is where I strongly agree with Don.&lt;/p&gt;

&lt;p&gt;Vibe coding versus software engineering is a false choice.&lt;/p&gt;

&lt;p&gt;Vibe opens the loop.&lt;/p&gt;

&lt;p&gt;Engineering determines whether what comes out of that loop deserves to ship.&lt;/p&gt;

&lt;p&gt;I would only extend the argument one step further:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineering shouldn't wait for the vibe to finish. It should surround it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before the prototype becomes a system, write down what you think you are building and try to prove the design wrong.&lt;/p&gt;

&lt;p&gt;Then build it.&lt;/p&gt;

&lt;p&gt;And try to prove the implementation wrong again.&lt;/p&gt;

&lt;p&gt;AI didn't make software engineering less important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It made it possible to build the wrong thing much faster.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And perhaps that is the other missing half of vibe coding.&lt;/p&gt;

&lt;p&gt;Not less vibe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More engineering around the vibe.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Over to you:&lt;/strong&gt; Has a coding agent ever built you something that passed every test but still had the wrong boundary, assumption, or architecture? What would have caught it earlier?&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>programming</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
