1. vibe coding 到底是什么:从一个周末原型说起
大概每个程序员都有过这样的周六:早起泡了杯咖啡,脑子里突然冒出一个工具需求——把同事们散落在飞书文档里的周报自动汇总成一份 Markdown 报表,省得每周五下午手动复制黏贴。放到两年前,我得先搭个 Python 脚本、处理鉴权、写解析逻辑、再做个简陋的 web 页面,一套搞下来一整天没了。而在 2025 年初,我打开终端,把需求用大白话敲给 AI 编程助手,十分钟后一个可运行的版本就躺在屏幕上。这就是 vibe coding——一种"用自然语言做产品经理,让 AI 当主力打工人"的编程方式。
vibe coding 这个词最早是 Andrej Karpathy 提的。他当时的原话大意是:你不再逐行思考代码,而是描述需求、让模型生成、再把生成的代码当作真实代码一样运行和调试,全程"跟着感觉走"。这个描述很精准,因为它的核心不是"让 AI 补全几行代码",而是把整个开发节奏从"手写"变成"对话—运行—反馈"的循环。听上去很轻松,实际操作起来却没那么简单——很多抱着玩一玩心态上手的人,第一周就会碰上一堆"AI 看起来很自信、跑起来全是坑"的情况。
这篇文章就围绕我连续三个月用 vibe coding 做真实项目的经验来写。它适合三类人:想给团队引入 AI 辅助编程的 Tech Lead,需要快速出原型又不想从零造轮子的独立开发者,以及刚接触 AI 编程、想知道该从哪入手和避坑的新手。我会把工具选型、实操流程、踩过的坑和总结出的治理手段一次讲清,保证不是那种"Copy 一段提示词就完事"的速食内容。
2. 工具链选型:为什么我最终留下的是这两个组合
2.1 编辑器内置助手 vs 独立 Agent 工具
现在市面上的 AI 编程工具大致分两类。一类是 IDE 内嵌的补全和对话面板,典型代表是GitHub Copilot、Trae、PyCharm / VS Code 里的 AI 插件;另一类是能自己读仓库、改文件、跑命令、看报错的独立 Agent,典型代表是Claude Code、Cursor 的 Agent 模式、开源的AI Agent 框架。两者不是替代关系,我的使用感受是:日常小改动用内置助手,效率和顺手程度最高;涉及多文件重构、跨模块排查、从零搭项目时,独立 Agent 的上下文理解能力和连续操作能力明显更强。
我一开始只用 Copilot 做行级补全,后来切到 Trae 和 Claude Code 做项目级生成,体验是"质的飞跃"。原因很简单:行级补全帮你省掉的是打字时间,而 vibe coding 帮你省掉的是"查找—阅读—修改—验证"整个循环。这个循环占开发时间的比重通常在七成以上,所以工具的上下文能力比生成速度更重要。选型时不光要看它"写代码多快",还要看"它对项目结构理解多深、能不能自己发现问题并修复"。
2.2 我测试过的几套方案与最终组合
这一节直接上结论。我拿同一个"内部项目周报汇总工具"分别跑了以下组合,记录项目从零到可以实际使用的时间:
| 方案 | 环境 | 从零到可用耗时 | 跑通率 | 我的评价 |
|---|---|---|---|---|
| Copilot + VSCode | 本机 | 约 2.5 小时 | 60% | 可靠但偏保守,适合做传统辅助 |
| Trae + AI 对话 | 本机 | 约 40 分钟 | 75% | 对中文需求理解好,内置模型集成省心 |
| Claude Code + Claude 模型 | 本机 / 远程 | 约 25 分钟 | 85% | 上下文最长,复杂重构最稳,但需要配好 API |
| Cursor 的 Agent 模式 | 本机 | 约 35 分钟 | 80% | 交互友好,评审界面我在用,适合做 Code Review |
| 自建 URL 网关 + 开源模型 | 服务器 | 一天起步 | 60% | 数据安全可控但折腾,性能一般,不推荐新手 |
最终我日常用的组合是Claude Code 做主力开发 + Cursor 做人工评审 + Trae 做小修补。特别说明一点:工具体验迭代非常快,上面这个组合只是我个人在稳定使用三个月后的偏好,不代表我用过的工具里谁"最厉害"——你在选择时关键是确认自己的卡点在哪里:是跨文件理解能力?是人类可读性?还是安全合规?
2.3 本地部署的纠结与取舍
有些团队因为数据管控要求,问我要不要本地部署 7B、14B 的模型做辅助编程。我的实测结论很直接:目前本地小模型写业务代码还差一口气。比如一个简单的 CRUD 接口,本地 14B 模型勉强能搭出骨架,但遇到"根据登录用户角色动态过滤数据权限"这类稍有业务语义的需求,生成结果的可用率就断崖式下跌。而云端商用模型的上下文窗口大、理解力强,综合下来还是香得多。
如果确实有数据合规压力,我建议采用折中方案:对不含敏感信息的公共模块代码走云端模型,涉敏模块走"人工写框架 + AI 单点补全"的半辅助模式,同时把项目里的密钥、内部域名、用户信息全部用占位符替换后再交给 AI 处理。这个实操思路比死磕本地部署靠谱得多,既拿到了 AI 的提效,又守住了底线。
3. 一个完整的 vibe coding 实操流程:从需求句到可运行项目
3.1 先把需求"喂"成 AI 能理解的样子
很多人上手 vibe coding 的第一个失败点,是对着 AI 只说一句"帮我写个周报汇总工具",然后抱怨 AI 写得不对。真实项目里的需求从来不会这么简单——用户用 Excel 还是飞书?每人每周交几篇?汇总后按什么排序?异常格式怎么处理?你不想清楚,AI 就替你随便想,那结果必然不是你要的。
我在实践中养成了"需求五要素"的提示词模板,每次喂给 AI 之前先自己填充:
- 目标:项目要解决什么问题,面向谁使用;
- 输入:数据的来源、格式、文件位置、字段示例;
- 输出:最终给到用户的界面/文件/接口长什么样;
- 约束:技术栈要求、运行环境、性能指标、代码规范;
- 边界:明确不做哪些事,哪些场景不接受。
拿周报汇总举例,我的提示词开头部分是这么写的:"这是一个 Python + Streamlit 的内部工具,目标是把 /data/reports 目录下所有 Markdown 周报合并成一份总览页面。每份周报有固定的 YAML 头(作者、日期、项目名),正文里有'本周完成''下周计划''阻塞事项'三个二级标题。输出页面需要按项目分组,并标记每个作者是否包含本周完成部分。暂不支持图片和表格,直接在页面上渲染 Markdown 文本即可。"
这五要素看起来笨重,但实际上 AI 帮你省的是实现细节,绝不是需求分析。需求写得越清楚,后面迭代的轮次越少,体验越接近"神话里的一键生成"。
3.2 对话式生成的正确节奏:小步快跑
vibe coding 里最容易走偏的做法,是想一次性让 AI 生成一个完整系统。比如"给我做一个带用户系统、权限管理、数据库、后台管理、通知服务、报表模块的 CMS",这种提示词扔给任何模型都只会得到一堆华丽的垃圾——因为需求粒度太大,模型只能按教科书模板拼凑,一旦业务细节和你想象的不一样,返工成本极高。
正确做法是把项目拆成10~30 分钟内能验证的一个个独立功能,逐个对话生成、逐个运行验证。以我的周报汇总工具为例,实践中的开发顺序是:
- 先用一个脚本遍历目录、读取 YAML 头、输出结构化 JSON;
- 把 JSON 转成 Streamlit 页面,先能显示本周完成部分;
- 加项目分组和统计计数;
- 处理异常文件格式和空报告;
- 最后加导出 Markdown 的功能。
每一步的对话都非常短。第二步的提示词可能是:"上一步输出的 JSON 结构是 [{author, date, project, done, plan, blockers}],现在帮我把这个 JSON 用 Streamlit 渲染成一张卡片列表,卡片按 project 分组,每个作者显示 done 和 blockers,页面顶部显示总报告数和缺失报告数。"每轮对话只解决一个具体问题,AI 的表现会稳定得多,你也能在每轮之间快速判断方向是否对。
3.3 让 AI 自己跑起来:运行、报错、修复的闭环
vibe coding 和传统"用 AI 查代码"最大的不同,是AI 要能自己运行项目并读取报错。我在用 Claude Code 时,会直接把报错信息贴回对话,或者让 Agent 自己执行 pytest。这个环节对工具的 Agent 能力要求最高——它得能从报错堆栈里定位是逻辑问题、环境问题还是依赖问题,然后自己修改。
举个例子,我有个项目在 Windows 上跑得好好的,放 Linux 服务器上就报PermissionError。传统做法可能是查半天文档,而 vibe coding 的做法就是把报错原文丢给 AI:"这是 Linux 部署时遇到的报错,帮我分析是不是文件权限或路径分隔符的问题,并直接修复。"模型会从五六个候选原因里快速筛选,给出补丁并解释为什么改。老实说,这种"AI 帮你白盒化排错"的效率提升,比代码生成本身更让我上瘾。
跑通之后,还有一件很多人忽略的小事:让 AI 顺手写一个README和若干单元测试。AI 在项目上下文清晰时写的测试覆盖率远超大部分开发者的日常水平,这些测试在后面迭代时就是你的安全网——AI 不会记得它昨天给你生成过什么,但测试代码会。
4. 踩坑实录:AI 写代码时有四种"看起来很对"的坑
4.1 幻觉型依赖:装了个不存在的 Python 包
我踩过最经典的一个坑,是让 AI 写一个解析 PDF 表格的脚本,它在代码里引入了pdf-table-extractor。结果一跑,报错ModuleNotFoundError。我顺手查了 PyPI,发现这个包根本不存在——典型的模型幻觉。它不只是编包名,还会编 API 签名、编函数参数、编返回结构。
后来我养成了两个习惯。第一,每轮 AI 生成代码后,我不急着直接跑,先扫一眼 import 部分,对照产品实际 API 确认关键依赖存在;第二,实在拿不准就用pip index versions <包名>验证版本,让命令帮我把关。这个习惯帮我避免了很多看似是代码问题、实则是"假依赖"的深夜排错。
4.2 隐性依赖污染:AI 觉得"这样很合理",但项目不这么想
如果说幻觉型依赖是明坑,那隐性依赖就是暗坑。AI 在处理代码时,往往倾向于使用它记忆里最常见的库和范式,而不是你项目里既有的范式。比如我有一个仓库用的 FastAPI + Pydantic v2,结果 AI 在一段独立脚本里默默用了 Pydantic v1 的validator写法,代码单独跑没问题,一合进项目就直接报类型校验错误。
这种坑的可怕之处在于:你光看代码根本发现不了问题,只有测试或者运行时才会炸。我的对策是两条:一是项目根目录放一个PROJECT_CONTEXT.md,把技术栈、关键依赖版本、目录结构、常见约定写得清清楚楚,每次开新会话先在提示词里让 AI 读它;二是常备一把git diff的评审习惯,AI 改动的代码必须人工过一眼,重点不是语法而是"它有没有引入项目中没有的新模式"。
4.3 高智商低判断:对不存在的需求过度设计
AI 的另一个毛病是,需求有一点模糊,它就自动往完整企业级方案上靠。我让它给内部小工具加"按项目筛选",结果它顺手引入了完整的前端路由、状态管理、数据库迁移脚本。这不是能力问题,而是它在训练数据里见过太多大型项目,对过度的默认偏好根深蒂固。
对付这个问题,我在提示词里现在固定加一句:"只做需求描述的功能,不要做任何额外扩展;不要引入数据库或框架,除非我明确要求。"另外我会在需求描述里带上"内部小工具""一次性脚本""仅限单用户使用"这样的定性词,让模型明白这次不是在做千万级用户产品。
4.4 重复代码的漂移:AI 不会记得它写过的历史
用 vibe coding 做项目,有个特性你很快就会意识到:AI 每次对话都在重新生成"新的它"。它不会记得上一个问题里给出的代码细节,除非你把上下文喂给它或者让它在同一会话里连续改。所以项目做到第五轮时,"同一个分页逻辑"可能会出现三个不同写法,分布在三个文件里。
解决方法是分层的:第一步,坚持同一个会话内做完整功能,不要频繁新开会话继续开发;第二步,重要公共逻辑主动抽到utils/模块,并在项目上下文文档里注明"分页请使用 utils/pagination.py,不要新写";第三步,代码评审时带一个"查重"的视角,简单的grep关键词就能发现有没有第二个def paginate出现。这套方法我用下来,把 AI 带来的重复代码量降低了至少一半。
5. 让 vibe coding 的产物真正可用的治理手段
5.1 强制"提交前评审"清单
没有任何护城河的 vibe coding 等于裸奔。我在项目里给自己定了一个提交前五连问清单,每次 AI 完成一段功能、准备提交代码前我都会过一遍:
- 依赖是否真实存在且版本可锁定;
- 是否引用了项目上下文文档之外的新框架或新路径;
- 是否修改了与本次需求无关的文件;
- 是否处理了异常输入和明显边界条件;
- 单元测试是否通过,新增的关键路径有没有测试覆盖。
这五项看着基础,但作用极大。因为 AI 生成的代码最薄弱的地方不是正常流程,而是异常处理和副作用控制。一个能跑通 happy path 的 AI 代码可能完全没有想过"如果上传的文件是空文件怎么办""如果用户传的参数包含引号怎么办"。把这些问题放进评审清单,等于给 AI 的乐观加了点悲观。
5.2 用 AI 做 AI 的评审:人机交叉验证
用 vibe coding 一段时间后,我的评审流程也升级了:当代码量较大时,我会让 Cursor 的 Agent 模式通读整包改动,专门挑"AI 生成代码常见问题"。这轮评审只审查不修改,输出问题清单,我再逐条决策便宜行事。交叉验证的逻辑很简单:不同模型训练数据不同、偏好不同,A 模型生产代码时容易犯的错,B 模型往往能一眼识破,因为它们看待代码的"偏见"不一样。
我见到效果最明显的一次,是 A 模型写了一个定时任务模块,B 模型在评审时指出:任务函数里用了默认的cron表达式,但这个表达式在同一会话里已经被前面某个功能占用过——如果两个任务同时调度,后注册的那个会覆盖前一个。这个坑如果不是交叉评审,我大概要到月底看调度日志才能发现。所以我的实际建议是:让两个不同厂商的模型互相审代码,比让任何单一模型的"自我评价"都靠谱得多。
5.3 项目上下文文档就是你的"定海神针"
刚才好几次提到PROJECT_CONTEXT.md,这个文件的价值我再展开说。vibe coding 面临的一个残酷事实是:AI 对话有长度限制,项目一复杂,前面的约定和决策就超出上下文窗口了。此时,能让 AI 在这个窗口内保持"项目一致性"的,只有外部文档。
我的项目上下文文档通常包含:
- 项目目录结构和各模块职责;
- 技术栈和关键依赖版本,包括"禁止使用 XXX"的清单;
- 代码风格约定(命名、格式化、注释语言);
- 已知的坑和规避方法;
- 常用操作的典型做法,比如"新增 API 时先查询数据库再更新缓存,顺序不能反"。
每次和 AI 建立新会话时,我第一句话就是"请先阅读根目录的 PROJECT_CONTEXT.md,然后基于此文档完成以下任务"。这个动作的成本几乎为零,但防止 AI 在项目认识上的漂移非常有效。如果你还在抱怨"AI 每次都不按套路出牌",先检查一下自己的项目有没有这么一份让 AI 学规矩的文件。
6. 关于团队协作和"AI 是否取代程序员"的一点现实思考
6.1 不同经验水平的开发者,用 vibe coding 的效果完全不同
我观察过团队里不同成员用 AI 编程辅助的结果,差异大得很。老手用 AI,是把它当高速实习生:先拆需求、定验收标准、审代码、写边界测试,AI 负责干体力活,产出物质量稳定。新手用 AI,则很容易被生成结果带着走——AI 说"我改了 A 文件解决这个问题",新手可能连 A 文件在哪、改了什么都说不清,更不用说判断 AI 是不是在一个隐藏的 B 文件里又动了手脚。
结论其实很朴素:vibe coding 不是降低编程门槛,而是降低编程阻力。它把打字、查找、接口衔接等体力活变轻了,但"判断方向、评估风险、定位问题根因"的能力依然是决定项目成败的核心。我问过自己一个问题:"如果完全不懂代码的人用 AI 能不能做出生产级项目?"目前我的答案是否定的。因为他在项目第三周遇到一个诡异的并发问题时,AI 递过来的十个方案他一个都判断不了——而真正的编程功夫,恰恰就体现在这种"选一个方案并承担后果"的时刻。
6.2 我个人的工程纪律与工作边界
最后聊聊我现在的日常习惯。我用 vibe coding 做所有能做的活,但有个明确边界:涉及金钱、权限、数据安全的代码,AI 只负责生成框架,最终合并必须由我逐行审查并补全测试。没有例外。另外,我会给 AI 生成的重要代码打上// AI-GENERATED的标记,这不是歧视,而是为三个月后的自己着想——等出问题时,能快速知道这段代码的上下文来源,排查路径会短很多。
我不追求"AI 写 100% 的代码"这种极端状态,更不追求"全程零人工"。真正的节奏是:人和 AI 在一个循环里互相纠偏,人负责判断"该往哪走",AI 负责大踏步赶路。每折腾完一个新功能,我都会花十分钟让 AI 顺手把相关文档和变更记录更新一下,这件事在传统开发里最磨人,在 vibe coding 里反而成了最轻松的收尾动作。
6.3 下一步我可以往哪个方向扩展
就我当前手上的项目来说,接下来想让 AI 辅助的包括:自动化生成更多模块的单元测试,用 AI 定期扫描代码库里的重复实现并用重构建议拉一次分支,以及把之前验证过的提示词模板沉淀成团队内部可复用的规则集。这类扩展会让我离"AI 辅助的工程化"更近一步,而不是停留在个人玩具项目阶段。
如果你刚开始尝试,我的建议是:别急着把整套工具都上齐,先挑一个你每天都用的编辑器,装好 AI 插件,然后选一个真实但低风险的小需求走一遍"提示词 → 生成 → 运行反馈 → 修错"的循环。试过一次完整闭环之后,你对 vibe coding 适合做什么、不适合做什么会有远比看文章多得多的体会。毕竟这是一种只要上手五分钟,就能直观感受到生产力的技术,而它的深水区,也正是从你真正用它写完第一个完整功能那一刻才刚开始的。