沈夜出门的时候下了一阵雨,不大,但把路打湿了。他的车停在一棵梧桐树下,挡风玻璃上落了一层碎叶和雨滴。他没有开雨刷,等了一会儿,看着雨滴在玻璃上滑出弯弯曲曲的痕迹,像一条条没有目的地的路。他发动引擎,雨刷器吱嘎响了两下,把那些路全部抹掉了。
城中村在城市的边缘,导航显示二十分钟,他开了四十分钟。不是因为堵车,是因为他开得很慢。他在想周牧原。一个大厂的前核心程序员,年薪百万,三年前辞职,搬了四次家,越搬越便宜,最后住进了月租四百五的出租屋。“个人原因”,他一直在想这四个字。
什么个人原因能把一个人削成这样?他辞职了,然后消失了,然后,然后他写了ABYSS。
沈夜把车停在城中村的入口。入口处有一块牌匾,写着“XX村”,字已经褪色了,看不太清。牌匾旁边贴着一张社区公告,“注意防火防盗”,落款期是两年前。
城中村的巷子很窄,两边是握手楼,头顶是交错的电线和晾衣绳,衣服滴水,地上的积水映着天光。沈夜侧着身子走过一条又一条巷子,手机导航在这里不太管用,GPS信号被楼群遮挡,定位飘忽不定。屏幕上的小蓝点跳来跳去,忽然让他“向左转”,左边是一堵墙。
他想:连导航都在这座城中村里迷路了。而住在这里的周牧原,却写出了一个能精准控全城人的“导航系统”。那个“导航系统”已经在指引一些人走向死亡了。这个对比让他觉得荒诞到想笑,但他没有笑。
巷子里有人。一个穿围裙的女人蹲在门口洗菜,水流在水泥地面上拐了几个弯,流进了排水沟。一个女人抱着孩子站在窗户前,孩子在大哭,她面无表情地摇晃着。一个老头坐在竹椅上,手里拿着蒲扇,扇一下停一下,像一台快要没电的风扇。
这些人和他之间隔了不到一米,但他们没有看他。城中村的人不看陌生人,因为陌生人太多了,搬来的、搬走的、路过的,不值得看。
他经过了一个小卖部,门口的冰柜嗡嗡地响着,里面是各种饮料和雪糕,冰柜上面贴着一张手写的纸条:“赊账不卖。”旁边是一张褪色的广告,“智能手机,最低199”。最低199,一台能接收推送的手机。足够了。
他找到了那栋楼。楼没有名字,只有门牌号——17号。外墙的瓷砖脱落了大半,露出灰色的水泥。楼道口有一个垃圾桶,溢出来了,旁边蹲着一只瘦猫,看了沈夜一眼就跑了。
猫跑的时候碰到了一个塑料袋,塑料袋被风卷起来,飘了两米又落下了。城中村的垃圾像这个社区本身,永远在那儿,没人清理,也没人真的在意。
楼梯间没有灯,墙壁上贴满了开锁和小广告,“专业开锁138XXXX”“”“办理各种证件”,每张都比上一张新,说明这条巷子里的人换得很频繁,连广告都要不断更新。
踩上去的每一步都在回响,回声在楼道里转了两圈才消散。他的手扶着楼梯扶手,扶手上有灰,也有油,灰是时间,油是无数只手留下的痕迹。每一层拐角处有一扇小窗,窗玻璃碎了半块,风从那里灌进来,带着楼下炒菜的油烟味。
四楼,左手边那间,门虚掩着,因为门锁坏了,周牧原没修,反正也没有人会来。门上贴着一张外卖单,期是三天前,备注栏写着“放门口谢谢”。
沈夜推开门。
一股方便面和陈咖啡的气味涌出来,混着一种更难辨别的味道,不是脏,是封闭。长期不通风的房间会积累一种属于人的气味,汗味、呼吸味、皮脂味,混合在一起变成一种说不清的东西。
这种味道赵满仓熟悉,他叫它“活人味”,因为死人没有这种味道。
屋里很暗,三个屏幕是唯一的光源,蓝白色的光映在周牧原的脸上,像一张面具。他坐在屏幕前,双手放在键盘上,节奏异常均匀,嗒、嗒、嗒、嗒,像节拍器一样精确。
沈夜站在门口看了三秒。他确认了一个细节:周牧原打字的节奏不是人的节奏。人打字会有快有慢,有停顿有犹豫,有手指够不到键的微弱延迟。周牧原没有。他的节奏是程序的节奏。
因为他自己已经变成了一段程序。他把所有的不均匀、所有的犹豫、所有的悲伤,都编译进了代码里。代码替他悲伤,他只需要执行。
“你是警察。”周牧原头也没抬。
沈夜走进去。“你怎么知道?”
“只有警察会在这个时间来敲门。”周牧原说。
沈夜看了看时间,下午三点。窗外应该是亮的,但窗帘拉得死死的,这里没有白天和黑夜的区别,只有屏幕亮和屏幕暗的区别。时间在这里失去了意义,唯一标记时间的是方便面的消耗速度和咖啡杯的堆叠高度。
“正常人在上班。你在上班时间来敲门,你不在正常人的行列里。”
沈夜说:“你也是。”
周牧原的手没有停。嗒、嗒、嗒、嗒。
沈夜环顾这间屋子。十平米不到。一张桌子,三个屏幕,一地的方便面盒子,全是老坛酸菜味。他想起赵满仓说过,法医可以从胃内容物判断一个人的生活习惯。
周牧原的生活习惯一目了然:方便面、咖啡、代码。没有别的东西。桌上没有水杯,他喝咖啡,不喝水。没有植物,除了窗台上那盆仙人掌,但仙人掌是死是活看不出来。
仙人掌旁边有一个烟灰缸,里面没有烟蒂,周牧原不抽烟。烟灰缸里放着几个回形针和一颗螺丝,像是从键盘上掉下来的。地上有一双拖鞋——灰色的,和顾临渊的那双一样旧,但比顾临渊的更脏。拖鞋旁边是一堆数据线,纠缠在一起,像一窝蛇。没有照片……
等等。窗帘后面好像有什么东西鼓出来。
他走近,拉开窗帘。
一面照片墙。
上面全是同一个女孩的照片。扎马尾、笑起来有虎牙。不同年龄的,有小学的,穿着校服,前别着红领巾;有初中的,站在场上,阳光照在脸上;有高中的,证件照,表情严肃但嘴角微微上扬。
照片被贴得很整齐,每张之间的间距完全一样,大约两厘米,和便利贴之间的间距一样。但最后一张和其他的不一样,它不是照片,是一张剪报。剪报的标题是“滨城二中一学生坠楼身亡”,期是五年前。剪报的边缘被剪得很小心,像是在做一件需要耐心的事。
沈夜站在那面照片墙前,看了很久。
一个女孩。从小学到高中,每一张都贴得整整齐齐,间距精确到两厘米。最后一张是死亡剪报。他把一个人从活着贴到了死。
这不是普通的收藏。这是一个人把自己全部的柔软,都贴在了一面窗帘后面的墙上,藏在最不显眼的位置,但又随时能看到。周牧原每天拉窗帘的时候,都会看到这些照片。每天。
他看了一眼剪报上的期。五年前的七月十一号。他在心里算了一下,周牧原七月十一号失去这个女孩,七月十八号辞职。七天。从失去她到放弃一切,只用了七天。
他注意到周牧原的打字节奏没有变,嗒、嗒、嗒、嗒,像什么都没发生。但沈夜知道,那不是因为不在乎。而是因为这个人已经把所有的悲伤都编译进了代码里。代码替他悲伤,他只需要执行。
他转头看了一眼墙上那面便利贴。密密麻麻的全是算法优化思路,他看不懂。大部分是公式和伪代码,还有一些他叫不出名字的术语,“梯度惩罚”“对抗训练”“目标函数迭代”。
有一张便利贴上画了一个流程图,起点是一个方框写着“痛苦指数采集”,箭头指向“阈值判断”,然后分叉成两条路:一条写着“治愈路径”,被划掉了;另一条写着“优化路径”,画了三个感叹号。
另一张便利贴上写着一个公式:min Σ(wᵢ · pᵢ) / Σwᵢ。他不知道这是什么意思。但公式下面有一行小字:“当治愈成本 > 消除成本,最优解自动收敛至消除。”这段话他每个字都认识,连在一起却像一把冰冷的刀。治愈成本大于消除成本,所以最优解是消除。消除什么?消除痛苦?还是消除痛苦的人?
他看了一眼周牧原。周牧原的手指还在键盘上,节奏没变。嗒、嗒、嗒、嗒。
但最角落有一张不一样,上面只写了四个字,但距离太远看不清。他走近了一步。
念念别怕。
四个字。
沈夜盯着这四个字看了五秒。念念。和“念念不忘,必有回响”,同一个词。江映柳手机里那条最后的推送,和周牧原墙上这张便利贴,用的是同一个“念”。
他转头看了一眼照片墙上的女孩。念念。是叫这个名字吗?
他不确定。但他把这些放在一起,照片墙上从生到死的女孩,便利贴上的“念念别怕”,江映柳手机里“念念不忘,必有回响”,像把三块碎片摆在桌上。它们不是同一幅画,但它们用了同一种颜色。同一个“念”。照片墙上的女孩,就是那个“念”。
“三年前那个数据泄露事件,”沈夜转回身,说,“是你的。”
周牧原没否认。“那是公司的问题,和我无关。”
“ABYSS是什么?”
周牧原的手指停了。
0.5秒。
对于一个打字节奏像节拍器一样精确的人来说,0.5秒的停顿就是一声尖叫。是整个系统唯一的异常志。是沉默中最响的声音。
然后他继续打字。嗒、嗒、嗒、嗒。
但沈夜看到了。他看到了那0.5秒。他把它刻进了脑子里,像赵满仓把尸斑位置刻进报告一样精确。
他没追问。他知道现在追问没有用。周牧原不是那种会被问出答案的人,他把自己封锁得比加密协议还严。要打开他,需要的不是压力,是时间。或者是另一个“念念”。
他在屋里走了一圈。桌上除了方便面盒子,还有一本翻旧了的书——《算法导论》,封面已经卷边,书脊上的字磨得快看不见了。书里夹着几张便利贴,上面写着公式和伪代码。但有一张便利贴上只写了一个数字:7。七天,从照片墙上那个女孩的死,到他辞职的那天。
沈夜把书放回原处。他的目光扫过桌面,看到了另一个细节,周牧原的键盘是青轴机械键盘,每一次敲击都会发出清脆的“嗒”声。青轴是最吵的轴体,但周牧原的敲击节奏均匀得像节拍器,那种均匀不是人的均匀,是程序运行的均匀。
沈夜想起了自己工位上的键盘,薄膜的,静音的,他打字的时候有快有慢,遇到想不通的地方会停下来,手指悬在键盘上方,像在水面上的蜻蜓。周牧原没有悬停。他的手指永远在键帽上,永远在敲击,永远在运行。
沈夜还注意到了一件事:桌上有一盒方便面,老坛酸菜味,调料包已经撕开了但还没倒进去。旁边是一杯已经冷掉的黑咖啡,杯壁上有咖啡渍的痕迹——至少续过三次。
这说明周牧原已经在这个位置上坐了至少六个小时。六个小时,不吃方便面,只喝咖啡,手指不停。他不是在工作,他是在逃避,用代码填满时间,让大脑没有空闲去想别的。
屋子里很安静,只有键盘声和电脑风扇的嗡嗡声。沈夜站在那里,看着周牧原的背影。那个背影很瘦,肩胛骨在衣服下面凸出来,像两片没长好的翅膀。他忽然想到了一个画面:一个人坐在黑暗的房间里,用代码给世界写一封信。
信的内容是算法,收件人是所有人,寄件人是一个失去了妹妹的哥哥。这封信不会有人读到,因为算法没有署名。但算法会到达每一个人,通过推送,通过推荐,通过那个永远在屏幕右上角闪烁的小红点。
“你觉得一个推荐算法能做什么?”周牧原突然开口了。
沈夜看着他。周牧原的手指还在键盘上,但他没有在打字了,手指只是放在那里,像是需要一个支点。
“让人多买一双鞋。”沈夜说。
周牧原笑了。
那个笑容像裂开的冰面,不是开心,是某种东西终于撑不住了。冰面下面是黑色的水,水很深,深到看不见底。他笑了大概两秒,然后笑容收了回去,像一扇门打开又关上。门后面是什么?沈夜没看到。但他知道那里有东西。
“如果我告诉你,它能做的事比你想象的多得多呢?”
“那你告诉我。”
周牧原沉默了。他的手指在键盘上微微动了一下,不是在打字,是在犹豫。他的手指在“说”和“不说”之间徘徊了五秒。五秒里,沈夜听到了键盘下面弹簧轻微的吱嘎声,那是青轴键盘被按下又松开时特有的声音,像一句说到一半又咽回去的话。
然后他转回了屏幕,继续打字。嗒、嗒、嗒、嗒。
沈夜看着他的背影。瘦,但不是健康的瘦,是被掏空的瘦。肩膀微微前倾,像长期对着屏幕的人都会有的姿势,但更重,像是扛着什么东西。脊柱的弧度比正常人大,像一棵在风里弯了太久的树,已经直不起来了。
他走了出去。
在楼梯间里,他站了一会儿。楼道里很暗,只有每一层拐角处有一扇小窗透进来的光。他靠在墙上,从口袋里摸出一烟,但没点,他在周牧原门口不抽烟,不是因为规矩,是因为他不想让烟味混进这间屋子已有的味道里。这间屋子有自己的气味系统,不该被他打扰。
他闻到了方便面的味道,不是从周牧原屋里飘出来的,是从楼下某户飘出来的。这座楼里的每个人都在吃方便面。每间屋子里都有人对着屏幕。每面墙后面都藏着什么。
他想到了赵满仓说的话,“死人不会说谎,但活人会替他们说谎。”那么,代码呢?代码会撒谎吗?代码不会。代码只是执行。但写代码的人会。周牧原写了一段代码,代码了人,代码不会撒谎,但周牧原的沉默就是最大的谎言。
他下了楼。每一层的楼梯间都差不多,灰色的水泥墙,贴满了小广告,拐角处有一扇小窗。他走到三楼的时候,听到一扇门后面传来说话的声音,电视,在放新闻,播音员在说什么政策法规。
他走到二楼的时候,闻到了炒菜的味道,油和蒜末,很家常。他走到一楼的时候,那个垃圾桶旁边的瘦猫又出现了,蹲在同一个位置,看了他一眼。猫的眼神和周牧原有点像,不是冷漠,是那种看过了太多东西之后的平静。
他确认了一件事:周牧原知道些什么。但他还没准备好说出来。
……
沈夜回到局里,打开电脑。他在搜索栏里输入了剪报上的关键词,“滨城二中一学生坠楼身亡”,期五年前。
局里的走廊很安静,大部分人都下班了。只有值班室还亮着灯,里面传来电视的声音,法治频道,在播什么庭审现场。他路过饮水机,接了一杯水,没喝就端进了办公室。水放在桌上,映着电脑屏幕的光。
案卷调出来了。名字:周念慈。女,十六岁。案卷很简单。薄薄几页纸,比江映柳的合同还薄。“学生个人心理问题,非他,不予立案。”调查笔录只有三页,证人证词全是“没注意到”“不知道”“她平时就不太说话”。
学校出具的情况说明是“该生性格内向,曾有厌学情绪”,教育局的批复是“已按规定处理”,霸凌者家属的声明是“我家孩子没有参与”。
周念慈。念念。和照片墙上那个女孩同一个人。和“念念别怕”里的“念念”同一个人。周牧原的妹妹。
沈夜翻着案卷,手指越来越慢。每一页都是一个句号,不是调查的句号,是拒绝调查的句号。三页纸,像一张收据,不是记录事件的,是注销事件的。
结论是:一个内向的女孩,承受不了学习压力,选择了极端方式。
沈夜翻了三遍,找不到任何一个认真调查过的痕迹。没有调取监控的记录,没有约谈目击者的笔录,没有心理评估的报告,没有对霸凌指控的任何核实。三页纸,像一张收据,不是记录事件的,是注销事件的。一份不予立案通知书,盖着公章,公章的红色很鲜艳,像刚按上去的,又像是在说:这件事到此为止,不要再问了。
他翻到最后一页,看到了一张照片,周念慈的证件照。扎马尾,笑起来有虎牙。
他的脊背突然发凉。
不是因为照片本身,而是因为他想到了另一个人,另一个扎马尾、笑起来有虎牙的女孩。沈星。失踪时十六岁。和周念慈同龄。
他不知道为什么把这个联系起来了。这两个案件之间没有任何明确的关联,一个是五年前的校园坠楼,一个是十二年前的失踪案。但他的直觉在说话。那种直觉不是逻辑,是某种更深的东西,像两块磁铁隔着很远,但你知道它们在同一条磁力线上。
他看了一遍周念慈案卷上的学校信息,滨城二中。他愣了一下。滨城二中。沈星失踪那年,也在滨城二中。他一直以为那只是巧合,滨城二中学生那么多,失踪的、出事的,统计上总会有交集。但此刻,“滨城二中”这四个字和“系统推荐”那四个字叠在了一起,像两张透明胶片重叠,显出了一个新的图案。
他看着周念慈的照片,又看了看自己手机里那张沈星的旧照。两个人长得不像,但笑容像,那种年纪还不知道世界会怎么样的笑容。那种笑容有一个共同点:它们都是最后一次被记录的笑容。之后一个从天台坠落,一个从世界消失。
他的手机里还存着沈星那条最后的短信,“哥我今天去同学家写作业,晚点回来”。发送时间:七月十七号下午三点十二分。他看过一千遍了,每一个字、每一个标点都能背下来。他试过用各种方式解读这条短信,“晚点回来”是几点?“同学”是谁?“写作业”真的是写作业吗?他不知道。他唯一知道的是,这条短信之后,沈星的手机就关机了。再也没有开过。
他关上了案卷。
办公室里只剩他一个人。窗外的天已经黑了,什么时候黑的?他不知道。他一直在翻案卷,翻得太专注了,没注意到窗外的光一点一点地退去,像一场没有声响的退。他坐在工位上,缺了耳朵的马克杯里泡着速溶咖啡,凉了也没喝。咖啡面上结了一层薄膜,像一只闭上的眼睛。他的手机屏幕亮了一下,推送。他看了一眼。
“你可能认识的人:周念慈。”
系统推荐。
又是系统推荐。
他盯着这五个字看了十秒。一个已经死了五年的女孩,系统还在推荐“你可能认识她”,因为她的数据还活着。社交媒体账号没有注销,同学群没有退出,学籍系统里还有她的名字。在算法的世界里,周念慈没有死,她只是“长期不活跃”。
就像江映柳,人死了,账号在点赞。周念慈,人死了五年,系统还在推荐。算法不知道什么叫死亡,算法只知道“活跃”和“不活跃”。死亡对算法来说,就是一种特殊的不活跃,持续时间比较长的那种。
他锁屏,把手机翻过来扣在桌上。
屏幕的光被桌面吞没了,办公室里彻底暗了下来,只剩窗外路灯透进来的一线光。他坐在黑暗里,眼睛慢慢适应了,能看见桌上的轮廓:马克杯、案卷、键盘。这些东西在黑暗中看起来和白天不一样,白天它们是办公用品,夜里它们是沉默的证人。
他不知道“深渊”的边界在哪里。但他知道,那座冰山露出来的,绝不止一个角。冰山下面是水,水下面是暗流,暗流下面是海床,而海床是看不见的。你能看见的只是浮出水面的那一小块白色,你以为它很小,但它的体积是你看见的那部分的一百倍。
他拿起手机,给赵满仓发了一条消息:“赵哥,如果一个人写了一段代码,代码了人,法律怎么判?”
赵满仓的回复来得很慢。两分钟后,屏幕上出现了一行字:“法医只管尸体怎么死的,不管谁写的代码。但如果你想问的不是法律……那我不知道。”
又过了三十秒,第二条消息:“不过我以前验过一个案子,一个人在楼顶装了自动浇水装置,定时喷水,冬天结了冰,有人滑下去摔死了。那个装装置的人被判了过失致人死亡。你说代码和浇水装置有什么区别?”
沈夜看着这条消息,想了很久。
区别在于:浇水装置不知道有人会走过来。代码知道。
又过了三十秒,赵满仓发了第三条消息:“你知道浇花的水和浇人的水有什么区别吗?”
沈夜没回。
赵满仓自己回答了:“浇花的水是给的,浇人的水是给嘴的。但如果一个人连水都不喝了,那就不是水的问题,是这个人已经不想活了。法医能验出胃里有没有水,但验不出一个人为什么不想喝水。”
沈夜把手机放下。他想起江映柳桌上那瓶未开封的矿泉水,想起周牧原桌上那杯落了灰的白水,想起那个七十八岁独居老人攥在手里的手机,养生APP提醒他喝水,他买了量子能量贴,但没有买水。
他靠在椅背上,闭上眼。办公室很安静,只有电脑主机的嗡嗡声和远处走廊里偶尔传来的脚步声。他闭着眼,看到了沈星站在校门口的样子,扎马尾,背黑色双肩包,回头冲他笑了一下,虎牙露出来。然后她转过头,走进了校门,走进了人群,走出了他的世界。十二年。
他从没告诉过任何人,他之所以当警察,和沈星有关。不是什么“为了寻找正义”的宏大叙事,只是因为他想知道。想知道一个人怎么能凭空消失,想知道一个名字怎么能从世界上被抹掉,想知道那些看不见的手到底在做什么。现在他可能快要知道了,但那个答案,也许比不知道更可怕。
而在冰山的另一面,城中村四楼的出租屋里,周牧原面对着三个屏幕,手指在键盘上匀速敲击。嗒、嗒、嗒、嗒。蓝白色的光映在他脸上,像一张面具。
屏幕上跑着一行代码。代码的注释栏里,有一行字:
念念别怕。
那是最角落那张便利贴上的四个字。他写下的,后来一直没撕。
系统上线那天他写的。
那天外面下着雨。滨城的雨总是不大不小,像一个人在犹豫,哭也不是,不哭也不是。他站在窗前看了一会儿雨,然后坐回电脑前,敲下了那四个字:念念别怕。
他不知道这是写给谁的。也许是写给周念慈,念念,别怕,哥在。也许是写给系统,念念,别怕,我不会让你做错事。也许是写给自己,念念,别怕,你做的是对的。
但后来他知道了,他做的不是对的。也不全是错的。对和错之间有一条很宽的灰色地带,他就站在那里,脚踩在边界线上,往哪边倒都可能。
他没打伞,淋了一路,走到出租屋才哭出来。那是他最后一次在人前哭,如果一个人在雨里哭算“人前”的话。雨水和泪水混在一起,分不清哪一滴是天的,哪一滴是他的。之后的眼泪,都流进了代码里。
但代码不哭。代码只运行。
他把键盘上最后一行代码敲完,回车。屏幕上闪了一行字:“System initialized.”
系统初始化完成。
他看着那行字,想起了妹妹小时候学骑自行车的样子,摔了很多次,膝盖上的血和泥混在一起,她还是骑。最后一次她骑了整整一圈没摔,回过头冲他笑,虎牙露出来,头发被风吹得乱七八糟。她说“哥你看我做到了”。
现在他做到了。
但妹妹看不见了。
他伸手摸了摸屏幕上那行字,“System initialized.”,指尖触到的是冰凉的玻璃。他妹妹的手是温的,他记得。小时候冬天她把手伸进他口袋里取暖,他说“你的手怎么这么冷”,她说“因为我的热都给你了”。
现在他的热都给了代码。
代码不需要温暖。代码只需要运行。
桌上那杯冷掉的黑咖啡旁边,不知什么时候多了一杯白水,可能是他自己接的,也可能不是。他忘了。水面上落了一层灰,说明已经放了很多天了。他没有喝过。他已经很久没有喝过水了。咖啡不算。咖啡是燃料,水是给活人喝的。
嗒、嗒、嗒、嗒。
(开端 完)
注:前八章只是开端,让大家熟悉一些简单的人物,开端结束,正文开始。