§ 14.3 · Section

AI 当编程搭档

「跑通了」是最不可靠的验收标准

写代码是 AI 帮助最明显的场景之一——它能在几秒钟内写出你要查半小时文档才能写对的调用,能把一段乱七八糟的脚本整理清楚,能在你完全陌生的语言里给你一个能跑的起点。但它也是风险最不对称的场景:一篇有问题的文章会被读者当场质疑,一段有问题的代码可以安静地跑三个月,然后在最不合适的时候出事。这一节要认真讲 Vibe Coding(凭感觉编程——不细读生成的代码、跑通了就往下走)的真实收益与真实代价,讲清一个反直觉的结论:最危险的不是它写出跑不起来的代码,而是它写出「跑得通、看着对、但你不理解」的代码。跑不通的代码会当场报错,看着对的代码要等到上线之后才咬人。本节复用前面章节的地基:Agent 的自主权边界见 § 11.1,工具调用的本质见 § 11.2,注入与权限的乘法关系见 § 13.5。

生活场景
🔌 一个手很快的水电师傅

你家要加几个插座。请来一位师傅,手极快——开槽、埋管、穿线、接头、封槽,一上午干完六个位置,比你预期快了一倍。你试了一下,每个插座都通电,手机充得好好的。

你会怎么验收?大多数人的答案是:插上试试,能用就行。

而一个懂行的人会看另外几件事:线的截面积够不够(够不够粗,能不能承受空调那么大的电流)、接头是压接还是简单缠一下、有没有接地线、走线是不是从卫生间那面墙的防水层里穿过去了、封槽前拍照留底没有。

这些问题的共同点是:不检查,今天也一样能用。插座通电,充电正常,什么都看不出来。它们会在半年后的某个时刻出事——你插上空调那一刻线发烫,或者卫生间的墙渗水,或者某天跳闸查不出原因。

而且封了槽之后,你连看的机会都没有了。

AI 写代码的验收和这件事结构完全一样。「跑通了」相当于「插上能充电」——它是一个真实的信号,但它只能排除最表层的一类问题。真正会咬你的东西——错误没处理、边界情况没考虑、并发下会串数据、密钥硬编码在代码里、依赖库有已知漏洞——在开发环境里通通不会暴露。

先说清楚 Vibe Coding 是什么,以及它的收益是真的

Vibe Coding 这个词近两年流行起来,指的是一种工作方式:你用自然语言描述你想要什么,让模型生成代码,你不逐行读,跑一下,看结果对不对,不对就再让它改。循环往复,直到跑出你想要的东西。说白了就是「凭感觉编程」——你判断的依据是运行结果给你的感觉,不是对代码的理解。

这一节不打算贬低它,因为它的收益是真实的,而且在某些场景下大得离谱:

这五类的共同特征值得点出来:代码的生命周期短、错误后果可控、不需要别人接手维护。本质上就是一次性餐具——用完就扔,不必讲究材质。

但反过来看,这也就划出了 Vibe Coding 的边界:一旦代码要长期存在、要被别人读、要处理真实用户的数据、要在线上跑,那些被跳过的检查就会一个一个变成账单。

为什么「跑通了」是一个这么弱的标准

这是本节最要紧的一段。「跑通了」这个信号弱在哪儿?弱在它只覆盖了你测试时用的那一条路径

打个比方:你买了一辆二手车,试驾了十分钟,在小区周边平路上开了两圈,一切正常。这十分钟没有测到的东西包括:上高速会不会抖、下雨天雨刮器行不行、空调制冷够不够、连续爬坡水温会不会高、后备箱漏不漏水、以及最要紧的——刹车片还剩多厚。试驾成功只证明「在这十分钟的条件下它能动」。

代码里对应的清单是这样的。下面每一条都是「跑通了但仍然有问题」的典型形态:

