点击关注#互联网架构师公众号,领取架构师全套资料 都在这里
上一篇:2T架构师学习资料干货分享
大家好,我是互联网架构师!
凌晨两点,PagerDuty 响了。值班工程师小林打开监控面板,CPU 飙到 95%,数据库连接池打满,缓存命中率跌到谷底。他第一反应是:"今天没发版啊?"查了一圈,最后定位到三周前 merged 的一个 PR——一个"优化查询性能"的小改动,Claude Code 生成的,代码 review 通过了,单元测试全绿,QA 也点过头了。逻辑上,它完全正确。它只是"正确"地绕过了系统里一条没人写进文档的隐性规则。
今年 6 月,旧金山 Moscone West,AI Engineer World's Fair。一位头发花白的老工程师走上台,开口第一句话就把全场干沉默了:
"Software engineering is not about writing code."
台下坐着几千个靠写代码吃饭的人。有人皱眉,有人笑了,更多人等着听他怎么圆回来。
他叫 Benoit Schillings,Google DeepMind 的研究总裁,同时也是一个写了 45 年代码的老程序员。从 Apple II 上的 6502 汇编,到 Commodore 64 的游戏开发,到 C++ 的编译器时代,再到今天用 Python 和 Vibe Coding 写 AI 基础设施,他几乎经历了软件开发史上的每一个时代。
我坐在屏幕前看录播,听到这句话时,正好收到小林那个事故的复盘邮件。那一刻我突然明白了——不是 AI 写错了,是我 review 错了。 我还在用"看逻辑"的方式审代码,但软件工程早就不是逻辑题了。
一、3500 万行 PHP,才是软件工程开始的地方
Benoit 讲了一个场景:你第一天入职,Leader 丢给你一个代码库——3500 万行 PHP。你的任务是在不破坏系统的前提下,改一处业务逻辑。
这时候你才发现,"写出一段能运行的代码"只是第一步。真正的挑战是:你知不知道这行代码会触发哪些依赖?会不会绕过权限边界?会不会把一次普通查询变成性能瓶颈?会不会破坏某个 2015 年埋下的历史兼容行为?
单元测试通过了,不代表这次修改适合整个系统。CI 绿灯了,不代表线上不会炸。

这让我想起小林的事故。那行代码做了什么?它把原来分散的三个查询合并成了一个 JOIN。从 SQL 优化角度,这是教科书级别的写法——减少 round trip,降低网络开销,执行计划也更干净。Claude Code 在生成它的时候,甚至附了一段注释说明优化原理。
问题出在上下文之外。这个服务跑在一个十五年历史的系统上。2015 年某个工程师为了解决一个已经没人记得的并发问题,在代码里埋了一条隐性契约:这三个查询必须分开执行,因为中间要穿插一个分布式锁的释放操作。 这条规则没有写进任何文档,单元测试里也没有覆盖这个场景——因为当时的工程师觉得"这太显然了,不可能有人去合并它们"。
AI 不知道这段历史。它读到了代码,分析了 schema,看到了索引,然后给出了一个"更优"的方案。
逻辑正确,上下文错误。
这就是 Benoit 眼里的软件工程:它不是关于代码的正确性,而是关于改动的后果。人类目前仍擅长把系统放进更宽的上下文里,找到模式,然后判断一个技术决定会留下什么后遗症。这是开发者在 Agent 时代需要保住的核心能力。
二、代码正在免费,但系统的账才刚开始算
Benoit 做了一个判断:"Writing code is free or nearly free."
这不是夸张。GitHub Copilot、Claude Code、Cursor Composer,这些工具已经让代码生成的边际成本趋近于零。以前团队会因为开发资源不够,拒绝一个边缘需求;现在 Agent 几分钟就能实现,类似功能很容易全部涌入代码库。
Benoit 还丢了一个更惊人的数字:GitHub 上大约 80% 的新代码,现在是机器生成的。

但软件的总成本不会跟着清零。代码量暴涨之后,开发者得继续支付设计、验证、运行、安全和长期维护的成本。生成只发生一次,后面每个版本都要与它相处。短期的开发速度提高了,运维面积、攻击面和测试组合也一起变大了。
更隐蔽的问题是训练数据正在枯竭。当 AI 生成的代码占比越来越高,人类写的"高质量训练数据"占比就越来越低。模型们开始大量吃自己生成的代码做训练,就像一个人对着镜子练肌肉——看起来在变壮,其实是在自我循环。Benoit 提到,DeepMind 正在用类似 AlphaZero 的"自对弈"(self-play)思路来解决这个问题:让模型自己生成编程挑战、自己验证、自己迭代,试图突破人类代码库的天花板。

