顾铮在第二天早上七点就到了技术科。
他打开灯,把带来的早餐放在桌上,两个包子,一杯豆浆。豆浆已经凉了。他在楼下的早餐摊前站了三分钟,最后忘了让老板加热。
他把证物袋从文件袋里抽出来。那部屏幕碎裂的手机躺在透明塑料袋里,像一条被捞上岸的鱼。他戴上手套,取出手机,接上数据线。
屏幕亮了。电量百分之九十三。
密码林深语昨晚发给他了:120425。
他盯着这六个数字看了两秒。十二月三号,小宇的生日。25,“爱你”。
一个嘴笨的男人,用拼音九键把说不出口的话藏进密码里。
顾铮输入数字,解锁。
桌面壁纸是一家三口的合照。骑在脖子上的孩子,笑得很用力的妻子,表情紧张的父亲。顾铮看了一秒,然后把视线移回屏幕。
他点进那个叫“告别”的程序。
程序界面简陋得让他意外。职业习惯让他先截了一张图,然后才开始分析。文件结构松散,命名不规范,到处都是临时文件和重复备份。这不是一个专业程序员的作品。
这是一个赶时间的人的作品。
他先查看程序主体。代码量不大,核心功能只有三个:定时启动、全息投影、视频播放。
定时模块:
“start_time = 23:59:55
loop_delay = 5s
target_time = 00:00:00”
每天深夜十一点五十九分五十五秒启动。延迟五秒。零点整开始投影。程序设定循环,每天一次,不设终止日期。除非,
顾铮看到一行被注释掉的代码。
“// end_date = ‘2024-12-03’”
十二月三号。小宇的五岁生日。
周明本来想在儿子生日那天终止这个程序。但他把这一行注释掉了。他决定让程序一直跑下去。
顾铮继续往下翻。投影模块调用的是一个测试版接口,代码是从开源社区扒下来的,注释里还留着原作者的署名和免责声明。音频模块更粗糙,直接调用了系统默认播放器,没有做任何适配。
他打开日志文件。从程序安装那天起,每天晚上零点,系统都在尝试播放视频。
每次的结果都是同一个错误代码:
“ERROR_AUDIO_MODULE_NOT_FOUND
ERROR_PROJECTION_LUMINANCE_INSUFFICIENT”
音频模块找不到。投影亮度不足。
所以小宇每晚看到的,是一个模糊的、沉默的影子。
顾铮靠在椅背上。
他不是没见过类似的东西。全息投影、AR增强现实,这些技术在三年前就已经不新鲜了。他见过的案子比这个复杂得多,有人用深度伪造技术制造不在场证明,有人用AI换脸实施诈骗。
但那些案子的背后,没有一个人是用十七分钟反复练习一句“生日快乐”的。
顾铮重新坐直身体,打开林深语说的那个叫“backup”的底层文件夹。
文件夹里只有一个视频文件。
文件名:for_chen。
他点开。
视频很短。只有两分钟。
画面亮起来。同样的办公室。同样的深夜。同样的人。
周明没有看镜头。
他低着头,在看手机。手机屏幕上是一张照片,一家三口的合照,和桌面壁纸是同一张。他的拇指在照片上慢慢滑动,划过妻子的脸,划过儿子的脸。
然后他开口了。
不是练习的语气。是很随意的,像聊天。
“慧芳。”
他叫了一声,然后停了很久。
“你要是看到这个,说明我没录完。”
他又停了。他的拇指还在划照片。
“给小宇的祝福,我录了好多遍,都说不完。你知道的,我这个人嘴笨。”
他笑了一下。
“但你不一样。你会说话。小宇以后有不会说的话,你可以教他。”
他把手机屏幕翻过来,看着那张合照。光线打在他脸上。他的眼睛反光,但看不清是不是眼泪。
“慧芳。这四年……”
他哽了一下。
“这四年谢谢你。你跟我在一起,受委屈了。”
“我没什么能留给你的。这个程序写得不好,我知道。但我想,至少让它帮我把这句话带到。”
他终于抬起头,看着镜头。
“对不起。我不是故意走的。”
视频结束。
画面定格在他的脸上。他嘴张着,还有话没说完。但他没有再说。他伸出手,关掉了录像。
顾铮摘下眼镜,放在桌上。
窗外有人在敲水管,声音很钝。办公室的日光灯发出轻微的电流声。他的豆浆已经完全凉了,包子的热气散尽了。
他重新戴上眼镜。
然后做了一件他从来没有做过的事。
他把for_chen那个视频又看了一遍。
这一次他不是在看画面,而是在看左下角的时间戳。视频的创建时间是周明去世前六天。修改时间是去世前三天的凌晨四点十二分。
他连夜录了给儿子的练习。然后录了给妻子的道歉。
然后他把两个视频放进同一个程序。把程序锁进一个叫“告别”的文件夹。用儿子的生日和“爱你”做密码。
然后他去睡了最后一觉。
第二天,他在开车时突发脑溢血。
程序自动运行。每天晚上零点。沉默的、模糊的投影。
他没有完成告别。
但程序替他跑到了现在。
顾铮把视频关掉。他打开代码编辑器,新建了一个项目文件。
然后他开始修bug。
修bug对一个省厅级别的痕检专家来说不叫工作。但这天上午,他写了删,删了写,写到一半停下来,又重写。音频模块他调了三遍。投影亮度他校准了五遍。他选了市面上最好的全息投影接口,绕开了系统默认播放器,重新写了一套调用逻辑。
他不是做不好。
他是在想另一件事。
程序修复之后,要不要放给小宇看。
这件事不在他的职责范围内。他的职责是提取数据、分析程序、给出技术结论。至于这个程序要不要播放、播放给谁、播放之后会怎样,那不归他管。
但他在写代码的时候,一直想起林深语那句话。
“不是抓鬼。是帮一个七岁的孩子不再做噩梦。”
他把这行字打在代码注释里。然后又删掉。
太阳已经升得很高了。技术科外面的走廊传来脚步声。
门被敲了两下。
“进。”
林深语走进来。
她手里拎着两杯咖啡。她把一杯放在顾铮桌上。
“你没回消息。”
顾铮看了一眼手机。三条未读。最早的一条是凌晨一点发的。
“忘了。”他说。
林深语没有追究。她在他对面的椅子上坐下,看了一眼屏幕。代码密密麻麻。
“怎么样了。”
顾铮把屏幕转向她。
“周明写了一个全息投影程序。定时启动,目标位置零点八米,孩子躺下后的视线高度。程序调用了两段视频:birthday_message是给他儿子的,for_chen是给妻子的。”
“妻子?”
“你没看for_chen那个文件?”
“没来得及。”
顾铮沉默了一下。
“他在里面跟他妻子道歉。说对不起,不是故意走的。”
林深语端着咖啡的手停了一下。
“视频能播放吗。”
“可以。但程序有bug。投影亮度不够,音频模块调用失败。所以每天晚上他儿子看到的,是一个模糊的、没有声音的影子。”
林深语放下咖啡杯,发出一声很轻的磕碰声。
“能修吗。”
顾铮没有回答。他看着屏幕上的代码,拇指无意识地敲着桌沿。
“我在想一个问题。”
“什么问题。”
“程序修复之后,完整的投影要播放给他儿子看吗。那个孩子每晚看到一个模糊的鬼魂,已经怕了七天了。现在告诉他那不是鬼,是他爸爸没说完的生日快乐。你觉得他能不能承受。”
林深语没有立刻回答。
她站起来,走到窗边。窗外是滨城的天际线。远处有几栋在建的写字楼,塔吊在慢慢转动。
“你见过小宇吗。”
“没有。”
“他很安静。说话声音很小。我从进他家门到离开,他没有哭过一次。但他有一个动作,我一直在想。”
“什么动作。”
“他问他妈妈,警察阿姨会不会把爸爸抓走。然后他低下头,看着自己的脚。光着脚。站在地板上。不哭不闹,就那么站着。”
她转过身,看着顾铮。
“那不是怕鬼。那是怕失去。”
顾铮没有说话。
“他知道那是爸爸。但他不知道爸爸要说什么。每天晚上他看到爸爸站在门口,想伸手,爸爸就没了。连续七天。”
林深语停顿了一下。
“如果是我,我会想听。哪怕那句话是再见。”
顾铮看着她的眼睛。
他想起那个叫for_chen的视频。周明说,让小宇以后有不会说的话,可以问妈妈。周明说他嘴笨。但他用最后的时间,录了好多遍,一遍都说不完。
“一天。”顾铮说,“一天之后程序能修好。”
“然后。”
“然后你们决定。要不要放。”
林深语点了一下头。
她转身要走。
“林深语。”
她停住。
顾铮没有看她。他盯着屏幕上的代码,手指停在键盘上。
“那个程序文件夹底层,有一段隐藏代码。编码风格很旧。不是现在主流的写法。像是……”
他停顿了一下。
“像是十年前的东西。”
林深语没有说话。
“你认识会用这种编码风格的人吗。”
窗外的阳光打在办公室的地板上,形成一个明亮的矩形。
“可能认识。”林深语说。
她没有继续这个话题。她走出技术科,把门轻轻带上。
走廊里很安静。保洁阿姨在走廊尽头拖地,拖把划过地面的声音很规律。
林深语靠在墙上,拿出手机。
手机屏幕上是那条昨晚发出去的消息:
“程序找到了。是一个全息投影定时程序,设定每晚零点启动,投影位置正对卧室门口。”
下面还有一条。
“他把程序叫‘告别’。密码是他儿子的生日加上‘爱你’。”
她往下翻。翻到和顾铮的对话记录。
“那个程序文件夹底层,有一段隐藏代码。编码风格很旧。”
十年前。
她的父亲林海生,十年前在鹿鸣镇办过他的第一个案子。
她关掉手机,放进口袋。
然后她重新推开技术科的门。
“顾铮。”
顾铮抬起头。
“修好程序之后,帮我查一下那段隐藏代码的来源。”
顾铮看了她两秒。
“这和案子有关?”
“可能和我的另一个案子有关。”
顾铮没有问她“另一个案子”是什么。他只是点了一下头。
“三天。一起出结果。”
林深语关上门。
走廊尽头的保洁阿姨推着清洁车拐过转角,拖地的声音越来越远。
林深语低头看了一眼时间。
下午三点。
离零点还有九个小时。
她走出市局大楼。外面阳光很亮,刺得她眯起眼睛。
她忽然想起早上在小宇家,小宇问她的那句话。
“你会把爸爸抓走吗。”
她说不会。说阿姨想弄清楚,爸爸想跟你说什么。
但她没有告诉小宇,她从小也没有听到爸爸的最后一句话。
她坐进车里,发动引擎。
后视镜里,市局大楼安静地矗立在阳光下。