六月十七号,周一。沈渡到公司的时候会议室已经亮了灯。
透过磨砂玻璃能看到两个模糊的人影,其中一个肩膀宽厚,是组长李哥。另一个坐得很直,
大概是上面来的。他在工位放下背包,电脑还没开,李哥的头从会议室门缝探出来。“沈渡,
来一下。”会议室里空调开得过分。另一个人的确是从上面来的,姓周,李哥叫他周主任。
周主任面前摊着一叠打印资料,最上面是一张系统架构图,密密麻麻画满了模块和箭头。
“梅鹿医院的患者管理系统,”李哥把一杯水推到沈渡面前,“跑了快十年了,
中间换过几个维护,现在上面要全部重构。老周点名让你做。”沈渡看了周主任一眼。
他不认识这个人。“为什么是我?”“你去年做的药房库存系统他们看过。代码干净。
”沈渡注意到李哥说“干净”的时候嘴角动了一下。不是笑。他后来才明白,在那个语境里,
“干净”意味着你不会在代码里夹带私货。周主任把资料推过来。沈渡翻了两页,
字段名全是拼音缩写,中间件版本号老到官网已经找不到下载链接。
文档缺失率他简单估了一下,大概九成以上。“原来的维护人呢?”“离职了。三年前。
”“有交接文档吗?”李哥从桌子底下拎出一个文件夹。很薄,
薄到沈渡以为里面只夹了几张空白A4纸。他翻开。第一页是移交清单,
列了服务器IP、数据库端口、几个管理员密码。第二页是一张四楼平面图,
标注了几间房的编号,其中403被红笔圈了起来。他当时以为那是某个科室的平面图,
没多想。第三页往后全是代码片段的打印件,夹杂手写标注,字体很小,
有些地方被水渍洇开。最后一页只有一行字,蓝色圆珠笔写的,
笔画很轻:403A至403G,走道尽头只有一个房间。“这是户型说明?”沈渡问。
李哥凑过来看了一眼。“可能是吧,老房子编号都乱。”沈渡把文件夹合上。
周主任站起来跟他握手,手掌很干,力道刚好控制在礼貌和热情之间那个精确的刻度。
“项目周期三个月,有问题找李组长协调。”他走之后,会议室只剩下沈渡和李哥。
“这系统原来是谁维护的?”李哥端起保温杯喝了一口。“一个女孩子。姓白。
”“她现在在哪?”“不知道。”保温杯磕在桌面上,陶瓷底座一声脆响。“你正常做就行。
不懂的地方——注释掉,别删。”他把重音放在最后两个字上。沈渡点了点头。
他当时的理解是李哥怕他改动太激进把系统搞崩。
这个理解在接下来的两周里被证明完全错误,但在那个周一早晨,他没有多想。
他抱着文件夹回到工位,开始搭开发环境。代码库拉下来花了四十分钟,中间断了一次。
他趁这个时间去接了杯水,路过老张的工位。老张是他们组最老的员工,四十多岁,
头顶的发量已经到了需要靠周围头发支援的地步。老张正对着一个Excel表格发呆,
看到沈渡过来,迅速把屏幕切到了另一个窗口。那个切屏的动作很快。“张哥,
梅鹿那个系统你知道多少?”老张的手放在鼠标上没动。“怎么了?”“我接手重构。
”“哦。”这个“哦”持续了大概三秒。老张的表情没变,但沈渡觉得他肩膀往下沉了一点。
不是放松,是那种被按住了什么话之后的生理反应。“之前维护的人你认识吗?”“不熟。
”老张摘下眼镜擦,“她在的时候我在另一个组。”答案很标准。
但沈渡注意到了时态——老张知道前任是女的。一个“不熟”的同事,离职三年,
你还记得她的性别,这不叫不熟。沈渡没有追问。他在这行干了五年,知道什么时候该闭嘴。
当天下午他正式开工。老系统的代码像一具被多次解剖过的尸体,
每一层都有不同人留下的缝合痕迹。2014年有人加过一个模块,
用了已被弃用的框架;2016年有人修过一个bug,修法是把整段逻辑注释掉然后重写。
原注释掉的代码还在,像一根被剪断的线头,一头埋在代码深处,一头悬在空中。晚上九点,
他删掉了第一行代码。那是一个定时任务,注释里写着#不要动这一行#,
但任务的触发逻辑已经被注释掉了,等于一段废代码。他在重构时顺手清理了。
删除只花了一秒。Ctrl+X。屏幕上那行字消失了。
他敲了一行新备注:#已移除废弃逻辑,沈渡,6.17#保存。提交。回家。
---他租的房子在一栋老式筒子楼里,七层,灰白色外墙,楼道里常年有股潮湿味。
声控灯有两盏永远修不好,三楼到四楼的拐角永远黑着一块。他在这里住了两年。房东姓王,
嗓门很大,收租准时,修东西不准时。合租的还有个女孩,叫陈瑶,在附近商场做会计。
两人在客厅碰到会点个头,偶尔聊两句天气和工作,交情刚好够借个酱油。
那晚他回到四楼是十点多。经过404的时候,他余光扫了一眼门上的封条。白色,
上面盖着一个模糊的红章。他在404门口站了大概两秒。不是出于恐惧,
是出于一种对日常事物的忽然陌生感——就像你天天用的那个词,忽然觉得写法不对。
他在这里住了两年,每天路过这扇门至少两趟,但突然意识到自己从没仔细看过这张封条。
上面写的什么?盖的什么章?什么时候贴的?全不知道。一个被注视了两年的事物,
从来没有被真正看见过。他摇了摇头。加班加傻了。进屋。陈瑶的房门关着,
门缝下漏出蓝光。他径直回了自己房间,打开电脑看了两眼重构方案,关机上床。
睡前他打开手机备忘录。这是从大学养成的习惯,
写睡眠日志——每天早晨醒来第一件事是把前一晚的梦记下来。
一开始只是看了几篇关于清醒梦的文章觉得好玩,后来变成了强迫症式的日常。
但那晚还没睡,他打开备忘录,忽然想写点什么。打了几个字,又删掉。然后关灯。
---梦是从走廊开始的。沈渡站在403的客厅里。不对——不是“站”。
他不在自己的身体里。他的视角被固定在天花板与墙壁交接的角落,像一个监控探头。
他能看,不能动。能听,不能说。这种感觉很难描述。它不是瘫痪,
瘫痪的前提是你有一个身体但控制不了。它是你根本没有身体,
你只剩下“观察”这个行为本身。他看见“自己”从卧室走出来,
穿着那件灰色T恤和深蓝睡裤,和他睡前穿的一模一样。那个自己走到电脑前坐下,
打开屏幕,开始敲代码。工作了大概半小时,然后去洗手间。沈渡的视角被固定在原位,
看不到洗手间里面,只能听到水声。水声停了。门开了。那个自己走出来,穿过客厅,
走到玄关的穿衣镜前。停住了。他盯着镜子看了大概五秒钟。然后笑了。
沈渡从来没有那样笑过。那个笑容出现在自己脸上,但他完全无法理解那是什么情绪。
不是开心,不是嘲讽。是一种“确认”——就像你等了很久的人终于如约而至,
你对他笑了一下,表示:哦,你来了。镜子里的人抬起眼睛。看向沈渡所在的那个角落。
“你来了。”沈渡醒了。凌晨四点零三分。他躺在床上大口喘气,后背把床单湿透了。
手机屏幕亮着,有一条未读邮件,发件时间凌晨三点五十八分。
是梅鹿医院那套老系统自动发送的日志报告。内容是一行乱码,开头几个半角问号,
末尾是一个不完整的标签:<ERROR40他关掉邮件,打开备忘录,手指还在抖。
六月十七日,梦。403室,第三人称视角。能看到自己。镜中倒影有自主行为。
它知道我在看。写完最后一句,他把手机翻过去盖在床上。天花板上有一块渗水痕迹,
去年雨季留下的,形状像一只摊开的手。他盯着它看了很久。起身去洗手间。经过客厅时,
陈瑶的房门开着一条缝。她站在门口,手里端着水杯,穿着印卡通熊的睡衣。“你没事吧?
”她问。“怎么了?”“你刚才喊了一声。”沈渡愣住了。“我喊了什么?”陈瑶摇了摇头。
“没听清。很闷。我以为你摔下床了。”“做噩梦。”“最近是不是太累了?”“还好。
”陈瑶看了他两秒,没再问。她转身回房前说了一句:“你那屋以前是我住的。
”沈渡已经走到洗手间门口,听到这话回过头。“什么?”“我刚搬来的时候。
房东说我那间没收拾好,让我先在你这间过渡了几天。”“然后呢?”“然后我就换过去了。
”她把门关上之前加了一句,“那间房靠走廊,半夜老有脚步声。我睡不好。”房门关了。
走廊里声控灯正好灭了一盏。沈渡在洗手间的水龙头下冲了一把脸,抬头看镜子。
镜子里的人和他对视。那个自己没笑。---第二天上班,
沈渡把系统日志调出来仔细看了一遍。凌晨四点零三分的日志确实有一条记录,
时间和他醒来的时刻吻合。内容是乱码,编码格式无法识别,
但发送端口指向一个已经被注释掉的外部地址。
那个端口就是他白天删掉的那行代码里引用的地址。他把记录拉到更早的时间。
从系统部署的2010年开始查。每隔一段时间,几个月到一年不等,
系统会自动向那个外部端口发送一条日志。内容全是乱码。频率没有规律,
但有一个共同触发条件:每次发送,都是在系统进行大规模修改之后。
就像有人在代码深处埋了一个哨兵。一旦系统感知到被改动,它就往外发一条信息。
收件人是谁,内容是什么,全不知道。因为那个外部端口在三年前就失效了。不对。
不是失效。是他昨天删掉的那行代码,把整个端口给注释掉了。他盯着屏幕。操作日志显示,
昨天下午六点十一分,他执行了删除。凌晨四点零三分,系统收到了回执。端口已失效,
但回执仍被写入本地服务器。就像你寄了一封信到不存在的地址,信被退回,
但信封上盖了一个收件章——那个收件章是真实的。他拿起杯子去接水,
路过老张工位时放慢了脚步。老张的屏幕上是项目甘特图,但Excel窗口缩得很小,
右下角弹着微信对话框。沈渡扫了一眼,只看到一句话——“你告诉他了吗?
”老张感觉到了什么,回过头。沈渡已经走过去了。下午三点,
李哥在群里发了公告:梅鹿项目优先级提升,沈渡本周全力推进,其他任务暂缓。
后面艾特了老张,让他做技术支持备份。沈渡回复:收到。他关掉邮件,打开代码库,
继续重构。那个定时任务的删除只是个开始。按他的重构方案,
接下来要清理数据库里一批被标注为“废弃”的表,都是测试数据,和正式业务没有关联。
他选中了一个叫dat_log_404的表。命名规则上看是日志数据,
前缀dat表示数据日志,后缀404大概率是模块编号。表结构很简单,三列:记录时间,
操作类型,一个备注字段。备注字段里全是乱码。他右键点击。删除。确认。
屏幕弹出提示:已删除表dat_log_404。他点了确定。那晚他没有做梦。
第三天也没有。第四天他把系统里最后一个废弃模块清理干净,晚上十一点下班,
在楼道口碰到了老张。老张提着一袋外卖,看到他愣了一下。“才下班?”“嗯。
”“梅鹿那个系统,你别删太多东西。”沈渡看着他。“李哥让我重构。”“重构不是删。
”老张的语气很平,“写代码跟住房子一样。有些东西你看着没用,但它撑着一面墙。
”他刷卡进了电梯。沈渡站在原地,看着电梯门关上。他忽然意识到一个问题。周三,周四,
两个晚上无梦。这是他接手这个项目以来第一次连续两晚不被那个梦打扰。
但那个梦本来就不应该存在。一个不应该存在的东西消失了,你感到庆幸。
这本身就很有问题。---周五晚上,他提交了第一周进度报告。系统清理完成,
进入模块重构阶段。当晚。梦回来了。沈渡还是那个固定在天花板角落的视角。
和这个空间之间存在一种很新的关系——像两个进程通过一个刚建立的socket在通信,
数据传输还不流畅,有延迟,有丢包,偶尔中断——但确实在连通。
他尝试“想”了一下:让桌上那支笔滚下来。笔在桌面上晃了一下,又停住了。不是没成功。
是成功了一半。他又试了一次。集中注意力。这一次花了更大的力气——不是肌肉的力,
是那种在心里驱逐某种念头的意志力。他盯着那支笔,把指令一字一句在心里压实:动。
笔从桌面上滚落,掉在地板上,弹了一下。
那个声音——笔杆撞击木地板的脆响——非常清晰,和清醒时听到的别无二致。
然后是第二样。他想让键盘的某个键自己按下去。选了回车键。回车键的意义在于“确认”。
我要确认这个空间承认我的输入。回车键自己下陷了。屏幕上跳出空行。第三样,窗。
他想让窗帘飘动。窗帘剧烈地抖动了一下,幅度夸张,
像被一阵不存在的气流从下往上猛掀了一把。他没收好力道,
或者说还没能适应“用力”本身。第四样,门外的声控灯。他想让它亮。声控灯亮了,
透过403门下的缝隙,他看到了那道狭长的白光。然后是第五样。
他想让404的门打开一条缝。这个念头出现得自然而然,
他在考虑之初都没觉得这是个过分的要求。能动桌上的笔,能按键,能把灯点亮,
让门开一条缝不算什么。但当注意力落到404门上那一瞬间,一种奇怪的感觉阻断了他。
不是被拒绝,更像是某个指针指向了一片从未被分配过地址的虚无。黑洞洞的,
什么都没有——连静默都没有。一种比认知里的null更彻底的死寂。
就好像在这两层楼的当前版本里,404连“不存在”这个属性都没有。
它被删除的方式不是用0覆盖了原数据,而是连索引节点都被回收了。他只能收工。
早晨醒来,他首先坐起来,盯着双手看了起码十秒。然后打开手机备忘录,写道:权限提升。
可以干涉梦境。5次成功,1次无效。无效对象:404。404可能不属于这个版本。
---周六,沈渡去了公司。不是加班。是找人。老张果然在。
四十多岁单身汉的周末比工作日更难熬,来公司至少能蹭空调和网速。
他端着一杯刚泡好的速溶咖啡,看到沈渡时表情没变,
但沈渡注意到他把手里正在翻看的打印件翻了过去,背面朝上盖在桌面。“张哥,
我想问你件事。”“说。”“404。”老张端咖啡的手没动,
但本来要喝的那一口停在了杯沿。“什么404?
”“梅鹿系统的数据库里有个表叫dat_log_404。我删了。
后来我发现系统里还有个外部端口,指向一个失效地址,我也注释掉了。”“然后呢?
”“然后我住的房子是403。对门就是404。”老张放下咖啡。杯底磕在桌面。
“你怎么知道他们有关系?”“我不知道。”沈渡说,“我只是觉得太巧了。
”老张起身去接热水。饮水机咕噜咕噜响了很久。回来时,
他把一张对折的A4纸放在沈渡键盘下面。纸质很差,像是从某个废旧文件背面撕下来的,
边缘不齐。“你看完别问我为什么知道。也别跟别人说我给你的。”他坐回去,戴上耳机,
继续看Excel。沈渡打开纸条。只有一行字:403和404是同一间房。当天晚上,
沈渡把纸条夹在交接文件夹的最后一页,然后打开代码库,搜索关键词“403”。
搜索结果七条。
om_403D,room_403E,room_403F,room_403G。
七个房间编号,对应七张数据表,分别存储七组患者信息。
但当年医院的实际楼层只有六间房——301到306,401到406。
根本不存在第七间。多出来的那一间,就是403G。
而403G的数据关联的是一个已经被删除的模块,
模块名叫404_termination。终止。他把七个表全部展开,
开始比对患者编号。001到007,七个人,
入院日期分布在2010年到2012年之间。性别、年龄、科室各有不同。
但出院状态那一栏,七个人的记录完全一致——出院日期:——(无)出院方式:终止治疗。
操作人:林主任。他找到那个“林主任”的用户ID,在全系统检索。没有任何个人资料。
没有工号。没有科室。没有联系方式。
只有操作记录——从2010年6月到2012年3月,共七次,每次都一样:终止治疗。
他把操作日志的时间倒序排列。最后一次操作:2012年3月15日。那天是他的生日。
沈渡把电脑关上,盯着黑掉的屏幕看自己的倒影。两年。他在这栋楼住了两年。
每天路过404那张封条。他从来没有问过任何人,为什么那扇门上贴着封条。
他甚至没觉得这是一个需要问的问题。一个你每天经过但从不注意的事物,
和一个你永远知道它在哪但从不想去碰的记忆,
性质相同——它们都被你的大脑标注为:忽略。他在公司坐到晚上九点,骑车回家。
三楼到四楼的拐角,声控灯今天亮了。不是坏了很久吗。他抬头看灯管,
日光灯的白光稳定得没有任何闪烁。灯座周围有一圈陈年的灰。这盏灯一直在那个位置,
但他从没见过它亮。它今天亮了——是刚被修好,还是从来就一直能亮,
全看它自己让不让你看见?他没停留。上楼。经过404时,脚步慢了一拍。不是恐惧。
是一种说不清的被注视感。就像你路过一个紧闭的房门时忽然意识到,门那边有人正站着,
和你隔着一块木板、一个猫眼,安静地在另一侧丈量着你的步幅。他没有看那扇门。
但后脖颈凉了一下。进403。陈瑶不在,她周六晚上一般和朋友出去。客厅空着,
茶几上放了半杯柠檬水。沈渡回了房间,躺在床上,亮着灯。他盯着天花板上的水渍。
想起那个梦。想起镜子里那张对自己笑的脸。想起那行字——“你来了。”他怕的不是鬼。
他怕的是他在被某种力量一步一步推向一扇他本应早就推开的门。而那个推他的力量,
正在逐步升级权限——从看,到动,到被他感知,到被他发现。下一次入梦,
他怕自己会失去控制。但他更怕自己不进去。因为那扇门的另一边,有人等了他三年。
他在备忘录里打字,删掉,最后只留下一行:关于404,已知信息如下。列出七条发现。
保存。那晚睡得很快。快得不正常,像大脑刚把最后一丝清醒锁好,
就被一双看不见的手一把拽沉了下去。---梦。他站在403的客厅里。有身体了。
地板冰凉,他能感觉到脚底的温度。低头——穿着一双灰色旧拖鞋,
右脚那只侧面破了个口子。他把空气往肺里吸,潮湿的灰尘味,混着一丝陈旧的烟草气。
老房子味。他有实体了。这个事实没让他安心,反而让后脊梁开始冒汗。
因为“观察者”被锁在固定视角是一回事,
“参与者”终于下场是另一回事——前者最多让你害怕一个画面,后者可以剜掉你一块肉。
疼。他掐了一下虎口。疼。真实的、针刺一样的痛感从手指窜上手臂。梦里可以疼。
这意味着梦里的伤害也可以保留。他把手放下。客厅和现实中的403一模一样。
玄关的鞋架,二手布沙发,左边扶手上的烟洞是他去年熬夜写代码时烫的。
厨房台面上放着没洗的碗——这个汤碗他很眼熟,陈瑶上周说超市促销买一送一,
顺便给了他一个。但有一个细节不对。他的卧室门。现实中应该在他左手边。现在在右手边。
整间房的左右被翻转了。不是简单的镜像——因为玄关的鞋架没翻,客厅的沙发没翻。
只有他的卧室门。好像有人只把这一个房间抠出来,做了个水平翻转,再原位放回去。
或许这不是他的403。他走到门前。门牌号:403。字很清晰,但他盯着看了一会儿,
发现“3”的第一笔收尾处,有一个很细微的往上挑的弧度。手写体。
现实中他的门牌是印上去的标准数字,方正,横平竖直。
这个“3”的最后一笔带着一个微微上挑的弯钩。
有人——或者什么东西——重新写了这个数字。他打开房门。里面一切照常。
关上之后不放心,又开了一次——还是原样。403的左右翻转只发生在这扇门的朝向,
不曾蔓延成整个幻境。回到客厅,他站在玄关的穿衣镜前。
镜子不是他住进来时房东配的那面。他记得自己的镜子是长方形的,带个黑色合金窄框。
现在这面是椭圆形的,没有框,镜面边缘有一点氧化发黄的痕迹。最不对劲的是朝向。
穿衣镜通常正对玄关或侧面墙,但这面镜子被挪到了正对大门的位置。
谁出门前还要照一下镜子?不是没有这种人,但这不属于他的生活习惯。
他意识到这个空间的逻辑正在被另一个人的习惯覆盖。就像重构系统时,
发现一个新模块一直在默默重写你刚刚保存的配置文件——每一次修改都以它的标准为准。
他伸手摸镜面。冰得扎手。镜子里只有他自己。没有笑。他松一口气,转身,走到门口。
走廊昏暗悠长,声控灯在他踏出去的一瞬间亮了。一盏接一盏,节奏稳定地延伸到尽头。
拐角那盏——那盏坏了两年的——也跟着亮了。他站在403门口。走廊尽头倒数第二间。
往右两间是楼梯间,往左两间是走廊尽头并排的403与404。404。封条还在。白色,
红章。他一步步走过去,脚步声在空荡荡的走廊里被放大成夸张的回响,
每一步都能听出踩在水泥地面上那种细碎的、沙粒被碾过的声音。他站在404门前。
封条上不再只是红章。上面有一张照片。一寸免冠照。黑白。一个男人的脸。
沈渡看着那张脸。他每天早晨刷牙时在镜子里看到它,刮胡子时看到它,洗脸时看到它。
比熟悉更确切——这是他自我意识的核心标识。但被印在眼前这张封条上,毫无表情,
那么平静,像张贴在某份档案袋左上角的处置标签。
照片下面一行日期:2012年3月15日。他的生日。沈渡在404门前站了很久。
久到走廊里的声控灯自动灭了。他没有跺脚,也没有咳嗽。他就站在黑暗里,
甚至开始习惯黑暗。不反胃,不尖叫,
不假思索地掏手机拍照——醒来才发现手机根本不在口袋。
他只是被一种巨大且说不清的荒诞感压住了,像一块从天花板上缓缓降下来的水泥顶棚。
你活了一辈子,忽然发现自己的名字被刻在了一块墓碑上。你没有死。
但你已经被记录为不存在。谁记的?他转回身。走廊尽头,所有声控灯同时亮起。
不是一盏一盏,是同时。像有人把总闸推上去。白光从每盏灯管里炸开来,
整条走廊被照得没有任何死角。走廊是空的。他从头走到尾,每一个拐角看过。没有人,
没有任何异样。但刚才那一下声控触发,绝不是他踩的。他后面没有脚。回到403。
他坐在床上,拿起床头柜上的手机——梦里的手机,屏幕亮着,时间显示00:00。
时间也暂停了。然后手机屏幕闪了一下,弹出一条备忘录提醒。
标题:患者编号404-001内容:入院日期2012年3月15日。主治医生:白。
经治情况:待填写。“白”后面没有字。但那个姓氏,他在交接文档的最后一页见过。
那行手写字——403A至403G,走道尽头只有一个房间。署名:白茉。手机屏幕熄灭。
他重新躺下。闭眼。然后门把手转动的声音。很轻,但很近。从404的方向传来的。
把手转动的声音停了。不是被人松开的金属回弹咔哒声,而是转到一个临界角度后忽然卡住,