Benoit 打了个比方:以前我们围绕"写代码最难、成本最高"这个假设,建立了整套软件工程文化、基础设施和公司。现在地基松动了,上面的建筑还没反应过来。
《Pragmatic Engineer》今年做了一项调查,900 多个工程师参与,结果挺让人不安的:代码库质量似乎在下降。 AI 生成的代码越来越多,但理解这些代码的人越来越少。维护负担正在落在越来越少的工程师身上——那些还愿意、还能够深入底层的人。
三、函数和模块,从为人脑减负到为 Agent 服务
Benoit 把软件开发分成了几个阶段。
早期,限制程序的是机器。内存少,处理器慢,工程师要从硬件里挤出最后一点性能。计算资源降价后,这个矛盾退了下去。

系统越来越大,新瓶颈出现了:代码库规模太大,单个工程师不可能记住并理解其中所有代码。于是我们发明了函数、模块、命名规范、接口和文档——它们都在帮人把复杂系统切成可以理解的小块,让几百名工程师能在同一个代码库里合作。
现在 Agent 能读取整个仓库,人类的上下文限制不再是唯一尺度。但 Benoit 认为,模块化不会因为模型记性更好就立刻消失。它的服务对象开始多了 Agent——团队还需要理解、审查、交接和维护这套系统。只不过,模块化的目的从"让人脑装得下",变成了"让 Agent 和人类都能可靠地推理"。
这里需要直面一个现实:AI 的能力是分层的不均匀。
Benoit 在演讲里给 AI 画了一张成绩单:
语法生成(Syntax Generation):95% —— 超人水平
多步代码库规划(Multi-step Codebase Planning):45% —— 勉强及格
架构系统决策(Architectural System Decisions):28% —— 不及格
什么意思?让 AI 写一个函数、一个类、甚至一个模块,它大概率比你写得好、写得快。但让它设计一个能扛住三年业务演进的系统边界,让它判断"这个改动会不会在半年后引入技术债",让它预测一个安全漏洞在真实攻击路径上的利用方式——它还在摸索。
小林那 500 行权限代码就是典型。Claude Code 在"语法生成"层拿了满分:变量命名规范、类型注解完整、异常处理周到、测试覆盖率 90% 以上。但它没意识到,那两个校验函数之所以串行,不是因为前任工程师不懂并行优化,而是因为中间夹着一道分布式锁的释放——这道锁的存在,从来没有被写进任何文档或注释里。
人类工程师的优势,恰恰在于这种"上下文嗅觉"。我们知道 2015 年埋下的兼容逻辑,记得三年前那次事故后加的兜底方案,能闻到"这行代码看起来没问题,但放在整个系统里有点怪"的味道。AI 还没有这种嗅觉,或者说,它只能从已有文本里推断,而很多系统的关键知识,从来就没被文本化过。
四、没人逐行读 AI 代码后,审查得换一种做法
Benoit 做了一个很激进的预测:一年后,开发者可能会让 Gemini 或其他模型直接生成代码,不再有人逐行阅读。
他用编译器作比较:今天还有多少程序员,会在每次构建后阅读编译器输出的汇编?几乎没有了。我们信任编译器的正确性,把注意力放在更高层的问题上。

如果这一天到来,代码评审不能连同阅读代码一起消失。它会向系统行为移动。
开发者需要查看:
接口契约有没有变?
权限边界是否被扩大?
性能基线有没有倒退?
新依赖带来了哪些供应链风险?
数据流是否经过了不该经过的模块?
单元测试、集成测试、静态扫描、运行时指标和回滚记录,会承担过去那部分"人肉阅读"的工作。人不读每一行,也必须看得见系统做了什么。
但这个转变比想象中更难。AI Engineer World's Fair 的闭幕演讲上,Google 的 Addy Osmani 提了一个数字:42% 的已提交代码现在是 AI 生成的。 然后他讲了三个陷阱,听完脊背发凉:
Cognitive Debt(认知债务)——你把太多实现细节交给 AI,慢慢失去了对系统的理解。我以前能闭眼画出整个服务的调用链,现在看了三个月 AI 生成的代码,发现自己只能看懂接口层了。不是我不努力,是 AI 太勤快,勤快到我懒得去追每一行逻辑。Benoit 说的"vibe coding"就是这个状态——你描述意图,AI 实现,你点头,但底层发生了什么,你其实不清楚。
Cognitive Surrender(认知投降)——AI 给的输出看起来太专业了,专业到你不好意思质疑。那个权限 PR 的代码,注释写得比我还好,测试用例覆盖了我没想到的边界条件。我点了 LGTM,不是因为真的看懂了,而是因为"它看起来没问题"。Addy 管这叫"借来的自信"(borrowed confidence)——你借用了 AI 的确定性,但没有承担对应的理解成本。
Orchestration Tax(编排税)——Agent 可以并行跑十个任务,但你的注意力不能并行。周一早上你面对的不是一个 PR,是三个 Agent 周末各自提交的改动,互相之间还有依赖冲突。你花了整整一上午做"人工合并",比你自己写还累。Agent 省下了写代码的时间,但把编排复杂度转嫁给了你。
Addy 给了一个词来对抗这三个陷阱:High Agency(高能动性)。知道什么时候该委托,什么时候该检查,什么时候该喊停,什么时候愿意把自己的名字押在结果上。
Agent 可以跑 playbook,但不能替你背锅。上线后出事了,最终负责的还是工程师。
五、测试通过,只证明了软件工程很小的一部分
Benoit 对现在常用的代码评测并不满意。
SWE-bench 检查一段代码能否运行,以及能否产生正确输出。这只是软件工程中很小的一部分。现有评测善于回答"它能不能完成这道题",很难回答"这份代码放进真实系统,一年后会不会成为麻烦"。
这个差距在 Agent 上尤其明显。一次修改全部通过测试,可能仍然重复了现有能力,引入了过度抽象,或者让后续排障更难。就像小林那行 JOIN 代码——所有测试都过了,因为它测试的是"查询结果是否正确",而不是"分布式锁的时序是否被破坏"。
团队需要给 Agent 增加更多测试用例,也要补上架构约束、安全规则、性能预算、日志和可回滚的交付过程。换句话说,Agent 能帮你写代码,但不能帮你背锅。 上线后出事了,最终负责的还是工程师。
六、下一门编程语言,可能不需要让人读懂
演讲接近结尾时,Benoit 扔出了一个更大胆的问题:是不是到了为模型设计新编程语言的时候?

