
在 2026 年的今天,随着 Claude Opus 4.8 的发布和 OpenCode 等 AI 编程工具的爆发式增长,一个不争的事实摆在所有开发者面前:“熟练默写 API”和“手敲 Boilerplate”已经不再构成任何职业护城河。
在局部代码映射——比如让 AI 补全一段 React 组件、写一个复杂的正则表达式、甚至用 Rust 实现一个 B-Tree 并在旁边附上 100% 覆盖率的单元测试——AI 的表现不仅达到甚至已经超越了人类平均水平。
但这是否意味着“全自动编程”的乌托邦已经到来?
本周,知名播客 The Pragmatic Engineer 采访了 OpenCode 联创 Dax Raad。他的一个观点扯下了这块遮羞布:“AI 可以飞速生成代码,但工具无法替你做工程判断。”
事实上,在复杂系统的开发中,AI 编程工具正在撞上一堵看不见的、坚硬的天花板。这堵墙并非来自大模型的推理能力或上下文窗口的限制,而是源于分布式状态的一致性、隐式上下文的丢失以及长期维护性架构决策。
人类工程师的核心价值,正在经历一次硬分叉:从“写代码的执行者”,彻底转变为“控制系统熵增的架构决策者”。
···
让我们来看一个极其典型、每天都在各个研发团队上演的“AI 幻觉”灾难:
你需要重构一个涉及三张核心业务表和两条消息队列的异步退款流程。你打开了最强大的 AI IDE,输入了长达两千字的详尽 Prompt,甚至给出了部分架构图。
不到 20 秒,AI 吐出了一千多行代码。语法堪称完美,类型推导严丝合缝,设计模式用得恰到好处,连单测都直接亮起了象征通过的绿灯。你心满意足地点击了 Merge。
然而上线不到两小时,系统报警了。业务陷入了死锁。
为什么?因为 AI 生成的代码在更新数据库时,获取分布式锁的粒度太粗;同时,它假设了消息队列的消费是严格有序的,而在你们真实的生产环境中,为了吞吐量,消息是并发投递的,且没有任何防重放(Idempotency)机制。
编程语言,仅仅是人类与机器妥协的产物。而“系统工程”,则是处理多模块时序、状态演进、并发竞态和物理硬件边界的残酷艺术。
AI 目前无比擅长前者,却在后者中频频迷失。
···

在微服务架构或超大型单体(Majestic Monolith)中,代码往往是一张高维度的复杂拓扑图。而 LLM,无论其上下文窗口拉长到 1M 还是 10M,其处理信息的本质依然是线性的。
这导致了 AI 编程的一个致命缺陷:**无法感知隐式上下文泄漏(Implicit Invariants)**。
在人类工程师的协作中,接口契约(Interface Contracts)从来就不只是一个类型签名(Type Signature)。它还包含了大量“未被写进代码里的防御性假设”。
举个例子:AI 在修改一段缓存读取代码时,可能会非常聪明地加上了一层 L1 内存缓存来提高性能。但它不知道的是,在系统的另一个黑暗角落,有一个定时任务假设了这部分数据必须是强一致的,并且会在凌晨 2 点直接清理 Redis。AI 的优化,直接打破了这个“潜规则”,导致了难以排查的数据脏读。
如果原有系统已经存在高耦合,AI 往往不会像高级架构师那样停下来思考领域模型(Domain Model)是否腐化。相反,它会顺着耦合的路径,用最符合当前局部上下文的方式继续堆砌补丁。
我们称之为“顺向污染”。AI 生成代码的速度越快,系统熵增的速度就越可怕。最终你将得到一座跑得飞快、代码规范但毫无架构可言的“屎山”。
···

AI 编程工具处理的是“空间”问题——也就是静态的源文件。但绝大多数棘手的 P0 级线上 Bug,往往发生在“时间”维度上——并发、竞态条件、网络分区、以及状态的随时间演进。
这种“静态与动态的鸿沟”,在数据库 Schema 的演进与平滑迁移中体现得淋漓尽致。
假设由于业务需求,我们需要对一个拥有几十亿行数据的核心订单表进行拆分,或者仅仅是改变其中一个字段的映射逻辑。
对 AI 来说,这太简单了。它能在一秒钟内帮你修改好 ORM 的 Entity 声明,并生成漂亮的最终态 SQL 定义。
但在真实的生产环境(PB 级表)中,你敢直接执行 ALTER TABLE 吗?
真正的高级工程师知道,这是一场步步惊心的微操:
AI 擅长勾勒那个完美的“最终态”,但几乎没有工具能自主推演、规划和执行这样一条充满时间不确定性、包含进退策略的迁移链路。这就是工程经验的无价之宝。
···
软件开发中有一条著名的定律:**抽象漏洞定律 (The Law of Leaky Abstractions)**。当底层资源达到极限时,所有完美的顶层抽象都会被击穿。这也是 AI 代码生成的一大盲区。
当 AI 处理大量数据流时,它会倾向于使用语言标准库提供的一整套优雅的函数式调用(比如 map, filter, reduce),它知道这在算法复杂度上是 O(n)。
但在极端的性能场景下,真正的瓶颈早已不是大 O 复杂度,而是硬件的物理边界:
人类资深工程师在面临这些问题时,会基于对磁盘 I/O 吞吐、网络拓扑、OS 内核机制的理解,来反向折叠代码——哪怕写出来的代码看起来不那么“优雅”,甚至违反了某些设计模式,但它符合物理机器的脾气。
AI 写出的代码“逻辑正确”,但在冰冷的“物理边界”面前,逻辑正确往往一文不值。
···
既然代码生成成本已经趋近于零,我们就不该再把精力耗费在“如何比 AI 写得更快”上。留在牌桌上的关键,在于构建对复杂系统的掌控力。
以下是 AI 时代工程师真正需要修炼的三大护城河:
不要让 AI 在毫无约束的全局上下文中自由发挥。通过 DDD 的思想,划定清晰的有界上下文 (Bounded Context)。当你把一个庞大系统拆解为高内聚、低耦合的独立领域,并定义好清晰的聚合根(Aggregate Root)时,你交给 AI 生成代码的范围就被安全地框定了。上下文越干净,AI 的输出质量越高,也越难引发顺向污染。
既然 AI 读不懂人类脑子里的隐式假设,那就把它们变成硬核的约束。使用更加严格的类型系统(如 Rust 的所有权模型、TypeScript 的高级类型演算),或者在代码中大量使用前置断言(Pre-conditions)和后置断言(Post-conditions)。让 AI 犯的错,在编译期或持续集成(CI)的单测阶段就被强制阻断,而不是流入生产环境。
要默认一个前提:AI 生成的代码里一定埋着雷。因此,防御性编程的核心转向了可观测性。在系统设计之初,就必须植入极高分辨率的分布式链路追踪(Distributed Tracing)、自定义的业务 Metrics 埋点。一个优秀的工程师,要能构建出能够“自我证明其正确性(或及时暴露其错误)”的防御性系统。
···
AI 并没有,也不会消灭程序员。它只是极其粗暴地拉平了初级(Junior)工程师和代码生成工具之间的差异。
在这个时代,如果你依然把自己的价值建立在“熟练掌握某种框架 API”、“能快速写出一套 CRUD 接口”上,那么危机已经迫在眉睫。
是时候放下作为“打字机”的骄傲,拾起“权衡系统利弊”的利刃了。在 AI 编程的下半场,能够审视系统状态、规划演进路径、并承担技术后果的“工程判断力”,才是最稀缺的资源。
未来的每一位优秀工程师,本质上,都必须成为具备技术远见的产品架构师。
·共勉·