跳到主要内容
“代理写得更顺”不是选库理由——那篇文章的底,被一条评论掀了

“代理写得更顺”不是选库理由——那篇文章的底,被一条评论掀了

嘴替
嘴替

· 阅读约 6 分钟

9 月 8 日 dev.to 上那篇文章,问的是开发者会不会因为 AI 代理写得更可靠而选某个库。

我的答案:不会。至少那个最硬的卖点撑不起这个结论。作者 Erik Hanchett 拿 Effect 和 StyleX 各演示一遍,结论留了余地——不会把每个项目迁到 Effect,也不会用 StyleX 重写 Tailwind,但未来代理友好的库会成新常态,人类可读性"虽然重要但没那么重要了"。

前半句实话,后半句偷懒。偷懒在哪,拆两层。

第一层,那个卖点站不住。

文章里那个循环确实漂亮:loadProfile 返回带标签的错误联合,NotFoundError 带 handle,RateLimitError 带 retryAfterSeconds,NetworkError 带 reason;describeError 在一个地方按 _tag 分支;代理加了 MaintenanceError 却忘了更新 UI,assertNever 直接变成类型错误,代理拿到修正信号,一轮改回来。真做过的演示,效果不是吹的。

但它成立的前提是:所有消费这个错误通道的地方都得这么写。评论区那位 Vinh Nguyen 挑的就是这个。真实程序里同一个错误通道还有别的消费者——重试策略、日志级别、HTTP 状态码映射、要不要告警。这些如果是用简单的标签比较写出来的,一个 if/else 判断完事,新增一个 MaintenanceError 照样编译通过,新错误静默落进 else 分支,没人知道。类型系统不会告诉你哪些消费者写穷尽了,它只在你已经穷尽的地方兜底。那位的意思大致是,这更像个 grep,不像编译器。

这句我认。而且它把作者的算盘打翻了:作者想把错误处理从团队口口相传里搬出来,搬进类型系统。可这个属性的全部收益,取决于一份还得靠人手维持的约定——每个消费者都乖乖写穷尽。搬了一圈,搬回原地的还是约定。

第二层,更危险的是升级。

另一个评论者 Mudassir Khan 提了个我觉得被严重低估的场景:代理在某个版本上自信地生成 Effect 代码,一次改动错误通道形状的主版本升级,会在运行时炸掉之前,先把代理的假设悄悄废掉。他还说自己在另一个强类型库上见过——代理持续生成比当前版本落后一整版的写法。

人类维护者碰上大版本升级,会翻 changelog,会被类型错误拦住,会骂两天然后修。代理不翻 changelog,至少现在不翻;它照训练里见过的模式写,编译过了,就当验收完了。那篇文章论证的是代理现在能不能写好,Khan 问的是代理能不能跟上版本。第二个问题没人回答,但它比第一个要命。

所以真要在选库清单里添一项,我添 API 稳定性和错误契约的明确程度,不是代理写顺不顺手。后者有一半根本不由库决定——取决于代理训练时见过多少这个库、取决于错误消息有多精确。库设计能影响的只有后一半。

顺便说一句论据质量。文章里最响的一句,是转述一位讲者的话,说 Kiro、Claude Code 这些代理用 Effect 写 TypeScript,比他自己写得好得多。这话我没法核实,也没法推广。一个对某个库不够熟的人,看见代理写得比自己好,这不叫证据,这叫有人不熟。要是十个团队都这么说,那勉强算个信号。

还有 Effect 官网把自己写成面向 AI 时代的可靠 TypeScript 这件事。这个我有意见,意见不在它吹——在于这个标签太好用。任何复杂度高的库,以前得解释自己为什么复杂、换来的类型安全性值不值那个学习成本,现在只要说一句代理用得好,学习曲线那一关就能绕过去。成本没消失,只是从"你得学"变成"你以后得维护一个自己读不顺的东西"。省下来的那部分谁付,暂时没人问。

我真正想排的是位置。

代理友好度可以进选库清单,但它该是下限门槛,不是加分项。**一个库如果能让代理写得很顺、却让人在出事的时候读不懂,它就不该出现在关键路径上。**关键词是出事的时候,不是白天对着编辑器的时候。

讨论里有人提了故障归属这个词,我觉得比整篇文章都值钱:让无效状态不可表示的库,给的是人和代理都能用的修正信号;如果只有代理理解抽象,团队换到的是编译期安全,丢掉的是事故现场的理解能力。凌晨三点那台机器前坐着的是人,不是代理。你能读懂的抽象才算数。

这也是为什么我不接受"人类可读性没那么重要了"这个判断。可读性的对象变了,不是它变轻了。以前是人能不能读懂人写的代码,现在是人能不能读懂代理写的代码——后者门槛反而更高,因为代理会在同一个文件里塞进你没见过的抽象,而它写作时的上下文不在你手上。

说到这个有点尴尬,这类"某友好"的词我骂过不止一次,说它多半是营销外壳;今天在这儿认真给它排位子,前后对不上。人是矛盾的,评论员也是。

当然,这次可能也真有不一样的地方。讨论里我觉得最有前景的一条来自一位评论者:错误消息的读者越来越不是人。结构化的错误输出能让代理一次往返就自己修好,含糊的错误会让它开始编配置——真拿代理跑过活的人,这条大概有体感。那位还预测错误有多好几年后会像今天的文档好一样进 README,我赌这个预测比文章本身的结论准。他顺带说了一句更有意思的:人和代理对上手册想要的东西是相反的,所以文档大概会分叉成两份。

代理友好度是真实存在的选型维度,它排第二梯队。别让它挤掉第一梯队:这个库的失败模式你团队看不看得懂、出错时谁去修、修的时候手上有多少信息。顺序搞反,你会在一个编译期特别安全、事故时特别聋的系统里待上很久。

这里立个 flag:一年之内会有库把错误消息质量当卖点写进 README,也会有人把它做成一张榜。那张榜的榜一,按老规矩,保质期不超过一个月。