Python 等语言是为人发明的。它们易于阅读和表达,并没有把安全与可靠性放在最优先的位置。既然写代码的痛苦正在消失,可以让模型承担更高的生成成本,使用强类型或者借鉴 Lean 等形式化方法,把"证明自己正确"的压力交给模型。
他甚至认为,这种语言不一定需要对人友好。

这个设想短期内很难进入大多数团队——线上代码仍需要人类排障,也得与已有工具链交接。但它很适合提醒开发者:我们今天看作理所当然的编程语言和代码形态,也许只是人类亲手写代码时代的产物。
不过我更关心的是一个更实际的问题:不是语言要不要变,而是工程文化要不要变。
当代码生成免费后,团队需要建立的新契约是什么?
七、代码写完后,工程师要把这些事接回来
Benoit 用一句话总结了演讲:"Code is over, but there's plenty to do."
对一线开发者来说,这些工作已经可以写进 Agent 任务单里:
需求要能被验收。 "优化这个页面"不够,至少要写明性能指标、兼容范围和不允许改动的行为。
系统边界要能被工具读取。 依赖关系、数据契约、权限要求和部署约束,不能只存在某位老员工的记忆里。
验收不能只看模型的文字结论。 要留下测试报告、性能对比、扫描结果、运行时轨迹和可以执行的回滚路径。
一个 Agent 几分钟生成了几千行代码,不等于一项工程工作已经完成。每一次林林总总的代码更改,最终都要回到几个问题:它是不是我们需要的?能否在真实系统里长期运行?如果错了,我们能不能看见并撤回?
这里还有一个更深层的转变。Benoit 用编译器做类比时,其实还藏了一层意思:编译器是确定性的,AI 是概率性的。
同一段 C 代码,同一个版本的 GCC,永远生成同样的汇编。但同一个 prompt,同一个模型,可能给出三种不同的实现,每种都有微妙的差异。编译器的正确性可以被形式化证明,AI 的正确性目前更多靠"之前没出过错"——这是经验信任,不是逻辑信任。
所以在我能完全信任 AI 之前,我给自己定了一条规矩:AI 生成的代码,我可以不逐行读,但我必须知道怎么验证它。
验证不是看逻辑,是看行为。看接口契约变没变,看权限边界扩没扩,看性能基线退没退,看数据流有没有经过不该经过的模块。这些才是软件工程的本体,而代码,只是它的影子。
八、最后
Benoit 在演讲里讲了一个自己的故事。早年他用汇编写代码时,并不信任编译器,总担心机器转换出来的代码会出错。后来接受了 C++ 和编译器,却又对带有垃圾回收机制的语言产生怀疑——"程序员如果不亲自管理内存,就不能算真正会编程。"
可现在,他每天用 Python,也用 Vibe Coding。他拿自己开玩笑:老狗也能学会新把戏。
这段心路,很像今天的开发者面对 Coding Agent 时的状态。从"它写得没我好",到把一个函数交给它,再到让它读仓库、改文件和跑测试。工具变了,程序员对"什么才算编程"的理解也会跟着变。
但有些东西不会变:定义问题、管理复杂度、验证结果,以及承担上线后的后果。这些工作还留在工程师手里。
小林后来把那行 JOIN 回滚了,然后花了两周时间,把那三个查询背后的历史契约挖了出来,写进了文档,补上了测试。那个 PR 的标题从"优化查询性能"改成了"文档化并测试 legacy 查询拆分逻辑"。
没有新增一行业务代码。但那是他当月最有价值的一次提交。
写代码越便宜,为代码负责就越贵。 这才是 Benoit 想告诉所有人的事。
(本文基于 Benoit Schillings、Addy Osmani 在 AI Engineer World's Fair 2026 的演讲,及 Anthropic、Pragmatic Engineer 等行业报告综合整理。)
最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。
如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描上方二维码关注一下,您的支持是我坚持写作最大的动力。
夜雨聆风