先把结构体贴上。
struct entry {
uint64_t ts; /* 什么时候 */
uint32_t actor; /* 谁 */
uint32_t op; /* 干了什么 */
uint64_t args[4]; /* 参数 */
/* why? */
};
最后一行是空的。不是我懒,是它填不出来。
日志能记下谁在什么时间干了什么。记不下他为什么干。这不是哪套系统没做好的问题,是"日志"这个词的定义里本来就没留那一格。
拉斯维加斯那桩案子判了。杜安·戴维斯,策划 1996 年对图帕克·沙库尔的那次枪击,使用致命武器谋杀罪,成立。三十年,第一次有人为这件事被定罪。
庭审报道我翻完了。整场官司争的不是事实。是那条记录的 why 字段脏没脏。
把关键证据按上面的结构体摆一遍就清楚了。2008 年那次警方讯问的录音里,他说自己当时坐在开枪的那辆车里,致命的一枪不是他开的。
entry e1 = {
.ts = 2008,
.actor = DAVIS,
.op = SAY_IN_CAR,
.args = "不是我开的枪",
};
ts 有,actor 有,op 有。缺的就是 why。
检方读这一格,读出来的是"他在承认自己在场"。辩方读同一格,读出来的是"他为了卖书在吹牛"。同一串字节,两种解释。录音机没坏,回放没坏。差的是 why。
所有"自我陈述"类的证据都死在这一格上。一个人说自己干了什么,是最直接的证据,也最脆。他没法定否认,也证明不了自己不是在吹。
结案陈词,检方就一句:请陪审团相信他自己说的话。辩方也就一句:那些话是虚构和吹嘘,目的是卖书。
两边都没在争字节。都在争意图。
意图不在字节里。
再往下想,这一格为什么天生填不进去。你想把 why 录进日志,只有一条路:让产生 why 的那个人自己写下来。可你写下之后拿它干什么——你要验证的,恰恰就是他写的这句话本身。
e1.why = davis_write_down_why(); /* 唯一能填这一格的人 */
if (e1.why) { /* 拿它当证据——验的却是这句自述自己 */ }
一个循环。日志的 why 格里,永远只能填进被告的自述。
所以这个字段没有校验位。不是你工程没做到位,是它结构上就不可能有。
我本来觉得辩方那条线站得住。吹牛不犯法,卖书的动机也真实存在——那阵子东西海岸说唱竞争正凶,Bloods 和 Crips 那套又渗在嘻哈文化里,一本带着"我知道内情"的书,在那个市场是硬通货。如果只有 2008 年那一盘带子,这案子大概率还得悬着。
问题在于他自己又写了别的。
2019 年他出了本回忆录,书里进一步写了自己在那件事里的角色。加上这些年媒体采访里,他多次公开承认自己当时就在那辆车上。这就不是一条 entry 了。
e1 : 2008 讯问录音 actor=DAVIS op=SAY_IN_CAR
e2 : 2019 回忆录 actor=DAVIS op=SAY_IN_CAR
e3 : 媒体采访(多次) actor=DAVIS op=SAY_IN_CAR
同一个人,跨十来年,三次陈述指向同一个 op。
一次可以叫口误。一次可以叫吹牛。三次跨十来年、口径一致——那得叫记录。
我前面说辩方那条线站得住。撤回。
检方赢的不是物证。快三十年了,物证早烂光。赢的是他自己给自己叠的那几层副本。
有件事我每次想起来都觉得冷。
那本回忆录不只是坐实了他说过的话。它同时干掉了他和当局之间那份保护协议,法院据此裁定,2008 年那次讯问录音可以用在庭上。一本书,先把自己写成证据,再撤销掉原本护着自己的那份东西。
记录一旦落下来,就不再属于写它的人了。
再往下还有个更冷的结构问题。检方的主张是:他不是开枪的人,但他下令实施了枪击,并且提供了他侄子奥兰多·安德森用的那把枪。安德森 1998 年死在另一起枪击里,生前否认参与过。
也就是说,除了被告本人,唯一有可能反驳那套叙述的人,不在了。
/* 本该有两个副本 */
replica[DAVIS] = "我在车里,但不是我开的枪"
replica[ANDERSON] = "我没参与" /* 1998 年下线,生前一直这么说 */
一个副本永远下线,剩下的那份就成了唯一的版本。
单副本系统有多脆,写过分布式的人都懂。不是因为它一定错,是因为它没东西可以对。
陪审团周一接手,几个小时就裁出来了。三十年的案子,几个小时的裁决。我不觉得这是草率。
问题被简化成"信不信他自己说的话",对面只能回一句"他在吹牛",剩下的推理量本来就那么点。争的是 why,全场没人拿得出 why。所以陪审团只能看旁边的东西——他不是说过一次,是说过很多次;那本书是一个字一个字自己敲的。
从冲突发生到车里的那几枪,中间只隔几个小时。拼出这条因果链,花了三十年。三十年不是在找凶手,是在给一句自述找旁证。
宣判那会儿,沙库尔的亲属手牵手,有人拥抱,有人哭。他遇害时 25 岁,唱片卖了 7500 多万张。这两个数摆在一起,比整篇判决书都重。
宣判日期定在 10 月 13 日。检方没往帮派加重条款上打,理由是年龄。他 63 岁,至少 40 年。加不加,都一样。
庭上他举手打断程序,第一件事是要回个人物品,包括手机。法官说上诉等量刑之后再说。
刚看到这条我觉得荒诞——刚被判了三十年前那桩案子,第一个念头是要手机。后来想想,其实挺顺的。一个人最放不下的,永远是自己的记录。而那几条最后定了他罪的记录,他一条都拿不回来。
回到那个空的字段。
一段代码里最值钱的是"为什么"那几行注释,最容易骗人的也是它。它没有校验位。谁写的、什么时候写的、当时是不是在糊弄,全不在里面。你只能靠旁边的东西交叉印证——这个人别的注释靠不靠谱,这段逻辑跟不跟得上,改了这么多版它有没有被推翻过。
一个人的自述是同一回事。你没法校验一句"我当时是这么想的"。你只能看他是不是一直这么说。十几年如一日这么说,那就得信。
这不是法律的胜利,是复现的胜利。
至于那个 why——它从来就没被存下来过。我们后来做的一切,都是在它不在场的情况下,猜它大概长什么样。
凡是记录里带"为什么"的地方,都当成一句自述,不是一条事实。