尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Vibe Coding实战:从需求描述到可运行代码的闭环工作流

Vibe Coding实战:从需求描述到可运行代码的闭环工作流 前段时间在团队内部做 AI 辅助开发分享时发现很多人对 vibe coding 的理解还停留在“让 AI 写代码、自己看结果”的层面。真正上手之后要么被 AI 生成的代码带偏要么遇到报错不知道怎么顺手解决最后又退回手写。这篇文章是 vibe coding 系列教程的第三期重点解决三个问题vibe coding 到底应该怎么“vibe”而不是“乱编”如何用一套稳定的工作流把 AI 生成结果落到可运行的项目里以及当 AI 给出的代码不符合预期时该怎么收敛。内容面向刚接触 AI 辅助开发的新手也适合那些已经用 AI 写过一点脚本、但还没有建立完整流程的开发者。读完这篇文章你会掌握一套从需求拆解、提示词设计、代码生成到运行验证的闭环方法并且能照着文中的实战案例独立完成一个小型 Web 应用的开发。1. 什么是 vibe coding先别急着让 AI 写代码vibe coding 这个词最近在开发者社区里热度很高。简单说它指的是“用自然语言描述意图让 AI 编程工具生成代码通过不断对话和调整得到可用结果”的开发方式。这个词里的 vibe 强调的是“跟着感觉走”但真正能落地的人其实都有一套自己的节奏而不是真的毫无章法地让 AI 乱写。1.1 vibe coding 解决什么问题传统编程要求开发者先掌握语法、数据结构、框架用法然后才能写出可运行的程序。对于很多有业务想法但编程经验不深的人这个门槛很高。vibe coding 把“从想法到代码”的距离缩短了很多你可以用一句话描述功能AI 生成第一版代码。你可以把报错信息直接贴回对话AI 协助修 bug。你可以要求 AI 给代码加注释、写测试、做重构。你可以反复迭代功能而不需要从头理解每一行实现。它真正解决的是“想法的验证成本”和“起步阶段的空转问题”。以前搭一个原型可能要一晚上现在十分钟就能跑起来一个能点击的页面。1.2 它和传统编程不是替代关系需要明确一点vibe coding 不是“不用学编程”而是把编程的重心从“手写实现”转移到“需求表达、审查判断和问题收敛”上。传统编程中你写每一行代码都知道它在干什么vibe coding 中AI 可能一次性生成几十行代码你需要能看懂大概逻辑能判断它是否符合需求能指出问题让 AI 修改。所以它更适合下面这些情况快速验证想法先跑起来再重构。写一次性脚本数据清洗、文件整理、批量重命名。做原型演示给领导、老师、客户看效果。辅助学习编程让 AI 解释代码、生成练习、模拟面试题。如果项目涉及高并发、复杂事务、安全审计或生产级稳定性要求那还是需要正儿八经的系统设计和代码评审不能因为 AI 生成了代码就直接上线。1.3 vibe coding 的典型工作场景结合目前社区里的常见用法vibe coding 最活跃的场景包括场景举例适合程度前端小页面待办事项、个人主页、表单工具高脚本自动化文件重命名、批量格式转换高数据处理CSV 清洗、Excel 合并、JSON 转换高学习编程让 AI 讲解代码、出练习题高后端小服务Flask/FastAPI 接口、爬虫中大型系统微服务、分布式架构、支付系统低这套方法也可以用在 HarmonyOS 应用的原型验证里鸿蒙生态支持用 TypeScript/ArkTS 做应用开发如果你对 ArkTS 语法不熟完全可以让 AI 帮你生成组件代码再用 DevEco Studio 构建验证。核心思路是一样的AI 生成初稿你负责确认运行结果。2. 环境准备与工具选型开始 vibe coding 之前先把环境准备好。好消息是vibe coding 对硬件要求不高主要依赖的是 AI 编程工具和运行环境。2.1 开发工具选择目前主流的 AI 编程工具大致分三类在线 AI 编程平台比如 Vercel 旗下的 AI 编程平台可以基于自然语言生成 Web 应用并部署预览适合快速做前端原型。这类平台通常把“生成 部署”绑在一起轻量、上手快适合小白。编辑器 AI 插件比如 GitHub Copilot、Cursor 这类基于 IDE 的辅助工具在写代码过程中提供补全和对话能力。适合已经有一定开发习惯的人。通用大模型对话界面比如各类大语言模型产品直接描述需求它会返回代码。你复制代码到本地运行再把报错贴回去。对新手来说建议先用第三种或第一种成本最低。等熟悉了“提需求—看代码—运行—贴报错—再改”这个循环之后再切换到编辑器插件效率会更高。2.2 本地运行环境因为 vibe coding 生成的代码很多是 Python 或 Web 项目所以本地建议准备Python 3.9 以上具体版本看项目要求。Node.js 16 以上如果涉及前端工程化。一个趁手的代码编辑器推荐 VS Code。Git用于版本管理方便回滚 AI 生成的改动。版本这块不需要纠结先装最新的稳定版就可以。如果你的项目最终要部署到云平台再去对应平台查看运行时版本要求。2.3 示例项目结构本文后面的实战案例会做一个“待办事项管理”小应用项目结构如下todo-vibe/ ├── app.py # Flask 应用主文件 ├── templates/ │ └── index.html # 前端页面 ├── static/ │ └── style.css # 页面样式可选 ├── requirements.txt # Python 依赖 └── README.md # 项目说明这个结构非常经典Flask 负责后端逻辑HTML 模板负责页面静态目录放样式。修改起来很直观也方便 AI 生成时对齐上下文。3. vibe coding 核心工作流从想法到可运行代码vibe coding 不等于“把需求扔给 AI然后躺平”。能稳定产出可用代码的人通常会遵循下面这套四步工作流。3.1 第一步写需求描述而不是功能清单很多人让 AI 写代码时给的是极其模糊的描述“帮我写一个待办事项应用。”这个描述信息量太少AI 只能按默认理解自由发挥生成结果大概率和你脑中的想象不一样。更好的做法是用“场景 功能 边界”的结构描述需求。例如我需要一个待办事项 Web 应用用户可以在输入框中填写任务点击添加后任务出现在列表中 每个任务旁边有“完成”和“删除”按钮 完成的任务文字有删除线 数据保存在浏览器本地localStorage刷新页面不丢失 页面要简洁适配手机屏幕。这段描述包含了操作流程、交互反馈、数据存储方式和样式要求。AI 得到这些信息后生成的代码会准确得多。3.2 第二步把大需求拆成小步骤AI 编程工具对“一步到位生成大项目”的支持还不稳定。更稳妥的做法是把需求拆成多个小阶段每个阶段只让 AI 完成一件事先让 AI 生成基础页面结构。再让 AI 实现“添加任务”功能。再补“完成任务”和“删除任务”。最后做本地存储和样式优化。每次只请求一个增量功能出问题时定位也容易。这里要注意一个原则一次对话只围绕一个目标。如果你在一个对话窗口里不断堆需求AI 很容易在后面的生成中“忘记”前面的约束产生上下文漂移。遇到这种情况就新开一个对话把项目当前状态和下一步目标重新描述一遍。3.3 第三步先让代码跑起来再谈优化AI 生成的第一版代码大概率不是最优的但应该是“能跑”的。拿到代码后先不要纠结命名规不规范、有没有封装先做一件事让它运行。cd todo-vibe python app.py浏览器打开http://127.0.0.1:5000能看到页面就算阶段成功。如果跑不起来把完整的报错信息原样贴给 AI让它直接给出修复版本。在这个阶段最忌讳的是自己埋头改代码。你的任务是“判断和调配”不是“替 AI 重新写一遍”。3.4 第四步验证每一段生成结果AI 生成的代码可能有隐藏问题尤其是涉及文件操作、数据存储、外部 API 调用时。因此每完成一个小功能都要做一个“最小验证”。比如 AI 生成了“保存任务到 localStorage”的代码那就手动添加三条任务刷新页面确认数据还在。如果不在说明存储逻辑有问题把现象告诉 AI让它修复。整个 vibe coding 的过程可以概括为描述需求 → AI 生成代码 → 运行验证 → 发现问题 → 贴回报错 → AI 修改 → 再验证这个循环跑得越熟练你的产出效率就越高。4. 完整实战案例用 vibe coding 开发一个待办事项小应用下面用一个完整案例把上面的工作流串起来。这个案例会用到 Flask 作为后端前端页面用原生 HTML JavaScript。它会通过“需求描述—AI 生成—运行验证—迭代优化”的方式完成。4.1 创建项目目录先在终端执行下面的命令创建项目目录mkdir todo-vibe cd todo-vibe mkdir templates static如果你用的不是 Windows cmd而是 PowerShell 或 macOS/Linux 终端上面命令都一样。4.2 编写需求文档准备给 AI打开任意 AI 对话工具输入下面这段描述我要做一个待办事项 Web 应用使用 Python Flask 框架。 页面是一个输入框和一个添加按钮在输入框输入任务文本点击添加后任务出现在下方列表中。 每个任务项右侧有“完成”和“删除”按钮。 点击“完成”后该任务的文字颜色变灰并加上删除线再次点击可以取消完成状态。 点击“删除”后任务从列表中移除。 任务数据保存在后端的 JSON 文件中重启服务后数据不丢失。 页面样式简洁美观适配手机屏幕。 请给出完整项目代码包括 app.py、templates/index.html 和 static/style.css。这段描述的特点是指定了技术栈Python Flask、数据存储方式JSON 文件、交互细节完成状态可切换、样式要求响应式以及需要的文件结构。AI 理解起来会很轻松。4.3 AI 生成的代码示例与解读AI 可能会生成类似下面的代码。注意不同的 AI 工具生成结果会不一样下面是针对上述需求的一种合理实现。文件app.pyfrom flask import Flask, render_template, request, jsonify import os import json app Flask(__name__) DATA_FILE os.path.join(os.path.dirname(__file__), data.json) def load_tasks(): 从 JSON 文件读取任务列表 if not os.path.exists(DATA_FILE): return [] with open(DATA_FILE, r, encodingutf-8) as f: return json.load(f) def save_tasks(tasks): 将任务列表写入 JSON 文件 with open(DATA_FILE, w, encodingutf-8) as f: json.dump(tasks, f, ensure_asciiFalse, indent2) app.route(/) def index(): return render_template(index.html) app.route(/tasks, methods[GET]) def get_tasks(): return jsonify(load_tasks()) app.route(/tasks, methods[POST]) def add_task(): data request.get_json() text data.get(text, ).strip() if not text: return jsonify({error: 任务内容不能为空}), 400 tasks load_tasks() task { id: len(tasks) 1, text: text, done: False } tasks.append(task) save_tasks(tasks) return jsonify(task), 201 app.route(/tasks/int:task_id, methods[PUT]) def update_task(task_id): tasks load_tasks() for task in tasks: if task[id] task_id: data request.get_json() if done in data: task[done] data[done] if text in data: task[text] data[text].strip() save_tasks(tasks) return jsonify(task) return jsonify({error: 任务不存在}), 404 app.route(/tasks/int:task_id, methods[DELETE]) def delete_task(task_id): tasks load_tasks() new_tasks [task for task in tasks if task[id] ! task_id] if len(new_tasks) len(tasks): return jsonify({error: 任务不存在}), 404 save_tasks(new_tasks) return jsonify({message: 删除成功}) if __name__ __main__: app.run(debugTrue)这段代码实现了完整的前后端接口load_tasks和save_tasks负责 JSON 文件的读写。GET /tasks返回所有任务。POST /tasks添加任务。PUT /tasks/id更新任务状态或内容。DELETE /tasks/id删除指定任务。文件templates/index.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title待办事项/title link relstylesheet href/static/style.css /head body div classcontainer h1我的待办/h1 div classinput-area input typetext idtask-input placeholder输入新的任务... button idadd-btn添加/button /div ul idtask-list/ul /div script const input document.getElementById(task-input); const addBtn document.getElementById(add-btn); const taskList document.getElementById(task-list); async function loadTasks() { const res await fetch(/tasks); const tasks await res.json(); renderTasks(tasks); } function renderTasks(tasks) { taskList.innerHTML ; tasks.forEach(task { const li document.createElement(li); li.className task.done ? done : ; li.innerHTML span classtask-text${task.text}/span button classtoggle-btn${task.done ? 取消完成 : 完成}/button button classdelete-btn删除/button ; li.querySelector(.toggle-btn).addEventListener(click, () toggleTask(task.id, !task.done)); li.querySelector(.delete-btn).addEventListener(click, () deleteTask(task.id)); taskList.appendChild(li); }); } async function addTask() { const text input.value.trim(); if (!text) return; const res await fetch(/tasks, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ text }) }); if (res.ok) { input.value ; loadTasks(); } } async function toggleTask(id, done) { await fetch(/tasks/${id}, { method: PUT, headers: { Content-Type: application/json }, body: JSON.stringify({ done }) }); loadTasks(); } async function deleteTask(id) { await fetch(/tasks/${id}, { method: DELETE }); loadTasks(); } addBtn.addEventListener(click, addTask); input.addEventListener(keypress, e { if (e.key Enter) addTask(); }); loadTasks(); /script /body /html这个页面用原生fetch调用后端接口完成任务的加载、添加、状态切换和删除。文件static/style.css* { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif; background: #f5f5f5; display: flex; justify-content: center; min-height: 100vh; padding: 24px; } .container { max-width: 480px; width: 100%; background: #fff; border-radius: 12px; padding: 24px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); } h1 { font-size: 22px; margin-bottom: 16px; text-align: center; color: #333; } .input-area { display: flex; gap: 8px; margin-bottom: 16px; } input { flex: 1; padding: 10px 12px; border: 1px solid #ddd; border-radius: 8px; font-size: 14px; } button { padding: 10px 16px; border: none; border-radius: 8px; cursor: pointer; font-size: 14px; background: #4f6ef7; color: #fff; } button:hover { opacity: 0.85; } ul { list-style: none; } li { display: flex; align-items: center; gap: 8px; padding: 10px 0; border-bottom: 1px solid #f0f0f0; } li.done .task-text { color: #aaa; text-decoration: line-through; } .task-text { flex: 1; font-size: 15px; color: #333; word-break: break-word; } .toggle-btn { background: #28a745; font-size: 13px; padding: 6px 10px; } .delete-btn { background: #dc3545; font-size: 13px; padding: 6px 10px; }如果你使用的是 Vercel 这类在线 AI 编程平台可以把同样的需求描述直接输入生成结果通常会自动包含页面预览和部署链路。这类平台更偏向 Web 原型部署是内置的省去很多环境配置时间。4.4 依赖与运行项目还需要一个requirements.txt文件。可以让 AI 生成也可以手动写flask3.0.3版本号可以根据当前环境调整。安装和运行命令如下pip install -r requirements.txt python app.py启动后终端会显示类似下面的信息* Running on http://127.0.0.1:5000打开浏览器访问这个地址就能看到待办事项页面。4.5 功能验证部署完成后按下面清单验证操作预期效果输入文字点击添加任务出现在列表点击“完成”文字变灰出现删除线再次点击“取消完成”文字恢复原样点击“删除”任务从列表移除重启 Flask 服务再刷新任务还在如果所有步骤都通过说明这个由 vibe coding 驱动的项目已经可以交付了。4.6 迭代优化把问题交给 AI提交给 AI 的问题要具体。不要只说“不好看”而是说当前页面上移动端按钮太挤点击目标区域太小。 请调整样式让按钮在窄屏时换行排列并且增加按钮高度到 40px。AI 会根据描述生成修改后的 CSS替换文件后再刷新看效果。这个“反馈—修改—验证”的循环就是 vibe coding 最核心的日常。5. 常见问题与排查思路vibe coding 过程中的问题大多集中在“AI 生成的代码跑不起来”和“生成结果不符合预期”两类。下面整理常见现象和解决思路。问题现象常见原因解决思路提示 Python 版本或依赖不兼容本机 Python 版本与代码使用的语法不匹配检查python --version必要时使用虚拟环境Flask 启动时提示端口被占用5000 端口被其他进程占用改端口app.run(port5001, debugTrue)前端页面无法显示任务列表后端接口报错或前端跨域问题打开浏览器控制台查看网络请求状态把错误信息贴给 AIAI 反复给出同一段错误代码上下文不清晰或 AI 未能理解报错信息新开对话附上项目代码、报错全文本、预期效果添加任务后刷新就丢失数据没有被写入文件或 localStorage检查后端 data.json 是否生成内容是否变化AI 调用了一个不存在的第三方接口大模型存在幻觉推荐了虚构 API去官方文档确认接口存在再让 AI 按真实接口重写想用鸿蒙环境运行但报错ArkTS 与普通 TypeScript 语法有差异引导 AI 使用 ArkTS 声明式 UI 方式生成并在 DevEco Studio 中验证5.1 跑不起来时先看完整报错不要只把错误信息前半句贴给 AI。对于 Python 程序报错的最后一行一般是异常类型和描述而整个 traceback 往往能定位到具体文件行号。Traceback (most recent call last): File app.py, line 20, in module from flask import Flask ModuleNotFoundError: No module named flask这个报错说明 Flask 还没安装。直接执行pip install flask然后再启动。把完整报错贴给 AIAI 才能准确定位问题。5.2 代码上下文管理是三期教程里最重要的技能在 vibe coding 中AI 并不是始终记住你的全部项目。如果你希望 AI 修改某个具体文件请在提问时明确告诉它当前文件路径、文件内容或相关函数名。比如我的 app.py 中 delete_task 函数删不掉任务返回 404。 这是当前代码粘贴代码 请帮我检查为什么匹配不到 task_id。上下文越完整AI 的回答越准确。5.3 不要盲目接受 AI 的安全建议AI 生成的代码默认优先级是“实现功能”不是“安全加固”。当你让 AI 写涉及数据库操作、用户登录、文件上传、支付功能时必须保持警惕不要让它生成绕过认证的代码。不要把 API 密钥明文写进前端代码。生产环境使用前要让有经验的工程师做代码评审。数据库操作必须先备份再在测试环境验证。安全底线不能靠 vibe必须走实打实的工程流程。6. 最佳实践与工程建议vibe coding 的最终目标是“高效地产出可靠的代码”而不是“完全依赖 AI”。以下几条建议直接来自一线使用经验希望你能少踩坑。6.1 需求描述使用固定模板建议每次写需求提示词时套用类似结构技术栈Python Flask 原生 HTML 功能用户可以在输入框输入任务点击添加按钮后任务进入列表 任务支持完成状态切换和删除。 数据存储后端 JSON 文件重启不丢失。 样式要求简洁适配移动端。 输出请提供 app.py、templates/index.html、static/style.css 的完整代码。固定模板可以让你在不同项目中复用提示词也能让 AI 生成结果更稳定。这个模板不是死的你可以根据自己的项目类型扩展“异常处理要求”“性能要求”“日志要求”等字段。6.2 小步提交方便回滚AI 生成的改动不一定都是你想要的。用 Git 管理项目每完成一个功能就提交一次万一后续改动坏了可以随时回退。git init git add . git commit -m 完成添加任务功能一个小技巧让 AI 每次只改一个文件。如果你同时让它改app.py和index.html出问题后比较难定位。一次一个文件的粒度配合 Git 提交出问题能快速回滚。6.3 建立代码验证清单无论 AI 生成的代码看起来多正确都要做基本功验证。对于 Web 项目至少验证页面能不能打开。主要操作流程是否完整。数据在刷新/重启后是否还在。手机浏览器或开发者工具移动端模式下是否正常。对于脚本项目至少验证输入为空时会不会报错。异常文件路径会不会崩。输出文件内容是否符合预期。6.4 把 AI 当成结对编程伙伴vibe coding 还有一个重要姿势让 AI 解释代码。当 AI 给出一个你不理解的函数时直接问请解释这段代码中 filter 函数的作用并说明如果 tasks 为空列表会怎样。让 AI 给你讲清楚逻辑这样你才能对生成结果负责。如果你连讲都讲不清楚的代码都要往生产环境放风险就太大了。6.5 密切留意平台差异不同 AI 工具的能力差别很大通用对话工具适合生成片段和回答理解类问题。编辑器 AI 工具适合在写代码过程中做补全和局部修改。在线生成加部署平台适合做前端原型和快速演示。如果你在鸿蒙应用开发中尝试 vibe coding要注意 ArkTS 和通用 TypeScript 的差异。不要拿 Web 端的代码直接往 HarmonyOS 工程里搬让 AI 先学习鸿蒙组件规范和用户交互模式再让它按 ArkTS 声明式语法生成。最稳妥的做法是从官方 Demo 出发让 AI 做局部调整而不是从零生成整个应用。6.6 生产环境接入前的风险控制Vibe coding 适合原型验证和个人项目但进入生产环境前必须做四件事代码审查至少一名有经验的同事或技术负责人完整审查。数据备份涉及数据库或文件操作时预先备份。最小权限数据库账号、API 密钥、服务器权限都要遵守最小权限原则。监控与回滚上线前准备好回滚方案出现异常快速恢复。尤其要注意不要因为“AI 生成的代码看起来很完善”就跳过代码评审。AI 不会为线上事故负责最终负责的是你。7. 总结与下一步学习路线这一期内容从 vibe coding 的概念讲起拆解了从需求描述到代码运行验证的完整闭环并用一个 Flask 待办事项应用作为实战案例演示了 AI 生成代码、运行调试、问题反馈和迭代优化的全过程。你现在应该掌握了vibe coding 的适用场景和边界。一套四步工作流需求描述、任务拆分、运行验证、迭代反馈。用结构化提示词让 AI 生成更准确的代码。遇到报错时如何有效把信息反馈给 AI。生产环境接入前必须做好的安全与备份措施。下一步你可以继续练习把同一套流程应用到数据处理脚本、自动化工具、个人网站等项目上。学习 Git 的基础操作让每次 AI 改动都可追溯。选择一个框架比如 Flask、FastAPI系统学习基础语法减少对 AI 的盲从。在鸿蒙开发场景中用 DevEco Studio 配合 AI 助手做小的应用页面练习。最好的学习方式是找一个你真正想解决的小问题打开 AI 工具按照本文的四步工作流走一遍。遇到报错不要慌把报错完整贴回对话让 AI 带你再试一次。你会发现vibe coding 不是让 AI 替代你编程而是让 AI 陪你编程——方向盘始终在你手里。
返回列表