说实话,去年年初如果有人问我支不支持Vibe Coding(氛围编程),我会直接回他一句:那是懒人才用的东西。但今年年中,我在一个几乎要开天窗的项目里被它救了一命。现在我的答案变成了:支持,而且支持得很清醒。
所谓Vibe Coding,简单来说就是“顺着氛围写代码”——你不再逐行手敲语法,而是用自然语言把意图描述给AI编程助手,它负责生成代码,你负责判断方向、审查结果、修正偏差。核心已经不是“怎么写”,而是“怎么描述、怎么审”。这个转变听起来轻松,真正做起来却藏着很多门道。我不打算站在“拥抱AI”还是“坚守手写”的阵营里去喊口号,只想把这段时间用下来踩过的坑、总结出的判断标准、以及一套能直接落地的干活流程,完整地写出来。不管你是刚听说这个概念的新手,还是已经用了一阵子但总觉得不太对劲的人,这篇都能给你一点参考。
1. 我为什么从“坚决不用”变成了“真香”:一次救场带来的转向
先讲一段真实的经历。当时我所在的团队接了个某跨平台系统的改造需求,周期被压缩到只有原来的一半,而且人手还不太够。A同学建议先用AI编程助手搭一版原型,我当时嘴上没说反对,心里却觉得这想法不靠谱——代码这玩意儿,机器生成的能看吗?但因为实在没有更好的方案,只能让他先试。
结果两天之后,他端出来一个完成度相当高的页面原型,包括接口对接、状态管理、基础样式,甚至注释都写好了。里面确实有一些小问题,比如某个边角逻辑没处理、个别命名不规范,但整体结构比很多手写代码还要工整。我拿着那份代码翻来覆去看了很久,最后不得不承认:我原来的偏见,本质上是不愿意接受“写代码这个饭碗正在被重新定义”的事实。
这件事之后我开始认真用它,越用越发现,Vibe Coding真正厉害的地方,不在于它能“替你写代码”,而在于它把开发者从打字员的位置上解放出来了。你不需要记住每一个API参数,不需要反复查文档,只需要描述清楚目标,它就能给出一个基本可用的实现,你再在这个基础上去审查、修改、完善。这个过程很像带一个聪明但没有经验的实习生:你给他交代清楚需求和约束,他给你产出一版初稿,你负责把关质量、指出问题、让他返工。最终省下的是大量机械性敲击的时间,而你真正需要投入精力的地方,变成了更值得投入的地方——想清楚需求本身、设计好系统边界、把控好质量底线。
2. 氛围编程到底改写了什么:不是让你不写代码,而是让写代码的方式变了
很多人对Vibe Coding的误解是“以后不用写代码了”。这个说法不对。准确地说,应该是“以后不用亲手写所有代码了”,但你对代码的理解能力、审查能力、调试能力,要求反而更高了。
2.1 从“语法转译”到“意图沟通”
传统编程的本质,是把你脑子里的逻辑“转译”成编程语言,编译器再把它翻译成机器指令。你花大量时间处理的是“怎么表达”的问题:这个语法怎么写、那个API怎么调、类型怎么对齐。而Vibe Coding把“怎么表达”这件事外包给了AI,你的核心任务变成了“把意图描述清楚”。
打个比方,传统编程是你自己买菜、洗菜、切菜、炒菜,每一项都是体力活;Vibe Coding是你当厨师长,AI是配菜员。你把菜谱要求说清楚——口味偏辣还是偏淡、食材切丝还是切块、哪些食材不能混在一起——配菜员负责给你配好,你最后负责下锅和调味。如果配菜员理解错了,你得能尝出来哪里不对,并且准确告诉他怎么改。
这个变化意味着两个能力变得空前重要。第一是描述能力:你能不能把一个业务需求拆成AI能理解的最小指令。第二是审查能力:AI返回的代码,你能不能一眼看出哪里和需求有偏差。这两项能力,本质上跟编程年限没有强关系,但跟“是否真正理解业务逻辑”强相关。一个刚入门的人如果连基本的条件判断、循环、数据结构都搞不清楚,他连AI生成的代码是对是错都分不出来,那才是真正的灾难。
2.2 开发流程里的角色迁移
我观察到一个很有意思的现象:同一个团队里,用Vibe Coding效率提升最大的人,不是资历最浅的,也不是技术最强的,而是“架构思维最清楚”的那批人。原因很简单——架构思维清楚的人,能准确描述目标边界;描述得越清楚,AI生成的代码越接近可用状态。
传统流程里,你拿到一个需求,先设计、再编码、再测试、再修bug。Vibe Coding流程里,变成了:先设计拆分、再逐块生成、再全面审查、再针对性返工。表面上看步骤差不多,但每个环节的重心变了。编码环节被压缩到几乎可以忽略,审查环节被放大到核心位置。
我自己的时间分配大概是这样:需求分析占30%,写提示词和拆解任务占20%,审查和修改AI产出占35%,回归测试占15%。以前刚好反过来,写代码要占一半以上时间。让AI把你要的逻辑“定”出来。
2.3 一种“半自动化”的工作状态
还有一个很多人没注意到的点:Vibe Coding会改变你的工作节奏。手写代码的时候,你处于“持续高度专注”的状态,写一会儿就要休息,因为脑力消耗很大。而和AI协作的时候,你更像是在“指挥+审阅”的模式里切换——你不需要持续输出,只需要阶段性介入。
这种模式有个好处,就是你可以同时推进多条线。比如我在等AI生成一个模块的时候,可以同时思考另一个模块的边界条件,或者去写测试用例。整体下来,同样的时间能覆盖的工作量明显变大。但也有个坏处:如果你不主动给自己设边界,很容易陷入“无限返工”的状态——AI生成一版,你觉得不够好,改一改提示词再生成一版,来回折腾五六次,时间反而比手写更贵。所以一定要给每个生成任务设定一个明确的“接受线”——质量达到什么程度就收手,不要追求完美,留到下一轮迭代再去优化。
3. 支持不等于傻信:我踩过的真实工作流和提示词设计
说来轻松,真正把Vibe Coding用出效率,需要一套相对稳定的工作流。我试过乱七八糟的写法,最后总结下来最顺手的一套流程是:场景交代→任务拆解→分段生成→逐块验收→整体回归,每一步都有具体的操作细节。
3.1 先做工具选型,再谈效率
市面上的AI编程工具大致分三类,我全都用过,各有各的适用场景。这里不点名推荐某一个,只说你该怎么选。
| 类型 | 常见形态 | 适合谁 | 我的使用建议 |
|---|---|---|---|
| 独立IDE型 | 集成了AI助手的编辑器,能读取整个项目上下文 | 重度使用者、做完整项目的人 | 主力推荐,因为AI能看到上下文,生成的代码更贴合项目风格 |
| 插件型 | 嵌入现有编辑器的AI面板 | 已经习惯某款编辑器、不想迁移的人 | 日常小任务够用,但上下文感知能力弱一些 |
| Web对话型 | 网页聊天界面,需要手动粘贴代码 | 碎片化提问、查概念、写一次性脚本 | 不建议用于完整项目,上下文衔接太费劲 |
我的主力方案是独立IDE型加Web对话型组合:大块功能用独立IDE生成,遇到拿不准的API用法、算法细节,再去Web端单独问一轮,得到答案再回来落地。这样既能发挥前者的上下文优势,又能利用后者的知识广度和灵活性。
3.2 一个高成功率提示词的四个组成部分
很多人抱怨AI生成的代码“没法看”,我过去也这么觉得,后来发现问题的根源不在AI能力,而在提示词写得太敷衍。像“帮我写个订单超时关闭功能”这种指令,换谁都只能给你一个差不多能看但绝对不能上线的版本。
我后来总结出一个四要素提示词模板,用下来成功率非常高:
背景:描述项目目前的技术栈、相关数据表结构、已有代码在哪里 目标:明确要实现的功能是什么,输入输出各是什么 约束:不能影响什么、必须遵守什么规则、哪些边界条件要处理 产出要求:需要哪些类型的输出、代码风格、注释语言、是否需要测试用例拿“订单超时自动关闭”来说,我会这么写:
背景:Node.js + TypeScript + Redis,订单表 orders 有字段 id、status、created_at、expires_at。 目标:实现一个延迟队列消费者,订单超过 expires_at 后自动把 status 改为 closed。 约束: 1. 状态为 paid 且未发货的订单才能被关闭,支付中的订单不能动。 2. 使用 Redis 的 sorted set 存储待关单任务,不引入额外中间件。 3. 与现有 getOrderById 函数命名风格保持一致,变量用 camelCase。 4. 注释用中文。 产出要求:先给核心代码,再给调用示例,最后列出单元测试要点。这一版提示词,和“帮我写个关单功能”相比,差别在哪?首先是有了场景,AI知道你在处理的是真实业务,不是答题;其次有了约束,AI不会去引入那些看起来很神奇但根本不是你项目里该有的东西;最后是产出了明确范围,它不会给你一长串方案说明文,而是直接给你能落地的代码和测试思路。
3.3 对生成结果的分段验收法
这里要强调一个关键操作习惯:永远不要一次性要求AI生成一个完整的大型模块,然后拿回来整体审。一次生成的内容越多,出错的概率就越高,而且你审查的难度呈指数上升。正确做法是拆成小步骤,每生成一部分,就在项目里实际跑一遍、验证一遍。
我的习惯是“函数级验收”——一个函数生成完,先看签名和逻辑,然后填测试数据跑一遍,确认符合预期再让AI生成下一个部分。这样做有两个好处:第一,错误被限制在小范围,你永远知道自己正在看什么;第二,项目始终处于可运行状态,不会出现“代码写了一半跑不起来”的尴尬。这个方法不仅适合Vibe Coding,其实也适合一切代码协作场景,但和AI协作时尤其重要,因为你不能用“我自己写的代码我知道它大概在哪”这种直觉来定位问题。
另外有一个小技巧,当AI生成了一版代码但你觉得有潜在问题时,别直接说“改一下”就完事。更好的做法是明确指出你担心的点,比如“这个函数如果传入空数组会怎样”“这里的异步顺序能不能保证”。AI对明确的问题给出的修复方案,远比笼统的“调整一下”靠谱得多。
4. 四个翻车现场,以及我从里面总结出的边界线
光说好的也不行,我在这段时间里翻过的车确实不少。挑四个最有代表性的出来讲一讲,每一个都对应一条你现在就该记住的边界线。
4.1 翻车现场一:AI生成了TypeScript,但整个项目编译不过去
有次我让AI写一个通用的列表筛选函数,它很痛快地给了一版,然后在编辑器里满屏红线。报错信息很典型:
error TS7006: Parameter 'data' implicitly has an 'any' type.原因是项目开启了严格模式,而AI生成的那个函数,参数类型没有显式标注。实际上这种情况非常常见——AI会根据你项目里已有代码的风格来推断,但如果项目本身类型覆盖不完整,它很可能生成一个“看起来能跑”的宽松版本。
排查链路是这样的:先在tsconfig.json里确认编译器选项,再打开报错文件定位第一处红线的具体位置,发现参数类型缺失后,通过一句“显式定义data的类型,同时把返回值类型一并补上”的提示词要求返工。经过这次之后,我在提示词里固定加了一条“严格模式优先,补全所有类型标注”,翻车概率大幅下降。
这条案例给我的边界线是:**类型安全这类语言层面的硬约束,绝不能依赖AI自觉,必须在提示词里写明白,或者在审查时作为第一道关卡。
4.2 翻车现场二:AI在重构时悄悄改掉了原有行为
这个案例是整个过程中最贵的一次。当时我接手一段遗留代码,功能本身不复杂,但写法很老——一个回调函数嵌套三层,逻辑绕来绕去。我让AI把它重构成async/await风格,结果它确实完成了重构,但在过程中它觉得“原来的执行顺序看起来不太合理”,就把两个操作交换了顺序。
线上数据直接错乱。排查的时候我一开始根本没往AI身上想,以为是自己的重构改出的问题。后来把新旧版本的代码逐行对比才找到那个细小的差异。最气人的是,AI改完的部分确实“看起来更好”——新顺序在逻辑上更顺畅、更可读,但没有考虑依赖关系,旧顺序存在的基础是某个外部系统的数据到达顺序。
这次事件之后我立了条规矩:像注释里写着“不要动这个顺序”“保持原逻辑”的代码,每次给AI发送前都要刻意强调“仅改变写法,不改变任何执行顺序和业务语义”。另外,重构类任务建议用一个一个的小请求完成,每改一段就跑一次相关用例,而不是一口气交出一整版“看起来很完美”的代码。
这条边界线是:**让AI重构旧代码,永远比让AI写新代码更危险,因为旧代码里沉淀着前人踩过的坑,而这些坑往往没有写在注释里。
4.3 翻车现场三:代码重复膨胀,一个函数塞了三件事
有一次我让AI实现一个“导出Excel报表”的功能。它返回的代码里,一个函数里同时处理了数据清洗、格式化、文件生成三件事,长达两百多行,中间还有四层嵌套。功能确实能跑,但任何人接手这段代码都会崩溃——因为一旦需要改其中任何一个小格式,你就必须读完整个函数才能动手。
问题就出在我的提示词太笼统:“帮我写一个导出功能”。AI不知道你项目里是否已经有清洗模块、格式化工具、文件服务,它只能把所有东西揉在一起,保证你拿到手能跑。
修复办法是手动把函数拆成三步:先单独让AI生成数据清洗部分,再单独生成格式化工具,最后只用一个很薄的导出函数把它们组合起来。改动之后,每个函数都短小精悍,可读性立刻上来了。后来我在提示词里也固定加了“拆分为多个单一职责的小函数,不需要在一个函数里完成所有事情”这样一条。
这条边界线是:AI默认情况下追求“能跑”,不追求“好维护”,维护性的控制权必须掌握在人手里。你可以通过审查时坚持单一职责原则,也可以通过在提示词里写清楚拆分要求。
4.4 翻车现场四:看似正确的逻辑,在边界条件下翻车
最后一个案例特别能说明问题。我让AI写一个判断“当前时间是否在活动期间”的函数:
const isActive = (startDate, endDate) => new Date() >= startDate && new Date() <= endDate;乍一看没问题,核心逻辑也对。但它完全没有处理这些情况:如果startDate和endDate都是字符串而不是Date对象,如果startDate晚于endDate,如果传入null。更隐蔽的是,如果startDate为null,new Date() >= null在JavaScript里会神奇地变成true,因为null自动转换成0,而当前时间戳远大于0。
这类问题在AI生成代码里非常普遍,因为它在“最典型场景”里训练出来的默认逻辑往往过于理想化。我自己的应对方式是给每个AI生成的重要函数做一次“边界条件清单检查”:有空值传进来会怎样?有异常输入会怎样?并发情况下会不会有状态问题?超时之后会不会有副作用?把这些检查出来的问题一次性丢回给AI,让它统一修正,效率很高。
这条边界线是:**AI的强项是实现需求,不是发现需求背后的隐性需求。你需要替它补上“防御性思维”那一层。
5. 什么项目适合Vibe Coding,什么项目我劝你别碰
最后聊一个很实际的问题:不是所有项目都适合用Vibe Coding,判断标准比你想的简单。
5.1 我目前愿意放心用的场景
经过这几个月的反复试验,下面这些场景我现在会放心大胆地交给AI:
| 场景类型 | 原因 | 我的建议 |
|---|---|---|
| 原型验证 | 目标是快速确认方案可行性,代码质量不是第一优先级 | 让AI先撑起完整骨架,你专注于验证产品逻辑 |
| 内部工具和脚本 | 使用者少、改动频率低、出问题的影响面小 | 可以把复杂部分交给AI,但依然要有基本审查 |
| 数据清洗和格式转换 | 输入输出边界清晰,容易写校验逻辑 | 明确告诉AI输入格式和期望输出格式,成功率很高 |
| 样板代码和胶水代码 | 大量重复、无业务深度 | 让AI生成后,你只需要做常量级调整 |
| 文档注释和类型补全 | 机械性劳动,出错成本低 | 这几乎是最能立刻提升效率的地方 |
这些场景的共同点是:影响面小、边界清晰、出错可容忍。就算AI生成的代码有问题,你也能快速定位并修复,代价可控。
5.2 我不太建议碰的场景
反过来,下面这几类项目我会非常谨慎:
- 高并发核心交易链路,比如支付、库存扣减。这类代码对性能和一致性的要求极其严苛,AI生成的代码往往只考虑功能正确,不考虑极端的并发竞争和性能损耗。即使你要用,也必须有人做逐行的性能审查和并发模型验证,成本远高于手写。
- 安全敏感模块,比如鉴权、加密、防注入。这类代码的审查难度极高,很多漏洞不是看几眼代码就能发现的,AI的“看起来正确”非常具有迷惑性。安全领域值得用手写和人工审查来保证每一行都清楚明白。
- 遗留系统的深层改造。老系统里经常存在大量“没有注释但有理由的怪异代码”,AI不了解历史背景,很容易在重构时把这些“怪异”的地方“修正”掉,就像我前面提过的翻车案例二。
- 复杂算法实现。不是说不可以,而是说当遇到一个包含严密数学推导、边界条件繁多且需要性能基准验证的算法时,AI生成的版本最多只能当作文档参考,手工实现和验证仍然是更可靠的选择。
判断的核心标准就两条:风险是否可控、边界是否清晰。如果这两个问题你心里的答案都是“是”,那就放心用;如果有任何一个犹豫,就宁可用传统方式多花点时间,也别拿出问题的代价去换效率。
5.3 团队协作中的“人机边界”
在团队里推行Vibe Coding,其实还有一个很容易被忽略的问题——不同人对AI产出的审查能力不一样。一个经验丰富的老手,把AI的代码拿过来扫一眼就知道哪里可能要出问题;一个刚入行的新人,可能看到AI给的代码觉得“完美”。
所以我的团队成员使用规则很简单:允许任何人使用AI编程,但AI生成的代码必须过“双人审查”——写的人审查业务逻辑,另一个人审查安全性和边界条件。这个规则听起来有点土,但真的有效。它能挡住绝大多数因为“AI说这样写没问题”而导致的上线事故。另外就是尽量让AI生成的代码保留明显的标记,比如在注释里写上“AI generated”,这样后续排查问题时,可以快速意识到“这段代码可能有隐藏问题,需要放大审查范围”。
6. 我的最终态度:支持,但支持的是“有脑子的Vibe Coding”
绕了一大圈,回到标题的那个问题:你是否支持Vibe Coding?我的立场已经写得很明确了——支持,但不是无脑支持。我支持的是把它当作一个高质量的“编程搭档”,而不是一个可以完全托底的“代笔”。
有一些人觉得Vibe Coding意味着开发者以后可以不懂底层了。我的看法是:恰恰相反,如果开发者不懂底层,AI生成的错误你就看不出来;看不出来,你就是在给未来埋雷。所以我更愿意把Vibe Coding理解成一个“放大器”——你对业务和技术理解得越深,AI能给你带来的效率提升就越明显;你本身底子越薄,AI可能把你坑得越惨。
如果你刚接触这个概念,我建议你从一个小任务开始练起,比如给一个已有的脚本补充日志,或者写一个简单的数据转换工具。不要一上来就去重写整个核心系统。把这个小任务完整做完,你自然就能体会“描述→生成→审查→返工”这个循环里,哪些地方你在加速、哪些地方你在费力。试完之后你再问自己一遍:支不支持?
我个人试完之后的答案是:支持。但我会永远记住——写得快是一回事,写得对是另一回事。Vibe Coding帮我把第一件事做得极快,第二件事,始终得靠人自己守住。而真正适合Vibe Coding的团队和个人,不是在讨论“要不要用”的人,而是已经在研究“怎么用得更好”的人。