Anthropic 的持续集成流水线旁边,跑着一个不起眼的小服务,专门帮自动化构建记测试账,并在每次提交代码时挑出该跑的用例。在过去六个月里,Anthropic 这套服务的任务量猛增了 25 倍,工程师接连打了三次补丁,每次换来的平稳时间都比上一轮更短。最后团队派出一名工程师花了三周推倒重写,而作者估计一年前做同样的事情要耗费一个季度。先打补丁、以后再重写的老节奏,在成本的构成改变之后不再回本。
上面讲到的这些,都来自一篇复盘:2026 年 9 月 14 日,Anthropic 工程师 Sachin Malhotra 发了篇复盘,讲这套记账服务从开始扛不住、连打补丁,到最后重写的经过。初读我以为又是一篇讲 AI 让 CI 更忙、验证更重要的老话,读到后面才发现,主角不在持续集成流水线本身。出问题的是旁边这个记账的服务。
这套服务由两个部件组成。一个部件负责记账,把每次 CI 跑完的结果存下来;另一个部件负责查表,开发者打开 PR 时,它去翻以往的运行记录,决定这次挑选哪些测试执行。筛选过程遵循确定性规则,主要依据两条信息:每个测试过去跑得怎么样,以及它跟这次改动的代码包关联有多紧密。团队不需要每个 PR 都把全套测试从头跑到尾。业内做类似筛选的做法并不罕见,比如 Meta 2019 年就部署过同类选择。这套机制没有依赖代码覆盖率,也没有引入机器学习分类模型。
旧版设计把这两个部件塞进同一个单例进程。按顺序整理测试历史必须依靠单一写入方,这个约束直接堵死了向外加机器扩容的可能。任务密度升到每秒多个之后,记账的部件处理速度跟不上,落后二十分钟就会积压数万条测试结果没有入账。持续集成流水线本身没有中断,生产环境也没有流入未经测试的代码,麻烦出在账本落后上。
挑测试的那个部件拿着过期账本做选择,两头都在浪费算力。系统会选中已知容易失败或者不稳定的测试,白白耗费计算资源。新写出来的测试进不了执行池,留下回归隐患。坏合入也要隔更久才能暴露,引来多名工程师无效排查。人类工程师遇到无关报警还能自行甄别,依赖测试循环做自检修改的 agent 却只能拿着报错反复尝试,过期账本带来的打扰格外突出。
压力来自几处。测试总数扩大到 10 倍,工程师名义人数只略微增加。Claude 倾向于提交粒度更细的小 PR,推高了触发频次。自动化任务在夜间和周末抬高了活动底线,白天依然保留人类集中审批的突发高峰。到 2026 年 5 月,合入生产的代码行中可归因于 Claude 的比例超过 80%,脚注注明归因管道存在缺口,未归因部分包含自动生成代码等非人工产物。面对频繁跳出的告警,团队当时并没有把重写提上日程。
2025 年 10 月,这套记账服务开始吃紧,连续两天触发报警。当时没人主动认领这块设施,负责持续集成的团队手头有优先级更高的工作。工程师采取常规处置,把宿主机的计算核心数翻倍,换来大约 70 天的平稳运行。
到了 2026 年 2 月,机器资源再次见底。团队借助 Claude 生成的代码按代码包分片,把原本全仓库单一写入改为按包并行写入。这次修补换来大约 29 天的喘息时间。
进入 2026 年 3 月,内存压力全面爆发,服务进程几乎每天下午都顶到内存上限。排查只找到四个 bug,换用内存分配器没有效果,大家又不敢对高负荷单例做实时内存画像。团队只能退守到每日定时重启,买到的安全时间缩短到不足一天。每日重启让排队越滚越大,账本滞后一小时以上的情况反复出现,大量测试数据无法及时录入。
三次修补维持运转的时间依次是 70 天、29 天和不足一天,每次换来的寿命都大幅缩水。这是指数增长下的算术现实:只要输入端增速不减,任何按固定倍数追加容量的临时手段,买到的平稳周数必然持续收缩。
输入端的压力来自代码产出的剧增。Anthropic 的 自递归改进报告 提到,2026 年二季度典型工程师日均合入代码行数达到 2024 年的 8 倍。那页的脚注还说明,代码行数衡量的是数量而非质量,几乎肯定夸大了真实增益。即便存在数量与质量的差距,代码涌入加快的事实依然确凿。在最终切换之前,监控图上多数日期存在积压,未处理事件峰值逐周抬升。每日重启再也稳不住暴涨的事件流,账本延迟持续放大,打补丁走到了尽头。
面对失效的每日重启,工程团队终于下决心重写这套服务。一名工程师只用了三周就完成重构,作者对照估计,一年前类似规模的工作接近一个季度。需要说明的是,这属于作者个人的反事实估计,并没有设立平行的对照组。
新设计的核心做法是解除状态耦合。团队把录入运行结果与维护历史记录分开:任意节点都能接收测试结果,追加写进外部流水账,处理完毕立即释放内存。处理节点由此变成无状态,流量高峰时可以直接横向增加机器实例。另一个独立的轻量进程每隔几秒聚合一次外部流水账,汇总成供挑测试的部件快速查询的历史账本。
这次重写体现出技术门槛的大幅走低。智能工具协助编写了分片逻辑并寻找运行参数,新设计所需的存储容量与工作节点数量,很大程度上由 Claude 自主推导完成。推倒重来的成本明显变低。
技术造价下降的同时,团队习惯依然顽固。作者开启了一个长期会话,让 Claude 盯住排队积压,并在积压走高时发出提醒。Claude 在几个月里反复建议直接重写,团队依然一次次选择打补丁应付。从 2025 年 10 月最初报警到新系统上线,在组织惯性面前拖了将近半年。
面对频频报警的基础设施,工程团队到底该继续修补,还是停下手头工作重新写一套?大家时刻都在两难之间权衡。过去工程师习惯把重写往后推,因为重写要几个月工期,而扩容服务器或者加几段分支逻辑要省事得多。但现在重写要付的成本从一季度掉到三周,继续补买到的时间从 70 天掉到不足一天,两个价格朝相反方向走。
| 重写要付的成本 | 继续补的隐性成本 |
|---|---|
| 过去需要耗费整季人力,现在压缩至单人三周交付。辅助工具接管了编码与参数调优,实施门槛明显走低。 | 过去单次扩容能买到两月有余,现在补丁买到的有效周数持续收缩。系统频繁告警重启,反复修补的维护消耗越来越高。 |
| 借助代码生成与推演,推倒重来的直接投入持续下降,一次性改造即可换取长效收益。 | 面对指数级膨胀的提交量,固定倍数的修补手段迅速失效。积压的数据风险会反噬研发节奏,最终仍然躲不开重构。 |
两条成本曲线的交叉点发生了左移。重写的成本向下走,维持旧系统的隐性代价向上走,交汇的那一刻,就是重写比继续修补更划算的拐点。这个拐点明显提前了。重写这件事,不能再等到服务撑不住了才动手。
作者坦言,换大机器、并行切分、定时重启这些招数并不稀奇。关键洞见在于两件事凑到了一起:补丁换来的安全时间大幅缩水,而重写需要的开销同样显著下降。
这直接引申出两项新决策。推迟重写的门槛必须调低。一旦发现补丁有效期的衰减在加快,就应当尽早启动重构,不在低效的缝补里耗费精力。初始方案的容量预估必须更新。作者建议假设系统两个季度内会承受 25 倍负荷,初始版本应当按 10 到 20 倍流量留出扩展余地。
这也是此前讨论过的第二层红利。第一层是写代码更快更省力,属于直接收益。第二层是成本的构成改变之后,关于何时凑合、何时重写的平衡点发生位移。新方案没有跳出传统系统设计常识,变动的是决策天平两端的砝码。
面对这份复盘,普通团队需要区分哪些经验可以直接吸收,哪些做法不必跟风。很多总结源于通用系统设计原则,并不绑定在自动化编码集群上。可以吸收的经验,主要体现在三条不依赖自动化工具链的系统信号上。
第一条信号看单点隐患。单进程独占可变状态是明确的扩展隐患。旧版把记录与选择绑定在同一个实例里,请求密度一旦拉升,排队积压直接堵死向外加机器的途径。把状态移到进程外面、让工作节点保持无状态,属于经典常识。
第二条信号看收支对账。进出任务数量平衡是最便宜也最灵敏的运行指标。只要入口接收的构建任务与完成记录对不上账,不需要复杂的链路追踪,就能断定内部账本已经落后。
第三条信号看补丁寿命衰减。连续扩容换来的平稳时间如果持续收缩,就是启动重写清晰的信号。走到这个阶段,继续修补只会白白消耗精力。
有些做法则不应当盲目套用。没有密集自动化编码负载的中小团队,不必照搬外部流水账与分片消费者这套体系。按代码包运行测试、保持轻量单体配合规律维护,依然符合实际需要。
六个月 25 倍的任务增速是特定团队在特定阶段的遭遇,不能当作所有团队的常态。工具带来的真正变动在于两个价格的相对走势,不在于具体的负荷数字。脱离了高压代码流入的场景,盲目拔高分布式复杂度,只会换来多余的运维负担。
评估这份记录,必须区分确凿事实与无法交叉验证的推断。这是来自单一公司、围绕单一配套服务的个案,行业里目前缺乏第二组公开对照。
关键数据带有明确限定。六个月 25 倍增长没有细项分解,各项诱因的具体占比未知。代码产出提升 8 倍的口径自认局限,行数只衡量数量而非质量,几乎肯定夸大了真实效率。代码归因超过 80% 的统计存在缺口,未归因数据里夹杂着脚本等非人工产物。
工程对比包含主观成分。重构周期从一季度缩短至三周属于反事实估计,缺少平行对照。新设计让积压走平,作者承认运行费用高于旧方案,却没有披露具体金额。复盘全文没有提供缺陷率和线上故障数据。监控曲线走平仅代表排队恢复可持续,推导不出验证总成本下降,更无法证明代码质量得到改善。
提速与降价两种效应混合发力,公开材料无法将两者清晰剥离,不能把倍数机械相乘得出普遍结论。逐项列出边界在于界定事实的有效范围。面对这类案例,我更倾向于把注意力留在能够复核的价格变动上面,不去延展未经验证的推断。