第三十天的凌晨,马飞是在机房地板上醒来的。
他身下垫着两只拆开的纸箱,头枕一卷还没用完的网线。空调风从机柜底下钻出来,吹得左肩发麻。他睁眼时,先看见服务器指示灯在黑暗里有节奏地闪,随后才听见有人用钥匙轻轻敲铁门。
苏雨桐站在外面,另一只手提着保温桶。
“你不是答应只值前半夜?”她问。
马飞坐起来,脖子僵得转不动:“林师傅家里孩子发烧,我替到早上。”
“哪位林师傅?”
“机房夜班电工,不是我们的人。”
“所以你连机房电工的班也替?”
“他没让我替。我只是留下看切换。”
苏雨桐把门打开,将保温桶塞进他怀里。里面是小米粥和两个茶叶蛋,粥已经不烫,表面结了一层薄薄的米油。她本来要赶早班车去学校交材料,绕到机房只为确认第三十天最后一次发布。
“先吃。”她说,“你手在抖。”
“冷的。”
“七月的北京,你说冷?”
马飞低头剥蛋壳。第一块没剥好,连蛋白一起带下来。他确实累了。过去一个月,星辰把值班从“谁正好没回家”改成正式轮班,创始人却仍在所有空格里写自己的名字。别人不敢填的凌晨,他填;发布窗口,他填;周末,他也填。
表面上,这是最可靠的人守最危险的时段。实际上,公司仍把能否平安过夜绑在一个人的清醒上。
苏雨桐从包里取出值班表,摊在纸箱上。马飞的名字出现十七次,超过其他人总和。
“连续三十天服务,不是让你连续三十天不睡。”她说。
“过了今天再调。”
“每次都过了今天再调。”
她的语气不重,马飞反而不知道怎样辩解。他喝了一口粥,米粒软得几乎没有形状。小时候母亲也会在他生病时煮这种粥,熬得太稠,就添一勺凉水,说这样好入口。
“谁煮的?”他问。
“宿舍楼下的早点摊。”
“我还以为——”
“以为什么?”
“没什么。”
苏雨桐看了他一眼,把另一只茶叶蛋拿走:“那你少吃一个。”
凌晨三点整,候选索引开始校验。这是连续服务目标期内的最后一次计划发布。过去二十九天,他们经历过线路抖动、磁盘告警、恶意抓取和一次误删缓存目录,却没有再出现无法说明的长时间空白页。
第三十天偏偏不肯安静。
三点零七分,备用端口的固定测试集中,有两条查询返回的中文摘要缺了最后一个字。正文内容没有损坏,标题和地址也正常,但摘要边界在新版本里发生变化。
值班学生拿着电话请示:“要不要切?不影响找结果。”
马飞看表。按计划,三点十五分前不切,就要等到下一天。距离“连续三十天”完整闭合只差不到五个小时。如果放弃发布,旧索引继续服务不算中断;如果带着小问题切换,指标也未必马上变差。
真正让人犹豫的,是墙上那张倒计时。
三十天目标结束后,陈维明约了潜在客户来公司。宣传材料已经印好,写着“连续三十天稳定在线”。任何人都不愿在最后几小时承认候选版本不能发。
“不切。”苏雨桐说。
学生在电话里等马飞决定。
马飞盯着两条少字的摘要。问题很小,小到用户也许不会投诉。但星辰在发布流程里写的是:固定测试集全部通过。规则如果只在顺利时有效,就不叫规则。
“取消这次发布,旧版继续服务。”他说,“候选目录保留,白天查摘要边界。”
三点十二分,发布记录写上“未通过”。服务器没有重启,用户也没有感到变化。第三十天仍在继续,只是墙上的记录多了一笔不漂亮的失败。
苏雨桐赶去学校前,把值班表从纸箱上收起:“下午我回来开会。不是庆功,先改轮班。”
“你论文材料交完了?”
“今天交。”
马飞这才想起,她为了公司凌晨赶来之后,还要挤一个多小时公共汽车去学校。星辰的三十天也从她的生活里拿走了许多清晨与周末。
“我送你。”他说。
“你先回去洗澡。”她皱了皱鼻子,“机房味都腌进衣服了。”
早上七点,马飞离开机房。阳光已经晒热路面,早点摊前排着队。他在公共浴室洗完澡,回到自己租住的小房间,只来得及把湿毛巾搭到椅背,就倒在床上睡着。
十一点,电话把他吵醒。
母亲从老家打来,问上次寄去的咸菜收到了没有。马飞看向门边,包裹还原样放着,麻绳都没解。
“收到了。”他说。
“吃了?”
“吃了。”
“萝卜咸不咸?”
他答不出来。
电话那边沉默两秒。母亲没有拆穿,只说天热,开罐后要放凉处,别舍不得吃坏了。然后问公司忙不忙,身体怎么样。
马飞看着窗台上一排空方便面盒,忽然觉得“挺好”两个字说不出口。
“忙。”他说,“但能做下去。”
“能做也得睡觉。”
这句话与苏雨桐早晨说的一样。马飞笑了一声,答应今晚不去机房。挂电话后,他拆开包裹。玻璃罐外裹着旧毛衣,旁边塞了两包晒干的石榴花。母亲在纸条上写,泡水喝,去火。
下午的会议没有蛋糕,也没有香槟。陈维明买了两串冰棍,走到公司时化了一半,白色糖水顺着塑料袋往下滴。每个人拿一根,剩下的放在搪瓷盆里,盆底很快积了一汪甜水。
墙上的大钟走到四点十六分,距离正式上线恰好三十天。
值班学生鼓掌,陈维明也拍了两下。马飞把最终统计贴出来:三十天内没有全站中断;发生三次局部降级,最长四十三分钟;计划维护两次,均提前公告;有效请求可用率逐周提高;仍有七次失败原因不能完全确认。
“这算不算连续三十天不关机?”兼职学生问。
“机器有过计划重启。”苏雨桐说,“但用户总有一套可用的旧索引服务。我们完成的是连续可用,不是永不关机。”
陈维明拿起已经印好的宣传页。那句“连续三十天稳定在线”太容易让人理解成零故障。新印一批要花钱,直接用又违背刚建立的口径。
他掏出钢笔,在“稳定在线”后逐张补了一颗小星号。
页脚写:含两次公告维护与三次局部降级,详细口径可索取。
五十多张宣传页,他写到第二十张时手腕就酸了。苏雨桐把剩下的一半拿过去,两人一个写前半,一个写后半。
“下次印之前先看数据。”陈维明说。
“这句话应该贴在你桌上。”苏雨桐回答。
冰棍吃完,庆祝也就结束了。真正的会议开始讨论轮班。
马飞提出自己继续负责所有发布窗口,被一致否决。值班学生说,如果流程只有马总敢操作,说明手册没写完;苏雨桐则把十七次夜班圈出来,要求任何人一周不得连续值两个通宵,创始人也包括在内。
“出了事谁负责?”马飞问。
“当班人按流程处置,重大变化两人确认。”苏雨桐说,“你负责让系统不依赖你。”
这句话刺得他不舒服。前世在火箭项目里,责任曾被层层分割,最终没有人看见完整事故链。他重生后本能地想把所有关键环节握在自己手里,以为这样就不会再漏掉那三点七秒。
可一个靠某个人永远清醒才安全的系统,本身就是另一种事故隐患。
马飞沉默许久,把发布权限表推到桌子中央:“两周内,至少三个人能独立完成回退。我不在场也要演练一次。”
“这才是三十天之后该做的事。”苏雨桐说。
傍晚,他们去街口吃饭。小馆里没有空调,老板把电风扇架在冰柜上,吹得菜单啪啪作响。陈维明坚持点一道红烧肉,说合同回款快到了,不该再用凉面庆祝。
菜上来后,众人却先抢拍黄瓜。红烧肉肥得发亮,谁吃两块都慢下来。
苏雨桐从包里拿出学校的材料回执,放到桌上。她的论文手续终于办完,接下来可以选择留校参与课题,也可以把更多时间放到星辰。
“你怎么选?”马飞问。
“还没选。”
“公司需要你。”
“学校也有我自己的题。”
她说得平静,桌上的人却都听懂了。七个百分点的权益和核心负责人身份,没有让她自动放弃另一条路。
马飞夹了一块肉,放到自己碗里:“那就按你原来的条件,先把两边时间写清楚。不是今晚决定。”
苏雨桐看着他,眼神松了一点:“你今天学会两件事。”
“哪两件?”
“服务器可以关,人也可以下班。”
“还有呢?”
“不知道。第二件等你真做到再说。”
众人笑起来。饭后马飞按承诺没有去机房。他提着母亲寄来的咸菜回公司,把罐子放进阴凉的资料柜下层,又在上面贴了一张纸:私人食物,非公司资产。
第二天,所有人都拿这张纸取笑他。
第三十天已经过去,服务器仍在运行。但墙上的倒计时被取下来,换成一张没有终点的轮班表。
马飞终于明白,稳定不是咬牙撑过一个纪念日。
它是允许机器维护,允许人睡觉,允许一次候选发布在最后时刻被诚实地判定失败;也是在创始人不在机房时,系统仍能按同一套证据和规则继续运转。
这比“不关机”难得多。
也比一个漂亮的数字,更接近一家真正能活下去的公司。