Matt 与 Uncle Bob 的访谈 - AI 时代的代码质量

本文基于 Robert C. Martin(Uncle Bob,鲍勃大叔)与 Matt Pocock 的访谈整理,全文约 56 分钟。文中时间戳对应原视频,可以配合切片视频一起看。

鲍勃大叔在 2024 年底(以转写稿相对时间”December of last year”为准)开始认真用 AI 写代码。他当时在做一个项目,让一个早期的 Grok Agent 帮忙。Agent 写得快,但总在身后留垃圾,他得一直跟在后面收拾。用他自己的话说,它”总是留下一小坨狗屎”([00:05:12])。

快是快,可收拾残局的时间把这点快全吃掉了。他觉得挫败,后来转念一想,既然它快,那就让它把脏活也干了。但他后来发现,问题不在 AI 写得慢或写不出,而是它留下的脏代码会反过来拖垮它。这篇文章讲的就是怎么解这个结。 鲍勃大叔第一次让 AI 写代码,结果留下一堆烂摊子

脏代码对 AI 一样是灾难

前提是代码不能太脏。他注意到一个现象。Agent 留下垃圾,他不清,直接让它做下一件事,垃圾就越积越多。然后 Agent 开始变慢,改一处坏一处,修好这一处又碰坏那一处,在原地打转。他甚至遇到过一个 Agent 直接撒手不干了(鲍勃转述,非原话)([00:11:00])。

他的结论是,Agent 和人类一样会被脏代码拖垮,也许阈值比人高一些,但阈值确实存在([00:11:36])。代码脏到一定程度,AI 就完全处理不了了。所以他的做法是让 Agent 跑代码,自己盯住代码质量指标,定期抽查,把质量关留在人手里([00:09:07])。 脏代码让 AI 原地打转,鲍勃大叔把质量关留在人手里

指令靠不住,工具才靠得住

很多人遇到 Agent 写得烂,第一反应是往提示词里加规则,加满一页,甚至想把整本《代码整洁之道》喂进去。鲍勃大叔试过,没用。

他做过一点研究,模型有个毛病叫 lost in the middle,上下文窗口里开头和结尾的内容权重最高,中间的全被稀释。长指令里或许只有开头几句还能保持优先级,第五十句、第八十句早沉进中间了([00:13:54])。主持人 Matt Pocock 引用 Dex Hawthorne 的说法,把上下文窗口分成聪明区和糊涂区,开头一百五十 K token 还算聪明,往后每个 token 都在拥挤的房间里喊,谁也听不见谁([00:15:22])。 指令写在中间没人听,lost in the middle

所以他的原则是,初始提示压到最短,把约束交给确定性工具。工具不看上下文,说一不二。让 Agent 改代码,改到工具检查通过为止,这是个验证闭环([00:16:57])。

两件当年做不动的老工具

既然指令靠不住,那就靠工具。鲍勃大叔想到的第一件工具叫 CRAP。把代码覆盖率和一个函数的圈复杂度(cyclomatic complexity,控制流路径数)揉在一起算分,分数越高,函数越烂([00:05:56])。第二件叫突变测试,程序自动把你的代码改出毛病,把小于号翻成大于号,把等号翻成不等号,每翻一处就跑一遍全部测试,测试没拦住的那个突变就是漏网的([00:06:52])。

这两件工具在 2000 年代初都很好用,也都做不动。鲍勃大叔当年在自己项目上跑过,CRAP 查出一堆烂函数,修完要改全部测试,他舍不得花这个时间。突变测试更夸张,测试套件跑四分钟,要翻几百次,只能挂机跑一整夜。都是差不多的结论,好东西,但没法进日常流程([00:06:30][00:07:30])。

到 2024 年底,他忽然想通了。这些活又无聊又费时,正好是 AI 最不怕的。他让 Agent 写完代码以后自己跑 CRAP,自己把分数压下去,再跑突变测试,把漏网的测试补上。从前要跑一整夜的活,Agent 可能只要三十分钟([00:08:04])。

一条五段式的流水线

工具之外,他现在跑一条 Multi-Agent 流水线,每个 Agent 只干一件事。

第一段是 specifier,把人类写的需求文档变成 Gherkin 验收测试和一份 QA 流程([00:20:25])。第二段是 coder,写单元测试和实现代码,把 Gherkin 跑通([00:21:11])。第三段是 cleaner,跑 CRAP 分析,收拾 coder 留下的烂摊子([00:21:32])。第四段是 hardener,跑突变测试,要求所有突变都被杀死(100% 覆盖),冷酷无情([00:21:47])。最后是 QA Agent,把 QA 文档变成可执行脚本,操作界面,得出确定性结果([00:22:09])。 五段式 Multi-Agent 流水线,specifier 从需求文档产验收测试