问题类型为什么开发时不会暴露什么时候咬你
错误没处理你测试用的输入都是正常的,网络也是通的用户输入了一个空值、或者接口超时那一刻。程序不是报错,是给出一个错的结果——这种最难查
边界条件你测了 10 条数据,没测 0 条和 100 万条数据量变化时。相当于电梯载重——平时四五个人没事,塞进十五个就出问题
并发安全开发时只有你一个人在用两个用户同时操作同一条记录。这类 bug 出现的概率与访问量成正比,所以上线初期一切正常,火了之后开始出怪事
资源没释放跑一次不会有事连续跑几万次之后内存或连接被耗尽。其实就是每次用完杯子不洗,一天没事,一个月厨房就没法用了
密钥硬编码能跑,功能完全正常代码被提交到公开仓库那一刻。这一条造成的实际损失可能是全表里最大的
SQL 拼接正常输入下查询结果完全正确有人在输入框里输入特殊字符时。这是最古老的一类攻击,至今仍在发生
依赖有已知漏洞装上就能用,功能没问题漏洞被利用时。而且这一条你压根不会想到去查——因为代码是它写的,依赖是它挑的
权限过大权限越大越不容易报错,所以「跑通」反而更顺出事时后果被放大。§ 13.5 讲的乘法关系正是这个:注入决定「能不能让它听话」,权限决定「听话后后果多大」
逻辑对但语义错代码严格按它理解的需求执行,而它理解错了业务上发现数据不对。最典型的是边界的包含关系——「本月数据」到底含不含最后一天,差一天的账

这张表里最值得警惕的不是某一条,而是它们的共同结构全部都在「功能正确」之外,全部都在开发环境里沉默,全部都在真实条件下才出现。

而 Vibe Coding 的验收方式——跑一下看结果——恰好只覆盖「功能正确」这一项。这不是说这种方式没用,是说它的覆盖面必须被清楚地知道。相当于体检只查了身高体重,报告上的数字都对,但你不能因此说身体没问题。

Analogy · 借来的房子与自己盖的房子

这一节最重要的一个判断,用房子来讲最清楚。

情形一:你要在一个地方住三天。你租了个短租房。你不会去查这房子的地基、不会问钢筋用的几号、不会关心防水层做没做。你只关心:热水有没有、床干净不干净、门锁不锁得住。这是完全理性的——你三天后就走了,房子的长期问题跟你无关。

情形二:你要在这儿住二十年。同一套验收标准就变成了灾难。你必须关心地基、防水、承重、电路容量、管道材质,因为这些东西的特点是:住进去的第一年你完全感觉不到,但它们决定了第五年到第二十年你过得怎么样。而且它们全都在封了墙之后就看不见了。

Vibe Coding 是短租房的验收标准。它对短租房完全够用,甚至是最优选择——花三天去查地基是荒谬的。

真正的问题出在一个非常普遍的场景:你以为自己在租三天,结果住了二十年。这在代码里发生得极其频繁——一个「先跑起来看看」的脚本,跑通了,同事觉得好用,接到了别的流程上,慢慢变成一个每天定时执行的东西,两年后它已经是公司数据流里的一环,而没有人读懂过它。

所以本节最实用的一条建议不是「要读懂代码」,而是:在写之前先明确这段代码属于哪一类,并且在它性质改变的那一刻,补做当初省掉的检查。说白了:短租房要长住,得回头把地基查一遍——不查也能住,但你是在赌。

一张分级表:什么代码可以凭感觉,什么必须读懂

与其争论「该不该 Vibe Coding」,不如给一张分级表。判断标准是两个问题:错了会有什么后果?谁将来要读它?

