深度聊聊:被吹爆的 Vibe Coding,为什么一进真实项目就容易失控? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ybsolar
V2EX    程序员

深度聊聊:被吹爆的 Vibe Coding,为什么一进真实项目就容易失控?

  •  
  •   ybsolar 17 小时 34 分钟前 1752 次点击

    深度聊聊:被吹爆的 Vibe Coding ,为什么一进真实项目就容易失控?

    第一次用 AI 写代码,很多人的感受都差不多:爽,是真的爽。

    你随手丢一句需求,它几分钟就给你搭出一个能跑的 demo ;你再补一句“这里换个颜色”“这个字段加上”“顺手改一下校验”,它又能立刻接上。那种感觉很像什么?像你刚找到一个特别勤快、还几乎不嫌烦的搭子说改就改,说写就写,反馈快得让人上头。

    可一旦项目不再是小 demo ,而是开始往“真系统”走,味道就变了。

    你会发现,AI 还在很努力地输出,代码也还在不断增长,可项目本身却越来越乱:前面说过的约束,它忘了;前天修过的 bug ,今天又在另一个文件里冒出来;本地 replay 测得一片绿,真丢到测试环境一跑,啪,挂了。

    这时候很多人会下意识地想:是不是模型还不够强?

    其实往往不是。

    问题更常出在另一层我们有没有把“想清楚、做出来、验明白”这三件事分开。

    说白了,就是:planning 、execution 、verification 到底有没有被当成三件不同的事来处理。


    Vibe Coding 到底是什么?为什么它在 demo 阶段那么香?

    先说结论:Vibe Coding 并不是错,它只是特别适合某些场景。

    所谓 Vibe Coding ,你可以把它理解成一种很自由、很对话驱动的 AI 编程方式。它大概长这样:

    • 一边聊天,一边改代码
    • 需求、实现、测试全混在同一个长对话里
    • 没有固定 plan ,AI 想到哪儿写到哪儿
    • 跑个 mock 、做个 replay ,看起来没问题,就先当完成
    • 关键决策不单独沉淀,全靠对话历史“记着”

    为什么这种方式一开始特别好用?原因很简单它正好贴合了 demo 和 MVP 的需求。

    你需求还很模糊,只说一句“给我搞个登录页”,AI 就能自己补很多东西:选框架、搭路由、写样式、凑交互。你几乎不需要前期设计,不需要 spec ,不需要 plan ,甚至不需要太多上下文,就能很快看到东西跑起来。

    这对“验证一个想法”特别有价值。

    因为 demo 阶段你最关心的,其实不是“这个系统未来三个月怎么演进”,而是:这个点子能不能先被看见、被演示、被感知。

    所以在这个阶段,Vibe Coding 的优势非常明显:

    • 上手门槛低
    • 反馈速度极快
    • 容忍需求模糊
    • 几乎没有前置成本

    问题在于,demo 只要求“跑起来”,工程交付要求的是“跑得稳、改得动、出了问题找得到原因”。

    这两者,根本不是一回事。


    为什么自由式 AI coding 前期越爽,后期越容易翻车?

    真正麻烦的地方在于:Vibe Coding 的很多优点,放进复杂项目里,恰恰会倒过来变成缺点。

    下面这几个崩点,几乎是很多团队踩过一轮之后才会真正意识到的。


    崩点一:上下文越来越长,但关键决策根本没“落地”

    很多人会觉得,现在上下文都这么长了,几十万 token 都能塞,那 AI 不是应该更懂项目了吗?

    听起来合理,现实却没那么美。

    因为 LLM 的“看过”,不等于工程意义上的“记住”。它并不是像人一样建立了稳定、可追溯的长期约束模型,而是在当前上下文里尽量续写出一个“看起来合理”的下一步。

    于是对话一长,问题就来了:

    • 前面明明说过“不能用全局变量”,后面它还是用了
    • 前面强调“必须走事务”,隔几轮它又绕过去了
    • 某个 bug 刚在 A 文件修过,B 文件又原样再来一遍
    • 你想回头查“为什么当初这里这么设计”,只能翻聊天记录翻到怀疑人生

    最麻烦的不是代码变多,而是控制感在变弱

    项目越长,你越容易进入一种奇怪的状态:代码越来越像是“它在生成”,而不是“你在掌控”。


    崩点二:它不是按计划执行,而是边干边改主意

    自由式 coding 有一个特别容易被忽略的问题:计划漂移。

    你原本只想做个很小的改动,比如加个字段、补个校验、修个状态判断。结果 AI 做着做着,顺手就把旁边一整块也给“优化”了。

    听起来还挺积极,对吧?

    可复杂系统里,最怕的就是这种“顺手”。

    比如:

    • 你只让它加一个字段,它顺手把数据层重构了
    • 你只让它改个校验逻辑,它顺手改了状态流
    • 你只让它修一个接口,它顺手把相关抽象全换了一遍

    局部看,每一步都像是在“变更更优雅”;全局看,却可能已经悄悄偏离最初需求。

    这就是复杂项目最危险的地方:副作用不是线性的,是会连锁扩散的。

    一个“顺手重构”,背后可能牵出三四个模块的隐式依赖。而这些依赖,在聊天过程中通常并没有被明确写出来,只是“好像应该没问题”。

    工程里最怕这种“好像”。


    崩点三:replay 是绿的,不代表真环境也是绿的

    很多 AI coding 的验证方式,说白了,是一种“先看起来没错”。

    跑个固定输入,输出对了;

    mock 一下数据库,请求通了;

    本地单进程把流程串起来,似乎都没报错。

    于是大家点点头:可以,完成了。

    但只要你做过真实项目,你就知道,很多 bug 本来就不是在 happy path 上出现的。

    真正会出事的地方,往往藏在这些角落里:

    • 并发下的竞争条件
    • 超时和重试
    • 事务边界不一致
    • 真实数据分布下的边缘 case
    • 集成环境里组件之间的时序问题
    • 回归测试没覆盖到的旧行为破坏

    AI 生成代码还有一个很现实的倾向:它特别容易朝着“通过当前测试”去优化,而不是朝着“在真实世界里长期正确”去优化。

    也就是说,它会非常努力地满足你眼前那套验证条件,却未必真的理解这套代码在生产环境里要面对什么。

    所以 replay 绿,不等于正式测试绿;正式测试绿,也不一定等于线上稳。

    这句话一点都不夸张。


    崩点四:看起来像智能协作,实际上常常是一团黑盒

    现在很多人开始用多 agent 工具,感觉像是“AI 团队”在替自己干活:有的负责读代码,有的负责写代码,有的负责测。

    理想状态当然很好。可一旦流程没有显式拆开,最后经常还是回到一个问题:谁在什么时候做了什么决定,你根本看不清。

    尤其在自由模式下,常见情况是:

    • 同一个 agent 一会儿在扫描代码,一会儿在做计划,一会儿又开始改实现,顺手还把测试跑了
    • 哪一步是“分析得出的结论”,哪一步是“为了继续往下走临时拍的脑袋”,界限很模糊
    • 中间产物没有保存,状态只存在于对话和模型内部推理里

    结果就是,一旦出问题,你很难判断:

    • 是一开始理解需求就错了?
    • 还是 plan 本来就不合理?
    • 还是执行偏了?
    • 还是验证方式压根不够?

    当 orchestration 变成黑盒,可控性就会迅速下降。


    那为什么“流程约束式 AI coding”更慢,却更稳?

    因为它做了一件很朴素、但特别重要的事:

    把“想”和“做”拆开,把“决定”和“执行”拆开。

    一个更靠谱的流程,通常不会让 AI 上来就写,而是按几个阶段来:

    • 先扫描( Explore ):读代码库、找依赖、看影响范围
    • 再计划( Plan ):列出子任务、对应文件、改动边界,让人先看一遍
    • 然后执行( Execute ):按子任务逐个落地
    • 最后验证( Test / Review ):按层次去验,不是随手跑一下就算完

    你会发现,这种方式的重点不在于“限制 AI”,而在于把错误尽量前移

    与其让 AI 写出一大坨代码之后再发现方向错了,不如在动手前就把错误理解暴露出来。


    为什么 plan 一旦不锁,项目就容易飘?

    因为 plan 的价值,不只是“列个待办清单”,它其实承担了三层作用。

    第一,它会把很多原本隐含的假设显式写出来。

    AI 在 plan 阶段会暴露自己的理解包括理解错的地方。你这时候纠正,成本最低。

    第二,它给变更画了边界。

    每个子任务改哪些文件、碰哪些接口、不碰哪些地方,都能事先说明。这样一旦执行阶段越界,人能很快察觉。

    第三,它是可回滚的决策点。

    计划错了,重做 plan 就好;如果一边写一边想,往往等你意识到错的时候,代码已经堆了一大层,返工成本直线上升。

    说得直白一点:plan 的作用,不是拖慢开发,而是防止后面成倍返工。


    为什么 scan / plan / execute / test 混在一起,几乎必乱?

    因为这四件事本来就不是同一种脑力活动。

    • scan 是理解现状
    • plan 是设计变更
    • execute 是落实方案
    • test 是证明结果

    把它们混在同一条对话流里,AI 很容易出现一种典型状态:边写边重新理解需求,边验证边修改实现,最后到底是“按什么标准完成的”,你自己都说不清。

    更现实一点讲,人类也很难在关键节点插手。

    如果没有明确 checkpoint ,你基本只能等它“都做完了”再看结果。而到了那个时候,很多问题已经不是一句“你重来一下”能轻松解决的了。

    相反,分阶段加 checkpoint 的好处很明显:

    每往前走一步,都得先证明当前这一步站得住。

    这不是官僚流程,这是工程上的刹车系统。


    聊天记录为什么替代不了显式产物?

    因为聊天记录是线性的,工程决策是网状的。

    你回头翻聊天,会发现它当然“都说过”,可问题是:

    • 决策散落在几百条消息里
    • 同一个约束前后可能被不同表述重复提过
    • 新开一个会话,很多前文就等于没了
    • 后来加入项目的人,几乎不可能靠补聊天记录来真正理解系统

    这就是为什么真实团队最后都会回到那些看起来“传统”的东西上:

    这些东西看起来不像对话那么“丝滑”,但它们有一个决定性的优点:能查、能复用、能版本化、能交接。

    你今天写的约束,明天还能被新会话、新成员、新 agent 继续拿来用。

    这才叫工程上的“记忆”。


    为什么 replay 只能算一层验证,绝不是全部?

    replay 当然有用,它并不是没价值。

    问题在于,replay 解决的是:“在当前假设下,这段逻辑看起来是否成立?”

    而正式测试解决的是另一个问题:

    “在真实系统里,这个改动会不会破坏别的东西?会不会在复杂条件下失效?”

    两者根本不是一个层次。

    所以比较健康的验证方式,应该是分层的:

    • lint:先把明显问题筛掉
    • unit test:验证局部逻辑
    • integration test:验证模块之间真的能协同
    • regression test:防止旧行为被悄悄改坏
    • 必要时再做真实环境下的端到端验证和压测

    replay 是其中一层,不是全部。

    如果把 replay 当成“完成标志”,那基本就是在拿局部假设代替真实世界。


    为什么显式 delegation 比黑盒 orchestration 更靠谱?

    因为显式 delegation 至少让你知道:谁负责想,谁负责做,谁负责验。

    比如:

    • Architect agent:负责研究代码、产出 plan
    • Developer agent:按 plan 实现
    • Tester agent:设计和执行测试

    这样做的好处非常实际:

    • 输入输出清楚,状态容易追踪
    • 中途可以暂停,让人做审查
    • 某个环节不行,可以单独优化或替换
    • 出问题时,更容易定位到底是计划错了还是执行偏了

    说白了,工程系统一旦复杂起来,最怕“所有事都由一个聪明黑盒自动搞定”。

    听起来高级,出了问题却最难救。


    同一个任务,两种做法,差别到底在哪?

    例子一:给 /api/user 增加 phone 字段

    这个需求表面看很简单:在返回里加个 phone,然后做非空校验。

    如果是自由 Vibe Coding

    你一句话发过去:“给 /api/user 加个 phone 字段,要非空。”

    AI 立刻开干:

    • 改 DTO
    • 改 controller
    • 改 service
    • 可能顺手还把 migration 也补了

    三分钟后,代码能跑,接口也返回了。你一看:“可以啊,挺快。”

    但第二天很可能就出事:

    • 老客户端根本没传 phone,直接 500
    • 某个内部工具字段映射写死了,现在炸了
    • 校验逻辑被写在 controller ,service 层绕开后照样能进

    问题不是它不会写,而是它没认真判断这个改动到底会影响谁、约束应该落在哪一层、兼容性怎么处理

    如果是流程约束式

    做法会完全不一样。

    先把需求讲清楚:

    • /api/user 返回新增 phone
    • 后端需要校验
    • 但对老客户端要兼容,没传时允许 null
    • 校验逻辑放在 service 层,统一复用

    然后 AI 先出一个 plan ,你来审:

    • 修改 UserDTO,增加 phone @Nullable
    • UserService.validateUser() 里加校验:有值时非空
    • 修改 controller ,保证返回结构一致
    • li>增加集成测试,覆盖“有 phone”“无 phone”“空字符串”
    • 本次不改 database migration

    接下来再按任务逐个实现、逐个测试。

    这套流程看起来慢了 5 到 10 分钟,但它换来的是什么?

    是你一开始就把兼容性、校验位置、测试标准都说清楚了。后面大概率不会因为“顺手一改”引发连锁返工。


    例子二:把订单状态流从同步改成事件驱动

    这个就更能说明问题了。

    需求是:

    • 订单服务发布 OrderStatusChanged
    • 库存服务订阅后更新库存
    • 报表服务订阅后更新聚合表
    • 数据库要有事件表和出队机制

    如果是自由 Vibe Coding

    你说一句:“把订单状态流改成事件驱动。”

    AI 立刻进入高能状态:

    • 在订单服务里加事件发布
    • 在库存服务里加订阅
    • 顺手改点 schema
    • 再顺手补个重试机制

    你中途又想起来一句:“哦对,报表服务也要订阅。”

    它继续接上,问题是

    报表服务很可能用的又是另一套事件格式,版本也没统一,语义也没锁死。

    本地跑一遍 replay ,单进程、同 JVM 、甚至事件直接方法调用,绿得发亮。

    可一上集成环境,熟悉的灾难就来了:

    • 事件丢了
    • 顺序乱了
    • 重试导致重复消费
    • 幂等没做好,库存扣错了
    • 报表和库存看到的状态还不一致

    这不是因为 AI 写不出代码,而是因为这种任务本来就要求你先把一堆关键决策钉死:

    • 事件 schema 是什么?
    • 版本怎么管?
    • 至少一次还是恰好一次?
    • 怎么持久化?
    • 怎么重试?
    • 怎么幂等?
    • 乱序怎么处理?
    • 回滚和补偿谁负责?

    这些问题如果不先想清楚,后面写得越快,翻车也越快。

    如果是流程约束式

    更靠谱的做法通常会是这样:

    先写清 spec:

    • 事件名称、版本、schema
    • 消费语义
    • 各服务订阅边界
    • 失败补偿策略

    然后让 AI 先 scan 三个服务,产出一份现状梳理:

    • 当前状态流怎么走
    • 涉及哪些状态字段
    • 哪些事务边界已经存在
    • 哪些地方最容易出一致性问题

    接着再出 plan ,并做人审:

    • 阶段 1:定义事件 schema
    • 阶段 2:改订单服务,引入事件表和发布层
    • 阶段 3:改库存服务,实现订阅和幂等消费
    • 阶段 4:改报表服务
    • 阶段 5:补集成测试,覆盖丢失、重复、乱序等场景

    每一阶段做完,都必须停一下:

    • 跑单元测试
    • 跑这一阶段的集成测试
    • 输出结果
    • 人确认无误后再继续

    最后再到真实消息队列环境里跑端到端测试和压测。

    这才是处理复杂改造时更稳的方式。它不一定让你“今天下午就看到全套跑通”,但能明显降低那种“看起来都好了,结果集成环境炸穿”的概率。


    那到底什么时候该用哪一种?

    说到底,这不是“谁更先进”的问题,而是任务和方法要匹配

    如果你现在只是:

    • 验证一个创意
    • 搭个 demo
    • 做个 MVP
    • 改一个很局部、可快速回滚的小功能

    那用 Vibe Coding 完全没问题。甚至可以说,它在这种场景下非常合适。

    可如果你要做的是:

    • 多模块协作
    • 跨服务改造
    • 涉及状态机、事务、并发
    • 需要长期维护
    • 要上线、要审计、要交接

    那最好从第一天就别把 AI 当“自由发挥型选手”,而要把它放进流程里。

    你可以把这个判断记成一句特别实用的话:

    任务越复杂、影响范围越大、回滚成本越高,就越不能只靠 Vibe 。


    最后聊一句:AI 能加速开发,但不能替你承担工程责任

    Vibe Coding 的问题,不是它没用,而是很多人对它的期待本来就放错了位置。

    它擅长的是帮你快速把东西“做出来”。

    可软件工程真正难的地方,从来不只是做出来,而是:

    • 做得对
    • 改得动
    • 出问题能定位
    • 过几个月还有人接得住

    所以真正靠谱的 AI-native 工程,不是“让 AI 自己决定怎么建系统”,而更像是这样:

    • 用 AI 提速大量编码和样板工作
    • 用人类守住架构、约束、审查和关键决策
    • 用流程把这些环节串起来,让整个过程可重复、可回溯、可维护

    说得再直白一点:

    Vibe Coding 适合拿来“爽一下”;真正要把软件落到地上,还是得靠流程把节奏拉回来。

    毕竟,写代码最快的时候,常常不是项目推进最稳的时候。

    而一个系统能不能长期活下去,拼的也从来不只是“生成速度”,而是你有没有办法持续地把复杂性关进笼子里。

    19 条回复    2026-03-23 22:38:27 +08:00
    ruanimal
        1
    ruanimal  
       17 小时 26 分钟前   3
    ai 生成的吧?
    nc
        2
    nc  
       17 小时 24 分钟前   2
    AI 写的文章吐槽 AI 编程的,是不是有点讽刺?这年头连吐槽文都没能力写了?
    lnbiuc
        3
    lnbiuc  
       17 小时 18 分钟前
    这也太明显了,分点描述然后总结,AI 写的水文
    一样,到处拉
    PerFectTime
        4
    PerFectTime  
       17 小时 11 分钟前
    @Livid ai 生成文章
    maxsum
        5
    maxsum  
       17 小时 11 分钟前
    AI 好喜欢用“不是,而是”啊。现在看到就厌烦
    airqj
        6
    airqj  
       17 小时 9 分钟前
    一个十多年的号,可惜了
    visper
        7
    visper  
       17 小时 5 分钟前
    @maxsum 同感。现在看到不是...而是...这样的句子,都有种厌恶的感觉了。 要用 ai 写也花点心思,告诉 ai 用什么样的语气啊学什么样的风格,搞一下不同的。全部千遍一律这样的语气风格的文档,都看得烦了。
    rap16
        8
    rap16  
       17 小时 4 分钟前
    写的什么乱起八糟的,能不能发给 AI 总结成一句话发出来。
    XuHuan1025
        9
    XuHuan1025  
       16 小时 58 分钟前
    伟大无需多言,汤姆 走好
    xiaket
        10
    xiaket  
       16 小时 54 分钟前
    每次看到这种就希望 v2 上有 downvote 的功能
    duuu
        11
    duuu  
       16 小时 34 分钟前
    虽然是 AI 写的,不过内容结论没什么问题。
    coefu
        12
    coefu  
       16 小时 33 分钟前
    @Livid ,可以在发主题的前面顶一个 是否是 LLM generate 的验证模型,如果符合特征,直接不让发。回帖就难一点。但是发主题,一天也就那么多。
    coefu
        13
    coefu  
       16 小时 32 分钟前
    @duuu gemini 骗人的时候,你得看很多遍,才能反应出来。有时候,甚至反应不出来。
    codingerj
        14
    codingerj  
       16 小时 28 分钟前
    @Livid 纯 AI 生成的垃圾文
    Yasuke
        15
    Yasuke  
       16 小时 27 分钟前
    为什么不主动学习一下 SDD 呢
    hepin1989
        16
    hepin1989  
       16 小时 2 分钟前
    感谢分享,我最近也在研究这里,我一开始用了 pua skill ,后来我用了自己的。
    https://share-skills.github.io/pi/benchmark.html
    AItsuki
        17
    AItsuki  
       15 小时 56 分钟前
    chatgpt 风味文章
    Morgan2
        18
    Morgan2  
       15 小时 54 分钟前
    "先说结论:" 绝壁是 AI 生成
    qiuguoxyz2
        19
    qiuguoxyz2  
       11 小时 51 分钟前
    一看就是 chatgpt 生成的,完犊子了,到处都是这种文章.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6363 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 02:29 PVG 10:29 LAX 19:29 JFK 22:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86