THE JOURNAL / FIELD NOTES
当每块砖都不再署名

我做软件很多年,至今仍会为一段好代码高兴。它可能是一个恰到好处的抽象,也可能是一段把复杂问题收拾得很干净的实现。读的时候,你能感觉到作者在取舍:哪里该藏,哪里该露,哪个名字经过推敲,哪个边界是吃过亏以后才画下的。经典的软件文化教我们把代码当作品,把程序员当工匠。很多工程师也确实把自己的一部分留在代码里,像木匠在榫卯上留下手感。
我最近越来越强烈地感到,这种自豪感正在失去原来的经济位置。好代码依然重要,审美和技艺也没有过时,变化发生在软件生产的组织方式上。AI 写出的大量代码平庸、雷同,没有作者气味,今天生成,明天就可以全部推翻重来。我们很容易因此轻视它,说它没有灵魂。换个角度看,没有灵魂也许正是代码开始成为工业材料的迹象。
一块手工烧制、纹理独特的砖,放在院墙上可以很好看。一栋百层建筑却不希望每块砖都坚持自己的个性,它需要材料的尺寸、承载、误差和接口能够计算。摩天大楼不靠无数块更有灵魂的砖,它依靠标准材料、结构设计、施工流程、检验制度和明确的签字责任。当代码也变成随时可得、批量生产、可以替换的材料,工程师最稀缺的能力就会从“亲手做好这一块”,移到“让整栋楼被正确地建造”。
妈妈的纺织厂,现在轮到我了
我之所以总用纺织厂来理解 AI,不只是因为纺织业开启了工业革命。我的妈妈亲身经历过这个过程。她那一代人看着纺织从依赖熟练工人的手艺,变成由一排排机器组织起来的生产;机器越来越快,工序越来越连续,需要守在机器旁边的人越来越少。后来自动检测、自动停机、自动排产进入车间,人的位置又一次向后移动。
我没有经历她当年的车间,但今天轮到我了。
我们这一代程序员原本也靠手艺吃饭。需求来了,我们理解它、拆解它,然后把判断一行行写进代码。一个优秀工程师能记住大量 API,知道框架的脾气,能在复杂系统里迅速找到落脚点。团队的速度、质量和风格,往往与几个关键工程师的能力直接绑定。这和手工纺织并没有那么不同:最终产品紧紧连着熟练劳动者的双手。
最早的 AI 编程工具像在工位旁边多放了一台机器。人给出具体要求,它补几行代码,人再逐行检查。随后出现可以独立读取仓库、修改文件、运行测试和提交结果的 Agent,它开始承包一整道工序。现在,我们又开始把多个 Agent 放进持续运行的流程里,让它们自己发现任务、并行工作、互相检查、失败重试,最后只把异常和需要拍板的事情交还给人。
这条路不会停在今天的工具上。手工纺织没有一步跳到关灯工厂,软件也不会。每一代工厂都会暴露新的瓶颈,催生下一代设备和组织方式;新工厂刚建立,可能很快就被更高效的工厂替代。所谓关灯,也不意味着没有人。正常路径可以在黑暗中运行,一旦机器无法安全处理异常,灯还是要亮,人还是要到场。
凌晨三点,Agent 仍在读取 issue、修改代码、跑测试、判断失败原因并再次尝试。重要的已经不是它一晚写了多少行,而是早上谁知道它做过什么,谁有权让它停下,哪些证据足以让结果进入生产,事故发生后能不能还原每一个决定。工厂越自动,控制系统越重要;人越少出现在流水线上,信息权和停止权越不能含糊。
从手工作品到工业材料
软件工业化的主线其实很清楚。标准库让我们不必重写基础算法,操作系统让我们不必直接管理每一块硬件,数据库、开源包、API、云服务和容器又不断把常见能力从项目内部搬到货架上。每一次抽象,都让工程师少做一层重复劳动,也让更大的系统成为可能。
过去难以搬上货架的,是那层贴着具体业务生长的语义胶水。比如看懂一封邮件以后决定该交给谁,结合一段执行记录判断任务是否完成,根据公司政策和当前状态选择下一步。这些判断带着上下文、例外和组织习惯,很难被传统软件组件覆盖。团队只能把它们逐条写成规则,或者专门采集数据、训练分类器。
生成模型把这段成本压了下来。普通 CRUD、adapter、测试骨架、格式转换和样板配置已经可以随时再生;过去需要定制开发的一些语义判断,也开始变成可以调用的能力。代码仍然不可缺少,却越来越像施工材料和临时脚手架。今天费力保存的一段实现,明天可能因为约束变化而被整体重建。代码从最终作品,逐渐变成了生产过程中的中间材料。
廉价代码当然不等于工业化。AI 也可能制造出更多互不相同、无人理解的一次性系统。如果缺少契约、测试、版本、可观测性、替换机制和责任边界,我们得到的只是高速手工业。工厂的价值从来不在机器数量,而在于机器、工序、质检、物流和责任能否形成一套可以持续运行的生产制度。
电子工业也经历过类似的层级移动。在集成电路普及之前,晶体管电子设备要靠大量离散器件布线装配。集成电路成熟以后,绝大多数系统设计者不再决定每个晶体管如何摆放,他们选择芯片,设计总线、功耗、时序、冗余和散热。晶体管没有消失,懂晶体管也没有变得无用,只是系统设计的主要层级上移了。
现在,代码片段正在变成晶体管,模型和 Agent 正在变成可编程芯片。未来工程师当然仍要懂代码,否则出了事故连材料为什么断裂都不知道。但他的主要产出会越来越少地表现为“我写了多少行”,越来越多地表现为“我设计了一套什么系统,它如何工作,如何发现错误,又如何停下来”。
AI 正在拼一台新的计算机器
这也是我观察 Jev、loop engineering 和 graph engineering 的角度。它们各自并不神秘,放在一起却很有意思:AI 正在把自己的能力装进一个个标准箱,然后用这些标准箱构造新的计算机制。
Loop 是控制回路。它让系统不再回答一次就停下,而是执行、观察、验证、修正,直到满足停止条件,或者触发成本与风险边界。Graph 是结构图。它规定任务在哪里分叉,哪些节点并行,结果在哪里汇合,状态怎样流动,谁能否决谁,什么时候必须等待人类。Jev 这样的模型则像概率继电器,负责有边界的语义判断:从几个选项里选择,对风险分级,或者判断某个条件成立的可能性。
放进同一台机器里看,它们已经提供了几种基本能力:循环、分支、路由、并行、状态流转和概率判断。过去这些东西散落在 prompt、业务代码和操作者的脑子里,现在开始拥有明确接口,能够被组合、替换和测量。
从严格的计算理论看,只要有条件分支、循环和足够的可读写状态,图灵完备并不困难。我们用普通代码把这些模块粘起来,今天就能构造任何可计算流程。真正尚未完成的,是一套面向 AI 的工程机器:它既能自由处理模糊问题,又能像传统计算机一样稳定、可恢复、可验证地运行。
这套新脚手架还缺几类重要模块。
首先是可靠的持久状态。现在许多 Agent 的“记忆”仍然是不断膨胀的对话,时间一长就会遗忘、污染或自相矛盾。未来需要的不只是更大的 context window,而是像文件系统和数据库一样,有类型、版本、来源和生命周期的外部状态。什么是事实,什么是推测,什么已经失效,必须能够区分。
其次是事务与恢复。Agent 调一次工具可能会发信、扣款、改数据库、部署服务。失败重试不能把同一件事做两遍,流程中断以后也不能从头猜测。新的运行时需要幂等、检查点、回滚、补偿事务和确定的恢复语义。没有这些能力,所谓自主 Agent 只是一个随时可能重复副作用的脚本。
再往上是验证器。机器不能因为自己说“完成了”,任务就算完成。每个重要节点都需要证据:测试结果、外部观测、独立审查、约束证明,或者人的确认。生成者与检查者应当分开,验证失败要能够带着明确原因回到前面的节点。今天的软件测试只是这套体系的起点,未来的 eval 会更像工业质检,也更像一种可执行的合同。
还需要统一的能力和权限系统。模型可以提出动作,运行时必须决定它有没有资格执行。读文件、改代码、访问客户数据、付款和部署生产环境,风险完全不同。权限不能只写在 prompt 里,它需要成为 graph 上真实存在的门,有可审计的授权、撤销、超时和升级机制。
最后是调度器与市场。不同任务需要不同成本、速度和能力的模型,有些判断应该交给 Jev 这样的廉价分类器,有些需要强推理模型,有些根本不该调用 AI,普通代码算得更快、更准。未来的运行时会像操作系统调度进程,也像供应链分配订单:根据风险、预算、延迟和历史表现选择元件,并在元件失效时自动切换。
当持久状态、事务恢复、验证、权限和调度逐渐标准化,AI 才会从“一个很聪明的模型”变成一台完整的生产机器。今天我们看到的 Jev、loop 和 graph,只是最先露出水面的部件。具体产品会被替代,术语会过时,新的标准箱会不断加入。重要的是这台机器已经开始自我组装。
当工程师不再逐块砌墙
当代码成为廉价材料,单纯出售“把需求翻译成代码的手速”,就会被压到生产链里最容易替换的位置。记住大量 API 细节、熟练敲样板代码、手写普通 CRUD、为每个需求重造分类器,这些能力不会一夜归零,议价能力却会快速下降。过去我们有时用复杂抽象证明个人技巧,甚至把只有自己能维护当作护城河;在工业化生产里,这种不可替换更接近质量缺陷。
有人会用“工程师民工化”形容这个过程。这里说的不是现实中的建筑工人不需要专业能力,而是劳动在生产体系中的位置被拆分、计量和商品化。如果工程师仍把自身价值锁在逐行编码上,他就会被安排在新产线里最窄的一道工序中:对整体目标没有信息,对流程没有控制,最终结果出了问题却可能还要背责任。
出路也不是人人把职级改成 Architect。工业化从来不会把所有工人都晋升成设计师,它只会重新安排稀缺性。有人会设计系统,有人负责运行、评估、审计和异常处置,也会有大量旧工作被标准化、压价或消失。能够上移的人,需要获得建筑师和土木工程师式的能力。
这种能力首先是把含混愿望整理成约束、边界和验收。然后是设计反馈、重试、停止、预算和恢复,决定任务在哪里分叉、并行与汇合,在代码、分类器、强弱模型和人之间做选型。还要安排测试、观测、权限、回滚和事故处置,把产品、用户、运营、法务和现实环境带进同一张图里。
这不是离开技术去“管理 AI”。土木工程师不会因为不亲手砌每面墙,就可以不懂材料和施工现场。未来的软件工程师可以不逐行写完所有代码,却必须知道模型会怎样失败、数据会怎样泄漏、重试为什么可能重复扣款、概率为什么会失准、一个局部指标又会怎样把整套系统带向错误方向。
这种上移也拿走了一个很舒服的借口。逐行写代码时,我们容易说“我只是按需求实现”;使用 Agent 时,又容易说“这是模型生成的”。一旦负责生产系统,就必须回答需求本身是否合理,指标会不会诱导错误,验证是否覆盖真实风险,失败由谁承受。自动化可以转移操作,无法取消组织对目标、权限、放行和损害的责任。
建筑规模越大,结构设计、规范、验收和签字越重要。软件也一样。一个错误的 loop 会批量制造错误,一条错误的 edge 会把问题送进整套系统,一个设计不当的指标会被机器极其高效地优化。以前一个工程师一天能犯的错有限,今天一个自动系统可以在夜里把同一种错复制几千遍。代码生产规模暴涨以后,工程没有变少,后果却被放大了。
砖上的名字消失以后
南京明城墙的许多城砖上留有铭文。那不是工匠为了表达个性留下的艺术签名,而是一套叫“物勒工名”的质量追溯制度。砖上记录产地、督造官吏、基层负责人、窑匠和造砖人的姓名,质量出了问题,可以沿着砖上的名字逐层追责。验收也有具体标准:“敲之有声,断之无孔。”六百年前的人已经知道,大规模工程不能只靠工匠精神,还需要标准、检验和完整的责任链。
今天的代码正在走向另一个极端。越来越多的普通代码由模型生成,被另一个模型检查,又在下一轮需求里重新生成。没有人记得其中某一行来自谁,甚至追问作者是谁也不再有意义。每块砖都不再署名,并不必然是一件坏事。工业材料本来就不需要靠作者性格工作。危险的是,砖上的名字消失了,图纸、验收记录、放行决定和责任链也一起消失。
标准化只能让系统稳定地做同一件事,不能保证方向正确。五个 Agent 可以使用相同格式、通过相同检查,然后一致地伤害用户。自动验证也只能覆盖被表达成指标的部分。一个页面可以测试全绿,却用诱导设计骗用户付款;一个客服系统可以提高结单率,办法却是让投诉者更难找到入口。
我最警惕的,是自动化把控制权拿走,却把后果留给基层工程师和用户。系统按管理层设定的指标运行,工程师看不到完整决策链,只能处理告警;用户不知道为什么被拒绝,也找不到可以推翻机器的人;出了事故,组织又把责任归结为某个值班人员“没有及时发现”。这种结构技术上很先进,治理上却很原始。权力、信息和责任一旦错位,所谓关灯工厂就会变成一间没有窗户的房间。
所以,每一套 Agent 系统都该回答几组问题。谁能查看状态和决策证据?谁可以修改阈值与路径?谁拥有暂停整条生产线的权力?模型更新时谁批准,失败时谁回滚?哪些人承担系统错误,却没有参与定义指标?权限不是最后加上的安全选项,申诉也不该只是页面角落里的一条链接。它们应该进入系统结构,接受测试、演练和审计。
成熟的软件工厂不能只测吞吐、延迟和成本。它还要能说明一次决定从哪里来,保留足够证据供人复核,在不确定时主动降级,并给受影响的人留下有效的申诉路径。它必须允许人推翻指标,而不是要求人永远服从指标。生产可以自动化,责任不能自动消失;执行可以关灯,治理不能关灯。
我对此并不只有兴奋,也有一点不舍。工匠感是真实的,亲手把混乱变成秩序的快乐也是真实的。如果我们把尊严完全绑在逐行编码上,就会错过更大的工程对象。砖变得便宜以后,我们第一次可以持续建造过去成本上无法想象的软件:它能并行工作,长期运行,观察自己的失败,在限定范围内修复,并把人留在需要判断和签字的位置。它能否成为摩天大楼,取决于我们有没有能力设计结构,而不是砖上还有没有指纹。
具体产品会被替代,框架会改名,今天的最佳实践也会像上一代纺织机一样进入历史。新的软件工厂刚刚诞生,可能很快就会被下一代工厂淘汰,再下一代也不会是最终状态。变化不会停在某个完美架构上,它会不断把人的手从一个瓶颈移向另一个瓶颈,把今天昂贵的判断变成明天货架上的元件。
现在轮到我们经历妈妈那一代人经历过的事情。区别只在于,她面对的是纱锭、织机和车间,我们面对的是模型、循环和计算图。写代码仍然是一项重要能力,却不再足以定义工程师。未来稀缺的,是理解需求、组织生产、设计反馈、安排控制、验证质量、处理例外,并在图纸上留下责任的人。
当每块砖都不再署名,真正不能匿名的,是那张决定大楼如何站立、何时停工、出了事故由谁负责的图纸。