我从今年年初开始使用各种 AI coding 工具。现在,我决定重新回去手写代码。
我这里说的 “回去” 手写代码,不是指兴趣上回去手写。我有写代码的兴趣:编程是我一生中遇到的最快乐的事情。不论如何,手写代码都是我的兴趣爱好。然而,我的意思是在做项目时把 codex 卸载,真正回去手写代码。
我认可 AI 给软件工程带来的效率提升。我并不是一个反对进步的人。然而,就 coding 这一点而言,对于所有我真正在意的代码库(即,如果我上班了我肯定还是会用 AI 对待公司项目的)我不认为 AI 能带来效率上的提升。反而,它给人带来了一种虚假的进步感。
这就是为什么我说 AI 正在杀死开源。好像我们有比以往多数倍的 PR 数量,项目进步的速度得到了提升。但是,由于 AI coding 本身存在的问题,我们最终都需要人类来 review 一个 PR 是否可以合入。也就是说,维护者也正在面对比以往大数倍的工作量。
我对 AI 编程有很大的怨气。这很大程度上是因为作为一个开源项目的维护者(i.e. PHP 内核维护者),我每天要面对 ~10 个纯粹 AI 编写的 PR。
人们,我们
为什么要人类贡献者
有人说,现在的 AI 模型已经足够强大,review 起来不应该都质量很高吗?错了。从写 PR 的角度,我们只需要
“Hey chat, find a optimization/bug in the code base.”
或者,
“Hey chat, make me a PR. Make no mistake.”
但是从 reviewer 的角度来看,要考虑的事情就很多了。
首先,AI 写的内容是否符合项目规范?目前我看到的 AI PR 的通病是总是有有数不清的未被文档记录的行为,或者干脆就直接不写文档。
其次是 overtesting 和 undertesting。AI 并不知道自己的 patch 会影响多大的范围,与现有的功能冲突怎样,因此在编写回归测试时总是遗漏情况,抑或是变得极度偏执,好像要把所有情况都反复测试三次。
AI 没有品味。它不知道一个好的修复是什么样子的。假设现在我要在一个 code base 的每个函数开头都重置一次错误状态。AI 会直接写八百个 if-branch 在每个函数开头。同时,AI 执迷于硬编码内容;执迷于拆分文件,即使一个文件里可能只有几行;执迷于给自己的每行代码都写三行注释,即使变量名和代码逻辑本身已经足够清晰;这个列举还能再走下去。
就这样,还有很多人天天反对 human-in-the-loop,希望让 AI 审核 AI。哦,天哪。
综上,AI 写的代码在没有人类审核的前提下,质量不足以直接合入任何一个 serious 的代码库。这个时候有人要说了,那人类贡献者难道不这样吗?会。但是人类会成长,AI 不会。你可以告诉人类以后别这样写,但是你无法告诉 AI。多新鲜呐?
一个人类在一次 PR 里没写 NEWS 文件,第二次就知道写了;
一个人类在一次 PR 里没用已有的内部 API,第二次就知道用了;
…
AI 做得到吗?
我很喜欢之前有人提出的贡献者扑克(contributor poker)概念。本质上,如果只是要报告一个 bug 或建议一个 feature,那移步 issues 就好了。往往,引导一个贡献者在 PR 里把东西做好需要付出的精力是远大于自己写一遍的。那我干嘛不自己把这玩意做了?是因为我相信贡献者,能在这里学习并在以后的 PR 里变得更好,然后成为新的维护者。维护者每一次花时间去 review newcomer 的 PR 都是在赌,赌注是自己的时间和精力。
AI 的泛滥让本就不平衡赌桌变得无法再进行下去了。所以,我还要去参与一个一定会输的 poker 吗?
网络安全问题
AI 在攻防上变得极为恐怖,这已经是不争的事实了。每一代新模型的发布都会引起一波漏洞的浪潮。这引出了几个问题:
首先是廉价漏洞的泛滥。
其次是,最新的模型永远被控制在毫无道德的公司手上。
不言而喻,一目了然。
以后怎么办?
所以不,为了我的身心健康,我不会参与这样的赌局。我不会接受任何纯粹 AI 的 PR。贡献者可以使用 AI 去帮助你完成 PR。贡献者可以用它优化你的工作流(我正在这样做)但是完整 AI 的 PR 我会全部 > /dev/null。
我知道这是逃避。我只是怕了。
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!
我热爱开源,因此我选择让步。在我的热爱被消磨殆尽之前为这个社区做更多有意义的事情。