账是这样算的。让单个 Agent 干一个任务,五分钟能出结果,质量存疑。走完这条流水线,大约一小时。听起来慢,可人类干这件事要半天([00:22:31])。一小时对半天,还有四五倍的效率差,质量还比人工高出一截。

Multi-Agent 还有两个好处。可以并行,他的笔记本同时跑三个 coder 没问题。每个 Agent 只干一件事,上下文窗口小,lost in the middle 的问题也轻了([00:19:21])。Agent 可以干完就销毁,下一个带着干净的上下文进来。

纪律别强加,价值要坚持

鲍勃大叔写过一本《代码整洁之道》,是 TDD 的积极布道者。但他明确说,TDD 是人类纪律,不该强加给 AI([00:34:03])。人类短期记忆小,写一条测试、让测试通过、再写一条,这个节奏对人类是必要的。AI 的短期记忆又大又准,非要它一条测试一条代码地交替写,没有意义。他试过,模型最后总会偷偷变成先写函数再补测试。 纪律别强加,价值要坚持,TDD 是人类节奏

他有一句话说得好,强加人类纪律给 Agent 是错的,强加人类价值是对的([00:35:01])。这里的”价值”可以理解为整洁、结构、测试覆盖这些底线,具体怎么干活,让 AI 自己来。有些阈值还得放宽,他给人类定的 CRAP 分数上限是 4,给 AI 放宽到 6,还在试探能不能到 8([00:32:49])。

规划别做太满,成本已经趋近于零

他还劝大家别搞重规划。他说过一句很老的话,如果改一栋房子只花一块钱,包括改地基、改屋顶,你会请建筑师花几千块画完美图纸,再让施工队一次建完吗?还是直接走到施工队面前说,地基放这,不行,挪那边,厨房放这,客厅放那,来回改([00:40:04])。

答案显然是后者。AI 时代改代码的成本已经跌到接近零,重规划是拿贵的时间换便宜的时间。他试过把计划写到完美再交给 Agent,每次都翻车,计划赶不上变化,Agent 会固执地照计划走,计划有漏洞它就卡住,最后还得人停下来重写计划([00:37:08])。他的新方向是回到敏捷,先干一个故事,看看架构,手动理一理,再干几个故事。他承认,架构整理这一步可能永远得靠人([00:38:05])。

新人怎么学

主持人最后问了一个很实在的问题,AI 把战术编程都吃掉了,新人怎么学战略编程?鲍勃大叔的答案分成两步。

第一步,先自己写一段时间代码(他说一年,但马上又说不确定多久),知道 AI 在跟什么东西打交道([00:47:05])。第二步更狠,入职以后把自己当 Agent。主管给你什么任务,你就做什么,和 AI 用同一套确定性工具,接受同样的检查。头几个月会非常没效率,但能学到大量东西。熬过这条流水线,你才配去指挥一个 Agent([00:47:23])。说得直接一点,你先当几个月的 AI 下属,才知道怎么当 AI 的上司。

软件基础为什么依然重要

聊到结尾,他想起一句话,记不清是不是 Dijkstra 说的,但软件确实是人类尝试过最复杂的东西([00:53:34])。基础知识的用处,是把这种复杂组织成能被理解的形式,不仅人能理解,模型也能理解,毕竟模型是按人脑设计的。 软件基础为什么依然重要

他讲了一个抽象层的历史。二进制,汇编,编译器,模型,每一次抽象层往上升,底下的人都在抱怨,说这要毁了一切,说我们都要失业了,说以后五岁小孩都能写代码([00:54:41])。这些话在二进制时代就说过一遍。每一层都是同样的剧本,但规则从来没变过。

他说,你扔掉的规则,就是那些你一年后要从地板上捡起来、掸掉灰、记起当初为什么的规则([00:55:39])。所以回到开头那句话。AI 没问题,是拖着脏代码会让它崩溃。软件基础,就是那串让 AI 不至于把自己拖垮的底盘。


时间戳速查

主题 时间
第一次用 AI 写代码,它留下狗屎 00:04:20
Agent 被脏代码拖垮 00:11:00
lost in the middle,指令靠不住 00:13:54
CRAP 和突变测试的来历 00:05:40
五段式 Multi-Agent 流水线 00:20:25
5 分钟变 1 小时,效率翻 5 倍 00:22:31
纪律别强加,价值要坚持 00:34:00
一美元改房子,规划别做太满 00:40:04
新人把自己当 Agent 训练 00:47:23
软件基础为何依然重要 00:53:00

来源 https://www.youtube.com/watch?v=zcLPGC-tvgk Matt Pocock 频道访谈