vibe coding,这个词最近在程序员圈子里火到我朋友圈里三天两头有人提。简单说,就是用AI帮你写代码,你负责“带节奏”——描述需求、审查结果、不断纠偏,整个开发过程更像是在“指挥”而不是“搬砖”。我第一次听到这个词是看Karpathy(前OpenAI研究员)分享自己的用法:一边放着音乐,一边用自然语言描述需求,让AI生成代码,人只负责感觉对不对、方向对不对。这个“感觉”就是vibe这个词的来源。
这篇文章不是什么学术论文,就是我实际用了大半年AI辅助编程之后攒下来的心得。适合谁看?如果你还在观望,想知道这玩意到底能不能用来写正经项目;或者你已经用了Cursor、Copilot、Codex,但觉得生成代码质量不稳、经常被坑;又或者你是做嵌入式的,想试试AI写驱动和裸机逻辑——这篇文章应该都能给你点实在的东西。我会尽量说人话,不装,把那些工具说明书里不写的东西都抖出来。
1. vibe coding是什么,以及它为什么成立
1.1 从“写代码”到“写需求”的思维转换
vibe coding的核心不复杂:你把写代码的动作交给大模型,自己专注于三件事——描述清楚你要什么、判断AI给的东西对不对、在出错时把方向掰回来。
为什么这个模式能成立?说穿了就两个技术前提。第一,大模型在“常见代码”上的能力已经超过了大多数人的“默写能力”。CRUD接口、数据表操作、状态机、协议解析这类代码,网上有海量样本,模型见过太多,写出来的东西往往比初级程序员还工整。第二,代码评审比代码编写门槛低得多。你不需要会默写每一行代码,但你得能看懂代码在干嘛、知道哪里容易出问题。打个比方,这就像开车——你不需要会造发动机,但你得知道仪表盘上每个报警灯是什么意思。
这两个前提放在一起,vibe coding就成立了一个等式:人的判断力 + 机器的生产力 = 开发效率的大幅提升。换句话说,AI能把“写”这个动作变得廉价,但“判断”这个动作,依然需要人来完成。
1.2 vibe coding不是“不学编程”
这是我见过最大的误解。很多新人听说vibe coding就以为“以后不用学编程了,跟AI说就行了”。大错特错。恰恰相反,vibe coding对基本功的要求更隐蔽,也更高:
- 你得会读代码,知道AI生成的逻辑哪里有问题
- 你得懂业务,能把模糊的需求翻译成模型能理解的技术描述
- 你得会看报错,能把一屏红字压缩成一句有效的修Bug请求
- 你得有系统思维,知道改了A模块会连带影响B模块
说白了,vibe coding把“写”的门槛降低了,但把“判断”的门槛抬高了。它适合的是本来就会写代码的人,以及愿意投入时间补基础的新手。指望它让你零基础直接造产品,那是想多了。
1.3 vibe coding的适用场景
根据我这大半年的经验,最适合vibe coding的几种场景:
- 原型验证:产品想法不明确,先用AI快速出一版能跑的demo,验证可行性
- 脚手架项目:目录结构、配置文件、基础CRUD、数据库表设计
- 重复性代码:DTO、序列化、单元测试模板、文档注释
- 算法实现:经典算法、数据处理、公式改写,这类东西模型训练数据里全是
- 跨语言翻译:从Python逻辑翻译成Go、C++、Java,模型做得又快又准
不太适合的场景包括:高性能底层优化、复杂并发调试、遗留系统改造(代码库晦涩难懂时AI也瞎)、强安全合规场景。这些判断不是拍脑袋,后面每一章我都会展开讲为什么。
2. 工具选型:Cursor、Copilot、Codex怎么选
2.1 三类工具的定位差异
现在市面上的AI编程工具,掰开揉碎就是三类。第一类是补全型,以GitHub Copilot为代表,在IDE里给你补下一行。适合你本身在写代码,想要个“提词器”。第二类是Agent型,以Cursor、Windsurf为代表,给一个任务描述,它自己读文件、改代码、跑命令,适合“把活外包给AI”。第三类是命令行大模型型,以Codex CLI、Claude Code为代表,直接在终端里对话改项目,适合自动化流水线里使用。
这三类不是谁取代谁的关系,而是使用姿势完全不同。你不可能让Copilot给你做跨文件重构,也别指望着Cursor每次都在命令行里安静地等着你。认清定位,才能选对工具。
2.2 我的主力组合
我自己目前的主力组合是:日常写业务代码用Cursor加Claude模型。原因很简单,Cursor对项目上下文的把握是目前做得最细的,它能把相关文件一起看,改一个函数时能自动关联调用方。快速单文件脚本直接用网页版对话(Claude和ChatGPT各有所长),问完复制粘贴。批量重构、自动化任务用Codex CLI,直接在终端里给它一个TODO,它自己列计划、改文件、跑测试。嵌入式开发则用Copilot加手动算符,这个我放在第五章细讲。
这个组合不是一开始就定下来的,是试错试出来的。一开始我也跟风用单一工具,后来发现不同工具在不同场景下的效率差异极大。工具没有高下,关键看怎么搭配。
2.3 选择工具的三个判断标准
选工具别光看宣传,我建议你用三个标准去试。
第一,上下文能力。不是看它吹的上下文窗口数字,而是看它能不能自己决定“要去读哪些文件”。很多号称128k窗口的模型,实际给你的结果还是只基于你粘贴的那点内容,因为它们不主动检索项目文件。这一点上Agent型的工具体验明显高一档。
第二,改代码的颗粒度。有的工具只会在对话框里给你贴一段新代码,你自己去替换;好的工具是直接在你打开的文件里改,改完你diff一眼。别看这个差别小,实际用下来效率差出三倍。diff一眼十秒钟,手动替换加粘贴可能要两分钟,一天下来差距就大了。
第三,报错回环。这个是我自己创造的词:工具能不能在你让它跑测试之后,把失败的报错自动圈起来,自己再改一轮。有些工具能做到“我说跑一下单测,它跑挂了自动修,修完再跑”,这个体验极其关键,直接决定你能不能放心把杂活外包出去。
3. 实操流程:把vibe coding用出效率
3.1 需求描述的四层结构
很多人觉得“AI写代码跑偏”是因为AI笨,其实八成是需求没说清。我自己后来总结了一套四层描述法,每次跟AI提需求都按这个来,准确率明显提升。
第一层:角色和目标。一句话说清楚你是谁、要什么。“你是一个熟悉Spring Boot的后端工程师,请帮我……”这种开头虽然老套,但真能提升准确率,因为模型会按照这个角色去调用对应的知识体系。
第二层:约束条件。技术栈、框架版本、已有代码结构、性能要求。“项目用的是Spring Boot 2.7加MyBatis,不要引入其他ORM,表结构在schema.sql里”。这些信息决定了AI生成的代码能不能直接跑起来。
第三层:完成定义。怎样算做完?“生成一个REST接口,包含参数校验、异常处理、日志记录,返回统一响应体,代码风格参照现有的UserController”。这一步是把模糊的期待变成明确的验收标准。
第四层:边界和禁忌。什么是不能做的。“不要改动数据库表结构,不要修改已有接口的URL,不要引入新的依赖”。没有这一层,AI会自作主张地帮你“优化”掉一些不该动的东西。
你看,这四层写完,其实你已经把80%的“码农工作”做完了,剩下的就是让AI填肉。这也是为什么我说vibe coding不降低开发门槛——它只是把你的精力从语法细节里解放出来,放到了需求分析和方案设计上。
3.2 一个完整的vibe coding工作流
拿我最近做的一个数据导出功能举例,整个vibe coding的过程是:
第一步,我先自己画了一遍数据流:从前端收到导出请求到后台查询数据库,然后组装数据集、写Excel、上传到OSS、返回下载链接。画完这个流程,我把这段描述贴给Cursor。
第二步,AI生成了一版代码,我扫了一遍,结构和我想的差不多,但它直接在Controller里写了业务逻辑,没有分层。我让它按Service层拆开,它马上重写。
第三步,我让它跑单测。跑了之后有个空指针,AI自己看了堆栈,在异常日志里补了判空,重新跑通了。整个过程它还会跟我说明自己改了哪里、为什么改,这个透明度比代码本身更有价值。
第四步,我让它顺手把日志加上了:导出开始、条数、耗时、失败原因。这属于“应该有的但需求里没写”的部分,AI虽然不会主动加,但你提了它就能补得很完整。
整个过程大概四十分钟,其中我真正写代码的时间不到5分钟,剩下时间都在描述、审查、纠偏。你看,这就是vibe coding的真实效率提升——不是代码写得快,而是把“来回沟通确认”这种隐性成本压缩了。而且这件事还有个额外的好处:因为整个沟通过程有记录,我事后还能回看当时的决策背景,写技术方案文档的时候直接拿来用。
3.3 上下文管理的核心技巧
用AI编程,上下文比模型能力更重要。模型能力再强,你没有给它足够准确的项目信息,它的输出就是无源之水。管理上下文我自己有三个习惯:
第一,小步提交。一次只给AI一个小任务,而不是让它一口气实现整个功能。一口气的后果是你很难定位它哪里错了,而且它的长上下文会越来越乱。控制每次任务的改动量在200行以内,体验会好很多。这就像你让实习生干活,一次交代一件事,他做得又快又好;一口气交代三十件事,他一定搞砸。
第二,持续喂反馈。AI不是一次就能写对的,你要在同一个会话里不断给它纠偏。“不对,这里应该用懒加载而不是全量加载;对,这样好多了;这个地方还是不对,因为XX情况下会溢出……”你给的反馈越具体,它在这个项目里就越接近一个“懂你的协作者”。这个反馈积累下来,效果惊人——同一个项目里,AI第十次给你的代码质量和第一次完全是两个水平。
第三,善用项目文件。别把需求写在对话里就不管了,把项目里已有的README、接口文档、样式规范喂给它,甚至让它先总结一遍项目结构再开始干活。AI对你项目的理解深度,和你喂给它的信息量成正比。我们有句话叫“垃圾进垃圾出”,在AI这里同样成立。
4. 避坑指南:vibe coding最常见的几个大坑
4.1 陷阱一:盲目相信AI生成的错误代码
AI生成代码最大的危险不是“写得不好”,而是“写得像模像样”。如果你没有足够的代码功底,很容易被它带进沟里。我遇到过最典型的一次:AI生成了一段HashMap并发修改的代码,看起来挺合理,跑起来偶发死循环。这种问题单靠读代码很难发现,必须有基础的并发知识才能意识到“HashMap不是线程安全的”。
所以我的原则是:凡是涉及并发、安全、性能的关键路径,AI生成之后必须做三轮检查。第一轮看逻辑对不对,第二轮看异常路径完整不完整,第三轮手上必须有个压测或者单测验证。三轮下来,基本能挡掉九成以上的隐性炸弹。
4.2 陷阱二:上下文窗口被无效信息挤爆
大模型上下文是有限的,你聊天记录越长,它对最新需求的注意力就越容易漂移。我见过有人一个会话用了三天,最后AI开始答非所问,因为前面积累了几百轮没用的对话,真正的需求被淹没在闲聊里。
我的做法是:每个子任务开新会话,把关键的项目信息用一段“项目摘要”固定下来,每次都贴同样的摘要。这段摘要包括:项目用途、技术栈、目录结构、关键约定。虽然每次都贴有点烦,但它保证了每个任务的起点是干净的。这就像每次开工前把工具台清理一遍,虽然多花两分钟,但干活的时候绝对不会摸到脏工具。
4.3 陷阱三:把报错堆栈原样扔给AI
不少新手遇到编译错误直接把终端里的几十行堆栈全贴给AI,AI看得云里雾里,给的修复建议也不对症。我建议你先自己看一眼报错,从中提炼出核心信息再问AI。
举个实际例子,有一次我遇到一个链接错误,如果把整个make输出的几百行都贴过去,AI根本不知道重点。我自己先确认了“是链接阶段缺符号”,然后问AI“链接阶段报undefined reference to xxx,项目用的是CMake,最近把某个依赖升级了版本,可能是什么原因?”这个问法,基本一次就能命中。为什么?因为你自己先做了问题分类,把“模糊的报错”变成了“明确的问题域”,AI只需要在“链接”这个范围内找原因,难度直接下降一个量级。
4.4 陷阱四:让AI碰生产环境
这个坑我踩过两次,代价都很大。一次是让AI优化一个生产数据库的索引,它根据网上的通用经验加了个复合索引,结果导致另一个高频查询走了全表扫描。另一次是让AI改一个部署脚本,它把超时时间从30秒改成了5秒,“优化”完的结果是服务上线后频繁重启。
现在我的铁律是:AI生成的东西,先在测试环境完整验证一遍,确认没有副作用之后再考虑上线。涉及生产环境的话,宁可自己手动改,也别让AI“顺手”碰。这不是说AI能力不行,而是它没有你掌握的运行环境信息——不同团队、不同业务的“坑”是不同的,AI无法感知。
5. 嵌入式vibe coding:特殊场景的特殊玩法
5.1 嵌入式场景和Web开发的区别
嵌入式vibe coding之所以特殊,是因为它和常规应用开发有三点核心区别。这三点如果不理解,你会被AI坑得很惨。
第一,上下文来源完全不同。Web开发的项目上下文在README和代码注释里,AI能理解;嵌入式的上下文一半在芯片手册、寄存器定义、时序图里,AI的训练数据里反而杂而乱。你让它写一个I2C驱动的初始化代码,它可能给你写出一个完全没见过这种外设的芯片的代码。
第二,错误反馈链路极长。Web开发跑挂了有堆栈,有日志,有监控;嵌入式跑挂了往往就是芯片复位,没有任何日志,没有任何定位线索。AI特别善于在没有信息的情况下“编造原因”,这是最危险的——它会给你一个逻辑自洽但完全错误的解释,而你几乎无法分辨。
第三,代码审查难度大。并发、时序、中断嵌套这些在嵌入式里全是硬约束,AI生成的代码从语法上看完全没问题,但实际跑起来就是不对。因为硬件行为有很多边界情况,是代码本身表达不了的。
5.2 嵌入式vibe coding的正确姿势
基于上面三点,我总结了一套嵌入式场景的vibe coding玩法,这实测下来颇有些心得。
第一,只让它写“纯函数”和“状态机表”。协议解析、CRC计算、查表、字节序处理这些没有外部依赖的逻辑,AI写得又快又准。但涉及寄存器操作、中断服务函数这类和硬件强耦合的部分,建议你自己写,或者让它在你写的框架上小改。
第二,给它喂芯片手册的针对性内容。你不用把整个手册喂进去,但可以把关键寄存器章节摘出来贴给它,告诉它“你是这个芯片的驱动工程师,现在要配置UART的波特率和中断”。有了寄存器级的信息,AI生成的初始化代码可用性大幅提升。
第三,在你自己搭的“骨架”里让AI填函数体。嵌入式项目的模块划分、接口定义、数据流向你自己定好,然后让AI只负责实现每个.c文件里的具体函数。这个模式我实测最稳,因为架构是你定的,AI的发挥空间被限制在可控范围内。
5.3 一个真实的嵌入式vibe coding案例
前阵子我帮朋友调试一个传感器读取的裸机程序,芯片是STM32F103,传感器是I2C接口的。朋友用AI写了一段状态机来驱动I2C读取,语法完全正确,但跑起来总是在读取阶段卡死。
我接手后没让AI直接改代码,而是先让它把I2C时序画出来(文本形式),然后把start、stop、ack的处理逻辑和自己对芯片时序的理解对了一遍,发现AI忽略了一个细节:STM32的I2C在检测到NACK之后需要专门清BFT位,否则状态机卡在等待事件上。
这个例子说明什么?嵌入式场景里,AI写100行代码,你可能只需要改3行,但这3行恰恰是它没法从代码里学到的——硬件规格的边界行为。所以嵌入式vibe coding的秘诀就是:把硬件的边界行为当作需求的一部分显式告诉AI。“出现NACK时要清BFT位再继续”——这句话的价值,顶得上给AI喂十遍手册。
6. 日常心法与效率工具
6.1 让AI给你写Prompt
说到这个我就想笑。用AI编程最妙的一招其实是:让AI帮你写Prompt。我记得有次我懒,直接跟Claude说“帮我生成一段Prompt,用来让Cursor给我的这个Python项目补充异常处理,要求异常类型和业务场景对应”。它生成了一段特别规整的需求描述,我再拿这段描述去指挥Cursor,效果比我自己憋半天好的多。
这个套路背后的原理很简单:Prompt工程本质上也是一种“编写”,而编写恰好是大模型的强项。你需要做的只是告诉它你最终要什么效果、约束是什么,它就能帮你组织出结构清晰的需求文本。遇到需求复杂、表达不清晰的场景,这个技巧强烈推荐。我已经把它当成标准流程了——复杂需求先让AI帮你组织语言,再拿组织好的语言去驱动另一个AI实例干活。
6.2 建立你自己的“代码风格档案”
AI生成的代码默认风格是“模型训练数据的平均风格”——也就是互联网上最常见的写法。但每个项目都有自己的约定,尤其团队项目里风格不一致造成的维护成本很真实。
我的做法是建一个项目内的AI_AGENTS.md(有的工具叫rules文件),里面写清楚:本项目的目录结构和模块职责;命名规范(比如Controller后缀、Service接口命名、数据库字段下划线);错误处理约定(统一异常类、禁止吞异常、日志级别选择);代码风格偏好(比如拒绝Lambda嵌套、DTO用record还是class);常见坑和已踩坑列表。
这个文件看起来像给AI的“入职手册”,实际上也帮了后来加入团队的人。你可以把它当成团队里一份活的开发规范,AI每次干活之前都会反射性地读一遍,生成结果明显更贴合项目。这份文件的维护成本很低,但带来的收益是持续性的——它等于把你的团队经验“固化”下来喂给了AI。
6.3 把AI当结对编程伙伴,而不是打字机
最后聊一个心态问题。很多人把AI当成“高级打字机”:我说需求,你给代码,我复制粘贴走人。这个用法也能出活,但你永远体会不到vibe coding真正爽的地方。
我现在的用法是把AI当成结对编程的伙伴,会跟它“讨论问题”——“你觉得这里用状态机好还是直接if-else?”“这个接口要不要加缓存?”AI的答案不一定总是最优,但它的分析过程经常能给你打开思路,从你没想到的角度给出参考。很多时候,我并不是真的采纳AI的建议,而是通过跟它讨论理清了自己的思路。
这个习惯还有个意外的好处:把决策背景记录下来。AI在跟你对话时说的那些“为什么选这个方案”的理由,就是你以后写设计文档、做code review时最好的素材。别人问你“当时为什么这么设计”,你不用翻聊天记录,AI已经帮你组织好了答案。
7. 如果从零开始:给新手的入坑路线
7.1 五步走的学习路线
看完全文如果你准备试了,我建议你按这个路线入坑,别急着一步登天。
第一步,先用网页版对话体验“描述需求生成代码”的感觉,选一个你最熟的领域写点小工具,比如批量处理文件、转个格式。这一步是建立“AI能写到什么程度”的认知。
第二步,装一个IDE内补全类型的工具,让它辅助你写日常代码,先适应“人写加AI补”的模式。注意在这里你依然是主力,AI只是提词器。
第三步,升级到Agent型工具,用一个小项目完整走一遍“描述生成改代码跑测试”的循环,感受上下文管理的必要性,体会“需求没说清AI就乱写”的挫败感,再体会“需求说清了AI就像开挂”的爽感。
第四步,开始训练自己的代码审查能力:每段AI生成的代码,强制自己逐行过一遍,找出至少一个问题再让它改。这个习惯养成之后,你就不再是“AI的助手”,而是真正在“使用AI”。
第五步,学会建规则文件和项目摘要,你会发现AI输出质量会再次上一个台阶。到此为止,你已经可以算是合格vibe coder了。
7.2 避坑的三个入门忠告
写代码这件事上,我从不建议“完全信任”AI。入坑初期最该注意的三件事:
一是永远保留备份和版本控制。AI改代码可能会把你的好代码误删,Git可以让你从容回滚。没有版本控制之前,AI帮你改代码就像在雷区走路。
二是别让AI碰生产环境。它生成的部署脚本可能有隐蔽的权限问题、路径差异,先在测试环境验证。这个坑我上面提过,这里再强调一次,因为它真的非常容易踩。
三是遇到不懂的代码,先问清楚再让它改。你让AI改一段你完全看不懂的代码,是在给自己埋雷。最好按下“运行前解释”这个按钮——现在的工具一般都有这个能力,它会先告诉你“这段代码在做什么,我准备怎么改”,你确认它听懂了你才能放心。
8. 写在最后:vibe coding的边界与未来
文章写到这里,实操层面的东西都讲完了。最后说点个人感受——这部分没有标准答案,但我觉得对正在观望的人是重要的。
我用了大半年AI辅助编程,最大的体会是:AI不是替你写代码,而是替你挡掉那些“没意思的代码”——CRUD、模板、脚手架、重复性的数据处理。它把这些杂活接过去之后,你终于有精力去想那些真正有意思的问题:架构怎么设计、边界怎么定义、性能从哪里优化。
但它的边界也很清楚。那些最难的决策——系统边界、耦合与内聚、并发模型、安全模型——本质上不是代码问题,是工程判断。AI能帮你算出方案,但一个方案合不合适你的业务、你的团队、你的成本结构,这些只能靠人来做判断。这就像AI能帮你算出导航路线,但走哪条路是你自己的选择,因为只有你知道路上的风景和危险。
我在实际使用中还有个很深的感觉:vibe coding用得好的人,从来不追新工具。他们追的是“如何更清晰地把需求描述清楚”和“如何更有条理地审查别人的输出”。工具会换代,这两个能力不会。
如果有一天你也能做到“用自然语言表达想法像写代码一样严谨”,那不管AI工具怎么迭代,你都是吃这碗饭的人。这大概就是vibe coding给我最大的礼物。它会一直迭代下去,但“判断力”永远是你的核心竞争力。