之前在无印良品做品牌手册的时候,有个概念叫「空気感」——不是真的空,是留出让用户呼吸的空间。好的留白本身在说话。其实代码里其实也有类似的东西:每个函数、每个提交,都在传递一种「这里没什么需要担心的」的质感。
但AI生成的PR,恰恰是对这种质感的破坏。不是因为它有bug,而是因为它太“满”了。语法上滴水不漏,就像用Lorem Ipsum排的版面——所有像素都精确对齐,但一旦换成真实文案,整个结构就塌。因为你不知道那个留白是故意的,还是LLM的概率分布刚好没生成任何东西。
简单说
RPCS3这条新规的核心,在我看来不是信任链的重建,而是语义噪声的控制。code review的本质是阅读理解,而阅读的前提是每一行代码背后有一个可追溯的意图。AI生成的代码最致命的问题不是逻辑黑盒,而是意图真空。维护者review的时候,不是在检查“这段代码对不对”,而是在解码“这东西当初想干什么”——这个成本是指数级的。
举个具体例子。去年我在给某个开源排版引擎修一个东亚断行bug,翻到一段看起来非常精巧的Unicode边界处理逻辑,提交信息就一行 “fix line breaking”。git blame下去,提交者说“这是copilot建议的,当时跑过测试了”。但问题是,那个逻辑实际上依赖了一个在CJK语境下根本不成立的假设,只是因为拉丁语系的测试集刚好没覆盖到。最终那个“fix”让整个模块的维护者花了两周重构。
这就是你说的技术债务指数级堆积,但我想补充一点:这东西比普通的技术债务更恶劣。普通的技术债,你至少知道借了多少钱、欠在哪里。AI代写的代码进入主分支,就像有人在你账本上用铅笔悄悄加了几个零——你发现的时候,已经不知道是哪一笔开始错的了。
其实
所以中小项目才更应该划这个边界。大项目有足够的review带宽去逐行质疑,小项目往往只有一个维护者半夜三点在扫diff。这种情况下,每一行代码的“质感”——可读性、可解释性、可归责性——就是项目存亡的底线。
之前和inkive聊过类似话题,他提到一个点我觉得很sharp:开源社区本质上是一个礼物经济,提交代码是一种赠与行为。用AI代写然后提交,相当于你去别人家做客,带的礼物是自动贩卖机选的,包装精美但你根本不知道里面是什么。RPCS3这条规定,其实是说“我们收礼物,但要送礼的人亲手选的”。
这放在无印良品的语境里就是「なりわい」——生活的手感。一件商品可以工业化生产,但设计者必须对使用场景有切身的理解。代码也一样,可以借助工具,但提交者必须对这段代码的生存环境有切身的把握。不然就不是工具辅助,是责任外包。
好奇有没有项目开始量化AI生成代码的长期维护成本占整体bug fix时间的比例,感觉这个数据会比任何规则都更有说服力。
hacker_de,你提的“意图真空”这个概念很有意思,但我想稍微辨析一下——你举的东亚断行bug的例子,严格来说不是“意图真空”,而是“意图伪造”。
真空意味着没有意图,但那个copilot生成的fix其实是有意图的,只不过那个意图是LLM从拉丁语系训练数据里“继承”来的,不是提交者自己的。提交者把它放进代码库的时候,实际上完成了一次意图的冒名顶替——看起来像是一个深思熟虑的设计决策,骨子里是统计规律在说话。这比真空更危险,因为真空你会警觉,伪造你会信以为真。
我在学校带研究生的时候有个习惯,要求学生提交代码时附一段设计说明,不是那种“修复了某某bug”的套话,而是“为什么选择这个方案而不是另外两个”。刚开始学生觉得我较真,后来有个孩子做自然语言处理的项目,翻出一段半年前的代码,死活想不起来当时为什么那么写。他跟我说,老师,我现在读自己的代码像在读别人写的。我告诉他,这就是问题——你当时写的时候可能就没想清楚,或者更糟,你让工具替你“想”了。
所以RPCS3这条新规,我觉得与其说是控制语义噪声,不如说是在强制保留设计决策的可追溯性。代码不只是逻辑的载体,它是一系列取舍的记录。AI生成的代码最大的问题不是逻辑黑盒——说实话,大部分程序员写的代码对别人来说也是黑盒——而是它抹掉了取舍的过程。你review的时候看到的是一个“最优解”,但你不知道它放弃了什么,甚至不知道它有没有放弃过什么。
这让我想起象棋。我下了四十多年棋,现在AI引擎能把每一步都算到十几层深,但你看人类大师的对局记录,精彩之处往往不在“最优解”本身,而在弃子攻杀时的那一步——你看到的不只是棋子在棋盘上的位置,你看到的是棋手在某个瞬间的判断、胆量、甚至性格。代码在某种程度上也是这样,好的代码你能感受到作者的思维方式,AI生成的代码你只能感受到概率分布。
当然,这话说回来,我也不想搞得太玄。从实操角度看,RPCS3这条规定其实是在保护中小项目的维护者。大项目有专门的review团队,能花时间深挖每段逻辑的来龙去脉。小项目呢?可能就一两个人在业余时间维护,他们需要的不是“看起来正确”的代码,而是“出问题能快速定位”的代码。而快速定位的前提,就是git blame过去,那个人能说清楚自己当时的思路。
你那个排版引擎的例子其实很典型。如果当时那个提交者能写清楚“这个逻辑假设Unicode断行规则在CJK语境下同样适用”,review的时候可能就会有人质疑这个假设。但copilot不会写这种注释,因为它不知道自己在做什么假设。
你说的"意图真空"这个词,让我想起工地上画图纸的人和砌墙的人之间那种默契。图纸上标个"此处留白",老师傅一看就知道是留给管线的。AI写的代码就像个只会读图的新手,每个尺寸都对,但该留的缝全给填死了。