级别典型代码验收标准必做的动作
L0 · 一次性合并表格的脚本、批量改文件名、跑一次的数据清洗跑通即可只有一条:先备份原始数据这一条能救你大部分事故
L1 · 自己长期用你自己的工具脚本、定时任务、本地小程序跑通 + 你能说清它每一步在干什么加一段注释写清「这段是干什么的、有什么已知限制」;异常时要能大声报错而不是静默失败
L2 · 别人要读团队仓库里的代码、开源项目、要交接的东西逐行读懂 + 命名与风格符合项目约定补测试;把 AI 生成的部分做一遍完整代码审查(清单见下)
L3 · 处理真实用户数据登录、支付、存储个人信息、对外接口读懂 + 安全审查 + 有人复核密钥管理、输入校验、权限最小化、日志脱敏。这一级不允许「我大概知道它在干什么」
L4 · 后果不可逆批量删除、批量发送、资金操作、生产库改结构读懂 + 干跑(dry run)+ 人工确认每一次执行必须有「只打印不执行」的模式;必须有回滚方案;这一级的核心不是代码质量,是「出错时还能不能挽回」

这张表的用法很简单:动手之前先给自己写的这段代码定个级。定完级,做什么就清楚了。

而且要注意 L4 的判断标准和前四级不一样:前四级关心的是「代码好不好」,L4 关心的是「错了能不能撤回」打个比方:切菜切歪了可以再切一刀,但盐放多了没法从汤里捞出来。凡是属于「盐放多了」这一类的操作,谨慎的重点不在手法,在下手之前那一秒。这一点 § 11.1 讲 Agent 选型时说过一条同源的原则:给 Agent 的自主权,应当正好等于「它出错时你能承受的损失」。

代码审查清单:AI 生成的代码要专门查这九项

下面这份清单是针对 AI 生成代码的,不是通用代码审查。它挑的是模型生成时最常出问题的地方——这些地方通常不是「写错了」,而是「写成了最常见的那种写法,而你的场景需要另一种」。

你可以自己逐项检查,也可以把清单交给模型让它自审(但要注意后一种做法的局限,下面会说):

【AI 生成代码 · 九项审查】

1. 异常路径:网络失败、文件不存在、返回空、超时——
   这四种情况分别会发生什么?会静默继续还是会报错?
2. 边界输入:空、0 条、1 条、极大量、重复项、
   含特殊字符——各自表现如何?
3. 硬编码:有没有把密钥、路径、URL、账号、
   魔法数字直接写在代码里?
4. 输入校验:所有来自外部的输入(用户、文件、接口)
   有没有校验?拼接进 SQL / 命令行 / 路径了吗?
5. 权限范围:这段代码需要的最小权限是什么?
   它实际拿到的权限是什么?两者差多少?
6. 资源释放:打开的文件、连接、锁,
   在出异常时也会被关掉吗?
7. 依赖:引入了哪些库?版本是什么?
   有没有引入我不需要的重型依赖?
8. 语义核对:需求里的每个限定词——
   「本月」含不含最后一天?「大于」还是「大于等于」?
   「去重」按哪个字段去重?
9. 沉默的失败:有没有 catch 住异常之后什么都不做的地方?
   有没有把错误当正常值返回的地方?

九项里第 8 项和第 9 项最值得展开,因为它们最容易被漏。

第 8 项「语义核对」。模型出错最常见的方式不是语法错、不是逻辑错,是把你的需求理解成了另一个合理的意思打个比方:你跟装修师傅说「这面墙全刷白」,他把踢脚线也刷了——他没做错,是「全」这个字有两种理解。代码里的同类例子极多:「最近七天」是含今天还是不含、「排序」是升还是降、「更新」是覆盖还是合并。这类错误的特点是代码完全正确地执行了一个错误的需求,所以任何测试都测不出来——因为测试也是按同一个误解写的。

第 9 项「沉默的失败」。这是所有问题里最难查的一类。它长这样:程序捕获了一个错误,然后什么都不做,继续往下跑。结果是:程序没崩、没报错、给出了一个结果,而这个结果是错的。

相当于体温计电池快没电了,它不提示,就给你显示 36.5——你以为没发烧。一个会大声报错的程序远比一个悄悄给错答案的程序安全。所以审查这一项时的具体动作是:搜一遍代码里所有捕获异常的地方,逐个确认「这里发生错误时,我能知道吗」。

