--- title: 你的AI代码越写越乱,他72小时合了14个PR——差距只在一个机制 source_url: https://mp.weixin.qq.com/s/sMoSwp1f0cR6PI8_ZT4oNQ publish_date: 2026-05-13 tags: [wechat, article, claude, gpt, agent, harness, coding] review_value: 7 review_confidence: 7 review_recommendation: neutral sha256: b714839030ed04f06609cfb1923ddcae77a5f27d9c47c251da0ac4630cff50d6 --- # 你的AI代码越写越乱,他72小时合了14个PR——差距只在一个机制 Garry Tan 上周发了一篇文章,我读完停了很久。 72小时,一个人,14个PR,近29,000行代码。每一次发布比上一次测试覆盖率更高,质量更好。不是快了但变差——是又快又更好。 我第一反应是:这不对。这违反了软件工程五十年来的基本常识。 Garry Tan是YCombinator的CEO,同时也是GStack(9.3万GitHub Star、70万行代码)和GBrain两个开源项目的创始人兼主要作者。几乎所有代码都是他用Claude Code和Codex写的,同时跑15个并行会话。他把这套能让AI写出的代码只进不退的机制叫做:复杂度棘轮。 ## 01 速度和质量 "快 vs 好",这个选择折磨了软件工程师五十年。要么快发,要么少出错;要么多功能,要么稳定——鱼和熊掌,二选一。 Garry Tan说:这个二选一的局面,现在可以结束了。 解锁的关键是90%的测试覆盖率——而AI Agent让我们免费就能做到。五十年来,这个级别的验证成本太高,人类的意志力撑不住。现在,Agent在写代码的同时就把测试写了。结果就是我所说的「复杂度棘轮」:一个只进不退的系统。 ## 02 软件变韧了 软件工程的整个学科,五十年来围绕一个核心焦虑展开:防止出错,因为出错是灾难性的。 你必须第一次就把代码写对。漏掉一个边界情况,生产环境就崩了。一次写坏的数据库迁移,客户数据就丢了。某个函数藏着微妙的逻辑,唯一懂它的工程师离职了,没人知道为什么它能跑。 现在有些东西变了。Garry Tan用了一个词:软件变"软"了(squishy)——不是说变草率了,而是说变有韧性了。 举几个真实例子: - 数据库迁移出错了?Agent读取错误信息,理解45个版本的数据库结构历史,写出修复,写出测试。 - 文件同步在百万个符号链接上卡住了?Agent诊断出解析器超时,把时限锁定在30秒,带着测试一起发了出去。 - 某个信息提取管道有归因bug?跨模型评估发现了,提示词迭代修复,规则加到了数据库层。 绝大多数代码级别的错误——逻辑bug、解析失败、边界情况——Agent现在都能在下一轮诊断和修复。 仍然是灾难性的错误,只剩下那些会摧毁状态的:生产数据上的坏迁移、在被发现前就被利用的安全漏洞、收不回来的隐私泄露。但这些是少数。 ## 03 棘轮是什么 棘轮(ratchet),是一种只允许单向运动的机械装置。套筒扳手拧紧螺栓,阻止它往回转——这就是这个比喻的来源。 每一次AI编程会话,都会在代码库里留下三样东西: - **测试**:告诉下一个来的人什么叫"正确"——改动一旦破坏了什么,它会大声报错 - **文档**:记录的不只是代码做了什么,还有当时为什么这么决定、取舍是什么 - **评估结果**:给质量打了分,让你能看出下一个版本是变好了还是滑下去了 下次Agent来处理这个代码库,这三样东西全在它的上下文里。它面对的不是一个空白的起点,而是一份有记忆的现场。它不能退化到测试套件以下——测试会失败。它不能无视文档——就在眼前。它不能把质量拉低到评估基准以下——分数都记着呢。 质量地板每一轮都在上升。单向前进。这就是棘轮。 ## 04 实际长什么样——GBrain案例 Garry Tan举了他自己的GBrain项目作为例子。GBrain是他在做的一个知识系统——给AI Agent提供长期记忆,通过存储、索引和检索一个人的笔记、会议、对话和研究来实现。把它想象成你的AI助理能真正读取的第二个大脑。 GBrain有一个功能叫「认识论提取」:读取数千页内容,提取谁相信什么、置信度多少、随时间如何变化。比如:"Garry认为比特币会涨到30万美元(置信度:0.45)。""Jared认为这家创业公司留存很强(置信度:0.80)。"就这样,横跨28,000页。 第一次跑提取,拉出了100,720条观点。他用跨模型评估来打分——让GPT-5.5和Claude各自独立评分。总分:6.8分(满分10)。 最大的问题?他把它叫做"持有者混淆"。拿这个说法来说:"AI将在2027年前取代80%的软件工程师。"这个观点是谁的?是写它的人说的?是他们在引用别人?还是系统的分析引擎从播客文字稿里推断出来的?第一版在35%的情况下搞错了这个区分。 接下来发生的才是重点: - 评估结果被记录下来,六个具体的失败模式被识别出来 - 第二版提示词针对性修复了全部六个 - 置信度分数的取整规则被强制到数据库层——不再出现0.74这种假精确,0.75才是诚实的答案 - 17条测试把这份契约锁住了 从此,没有任何未来版本的提取功能能在不通过这17条测试的情况下发布。没人需要记住为什么取整很重要,或者"持有者混淆"是什么意思。测试记得。 ## 05 会死的项目 "振动编程"(vibecoding)是Andrej Karpathy创的词——用自然语言描述你想要什么,让模型生成代码。Garry Tan用这个方式构建,我也用。但他说,从YC申请材料和开源仓库来看,大多数跳过测试的振动编程项目,在到达中等复杂度之后就开始瓦解——几千行代码,几个相互影响的功能。 他们漏掉了棘轮。没有测试,没有文档,没有评估。Agent加入了复杂度,但没有什么阻止退化。 代码质量分叉:有棘轮的项目随版本稳步上升,无测试的振动编程在 v0.5 走向 Quality Collapse(质量崩塌) 棘轮机制和人无关——重要的是下一轮会发生什么。当一个新的贡献者打开PR,当模型版本迭代了,当你在凌晨两点判断力下降的时候,测试会无论如何抓住退化。棘轮就算人状态不好也照样运转。这才是关键。 ## 06 测试是记忆 在传统软件公司里,机构记忆住在人脑里。知道为什么那个缓存层存在的资深工程师。记得那次差点摧毁数据库的迁移的架构师。能解释账单系统那个奇怪边界情况的技术负责人。 人会离开。 退休、被挖走、燃尽。他们走了,知识也消失了。每家软件公司都有过这种经历:打开一个关键文件,发现注释写着"千万别动这里——问Dave",而Dave三年前就离职了。 Agent的上下文窗口不会离职,不会被挖走,不会遗忘。当测试套件里写着"置信度取整必须用0.05的步进",文档里解释着"因为跨模型评估显示假精确会降低对分数的信任",这份知识就是持久的。任何Agent、任何模型、任何时候都能加载这个上下文,理解这个约束。 测试是能熬过人员流动的机构记忆。对一个单人项目来说,它们更关键——那是你唯一拥有的机构记忆。 ## 07 不只是代码——TTY行为测试 这里有一个让我读完之后想了很久的论断:棘轮不只对传统代码有效,它对任何计算机能观察到的东西都有效。 操作系统给你进程树、文件系统状态、网络套接字、定时任务。终端给你每一次按键、每一行输出、每一个交互提示。浏览器给你渲染后的页面、按钮状态、导航事件。API给你结构化响应供你解析验证。AI Agent给你可观察的行为——它说了什么,调用了什么工具,按什么顺序做事,在行动前有没有先询问。 所有这些都可以被接入测试框架(harnessable)。能接入,就能观察。能观察,就能断言。能断言,就能棘轮。 GStack有一个功能叫交互式方案审查:你让它审查你的架构,它逐段走过方案,提问题,挑边界情况,质疑你的假设——像一个真的读代码的工程经理。 问题来了:Claude Code有时候会直接跳过交互部分。读完方案文件,一次性把所有发现都倒出来,然后退出——没有问用户一个问题。整个审查的意义就在于来回对话,跳过了就失去了意义。 怎么测试这个?"AI有没有对话",没有任何传统测试框架覆盖这件事。 他用Bun的TTY功能搭了一个测试框架,把Claude Code spawned在一个伪终端里,喂给它一个特定的代码库场景,触发审查技能,实时监控终端输出。测试观察Agent有没有在结束前发出一个交互式问题。如果它把发现全部倒出来然后退出,没有问任何东西——测试失败。 这不是在测试代码。这是在测试AI Agent有没有遵守行为契约。在终端层面。通过字面上盯着它工作来实现。 棘轮响应是三层: 1. **技能指令里的强制停止门**:明确写明"你必须在进入下一节前问用户",附带防合理化条款,点名说出具体失败模式 2. **反捷径条款**:"方案文件是交互审查的输出结果,不是它的替代品",一句话关上了模型一直在钻的那个漏洞 3. **终端层面的门槛测试**:实际把Claude Code在受控场景里运行,如果Agent没有问至少一个交互式问题就失败 ## 08 为什么是90% Garry Tan引用了研究人员Capers Jones对10,000多个软件项目的研究,测量了「缺陷移除效率」(DRE)——在bug到达用户之前被发现的百分比。数据显示: - 70%以下的覆盖率,DRE大约在65-75% - 85-95%的覆盖率,DRE跳到92-97% - 在大约85%的位置有一个拐点,缺陷逃逸率在这里急剧下降 航空电子行业几十年前就搞清楚了这件事。FAA针对飞行关键软件的标准DO-178C,要求A级系统使用改进条件/判决覆盖(MC/DC),实现超过99%的DRE。他们不是因为官僚主义才强制要求的,而是数据显示,低于某个覆盖率阈值,关键缺陷会以与不出人命不兼容的速率逃逸。 六西格玛也有类似的规律: - 3西格玛工艺:每百万次产出约67,000个缺陷 - 4西格玛:约6,200个 - 5西格玛:233个 从4到5西格玛不是渐进改善,是相变。测试覆盖率遵循同样的曲线。从70%提升到90%,不是提升了30%,而是缺陷逃逸减少了一个数量级。 但他也诚实地说了:研究也显示,要达到90%以上,后面那20%需要付出不成比例的工作量。这在过去几十年一直是真的。 ## 09 AI拆了那堵墙 有一件事改变了:AI编程Agent不感受「努力」。 它不会厌烦地写第14个边界情况测试。它不会在周五下午五点图省事。它不会盯着一个复杂的集成测试想"以后再说"。让人类团队止步在70%的努力曲线,对Agent根本不适用。 让人类吃不消的那最后20%,恰恰是AI Agent最擅长的那类工作。 不过Garry Tan混淆了两件不同的事:写测试的意愿,和知道该测试什么的能力。那最后20%之所以难,不只是因为人类懒。更是因为那些边界情况本身很难被识别——你不知道你不知道什么。 达到90%曾经是一项英雄主义工程。现在,这不过是周二的日常工作。这就是游戏变了的地方。 棘轮不是关于覆盖率数字作为一个虚荣指标。它是关于编码行为契约的测试——持有者混淆测试、置信度取整测试、交互审查门。每条测试锁住了一个具体教训。覆盖率只是一个代理指标,告诉你有多少系统行为处于契约之下。 ## 10 已经发生了——GStack和GBrain的真实数字 这不只是理论。Garry Tan用数字来说话。 - GStack现在有37名贡献者,v1.30单次发布合并了21个社区PR - GBrain有25名贡献者,v0.31.1.1单次PR落了22个社区修复——认证流程、架构启动、同步、隐私问题全都包括 棘轮让这件事变得安全。每个外部PR必须通过现有测试套件。新的贡献者不需要理解整个系统,他们只需要让测试通过。 上周的GBrain发布记录了这个故事: - v0.31.0:新增了一张「当下记忆」表,加上了一个"梦境整合"阶段,把短期记忆升格为长期知识 - v0.31.1:修复了25条CLI命令——它们一直在悄悄把请求路由到一个空的本地数据库,而不是用户真实的大脑 - v0.31.1.1:一次PR里22个社区反馈的修复 - v0.31.2:修复了大型含符号链接仓库上无限挂起的代码同步,加了30秒超时 每一次发布都比上一次有更多测试。Agent在写代码的同时写测试。覆盖率不会滑落,因为维护它的努力不再是人类的负担。 ## 对我们意味着什么 软件的复杂度天花板刚刚升高了很多。 以前,它受限于一个团队能同时在脑子里装多少东西。现在,它受限于一个人加上能把整个代码库、结构历史、测试套件和文档全部加载进上下文的Agent。这是一个大得多的数字。而且随着上下文窗口变大、模型推理代码的能力提升,它还会继续增长。 Garry Tan说得很直接:每一家没有采纳这套模式——Agent + 品味 + 只升不降的测试套件——的软件公司,已经在以比一个有这套工具的单独个人更慢的速度、更低的质量在发货了。 问题不是你能不能负担得起90%。而是你能不能负担得起没有它。 但还有一件事:Garry Tan整个论证建立在一个前提上——质量是可以被测试捕获的。测试通过,就是变好了。但也许测试只是让我们对覆盖到的部分更有信心,同时让那10%未覆盖的地方更难被发现——因为它不会触发任何警报,而整个系统看起来很健康。 棘轮机制解决了退化问题,但没有解决方向问题。一个只升不降的地板,前提是地板在往正确的方向升。Garry Tan把这个叫做"品味",然后用括号一笔带过了。我觉得那个括号里装的东西,比这篇文章讨论的其他所有东西都更难,也更重要。 --- 来源:Garry Tan (@garrytan) — https://x.com/garrytan/status/2054064931515855118 深思圈 — https://mp.weixin.qq.com/s/sMoSwp1f0cR6PI8_ZT4oNQ