
第一章:邮件
凌晨两点十七分,陈屿的屏幕上跳出了那封邮件。
他本来不该在这个时间还醒着。三年来他的作息精确得像一段cron表达式——晚上十一点半关机,早上七点十分闹钟,七点四十出门,八点二十到公司。误差不超过五分钟。同事们私底下叫他"瑞士人",不是因为他有什么瑞士血统,而是他的生活像瑞士钟表一样无聊。
但今晚不一样。今晚他在追一个线上bug。
支付系统在高峰期偶尔会扣两次款,概率大约万分之三。用户投诉了两周,测试环境怎么都复现不了。陈屿从下午四点一直蹲到凌晨,终于在日志的犄角旮旯里找到了那条诡异的并发请求——两个线程几乎在同一毫秒抢到了同一把锁,导致事务被提交了两次。
这种bug就像蚊子,你知道它在,但你打不到它。等你终于一巴掌拍下去的时候,已经凌晨了。
他刚把修复代码push上去,邮件客户端弹了个通知。
发件人:null@void.nowhere
标题只有一行字:明天会发生三件事。
陈屿盯着屏幕看了几秒钟。垃圾邮件?钓鱼?他鼠标悬停在删除键上,但没有按下去。
他的职业本能让他打开了邮件正文。干安全相关工作久了的人,多少都有点受虐倾向——看到可疑的东西,第一反应不是逃,是凑上去看。
正文很短,只有三行:
1. 1.上午10:23,国贸地铁站B口,一个穿灰色风衣的男人会摔倒。
2. 2.下午3:15,望京SOHO T3楼下,一辆白色特斯拉会被追尾。
3. 3.晚上8:07,三里屯太古里北区,一个卖花的老太太会心脏病发作。
每一条都精确到分钟。没有解释,没有署名,没有威胁。就像一份备忘录,或者一份待办清单。
陈屿的第一反应是恶作剧。有人搞到了他的邮箱地址,发一封神神叨的邮件来吓唬人。这年头邮箱泄露太正常了,他的邮箱大概在某个暗网的数据库里被卖了不知道多少次。
他把邮件标记为垃圾邮件,关掉客户端,继续看代码。
但那三行字像钉子一样钉在他脑子里。"一个穿灰色风衣的男人会摔倒。"这太具体了。不是"明天会下雨"或者"股市会跌"这种怎么都能蒙对的模糊预测。是精确到分钟、精确到地点、精确到穿着的描述。骗子一般不会写得这么具体,因为太容易被证伪。
他重新打开邮件,仔细检查了邮件头。IP地址:0.0.0。这不可能。0.0.0是一个特殊的地址,代表"本机"或者"无效地址"。一封来自0.0.0的邮件,意味着发件人根本没有暴露任何真实信息。
他用命令行查了MX记录——void.nowhere这个域名根本不存在。一个不存在的域名发出来的邮件,理论上应该被所有邮件服务器拒收。但它就是出现在了他的收件箱里。
这不合理。
陈屿坐在椅子上,盯着天花板。他知道这件事只有三种可能。第一,有人入侵了他的邮箱服务器,直接在数据库里插入了这条邮件记录,绕过了所有正常投递流程。这需要极高的权限和技术能力。第二,有人在他的电脑上做了手脚,在客户端层面伪造了这条通知。第三——第三种可能他不愿意想。
他关掉电脑,躺到床上,盯着天花板上的裂纹。三点十五分,他终于睡着了。
早上七点十分,闹钟准时响起。陈屿按掉闹钟,洗漱,换衣服,出门。一切照常。他告诉自己那封邮件就是个恶作剧,不值得浪费时间。
地铁上他刷了会儿技术新闻。有人在讨论一个新的Rust编译器优化,据说能把编译速度提升40%。他读了两段,发现自己完全没在看。他脑子里一直在回放那三行字。
国贸地铁站B口。上午十点二十三分。灰色风衣。他看了一眼手表。八点四十五分。离十点二十三还有一小时三十八分钟。
公司楼下他买了杯美式咖啡,走进电梯。办公室里已经有几个人了,李工在调试一个接口,小赵在开早会。陈屿坐到自己工位上,打开IDE,但一行代码都没写。
九点四十,他站了起来。"出去一趟。"他对旁边的小赵说。"啊?你早会不开了?""帮我请个假。"他没等小赵回答就走了出去。
国贸站B口,十点二十三。他十点十分到了现场,站在B口外面的天桥上,俯视着出站口。早高峰已经过了,人流稀疏下来。
十点十八。没有人穿灰色风衣经过。十点二十。还是没有。他开始觉得自己确实疯了。
十点二十二分四十秒。一个男人从地铁站里走出来。灰色风衣,深色裤子,手里拎着一个公文包。他看起来四十岁左右,头发有点秃,走路的姿势很普通。
陈屿的呼吸停了。
男人走到B口外面的人行道上,忽然——他的左脚绊到了一块松动的地砖。身体向前倾倒,公文包飞了出去,文件散了一地。旁边一个女孩尖叫了一声,另一个路过的男人伸手去扶他。
十点二十三分。
陈屿站在天桥上,浑身发冷。他说服自己:这不难预测。地铁口地砖松动是常见问题。巧合而已。
他走下天桥,挤进地铁,回到公司。整个下午他都心神不宁。他在等下午三点十五分。
望京SOHO T3楼下。白色特斯拉。追尾。他没有去现场。他打开了望京SOHO附近的几个交通摄像头——当然这是非法的,但他认识一个在交管局做系统维护的朋友,之前帮对方修过一个数据库问题,对方给了他一个内部API的测试账号。
三点十分,他盯着T3楼下的实时画面。三点十三分,一辆白色特斯拉Model 3从画面左侧驶入,停在路口等红灯。三点十四分。三点十五分零四秒。一辆银色丰田从后面撞了上来。
陈屿的手在发抖。两次了。精确到车型、精确到颜色、精确到秒级的时间。这不是巧合能做到的范围。
他看了一眼时间。下午三点四十。还有四个半小时。
他面临一个选择。他可以什么都不做,等到晚上八点零七分,看看第三个预测是否也会应验。如果应验了——那意味着一个老太太会在他眼皮底下心脏病发作,而他本来可以做点什么。他也可以现在就去三里屯,找到那个卖花的老太太,提前叫好救护车。
他想了一会儿,做出了决定。他要去三里屯。但他不会干预。他会找到那个老太太,待在附近,等八点零七分。如果她真的发病,他就叫救护车。
六点钟他从公司出发,坐地铁到了团结湖站,步行到太古里北区。三月底的北京,天黑得晚,六点多还亮着。陈屿在北区转了两圈,没有看到卖花的老太太。
七点。天渐渐暗下来。七点半。他走累了,在一家奶茶店门口的长椅上坐下。七点五十分。他站起来,开始在北区的主要通道上慢慢走。
八点零二分。他在北区东侧的一条小巷里看到了她。
一个老太太,大概七十多岁,坐在一个小马扎上,面前摆着一篮子花。玫瑰、百合、康乃馨,都用保鲜膜包着。她穿着一件深蓝色的棉袄,头发全白了,脸上皱纹很深。
陈屿在她对面大约十米的地方站住了。他看了看手表。八点零四分。他开始数秒。
八点零五。八点零六。八点零六分三十秒。
老太太忽然皱了皱眉,抬手捂住了胸口。她的笑容消失了,嘴唇开始发白。她试图站起来,但腿一软,又坐了回去。花篮倒了,花散了一地。
八点零七分。
陈屿冲了过去。他一手扶住老太太,一手掏出手机拨120。"太古里北区东侧,老人心脏病发作,需要急救——"他的声音很稳,手也很稳,但他的脑子一片空白。
周围有人围了过来。一个年轻人说他学过急救,开始做心肺复苏。另一个女孩帮忙把散落的花收拢到一边。十五分钟后,救护车到了。
三件事。全中。不是巧合。不是运气。不是蒙的。有人——或者有什么东西——知道未来。而且精确到分钟。
他深吸了一口气。然后他做了一件很不"瑞士人"的事——他回了那封邮件。他打了一行字:你是谁?
三秒钟后,他的手机震动了一下。新邮件。发件人:null@void.nowhere。标题:你会知道的。正文:第二封邮件将于48小时后送达。请保持在线。