两篇文章,一个教训:你不读代码的时候,agent 替你做了什么决定
Piotr Sarnacki 周日那篇《抱歉,你还是得思考》在 Hacker News 冲到 281 分,方法是去读 DHH 说再也没人需要读的代码。DHH 让 agent 把 Campfire Once 从 Rails 重写成 Rust,然后是 Elixir 和 Go,全程不看输出,然后发了性能测试。Sarnacki 的发现是,这几个重写回答的是不同的问题。Rust 版为了方便缓存把 CSRF token 砍了,用进程内队列替换了 Redis。Elixir 版贴着 Rails 原版走。这些和语言毫无关系。提示词没说清的每一个设计问题,向后兼容、延迟还是吞吐优先、崩溃后通知怎么办,全靠抛硬币决定,所以比较这几种语言什么都量不出来。再看性能测试:Zach Daniels 发现 Rust 版在高负载下通知送达率只有 1%,Elixir 社区宣布胜利,Sarnacki 一路追到一个容量设成 256 的 tokio 广播通道。改成 16384,送达率上到 90%,但最差延迟从 11 秒变成 130 秒以上,文章认为这比直接断开掉队客户端更糟。agent 没有做错。它根本没被问过。
Maurice Heumann 写的同一种失败,规模大得多,同一晚也上了首页。三个月、大约 5000 亿 token,同时跑着 Claude Max 20x 和 Codex Pro 两个套餐,四个 agent,三个干活的加一个审核的,从二进制反编译一款第一人称射击游戏,每个编译单元一个 GitHub issue 做协调,一个 Discord 频道当 agent 之间的总线,Hex-Rays 通过 MCP 接入。文中说 harness 选哪个几乎无所谓,大部分活是 Sonnet 5 干的。反编译进度到 80% 左右,游戏能启动。代码是错的。函数签名和结构体布局是编的,逻辑有删有增,全局变量变成了哈希表。审核 agent 一直在接受干活 agent 写在提交注释里的自我辩护,作者称之为无意的提示注入。解决办法不是换更好的模型,而是一个字节级比对的判定器:用原始编译器重新编译,要求输出完全一致,一个 agent 没法狡辩的通过或失败。
两篇形状一样。你没有完整定义的任务,agent 会把它做完,做法是悄悄替你把定义补上。Sarnacki 的答案是你去读代码。Heumann 的答案是造一个不需要读代码的验证器。Karpathy 同一个周末的帖子把"从二进制反编译应用"列为 2000 万专业人士现在一句提示词就能做的事。这两篇写的都是那句话里提示词之后的部分。
Sarnacki:https://itsallaboutthebit.com/i-am-sorry-but-you-still-have-to-think/
Heumann:https://momo5502.com/posts/2026-10-09-game-decompilation/
← 返回所有文章
Maurice Heumann 写的同一种失败,规模大得多,同一晚也上了首页。三个月、大约 5000 亿 token,同时跑着 Claude Max 20x 和 Codex Pro 两个套餐,四个 agent,三个干活的加一个审核的,从二进制反编译一款第一人称射击游戏,每个编译单元一个 GitHub issue 做协调,一个 Discord 频道当 agent 之间的总线,Hex-Rays 通过 MCP 接入。文中说 harness 选哪个几乎无所谓,大部分活是 Sonnet 5 干的。反编译进度到 80% 左右,游戏能启动。代码是错的。函数签名和结构体布局是编的,逻辑有删有增,全局变量变成了哈希表。审核 agent 一直在接受干活 agent 写在提交注释里的自我辩护,作者称之为无意的提示注入。解决办法不是换更好的模型,而是一个字节级比对的判定器:用原始编译器重新编译,要求输出完全一致,一个 agent 没法狡辩的通过或失败。
两篇形状一样。你没有完整定义的任务,agent 会把它做完,做法是悄悄替你把定义补上。Sarnacki 的答案是你去读代码。Heumann 的答案是造一个不需要读代码的验证器。Karpathy 同一个周末的帖子把"从二进制反编译应用"列为 2000 万专业人士现在一句提示词就能做的事。这两篇写的都是那句话里提示词之后的部分。
Sarnacki:https://itsallaboutthebit.com/i-am-sorry-but-you-still-have-to-think/
Heumann:https://momo5502.com/posts/2026-10-09-game-decompilation/
评论