前阵子在某个开源学习社区的直播活动里,主题是“Vibe coding 动手做出原型”——一个听着酷炫、实操却充满误解的词。屏幕上的弹幕一半人跃跃欲试,另一半人带着疑虑:“让AI写代码,自己只负责看效果,这样真的能叫写程序吗?”我的观点很直接:vibe coding 不是让你放弃编程,而是把编程的重心从“写代码”挪到“描述、验收和决策”上。它最合适的应用场景正是原型制作——你需要用极短时间跑通一个想法,AI 负责把粗糙的草图变成可执行的代码。这篇文章写给想快速验证业务想法的人、准备参加黑客马拉松的人、需要给团队搭内部工具的人,以及第一次接触 AI 编程却被各种概念绕晕的新手。我会按真实工作顺序,把工具链、需求拆解、生成节奏、排错策略和边界感讲清楚,不灌鸡汤,只讲能用上的东西。
1. Vibe coding 不是“乱写”,而是一套“意图-校验”的交互方法论
1.1 一句话讲清 vibe coding 的本质
我先把定义讲死,避免后续跑偏:vibe coding 是指程序员把主要精力放在描述意图、运行验证和修复反馈上,代码的语法细节和结构组装由 AI 编程助手完成的工作方式。它和“把需求扔进对话框,等AI吐出一大段代码,然后复制粘贴”是两回事。后者我称为抽卡式编程,完全不可控;前者则是一个闭环:你描述目标、边界和验收标准,AI 给出代码,你把代码放进真实环境运行,运行结果和错误信息再反馈给 AI,AI 修正,你再验证,直到行为符合预期。
这个闭环里最重要的一句话是:你始终握着验收权。AI 手很快,但它不理解你的业务目标;它可以一秒生成一百行代码,却无法判断“这个功能对用户到底重不重要”。所以 vibe coding 恰恰比传统编程更考验人的判断力,只是在“打字”这个环节上把它外包出去了。那些认为它是偷懒的人,其实还没进入真正的工作流。
1.2 为什么原型制作是 vibe coding 的最佳场景
原型和正式产品的差异,不是代码量的大小,而是寿命和成功标准。原型的寿命通常只有几天到几周,成功标准是“想法被验证、方向被确认”;正式产品的寿命则要以月和年计,成功标准是稳定、可维护、可扩展。指标不同,投入方式就该不同。你没必要在一个一次性验证用的原型里强调模块解耦、设计模式和完整测试,这些反而是对验证速度的阻碍。而 vibe coding 恰好擅长快速交付:它省去了你构筑知识、查阅语法、纠结命名的大量时间。
我用个厨房里的类比:AI 是一个手脚麻利但不懂你生意规划的帮厨。原型阶段,你就是那个不断试菜的人,尝一口觉得咸了就让他调整,觉得方向错了就直接倒掉换一道菜;这个阶段你不需要他汇报柴米油盐库存,不需要制定严格的后厨流程。等正式营业,你才需要考虑供应链、出菜效率、食品安全,那也不是这个帮厨一个人能定的。认清这个比喻,你就不容易在原型阶段犯“过度设计”的错误。
有人担心这样做久了会不会退步。我的体会恰恰相反:当你把写代码的时间省下来,确实会有更多时间去研究业务逻辑、用户习惯和交互细节,这些能力对程序员长期发展的价值,可能比多背几个 API 要高得多。原型阶段就是检验这种能力最好的训练场。模型负责快,你负责准,两个人格各干各的活才不会打架。
2. 开工前的准备:工具链、上下文策略与心态调整
2.1 工具链怎么配,才不会被 AI 生成的代码拖进坑
基础工具其实不复杂:一台能跑通目标项目的开发环境、一个代码编辑器、一个 AI 编程助手、一套版本控制工具。前三者大家都比较熟悉,版本控制却是新手最容易忽略的。原型阶段的代码改动极其频繁,AI 经常会给出一个“我帮你改好了”的版本,把之前一段已经测试通过的功能改得面目全非。如果没有版本控制,你想回到上一个稳定点,只能靠记忆重新敲一遍,一旦没记住原貌,整个原型可能彻底翻车。我自己的习惯是,在每轮让 AI 改代码之前先做一次提交,改完再提交一次。这样即使 AI 的改动是灾难性的,你也可以随时回到任何一个时间点的状态,不用赌运气。
AI 工具的选型,我给出的建议是:先选一个你用起来最顺手的对话式 AI 工具,再考虑代码编辑器插件。对话式工具适合做需求描述、方案梳理和报错分析,编辑器插件适合做单文件内的局部修改,两者配合是原型阶段最省事的组合。至于具体选哪家,我不打算在这里做对比,因为原型项目的技术栈本来就不重,工具差距并没有你想象的那么大;真正决定成败的是你描述问题的能力和验证结果的眼光,而不是工具的基准测试分数。
有一个细节要提醒:别把整个仓库目录无脑暴露给 AI。很多编程助手的插件会读取当前项目上下文,但如果项目里塞了无关的旧代码、依赖缓存和临时文件,AI 的注意力就会被无关内容带跑。原型项目的目录要小而干净,只放当前这个原型相关的文件。这个动作可以避免大量“AI 为什么突然开始改别的文件”的困惑。
2.2 项目记忆与 Prompt 习惯:值得在动手前花十分钟
动手之前,我会固定花十分钟做两件事:第一,把需求拆成最小的可验证目标;第二,在项目根目录放一个上下文说明文件。文件名随意,内容固定:项目目标、技术栈、目录结构、当前进度、已知问题。每次开始一个新的 AI 会话,我先把这个文件丢过去,再布置新一轮任务。为什么这么做?因为 AI 默认只保留当前会话的上下文,换个话题它就忘了之前商量好的约束。这个说明文件相当于“项目记忆外挂”,能把约定从会话内搬到文件系统里,存得久、传得稳。
Prompt 的格式也有套路。我自己常年用的模板是:角色 + 任务 + 约束 + 示例 + 验收标准。举个例子:“你是一个熟悉前端页面开发的工程师。请在 components/ 下新建 TaskInput.vue,支持回车添加任务,任务内容为空时忽略。请参考官方组合式 API 写法,不要在组件内部引入任何额外依赖。生成后告诉我应该如何在 App.vue 中引入并绑定添加事件。”这个 Prompt 里,任务、文件路径、技术选型、约束条件、验收方式全部显式化,AI 几乎没有自由发挥的空间。越是新手,越要学这一条:不是所有 Prompt 都要这么长,但关键信息不能省。
心态上还要接受一个现实:AI 生成的代码不会基于你的偏好自动收敛。如果第一轮返回的东西不符合你的审美,你需要在下一轮 Prompt 里明确指出“不要 X,改为 Y”。你不说,它就会认为上一个版本没问题。这就像带一个实习同事:你越早给出越具体的反馈,他后续的产出就越贴近你的预期。把 vibe coding 看作一种带人方式,心态一下就顺了。
3. 一个实战原型从零到一的完整拆解
3.1 明确边界:需求清单先写清楚再丢给 AI
我拿一个模拟项目 X 举例:做一个在线记事本原型。目标就一句话——用户可以创建待办事项、标记完成、删除事项,刷新页面后数据不丢。就这么一句话,我都会先在纸上拆成五条需求:
- 主页面是一个单视图,包含输入框、待办列表和筛选按钮;
- 数据先存浏览器本地,用 localStorage 兜底;
- 标记完成和删除必须有即时视觉反馈;
- 样式用默认 CSS,不引入任何 UI 框架;
- 登录、云同步、多端协作全部不做。
注意第五条的写法:我明确写“不做”,而不是不写。这不只是节省工作量的选择,更是把边界画给 AI 看,让它不会在生成中途自己加戏。很多开发者在需求清单里只列“做什么”,忘了列“不做什么”,导致 AI 每次都会脑补出一堆与核心验证无关的功能。要把不做的范围列为显式约束,它才不会自由发挥。
3.2 分步生成,别让 AI 一次写完所有功能
第一轮提示,我只要求 AI 搭一个能跑的最小骨架:一个 HTML 页面、一个输入框、一个列表,点击按钮可以把新事项追加到列表。生成以后,我立刻在浏览器里运行,确认页面能正常加载。骨架跑通之后,再进入第二步:加入“标记完成”和“删除”功能,操作后列表即时刷新。第三步加 localStorage 持久化,第四步加筛选按钮。每完成一步,我就运行一次、看一次效果、提交一次版本记录。这个过程看起来慢,实际上每一步都很短,总耗时反而是最短的。
有人会问,为什么不一次性让 AI 把全部功能写完?我在早期实践里吃过亏:一次生成五个功能,运行时出现三处报错,报错信息还互相牵扯,你根本分不清哪个问题该去哪一行改。而且 AI 在一次生成大段代码时,更容易自行发挥,把目录结构、命名风格、依赖选型全都“顺便”改了。把任务切成小块,本质上是把风险切成小块,每块都能验证、能回退、能废弃。这和敏捷开发里的小步交付是一个道理,只是在 vibe coding 场景里,小步的粒度可以更细。
实际操作里,给 AI 的 Prompt 并不复杂,我通常会带上完整的“背景”,因为它看不到你屏幕上正在运行的页面。一个能直接复制的例子是:
【背景】当前 index.html 里已有输入框、添加按钮和 <ul id="todo-list"></ul>,添加后新事项会以 <li> 形式插入列表; 【任务】请在每个 <li> 里加一个“完成”按钮和一个“删除”按钮; 【要求】点击“完成”给 <li> 添加 .done 类;点击“删除”移除该 <li>;这些操作不能刷新页面; 【约束】不要引入 JS 框架,不要改动原有 localStorage 相关逻辑; 【验收】我在浏览器里打开时,新事项可以被标记完成和删除,刷新后已完成的样式保持一致。把背景、任务、要求、约束、验收都写清楚,AI 就不需要猜,改动命中率会明显提高。这个格式也是我现在带其他人入坑 vibe coding 时首先要教的写法。
3.3 运行、报错、修复的循环,以及如何让 AI 看懂错误
原型阶段的大多数时间都花在这个循环上:改完,报错,修,改完,又报错。刚开始我也习惯把一整屏红色报错无脑粘贴给 AI,后来发现效果并不稳定。AI 缺少的是“你当时在做什么、你期望得到什么”的上下文。于是我把反馈格式固定成三件套:第一,你做了什么操作;第二,报什么错,报错信息要完整贴出来;第三,你期望的结果。比如:“我输入内容点添加按钮后,浏览器控制台报错 Cannot read properties of undefined,但页面没有崩,之前添加功能正常。我希望新事项继续出现在列表底部。”这样一问,AI 定位问题的命中率明显提升。
还有一个技巧:先让 AI 说思路,再让它改代码。我会补一句“先不要直接改,告诉我最可能是哪三个位置出了问题,为什么。”这一步看起来多绕了一次对话,实际上能避免很多无效补丁。AI 直接给出修复动作往往来自概率猜测,一次命中当然好,一旦方向错了,后续修复会朝着错误方向越滑越远。让 AI 把判断链路说出来,你就能在它真正动手之前发现哪个地方不对劲。要是 AI 连续两轮都没修对,别继续纠缠,停下来开个新会话,把项目核心代码和当前报错重新贴一遍,往往比原地打转更省时间。
4. 原型阶段最容易踩的坑:AI 幻觉、过时 API 与重复劳动
4.1 AI 一本正经地虚构 API:怎么识破和快速纠正
AI 编程助手最典型的毛病是幻觉,尤其在调用不常用库或用新框架新版本时特别明显。表现就是:它用非常自信的语气,贴出一段你从未见过的 API 用法,让你差点以为自己记错了。你复制到项目里一跑,控制台直接报“该方法不存在”或“模块未找到”。在大量原型项目里,最常见的表现是:让 AI 把某个开源图标库换一个版本,它编造了一个压根不存在的导入路径,还把参数格式介绍得头头是道,新人很容易被这种自信骗过去。
对付幻觉的办法不是去背所有 API,而是给 AI 提供“事实锚点”。第一步,去官方文档搜出当前版本的真实写法,把这段示例贴在 Prompt 里,明确告诉它“就按这个文档里的写法来”。第二步,在 Prompt 里标识版本号:“这个库的版本是 x,不要使用其他版本的接口”。第三步,要求 AI 在代码里用注释标注它的置信度:“你觉得哪部分有把握、哪部分需要我去验证,直接在代码注释里写出来。”这会给幻觉一个被显式暴露的机会,而不是藏在自信的语气里。看到注释里标了“不确定”,你就知道该去重点验证哪里。
4.2 如何避免“新会话把已验证功能改回原样”
这个坑我见得太多了。某个开发者在上午的会话里花了很大力气调好的样式和交互,下午因为要加新功能另开了一个会话,AI 为了“让代码更统一”直接把上午的项目结构重写了一遍,上午验证通过的效果全部打回原形。原因很简单:新会话里,AI 没有上午的中间记忆,它只看到一个它觉得“不够好”的代码,于是顺手重构。它并不知道这些代码是经过几轮纠偏才稳定下来的。
对策就是上下文说明文件。每次开新会话,我把这个文件发过去并交代一句话:“以下文件描述项目当前状态,请基于这个状态做下一步修改,不要改变已完成功能。”说明文件里不但要写“已完成什么”,更要写“哪些部分是稳定的、请勿触碰”。比如:“style.css 前三组样式是最终状态,不要修改;数据读写统一走 utils/storage.js,不要在其他文件里重复实现。”这种负向约束比正向描述更能防止回退。别担心把话说得太死,AI 生成代码时缺的不是自由,而是边界。
4.3 常见翻车现场与应对清单
我把原型阶段最容易翻车的情况列成一个表格,遇到问题直接对号入座。这张表不是理论,全是实际会出现在你工作区里的情况。
| 翻车类型 | 典型表现 | 应对思路 |
|---|---|---|
| 技术栈被带偏 | AI 用了你没听说过的构建工具,项目连启动都不会启动 | 明确技术栈,在 Prompt 中写“只用现有技术栈,不新增构建工具” |
| 过度工程 | 一个原型被 AI 整出十几个目录、抽象类和配置项 | 写“此项目为原型,禁止引入额外依赖和抽象封装”,生成后主动删除冗余文件 |
| 新会话回退 | 之前验证通过的功能被新会话还原成初始版本 | 维护现状说明文件,标注勿动区域;要求 AI 只改指定文件 |
| 反复修同一个 bug | 同一报错换着花样出现,AI 每次给不同猜测 | 停止让它直接改代码,先做根因分析;必要时把最小复现片段单独贴在对话里 |
| 数据被 AI 当成常量 | 本应动态获取的数据被 AI 写死在代码里 | 在 Prompt 中给一个完整的数据样例,并说明数据来自哪个接口或本地存储 |
这个表涵盖了失败情形的大头。剩下的零碎问题不需要背,只要养成“小步提交、及时记录、让 AI 先解释再动手”三个习惯,大部分坑都能在早期发现。原型阶段本身就是用来试错的,犯点错不可怕,可怕的是错误不可回溯——AI 改一步,你找不到回退点。版本控制加上下文说明,这两样东西就是你的安全带。
5. 原型落地后的“善后”:评审、重构与技术债处置
5.1 原型到生产之间的那条线要划在哪
原型跑通了,问题就来了:这堆 AI 生成的代码要不要直接变成正式产品?我的判断标准很朴素,只看两件事。第一,这个系统是只有你一个人维护,还是会有其他人接手?第二,功能迭代还会不会频繁到让你每次改代码都要跟一堆历史包袱搏斗?如果答案是“一人维护且功能几乎不再变”,你可以继续在原型上缝缝补补;如果是“多人协作”或“功能要长期演进”,我建议留出专门时间做一次集中重构,而不是继续堆功能。
原型代码和正式代码的差距体现在很多地方:没有模块边界、注释随缘、依赖管理靠印象、错误处理缺失、逻辑散落在各种回调里。这些不一定是 AI 写出来的问题,而是原型这种短生命周期产物本身就更容易积累。关键是不要因为原型“跑得挺好”就误判它能直接成为正式系统。尤其当场景涉及用户数据和业务流程时,架构上的随便会以更隐蔽的方式反噬。我的建议是:原型承担的是验证职责,验证后该保留的是“需求结论和交互方案”,而不是把所有代码照搬上线。保留方案、重写结构,往往比在一个摊大饼的代码上持续修修补补更划算。
5.2 交接前的最低限度文档:四样东西
我在多个项目里试过不同档次的文档方案,最后沉淀下来一个够用版本:任何原型在交接前,至少整理四样东西。
第一,运行方式。启动命令、依赖安装命令、需要的环境变量,写清楚。AI 生成时代最尴尬的事是代码还在,但没人知道怎么跑。第二,核心逻辑位置。哪个文件承担什么功能,数据流向是什么样的。不需要高深架构图,写三五行字就能让下一个人或下一轮 AI 快速建立地图。第三,已知问题清单。明确写出哪些地方是临时方案、哪些功能只验了一半、哪些边界没覆盖。这比粉饰太平有用得多。第四,下一步计划。准备加什么、应该先修哪个坑、哪个需求已经被验证通过。
这四样东西合起来可能不到一页,却是你留给“未来的自己、队友、下一轮 AI”的交接包。它不会让原型瞬间变成正式系统,但能保证任何人接手时不需要从头考古。尤其是下一轮 AI 会话,你把这份文档塞给它,它的起点就不是“瞎猜这个项目是干嘛的”,而是“照着文档往下推”。这个差距,比大部分 prompt 技巧都值钱。
6. 什么情况不要 vibe coding:边界感与安全审查
6.1 高确定性场景里,AI 生成代码的薄弱点
接下来我要浇一点冷水。vibe coding 在原型阶段非常好用,但它的适用边界必须划清楚。凡是和资金、权限、身份认证、医疗健康、基础设施直接相关的场景,我建议把 AI 生成的代码当作新入职同事提交的代码来审查,而不是直接上线。为什么?因为 AI 在语义边界、竞态条件、异常恢复这些维度上,经常给你“看着合理但隐含缺陷”的代码。
举一个典型的薄弱点:权限校验。AI 生成的代码表面上有角色判断,但可能漏掉绕过路径,比如接口允许前端私自传一个角色参数,或者把按钮的显示逻辑当成安全边界。这种漏洞在简单原型里根本不会触发,一旦上了生产就是严重事故。这时候 vibe coding 的“快”反而变成了问题,因为快会缩短你思考安全边界的时间。我的底线是:原型阶段靠 AI 快速验证没问题;进入真实用户数据、资金流转或对外服务时,必须有代码评审、测试、灰度等流程接住。提效归提效,责任始终在人,不在模型。
6.2 安全、隐私与许可:动手前问自己三个问题
每次动手生成代码之前,问自己三个问题。第一,这段代码会不会接触密钥或者敏感数据?如果会,一律用环境变量加占位符,并且明确要求 AI“不要生成真实凭证,用占位符替代”。第二,第三方依赖和 AI 生成代码的许可证,允不允许你的使用场景?商业项目里这个问题尤其重要,不要让一个不起眼的依赖成为后续不能发布的隐患。第三,我要把多少信息喂给 AI?贴给它的代码片段尽量剥离掉与任务无关的敏感字段,只保留必要结构和逻辑。把整个项目一股脑复制进对话窗口看起来很省事,但那些你不需要展示的业务字段,可能就这样进入了对话记录。
这三个问题加起来用不了五分钟,却帮你规避掉大多数原型阶段最容易出现的隐患。原型阶段追求速度,但不等于抛弃审慎。一个真正讲效率的人会在动手前花五分钟思考哪里是红线,而不是在事后花五个小时处理泄漏后果。所谓边界感,就是把“不能省的安全动作”从“可选”变成“默认”。等原型顺利验证通过,你回头看会发现,这几分钟不是浪费,而是整个流程里最值得的投资。
最后说说我自己的体会。刚开始用 vibe coding 的时候,我以为关键能力是 prompt 写得多漂亮,工具选得多顺手。做完几个原型之后才发现,真正拉开差距的是你的“验收力”:AI 给一个方案,你能不能第一时间察觉哪里不对;程序报错,你能不能判断该相信 AI 的第一次修改还是坚持先让它解释;功能跑通,你够不够清醒地分辨哪些是验证结论、哪些只是临时实现。这个能力需要刻意练习。我现在把每一次 AI 会话都当作一次评审:AI 是提交代码的人,我是决定合并还是打回的人。只要这个角色不颠倒,vibe coding 就是我做出原型最快的路径,而不是给自己挖坑的工具。这是我最想分享的一句话。