关于「让模型自审」的局限,必须说清楚:让它检查自己生成的代码是有价值的,但不能当成独立验证。原因和 § 14.2 quiz 里讲的一样——同一个模型的两次输出不构成独立验证,它审自己的代码时,那些「因为它就是这么理解需求的」而产生的错误,它同样看不出来。说白了:让抄错题的人自己检查抄得对不对,他会照着自己抄的那份再念一遍。更有效的做法是把「需求原文」和「生成的代码」一起给它,让它回答「这段代码与需求有哪几处不一致」——把参照物换成需求,而不是它自己的理解。

提问方式决定代码质量:五条具体改法

很多人抱怨「它写的代码不行」,其实问题在需求描述。这一段给五条能立刻改善结果的具体改法,每条都是 § 10 章原则的应用。

这五条里如果只用一条,用改法三。因为它把最难发现的一类错误(需求被理解成另一个意思)从「事后排查」变成了「事前确认」,成本几乎为零,收益极高。

用 Agent 写代码:多出来的那层风险

现在很多编程工具已经不只是「生成一段代码给你」,而是能自己读文件、自己改多处、自己跑命令、自己看报错再改——这就是 § 11.1 讲的 Agent(智能体)。这带来了很大的便利,也带来了一层新的风险,必须单独讲。

第一层多出来的风险:它的动作是有副作用的。§ 11.2 讲过一个很重要的澄清:模型压根没有手,它只是写了一张格式规整的纸条,真正执行的是外面那套系统。这意味着风险的大小不取决于模型有多聪明,取决于你给外面那套系统开了多大的权限。

相当于你给一个新来的实习生一串钥匙。他很勤快、很聪明、也很想帮忙。但如果那串钥匙里有财务室和机房的,那么他任何一次善意的误操作,后果都由钥匙的范围决定,而不是由他的善意决定。这个类比 § 13.5 用过,那一节的结论在这里直接适用。

第二层多出来的风险:pass^k 问题。§ 11.1 讲过一个很硬的数学事实:如果单步成功率是 0.95,连续八步全对的概率只有 0.66一个「95 分」的 Agent 在连续八步的任务上是不及格的——这就是「演示惊艳、上线出事」的全部数学原因。

写代码这件事恰恰是典型的多步任务:读需求 → 找到相关文件 → 改动 → 跑测试 → 看报错 → 再改 → 提交。每一步都有出错概率,而错误会往下传。说白了:一条七道工序的流水线,每道工序合格率 95%,最后成品合格率只有七成。

第三层,也是最容易被忽略的:间接注入。§ 13.5 讲过这个攻击面,它在编程 Agent 上格外要紧。因为编程 Agent 会读很多东西:issue 描述、依赖库的说明文档、网页上的报错解答、别人提交的代码注释。而这些内容里可以藏着指令。

§ 13.5 引过 Anthropic 官方文档的原话:某些情况下模型会照做内容里发现的指令,即使它与用户的指令冲突。官方给的建议是「隔离」——把模型与敏感数据和敏感操作隔开,而不是承诺修好它。

落到编程场景的具体做法:

