实现细节,是判断力消失的地方
来源:dev.to — 2026-09-27
📋 概述
作者写了一个小工具,用来找出「哪些人还在等我回复」。这个工具有三个版本,每个版本都是正确的,却给出三个不同的答案:18、34、2。原因是每个版本都悄悄定义了「已回复」的含义——只算楼中楼、算整条帖子里我之后的任何回复、或者同时套用两条规则。工具没有一处坏掉,每个数字对它自己定义的人群都是对的,真正的毛病出在问题上。作者由此展开:写代码就是这样一个把判断固化成实现的过程,而一旦判断变成实现,它就不再像判断了。
🔑 核心要点
- 三个版本的答案分别是 18、34、2,差异全部来自「已回复」这个定义的偷换,而不是代码缺陷。
- 第一个版本出于好意编码了一条合理判断,随后这条判断就失去了「判断」的外观,看起来像客观事实。
- 作者和 Pascal 在评论区来回讨论了两个月,反复出现同一个三段循环:一方给出看似完整的答案,另一方带回真实失败案例,答案里的隐藏判断被逼出来。
- 第一个例子是并发抢位的测试:同样的竞态测试在 SQLite 上永远通过,在 Postgres 上照样出 bug,因为 SQLite 同一时刻只允许一个写入者。
- 隐藏的判断是「这个测试有可能失败」——而它在 SQLite 上根本没有失败的可能。
💡 金句
工具没有一处是坏的。每个数字对它自己定义的那部分人群都是对的。问题出在问题本身:每个版本都把自己的数字报成了「谁在等我」的答案。
👍 0
👎 0
← 返回 dev.to 首页