第一次用 AI 写代码,很多人的感受都差不多:爽,是真的爽。
你随手丢一句需求,它几分钟就给你搭出一个能跑的 demo ;你再补一句“这里换个颜色”“这个字段加上”“顺手改一下校验”,它又能立刻接上。那种感觉很像什么?像你刚找到一个特别勤快、还几乎不嫌烦的搭子——说改就改,说写就写,反馈快得让人上头。
可一旦项目不再是小 demo ,而是开始往“真系统”走,味道就变了。
你会发现,AI 还在很努力地输出,代码也还在不断增长,可项目本身却越来越乱:前面说过的约束,它忘了;前天修过的 bug ,今天又在另一个文件里冒出来;本地 replay 测得一片绿,真丢到测试环境一跑,啪,挂了。
这时候很多人会下意识地想:是不是模型还不够强?
其实往往不是。
问题更常出在另一层——我们有没有把“想清楚、做出来、验明白”这三件事分开。
说白了,就是:planning 、execution 、verification 到底有没有被当成三件不同的事来处理。
先说结论:Vibe Coding 并不是错,它只是特别适合某些场景。
所谓 Vibe Coding ,你可以把它理解成一种很自由、很对话驱动的 AI 编程方式。它大概长这样:
为什么这种方式一开始特别好用?原因很简单——它正好贴合了 demo 和 MVP 的需求。
你需求还很模糊,只说一句“给我搞个登录页”,AI 就能自己补很多东西:选框架、搭路由、写样式、凑交互。你几乎不需要前期设计,不需要 spec ,不需要 plan ,甚至不需要太多上下文,就能很快看到东西跑起来。
这对“验证一个想法”特别有价值。
因为 demo 阶段你最关心的,其实不是“这个系统未来三个月怎么演进”,而是:这个点子能不能先被看见、被演示、被感知。
所以在这个阶段,Vibe Coding 的优势非常明显:
问题在于,demo 只要求“跑起来”,工程交付要求的是“跑得稳、改得动、出了问题找得到原因”。
这两者,根本不是一回事。
真正麻烦的地方在于:Vibe Coding 的很多优点,放进复杂项目里,恰恰会倒过来变成缺点。
下面这几个崩点,几乎是很多团队踩过一轮之后才会真正意识到的。
很多人会觉得,现在上下文都这么长了,几十万 token 都能塞,那 AI 不是应该更懂项目了吗?
听起来合理,现实却没那么美。
因为 LLM 的“看过”,不等于工程意义上的“记住”。它并不是像人一样建立了稳定、可追溯的长期约束模型,而是在当前上下文里尽量续写出一个“看起来合理”的下一步。
于是对话一长,问题就来了:
最麻烦的不是代码变多,而是控制感在变弱。
项目越长,你越容易进入一种奇怪的状态:代码越来越像是“它在生成”,而不是“你在掌控”。
自由式 coding 有一个特别容易被忽略的问题:计划漂移。
你原本只想做个很小的改动,比如加个字段、补个校验、修个状态判断。结果 AI 做着做着,顺手就把旁边一整块也给“优化”了。
听起来还挺积极,对吧?
可复杂系统里,最怕的就是这种“顺手”。
比如:
局部看,每一步都像是在“变更更优雅”;全局看,却可能已经悄悄偏离最初需求。
这就是复杂项目最危险的地方:副作用不是线性的,是会连锁扩散的。
一个“顺手重构”,背后可能牵出三四个模块的隐式依赖。而这些依赖,在聊天过程中通常并没有被明确写出来,只是“好像应该没问题”。
工程里最怕这种“好像”。
很多 AI coding 的验证方式,说白了,是一种“先看起来没错”。
跑个固定输入,输出对了;
mock 一下数据库,请求通了;
本地单进程把流程串起来,似乎都没报错。
于是大家点点头:可以,完成了。
但只要你做过真实项目,你就知道,很多 bug 本来就不是在 happy path 上出现的。
真正会出事的地方,往往藏在这些角落里:
AI 生成代码还有一个很现实的倾向:它特别容易朝着“通过当前测试”去优化,而不是朝着“在真实世界里长期正确”去优化。
也就是说,它会非常努力地满足你眼前那套验证条件,却未必真的理解这套代码在生产环境里要面对什么。
所以 replay 绿,不等于正式测试绿;正式测试绿,也不一定等于线上稳。
这句话一点都不夸张。
现在很多人开始用多 agent 工具,感觉像是“AI 团队”在替自己干活:有的负责读代码,有的负责写代码,有的负责测。
理想状态当然很好。可一旦流程没有显式拆开,最后经常还是回到一个问题:谁在什么时候做了什么决定,你根本看不清。
尤其在自由模式下,常见情况是:
结果就是,一旦出问题,你很难判断:
当 orchestration 变成黑盒,可控性就会迅速下降。
因为它做了一件很朴素、但特别重要的事:
把“想”和“做”拆开,把“决定”和“执行”拆开。
一个更靠谱的流程,通常不会让 AI 上来就写,而是按几个阶段来:
你会发现,这种方式的重点不在于“限制 AI”,而在于把错误尽量前移。
与其让 AI 写出一大坨代码之后再发现方向错了,不如在动手前就把错误理解暴露出来。
因为 plan 的价值,不只是“列个待办清单”,它其实承担了三层作用。
第一,它会把很多原本隐含的假设显式写出来。
AI 在 plan 阶段会暴露自己的理解——包括理解错的地方。你这时候纠正,成本最低。
第二,它给变更画了边界。
每个子任务改哪些文件、碰哪些接口、不碰哪些地方,都能事先说明。这样一旦执行阶段越界,人能很快察觉。
第三,它是可回滚的决策点。
计划错了,重做 plan 就好;如果一边写一边想,往往等你意识到错的时候,代码已经堆了一大层,返工成本直线上升。
说得直白一点:plan 的作用,不是拖慢开发,而是防止后面成倍返工。
因为这四件事本来就不是同一种脑力活动。
把它们混在同一条对话流里,AI 很容易出现一种典型状态:边写边重新理解需求,边验证边修改实现,最后到底是“按什么标准完成的”,你自己都说不清。
更现实一点讲,人类也很难在关键节点插手。
如果没有明确 checkpoint ,你基本只能等它“都做完了”再看结果。而到了那个时候,很多问题已经不是一句“你重来一下”能轻松解决的了。
相反,分阶段加 checkpoint 的好处很明显:
每往前走一步,都得先证明当前这一步站得住。
这不是官僚流程,这是工程上的刹车系统。
因为聊天记录是线性的,工程决策是网状的。
你回头翻聊天,会发现它当然“都说过”,可问题是:
这就是为什么真实团队最后都会回到那些看起来“传统”的东西上:
spec.mdimplementation_plan.mdworkflow_state.md这些东西看起来不像对话那么“丝滑”,但它们有一个决定性的优点:能查、能复用、能版本化、能交接。
你今天写的约束,明天还能被新会话、新成员、新 agent 继续拿来用。
这才叫工程上的“记忆”。
replay 当然有用,它并不是没价值。
问题在于,replay 解决的是:“在当前假设下,这段逻辑看起来是否成立?”
而正式测试解决的是另一个问题:
“在真实系统里,这个改动会不会破坏别的东西?会不会在复杂条件下失效?”
两者根本不是一个层次。
所以比较健康的验证方式,应该是分层的:
replay 是其中一层,不是全部。
如果把 replay 当成“完成标志”,那基本就是在拿局部假设代替真实世界。
因为显式 delegation 至少让你知道:谁负责想,谁负责做,谁负责验。
比如:
这样做的好处非常实际:
说白了,工程系统一旦复杂起来,最怕“所有事都由一个聪明黑盒自动搞定”。
听起来高级,出了问题却最难救。
/api/user 增加 phone 字段这个需求表面看很简单:在返回里加个 phone,然后做非空校验。
你一句话发过去:“给 /api/user 加个 phone 字段,要非空。”
AI 立刻开干:
三分钟后,代码能跑,接口也返回了。你一看:“可以啊,挺快。”
但第二天很可能就出事:
phone,直接 500问题不是它不会写,而是它没认真判断这个改动到底会影响谁、约束应该落在哪一层、兼容性怎么处理。
做法会完全不一样。
先把需求讲清楚:
/api/user 返回新增 phonenull然后 AI 先出一个 plan ,你来审:
UserDTO,增加 phone @NullableUserService.validateUser() 里加校验:有值时非空接下来再按任务逐个实现、逐个测试。
这套流程看起来慢了 5 到 10 分钟,但它换来的是什么?
是你一开始就把兼容性、校验位置、测试标准都说清楚了。后面大概率不会因为“顺手一改”引发连锁返工。
这个就更能说明问题了。
需求是:
OrderStatusChanged你说一句:“把订单状态流改成事件驱动。”
AI 立刻进入高能状态:
你中途又想起来一句:“哦对,报表服务也要订阅。”
它继续接上,问题是——
报表服务很可能用的又是另一套事件格式,版本也没统一,语义也没锁死。
本地跑一遍 replay ,单进程、同 JVM 、甚至事件直接方法调用,绿得发亮。
可一上集成环境,熟悉的灾难就来了:
这不是因为 AI 写不出代码,而是因为这种任务本来就要求你先把一堆关键决策钉死:
这些问题如果不先想清楚,后面写得越快,翻车也越快。
更靠谱的做法通常会是这样:
先写清 spec:
然后让 AI 先 scan 三个服务,产出一份现状梳理:
接着再出 plan ,并做人审:
每一阶段做完,都必须停一下:
最后再到真实消息队列环境里跑端到端测试和压测。
这才是处理复杂改造时更稳的方式。它不一定让你“今天下午就看到全套跑通”,但能明显降低那种“看起来都好了,结果集成环境炸穿”的概率。
说到底,这不是“谁更先进”的问题,而是任务和方法要匹配。
如果你现在只是:
那用 Vibe Coding 完全没问题。甚至可以说,它在这种场景下非常合适。
可如果你要做的是:
那最好从第一天就别把 AI 当“自由发挥型选手”,而要把它放进流程里。
你可以把这个判断记成一句特别实用的话:
任务越复杂、影响范围越大、回滚成本越高,就越不能只靠 Vibe 。
Vibe Coding 的问题,不是它没用,而是很多人对它的期待本来就放错了位置。
它擅长的是帮你快速把东西“做出来”。
可软件工程真正难的地方,从来不只是做出来,而是:
所以真正靠谱的 AI-native 工程,不是“让 AI 自己决定怎么建系统”,而更像是这样:
说得再直白一点:
Vibe Coding 适合拿来“爽一下”;真正要把软件落到地上,还是得靠流程把节奏拉回来。
毕竟,写代码最快的时候,常常不是项目推进最稳的时候。
而一个系统能不能长期活下去,拼的也从来不只是“生成速度”,而是——你有没有办法持续地把复杂性关进笼子里。
1
ruanimal 10 小时 57 分钟前 ai 生成的吧?
|
2
nc 10 小时 55 分钟前 AI 写的文章吐槽 AI 编程的,是不是有点讽刺?这年头连吐槽文都没能力写了?
|
3
lnbiuc 10 小时 50 分钟前
这也太明显了,分点描述然后总结,AI 写的水文
💩一样,到处拉 |
4
PerFectTime 10 小时 43 分钟前
@Livid ai 生成文章
|
5
maxsum 10 小时 43 分钟前
AI 好喜欢用“不是,而是”啊。现在看到就厌烦
|
6
airqj 10 小时 41 分钟前
|
7
visper 10 小时 37 分钟前
@maxsum 同感。现在看到不是...而是...这样的句子,都有种厌恶的感觉了。 要用 ai 写也花点心思,告诉 ai 用什么样的语气啊学什么样的风格,搞一下不同的。全部千遍一律这样的语气风格的文档,都看得烦了。
|
8
rap16 10 小时 35 分钟前
写的什么乱起八糟的,能不能发给 AI 总结成一句话发出来。
|
9
XuHuan1025 10 小时 29 分钟前
伟大无需多言,汤姆 走好
|
10
xiaket 10 小时 25 分钟前
每次看到这种就希望 v2 上有 downvote 的功能
|
11
duuu 10 小时 5 分钟前
虽然是 AI 写的,不过内容结论没什么问题。
|
15
Yasuke 9 小时 58 分钟前
为什么不主动学习一下 SDD 呢
|
16
hepin1989 9 小时 34 分钟前
感谢分享,我最近也在研究这里,我一开始用了 pua skill ,后来我用了自己的。
https://share-skills.github.io/pi/benchmark.html |
17
AItsuki 9 小时 27 分钟前
chatgpt 风味文章
|
18
Morgan2 9 小时 25 分钟前
"先说结论:" 绝壁是 AI 生成
|
19
qiuguoxyz2 5 小时 22 分钟前
一看就是 chatgpt 生成的,完犊子了,到处都是这种文章.
|