做法具体怎么做防的是什么
限权用单独的工作目录;不给它生产环境凭据;不给它能删库的账号§ 13.5 的乘法关系:权限决定「听话后后果多大」
可回滚动手之前先提交一次,或者建一个分支;重要文件先备份让「错了」变成「撤回一下」。这是所有措施里性价比最高的一条
看它做了什么看改动清单(diff),不要只看它的总结。它的总结是它以为自己做了什么防「它说改了三处,实际动了七处」
危险命令人工确认删除、覆盖、推送、发请求、装依赖——这几类不自动执行对应上面 L4 级:后果不可逆的操作,谨慎的重点在下手前那一秒
不让它碰密钥密钥放环境变量或密钥管理服务,不进代码、不贴进对话同时防两件事:注入导致外泄,以及 § 13.3 讲的「输入内容可能被用于训练」(答案分产品线,消费级与 API 的默认策略不同
缩短任务链把一个十步任务拆成三个三步任务,中间人工验收直接对付 pass^k:链条越短,整体成功率越高

最后一行值得强调一下,因为它是唯一一条能从数学上提高可靠性的做法。其实就是:与其求每道工序都做到 99%,不如把工序拆成三段、每段做完检一次——检验点把错误的传播截断了。

一个具体的例子:看着完全没问题的三十行代码

把上面所有内容落到一个具体场景上。假设你要写一段代码:读一个用户上传的 CSV 文件,把里面的订单金额汇总,写进数据库。模型给了你一段三十行的代码,你跑了,用自己造的十行测试数据,结果完全正确。

它跑通了。现在按九项清单过一遍,会发现什么?

这六条里没有一条是「代码写错了」。每一条都是「代码正确地实现了一个没被说清的需求」。而这恰恰是本节最想传达的:AI 写代码的主要风险不在它的能力,在需求与验收的模糊地带。

所以最有效的改进往往不是换个更强的模型,而是把改法三用上:让它先列出假设。上面六条里至少有四条会在那份假设清单里冒出来,而那时候改的成本是一句话。

初学者的特殊处境:它会不会让你永远学不会

这一段专门写给正在学编程的人,因为这个处境和熟练开发者完全不同,不能套用同一套建议。

熟练开发者用 AI 生成代码,风险是「漏检查」;初学者用 AI 生成代码,风险是「学不会」。这是两个性质不同的问题。

为什么?因为编程这件事有个特点:能力主要来自「自己写出来、跑错了、找到原因、改对」这个循环,而不是来自读懂正确的代码。

打个比方:学游泳的人的能力不是从看教学视频里长出来的,是从「呛了几口水、发现自己头抬得太高、下次调整」里长出来的。而 AI 生成代码这个动作,恰好把「跑错了、找原因」这一环整个抽掉了。

但这不等于初学者不该用它——那个建议不现实,也不合理。正确的做法是把它用在循环的不同位置上:

学习环节该怎么用绝对不要怎么用
看不懂报错放心用,这是它最好的用途。贴报错,问「这个报错在说什么,可能的原因有哪几类」贴报错然后要它「帮我改好」——你会失去读报错这项最重要的基本功
不知道从哪下手让它给思路而非代码:「这个功能大致需要分几步,每步用什么概念,不要写代码」让它直接给完整实现
写完了但不确定好不好这是黄金用法:「我写的代码在这儿,指出问题但不要替我改」让它给一个「更好的版本」——你会直接抄,而且学不到为什么
某个语法记不住放心问。这类问题查文档和问它没有本质区别,只是快一点无——这一格没有陷阱
做作业或练习做完之后用它当批改者(见 § 14.1 那张作业表)让它做。练习的全部价值就在于你自己动手那部分
读别人的代码让它解释,然后自己去预测这段代码在异常输入下的行为,再跑一下验证只读它的解释就算读过了——这就是 § 14.1 表里那条「看情况」的分界

这张表里最值得记住的是第一行和第三行。

第一行「看不懂报错」是 AI 对初学者最大的善举。因为报错信息是编程里最陡的一道门槛——它们通常很长、有大量无关的堆栈信息、用词晦涩。很多人放弃学编程就是死在这一步:不是不会写,是看不懂错在哪,于是完全卡住。而这道门槛现在几乎被移平了。但要坚持一点:让它解释报错,不要让它改代码。解释报错是在帮你补一项能力,替你改代码是在替你跳过这项能力。

第三行「写完了让它挑错但不替你改」是最有效的成长方式。它的效果甚至超过找一位真人师傅——因为真人不会有耐心逐行看你写的每一段练习代码,而它会。其实就是你有了一个随时在线、永远不嫌你烦、专门盯着挑错的搭档,而这在过去是极稀缺的资源。

还有一个具体的自测办法值得推荐,可以叫「合上再写一遍」:AI 给了你一段代码,你读懂之后,关掉它,凭理解自己重新写一遍。写出来跑通了,说明你真懂;写不出来,说明你只是读懂了。这个动作和 § 14.1 的费曼式追问是同一件事——把「输入」转成「输出」,检验立刻就诚实了。

一个容易被忽略的长期风险:你会看不出代码写得差

这一段讲的是最缓慢、也最难自察的一种损失。它不发生在某一次提交上,发生在几个月的时间尺度上。

现象是这样的:你用得越顺手,读代码就读得越粗。因为大部分时候它写得挺好,你扫一眼、觉得没问题、跑通了、提交。这个流程每天重复几十次,而每一次都在削弱一件事:你对「这段代码写得好不好」的判断力。

这就是章总览页提到的自动化偏差(automation bias)——说白了就是机器帮你做得越久越好,你就越不检查它。

相当于长期依赖导航开车的人,在熟悉的城市里也会失去方向感。不是导航把方向感拿走了,是你太久没用它,它自己退化了。

这件事有两个后果,第二个更麻烦:

对策不是少用,而是刻意保留一部分自己写。几条很具体的做法:

一是「核心逻辑自己写」。项目里那几段真正体现业务判断的代码,自己写。周边的、样板性的、重复性的,交给它。其实就是厨师会亲自掌握火候和调味,但不必自己去洗菜切葱。

二是定期做一次「不用 AI 的练习」。比如每周挑一个小任务,全程自己写、自己查文档、自己调错。这个动作的作用不是产出代码,是维持那条肌肉不萎缩。打个比方:平时坐电梯没问题,但每周爬一次楼梯,腿就不会废。

三是养成「读完先预测」的习惯。拿到它写的代码,在跑之前先自己判断一句:「如果输入是空的,这段会怎么样」。然后跑一下验证你的判断对不对。这个动作只花十秒,但它同时做了两件事——检查了代码,也检验了你的理解。本质上就是把「验收代码」和「训练自己」合成了同一个动作。

把谨慎做成习惯,而不是做成负担

读到这里,你可能会打起另一个算盘:「九项清单、五级分级、三层风险,这么多条,我哪有时间每条都做?」这个担心是真实的,而且如果不处理,它会导致一个更糟的结果——你把所有检查当成一件需要动员意志力的大事,于是干脆一件都不做,退回纯 Vibe Coding。

正确的姿势是把它降成成本极低的习惯,而不是每次都要走完整个流程。关键原则只有一句:把检查的重心放在「后果最大的那几处」,而不是平均用力。这一点跟很多生活场景是同一个道理。

收到一件快递,你不会把整个箱子拆开逐层查验——你会先看外包装有没有破损、是不是易碎品、需要冷藏的里面放了冰袋没有,剩下的你信任配送过程。去菜市场买肉,你会挑那几样今天就要下锅的,仔细看新鲜不新鲜——你不会把整个摊位的货都验一遍。不是「不需要认真」,是每个环节承担的风险不同,认真该花在风险最高的地方。

代码也一样。把上面的几张工具表翻译成三个优先级就够了:

这三条加起来,每次动手前多花的不过是两三分钟,却把九成以上的真实损失拦在了门外。最怕的从来不是你不懂哪一条检查,而是「想全做觉得累、于是全不做发飘」——降成三级默认动作之后,谨慎就不再是一道需要每次动员自己的工序,而是一组闭着眼也能完成的惯性。

Recap · 这一节的收束

核心结论:最危险的不是它写出跑不起来的代码,而是它写出「跑得通、看着对、但你不理解」的代码。跑不通的代码会当场报错;看着对的代码要等到上线之后才咬人。「跑通了」这个信号的覆盖面只有「功能正确」这一项,而真正会出事的九类问题——异常没处理、边界条件、并发安全、资源没释放、密钥硬编码、SQL 拼接、依赖有已知漏洞、权限过大、逻辑对但语义错——全部在开发环境里沉默相当于水电验收只试了插座能不能充电,没看线径、接头、接地和防水层。

Vibe Coding 的收益是真的,别贬低它。五类场景它是最优选择:一次性脚本、陌生语言起步、探索性验证、重复性改造、查用法。共同特征是生命周期短、错误后果可控、不需要别人维护——本质上就是一次性餐具,不必讲究材质。真正的问题是「你以为在租三天,结果住了二十年」:一个「先跑起来看看」的脚本被接到别的流程上,两年后成了数据流里的一环,而没有人读懂过它。所以关键动作是:在代码性质改变的那一刻,补做当初省掉的检查。

五级分级表:L0 一次性(跑通即可,但先备份原始数据)→ L1 自己长期用(能说清每一步)→ L2 别人要读(逐行读懂 + 补测试)→ L3 处理真实用户数据(不允许「大概知道」)→ L4 后果不可逆(干跑 + 人工确认 + 回滚方案)。L4 的判断标准和前四级不同:前四级关心「代码好不好」,L4 关心「错了能不能撤回」——切菜切歪可以再切一刀,盐放多了捞不出来。这条与 § 11.1 同源:给 Agent 的自主权应当正好等于「它出错时你能承受的损失」。

九项审查里最容易漏两项:第 8 项语义核对——模型最常见的出错方式不是写错,是把需求理解成另一个合理的意思(「本月」含不含最后一天、「全刷白」含不含踢脚线),这类错误任何测试都测不出来,因为测试也是按同一个误解写的;第 9 项沉默的失败——捕获异常后什么都不做,程序没崩、给出了一个错的结果,相当于电池将尽的体温计仍然显示 36.5。一个会大声报错的程序远比一个悄悄给错答案的程序安全。

让模型自审有明确局限:同一个模型的两次输出不构成独立验证。正确做法是把参照物换掉——把需求原文与代码一起给它,问「这段代码与需求有哪几处不一致」,而不是问「这段代码有问题吗」。

五条提问改法,只用一条就用改法三:让它写代码前先列出所有假设并等你确认。这一条把最难发现的错误从事后排查变成事前确认,成本几乎为零。另外四条:先给约束再给需求(尤其别漏「错误时希望怎么处理」)、把「怎么算对」写成可判定的例子(顺便变成测试用例)、小步走、要求它同时解释「什么情况会出错 / 考虑过但没采用的方案 / 性能瓶颈在哪行」。

用 Agent 写代码多出三层风险:动作有副作用——§ 11.2 讲过模型没有手,它只是写了张纸条,风险大小取决于你给外面那套系统开了多大权限;② pass^k——§ 11.1 的数字:单步 0.95、连续八步只剩 0.66,「演示惊艳、上线出事」的全部数学原因;③ 间接注入——编程 Agent 会读 issue、依赖文档、网页解答,这些内容里能藏指令,§ 13.5 引的官方原话是模型会照做内容里发现的指令,官方建议是隔离而非承诺修好。六条对策:限权、可回滚(性价比最高)、看 diff 不看它的总结、危险命令人工确认、不让它碰密钥、缩短任务链(唯一能从数学上提高可靠性的一条)。

最后那个 CSV 例子的教训一句话:六处问题里没有一条是「代码写错了」,全部是「代码正确地实现了一个没被说清的需求」。AI 写代码的主要风险不在它的能力,在需求与验收的模糊地带。

下一节讲验证。前三节教的都是怎么把它用起来,而用得越多、越顺手,验证能力不足带来的损失就越大——所以下一节其实是前三节的前提。

☰ 主页
学海无涯 · 智能篇 · § 14.3