修理铺的电风扇在头顶吱吱呀呀地转着,扇叶上的灰尘被吹起来,在阳光里飘成一条灰白色的雾带。陈树修坐在操作台前,手机立在面前的支架上,屏幕亮着。那个倒计时还在走——71:34:12,71:34:11,71:34:10。
小桃已经在他面前转了十几圈了,奶茶店今天干脆没开门,她换了三套衣服又换回来,最后穿着一件皱巴巴的T恤蹲在修理铺门口,双手抱着膝盖。
“快跑啊!”她突然站起来,声音大得把房梁上的灰震下来一层,“树修哥,你还有不到三天时间,你还在焊什么东西?”
陈树修头也没抬,手里的电烙铁正对着一块电源板的滤波电容。焊锡丝融化,滴落,凝固。他把电容的两个引脚焊得饱满圆润,然后放下烙铁,拿起斜口钳剪掉多余的引脚。
“跑没用。”
“为什么?”
“因为它发件人是我自己。”陈树修把电源板翻了个面,检查背面的焊点。
小桃愣住了。她走到操作台前,弯下腰,盯着手机屏幕上的那条系统通知。“异常对象‘陈树修’已确认。倒计时72小时自我销毁。——业力引擎”。她一个字一个字地念完,然后抬起头,眼睛里全是困惑。
“发件人是‘业力引擎’,怎么是你自己?”
陈树修放下电源板,从抽屉里翻出那个牛皮纸信封,抽出论文手稿。他把手稿一页一页地摊开在操作台上,从第1页到第47页,再从第47页到第1页,像是怕漏掉了什么。
“业力引擎的底层编译语言,和我论文里的推导公式完全一致。”他把两张纸并排放在一起,“不只是相似,是完全一样。变量命名规则、函数调用方式、异常处理机制,连注释的格式都一模一样。”
小桃看着那些密密麻麻的公式和符号,眼睛花得什么都看不懂。
“这说明什么?”
“说明业力引擎的源代码,就是我的论文。”
小桃的脑子转了好几圈才跟上来:“可是……你的论文不是被导师删了吗?”
“电子版删了。”陈树修翻到最后一页,“但这套手稿我一直留着。而且我漏掉了一页。”
他拿出一张折了好几折的纸,纸的边缘已经发黄发脆,稍微用力就会碎掉。这张纸一直被夹在牛皮纸信封的夹层里,连他自己都忘了。昨天翻论文的时候,信封不小心被撕开了一个口子,这张纸才掉了出来。
纸上是论文的结论页。他清清楚楚地记得,当初导师看完这一页之后,一言不发地把这一页从论文里撕掉了,扔进了碎纸机。导师说:“这个结论不能写进去,它会毁了所有人。”
陈树修把那张纸摊平,用万用表的表笔压住四个角。纸上的字迹有些模糊了,但还能看清。他念出了那行被他藏了五年的结论:
“业力引擎的核心是——观测即因果。谁观测,谁就是上帝。”
小桃倒吸了一口凉气。
“意思是,”陈树修继续说,“这个系统不是靠代码运行的,是靠观测者运行的。谁在观测因果链,谁就能修改因果链。观测者就是系统的管理员,就是上帝。”
“那你是观测者吗?”
陈树修看着自己的手,沉默了几秒:“我不仅能观测,我还能看见代码。按照这个逻辑,我对系统来说,不只是管理员,还是——开发者。”
话音刚落,门口传来一阵急促的脚步声。老周气喘吁吁地跑了进来,身后跟着一个浑身发抖的出租车司机。司机四十来岁,穿着一件洗得发白的蓝色工装,脸色惨白,嘴唇发紫,眼睛瞪得大大的,瞳孔却缩成了两个针尖大的点。
“树修!”老周扶着门框喘气,“这、这位师傅,中邪了!”
陈树修抬起头,看了一眼那个司机。
司机在发抖,不是冷的那种抖,而是从骨头缝里往外渗的那种哆嗦。他的牙齿在打战,发出咯咯咯的响声,像冬天的蝈蝈。他的手紧紧攥着自己的工装口袋,指节发白。
陈树修放下电烙铁,慢悠悠地戴上焊工护目镜。
透过墨绿色的镜片,他看见了司机头顶上方三十厘米处,漂浮着一小段金色代码。不是之前见过的绿色,是金色,像熔化的黄金一样发着温润的光。那段代码只有短短三行,但每一行都用了极高的编译效率,没有任何冗余字符。
陈树修读完了那段代码。
“他说的每个字,都是真的。”陈树修摘下护目镜,看着老周,“不是中邪,是被人植入了信息锚点。”
司机听见“信息锚点”三个字,猛地抬起头,用一种近乎哀求的眼神看着陈树修。
“我拉过一个客人,”司机开口了,声音像砂纸刮玻璃,“凌晨两点,在城西殡仪馆门口上的车。他要去清华西门。”
陈树修的眉毛动了一下。城西殡仪馆到清华西门,横穿整个城市,夜里不堵车也要跑四十分钟。
“那人长什么样?”
“没看清脸,”司机摇头,“他一直戴着帽子和口罩。但他身上的味道很特别,不是香水,是……”
“是什么?”
“是烙铁焊松香的味道。”司机说,“和你身上的一模一样。”
陈树修下意识地闻了闻自己的围裙。松香,焊锡,还有一点焦糊味。
“他让我带话,”司机咽了口唾沫,声音更哑了,“原话是——‘师弟,这不是游戏。’”
修理铺里安静了两秒钟。电风扇的吱呀声突然变得格外刺耳。
陈树修站起来,绕过操作台,走到司机面前:“他还说了什么?”
“没了。就这一句。说完他就下车了,连车费都没给。”司机从口袋里掏出一张揉皱的纸条,“但他留下了这个。”
陈树修接过纸条。上面没有字,只有一个二维码。他用手机扫了一下——二维码指向一个加密的压缩包,需要密码才能打开。
他把纸条翻过来,背面用铅笔写着两个数字:47。
第47页。论文的第47页。
陈树修把纸条揣进口袋,转身朝门口走去。
“树修哥!你去哪?”小桃追上来。
“出租车。”
三个人冲到了停在修理铺门口的出租车旁。那是一辆老款的现代伊兰特,车漆掉了好几块,后保险杠上贴着一道胶带。陈树修拉开车门,蹲在副驾驶座位上,戴上护目镜,眼睛开始在车内扫描。
仪表盘,正常。方向盘,正常。座椅,正常。安全带卡扣,正常。
他扫到副驾驶座椅缝隙的时候,停住了。
缝隙里卡着一小串代码,不是漂浮在空气中的,而是直接写在座椅的织物纤维上的。代码的格式和司机头顶的那段金色代码一样,但更长,更复杂。陈树修一行一行地读下去,读到最后一行的时候,嘴角微微上扬。
这是一个后门。
不是普通的后门,是专门留给他的后门。代码的注释里写着他的学号——2017201468,清华大学的本科生学号,五年前被注销的那个号码。
陈树修掏出手机,对着座椅缝隙拍了一张照片。闪光灯闪了一下,照片里的代码清晰地显示在屏幕上。
他跳下车,冲回修理铺,把笔记本电脑从货架最底层翻出来。那台电脑是他被劝退时从学校带出来的唯一一样东西,联想的ThinkPad,外壳碎了一个角,键盘上的字母磨掉了一半。
电脑开机用了四十秒,比平时慢了三十秒。陈树修耐心地等着,手指在桌面上一下一下地敲。
系统启动后,他把手机里的照片导进电脑,打开一个自己写的解码程序。程序界面是黑色的,白色的光标在“请输入密码”后面一闪一闪。
陈树修输入了:47。
解码程序开始运行,进度条一点一点地往前走。10%,20%,30%……每前进一格,笔记本电脑的风扇就响一分,到80%的时候,风扇已经转得像直升机起飞了。
100%。
屏幕上弹出一个地图定位。
不是普通的地图,是卫星图,上面标着一个红色的图钉。陈树修把地图放大,再放大,红色的图钉落在一个具体的位置上。
清华西门往北三百米,一条小巷子的尽头,一栋三层的旧楼。楼的外墙爬满了爬山虎,窗户用砖头封死了,只有顶楼的一个窗户透出微弱的光。
那是大学实验室旧址。
他大二那年,导师的实验室从主楼搬到了那里。他在那栋楼里待了整整两年,每天晚上最后一个走,每天早上第一个到。那栋楼里有他的工位,有他的示波器,有他用过的第一把电烙铁。
也是在那里,导师当着他的面删除了他所有的数据。
“那是你被开除的地方!”小桃站在他身后,看着屏幕上的定位,声音都变调了,“你师兄要你去那里?”
陈树修没有回答。他关掉电脑,合上屏幕,从抽屉里拿出一把新的焊锡丝塞进工具箱。他检查了电烙铁的温度——常温,没插电。他检查了万用表的电池——还有电。他检查了螺丝刀套装——齐全。
“树修哥,你不会真的要去吧?”小桃挡在门口,“那是陷阱!”
“我知道。”
“知道你还去?”
陈树修拎起工具箱,走到小桃面前。他比小桃高一个头,此刻他低下头,看着她的眼睛,用一种她从没听过的语气说:“如果是陷阱,说明他在怕我。如果他怕我,说明我有机会。”
小桃张了张嘴,说不出话来。
老周站在门口,欲言又止了两次,最后只说了一句:“小心点。”
深夜十一点,陈树修一个人走出了修理铺。
城中村的巷子里没有路灯,他靠着手机屏幕的微光照亮脚下的路。工具箱在肩上颠着,拉链扣环在月光下反着冷光。他穿过那条走了五年的巷子,穿过那个修了三年还没修好的十字路口,穿过那座桥下睡着流浪汉的天桥。
四十分钟后,他站在了清华西门的门口。
门口的保安亭还亮着灯,保安在里面看手机,眼皮都没抬一下。陈树修没有走正门,他绕到西门北边,沿着一条没有路灯的小路走了两百米,在一栋被爬山虎覆盖的老楼前停下了脚步。
楼很老了,老到外墙的水泥已经起了粉,用手指一戳就是一个坑。爬山虎的藤蔓从地面爬到楼顶,把整栋楼裹得像一个绿色的茧。一楼的门窗都用红砖封死了,砖缝里长出了野草。二楼的窗户也封了,只剩下三楼的最后一个窗户透出微弱的光。
光很暗,暗到如果不是仔细观察,根本不会注意到。
陈树修找到了一楼的入口。那是一扇铁门,门上的油漆已经剥落干净,露出锈迹斑斑的铁皮。门把手上挂着一把锁,锁也锈了,但锁舌没有完全合上。
他轻轻一推,门开了。
门轴发出了一声极低的呻吟,像一个人从长眠中醒来。陈树修闪身进去,工具箱在他腰侧轻轻地晃了一下。
楼梯间里漆黑一片。他打开手机的手电筒,白光劈开了面前的黑暗。楼梯是水泥的,每一级台阶的中间都被踩出了一个凹陷,那是无数双脚走了无数遍留下的痕迹。
他记得这个楼梯。两年前,他每天都要爬三次。早上一次,中午一次,晚上一次。每次爬到二楼转角的时候,都会看见墙上贴着的那张纸——“实验室守则:最后离开的人请检查所有电源。”
纸还在。边角卷起来了,发黄了,但还在。
陈树修的手电筒光在那张纸上停了一秒,然后继续往上。
二楼,三楼。
三楼的楼梯口没有门,直接通着一个开放式的走廊。走廊的尽头是一扇木门,门虚掩着,门缝里透出那束微弱的、暗黄色的光。
陈树修走到门前,深吸了一口气。
他闻到了松香的味道。不是他围裙上的那种新鲜的松香,而是一种被时间氧化过的、带着霉味的陈旧松香。这种味道太熟悉了,熟悉到让他的鼻子发酸。
他推开了门。
房间很大,比他在修理铺的整个店面还要大一倍。所有的窗户都被砖头封死了,但砖与砖之间留了细小的缝隙,夜风从缝隙里钻进来,发出呜呜的声响。
房间的正中央,摆着一台巨大的服务器。
不是普通的机架式服务器,而是那种只有在超算中心才能见到的大家伙。黑色的机柜有两米高,一米五宽,机柜的门是透明的玻璃,透过玻璃能看见里面密密麻麻的硬盘、风扇和线缆。风扇在转,发出低沉而均匀的嗡嗡声,像一个巨大生物的心跳。
服务器的机箱上贴着一张纸。
A4纸,彩色打印,上面是一个论文封面。标题是《论因果律的代码化表达及其可修复性》,副标题是《一种基于逻辑断点植入的异常事件解决方案》。作者——陈树修。日期——五年前。
那是他的论文封面。导师当着他的面删除电子版之后,第二天他就在学校打印店打印了一份纸质版,装订成册,塞进了牛皮纸信封。他以为那是世界上唯一一份存稿。
但这里还有一份。
不,不是一份。陈树修走近了几步,透过玻璃门看见了服务器内部——机柜的每一个硬盘托架上都贴着一个标签,每一个标签都是他的论文标题。四十八块硬盘,四十八张一模一样的标签。
服务器的主屏幕上显示着一行字,绿色的,点阵字体:
“欢迎回家,开发者。”
屏幕下方是一个输入框,光标在闪烁。输入框的旁边有一个计时器,正在倒计时。
70:12:07。
70:12:06。
70:12:05。
陈树修盯着那个倒计时,盯着那行“欢迎回家,开发者”,手里握着的工具箱拉链扣环在微微颤抖。
不是害怕,是愤怒。
不是愤怒,是醒悟。
五年前,导师删了他的论文,说要保护他。五年后,他的论文以另一种方式回来了,变成了一个要销毁他的系统。而那些被封存的数据、被毁掉的名誉、被抹去的人生,从来就没有消失过。
它们只是换了一张皮,换了一个名字——业力引擎。
陈树修放下工具箱,走到服务器面前。他把手按在机柜的玻璃门上,感受着内部风扇吹出来的风。风是热的,带着电路板和硬盘运转时特有的那股焦糊味。
他轻声说了一句:“我回来了。”
服务器的风扇转速突然加快了一档,像听到了他的声音。
屏幕上弹出了第二行字:
“异常对象‘陈树修’已进入核心区域。威胁等级:最高。建议立即执行——”
字没有打完,像是被人强行打断了。
然后,第三行字出现了,字体是手写体的那种,和他的笔迹一模一样:
“别怕。你本来就是来修我的。”
陈树修的手指从玻璃门上滑落。他看着那行字,看了很久很久,然后笑了。
是那种只有在自己家里才会露出的笑容。
“好,”他说,“我修。”