第一天凌晨两点四十七分。
周明面前的屏幕已经连续亮了十六个小时。他眨眼的频率降到了每分钟两次以下,眼睛干得像被风干了三个月的葡萄干。但手指还在动——它们已经被系统训练出了肌肉记忆,不需要大脑下达指令就能自己敲代码。他偶尔低头看了一眼键盘,发现自己的手指正以某种不属于人类的节奏在键帽上跳跃,像被一根看不见的线牵着。
王胖子趴在桌面上睡着了。他的脸压在键盘上,额头的肉被键帽印出一排整齐的凹痕,口水在回车键旁边汇成了一小片反光的湖泊。他的呼吸声是整个工位区唯一的低频噪音,像一台老旧的空调外机在呻吟。
周明伸手拍了他的脸两下。力道不大,但足够让王胖子从深度睡眠里被拽出来。
“起来修炼。”
王胖子的眼皮挣扎了一下,勉强睁开一条缝:“明哥……我梦见自己成了仙人……”
“你连PRD都没写完,成什么仙人。”
王胖子挣扎着坐起来,看了一眼电脑屏幕上的代码,又看了一眼周明那双已经冒出血丝的眼睛,然后用一种刚从梦中醒来的人才有的迷茫语气说:“那……我成仙之后,是不是就不用写PRD了?”
“成仙也得写PRD,”周明把一杯新泡的速溶咖啡推到他面前,“仙界也有甲方。”
王胖子接过咖啡喝了一口,烫得舌头缩回去半截。但他的眼神比刚才亮了一些。系统面板上,王胖子的状态栏写着:【体力值:23%。精神值:17%。意志力:此人不配拥有意志力。】周明看着那行字,又把第二杯咖啡推过去。
“喝。喝完继续。还剩三十六个小时。”
整个小组的状态都差不多。前端小李在对着屏幕发呆,光标在代码编辑器里跳了五分钟没落在一个字符上。后端小张在跟自己写的接口搏斗,每解决一个bug就会新增两个bug,像打地鼠一样永无止境。运营的妹子在帮他们整理测试数据,她的眼眶比周明还红,像是随时都会哭出来,但她的手指敲键盘的速度始终没有减慢。
周明看着这些人的状态,心里算了一下时间。第二天了。他已经三十个小时没合眼了,系统面板上多了一个之前没见过的进度条——【修炼值:37%】。
那个进度条从他开始加班那一刻就出现了。它不依赖于任何代码或文档的完成度,只依赖一个变量:熬夜的强度。越累,进度条涨得越快。
第一天凌晨四点的打卡机前,所有人的眼睛都已经布满血丝了。周明去茶水间接水的时候,看见窗玻璃上的倒影——自己的眼球里那些细小的红血管像一张正在展开的地图。
第二天深夜三点十二分。
周明是唯一还保持着打字节奏的人。他的手指落在键盘上的声音始终均匀,像一台没有感情的打印机。其他人都已经进入了间歇性昏迷状态——王胖子靠在椅背上半张着嘴,前端小李趴在桌上,后端小张靠着文件柜闭眼,他们的电脑屏保依次亮起,像一排熄灭了的路灯。
系统面板上【修炼值】跳到了78%。
然后周明的头顶开始冒烟。
烟是青色的。从头顶百会穴的位置渗出来,像一壶快要烧开的水。刚开始只是细细的一缕,淡得几乎看不见,但他在屏幕上的代码里发现了一个之前疏忽的逻辑漏洞之后,那缕烟突然变浓了——浓到旁边的王胖子打了个喷嚏醒来。
“明哥……你头顶冒烟了。”
“正常,”周明头也不抬,“这叫……开悟。”
“开悟是这么开的?”王胖子揉了揉眼睛,发现那烟还在冒,而且颜色从青色往蓝色渐变,“你这是开悟还是走火入魔?”
周明没回答。他手指的动作比刚才更快了,键盘声像密集的冰雹砸在铁皮屋顶上。代码一行接一行地填满屏幕,之前卡了三个小时的逻辑死结被他用一套自己之前没见过、甚至没想过的方式解开了。那套解法像是从脑子里某个被熬夜打开的阁楼里翻出来的——他从来没学过这东西,但它就蹲在记忆的某个角落里,等他到了某个临界点,自动跳出来。
系统提示音从内部传来:“悟性+1。当前悟性值:4(凡人上限:3)。恭喜宿主突破凡人阈值。”
周明的手在键盘上停了一秒。凡人上限是3,他到了4。也就是说,他现在已经不是“普通凡人”了——虽然离修仙还差着好几个境界,但起码在系统眼里,他比普通人多了一点东西。
“你在想什么?”王胖子问。
“我在想,”周明重新开始敲键盘,“凡人之上是什么。”
“是……”
“是修仙。”周明替他说完了,“走吧,还剩十三小时。”
窗外,马路对面的路灯下,那辆黑色轿车依然停着。副驾驶座的窗户开了一条缝,一支长焦镜头从缝隙里探出来,调整了焦距。镜头的准星对准了周明的工位方向——刚好捕捉到他头顶最后一缕青烟消散时,那层在空气中短暂成型的、光晕状的轮廓。
监视者的手在发抖。
他放下相机,拿起对讲机,声音压得很低:“钱总……他头顶冒烟了。青的。不像是……不像是特效。”
对讲机里沉默了十秒。
然后钱总的声音传回来,冷静、不急不缓、带着一层令人不寒而栗的好奇:“拍下来了?”
“拍了。”
“发给我。”
第三天清晨六点。距离上线截止还有六个小时。
周明的工位成了整层楼唯一还在运转的灯塔。其他人已经轮流睡过第二轮了,只有他始终坐在那把椅子上,后背离开靠背的时长不超过连续二十分钟。他的脸色发白,嘴唇发干,眼袋浮肿得像两块口袋饼,但他的手指始终保持着那个固定的节奏——不快不慢、不紧不松、像一台设计完美的节拍器。
系统面板上【修炼值】已经跳到了96%。
他的头顶没有烟了。取而代之的是一种肉眼可见的微光——不是头顶亮起来,是整个人边缘有一层淡淡的金色轮廓,像逆光摄影时才会出现的那种描边光。他在代码里行走了整整两天两夜,把甲方那个“三天内上线新功能”的需求拆解成了三百七十二个任务单元,然后把其中三百七十一个已经完成了。
还有一个。服务器报错。
报错出现在距离上线还有一个小时的时刻。前端小李把代码推送到测试环境时,弹出了一条红色的错误信息。那条信息一出现,整个小组的呼吸都停了。
“这个报错我从来没……”后端小张站起来看了一眼,又坐回去,因为他也不知道怎么解决,“我们可能需要回滚三个版本。”
回滚三个版本意味着重新部署。重新部署意味着至少四小时。四小时意味着项目延期。延期意味着甲方解约。
所有人的目光都落在周明身上。
周明盯着屏幕上那行报错信息看了十秒。然后他站起来,走到小李的工位后面,俯身看她的屏幕。他的眼睛——那对已经四十八小时没合过的眼睛——扫过报错信息的时候,眼底闪过一丝只有他自己能看见的金色。
那是系统给予的“需求洞察眼”在发挥作用。它在报错信息的底层代码里看到了一个微小的、几乎不可察觉的字符错误——某处多了一个空格。不是语法错误,不是逻辑错误,只是一个空格。在多行代码之间的空白区域,一个不应该存在的空格让整个接口识别失败了。
周明伸手按住了小李的键盘。
他的食指在屏幕上划了一下,光标精准地停在了那个空格前面。然后他按了一下Delete。
报错消失了。
“就一个空格?”小李难以置信地眨了好几次眼,“我一个空格?”
“一个空格,”周明直起腰来,“少了一个分号。中间多了个空格。”
“我检查了十遍……”
“正常,”周明说,“空格不会显示在编辑器里。你检查十遍也看不见它。但服务器能看见。”
整个小组安静了一秒。然后王胖子第一个笑了,接着小张、小李、运营妹子都笑了。那是一种劫后余生、死里逃生、从地狱门口被一把拽回来之后才会发出的、带着砂砾感的笑声。
九点整,项目正式上线。甲方发来了感谢邮件,语气热情得跟三天前的鬼脸判若两人。系统面板弹出一条金色提示:“集体天劫渡劫成功。团队经验+500。周明额外奖励:悟性+1。当前悟性值:5。”
周明瘫在了椅子上。他的后背终于碰到了靠背,整个人像一块被从墙上敲下来的砖头一样陷进椅垫里。王胖子递过来一瓶可乐——瓶盖已经拧开了,气泡在瓶口嘶嘶作响。
“庆功酒,”他说,“虽然不是酒。”
周明接过来喝了一口。气泡在舌头上炸开,糖分顺着食道往下淌。他看着落地窗外渐渐亮起来的天色,看着太阳从楼群之间升起来,像一枚被挤出来的蛋黄。
“明天复盘,”他说,“今天回去睡觉。”
他站起来走了三步。然后他的手机震了一下——短信提示。他低头看了一眼,是那个未知号码。
一张照片。照片里是他自己,坐在工位上,头顶冒青烟。拍摄角度很精准,距离大约三十米,隔着一条街道和一道玻璃幕墙。照片的像素很高,能看清他头上那缕烟的颜色和形状。
短信只有一行字:“钱总说,查查你什么来路。”
周明把手机放回口袋,继续走。他走出写字楼大门时,阳光打在他脸上,暖得不像这个季节该有的温度。他眯着眼看了一眼马路对面——黑色轿车还在。
他没停。继续往地铁站方向走。
但周明知道,明天还有另一件事等着他。
他回到出租屋的时候是上午十点,拉上窗帘倒头就睡,一口气睡了十二个小时。再醒来时是晚上十点,手机里有十七条未读消息——十三条是工作无关的,四条是工作相关的。
其中的一条是前端小李发来的:“明哥,早上我看了一眼代码库,好像有人动过咱们的项目文件。你确认一下?”
周明坐起来。他打开电脑登录代码库,翻看了提交记录。有一份提交记录的时间戳是凌晨三点——凌晨三点,那时候他正忙着修服务器,不可能提交代码。
提交人的账号显示是“同事李浩”。
周明看着那个名字皱了皱眉。李浩是隔壁组的开发,跟他的项目完全无关。凌晨三点,一个无关人员,用他自己的账号,提交了一份改动到周明小组的代码库。
他点开那份改动的具体内容。改动很小——删了四行注释。四行注释看起来跟代码逻辑无关,但那四行注释里藏着一句返回错误信息的提示。删掉之后,程序出错时会报一个完全不同的错误码,那个错误码在他们的接口文档里根本不存在。
周明合上电脑。他靠在床头,看着天花板上的裂纹,把那三个字在嘴里过了两遍。
“李浩。”
他的声音不大,但足够清晰。天花板上的裂纹在幽暗的灯光下看起来像一张笑脸。
“明天复盘会上见。”