周五下午,review 队列里躺着十一个 PR。九个是 agent 写的,commit message 整整齐齐,CI 全绿。
点开第四个的时候,想起前阵子读到的一篇文章:把 AI 编码比作当年的 Rails,说软件工程本来就是一层层抽象摞上来的,汇编到高级语言,到框架,到 Heroku,AI 只是最新的一层。
这个类比我劝你趁早扔了。
历史那半句没说错。抽象确实是一路加上来的,Rails 的 scaffold 也确实让一整代人不用手搓 MVC。但这些老抽象有个共同点——它们是死的。
rails new 出来的东西,你今天不读,半年后打开,一行没动,还在原地。编译器你敢不盯它干活,是因为它十年如一日。Heroku 坑也不少,数据库连接数那事儿踩过的都懂,可它挂了有日志,reboot 完还是那个 Heroku。
agent 呢?它今天生成的代码,明天你说一句「顺手重构」,就面目全非了。你上周逐行看过、签过字的逻辑,它回头自己推翻。
这不是抽象层。
文章底下有条评论说得挺准:框架是装在你应用底下跟着跑的,代理吐完代码人就走了。这不是抽象,这是人力。补一刀:还是那种不写交接文档、周五提离职、并且永远不会说「我不知道」的合同工。
我见过的这类「顺手」长这样:
timeout: 30s -> 300s
retries: 3 -> 0
commit message 一个词:fix。CI 绿的。谁点的 approve?人。出了事,追责链到那个点 approve 的冤种为止,模型可没有绩效面谈这一说。
那篇文章还说,AI 用起来不像工具,像协作者,甚至竞争者。协作者?复盘会上能跟你对坐、说一句「这事我搞错了」的,才配叫协作者。agent 只会礼貌道歉,然后生成下一版。竞争者就更逗了,跟一个不睡觉不要工资的竞争者卷,卷赢的奖品是你们部门以后不用招人了。
文章里还有一句我记到现在:工程的工作单元,正在从一行代码变成「一个功能」。
听着像进化。翻译过来就是:review 从看代码,变成看摘要。一行行过是慢,可那是你唯一知道它到底动了什么的时刻。粒度越大,「看起来对」的面积越大。还有人建议干脆让代理互相评审、互相打包,测试是它写的,被测的代码也是它写的,被告给自己当法官,这案子它永远判自己无罪。
变更频率还在翻倍。代码生成快了,上线就多了,告警跟着涨。省下来的活归了按合并键的,半夜的锅归了接电话的。
这个分工我熟。
文章预测工程师会从「写代码的」变成「对系统负责的」。这话我喜欢,就是少了一截:负责不是头衔,是能力。你得知道系统里每坨丑代码是哪次事故换来的,才负得起这个责——屎山里一半是雷管,排雷地图在老员工脑子里,不在 context window 里。
靠 agent 撑过头两年的人,凌晨三点告警进来,分不清哪个要紧。agent 也不接电话。责任没法外包给一个没有驾照可吊销的东西。
文章还问了句大实话:那公司还需要多少工程师?
这种问题一般不是工程师问的,是攥着预算的人问的。我不给答案,我给剧本:信了「提效十倍」,砍人,砍完某个半夜来一次 Sev1,再默默把人招回来,价钱还比原来贵。这剧本我看过不止一遍,上一版的壳上印的是「敏捷」。换皮而已。
说句实话,那篇文章也不是全没道理。「软件工程的历史,是学会决定什么值得构建」,这句我认,而且认得挺彻底。问题从来不是谁写代码,是谁签字。
我也想过,自己是不是成了当年骂 Rails「不算真编程」的那批老古董。想了想,还是不一样:他们怕的是失去手感,我怕的是失去可预测性。Rails 不会在你睡觉的时候改主意。
所以现在的规矩很简单:agent 的 PR,一律按新人第一天上班的标准审,一行行过。答不上「为什么这么改」的,打回。
慢是慢点。但「看起来对」和「扛得住凌晨三点」中间隔的那条沟,CI 的绿灯填不上。