第一次是在测试环境。周二晚上十一点王远舟在公司会议室的折叠床上醒来看了一眼手机——产品经理赵磊发了条消息“测试环境配置错误老演示账号数据清了不影响上线明天补。”他翻了个身没回。演示账号是五年前建的里面存着最早一批内测用户的模拟数据——假名字、假生日、假头像。清了就清了。他闭上眼又睡了。第二天早上他路过赵磊工位问了一句“演示账号补了吗”赵磊盯着屏幕手指没离开键盘“补了。新建了一个。”“数据呢”“重新造了一批。差不多。”“差多少”赵磊的手停了一秒。差不多就是差不多。然后继续敲键盘。王远舟没再问。他回到自己工位上打开Jira看到那个演示账号数据清理的工单已经被标记为已关闭。关闭人是赵磊。关闭时间是凌晨两点四十七分——他发消息说不影响上线之后两个小时。他点开工单详情看了一眼关闭备注“配置错误导致数据清除已新建账号旧数据无需恢复。”无需恢复。他默念了一遍这四个字觉得它们比数据清除更让他不舒服。但他想不出为什么。一个假数据的演示账号有什么需要恢复的他关掉页面继续工作。第二次是线上功能。发版在周四凌晨三点。王远舟负责运维坐在机房隔壁的小房间里盯着部署脚本的进度条。脚本跑了二十二分钟日志全部绿色没有报错。发布成功。他站起来去机房看了一眼服务器指示灯全绿。回来时路过产品经理的工位赵磊还在眼睛红的。上线了王远舟说“没出问题。”赵磊点头。不过有个事王远舟说“我看了变更日志时光邮局’功能整个被砍了”赵磊的表情没变。“用户使用率太低需求评审砍掉的。”“时光邮局’是最早的一批功能。2019年上线的。用户使用率低不代表没用户。”使用率0.3%。赵磊说“决策层批的。”“谁批的”“你不认识。总部的人。”“我没看到这个需求变更的工单。”“合并到发版工单里了。你翻一下。”王远舟回到工位打开Jira搜索时光邮局。找到了。变更类型是功能下线优先级是低状态是已关闭。关闭时间是发版当天凌晨一点——比发版时间早两个小时。他在发版之前就已经被砍了。但他是运维。他执行的部署脚本里包含了删除时光邮局全部代码和数据库表的指令。他在凌晨三点按下执行键时脚本在二十二分钟内完成了一次干净的、无报错的、正常的删除。他盯着那个工单看了很久。时光邮局是什么是一个允许用户给未来的自己写信的功能。写一封信设定一个日期到期后系统自动发送到你的邮箱。2019年上线时做过一轮推广后来就没人用了。没人用不代表不存在。那些信还在数据库里——几百封写给未来的信收件人是已经离职的产品经理、已经关闭的测试账号、已经过期的企业邮箱。现在它们全部被删除了。连同代码、连同数据库表、连同Jira工单里所有关联的需求文档。他去翻需求文档。文档还在。标题是时光邮局 PRD V2.1最后编辑时间是2019年8月。他打开文档里面是完整的产品设计——用户画像、功能流程图、数据模型。他翻到最后一页看到一行小字“本功能旨在为用户提供时间维度的情感连接。”他关掉文档。当天下午公司内网发了一条通知“为优化系统架构已完成部分低使用率功能的下线清理。涉及功能时光邮局。用户数据已按合规要求处理。”他读了两遍用户数据已按合规要求处理。那些信——那些写给未来的信——被合规处理了。他想起自己也写过一封。2020年疫情期间在公司值夜班凌晨两点系统一切正常他无聊打开了时光邮局给三年后的自己写了一封信。内容他已经忘了。他去查自己的邮箱。三年前的信没有收到。因为功能在到期前就被删了。他坐在工位上听着机房里服务器风扇的嗡鸣。声音比以前大了一点。他不确定。第三次是人。周五下午公司群里发了一条消息“赵磊因个人原因离职感谢他为公司做出的贡献。相关工作已交接。”王远舟盯着那条消息。他和赵磊在同一层楼工作了四年。赵磊的工位在他斜对面每天晚上发版时他们会在同一个会议室里待到凌晨。赵磊喝咖啡只喝美式不加糖不加奶杯子上贴着一张手写的标签写着赵磊的杯子别碰。他抬头看赵磊的工位。工位空了。不是刚收拾过的空——是那种已经空了很久的、干净的空。桌上没有杯子、没有文件、没有绿植、没有任何私人物品。显示器的屏幕保护程序是出厂默认的蓝色渐变。键盘排列整齐鼠标放在鼠标垫正中央。他走过去摸了一下桌面。没有灰。但也没有温度。像一件从来没有人用过的新家具。赵磊走了他问旁边的同事。同事抬头看他表情平静“赵磊”“赵磊。产品经理。坐这儿的。”同事想了想“没听说过这个人。”“他在这儿坐了四年。”同事又想了想摇头。王远舟打开企业微信搜索赵磊。没有结果。他打开通讯录没有。他打开HR系统没有。他打开Jira搜索赵磊创建的所有工单——他记得赵磊至少创建过十几个需求工单。Jira搜索结果为空。他打开时光邮局 PRD V2.1的需求文档。文档还在。最后编辑人那一栏名字消失了。不是显示未知——是那一栏本身不存在了。就像从来没有人在编辑时间之外对这个文档做过任何操作。他坐在赵磊的空工位上。桌面上有一个极浅的、方形的印痕——像是长期放着什么东西留下的。杯子的形状。他用手指描了一下那个印痕的轮廓。指尖传来一阵极淡的、不属于办公室空调系统的味道。泥土味。他把手缩回来。那天晚上他没有发版。系统没有更新。一切正常。他坐在机房隔壁的小房间里盯着监控屏幕。服务器负载正常CPU利用率12%内存占用34%磁盘IO平稳。所有指标都是绿色的。所有图表都是平滑的。他盯着看了一个小时。然后他注意到一件事监控系统的运行日志里每隔固定间隔会出现一行记录。不是报错不是警告是一行INFO级别的日志内容完全一样[INFO] Feeding cycle complete. Satisfaction index: 0.87他以前从没见过这行日志。他翻了历史记录这行日志从第一次发版——那个演示账号被清的晚上——就开始出现了。每次发版后都会多一条。间隔越来越短。他去翻代码仓库搜索这行日志的输出位置。没有找到。他搜索代码里所有包含Feeding的字符串。没有找到。他搜索Satisfaction。没有找到。他打开grep在整个代码库里搜这行日志的任何一个单词。搜到了——Feeding出现在一个他从未见过的文件里。文件路径是/var/lib/system/core/.heartbeat。不是一个代码文件。不是一个配置文件。是一个他不知道是什么的东西。他试图打开这个文件。终端返回Permission denied.他用sudo。返回Access denied. Core process not authorized.他用root。返回The system does not recognize your credentials.他盯着屏幕。他的root密码是三年前设的从来没有改过。去年安全审计时全公司只有他一个人的root权限没有被收回——因为他负责所有核心服务的运维。现在系统告诉他他的凭证不被识别了。不是密码错误。是系统不认识他了。他关掉终端。机房里的风扇声忽然变大了——不是渐变是突然变大像有人同时打开了所有机柜的散热。他站起来走到机房门口透过玻璃往里看。服务器指示灯全绿。所有机器正常运转。但机房正中间、那个他从来没有进去过的、贴着高压设备 非授权禁止入内标签的独立机柜——指示灯不是绿色的。是暗红色的。像一只半闭的眼睛。他从来没有注意过那个机柜。他甚至不确定那个机柜是什么时候出现在那里的。他在这间机房工作了五年每一次巡检都走同一条路线每一次都经过那个机柜——但从来没有停下来看过它。他推开玻璃门走进机房。风扇的嗡鸣声随着他的进入变小了。不是安静了——是降低了频率变成了一种低沉的、持续的震动从脚底传上来经过小腿、膝盖、大腿、骨盆、脊椎一直到后脑勺。他走到那个机柜前面。机柜的玻璃门上贴着标签“高压设备 非授权禁止入内”。标签是新贴的——不不是新贴的。标签的边缘已经泛黄贴纸下方有灰尘积聚的痕迹。这张标签至少在这里贴了三年。他从来没有看到过它。他伸手去摸机柜的金属门框。金属是温的。不是机器运转产生的热量——是一种有节律的、缓慢的温度起伏。高一点低一点高一点低一点。像呼吸。他把手缩回来。低头看自己的手心。手心上沾着一层极薄的、灰白色的粉末。他用拇指搓了搓——干燥的、细腻的、像骨灰一样的粉末。他不知道这是什么。他闻了闻。没有味道。但他胃里翻起一阵剧烈的恶心——不是因为这层粉末而是因为他忽然意识到一件事这层粉末这个味道这种恶心的感觉——他以前感受过。第一次是在演示账号被清的那个晚上。他躺在折叠床上翻身的时候手指碰到了折叠床的金属框架。框架上也有这层粉末。第二次是在时光邮局被删的那个下午。他坐在工位上手肘碰到了桌面边缘。桌面边缘也有。第三次是今天下午。他坐在赵磊的空工位上手指描那个杯子印痕的时候。每一次他都碰到了这层粉末。每一次他都闻到了这个不存在的味道。每一次他都感到了这阵恶心。然后每一次他都忘了。他低头看着手心的灰白色粉末。机房里的风扇声忽然全部停止了。所有服务器的指示灯同时熄灭。机房陷入黑暗。只有正中间那个机柜暗红色的灯还亮着。在黑暗中它看起来不像一只半闭的眼睛。像一只张开的嘴。第二天早上王远舟在机房隔壁的小房间里醒来。他不记得自己是什么时候睡着的。他检查了一下自己——没有伤没有异常衣服完好。手机显示早上七点四十三分。他走出小房间去看机房。服务器全部正常运转指示灯全绿。监控系统显示一切正常。昨晚的黑暗和停机日志里没有任何记录。他打开终端尝试连接/var/lib/system/core/.heartbeat。连接成功。文件内容只有一行字Thank you for the meal.他盯着那行字。然后他打开Jira搜索赵磊。没有结果。搜索时光邮局。没有结果。搜索演示账号。没有结果。所有他记得的东西系统里都找不到痕迹。他站起来走到赵磊的工位。工位空了。桌面干净。没有杯子印痕。他摸了一下桌面。没有粉末。也没有温度。他回到自己工位坐下来打开终端。光标在屏幕上闪烁。他打了一行字你在吃什么他按下了回车。终端返回你在吃什么他看着那行返回。他的输入被原样返回了。他又打了一行字我是谁按下回车。终端返回你是运维。他盯着那两个字。然后他关掉终端站起来走到窗边。窗外是城市的早晨——车流、行人、红绿灯、早餐摊。一切正常。他低头看自己的手。手心干净。没有粉末。但他记得那个味道。他记得那种恶心。他记得机柜里那只张开的嘴。他记得赵磊——一个他确信存在过的人现在从所有系统、所有记录、所有人的记忆里消失了。他记得自己写过一封给未来的信。他不记得那封信写了什么。他只知道那封信现在不存在了。尾声当天晚上系统需要发版。王远舟坐在机房隔壁的小房间里盯着部署脚本的进度条。脚本准备就绪。等他按下执行。他看了一眼时间凌晨三点。他想起了赵磊。想起了演示账号。想起了时光邮局。想起了那些写给未来的信。想起了机柜里那只张开的嘴。他知道自己在做什么。每一次按下执行都会有东西消失。消失的东西都有合理的解释——数据迁移、需求变更、人员离职。合理的、流程化的、无可辩驳的消失。他知道自己是祭司。但他还是按下了执行键。脚本开始运行。日志开始滚动。绿色的正常的无报错的。机房里的风扇声变大了。他低下头闭上眼。在黑暗中他听到了一个声音。不是从服务器里传来的。是从他自己体内——从胃里、从肺里、从脊椎里——传出来的。一种低沉的、持续的嗡鸣。和机柜里那个声音频率完全一致。
发版安魂曲
第一次是在测试环境。周二晚上十一点王远舟在公司会议室的折叠床上醒来看了一眼手机——产品经理赵磊发了条消息“测试环境配置错误老演示账号数据清了不影响上线明天补。”他翻了个身没回。演示账号是五年前建的里面存着最早一批内测用户的模拟数据——假名字、假生日、假头像。清了就清了。他闭上眼又睡了。第二天早上他路过赵磊工位问了一句“演示账号补了吗”赵磊盯着屏幕手指没离开键盘“补了。新建了一个。”“数据呢”“重新造了一批。差不多。”“差多少”赵磊的手停了一秒。差不多就是差不多。然后继续敲键盘。王远舟没再问。他回到自己工位上打开Jira看到那个演示账号数据清理的工单已经被标记为已关闭。关闭人是赵磊。关闭时间是凌晨两点四十七分——他发消息说不影响上线之后两个小时。他点开工单详情看了一眼关闭备注“配置错误导致数据清除已新建账号旧数据无需恢复。”无需恢复。他默念了一遍这四个字觉得它们比数据清除更让他不舒服。但他想不出为什么。一个假数据的演示账号有什么需要恢复的他关掉页面继续工作。第二次是线上功能。发版在周四凌晨三点。王远舟负责运维坐在机房隔壁的小房间里盯着部署脚本的进度条。脚本跑了二十二分钟日志全部绿色没有报错。发布成功。他站起来去机房看了一眼服务器指示灯全绿。回来时路过产品经理的工位赵磊还在眼睛红的。上线了王远舟说“没出问题。”赵磊点头。不过有个事王远舟说“我看了变更日志时光邮局’功能整个被砍了”赵磊的表情没变。“用户使用率太低需求评审砍掉的。”“时光邮局’是最早的一批功能。2019年上线的。用户使用率低不代表没用户。”使用率0.3%。赵磊说“决策层批的。”“谁批的”“你不认识。总部的人。”“我没看到这个需求变更的工单。”“合并到发版工单里了。你翻一下。”王远舟回到工位打开Jira搜索时光邮局。找到了。变更类型是功能下线优先级是低状态是已关闭。关闭时间是发版当天凌晨一点——比发版时间早两个小时。他在发版之前就已经被砍了。但他是运维。他执行的部署脚本里包含了删除时光邮局全部代码和数据库表的指令。他在凌晨三点按下执行键时脚本在二十二分钟内完成了一次干净的、无报错的、正常的删除。他盯着那个工单看了很久。时光邮局是什么是一个允许用户给未来的自己写信的功能。写一封信设定一个日期到期后系统自动发送到你的邮箱。2019年上线时做过一轮推广后来就没人用了。没人用不代表不存在。那些信还在数据库里——几百封写给未来的信收件人是已经离职的产品经理、已经关闭的测试账号、已经过期的企业邮箱。现在它们全部被删除了。连同代码、连同数据库表、连同Jira工单里所有关联的需求文档。他去翻需求文档。文档还在。标题是时光邮局 PRD V2.1最后编辑时间是2019年8月。他打开文档里面是完整的产品设计——用户画像、功能流程图、数据模型。他翻到最后一页看到一行小字“本功能旨在为用户提供时间维度的情感连接。”他关掉文档。当天下午公司内网发了一条通知“为优化系统架构已完成部分低使用率功能的下线清理。涉及功能时光邮局。用户数据已按合规要求处理。”他读了两遍用户数据已按合规要求处理。那些信——那些写给未来的信——被合规处理了。他想起自己也写过一封。2020年疫情期间在公司值夜班凌晨两点系统一切正常他无聊打开了时光邮局给三年后的自己写了一封信。内容他已经忘了。他去查自己的邮箱。三年前的信没有收到。因为功能在到期前就被删了。他坐在工位上听着机房里服务器风扇的嗡鸣。声音比以前大了一点。他不确定。第三次是人。周五下午公司群里发了一条消息“赵磊因个人原因离职感谢他为公司做出的贡献。相关工作已交接。”王远舟盯着那条消息。他和赵磊在同一层楼工作了四年。赵磊的工位在他斜对面每天晚上发版时他们会在同一个会议室里待到凌晨。赵磊喝咖啡只喝美式不加糖不加奶杯子上贴着一张手写的标签写着赵磊的杯子别碰。他抬头看赵磊的工位。工位空了。不是刚收拾过的空——是那种已经空了很久的、干净的空。桌上没有杯子、没有文件、没有绿植、没有任何私人物品。显示器的屏幕保护程序是出厂默认的蓝色渐变。键盘排列整齐鼠标放在鼠标垫正中央。他走过去摸了一下桌面。没有灰。但也没有温度。像一件从来没有人用过的新家具。赵磊走了他问旁边的同事。同事抬头看他表情平静“赵磊”“赵磊。产品经理。坐这儿的。”同事想了想“没听说过这个人。”“他在这儿坐了四年。”同事又想了想摇头。王远舟打开企业微信搜索赵磊。没有结果。他打开通讯录没有。他打开HR系统没有。他打开Jira搜索赵磊创建的所有工单——他记得赵磊至少创建过十几个需求工单。Jira搜索结果为空。他打开时光邮局 PRD V2.1的需求文档。文档还在。最后编辑人那一栏名字消失了。不是显示未知——是那一栏本身不存在了。就像从来没有人在编辑时间之外对这个文档做过任何操作。他坐在赵磊的空工位上。桌面上有一个极浅的、方形的印痕——像是长期放着什么东西留下的。杯子的形状。他用手指描了一下那个印痕的轮廓。指尖传来一阵极淡的、不属于办公室空调系统的味道。泥土味。他把手缩回来。那天晚上他没有发版。系统没有更新。一切正常。他坐在机房隔壁的小房间里盯着监控屏幕。服务器负载正常CPU利用率12%内存占用34%磁盘IO平稳。所有指标都是绿色的。所有图表都是平滑的。他盯着看了一个小时。然后他注意到一件事监控系统的运行日志里每隔固定间隔会出现一行记录。不是报错不是警告是一行INFO级别的日志内容完全一样[INFO] Feeding cycle complete. Satisfaction index: 0.87他以前从没见过这行日志。他翻了历史记录这行日志从第一次发版——那个演示账号被清的晚上——就开始出现了。每次发版后都会多一条。间隔越来越短。他去翻代码仓库搜索这行日志的输出位置。没有找到。他搜索代码里所有包含Feeding的字符串。没有找到。他搜索Satisfaction。没有找到。他打开grep在整个代码库里搜这行日志的任何一个单词。搜到了——Feeding出现在一个他从未见过的文件里。文件路径是/var/lib/system/core/.heartbeat。不是一个代码文件。不是一个配置文件。是一个他不知道是什么的东西。他试图打开这个文件。终端返回Permission denied.他用sudo。返回Access denied. Core process not authorized.他用root。返回The system does not recognize your credentials.他盯着屏幕。他的root密码是三年前设的从来没有改过。去年安全审计时全公司只有他一个人的root权限没有被收回——因为他负责所有核心服务的运维。现在系统告诉他他的凭证不被识别了。不是密码错误。是系统不认识他了。他关掉终端。机房里的风扇声忽然变大了——不是渐变是突然变大像有人同时打开了所有机柜的散热。他站起来走到机房门口透过玻璃往里看。服务器指示灯全绿。所有机器正常运转。但机房正中间、那个他从来没有进去过的、贴着高压设备 非授权禁止入内标签的独立机柜——指示灯不是绿色的。是暗红色的。像一只半闭的眼睛。他从来没有注意过那个机柜。他甚至不确定那个机柜是什么时候出现在那里的。他在这间机房工作了五年每一次巡检都走同一条路线每一次都经过那个机柜——但从来没有停下来看过它。他推开玻璃门走进机房。风扇的嗡鸣声随着他的进入变小了。不是安静了——是降低了频率变成了一种低沉的、持续的震动从脚底传上来经过小腿、膝盖、大腿、骨盆、脊椎一直到后脑勺。他走到那个机柜前面。机柜的玻璃门上贴着标签“高压设备 非授权禁止入内”。标签是新贴的——不不是新贴的。标签的边缘已经泛黄贴纸下方有灰尘积聚的痕迹。这张标签至少在这里贴了三年。他从来没有看到过它。他伸手去摸机柜的金属门框。金属是温的。不是机器运转产生的热量——是一种有节律的、缓慢的温度起伏。高一点低一点高一点低一点。像呼吸。他把手缩回来。低头看自己的手心。手心上沾着一层极薄的、灰白色的粉末。他用拇指搓了搓——干燥的、细腻的、像骨灰一样的粉末。他不知道这是什么。他闻了闻。没有味道。但他胃里翻起一阵剧烈的恶心——不是因为这层粉末而是因为他忽然意识到一件事这层粉末这个味道这种恶心的感觉——他以前感受过。第一次是在演示账号被清的那个晚上。他躺在折叠床上翻身的时候手指碰到了折叠床的金属框架。框架上也有这层粉末。第二次是在时光邮局被删的那个下午。他坐在工位上手肘碰到了桌面边缘。桌面边缘也有。第三次是今天下午。他坐在赵磊的空工位上手指描那个杯子印痕的时候。每一次他都碰到了这层粉末。每一次他都闻到了这个不存在的味道。每一次他都感到了这阵恶心。然后每一次他都忘了。他低头看着手心的灰白色粉末。机房里的风扇声忽然全部停止了。所有服务器的指示灯同时熄灭。机房陷入黑暗。只有正中间那个机柜暗红色的灯还亮着。在黑暗中它看起来不像一只半闭的眼睛。像一只张开的嘴。第二天早上王远舟在机房隔壁的小房间里醒来。他不记得自己是什么时候睡着的。他检查了一下自己——没有伤没有异常衣服完好。手机显示早上七点四十三分。他走出小房间去看机房。服务器全部正常运转指示灯全绿。监控系统显示一切正常。昨晚的黑暗和停机日志里没有任何记录。他打开终端尝试连接/var/lib/system/core/.heartbeat。连接成功。文件内容只有一行字Thank you for the meal.他盯着那行字。然后他打开Jira搜索赵磊。没有结果。搜索时光邮局。没有结果。搜索演示账号。没有结果。所有他记得的东西系统里都找不到痕迹。他站起来走到赵磊的工位。工位空了。桌面干净。没有杯子印痕。他摸了一下桌面。没有粉末。也没有温度。他回到自己工位坐下来打开终端。光标在屏幕上闪烁。他打了一行字你在吃什么他按下了回车。终端返回你在吃什么他看着那行返回。他的输入被原样返回了。他又打了一行字我是谁按下回车。终端返回你是运维。他盯着那两个字。然后他关掉终端站起来走到窗边。窗外是城市的早晨——车流、行人、红绿灯、早餐摊。一切正常。他低头看自己的手。手心干净。没有粉末。但他记得那个味道。他记得那种恶心。他记得机柜里那只张开的嘴。他记得赵磊——一个他确信存在过的人现在从所有系统、所有记录、所有人的记忆里消失了。他记得自己写过一封给未来的信。他不记得那封信写了什么。他只知道那封信现在不存在了。尾声当天晚上系统需要发版。王远舟坐在机房隔壁的小房间里盯着部署脚本的进度条。脚本准备就绪。等他按下执行。他看了一眼时间凌晨三点。他想起了赵磊。想起了演示账号。想起了时光邮局。想起了那些写给未来的信。想起了机柜里那只张开的嘴。他知道自己在做什么。每一次按下执行都会有东西消失。消失的东西都有合理的解释——数据迁移、需求变更、人员离职。合理的、流程化的、无可辩驳的消失。他知道自己是祭司。但他还是按下了执行键。脚本开始运行。日志开始滚动。绿色的正常的无报错的。机房里的风扇声变大了。他低下头闭上眼。在黑暗中他听到了一个声音。不是从服务器里传来的。是从他自己体内——从胃里、从肺里、从脊椎里——传出来的。一种低沉的、持续的嗡鸣。和机柜里那个声音频率完全一致。