第二章:完美的回声
归档延迟:31.000 秒 传感器状态:瞬时异常 责任主体:无
——《自动驾驶事故公开摘要》(脱敏版)第四至六栏
从“人味儿”出来,天已经暗下来了。
街对面那家连锁馄饨店还亮着蓝白招牌,玻璃后面三条机械臂抓皮、压馅、下锅、分汤,一个多余的动作都没有,看久了,会觉得做馄饨本来就该是这样,多一个动作反倒不自然。人行道的路灯一盏接一盏亮起来,把每个独自走路的人都照得很清楚。不在人群里的人,原来这么显眼。
顾远夹紧了那个薄牛皮纸文件夹,往地铁站走。外套内袋里那张没折的纸贴着胸口,走一步,硌一下。
一辆空着的自动出租车从身边慢慢滑过去,在他前面停了半秒,又开走了。它认得他,是从他的步频、朝向、这个钟点的习惯里算出来的。它没有一点被拒绝的样子。它不会被拒绝伤到,只是换下一个人算。
他这辈子不会再坐进那样一辆车里。哪怕多走二十几分钟,多换两趟线,他也走路,去坐那条还保留着人工调度备份的老地铁。
车厢里人不多。他靠在连接处,看窗外的城市往后退。这座城市他查了这些年,越查越清楚一件事:他要找的东西不在某一个地方。它在那排揽客的车里,在馄饨店的机械臂里,在这趟列车的调度里——老线只是留着人工备份,平时跑的还是自动调度——也在头顶那片看不见、却确实悬着轨道设施的夜空里。魏长川那几张纸说的,就是天上那一层。
他抱紧了文件夹。
顾远到家快八点了。门锁认他用了半秒,绿灯,常亮。换鞋的时候他照例瞟了一眼门边那盏指示灯,授权路径正常。这个动作做了这些年,明知没意义,戒不掉。
客厅没开灯。餐桌上扣着一只碗,碗底下压着一个盘子。他掀开看了一眼:一点青菜,半条鱼,凉透了,鱼皮贴在盘底。他想起下午那条“晚上回来吃吗”,和自己回过去的“别等”。她没等,菜还是留了。
他把碗扣回去,没动筷子,凭记忆绕开茶几的角,进了书房。
这间屋子是这套房子里唯一活着的地方,也是唯一别人不进来的地方。三面墙到顶的层架,塞满了硬盘、打印件、贴满标签的旧资料盒,按年份码着,最早的一格落了薄灰。靠门一整列是旧的《智能》,烫金刊名在暗处只剩一线反光,也按年份码得整齐,码到某一年就断了,后面的格子空着。那一年前后,他和那个会在这种刊上发东西、也读这种刊的圈子,散了。空气里有纸和旧电路板的味道,混着一点常年不开窗的闷。
他先没坐。站着把外套脱了,从内袋里摸出那个本子,摊在桌上。纸页的,手写,断了电也读得到,是他父亲那辈人用的款式。圆珠笔夹在折页里,封皮四个角早磨圆了。
然后他解开文件夹的细绳,把三张纸抽出来。
打印的,黑白,页眉剪掉了。第一张是七个国家的公共系统吐出的同一组拒绝码;第二张是一个三周的配置变更窗口,和一次没有公开过的近地轨道清理行动重合;第三张只有边界,每一次靠近物理层,接口都返回同一组拒绝。下午在那张油腻的木桌上,那个年轻人把它们一张张铺平,说:“我能从影子量出这堵墙有多长,量不出它多高、长什么样。”
他又从外套内袋里取出第四张。三个外围地面站,公开身份都是轨道能源运维站。
顾远把四张纸压在了本子上。
公共的谜,和他私人的账,第一次摊在同一张桌上。
走廊尽头,顾双房间的门缝里有一线光。他站着听了一下,光灭了,没有别的声音。这套房子太静了,静得每一处空白都浮出形状来:餐桌边那把从不拉出来的椅子,玄关鞋柜最下一格空着的位置,书房门框上半人高那道早年用铅笔划的横线,后面再没添过新的。那个最大的空白,是另一个女儿的形状。这些年没有谁去把它填上,也没有谁敢动它。
他没有看那道门,坐下了。
那把椅子坐垫早就塌出了他的形状,某个角度的弹簧会硌着腰,他往常的坐姿是身体自己记住的。架子上有一排药,降压的、护胃的、帮睡眠的,去年社区医生开的,劝他按时吃,他大多忘了。喉咙里有一点常年的干咳,夜里坐久了就上来,他压着,不让它出声。这房子太静,一声咳会一直传到走廊那头去。
本子的前半截,是他这辈子做过的事。
出事以前,顾远是干数据取证的,圈子里排得上号。系统出了岔子、谁也说不清责任落在哪一环的时候,找他。他擅长的就是从一地看似无意义的日志里,把因果一根根抽出来,抽到能指着某一行说“是这里”。他信一件事:任何结果都有来路,足够耐心就能倒推回去。这本本子起先记的全是别人的案子,编号、时间戳、他抠出来的那一根线,字写得很小,一页要当三页用。
后来这本事,变成了反过来咬他的东西。
女儿出事,认定书一句“传感器瞬时异常,无责任主体”,把门关死了。无责任主体,就是没有来路,没有那一行可以指。
那份认定书是一个穿制服的人送上门的,很客气,程序齐全,章都盖在该盖的地方。对方说话是受过训练的那种温和,每一句都对,每一句都把他往门外推。他签了字。回执上“无责任主体”四个字是预打印的,不是手写的。这种结论出现得太多,多到值得提前印好。那一刻他没有哭。他是做取证的,第一反应是这份文件本身有问题:一场死亡,不该结在一个预先印好的句子上。
这话对别人是结案,对他是不可能。他不信一个结果可以没有原因,就像他不信一堵墙可以没有地基。他开始查,用他最擅长的那套手艺,查自己的女儿。
代价是慢慢来的。起先还有人请他,渐渐地,没人愿意请一个把所有系统都当嫌疑犯、谈着谈着就拐回自己女儿那桩事的取证专家。他记得最清楚的,是有一年在一个行业场合,一个他带过、曾经叫他老师的年轻人,远远看见他,端着杯子,很自然地转身走向了人群的另一边。没有敌意,只是躲一件麻烦事,躲得那么熟练,显然不是第一次。从那以后他就不太去那种场合了。
再后来他也分不清,是世界把他推到了边上,还是他自己一步步走到了这里。能确定的只有一样:这本本子,他没有一夜停过。
魏长川下午递来的东西,是这些年第一次有人从外面给他递进来一根对得上的线。
正因为这样,他更不能信。太干净的东西他一向多看两眼,魏长川本人也算一个。纸上说,预拒绝的延迟平均二百二十毫秒。这个数,他要自己量过才认。
本子中间那一截,七起。他从不叫它们“数据”,叫第一起、第二起,一直到第七起。每一起一页,日期、城市、车型、死伤、事故认定编号,底下贴着他从公开摘要里一点点抠出来的字段。
抠得最深的那一栏,叫归档延迟。
自动驾驶出了事,那一刻的传感器数据要往云端归档。正常是四到八秒。这个字段没人看,它不进事故认定,也不进赔付核算,所以按规定被划进可披露的脱敏统计字段,公开摘要里就印着。掩盖的人留下了它,恰恰因为它看起来毫无意义。
七起里,每一起的归档延迟都是三十一秒。
他记得自己第一次撞见这个数的那一夜。那时本子里还只有女儿一页。他查另一起新闻里一笔带过的自动驾驶事故,纯粹是职业习惯,顺手把归档延迟也拉了出来,三十一秒,和女儿那页上的一模一样。他盯着屏幕,后颈一阵发凉,第一反应是自己抄错了,翻回女儿那页核对,没错,都是三十一。两座城市,两套不同厂商的系统,两场毫不相干的死,卡了同样的三十一秒。那一夜他没睡,把能找到的自动驾驶死亡事故一桩桩翻出来,拉同一个字段。大多数是四到八秒,正常。但每隔一阵,就跳出一个三十一秒,干净,整齐,不属于这里。
天快亮的时候他停下来,发现手在抖,不是因为困。那一夜之前,他查的是一桩意外,一个父亲在为女儿的死讨一个说法;那一夜之后,他查的是一个东西,一个会在好几场死亡里按下同一个指纹、却让每一份认定书都写着“无责任主体”的东西。哀悼变成了追猎。他没察觉这一步是什么时候迈出去的,也没察觉,从那一夜起,他就再没睡过一个整觉。
凑齐七起,用了他后面好几年。
不是接近。是三十一。第一起三十一,第二起三十一,第七起还是三十一。五年,四座城市,七套互不相干的自动驾驶系统。没有两起跑的是同一家供应商的栈,软件各写各的,云后端各连各的,在出事那一瞬间,全都卡了同样的三十一秒。
三十一秒以外,别的字段反倒什么都挑不出来。传感器噪声、纠偏次数、制动响应,每一项都在正常范围里,而且都落在正常范围的正中间,像照着标准答案填的。下午他跟魏长川说的就是这个。真的现场是脏的。
这一点的分量他比谁都清楚。这七家是互相咬着的竞争对手,归档管线各搭各的,凭什么对得上?任何一家的工程师都可以说,这是底下哪个公共组件的默认参数。这个解释他想过,也在心里替那些工程师说过很多遍。可公共组件总得有人定,谁能让七家死对头在出事那一刻的同一件小事上整齐划一,还一声不吭?两套独立的系统偶然撞上同一个延迟,已经勉强;七套,七次,分毫不差,巧合解释不了。能做到这一步的,只能在它们所有人上面,能同时伸进每一家。他这些年要找的那只手,就在那一层。
他把这一栏顺下来看,像每个夜里都看的那样。第二起,姓周的货车司机,四十六岁,并线时被一辆轿车顶上隔离带,留下两个上中学的孩子。第五起,一对夫妻,凌晨在空旷的环路上无端失控,车里没有别人,路上也没有别的车,认定书都不知道该写谁的责任。第六起是个刚拿到驾照不久的姑娘。这些人他都记得名字,记得年龄,记得认定书上那句一模一样的“传感器瞬时异常,无责任主体”。
他能把他们一个一个,记成条目。
只有第三起记不平。
第三起那一页,姓名格是空的。别的页他都填了,唯独这一页空着。不是忘了。是每次笔尖落到那里,那个名字就不肯变成一个条目,它会变回一个人。
很多年前,这本本子还记着别人的案子的时候,有过一个很小的人,趴在书房门口,下巴搁在门框上看他写。门框上那道铅笔线,就是那阵子划的。她背靠着门框,他拿笔在她头顶比平。她不老实,踮脚,被他按下去,重新划。
“爸爸,你那个本子里,写的都是谁呀。”
那时候他怎么答的,他记不全了。大概是“都是些不认识的人”,或者“是爸爸的工作”,头也没抬。他那时候不会知道,很多年以后,这同一本本子里,会写进那个趴在门口问他的人;门框上那道线,会一直停在那个高度。
她现在就在这本本子里。第三页。一个空着的姓名格,一个填满的归档延迟,三十一秒。
这些年他做的事,是把六个陌生人压成模式,好让那个模式能被看见;而要让模式成立,他必须把第三起也压成第三起。他每天都在对自己的女儿做这件事,每天都失败在那个空格上。他能给周姓司机、给环路上的夫妻、给那个刚拿驾照的姑娘填上名字,唯独填不上她的。只要她还是一个名字,她就不肯老老实实待在那条线上。
魏长川的数,他得自己量一遍。
他打开终端,把语音关了,他更习惯读。挑第七起,最近的一起,日志还没归进冷库,发了一条他问过很多遍的老问题:事故前一百二十秒,传感器融合权重是否发生过切换,远端授权源是谁。
手指在发送键上停了一下。下午魏长川说过,他的每一条查询,元数据都有人看得见,有权限的机构连内容也读得到。
他按了下去。被看见这件事,他早就算过了。
屏幕停在那里。那种停顿他熟,请求被往上抛了,在等更高一层回话。他用本地脚本掐了这次握手的包时延。
两百二十毫秒。
他盯着这个数。正常的权限判断,在本地那只计算盒里走一圈,几毫秒。两百二十毫秒不是判断,是请求根本没在本地落地,被直接甩去了更上面的某个地方,那地方回一趟话,要这么久。
系统随后给了答复:B3,运营决策链路,权限等级 B,第五十三条款,不予披露。
拒绝是意料之中的,他要的本来也不是那句话。他把这次请求的路由追踪拉了出来。数据在本地总线被拦下之前,先往外发过一个特征握手包。中继节点编号是空的,这一栏永远是空的。但物理端口那一格留了东西:一次很轻的脉冲,三毫秒。
三毫秒骗不了人。它不归谁的权限管,归物理管。地面到近地轨道,一个来回,光跑满也就是这么快。
他又把同一个问题换了四个城市的交通接口各发一遍,就是那七起落过的四座城。四个系统,四套监管口径,回来的是同一个 A4,多层级基础设施协同,不在单一系统披露义务范围内。延迟一个两百一十八,一个两百二十二,另外两个都是两百二十。同一个问题,同一道边界,同一个远处。
魏长川没骗他。
那堵墙在哪家公司、哪座城的交通系统上面,远到要两百二十毫秒才够得着。
他在本子边上写下 B3,又写下 A4。这两个编号他记过几十遍了,本子的边缘密密麻麻全是它们的旧字迹,深一道浅一道,像一道结了又裂的疤。今晚没有新编号。今晚他要拿的是时间。
三个地面站既然有公开身份,就躲不开校准公告。
这条规矩这些年早就成了常识,跟天气预报差不多:基础设施要做任何参数校准、任何维护,提前七十二小时公告,写清时间窗口、预期影响类别、授权来源;做完二十四小时内补一份结果摘要。没人每次都去看,出了事才有人回头翻。
他回头翻了五年。
三个站的公告一条条拉下来,抄成一张表:哪天,几点到几点,影响类别,授权来源。影响类别那一栏几乎全是同一个字,无。授权来源那一栏印着一串机构代码,他拿去问,回来的还是 A4。
然后他把本子翻回第一起。
日期,时刻,对表。落在里面。
第二起。落在里面。
他一页一页往后翻,手指压着表格的行,日期叠着日期,台灯把纸烤出一点温度。第四起差一点,落在第一个站的窗口外面四十多分钟。他换到第二个站的公告,也进去了。指尖有点抖,他没让自己停。第七起,今晚刚量过两百二十毫秒的这一起,正卡在国内那个站一次维护窗口的尾巴上。
六起已经落定。每一起出事的那一刻,三个站里总有一个正在做一次影响类别为“无”的维护;每一起,地上的车都卡了同样的三十一秒。散在五年里、四座城里的七场意外,是一件事,发生了七遍。
他把第三起留到了最后才翻。
翻过去的时候,他几乎是屏着气的。那个空着姓名的页,那个他写不下去的格子。他把手指移到表格里那一行,往她出事的那个时刻上对。
它也在里面。
严丝合缝,和另外六起一样整齐。她的死,连着天上那一次他够不着的动作,分毫不差地落在线上。
他又把魏长川第二张纸上的三周窗口抄进本子,压在自己那条时间轴上。这些年里,他关于城市交通的问题开始被往上转发、开始换成那组很少见的拒绝,是在某一个节点前后。他原来只能把这个节点压在四十天里。三周落进去,正好盖住它。
顾远靠回椅背。
他等这一刻,等了这些年。
这些年里所有人都说他病了。同行躲着他,认定书一句“无责任主体”把门焊死,连他自己也有过那种半夜惊醒的时刻:会不会真的什么都没有?会不会只是七场各自独立的倒霉,只是一个父亲不肯接受,女儿是死在一桩谁也没有错的意外里?那种怀疑比任何拒绝码都难熬,因为它从里面拆他。它让他怀疑起自己,怀疑他这些年根本没在查案,只是在给一桩无法承受的意外,硬造一个可以去恨的对象。
现在七个日期排成一条线,他的女儿在线上。
他松了口气。
而正是这口气,让他在椅子上重新坐直了。
他听见自己心里有个声音在说“我就知道”,那声音几乎是高兴的。他刚刚为了一条线在女儿的死上闭合,感到了安心。有线就有手,有手就有人,有人就得有人负责,那他这些年就不是疯子,他的偏执就是清醒,他失去的那一切就都有了去处。他需要她的死有人可恨,胜过需要它只是一场意外。
他没让自己把这个念头想完。这些年他练出了一种本事:在某些念头快要转到尽头、快要照见他自己之前,把它掐灭。他又一次掐灭了。
只是太整齐了。
他重新看那七页。整齐到不对劲。真有人遮掩,现场该是脏的,该有对不上的毛刺,补丁压补丁的痕迹,慌乱里漏掉的边角。这七起没有。三十一秒,七次,分毫不差;维护窗口,七次,严丝合缝。干净得像有人把所有该乱的地方都仔细抹平了,连“被抹过”这件事本身也一并抹掉,只留下一种毫无破绽的平整。
他把这读成力量的证据。能在七场散落的死亡、和七个国家的系统上同时做到这种程度的整齐,背后只能是一只极大的手,一只他够不着、但确实存在的手。墙有多长,他能从影子量出来;墙后面站着谁,他量不出,但今晚他确信,那里站着人。
他没有想到另一种可能。
他每问出一句,世界就把他早就相信的东西原样递回来。三十一秒是,维护窗口是,魏长川是,连女儿的死也排进了那条线里。他要一个阴谋,手里就有了一个阴谋,形状完整,一个棱角都没有。
完美得,像一句回声。
顾远把笔帽拧上。今晚他不会往这一层想。
他重新看那几张纸。
魏长川说,那组拒绝码在七个国家的公共系统里一模一样。顾远把这件事和自己手里的七起叠在一起:他这边,是七场散在四座城里的车祸,卡着同一个三十一秒;魏长川那边,是七个国家的系统,吐着同一组拒绝码。两个完全不同的尺度,同一种整齐。能同时伸进一辆民用汽车的事故归档、又铺到七个国家的系统配置里去的,不会是哪一国的政府,一国政府管不到别国的系统。那只手比他原先想的还要大,大到跨过了国界。
这本该让他往后退一步。一个大到跨国的对手,对一个孤身查了这些年、连同行都躲着走的人,这场仗的体量根本不成比例。可他没有退。对手越大,越证明他没看错;越证明他没看错,他就越停不下来。
他也想起了魏长川本人。一个素不相识的年轻人,凭查询元数据找上门来,干净得让人不舒服,递给他的恰好是他缺的那一块。太顺了。顺到顾远心里某根弦动了一下:他和这个年轻人,一个在体制外推法律,一个在数据里推案子,像照着镜子,两个人都那么确信自己看见了别人看不见的东西。那根弦只动了一下,就和别的念头一起,被他掐灭了。
三个地面站不再是抽象的代码了。它们有公开身份,就有地址,就在地图上某个够得着的点。他调出地图,把三个坐标点上去。两个在境外,一个在国内,离得不算近,但买得到票,去得了。那次没公开的轨道清理行动是真发生过的,有日程,就有人安排过、签过字、调度过。墙是看不见的,可墙在地面上露出来的接口,是看得见、走得到的实物。
国内那个站的公告,服务对象一栏写的是近地轨道上的一处能源中继平台。地面站只是这根线落地的那一头。另一头在上面,三毫秒远。
他在本子上写:先去地面站。
停了一下,又在下面写:然后上去。
这些年来他第一次,不用再对着终端一遍遍撞同一堵 A4,手里攥着能往前走的方向。往物理层再走一步,走到那只手不得不留下指印的地方去。这个念头让他血往上涌,像一个在死胡同里走了很多年的人,忽然在墙根看见一道缝。
楼下对面那栋最后一扇亮着的窗也灭了。他不知道自己坐了多久,三个小时,也许四个。脖子是僵的,握笔的右手有点抽筋,他换到左手揉了揉。这样的夜他过了上千个,身体早学会了在这张椅子上把疲惫忍下去,忍到天亮。这些年,是这本本子在替他活着,他只负责在它旁边坐着,不停下。
走廊里有了动静。
顾双的门开了,趿着拖鞋去厨房接水。水流声,杯子搁在台面上的轻响,又是脚步。回来的路上,她在书房门口停了一下。
“还不睡。”她说,不是问句。
他“嗯”了一声,手按在那几张纸上,没合,也没翻过去。她隔着门朝桌上看了一眼:一本旧本子,几张白纸,一盏台灯,一个这些年都是这副样子的背影。她什么也看不出来。她早就看不出来了,也早就不问那是什么了。她是在父亲的这个背影旁边长大的,把它当成了家里的一件家具,一件不会回头、也搬不走的家具。
她转身要走,又顿住。
“你那个本子,”她说,“写满了再换一本吗。”
顾远抬头。
她已经在往回走了。背影瘦,肩往里收着,像怕在哪儿磕到。那道门关上,门缝里的光灭了。
同一本本子,两个女儿,两句隔了很多年的问。一个问本子里写的是谁,后来自己成了答案;一个问写满了换不换,不知道这本本子里写着她的姐姐。顾远低着头,看那七个日期排成的一条线,干净利落,线上有他死去的女儿。屋子那头,另一个女儿刚刚在他门口站过,他连她的脸都没看清。
他没有发现,这两件事,是同一件事。
他重新拧开笔帽,翻到本子后面第一张空白页,开始把今晚的这条线一笔一笔誊上去。台灯底下,新的字迹压上旧的疤,本子又厚了一页。它还差几页,就满了。