白天的修理铺比晚上更破。
阳光从铝合金门的缝隙里挤进来,照在满墙的电容电阻上,那些小零件反射出细碎的光,像墙上镶了一层廉价的水钻。陈树修坐在操作台前,面前摊着一叠发黄的稿纸。他的手指从第一页划到第四十七页,在某个公式上停住了。
指尖触碰处,纸面上浮现出微弱的绿色代码线条。
不是错觉,不是幻觉。那些线条像水里的墨迹一样慢慢晕开,沿着公式的轨迹爬行,一笔一划地勾勒出五年前他亲手写下的每一个字符。陈树修盯着那些线条,低声说了一句:“还在?”
“还在什么?”
声音从门口传来。陈树修还没来得及把稿纸收起来,一个扎着马尾辫的女孩已经端着两杯奶茶走了进来。她叫小桃,十九岁,隔壁“小桃奶茶铺”的老板,也是这个城中村里唯一一个会主动跟陈树修说话的人。
小桃把奶茶放在操作台上,踮起脚尖往稿纸上瞄了一眼。“树修哥,你还在搞你那套‘万物代码论’啊?”她的语气里带着惯常的调侃,“上次你说鬼是代码BUG的时候,我还以为你开玩笑呢。”
陈树修没理她,把稿纸翻了个面,用电路板压住。
小桃不依不饶,搬了把凳子坐到操作台对面,双手托腮:“跟我说说呗,你那套理论到底是什么?反正今天也没生意。”
陈树修看了她一眼,又看了看空荡荡的门口,叹了口气。他从抽屉里翻出电烙铁,插上电源,一边加热一边说:“五年前,清华实验室。”
小桃的眼睛亮了:“你真是清华的?我以为你吹牛呢!”
“导师姓周,国内因果逻辑学的奠基人。”陈树修把焊锡丝在指尖绕了两圈,“我大二进了他的实验室,做的是‘异常事件的逻辑结构分析’。简单说,就是想把世界上所有解释不了的事情,用代码拆解开。”
“比如闹鬼?”
“比如闹鬼。”
陈树修拿起一块废旧的电路板,用镊子夹掉一个锈蚀的电容。他的动作很慢,像是在给小学生讲课。“我花了一年时间,推导出了一套公式。这套公式可以把任何因果链条转译成代码——从因到果,从果到因,中间的逻辑关系全部可以用if、then、else、while、for这些基础语句表达。”
小桃皱着眉头:“听不懂。”
“意思就是,”陈树修把焊锡丝点在烙铁头上,银白色的锡融化后滴落在焊盘上,“如果一个鬼魂被困在同一个地方重复做同一件事,那它本质上就是一个死循环。循环的入口条件没有满足,退出条件永远不成立,它就永远卡在那里。”
“就像电脑程序卡住了?”
“对。重启没用,杀毒没用,格式化也没用。唯一的办法是找到断点,把逻辑补上。”陈树修放下电烙铁,“这就是我的论文核心——通过植入断点修复因果链断裂。”
小桃眨了眨眼:“那你论文后来发表了吗?”
陈树修的手指顿了一下。他沉默了五秒钟,然后说:“没有。导师说我挑战因果律,当着我的面删了所有数据,把我劝退了。”
“劝退?”
“就是开除。好听一点叫劝退。”
小桃张了张嘴,想说什么,又咽了回去。
修理铺里安静了几秒钟。墙上的挂钟滴答滴答地走着,门外传来收废品的三轮车铃铛声。陈树修拿起奶茶喝了一口,太甜了,他又放下了。
“所以你现在信了吗?”小桃问。
“信了。”陈树修说,“鬼就是代码BUG。”
话音刚落,老周冲了进来。
老周是这栋楼的房东,五十五岁,前国企电工,肚腩大得能把工作服撑破。他跑得气喘吁吁,脸上的汗珠顺着双下巴往下淌,一只手撑着门框,另一只手指着外面。
“树、树修!地铁站闹鬼了!”
陈树修抬起头,不紧不慢:“每天都有鬼,有什么好大惊小怪的?”
“不是普通的鬼!”老周喘着粗气,“有个姑娘,每天凌晨三点十七分准时跳轨!地铁公司调了监控,发现每次都是同一个女人,同一秒钟,同一个姿势!保安去拦,手直接穿过去了!”
小桃“啊”了一声,躲到了陈树修身后。
陈树修的表情终于有了一丝变化。他放下奶茶,从操作台下面的抽屉里拿出一个军绿色的帆布工具箱。工具箱很旧,拉链坏了,用绳子捆着。他解开绳子,打开箱子,清点了一下里面的东西——电烙铁、焊锡丝、镊子、螺丝刀套装、万用表、绝缘胶带。
“带我去。”他说。
老周愣了:“你真要去?那可是鬼!”
“刚说过,”陈树修拎起工具箱,“鬼就是代码BUG。”
凌晨三点,地铁站。
末班车已经在两个小时前开走了,站台上空无一人。白炽灯把整个站台照得像太平间,每一块地砖都在反射着惨白的光。风从隧道里灌进来,带着铁锈和灰尘的味道。
陈树修蹲在轨道边的黄色安全线后面,眼睛扫视着周围的空气。小桃躲在站台柱子后面,只露出一颗脑袋。老周站在更远处,一只手捂着嘴,不敢出声。
从陈树修的视角看,这个地铁站就是一个巨大的代码堆栈。
天花板上漂浮着函数声明,墙壁上挂着变量定义,空气里密密麻麻全是逻辑运算符。而在轨道上方三十厘米的位置,悬着一团巨大的绿色代码——和昨晚那个红衣女鬼身上的代码一模一样,但规模大了一百倍。
不是一百行,是一百倍。
整个站台的因果链都在这里汇聚,像无数条河流汇入了同一个湖泊。而那团代码的核心位置,有一个正在不停重复执行的时间回环指令。每四十七分钟循环一次,每一次循环的最后一步都是——“跳轨”。
陈树修站起身,拍了拍膝盖上的灰。他的手已经伸进了工具箱,摸到了螺丝刀的手柄。
“树修哥,”小桃从柱子后面探出头,“你在看什么?”
“断点。”陈树修说,“这个比昨天那个复杂得多。昨天那个是单线程死循环,这个是分布式并行循环。不是一个人的因果链断了,是整个站台的时间逻辑被篡改了。”
“什么意思?”
“意思是,”陈树修抽出螺丝刀,“这里曾经有人自杀过。她的死亡逻辑没有被系统正常回收,而是被复制粘贴了一百遍,现在整个站台都在重复播放她的死亡过程。”
小桃的腿开始发抖:“那、那她还是鬼吗?”
“还是死循环。”陈树修戴上焊工护目镜,“只不过规模大了点。”
他跨过黄色安全线,站到了轨道边上。脚下的铁轨泛着暗红色的锈迹,枕木上积着一层黑色的油泥。他蹲下去,用螺丝刀对准空气中一个闪烁的绿色节点,准备动手。
手机突然震动了。
陈树修的动作停住了。他放下螺丝刀,掏出手机。屏幕上是一条短信,没有来电号码,没有归属地,只有一行字——
“师兄劝你别碰。这是为你好。——叶文渊”
陈树修盯着那行字看了三秒钟。
叶文渊。
他记得这个名字。清华计算机系博士生,比他高三届,同一个导师。叶文渊是导师最得意的学生,学术论文发了十几篇,导师逢人就夸。而陈树修被劝退那天,叶文渊也在实验室里。
他没有说话,没有阻拦导师,甚至没有看陈树修一眼。
他只是站在角落里,背对着所有人,面对着一台黑屏的显示器,一动不动。
陈树修把手机屏幕按灭了。
他重新拿起螺丝刀,对准那个绿色节点。
“叶文渊是谁?”小桃在后面问。
“师兄。”陈树修简短地回答。
“他说别碰,你还碰?”
“越不让碰,越要碰。”
陈树修把螺丝刀探进了代码堆栈。刀尖触碰到了第一个循环的入口条件,他轻轻一撬,那行代码弹开了。里面的结构露了出来,密密麻麻的嵌套循环像蜂巢一样排列着。
他的表情变了。
这不是简单的死循环。这是被人为制造出来的因果陷阱。每一个循环的出口都被刻意写成了死胡同,每一个变量都在指向不可能满足的条件。这个时间回环不是自然产生的,而是被一个“程序”故意植入的。
业力引擎。
他又想起了红衣女鬼消失前的那句话。
“树修哥,”小桃的声音在发抖,“我感觉有人在看我们。”
陈树修抬起头,摘下护目镜。
站台尽头,隧道口的方向,站着一个人影。
光线太暗,看不清脸,只能看出是一个男人的轮廓。他穿着一件深色的外套,双手插在口袋里,一动不动地站在那团黑暗里。风从隧道里吹出来,吹动了他的衣角,但他整个人像一尊雕像一样纹丝不动。
陈树修想看清楚一点,刚往前走了一步,手机又震动了。
第二条短信。
“你以为你在修鬼?你在帮系统打补丁。再修下去,系统会把你识别成异常对象。——叶文渊”
陈树修看完短信,再抬头看向隧道口。
人影已经消失了。
站台尽头只剩下一面贴着瓷砖的墙,和墙下面一滩不知道什么时候渗出来的水。
“树修哥,”老周终于从柱子后面走了出来,“你到底还修不修?”
陈树修把手机揣回兜里,拿起螺丝刀,重新蹲到轨道边上。
他看了一眼时间——凌晨三点十六分。
还有一分钟。
“修。”他说。
螺丝刀再次探进代码堆栈。这一次他没有犹豫,直接找到了最底层的父进程。那个进程的ID号是一串十六进制的数字,陈树修在昨天那个红衣女鬼身上见过完全相同的编号格式。
他用自己的论文公式验证了一遍。
完全吻合。
不仅编译语言一样,连进程编号的命名规则都一模一样。就像两段代码出自同一个程序员之手。
陈树修正要动手修改,第三条短信来了。
这一次不是文字,是一张图片。
图片上是他的论文手稿第47页的扫描件,红笔批注的那行字被人用荧光笔标了出来——“陈树修,你这是在挑战因果律。”
下面用黑色签字笔写了一行小字:
“你再修下去,下一个要修的就是你自己。”
发件人:叶文渊。
陈树修握着螺丝刀的手紧了紧。
轨道上的空气开始扭曲了。那团绿色代码的核心位置出现了一个白点在膨胀,像一颗正在收缩的心脏。时间回环马上就要启动了,凌晨三点十七分一到,那个女孩的残影会再次出现,再次跳轨,再次重置,再次重来。
陈树修有两个选择——动手,或者收手。
他选择了动手。
螺丝刀刺进了代码的核心。绿色节点爆发出刺目的光芒,但在普通人的眼睛里,陈树修只是对着空气戳了一下。小桃什么都没看见,老周什么都没看见。
那团代码剧烈地震颤了一下,然后停下了。
不是修复了,是暂停了。
所有的循环都停在了同一个位置,像一个被按下暂停键的视频画面。陈树修看得很清楚——只需要再焊上两个断点,这个时间回环就能彻底解除。
他掏出电烙铁,按下开关。
发热芯开始加热,烙铁头在凌晨的地铁站里发出微弱的红光。
就在这时,他的手机屏幕亮了。
不是短信,是来电。来电显示——“叶文渊”。
陈树修没有接。
电话响了六声,挂断了。紧接着第四条短信进来了。
只有一句话:
“你在玩火。”
陈树修把手机调成静音,塞回兜里。电烙铁已经热了,焊锡丝在尖端融化,一滴银白色的液态锡悬在半空中。他把烙铁头慢慢移向那个被螺丝刀撬开的断点,准备焊接。
隧道里起风了。
不是普通的风,是那种从隧道深处涌出来的、带着低频嗡鸣声的风。风灌进站台,吹得天花板上的日光灯管剧烈晃动,光线忽明忽暗。陈树修的影子在地面上疯狂地扭动,像一个正在挣扎的人。
小桃尖叫了一声,抱住了柱子。
老周直接蹲在了地上,双手抱头。
陈树修没有动。
他的右手稳稳地握着电烙铁,焊锡丝一滴一滴地落在断点上。第一滴,第二滴,第三滴。每滴落一滴,那团绿色代码就暗淡一分,站台里的嗡鸣声就减弱一分。
最后一滴焊锡落下的瞬间,整个站台陷入了绝对的寂静。
连风声都停了。
然后,陈树修听见了那个声音。
不是从手机里传出来的,不是从隧道里传出来的,而是直接在他脑子里响起来的——一个低沉的、不带任何感情的合成语音:
“异常操作已检测。位置:地铁三号线城中村站。操作者ID:未知。正在上报……”
声音断了。
陈树修摘下护目镜,看向手机。
屏幕上多了一条未读短信,发送时间就在刚才的那一秒钟。
“系统已经发现你了。72小时后,你会收到一份诊断报告。——叶文渊”
陈树修把手机屏幕按灭。
他蹲在轨道边上,手里的电烙铁还在冒着白烟。焊锡丝的余温烫了一下他的指尖,他没有缩手。远处的地平线上,天空开始泛白,凌晨的夜色正在一点一点被稀释。
小桃从柱子后面走出来,腿还在抖:“修、修好了?”
“修好了。”陈树修说。
“那个鬼呢?”
“没有鬼了。”
老周从地上爬起来,拍了拍膝盖上的灰:“所以……没事了?”
陈树修没有回答。
他站起来,把电烙铁关掉,放回工具箱。螺丝刀在工具包里磕了一下,发出清脆的金属声。他把工具箱重新用绳子捆好,挎在肩上,朝出口走去。
小桃追上来:“树修哥,你脸色好难看。”
“没事。”
“那个叶文渊是谁啊?你师兄?”
“嗯。”
“他说系统发现你了,什么意思?”
陈树修停下脚步,转过身。他看着小桃的眼睛,说了一句让她后背发凉的话:“他说的是真的。”
地铁站的出口处,第一缕晨光照了进来。
陈树修逆着光走出站台,影子在他身后被拉得很长很长。小桃愣在原地,看着他消失在那片刺目的白光里。
老周从后面走过来,拍了拍小桃的肩膀:“他到底修没修好?”
“修好了。”小桃说。
“那为什么他的表情,像没修好一样?”
小桃没有回答。
她掏出手机,给陈树修发了一条微信:“你没事吧?”
消息发出去,已读。
没有回复。
地铁站恢复了安静。轨道上的绿色代码已经完全消失了,空气里只剩下一股淡淡的焊锡味。
但在站台最深处,那面贴着白色瓷砖的墙上,有一个微小的裂缝正在缓慢地延伸。裂缝里透出一点金色的光,像一只正在睁开的眼睛。