几个月前,我决定在我正在构建和维护的一个 FOSS 项目中不再欢迎 AI 贡献——LibreWeddingPlanner。并不是说它收到了很多 AI 贡献——实际上我收到的所有贡献都是翻译和功能请求——但我想避免未来的麻烦,并对 AI 持反对立场。
然而,尽管我在 FOSS 贡献中没有使用 AI,我在工作中却一直在用它。在我的工作场所,以及我许多开发者朋友的工作场所,用 AI 来工作非常非常普遍。带着几分羞愧,让我讲讲这段经历,以及它是如何让我变得更笨、更懒、成为一个更差的开发者。
甜蜜的开端
一个朋友告诉我嘿,你应该试试,你会感觉自己无比强大。一旦你开始用它,就停不下来。那些过去要花你几天的任务,你几个小时就能搞定。不,我们不是在说可卡因,尽管在某种程度上我认为使用 AI 是一种成瘾。我开始在 vscode 中启用增强自动补全(还是它自动启用的?),然后下载和使用其他代码生成模型也就顺理成章了。小时候,我记得父母说小心学校门口给你糖的坏人,那些不是糖,是毒品。我二十多岁时,会打趣他们说是啊,就像他们现在白送毒品了是吧?嗯,到了我三十多岁,我觉得他们很可能真的会。
一旦你开始使用 AI 编码智能体,事情很快就会失控。一开始,你让 AI 帮你实现一个函数,或者为某段代码写测试。如果你长期是个 TDD 信徒,你会倾向于先让它帮你写测试,这样你之后可以写代码。只不过你不再写代码了,你只是让 AI 来做,而 TDD 的一半目的(不让测试因你的代码实现方式而产生偏差)就没了。但你感觉自己进展飞快,于是开始不在乎了。
有一天,我看到智能体在共同署名我提交的 commit,我赶紧跑去关掉那个设置。就像,我想假装代码是我自己写的。天哪。
失去控制
如果事情到此为止还不算太糟,但大多数人类大脑不是这样运作的。如果你喜欢某样东西,而且你能拥有双倍,你就会去拥有。我开始把一张 Jira 工单的完整描述粘贴进去,让 AI 替我实现它。耶!!太强大了!!在一个对我来说相对陌生的代码库上工作,我开始失去对哪些改动是真正完成任务所必需的掌控。我以为如果 AI——它读过项目里的每一行代码——说这是需要的,那就这样吧。控制是一种幻觉。和我讨论过这件事的其他人都同意,他们并不 100% 知道自己推送到生产环境的代码到底在做什么。我打赌我们连 20% 都不知道。真他妈的吓人。
但事情也没有就此停止。当我有一个小任务时,我把它交给 AI,大约 30 分钟后我就有了一个 PR。那 30 分钟里我在做什么?切换注意力。很快我意识到,我可以让不止一个,而是多个智能体同时在多个 git worktree 中处理不同任务。全力开动!Tokenmaxxing!我通过 ACLI(命令行界面)把智能体连接到 Jira,然后直接对它们说“在一个单独的 worktree 里处理这张 jira 工单”。它就会开始干活。我欣喜若狂。
当任务不那么小时,你会以为我在自己处理它,对吧?才不。我当然会让 AI 把它分解成更小的任务,然后逐个处理。AI 随后会给我一个极具说服力的 PR,里面有一堆我不太理解的改动。我到底要怎么请求对这些改动做代码审查?我的同事会怎么说?当他们(更有经验,尤其是在那个代码库方面)问我为什么这样做或那样做时,我要说什么?我要怎么承认这全是 AI 做的,而我不过是个 AI 牧羊人?所以我强迫自己去理解代码。并不是我想理解代码库的架构,我只是想避免不知道自己他妈在干什么的那种羞辱。
在某个时候,我同时运行了太多 AI 智能体,以至于上下文切换对我来说负担过重。有些任务我本来 20 分钟就能轻松完成,结果花了 AI 智能体 5 分钟,然后我花了 2 天来审查。因为还有太多其他事情。也许 AI 和计算机擅长上下文切换,但我不行。我精疲力竭。因为如果只是批准写得完美的 PR,那还好。但对每个 PR,我都得看代码、测试、风格,给反馈,切换到别的事情,再回来,推送,看看有没有 PR 评论,CI 有没有通过,等待,现在 linter 又报错了。结果你花 2 天才能交付本来专注 1 小时就能完成的东西。以我的个人经验,AI 带来的倍增性能只是幻觉。但倍增的挫败感和疲惫感是必然的。
我觉得我交给 AI 的任务里,没有一个能原样合并。当然,提交信息和 PR 描述不是我写的(这都什么年代了,2024 吗??),是 AI 替我写的,它还确保 PR 里有 7 段描述,解释它做了什么。我不再读那些描述了,就像,我告诉它要做什么,我就假设它照做了。描述是给别人看的。因为总得有描述,对吧?AI 太他妈擅长听起来专业了,于是你就放松了,任由它去。并不是我真的觉得代码好,而是你会随着时间被说服,你会变懒,你会变得自满。你不再质疑,开始接受一些你本来绝不会接受的代码,仅仅因为你说不出它哪里不好。你已经失去了控制。大多数 AI开发者会否认这一点,但内心深处,他们知道这是真的。只是不想面对而已。
几个月过去了,有一天我意识到自己已经好几个月没亲手写过一行代码了。我甚至都没自己提交过。无数次我在 AI 智能体的聊天框里写下“commit and push”。我。去。这要不是懒惰,我不知道什么才是。AI 也没能解决我交给它的所有任务。连一半都不到。一次又一次,我得像个保姆一样盯着 AI 智能体说“现在,套用这个模式”,或者“在规格里,把测试设置单独放到一个 before 块里,断言放到另一个块里”。就像我在带一个初级工程师。别误会,我喜欢带人,我带了好多年,我觉得这对导师和学员都有好处。但我他妈不会去给一台机器当保姆,抱歉。
很多时候,我会发现 AI 写的代码质量明显下降了。倒不是说它一开始有多出色,但我会有种感觉:“哥们,你之前明明做过这个,为什么现在又做不到了?”于是我不得不再次提示它,重新解释该怎么做。或者给它链接一个包含我偏好的文件。好吧,我现在明白你的意思了,抱歉造成了混淆。让我为你重做一遍。然后它又会搞出一团他妈乱七八糟、根本不是我要求的东西。这开始让我想起 Google 的那套策略:降低搜索结果的质量,迫使用户多搜几次,从而多看几倍的广告。如果这招对 Google 管用,那对 AI 怎么会不管用?尤其是在 AI 公司正经历的资金不确定时期,你真觉得他们不会这么干?得了吧。他们不仅会这么干,还会干得更过分。
还有些日子,我会发现某个智能体卡了 30 分钟都没给我答复。怎么办?你觉得我会自己接过任务来做吗?绝对不会。我拿起言语的鞭子,用专横的语气要求它把我的代码交出来!AI 智能体连连道歉,20 秒内就给出了它 30 分钟都没给出的东西。我看了看 token 开销,它白白烧掉了 30 美元的 token。如果账单是我付的,我会气得炸掉。
重新夺回控制权
一个月前,在一次代码审查中,有人对我我的一个 PR 提出了这样的意见:“你写的这个测试实际上并没有测试你在应用代码中修改的场景。”我复查了一下,他说得对。但是……它太有说服力了……我感到很羞愧。因为对于我这样一个使用 TDD 超过 10 年的开发者来说,在如此基础的事情上出错,多少是一种羞辱。我意识到自己已经失去了掌控,而且情况不会好转。我认为仅仅更努力、对 AI 更挑剔、要求你付费应得的质量,是没用的!因为无论你怎么努力,AI 最终都会说服你,让你再次变得自满。
所以我决定停止使用 AI。即使这会让我丢掉工作。
当你拿到一份由 AI 写的草稿 PR,不得不自己动手处理时,你会意识到自己在多大程度上并不知道它在做什么。你开始质疑自己是否需要这个那个,最终把一切都丢掉,从头开始。我感觉自己生疏了,好像很久没有自己写代码了。幸运的是,我一直在自己的副业项目里断断续续地编程,所以虽然能感觉到吃力,但还不算太糟。
我回到了 TDD,回到了只改动 5 个文件的 PR。回到了直击要点的两行 PR 描述。我回到了理解自己在做什么的状态,回到了有信心部署的状态,回到了准备好接受详细代码审查的状态,因为我知道这些改动在做什么,我能为每一行代码给出理由。我回到了享受人类代码审查的状态(不是 AI 审查,我仍然讨厌那些。更讨厌那些粘贴 AI 审查、假装是自己写的人类),回到了从中学习的状态。我开始询问架构决策,问为什么事情是某种样子。我本可以问 AI,但我更愿意问我的同事。
我重新找回了编程的乐趣。而且我没有回头。我不会假装代码行数或 PR 数量是有效的指标,尤其是当 AI 可以为了在每个指标上取胜而任意啰嗦的时候。但我可以说,我每天都在推送重要的改动,PR 不断被合并,归根结底,工作完成了。正因如此,我不害怕被解雇。而且,我的大脑功能保持完好。
一条建议
对毒品说不。这算是个比喻,但也不完全是。第一步是意识到我们你有多依赖 AI。一项你无法控制的技术,而且它让你的雇主(如果不是你自己的话)花费一大笔钱。你会说但我的经理期望我有高绩效,我现在怎么能表现不佳呢?我无法代表你发言,但这事没发生在我身上。我不觉得我比 2 个月前表现差。如果说有什么变化,那就是我现在更清楚自己在做什么,更有能力应对突发事故(因为嘿,搞砸的代码是我写的),而且我(字面意义上,我自己)在代码库上工作得越多,我就成为越好的开发者。这才是你的经理应该期望你做到的。
而且当 AI 预算削减开始时,你会为他们省下一些钱——因为削减一定会来,如果还没来的话。
如果你像我一样是个开发者,正是你作为开发者的经验让你得到了那份工作。如果你在市场上摸爬滚打了几年,你就知道你的水平取决于你职业生涯中面对过的问题有多难。如果你关掉大脑,放松地照看 AI,你不会变得更好。你在失去价值,因为你能交付的东西,你作为工程师(而非 AI 牧羊人)的真正价值,会随着你的大脑变得自满并把控制权交给 AI 而下降。
醒醒。勇敢一点。夺回控制权。