AI 写 Commit 消息的教训:工具的合理边界
开发者分享 AI 自动生成 commit 消息的失败案例和反思。探讨了 AI 辅助编程中需要手工审核的关键环节。
开发者分享 AI 自动生成 commit 消息的失败案例和反思。探讨了 AI 辅助编程中需要手工审核的关键环节。
为未来维护者保留人类语境
上周,我让 AI 帮我写了一条 commit message。代码改动很简单:修复一个 bug。只改了一行,如果我愿意花十秒钟想一想,一句话就能解释清楚。
更新了一些东西。修复了一些问题。提升了性能。
就这些。四个词,纯粹、毫无帮助、堪称武器级的空洞废话。
我盯着它看了一会儿,然后关掉了标签页。接着——出于某种连我自己也解释不清的原因——我又重新打开标签页,再盯着它看了一遍,仿佛看第二遍时它就会变好似的。
我没办法把它提交出去。不是因为它在技术上有错,而是因为它没有灵魂。它没有告诉未来的读者究竟发生了什么、为什么会发生,以及这件事是否重要。
就在那一刻,我突然意识到:AI 可以写代码,但显然写不出一条像是由真正关心这件事的人写出来的消息——哪怕那个人只在乎那么一点点。
下面就是我让 AI 替我写了一周 commit message 之后发生的事——以及为什么我再也不会这么做了。
过去,我确实会花时间写 commit message。
不会花上几个小时,也不会把它搞成一项浩大的工程。但我会投入足够的时间——写一句话解释「为什么」,而不只是「做了什么」;简单说明我考虑过、最终又放弃了哪种权衡方案。有时会附上 ticket 的链接。有时会用一行文字解释某个确实很诡异的边界情况,否则未来的我看到它时,只会满脸困惑地盯着代码。
这些消息从来不是真正写给代码本身看的。只要你足够仔细地阅读,代码最终总能为自己说明一切。commit message 是写给下一个人的:六个月后,那个人会在调试过程中找到这次特定的 commit,然后疑惑,到底为什么会有人用这种方式实现?
一条好的 commit message,是送给未来的自己,或下一位接手你代码的人的一份小而具体的礼物。
我真的没有意识到,自己早已不再送出这份礼物。直到我把这项工作交给 AI,得到了一面擦得锃亮的镜子,清清楚楚地映照出我此前到底有多么敷衍。
下面是 AI 为我最近三次真实 commit 生成的内容。我把它们分享出来,是因为即使你没见过一模一样的措辞,也一定能认出这种类型。
三个词。零语境。完全看不出修复了什么、为什么需要修复,或者是否有人应该关心。
提升了多少?代码库里的哪个部分?通过什么机制?相对于哪条基线?这条消息一个问题都没有回答,却不知为何仍然显得信心十足。
这或许是英语中有史以来最泛泛而谈的一句话。严格来说,几乎任何人做出的每一次 commit,都可以用这句话描述。
AI 可以看到实际的 diff。它已经逐行看过具体发生了哪些变化。然而,在掌握了所有这些信息之后,它选择传达的内容却基本为零。
真正让我难受的是:这些消息甚至对另一个 AI 都没有用。如果六个月后,另一个模型在试图理解这个文件的历史时读到「修复了一些东西」,它能获得的有效信息和人类完全一样——也就是说,什么都没有。
commit message 其实并不是真正的问题,它只是一个症状。我已经在不知不觉中不再关心自己代码背后的故事,而那个被训练得乐于助人、避免冒犯的 AI,只是把这种漠不关心原封不动地映照给我,再用完整的句子把它包装起来。
commit message 不只是 Git 历史上方的装饰,也不是什么为了显得忙碌而做的无意义工作。
它们是写给六个月后发现这段代码,并且需要在动手修改前弄清楚当初为什么会做出这个决定的同事看的。它们是写给正在做 code review、试图判断一项改动是否合理的人看的。它们也是写给你的——确切地说,是凌晨两点盯着 stack trace、努力回忆自己写下这段代码时到底在想什么的你。
一条好的 commit message 会清楚地回答一个问题:我们为什么要这么做?
一条糟糕的 commit message 什么都没有回答,占用的空间却和一条好的 message 一样多。
AI 给了我泛泛而谈、空洞无物的 commit message,因为——这正是让人不舒服的地方——早在我让它接手之前,我自己就已经写了好一阵子泛泛而谈、空洞无物的 commit message。它从我近期的历史记录中学会了这种模式。它以完美的准确度、毫无评判地把我的懒惰映照了回来。
真正让我感到难堪的,正是这一点。不是 AI 的输出,而是我的输出。
问题不在 AI,而在我。AI 只是让问题变得清晰可见。
现在,我已经重新开始自己写 commit message。
并不是因为我制定了某种反对使用 AI 辅助的规则——我在很多其他事情上都经常使用 AI。而是因为我在这个过程中意识到,commit message 从来就不是为了让计算机生成的。它是写给人类阅读的,也应该让人感觉它是由一个真正留意过这次改动的人写出来的。
AI 可以写代码。它可以重构、提供建议、生成内容、自动补全。但它显然做不到的事情——至少在我自己都没有先认真对待它的情况下——是讲清楚一次改动为什么会发生。真正重要的恰恰是这个故事:对下一位 reviewer、下一位 maintainer,以及在某个我不太愿意透露的时间调试问题的未来的我来说,都是如此。
我不需要 AI 替我写 commit message。
我只需要足够在意,为每次 commit 花上大约十五秒钟,亲自把它写出来。
你见过最糟糕的 commit message 是什么?或者,如果我们愿意对彼此诚实一点,你自己写过最糟糕的又是什么?
我先来:「修复了一些东西。」
我并不为此感到骄傲,但我仍然认为,分享出来是对的。
部分评论可能只有登录后的访客才能看到。请登录以查看全部评论。
如果需要采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。