萤幕上的监控面板已经恢复了正常,Raft方案的曲线重新出现了,蓝色的,平稳的,像什么都没有发生过。但程司白知道发生过了。那条曲线断过,系统崩过,她崩过。曲线可以恢复,系统可以重启,但她不知道自己要多久才能恢复。
“裴衍之。”她说。
“嗯。”
“对不起。”
这三个字说出来的时候,她的声音很轻,轻到像一段被压缩过度的音频,大部分频率都丢失了,只剩下一个模糊的轮廓。但她知道他能听到。他总是能听到。
裴衍之转头看著她。窗外的光从侧面照进来,照在她的脸上,把她眼睛下面那两道阴影照得很清楚。她的头发乱了,外套的领口歪在一边,嘴唇干得起了皮。她看起来像一个刚刚经历了系统崩溃的节点——还在运行,但日志里全是警告。
“我不是要你道歉。”他说。
程司白转头看著他。他的表情很平静,平静得像在说一个他一直知道的事实。但她的眼睛里有什么东西在动——不是眼泪,是某种比眼泪更深的、被压了很久之后终于开始松动的东西。
“我是想告诉你一件事。”裴衍之把水杯放在桌上,转过身面对她,双手放在膝盖上,手掌朝上。那是一个开放的姿势——不设防,不防御,不保护自己。
“系统可以容错。”他看著她的眼睛,一个字一个字地说,“我也可以。”
程司白觉得自己的胸口被什么东西击中了。不是痛,是一种她说不清楚的感觉——像一个被她关了很久的门被打开了,光从门缝里照进来,刺眼,但她不想把门关上。她的嘴唇在抖,不是冷,是某种她控制不住的东西。她把嘴唇咬住了,不让它抖。但咬不住。那个抖动从嘴唇蔓延到下巴,从下巴蔓延到整个脸颊,从脸颊蔓延到眼眶。
她没有哭。她只是坐在那里,眼睛里有东西在闪,嘴唇在抖,手指攥著椅子边缘,指节发白。
裴衍之没有动。他只是坐在她旁边,手掌朝上,放在膝盖上。他在等她。不是等一个答案,是等她愿意。
程司白看著他的手。手掌朝上,手指微微张开,像一个空的容器——等待被填满,等待被握住,等待被选择。她想起三年前,他也是这样伸出手的。在公司楼下,在她家楼下,在每一个说“晚安”的夜晚。每一次她都看到了,每一次她都没有握。不是不想握,是不敢。她怕握住了就会依赖,依赖了就会脆弱,脆弱了就会被剩下。
但现在她不怕了。不是因为她变强了,是因为她发现——脆弱不会被剩下,脆弱只会被接住。被他的手接住,被他的人接住,被他的“我也可以”接住。
她伸出手,放在他的掌心里。
她的手很凉,他的手很暖。她的手指碰到了他的掌心,那里的皮肤很柔软,温度透过指尖传进来,像一个信号——连接已建立,通道已开通,数据开始传输。
裴衍之的手指合拢了,轻轻地,慢慢地,像在握一件容易碎的东西。他的手指穿过她的指缝,扣住了她的手背。力度不重,但很稳,稳到像一个被确认了的连接——握手成功,协议协商完成,共识已达成。
两个人沉默地坐著,面对著萤幕上那排绿色的“PASS”。窗外的那层橘色变成了金色,太阳出来了,光照在会议室的玻璃窗上,照在桌上那两杯凉掉的水上,照在两个人交握的手上。
程司白低头看著那只手。她的手在他的手里,显得很小,很白,很凉。他的手很大,很暖,指节分明,指甲剪得很短。她注意到他无名指的根部有一道浅浅的疤,很旧了,几乎看不出来。她以前没有注意到这道疤。也许三年前就有了,也许是她走了之后才有的。她不知道。
她以前不知道的事情太多了。
“裴衍之。”她说。
“嗯。”
“你刚才说系统可以容错。”
“嗯。”
“你的容错机制是什么?”
裴衍之沉默了一会儿。窗外的光照在他脸上,把他的侧脸照得很柔和。他的嘴角动了一下,不是笑,是一种放松——一种只有在确信什么东西终于被确认之后才会出现的放松。
“心跳检测。”他说,“超时重试。优雅降级。还有——”
他停了一下,转头看著她。两个人的目光在空气中相遇,很近,近到她能看清他瞳孔里自己的倒影——头发乱了,眼睛红了,嘴唇干了,但她在笑。很小很小的笑,小到如果不是在他的瞳孔里看到,她自己都不会发现。
“还有什么?”她问。
“手动恢复。”他说,“需要人工介入的那种。”
程司白笑了。不是嘴角动一下的那种,是真的笑了。笑容从她的眼睛里开始,蔓延到脸颊,蔓延到嘴角,蔓延到整个脸上。她笑得不好看,眼睛瞇成了一条缝,鼻子皱了一下,嘴唇因为干裂而有点疼。但她没有停下来。
她已经很久没有笑过了。久到她都快忘记笑是什么感觉了。
裴衍之看著她笑,他的嘴角也扬起来了。不是那种克制的、理性的、成年人的微笑,是那种从心底里涌上来的、压不住的、想要跟著一起笑的笑。
“程司白。”他说。
“嗯。”她还在笑,声音里带著一点点颤,不是哭的那种颤,是笑的那种。
“我们试试看。”
程司白停住了笑。她看著他,窗外的光照在他眼睛里,把那双深棕色的瞳孔照得很亮。他的表情很认真,认真得像在签一份技术方案——每一个字都确认过了,每一条条款都考虑过了,没有歧义,没有模糊地带。
“不结婚,不谈未来。”他说,声音很轻,轻到像是在说一个秘密,“就试试看,能不能像两个节点一样,保持连接。”
程司白看著他。她的手指在他掌心里动了一下,不是要抽出来,是要握得更紧。她的手指穿过他的指缝,扣住了他的手背,和他的手指交缠在一起。
“不结婚?”她问。
“不结婚。”
“不谈未来?”
“不谈未来。”
“那谈什么?”
“谈今天。”裴衍之说,“谈明天的测试用例,谈后天的灰度上线,谈下周的技术评审会。谈你今天吃了什么,谈你今天几点睡的,谈你今天有没有笑。”
程司白低下头,看著两个人交握的手。她的手在他的手里,他的手指扣著她的手背,她的手指扣著他的手腕。两个人的心跳在不同的频率上运行,但通道是开的,数据在传输,共识在达成。
“好。”她说。
一个字。很轻,轻到像一个确认信号——收到,理解,同意。不需要重发,不需要超时,不需要备份。就是一个简单的ACK,告诉对方:我收到了你的请求,我同意你的提案,我们达成共识了。
裴衍之的手指在她手背上轻轻按了一下。不是用力,是确认——你说了,我听到了,我记住了。
两个人在会议室里并排坐著,肩膀轻轻挨在一起。程司白的右肩靠著裴衍之的左肩,隔著两层布料,她能感觉到他的体温。不是那种烫的、灼人的热,是那种温的、恒定的、让人想靠上去的暖。
窗外的那层金色变成了白色,太阳完全升起来了,光照在整个城市的上空,把每一栋楼的玻璃幕墙都照得发亮。会议室的窗户朝东,阳光直射进来,照在两个人身上,把他们的影子投在身后的墙上——两个影子靠在一起,肩膀重叠,分不清哪个是谁的。
程司白没有说话。她也没有松手。她只是坐在那里,靠著他的肩膀,握著他的手,看著窗外的光。她的眼睛还是干的,嘴唇还是裂的,头发还是乱的,但她不觉得累了。不是因为休息了,是因为有人和她一起承担了。
她想起三年前的一个晚上。那天她加班到很晚,趴在桌上睡著了,醒来的时候身上盖著一件外套,桌上放著一杯咖啡和一张纸条。纸条上写著“别太累了”。她当时把纸条揉成一团扔进了垃圾桶。但现在她知道了——那张纸条她没有扔。她把它放在抽屉里,压在最下面。和那部旧手机放在一起,和那条“好,不打扰了”放在一起,和所有她说不需要的东西放在一起。
她从来没有扔掉过。
她只是不敢承认她需要。
“裴衍之。”她说。
“嗯。”
“你刚才说心跳检测。”
“嗯。”
“你的心跳频率是多少?”
裴衍之转头看著她。她的头靠在他肩膀上,他只能看到她的头顶——头发乱糟糟的,有几缕碎发翘起来,在阳光下泛著一点点棕色。她的耳朵从头发里露出来,耳尖是红的,不是那种被晒红的红,是那种从皮肤底下慢慢渗上来的、一层一层的红。
“不知道。”他说,“没测过。”
“那你现在测一下。”
裴衍之没有动。他坐在那里,肩膀靠著她的肩膀,手握著她的手,看著窗外的阳光。他能感觉到自己的心跳——不快,但很重,一下一下的,像在确认什么。
“大概每分钟七十二次。”他说。
“正常范围。”程司白的声音从他肩膀处传来,闷闷的,像隔了一层什么东西,“你的心率变异性怎么样?”
“什么?”
“心率变异性。心跳间隔的变化幅度。数值越高说明自主神经调节能力越强,越健康。”
裴衍之笑了。不是嘴角动一下的那种,是真的笑了。他的笑声很轻,轻到像一段低频的震动,从胸腔传到肩膀,从肩膀传到她的耳朵里。
“程司白,你连关心人的方式都像在做技术评审。”
程司白没有反驳。她只是靠在他肩膀上,嘴角微微上扬。她不想反驳,因为他说得对。她不会说“你累不累”“你睡得好不好”“你有没有压力”。她只会说“你的心跳频率是多少”“你的心率变异性怎么样”“你的容错机制是什么”。
这是她的语言。用技术词汇表达感情,用算法隐喻关系,用系统架构比喻人生。听不懂的人觉得她冷漠,听得懂的人知道她在说——我在乎你。
他听得懂。他一直听得懂。
窗外的阳光越来越亮了,照在会议室的每一个角落里,把桌上的灰尘都照出来了。那些灰尘在光柱里飘浮,缓慢地,无方向地,像一群没有目标的粒子。程司白看著那些灰尘,觉得自己就像其中的一颗——一直在飘,不知道要去哪里,不知道会落在哪里。但现在她知道自己不会一直飘了。因为有一个人伸出手,接住了她。
“裴衍之。”
“嗯。”
“你刚才说不结婚,不谈未来。”
“嗯。”
“那你打算谈多久的今天?”
裴衍之沉默了一会儿。窗外的阳光照在他脸上,他瞇了一下眼睛,然后转头看著她。她还是靠在他肩膀上,他只能看到她的头顶和那一小片红红的耳朵尖。
“谈到你愿意谈明天为止。”他说。
程司白的手指在他掌心里紧了一下。只有一下,然后就松开了。不是要抽出来,是回应——收到,理解,同意。
两个人又沉默了。办公区外面开始有人走动的声音,脚步声,说话声,键盘声。新的一天开始了,同事们陆续来了,项目还要继续,灰度还要跑,Bug还要修。但在这个会议室里,在这一刻,时间是静止的。窗外的光不动了,灰尘不动了,心跳不动了。一切都停在“好”这个字说出来的那个瞬间。
程司白慢慢地坐直了身体。她的手从他手里抽出来的时候,两个人的手指都停了一下,像一段不舍得中断的连接——缓存还没清空,会话还没过期,还有一点点数据在传输。
她站起来,走到窗边。阳光晒在她脸上,暖的,有一点点刺眼。她把窗户推开了一条缝,外面的空气灌进来,带著城市早晨特有的味道——汽车尾气、早餐店的油烟、路边梧桐树叶子上的露水。不好闻,但很真实。这是真实世界的味道。不是会议室里的空调味,不是萤幕上的数据味,不是她给自己筑的那道墙里面的味道。是真实的,活的,有温度的。
裴衍之站起来,走到她旁边。两个人并排站在窗前,肩膀轻轻挨在一起。窗外的城市在阳光下显得很安静,楼下的街道开始有人走动,对面写字楼的玻璃幕墙反射著金色的光。
“程司白。”他说。
“嗯。”
“你今天笑了三次。”
程司白转头看著他。阳光照在她脸上,她瞇著眼睛,嘴角有一点点上扬的弧度。
“你又在数。”
“我一直都在数。”
两个人站在窗前,肩膀挨著肩膀,影子投在地板上,重叠在一起。窗外的光越来越亮,照在他们身上,把他们的轮廓照得很清楚——两条线,分开的,但靠得很近。近到快要连在一起了。
程司白看著窗外的那片金色,觉得自己的胸口有一个地方在发热。不是心脏,是心脏旁边的一个什么地方。一个她从来没有注意过的地方,一个她以为已经坏死的地方,一个被冰封了三年之后终于开始解冻的地方。
它在跳。很慢,很轻,像一个刚刚启动的进程——还在加载,还在初始化,还在等待第一个输入。
但她知道它会跳下去的。因为有人在那里,等著接收它的输出。
庆功宴定在项目成功上线后的第三个晚上。唐嘉树把地点选在了公司附近一家川菜馆,包了一个能坐三十人的大包厢。通知发出来的时候何悦在群组里欢呼了三声,陆维安问她为什么这么高兴,她说因为川菜馆的红油抄手是全城最好吃的。陆维安说你高兴的是抄手还是项目,何悦说都是。
程司白本来不想去的。她对庆功宴这种场合没有兴趣——一群人坐在一起吃饭喝酒说一些场面话,她不知道该说什么也不知道该怎么笑。但何悦在她面前站了十分钟,列举了七个她必须去的理由,从“你是项目的核心架构师”到“红油抄手凉了就不好吃了”,程司白听到第三个的时候就放弃了抵抗。
“我去。”她说。
何悦满意地走了。走了几步又回头说:“程姐你穿好看一点。”
程司白低头看了看自己身上的衣服——黑色西装外套,白色衬衫,深灰色长裤。她每天都穿这些,何悦从来没有说过不好看。“为什么?”
何悦张了张嘴,想说什么又咽回去了。“没有为什么。就是觉得你应该穿好看一点。”她说完就跑了,脚步快得像在逃避什么问题。
庆功宴在晚上七点开始。程司白到的时候包厢里已经坐了二十几个人,闹哄哄的,有人在倒酒有人在拍照有人在抢桌上的凉菜。何悦坐在靠门的位置,看到她进来的时候眼睛亮了一下,然后低头看了一眼她的衣服——黑色西装外套,白色衬衫,深灰色长裤。何悦的表情有一瞬间的失望,但很快就恢复了。
“程姐这边坐!”她拍了拍旁边的椅子。
程司白坐下来,把公事包放在椅子背后。桌上摆满了凉菜,红油耳丝、蒜泥白肉、口水鸡,每一盘都红彤彤的,看起来很辣。她不太能吃辣,但她没有说。何悦把一杯酸梅汤推到她面前。“程姐你喝这个,解辣。”
“谢谢。”
裴衍之是最后一个到的。他推门进来的时候包厢里已经没有多少空位了,只有程司白对面还有一个。他走过去坐下来,脱掉外套挂在椅背上,里面穿了一件浅蓝色的衬衫,领口解了一颗扣子。何悦看了他一眼,又看了程司白一眼,然后低下头给陆维安发了一条消息:“裴哥今天穿得好正式。”
陆维安坐在桌子对面,看了一眼手机,又看了一眼裴衍之的衬衫,回了一条:“他每天都穿衬衫。”
何悦:“但今天是浅蓝色的。他平时都穿白色。”
陆维安没有回。他不知道浅蓝色和白色有什么区别,但他知道如果他在这个问题上继续纠缠,何悦会给他发一篇论文。
唐嘉树端著酒杯站起来,敲了敲桌上的转盘。包厢里安静下来,所有人都在看他。
“今天这顿饭,是为了庆祝一件事。”他顿了一下,目光扫过在座的每一个人,“业务中台架构升级项目,成功上线。连续运行了七十二小时,零故障,零报警,数据一致性百分之百。”
包厢里响起掌声和欢呼声。何悦鼓得最用力,手掌都拍红了。程司白没有鼓掌,她只是坐在那里,看著桌上的红油耳丝,嘴角有一点点上扬的弧度。
“这个项目能成功,要感谢在座的每一个人。”唐嘉树继续说,声音不大,但包厢里很安静,每个字都听得很清楚,“但我特别想感谢两个人。”
他看向程司白,又看向裴衍之。
“程司白和裴衍之。架构组和业务中台的第一次深度合作,过程很曲折,结果很完美。我做了二十年技术管理,见过很多技术合伙人吵架。有的吵完就散了,有的吵完反而更好了。你们属于后者。”
他举起酒杯。“敬程司白和裴衍之。你们的合作是典范。”
所有人举起酒杯。何悦举的是酸梅汤,陆维安举的是可乐,裴衍之举的是啤酒,程司白举的是白开水。杯子在空中碰撞,发出清脆的声音,叮叮当当的,像一段即兴演奏的打击乐。
程司白喝了一口白开水,烫的,舌尖被烫了一下。她把杯子放下来的时候,看到对面的裴衍之正在看她。他手里端著啤酒杯,杯壁上凝著一层水珠,他的手指搭在杯壁上,指尖被冰凉的液体浸得有点发白。他朝她举了一下杯子,幅度很小,小到如果不是她在看他,根本不会注意到。
她也举了一下杯子。幅度也很小。两个人隔著满桌的红油耳丝和蒜泥白肉,隔著二十几个同事的喧闹声和笑声,隔著三年的时间和一千多个没有说出口的夜晚,碰了一下杯。没有声音,没有碰撞,只有两个人的目光在空气中相遇了一下,然后分开。
何悦看到了。她没有掏手机,因为她知道如果现在拍照,程司白会发现。她只是在心里默默地记下了这个场景,然后端起酸梅汤喝了一大口,压住想要尖叫的冲动。
菜一道一道地上,包厢里的气氛越来越热。有人开始串桌敬酒,有人开始讲段子,有人开始起哄让唐嘉树唱歌。唐嘉树说他唱歌跑调,大家说没关系,他说那你们先跑一个我跟著跑,全场笑了。
何悦喝了两杯酸梅汤之后胆子变大了。她站起来,端著杯子走到唐嘉树面前。
“唐总,我有话要说。”
唐嘉树看著她,表情有点意外。“说。”
何悦转过身,面对著所有人。她的脸红扑扑的,不知道是酸梅汤的作用还是兴奋的。“唐总刚才说,程姐和裴哥的合作是典范。对,他们的合作确实是典范。”她顿了一下,吸了一口气,“但是唐总,他们不只是合作典范!”
包厢里安静了一秒。然后全场爆发出起哄的声音——有人在拍桌子,有人在吹口哨,有人喊“何悦你说清楚”,有人喊“是不是有什么我们不知道的事”。陆维安坐在位置上,手里的可乐差点洒出来,他看著何悦,嘴巴张著,表情像是在看一段没有注释的代码——完全看不懂,但他觉得很厉害。
程司白坐在位置上没有动。她的手指握著白开水杯,杯壁有点烫,但她没有松开。她的表情很平静,平静得像在开一场技术评审会。但如果有人仔细看她的手,会发现她的手指在轻轻地抖——不是害怕,是某种她说不清楚的东西。像一个系统在接收一个超出预期的输入——不是错误,是边界条件,是从来没有处理过的场景。
何悦转头看了程司白一眼,又看了裴衍之一眼。她的眼神里有一种很复杂的东西——兴奋、紧张、期待,还有一点点“我是不是说错话了”的心虚。
裴衍之站起来了。
他把啤酒杯放在桌上,动作很慢,慢到整个包厢都在看他。他的表情很平静,平静得像在会议室里讨论测试参数。但他的眼睛不是。他的眼睛里有什么东西在动,很亮,很暖,像一个刚刚启动的服务——所有端口都打开了,所有服务都在线,等待接收请求。
“对。”他说。一个字,声音不大,但在安静的包厢里显得很清楚。“不只是合作。”
全场沸腾了。
有人站起来了,有人开始尖叫,有人把手机举起来开始录影。何悦站在原地,手摀住了嘴,眼睛瞪得很大,眼眶红了。陆维安终于反应过来了,他站起来,开始鼓掌,掌声很大,大到盖过了所有人的声音。
程司白坐在位置上,手里的白开水杯还在冒热气。她看著对面的裴衍之——他站在那里,浅蓝色的衬衫在灯光下显得很柔和,头发被包厢里的暖光照出一层淡淡的光晕。他的嘴角有一点点上扬的弧度,不是那种克制的、理性的、成年人的微笑,是那种从心底里涌上来的、压不住的、想要跟所有人分享的笑。
她在这一刻做了一个决定。
她站起来了。
包厢里的声音在这一瞬间全部消失了。所有人都在看她——何悦的手还摀在嘴上,陆维安的掌声停在半空中,唐嘉树端著茶杯的手悬在桌面上方。整个包厢安静得像一个被暂停了的视频画面,所有的人都在等待,等待她按下播放键。
程司白看著裴衍之。两个人隔著满桌的菜肴和杯盘,隔著二十几个同事的目光和呼吸,隔著三年的沉默和一千多个没有说出口的夜晚。她看著他的眼睛,那双深棕色的眼睛在灯光下很亮,亮得像萤幕上一个稳定的信号——没有波动,没有异常,一切正常。他在等她。
“我们在一起了。”她说。
声音不大,但很清晰。每一个字都说得很清楚,清楚得像在念一段技术文档——没有歧义,没有模糊地带,没有可以被误解的空间。她说这句话的时候语气很平,平得像在说“测试通过了”“上线成功了”“数据一致了”。但她说的是另一件事。一件她从来没有说出口的事。
包厢里安静了三秒。
这三秒里程司白能听到自己的心跳声。一下一下的,很快,很重,像一个刚刚启动的进程——还在初始化,还在加载,还在确认自己是否真的在运行。然后何悦哭了。不是那种安静的、克制地流眼泪,是那种放声的、不顾一切的、把三年的期待和紧张和担心全部释放出来的哭。她站在那里,手从嘴上移开,眼泪从脸上流下来,嘴巴张著,发出一个很长很长的“啊——”。
全场再次沸腾了。这一次比刚才更热烈,有人站到了椅子上,有人开始敲碗,有人喊“我就知道”,有人喊“何悦你别哭了”。唐嘉树坐在位置上,端著茶杯,笑著摇了摇头,低声说了一句话。坐在他旁边的人听到了,但他没有听清那句话是什么。如果他听清了,他会知道唐嘉树说的是:“终于。”
裴衍之从桌子对面走过来。他绕过那些站著的人、那些举著手机的人、那些还在尖叫的人,走到程司白面前。两个人面对面站著,中间隔著大概五十公分。包厢里的所有声音在这一刻都变成了背景——模糊的,遥远的,像一段被压缩过的白噪音,只有频率,没有内容。
“你说出来了。”他说。
“嗯。”
“你以前从来不说这种话。”
程司白看著他。包厢里的灯光从侧面照过来,在他脸上留下一半亮一半暗。他的表情很平静,但他的眼睛不是。他的眼睛里有什么东西在闪,很亮,很暖,像一个等待了很久终于收到确认信号的节点——超时了,重发了,终于ACK了。
“因为以前没有人值得我说。”她说。
何悦在旁边听到了这句话。她哭得更厉害了,眼泪和鼻涕混在一起,她从口袋里掏出一包纸巾,抽了三张才把脸擦干净。陆维安站在她旁边,手里拿著一杯可乐,不知道该递纸巾还是该递可乐,最后两个都递了。
唐嘉树站起来,清了清嗓子。“好了好了,都坐下吃饭。菜凉了。”他的声音不大,但有一种让所有人安静下来的魔力。包厢里的人陆续坐回自己的位置,但每个人都在交头接耳,每个人的手机都在震动,每个人的脸上都挂著一种“我今天见证了历史”的表情。
何悦坐下来的时候还在吸鼻子。她拿出手机,打开“共识观察小组”,打了一行字:“诸位,我宣布,共识达成。”发送之后她把萤幕关掉,把手机放在桌上,然后端起酸梅汤喝了一大口。陆维安坐在她旁边,看著她那条消息,没有回。他只是在那条消息下面点了一个赞。