
先聊个我自己最近的遭遇。上个月我想给工作室的运维群写一个自动巡检脚本放在以前我至少要花一个晚上翻文档、试接口、补异常处理。但这次我用自然语言把需求完整描述给AI四十分钟就拿到了能跑的原型。说不震撼是假的。然而震撼归震撼紧接着就翻车了同一个周末我想用同样方式做一个带登录和权限控制的博客系统折腾了两天最后代码乱成一锅粥只能推倒重来。差距到底在哪我当时以为是工具不够聪明后来才意识到问题出在我说话的方式上。vibe coding这个词被吹得很玄公众号把它说成躺着用嘴写代码实际接触下来它远没那么轻松但也没那么神秘。它不是偷懒姿势而是一套用自然语言驱动开发的方法论你负责把意图、边界、验收标准说清楚AI负责生成实现细节。工具只是其中一环真正拉开差距的是你组织需求、维护上下文、验收结果的整套习惯。这篇文章就围绕这个主题展开我会把工具怎么选、全局MD文档怎么维护、自然语言描述怎么练以及我踩过的实实在在的坑一次讲透。1. 先想清楚vibe coding到底解决什么问题1.1 从一次翻车经历说起开头提到的博客系统翻车其实是很多人的共同经历。我当时是怎么做的我打开AI编程工具直接甩给它一句帮我写一个博客系统要有用户登录、文章管理、分类标签、评论功能。AI很热情哗啦啦生成了一堆文件。当时看着代码一行一行往外蹦确实有种生产力大解放的幻觉。等我真的跑到登录接口时才发现用户系统的密码哈希校验用的是旧版API文章表的外键关系建错了评论功能甚至没有权限校验。更要命的是我让AI修复问题时它为了迁就我随口说的把评论改成支持Markdown把整个数据模型推倒重写了。现在复盘这事儿的核心问题不是AI不聪明而是我压根没告诉AI完整的项目背景、技术约束和验收标准。我给的是一句口号不是需求描述。vibe coding的第一课就是AI不是读心术你给了模糊的输入它只能回给你模糊的输出。1.2 vibe coding的准确定义和常见误解vibe coding这个词最先是Andrej Karpathy提出来的原意是描述一种跟着感觉走、让AI写代码的体验。原话大概意思是你顺着那股劲儿看到什么就说什么代码生成得差不多就行甚至不太需要逐行读。但中文互联网对这个词的演绎往往把它等同于不懂编程也能造产品。这里我可以负责任地说一句完全不懂编程的人用好vibe coding的概率比想象中低很多。因为你需要能看懂报错、能判断AI是否在胡说、能做需求拆分、能设计出合理的目录结构。这不是说你必须能手撕红黑树但你至少得具备基本的工程判断力。真正的vibe coding应该理解为用对话驱动开发流程——人和AI协作的分工变了而不是人彻底退场。1.3 人机协作的分工边界我把vibe coding中人和AI的分工总结成一句话人负责要什么和怎么验收AI负责怎么写和怎么改。具体拆开来看——人要做的是定义项目边界、拆解用户流程、设定技术约束、判断输出质量。AI要做的是写代码、做重构、补测试、查文档、生成迁移脚本。这个边界一定要清晰。好多人翻车是因为把怎么写的决定权也甩给了AI比如你自己看着选数据库吧你觉得怎么方便怎么来。这种开放式的授权短期内看起来很快实际上是在给后面的维护埋雷。AI会基于它的训练数据做默认选择而这些默认选择不一定符合你的项目约束。2. 主流AI编程工具怎么选从编辑器型到Agent型2.1 工具分类编辑器内嵌型与终端Agent型市面上的AI编程工具看似五花八门但本质上就两类。第一类是编辑器内嵌型典型代表是GitHub Copilot、Cursor、Windsurf。它们的运行方式是把AI能力嵌入到你熟悉的IDE里你在写代码时它能自动补全、聊天改代码、选中代码片段做重构。适合习惯在IDE里工作、喜欢边看边改的开发者。这类工具更像副驾驶方向盘还在你手上。第二类是终端Agent型典型代表是Claude Code、Codex CLI、Gemini CLI也包括最近很火的一些开源Agent框架。它们的运行方式是在终端里以Agent身份接管项目能自己读文件、跑命令、看测试结果、迭代修改像一个真正在执行任务的外包工程师。这类工具的核心体验是你下命令它干活适合任务边界清晰、执行链条长的场景。2.2 主流工具实测对比我自己在真实项目里把这几个主流工具都跑过一段时间下面这张表是基于我个人体验的直观对比不一定代表官方指标但对选型参考足够了。工具类型擅长场景短板适合人群GitHub Copilot编辑器内嵌代码补全、局部修改、pair programming对整个项目的上下文理解偏弱已有IDE习惯想提升单码效率的开发者Cursor编辑器内嵌/Agent混合多文件编辑、快速原型、项目级理解大项目下上下文管理容易混乱重度使用AI的独立开发者、前端工程师Windsurf编辑器内嵌/Agent混合多文件批量编辑、对话驱动生态和插件数量不如VS Code成熟喜欢对话式操作但不脱离编辑器的人Claude Code终端Agent复杂任务拆分、自动读项目、跑测试、修bug需要较清晰的命令行习惯收费偏高后端工程师、全栈工程师、API集成场景Codex CLI终端Agent沙箱执行、多文件agent任务和系统工具的集成深度受限喜欢OpenAI生态、命令行开发的工程师值得注意的是Cursctor这类编辑器型工具现在也在强化Agent模式终端型工具也在补编辑器体验边界在模糊。选型的核心依据不是谁的功能列表更长而是你自己的使用习惯更匹配哪一种交互方式。2.3 我的选型建议矩阵结合自己和身边同事的经验我建议按下面这套逻辑来选你平时主要靠IDE写代码不太愿意离开编辑器直接选Cursor或Windsurf优先看它在你的主力语言上的补全准度和多文件编辑能力。你是一个后端或全栈任务经常涉及读源码、改多个文件、跑测试优先尝试Claude Code或Codex CLIAgent模式对这种长链路任务收益明显。你只是需要一个辅助补全不想改变现有工作流GitHub Copilot是下限最高、最不折腾的选择。你是纯新手代码基础薄弱不建议一上来就用终端Agent型。先在编辑器型工具里把自己变成能看懂AI代码的人再往Agent型迁移。另外有个经验之谈不要同时开太多工具。我见过有的同学开三个工具来回试同一段代码结果是每个工具都给了一半建议上下文互相不连贯反而比只用一个更慢。AI编程工具的核心价值在于连续上下文切换工具会打断这个连续性。3. 真正拉开效率差距的是全局MD文档3.1 全局MD文档比prompt更重要用vibe coding一段时间后很多人会发现一个奇怪的现象同一个AI工具换个人用效果天差地别。有人能四十分钟做出一个能跑的小工具有人连一个简单的CRUD接口都要反复扯皮半小时。这中间的差距往往就在全局上下文管理上。所谓全局上下文就是AI在理解你项目时所依赖的背景知识。最开始我只给AI一句帮我写个接口AI要做大量无谓的猜测用什么框架什么目录结构数据库用啥错误处理怎么做这几轮来回拉锯时间全浪费了。后来我学会了把项目的关键信息沉淀到一份全局MD文档里不同工具有不同叫法Claude Code里叫CLAUDE.mdGitHub Copilot支持AGENTS.mdCursor里可以配置.cursorrules还有的开源项目用AGENTS.md。不管叫什么本质都是一份给AI看的项目说明书。把这份说明书放在项目根目录AI在启动时或者modify文件前会优先读取它相当于你在每次对话开始前就给AI做了一次完整入职培训。3.2 一份高质量全局文档应该包含什么我见过不少人的CLAUDE.md写了足足两千行事无巨细地把所有代码都粘贴进去。这是另一个极端。AI的上下文窗口再大也是有限的文档写得越臃肿真正重要的信息越容易被淹没。一份高质量的全局文档应该控制在100到300行之间只写那些会让AI答错的信息。根据我维护多个项目后的实际经验核心模块大致是这几块项目定位三句话讲清楚这个项目是什么、主要服务谁。AI有了定位很多设计决策它会自动往合理的方向靠。技术栈与版本框架、语言版本、ORM、构建工具、包管理器。这一块最容易出问题AI默认生成的代码常常用旧API明确版本能减少大量报错。目录结构约定告诉AI业务代码放在哪、公共代码放在哪、测试文件怎么命名。避免AI在根目录堆一堆新文件。关键设计约束比如所有接口返回统一格式错误处理走中间件禁止在业务逻辑里操作数据库。常用命令怎么安装依赖、怎么跑测试、怎么做迁移、怎么lint。AI能自己跑命令时这些信息能省下大量来回确认时间。踩坑清单把这个项目里最容易踩的坑、最容易触发的历史问题写进去。这条最关键后面专门展开说。我贴一个简化的实际例子是我一个内部API网关项目的CLAUDE.md片段# api-gateway ## 项目定位 轻量API网关用于内部微服务统一鉴权和路由转发。 ## 技术栈 - Node.js 20 TypeScript 5.x - 框架Fastify禁止使用Express - 数据库PostgreSQL 16 Prisma ORM - 部署Docker Docker Compose ## 目录结构 - src/modules/ 下按业务模块划分 - src/middleware/ 放中间件 - src/utils/ 只放纯工具函数禁止放业务逻辑 ## 接口规范 - 返回值统一使用 { code, data, message } 结构 - 错误处理统一走 middleware/error-handler.ts - 所有路由需注册在 src/routes.ts禁止在模块内自建路由入口 ## 常用命令 - pnpm dev本地开发 - pnpm test跑单元测试 - pnpm db:migrate数据库迁移 ## 踩坑清单 - 不要在鉴权中间件写死 secret统一从环境变量读取 - 网关转发超时设置 5 秒不要使用默认无限等待 - 修改路由时必须同步更新 /docs/routes.md这份文档的每一条都是我在真实项目里跟AI战斗过后总结出来的。比如禁止使用Express就是因为AI默认几轮对话后总是尝试用Express重写路由写了删、删了写非常浪费时间。把这条写进文档后这个来回直接被掐掉了。3.3 文档如何随项目迭代全局MD文档不是写一次就完事的它应该是这个项目的活文档随着项目演进不断更新。这里分享一个我觉得很实用的操作方式把文档更新本身当成一个开发任务交给AI。具体做法是在一个功能做完、代码能跑通、测试通过之后跟AI说这样一句话请根据我们刚才的改动更新项目根目录的CLAUDE.md补充新的目录结构变更和技术约束尽量不超过两百字。让AI自己总结这次改动中值得沉淀的信息。它会自动发现哦原来这个项目的环境变量新增了一个配置原来认证方式从JWT换成了session把这些更新进文档。还有一个技巧就是给AI标记哪些内容是容易冲突的。比如在文档里写## 环境变量说明 所有环境变量定义在 .env.example本文件新增变量时必须在 src/config.ts 同步注册。 环境变量读取后统一经过 src/config.ts 的 getConfig()禁止在业务代码中直接 process.env。这类约束类信息一旦被AI读取它在后续生成代码时就会主动绕开规范雷区。实测下来加上这类约束之后AI生成的代码规范性提升非常明显返工率能降一半以上。4. 自然语言驱动开发的话术体系4.1 把需求拆成AI能执行的任务全局文档解决的是AI懂项目的问题接下来解决的是AI听指令的问题。很多人跟AI沟通喜欢一次性丢一个大需求帮我做一个电商后台。这种描述AI要么给你一个极其泛化的模板要么就是开始猜。真正有效的做法是把大需求拆成一连串可独立验收的中小任务。我常用的拆分维度有三个按数据流拆数据库模型先行然后接口再页面。按用户操作拆登录注册是一批商品上下架是一批订单状态流转是一批。按依赖顺序拆先做基础工具函数再做业务模块最后做串联集成。每次只给AI一个任务完成后人工验收通过了再进入下一个。这个习惯非常重要因为它让每一次对话的可控性和可回滚性都大大提升。4.2 Prompt四要素背景、约束、验收、边界同样是让AI写一个用户列表接口两种说法差距很大。低效说法是写一个用户列表接口。高效说法是这样背景我们在做一个内部管理后台使用Fastify Prisma用户模型已经定义在 prisma/schema.prisma。 任务新增一个GET /api/users接口实现分页、按邮箱模糊搜索、按createdAt倒序排序。 约束不要改动已有鉴权中间件接口需通过中间件验证管理员权限返回结构用统一的 { code, data, message }。 验收标准字段为 id、email、nickname、createdAtpage和pageSize参数校验运行 pnpm test 全部通过。 边界本次不需要写前端页面不需要支持导出不要改数据库表结构。我把它总结成背景、约束、验收、边界四要素每次写prompt都尽量把这四块补全。这四要素的价值在于AI面对大多数编码任务最不确定的其实就是这四个维度。你把不确定变成了确定AI就能直接开干而不是边写边猜。4.3 循环工作流生成、验证、修正AI生成代码只是起点完整的vibe coding工作流应该是生成—验证—修正的循环。拿到AI的代码后我最少要做的验证动作有三步看它是否引用了不存在的模块或方法。跑一遍类型检查和lint命令。跑一遍相关测试或者干脆自己手动调一下接口。验证发现报错了不要只把报错信息丢给AI就完事把相关上下文也一并给它。比如这样说我运行了 pnpm test发现UserService.test.ts第42行报错 TypeError: Cannot read properties of undefined (reading email) 这段测试依赖的mock数据在 test/fixtures/user.ts 中定义。 请先看这两个文件找到原因并修复修复后重新运行该测试文件确认通过。给出定位线索AI修bug的速度会快很多。还有一种情况是AI修了好几次都修不好这时候不要继续对话停下来检查是否是前面的根因理解错了。正确的做法是新建一个会话把当前代码、报错日志、相关文件重新整理一遍再让AI从头分析。很多人卡壳就是因为在一个错误的会话里无限续命上下文被污染AI反而越来越笨。5. 我用vibe coding踩过的坑和排查路径5.1 AI编造接口和API这是我遇到最多的一类问题也是在vibe coding里最隐蔽的坑。AI会和你说这个功能用Web Storage API就能实现Node 20里可以直接用这个原生方法听上去头头是道实际上那个API可能根本不存在或者参数和返回结构和它说的完全不一样。我的排查链路是先不急着改代码而是让AI自己读依赖包的真实版本。比如看到AI用了一个我没见过的npm包API我会先在package.json里确认实际安装版本然后把版本号丢给AI让它基于这个版本的真实文档重写这部分代码。实测下来让AI读取node_modules目录里的实际类型定义文件比任何口头强调都管用。另外还有一个细节AI在引用第三方库时默认会使用训练数据里的常见用法而这些用法在新版本里往往已经变了。所以遇到底层库相关的代码一定要让AI先读库的类型声明文件再写具体逻辑。5.2 上下文越用越笨vibe coding用久了你会发现一个规律同一个会话里聊得越久AI的回复质量越差。前二十条消息它还能精准执行聊到后面它就开始记混了明明刚才改的变量名过一会儿就用错。这不是AI失忆而是上下文窗口被大量中间对话占满了真正重要的信息反而被挤出去了。我的处理办法有三个每个功能点尽量开新会话不要一个会话从早用到晚。开启新会话时重新粘贴或引用全局MD文档和关键文件路径。在一个功能完成后让AI输出一段本次改动总结把关键变更记录下来留作后续会话的上下文。这个习惯很朴素但真能解决大半AI越来越笨的问题。5.3 改一行崩三处的连锁破坏Agent型工具有个特点它会自己判断这个问题需要修改哪些文件然后就动手改。但AI对我代码库的理解未必准确经常会出现为了解决A问题改动了B文件而B文件又有C依赖的情况。最痛的一次是让AI修一个登录页面样式问题它顺手把鉴权接口的响应拦截器改了导致所有需要token的接口全部失效。为了降低这类风险我现在都会在prompt里加一条固定约束只修改与本次任务直接相关的文件并使用git diff先展示改动内容确认后再写入。如果工具支持dry-run模式优先使用。如果没有就要求AI在改动前先列出它打算修改的文件清单让AI在动手前先过一遍我的审批。另外git提交的频率也得提高。每次任务开始前先commit一个干净的checkpoint任务结束后如果翻车直接回滚比让AI修来修去快得多。5.4 长文件被截断的问题遇到特别长的代码文件AI很容易出现尾部内容丢失只改了前半段的问题。我曾经让AI在一个三千行的工具文件里新增一个方法结果它把文件中间的一个函数改了而那个函数我压根没让它动。原因就是文件太长AI在生成时被迫重新输出整个文件中途出现了内容截断。解决方案其实很简单拆分文件。让AI按职责把大文件拆成多个合理的小文件每个文件控制在两百行以内。这个操作看起来是在增加工作量实际上是在为后续所有AI交互降低出错概率。拆完之后AI每次只需要读写一个几百行的文件上下文压力小出错的概率也小了很多。6. 哪些项目适合vibe coding哪些坚决别碰6.1 高性价比场景经过了前面的摸索我现在对什么项目适合vibe coding已经有了一个比较清晰的判断。优先适合的是这四类一次性脚本和自动化工具比如数据迁移、日志分析、定时任务。这种脚本生命周期短迭代少AI一次成型的能力非常匹配。内部管理系统和后台原型这种系统逻辑不复杂、容错度高AI生成的CRUD代码性能足够你只需要把数据模型和权限边界把控住。个人项目和Demo验证想做MVP验证想法时vibe coding能极大地缩短从想法到可演示原型的周期。胶水代码和集成代码比如把两个API串起来、做数据格式转换、写消息队列消费者这类代码模式化程度高AI几乎是满分选手。6.2 高风险场景同时我也总结了几类我不会让AI碰的场景支付、金融、加密核心逻辑这些场景对安全性要求极高一个小小的逻辑错误就是事故。AI目前的可靠性不足以支撑这种场景的免审交付。强合规项目比如医疗数据处理、用户隐私保护相关功能需要明确符合特定规范而这些规范往往没写进AI的训练数据。性能敏感的高并发核心链路AI默认生成的代码更偏可读易改不一定考虑性能边界。高并发场景调优需要非常深厚的系统知识这不是靠自然语言聊天能覆盖的。大型遗留系统的大规模重构如果项目有十几年历史依赖关系复杂到人脑都理不清AI的全局理解能力也会严重下降。在这种项目里让AI做小范围、可验证的改变还行让它大范围重构就是给自己留定时炸弹。6.3 我现在的使用原则到现在我在项目里使用vibe coding的方式已经相对固定了可以简单总结成四个原则。第一AI负责生成人负责评审。AI给出来的代码尤其是Agent型工具自动改动过的部分我需要至少看一眼diff。不是逐行审查但关键业务逻辑、所有数据操作的地方必须确认。第二上下文先于代码。任何新项目第一次跟AI沟通时先把全局MD文档和项目结构丢给它让它先理解再动手。宁可多花两分钟在上文也不要在错误的生成上来回耗半小时。第三小步提交随时可回滚。每个任务开始前要有干净的git状态每个任务结束后尽快commit。vibe coding最大的风险不是写得慢而是叠加了一堆未经验证的改动后遇到问题难以定位。第四让AI自己保存项目记忆。每次重要功能完成后让AI把关键经验写进全局文档形成文档—执行—更新文档的闭环。文档越来越丰富AI的表现也会越来越懂这个项目。最后分享一个让我改变习惯的小细节以前我一直觉得用AI写代码的关键是选个最强的工具。直到有一次我在两个工具之间反复横跳同一个功能来回做了三遍才做完。后来我才真正想明白vibe coding这个说法里的vibe指的其实不是随性和松弛而是你与AI之间建立起的那层相互理解——就像带一个新入职的同事你前期越是耐心地把项目背景说清楚、把规范讲明白、把坑标出来后面他会越默契越不需要你事无巨细地交代。所以我的建议是别急着一次性试遍所有工具先选一个顺手的用熟把全局MD文档这份项目说明书积累起来再练习场景化描述需求。工具可以换但理解和构建上下文的能力才是真正能带走的东西。