1. 从“能跑就行”到“能扛才行”:Vibe Coding 的真实处境
“Vibe Coding”这个词刚出来的时候,我身边不少朋友都挺兴奋的。大概意思就是:你不需要逐行写代码,只需要把想法用自然语言描述出来,AI 帮你生成,你看着差不多、跑得通、感觉对了,就收工。听起来很爽,对吧?我一开始也这么觉得。去年我拿它快速搭过几个内部小工具,确实快,一个下午能出三四个原型,那种“想到即得到”的爽感是真实存在的。
但问题也恰恰出在这里。当我把其中一个工具交给团队里另一个同事去维护时,他花了整整两天才看懂 AI 生成的那几百行代码到底在干什么。更麻烦的是,当线上出现一个边界条件报错时,我发现自己竟然没法快速定位——因为那些代码不是我“想”出来的,是 AI“猜”出来的。我当时的感受就是:我像一个只会按快门的摄影师,相机很高级,但光圈快门景深我一概不懂,一旦光线复杂,我就废了。
这就是 Vibe Coding 的核心矛盾:它极大地降低了“从零到一”的门槛,但并没有降低“从一到一百”的难度。而现实世界里,绝大多数有价值的软件项目,恰恰都活在“一到一百”这个区间里。你不可能永远只做原型,你总要面对用户量上涨、需求变更、多人协作、线上故障这些事。到了那个阶段,只会 Vibe Coding 的程序员,就会开始感到吃力。
我写这篇东西,不是要否定 Vibe Coding。恰恰相反,我觉得它是这个时代给程序员最好的礼物之一。但礼物怎么用、用到什么程度、什么时候该切换模式,这里面有很深的讲究。接下来我会从几个层面拆开聊:Vibe Coding 到底解决了什么、它留下了什么坑、Agent 和 Prompt 这些热词背后真正的技术分水岭在哪里、以及一个普通开发者该怎么一步步从“只会 Vibe”进化到“能驾驭 Vibe”。
2. Vibe Coding 到底解决了什么,又留下了什么
2.1 它把“表达”和“实现”之间的墙拆掉了一半
以前我们写代码,脑子里想的是一个业务逻辑,手上要把它翻译成编程语言的语法、数据结构、框架 API。这个翻译过程需要大量记忆和训练。Vibe Coding 把“翻译”这一步交给了 AI,你只需要把业务逻辑说清楚。这堵墙被拆掉了一半,效率提升是肉眼可见的。
我实测过一个场景:给一个内部管理系统加一个“根据用户行为自动打标签”的功能。传统写法我要先设计表结构、写迁移脚本、写服务层、写接口、写前端展示,保守估计大半天。用 Vibe Coding 的方式,我把需求拆成几段 Prompt,让 AI 分别生成模型、服务、接口和简单前端,然后我拼起来调通,大概一个半小时。这个速度差距是真实存在的,没必要否认。
但注意,这里有一个隐藏前提:我清楚地知道这个功能应该怎么拆、每部分应该放在哪个层、接口应该长什么样。也就是说,Vibe Coding 加速的是“实现”,而不是“设计”。如果你连设计都不清楚,AI 生成的东西就是一堆看起来能跑但结构混乱的碎片。
2.2 它留下的最大坑:你失去了对代码的“心理模型”
什么叫心理模型?就是你在脑子里能模拟出这段代码运行起来的样子。你知道数据从哪来、经过哪些处理、存到哪去、什么时候会出错。传统手写代码的过程,其实就是在反复构建和修正这个心理模型。而 Vibe Coding 跳过了这个过程,你拿到的是结果,不是过程。
这会导致几个很具体的后果。第一,调试变慢。因为你不清楚代码的意图,报错时你只能靠猜和试。第二,改需求变危险。你不敢随便动 AI 生成的代码,因为你不知道动了之后会牵连到什么。第三,代码审查形同虚设。你看着一段 AI 生成的代码,觉得“好像没问题”,但其实你根本没有能力判断它有没有问题。
我踩过最典型的一个坑:让 AI 生成一个分页查询接口,它用了 offset 分页。数据量小的时候一切正常,数据量上去之后性能急剧下降。如果我手写,我大概率会直接考虑游标分页或者至少加个索引提示。但因为那是 AI 生成的,我当时的心理是“它能跑就行”,结果上线后被打脸。
2.3 一个简单的判断标准:你能不能不用 AI 把它重写一遍
我后来给自己定了一个很土但很有效的标准:任何一段 AI 生成的代码,如果我把 AI 关掉,能不能凭自己的理解把它重写出来?如果能,说明我理解了,这段代码我可以放心用。如果不能,那这段代码就是技术债,我得先把它搞懂再继续。
这个标准听起来很笨,但它帮我筛掉了大量“看起来能用其实不能用”的代码。你也可以试试。它不需要你逐行背诵,只需要你能说清楚:这段代码的输入是什么、输出是什么、中间经过了哪些关键步骤、边界条件在哪里。
3. Agent、Prompt、Agent Engineering:热词背后的真实技术分水岭
3.1 Prompt 不是“说话”,是“编程”
很多人把 Prompt 理解成“跟 AI 聊天”,这是最大的误解。在工程语境下,Prompt 是一种新的编程接口。你写的每一句话,都在定义输入、约束输出、指定格式、设定边界。它和写函数签名、写类型定义、写接口文档,本质上是同一类工作。
我举个具体的例子。你要让 AI 帮你从一段用户反馈里提取结构化信息。随便写一句“帮我提取一下重点”,和写一段包含字段名、字段类型、空值处理、示例输入输出的 Prompt,得到的结果质量差距是数量级的。后者需要你具备的能力,其实和写一个数据解析函数需要的能力高度重合:你得知道什么是好的输入、什么是合法的输出、异常情况怎么处理。
所以“Prompt 闪退”或者“invalid prompt”这类问题,表面上是工具报错,深层原因往往是你的 Prompt 本身结构不完整、约束不清晰、边界没定义。这跟写代码时参数没校验、异常没捕获,是一模一样的问题。
3.2 Agent 不是“更聪明的聊天机器人”,是“带工具的决策循环”
Agent 这个词现在被用得很泛。我的理解很简单:Agent 就是一个能自己决定下一步做什么、并且能调用工具去执行的东西。它和普通对话 AI 的核心区别在于“循环”和“工具”。
普通对话 AI 是你问一句它答一句,它不主动做事。Agent 是你给它一个目标,它自己拆解步骤、选择工具、执行、观察结果、再决定下一步,直到目标完成或失败。这个循环里,最关键的不是模型有多聪明,而是工具定义得清不清楚、状态管理得对不对、失败重试机制有没有。
我搭过一个很小的 Agent 用来做日报汇总:它需要读取几个数据源、做简单计算、生成一段文字、发到指定地方。这个 Agent 本身逻辑不复杂,但我花了大量时间在定义工具接口和错误处理上。比如数据源读取失败怎么办、计算结果为空怎么办、发送失败要不要重试。这些才是 Agent 开发真正的工作量所在。
3.3 Agent Engineering 的核心:把不确定性关进笼子
Agent 最大的特点是它行为不确定。同样的输入,它可能走不同的路径。这在演示时很酷,在生产环境里很可怕。Agent Engineering 要解决的核心问题,就是怎么在保留灵活性的同时,把不确定性控制在可接受范围内。
常见的手段包括:限制工具集合、强制输出格式、设置最大循环次数、关键步骤人工确认、全链路日志记录。这些手段听起来不新鲜,但组合起来用,效果差别很大。我自己的经验是,宁可把 Agent 的能力范围收窄,也不要让它在一个开放环境里自由发挥。一个只能做三件事但每件都做得很稳的 Agent,比一个什么都能做但经常出错的 Agent 有价值得多。
4. 从 Vibe 到工程:一个普通开发者的进化路线
4.1 第一阶段:用 Vibe Coding 做原型,但强制自己写注释
我建议所有刚开始用 Vibe Coding 的人,都给自己加一条规矩:AI 生成的每一段代码,你都要用自己的话写一遍注释。不是那种“这是一个函数”的废话注释,而是“这段代码在做什么、为什么这么做、边界在哪里”。
这个动作看起来多余,但它强迫你构建心理模型。你写不出来,就说明你没懂。你没懂,这段代码就不该进你的项目。我坚持这个习惯大概三个月后,发现自己看 AI 生成代码的速度和理解深度都明显提升了。
4.2 第二阶段:把 Prompt 当代码来管理
当你开始频繁使用 AI 做开发时,Prompt 会越来越多。这时候你需要像管理代码一样管理它们:版本控制、分类存放、写清楚每个 Prompt 的用途和输入输出示例。
我现在的做法是,每个项目里有一个 prompts 目录,里面按功能分文件。每个 Prompt 文件头部写清楚:用途、输入格式、输出格式、已知限制。这样当我要改一个功能时,我能快速找到对应的 Prompt,而不是在聊天记录里翻半天。
4.3 第三阶段:学会拆解,而不是一次性描述
新手最容易犯的错误,是把一个复杂需求用一大段话描述给 AI,然后期待它一次生成完美结果。这几乎不可能。正确的做法是拆解:先让 AI 生成数据结构,确认无误后再生成服务层,再生成接口,再生成前端。每一步都验证,每一步都理解。
这个拆解过程本身就是一种核心能力。你能拆得多细,决定了你能驾驭多复杂的项目。我见过一些开发者,他们用 AI 的效率极高,不是因为 Prompt 写得多花哨,而是因为他们拆解问题的能力极强。
4.4 第四阶段:建立自己的验证清单
AI 生成的代码,必须经过验证才能用。我给自己列了一个简单的清单,每次都要过一遍:
- 输入边界有没有处理?空值、超长、特殊字符。
- 错误路径有没有覆盖?网络失败、数据不存在、权限不足。
- 性能有没有隐患?循环里查数据库、无限制列表、缺少索引。
- 安全有没有问题?用户输入直接拼接、敏感信息硬编码。
- 可维护性怎么样?命名是否清晰、逻辑是否集中、依赖是否明确。
这个清单不复杂,但能挡住大部分低级问题。关键是养成习惯,不要因为“它能跑”就跳过验证。
5. 常见问题与排查技巧实录
5.1 AI 生成的代码跑不通,怎么快速定位
先看报错信息,不要急着改代码。大部分时候报错信息已经告诉你问题在哪。如果报错信息不明确,就把 AI 生成的代码拆成几段,逐段运行,找到出问题的那一段。然后针对那一段,重新写一个更具体的 Prompt,把输入输出和边界条件说清楚,让 AI 重新生成。
我自己的经验是,与其在错误代码上修修补补,不如重新生成。因为 AI 生成的代码往往结构耦合,改一处可能影响另一处,重新生成反而更快。
5.2 Prompt 被标记为违规或无效怎么办
这种情况通常是因为 Prompt 里包含了不明确的指令、敏感词或者格式问题。解决办法是:把 Prompt 拆得更具体、更结构化,去掉模糊表达,明确输入输出格式。如果还是不行,就换一种表达方式,用更中性的语言描述同样的需求。
5.3 Agent 执行到一半卡住或报错
先看日志,确认它卡在哪一步。常见原因包括:工具返回格式不符合预期、循环次数超限、某个外部服务不可用。解决办法是给每个工具调用加上超时和重试,给 Agent 设置最大步数,关键步骤加人工确认。不要指望 Agent 自己能处理所有异常,那是不现实的。
5.4 怎么判断一个 Agent 框架适不适合自己
不要看它支持多少功能,看它能不能让你清楚地知道 Agent 在做什么。如果一个框架让你完全看不懂执行过程,那它再强大也不适合生产环境。我选框架的标准很简单:日志清晰、工具定义简单、状态可追踪、失败可恢复。满足这几点,基本就能用。
6. 我个人的几条实操心得
第一,不要把 Vibe Coding 当成偷懒的工具,把它当成加速理解的工具。你用它生成代码,然后去读、去改、去重写,这个过程本身就是在学习。
第二,Prompt 的质量取决于你对问题的理解深度。你理解得越深,Prompt 写得越准,AI 生成的结果越好。这是一个正循环。
第三,Agent 的价值不在于它多智能,而在于它多可靠。一个只能做三件事但每件都做得很稳的 Agent,比一个什么都能做但经常出错的 Agent 有价值得多。
第四,永远保留手写代码的能力。不是说不让你用 AI,而是说当 AI 不可用、不好用、用不起的时候,你得能自己上。这个能力是你的底牌,不能丢。
第五,定期回顾自己用 AI 生成的代码,看看哪些地方反复出问题。那些地方往往就是你理解最薄弱的地方,值得花时间补上。
这个领域变化很快,今天好用的工具明天可能就换了,今天流行的框架明天可能就过时了。但有些东西不会变:对问题的理解、对代码的掌控、对质量的坚持。这些东西,才是决定一个程序员能走多远的关键。