JOURNAL / SOFTWARE ENGINEERING

Vibe coding.
From prototype to product.

Move quickly while an idea is still forming. Then raise the bar when real users, real data, and real consequences enter the picture.

A developer points to code on a tablet beside a desktop monitor.PROTOTYPE / PRODUCT / SYMPLOKA
MOVE FAST. KEEP YOUR HAND ON THE WHEEL.

A prototype earns attention. A product earns trust.

The transition starts when the work must keep behaving beyond the happy path.

01 / WHAT PEOPLE MEAN BY VIBE CODING

Describe the change. Run it. Follow the next idea.

Vibe coding is an informal name for a prompt-led way of building software: describe an outcome in ordinary language, let an AI coding tool change the project, run what it made, and keep iterating from what you see.

Andrej Karpathy used the phrase in a February 2025 post about his own deliberately loose workflow, where he accepted generated changes without reading every diff. He framed it as amusing and suitable for throwaway weekend projects. That description captures one end of a broad practice; it is not a standard, a quality label, or a definition of who counts as a programmer.

The useful question is what the software is for. A disposable sketch can optimize for speed. Something other people depend on needs a visible owner, understandable behavior, and checks that match the cost of failure.

02 / WHY THE FIRST VERSION FEELS FAST

It makes the feedback loop shorter.

Prompt-led iteration can turn an idea into something you can click, question, and revise before you know the exact implementation. That is useful for exploring a layout, learning an unfamiliar tool, trying a small automation, or showing a concept to someone who can respond to it.

The early screen is also the easiest part to judge. A result can look finished while hiding unclear assumptions, unhandled inputs, excessive access, brittle dependencies, or behavior that no one has tried to break. A successful demo says that one path worked once; it does not settle whether the whole system is ready for its intended use.

Fast to exploreTry competing ideas, ask for a visible change, and learn from a running result.
Easy to outgrowEach quick patch adds decisions. Without a clear structure, those decisions can become hard to explain and change.
Useful signalA prototype can reveal that a workflow matters or that a design needs another direction.
Not release evidenceA persuasive interface does not show how errors, privacy, permissions, updates, or recovery work.
03 / WHAT THE CODE STUDIES ACTUALLY SHOW

Look for patterns, not a verdict about all AI code.

A 2025 study compared more than 500,000 Python and Java code samples, using human-written functions from GitHub projects and outputs from ChatGPT, DeepSeek-Coder, and Qwen-Coder. Static-analysis tools found different quality profiles: generated samples were generally simpler and more repetitive, with more unused constructs and hard-coded debugging; the human-written set showed more structural complexity and maintainability issues. The study also reported more high-risk security findings in its AI-generated set.

That is a comparison under a particular setup, not a forecast for every codebase. The languages, models, sample construction, prompts, and static-analysis rules all shape what the study can see. A scanner finding is a reason to inspect a path, not proof that a vulnerability is exploitable; a clean scan does not prove that a feature is safe.

A separate repository study looked for public GitHub files whose comments explicitly attributed code to AI tools, then analyzed those files with CodeQL. Its authors note that this misses AI-assisted code without attribution and may overrepresent projects where people choose to document tool use. The evidence supports careful review and task-specific checks, not the claim that code is bad because AI helped write it.

04 / DRAW THE LINE BEFORE YOU BUILD

Set the prototype’s boundaries in plain language.

Who will use it?Keep an experiment to its intended audience. A demo shared outside the room can already shape someone’s decisions.
What can it touch?Use sample data where possible. List the accounts, files, services, and actions the tool can reach.
What must never happen?Write down the costly mistakes: expose a secret, delete the wrong record, send an unapproved message, or misstate an important result.
What proves the next step?Choose observable checks: expected behavior, rejected inputs, permission boundaries, and a way to undo or recover.

For a local experiment, those boundaries can be lightweight: a disposable project, synthetic data, and no external write access. When a prototype reaches real accounts, private information, or decisions that affect other people, pause and redesign its permissions and review points before expanding it.

05 / GRADUATE THE PROTOTYPE

Turn “it works on my screen” into evidence.

  1. Name the real job. Define who the software serves, the behavior it must deliver, and the cases it should refuse or handle safely.
  2. Take ownership of the project. Read the structure, entry points, configuration, dependencies, and data flows. Ask the assistant to explain them, then check that explanation against the code.
  3. Review the whole change. Inspect the diff, remove unrelated experiments, and make sure you can explain what each changed part does.
  4. Test ordinary and difficult paths. Check expected use, empty or malformed inputs, permission failures, dependency errors, and the behavior after a partial failure.
  5. Protect the boundary. Check authentication, authorization, secrets, personal data, external requests, and newly added packages. Give each integration only the access it needs.
  6. Make it operable. Decide how errors are reported, who maintains the software, how changes are released, and how to restore service or reverse a bad update.
  7. Release in proportion to the risk. Start with a small group or limited capability, observe the actual behavior, and widen use only when the evidence supports it.

This is not a demand for heavyweight process around every experiment. The amount of review should follow the software’s reach and the cost of being wrong. The line changes when the prototype starts handling other people’s information or actions.

06 / KEEP THE SPEED, KEEP THE JUDGMENT

Use the model to make more options visible.

Ask for a small change, request the assumptions behind it, and have the tool point to the files and tests it touched. Let it draft tests, compare approaches, and explain unfamiliar code. Keep the decisions that carry consequences in a reviewable human workflow.

A useful rhythm is simple: state the goal, constrain the change, inspect the result, run a check, and decide what happens next. If the project becomes difficult to explain, stop adding features long enough to recover a clear map of its behavior.

  • Is this still an isolated prototype, or do people now rely on it?
  • Can I explain and reproduce the behavior I plan to ship?
  • Have I checked the paths where a mistake would matter most?
  • Does someone own maintenance, feedback, and recovery?
ORIGINAL CONTEXT & RESEARCHAndrej Karpathy, post describing his vibe-coding workflow, 2 February 2025 ↗Cotroneo, Improta & Liguori, Human-Written vs. AI-Generated Code: A Large-Scale Study of Defects, Vulnerabilities, and Complexity (ISSRE 2025) ↗Schreiber & Tippe, Security Vulnerabilities in AI-Generated Code: A Large-Scale Analysis of Public GitHub Repositories ↗