发送之后她把萤幕关掉,把手机放在桌上,萤幕朝下。裴衍之也放下了手机。
“何悦的消息?”他问。
“嗯。灰度上线的事。”
“你回她了?”
“回了。”
裴衍之点了点头,没有问她回了什么。他知道她回了什么——准备好了。她永远都是准备好了。不管是测试方案、技术评审、还是坐在一个她三年没有来过的咖啡馆里,面对一个她三年没有单独说过话的人。她永远准备好了。
但今天晚上,他觉得她的“准备好了”和以前不一样。
以前的“准备好了”是“我可以一个人处理”。今天的“准备好了”是“我在这里,和你一起”。
这是两种完全不同的状态。前者是单节点模式——独立运行,不依赖任何外部资源,优点是稳定,缺点是孤独。后者是分布式模式——多个节点协同工作,优点是强大,缺点是需要信任。
她开始信任了。
不是很多,只是打开了一条通道,允许少量的数据交换。但这是一条曾经被她彻底关闭的通道,现在它重新打开了,端口还在,协议还在,握手还在进行中。
程司白端起咖啡杯,喝完了最后一口。杯子空了,杯底残留著一点点咖啡液,在灯光下泛著深褐色的光。她把杯子放回桌上,杯底碰到碟子发出一声轻微的碰撞声,清脆的,短促的,像一个确认信号——任务完成,资源释放,准备接收新的指令。
“明天上午九点,会议室四。”她说,“开始跑灰度上线的准备工作。”
“好。”
程司白站起来,拎起公事包。裴衍之也站起来,把电脑夹在腋下。两个人走出咖啡馆的时候,背景音乐正好放完最后一个音符,停顿了两秒,然后下一首开始了——还是钢琴曲,比之前那首稍微快一些,音符之间的间隔更短,像一段正在加速的节奏。
门外的风比来的时候更冷了。程司白把外套的拉链拉到最高,下巴埋进领口里。裴衍之站在她旁边,没有说话,只是站著。
“我先走了。”她说。
“嗯。路上注意安全。”
程司白转身走向地铁站。走了几步,停了下来。
她转过头。
裴衍之还站在咖啡馆门口,手里拎著电脑,外套的领口竖起来,在风里微微瞇著眼睛。路灯的光从侧面照过来,在他脸上留下一半亮一半暗。他的表情很平静,平静得像在等一个他确定会来的结果。
程司白看著他,嘴唇动了一下,像是想说什么。风把她的头发吹乱了,几缕碎发贴在脸上,她没有去拨。
她没有说话。她转过身,继续往前走。
脚步声在人行道上响起,一二一二,节奏和往常一样均匀。但如果有人仔细听,会发现今天的脚步声比平时轻了一些——不是没力气的那种轻,是卸掉了什么东西之后的那种轻。
她走进地铁站的时候,在楼梯上回头看了一眼。
裴衍之还站在咖啡馆门口。
他没有走。他只是站在那里,看著她的方向,像一个在等待确认的节点——不知道对方会不会回应,但还是把请求发出去了,然后等待,超时,重发,再等待。
程司白转过头,走下楼梯。
地铁进站的时候风从隧道里吹出来,把她的头发吹得更乱了。她站在月台上,看著列车的灯光从远处一点一点靠近。这一次她没有看玻璃窗上的倒影,她看著列车的灯光,看著它从一个小点变成一道光柱,从一道光柱变成一个完整的车头。
车门打开,她走进去,找了一个靠窗的位置坐下。
公事包放在膝盖上,她的手指搭在拉链上。隔著一层尼龙布,她能感觉到那个杯子的轮廓——圆的,硬的,杯壁上有一行被水珠洇开的字。她没有拿出来看,但她记得那行字写的是什么。
“别用工作逃避。”
她没有在逃避了。
至少今天晚上没有。
列车启动的时候,她拿出手机,打开“共识观察小组”。群组里有十几条未读消息,大部分是何悦发的。最新的一条是:“姐妹们,我刚才看到程姐和裴哥从咖啡馆里一起出来!!!两个人!!!单独!!!”
下面是一排惊叹号。
程司白看著这条消息,嘴角动了一下。不是笑,只是动了一下,幅度很小,小到如果有人在旁边看著,不会注意到。
她把手机萤幕按掉,靠在椅背上。
列车在隧道里行驶,窗外的灯光一盏一盏地往后退,越来越快,最后连成一条线。她看著那条线,想起他在咖啡馆里说的那句话。
“我一直愿意。”
她闭上眼睛。
这句话在她脑子里转了一圈,又转了一圈,然后停下来了。不是因为她不想再想了,是因为它不需要再想了。它已经被存储在一个安全的地方,一个她不会轻易删除的地方。
地铁到站的时候她睁开眼睛,站起来走出车厢。上楼梯的时候脚步很轻,公事包在肩上轻轻晃著,里面的杯子没有发出声音。
出站的时候风很大,她把领口往上拉了拉。街上人很少,路灯把她的影子拉得很长,投在空荡荡的人行道上。她走得比平时慢了一些,不是因为累,是因为不急了。
到家之后她打开门,换鞋,把公事包放在沙发上。客厅里很暗,她没有开灯,走到茶几前,把那个咖啡杯从公事包里拿出来。
杯子已经彻底干了,杯壁上那行字的墨水完全洇开了,变成一片模糊的痕迹,但还能认出大概的形状——“别”“用”“工”“作”“逃”“避”。六个字,变成了一片浅灰色的影子,像一段被删除之后没有完全清除的数据——痕迹还在,但内容已经不完整了。
她把杯子放在茶几上,和那杯三天前带回来的拿铁并排放在一起。两只杯子,一只装过拿铁,一只装过美式,都空了,都干了,都放在那里。
她站在茶几前,低头看著这两只杯子,站了大概一分钟。
然后她走进卧室,换了衣服,躺在床上。天花板还是白的,窗外的路灯透过窗帘照进来,在天花板上投下一片模糊的光斑。她看著那片光斑,想起咖啡馆里那盏台灯——暖黄色的,照在木纹上,把那些弯弯曲曲的线条照得很清楚。
她闭上眼睛。
明天的会议是上午九点。灰度上线的准备工作,一致性哈希的分流方案,三周的对比测试计划。这些事情她都需要准备,都需要安排好。她应该现在就想,现在就列一个清单,现在就把所有的步骤在脑子里过一遍。
但她没有。
她在想另一件事。
他在咖啡馆门口站了多久?她走进地铁站的时候他还在,上了楼梯的时候他还在,走下楼梯的时候她没有回头,不知道他还在不在。但他应该还在。他会站在那里,等到她消失在视线之外,等到地铁进站的声音也听不到了,等到风把咖啡馆的门吹得关上了,他才会走。
他就是这样的人。
三年前是,现在也是。
她翻了一个身,把脸埋在枕头里。枕头很软,很凉,没有柠檬和雪松的味道。她闻到的只有洗衣液的香味,干净的,单调的,像一段没有特征的白噪音。
她在这片白噪音里,慢慢地睡著了。
最后一个念头是——明天早上,他会带咖啡吗?
灰度上线的第一天,程司白比平时早了一个小时到公司。
她坐在工位前打开监控面板的时候,裴衍之的消息已经到了。是一张截图,上面是业务中台的流量监控画面,零点到七点的曲线是一条平稳的直线,接近于零。他在截图上画了一个红圈,圈住那条直线,旁边写了一行字:“趁现在还没流量,再做一次最后的检查。”
她回了一个字:“好。”
两个人几乎同时打开了测试文档。程司白检查架构层的配置参数,裴衍之检查业务层的分流逻辑,各自在自己的领域里做最后一遍校验。八点的时候她发了一条消息给他:“架构层准备就绪。”他秒回:“业务层准备就绪。”然后两个人同时发了一个“开始”。
上午九点,流量开始涌入。
监控面板上的曲线从零开始爬升,每秒一百笔,五百笔,一千笔。程司白盯著那条蓝色的曲线——那是Raft方案的表现,延迟稳定在一百八十毫秒,比预期中还要好。绿色的Paxos曲线在两百二十毫秒的位置上波动,两条线之间隔著四十毫秒的距离,像两条并行的高速公路,车流顺畅,没有拥堵。
何悦站在她身后,假装在看监控面板,实际上在看她。程司白的表情很专注,眉头微微皱著,手指放在键盘上随时准备介入。但何悦注意到她的嘴角有一点点上扬的弧度——不是笑,是一种放松,一种只有在确信一切都在掌控之中时才会出现的放松。
“程姐,数据怎么样?”何悦问。
“正常。”
“裴哥那边呢?”
程司白的手指在键盘上敲了几下,调出业务中台的监控画面。“也正常。分流比例精准,没有出现偏差。”
何悦点了点头,在心里默默记下了这个信息。她回到自己的工位之后,第一件事就是打开“共识观察小组”,在里面发了一条消息。
“Day1观察报告:程姐和裴哥早上八点同时上线,全程没有通话,没有见面,但配合得像一个人。这就是默契吧。”
陆维安秒回:“你怎么知道他们是同时上线的?”
何悦:“程姐八点发了一条消息,裴哥秒回。我在程姐后面看到的。”
陆维安:“你在偷看?”
何悦:“这叫观察。不叫偷看。”
她把群组的名字又改了一下,从“共识观察小组”改成“共识观察小组·灰度特别版”,然后在群公告里写了一句话:“本群宗旨:记录程裴两位老师的每一次同步。”
下午两点,程司白和裴衍之在会议室四碰头,同步第一天的数据。两个人坐在会议桌的两端,中间隔著六把空椅子,但气氛比两周前松弛了很多。程司白说话的时候裴衍之会点头,裴衍之提问的时候程司白会停下来想一下再回答,没有抢话,没有打断,没有那种剑拔弩张的紧张感。
何悦端著两杯咖啡“路过”会议室的时候,透过玻璃墙看到两个人同时低下头写笔记,动作几乎同步,像两台被同一个时钟驱动的机器。她掏出手机拍了一张照片,发到群组里。
陆维安:“你又在偷拍。”
何悦:“这是纪录片。”
她把照片放大看了看,发现两个人低头的角度一模一样,笔记本翻开的页数也差不多。她把这个发现发到群组里,加了一个感叹号。
陆维安:“你是不是太闲了?”
何悦:“你不懂。这是技术活。”
下午四点,第一天的灰度测试顺利结束。程司白在群组里发了一份简报,总结了当天的数据。Raft方案的平均延迟比Paxos低了十五毫秒,吞吐量高了百分之八。两个方案都没有出现故障,没有报警,没有需要人工介入的异常。
裴衍之在简报下面回了一句:“数据一致,没有问题。”
程司白看了这条回复,打了一行字:“明天继续。”发送之后她关掉电脑,靠在椅背上。窗外的阳光照进来,照在桌上那个白色的马克杯上。杯子里有半杯水,是她下午倒的,凉了。她端起来喝了一口,凉水滑过喉咙,有一种很清澈的感觉。
她觉得今天的自己不太一样。
不是技术上的不一样,是状态上的。她今天在会议室里跟裴衍之说话的时候,没有那种需要刻意控制语气的紧张感。她不需要提醒自己要冷静,不需要在心里数拍子来保持节奏均匀。她只是说话,就像跟何悦说话一样自然。
她不知道这是什么时候开始变的。也许是从咖啡馆那天晚上开始的,也许更早,早到她还没有意识到的时候。
灰度上线进入第三天,何悦在群组里开了一个新的系列,叫“今日程裴同步时刻”。
Day3的第一条:“早上九点,程姐和裴哥同时在群组里发了“开始监控”。时间戳一模一样。我截图了。”
陆维安:“可能只是巧合。”
何悦:“连续三天都是巧合?”
陆维安沉默了。
第二条:“下午两点的同步会,程姐带了自己的笔记本,裴哥也带了自己的笔记本。两个人的笔记本是同一个型号,同一个颜色。我以前没注意过。”
陆维安:“这个型号很多人用。”
何悦:“但他们用的是同一款。连键盘膜都是透明的。”
陆维安不回复了。
第三条:“开完会之后两个人同时从会议室里出来,同时往左转,同时走了三步,然后同时发现不对——程姐的工位在左边,裴哥的工位在右边。他们在走廊上站了一秒,对视了一眼,然后各自转身。我看到了。那一秒里他们什么都没说,但我觉得他们说了很多。”
这条发出去之后,群组里沉默了很久。连何悦自己都没有再发消息。
第五天的时候,唐嘉树在技术总监群组里发了一条消息给所有人:“灰度上线五天,数据稳定,两种方案都没有出现故障。下周的技术评审会可以提前到周三。”
何悦看到这条消息的时候正在茶水间泡茶。她把手机放在台面上,一边等水开一边刷群组消息。陆维安走进来接水,看到她在发呆。
“看什么呢?”
“唐总说下周三开最终评审会。”何悦把屏幕转给他看,“如果周三确定了方案,灰度就结束了。”
“那不是挺好的吗?”陆维安把杯子放在饮水机下面,按了出水按钮。
“是好。”何悦端起茶杯,吹了吹热气,“但你有没有觉得,这几天程姐和裴哥的状态特别好?两个人配合得越来越顺了。如果方案确定了,他们可能就不需要每天开会了。”
陆维安看了她一眼。“你是在担心项目,还是在担心他们不开会你就没东西纪录了?”
何悦瞪了他一眼。“我是在担心项目的连续性。”她端著茶杯走了,走了几步回头说了一句,“而且,我纪录的东西都是有价值的技术文档。”
陆维安站在饮水机前面,看著她的背影消失在走廊转角。他拿出手机,打开“共识观察小组·灰度特别版”,从头到尾翻了一遍何悦发的所有消息。从Day1到Day5,总共二十三条,每一条都是关于程司白和裴衍之的同步时刻——同时上线、同时发消息、同时走出会议室、同时低头写笔记、同时喝咖啡。
他把手机放回口袋,接完水,走回工位。经过何悦的工位时,他停了一下。
“何悦。”
“干嘛?”
“你说得对。”他说完就走了。
何悦坐在工位上,端著茶杯,看著他的背影,愣了一下。然后她低下头,在群组里发了一条消息:“陆维安刚才说我说得对。这是什么世界线?”
没有人回她。因为所有人都去开周会了。
公司团建安排在周六,地点是城郊的一个拓展基地。这是季度例行活动,每个部门轮流参加,这次轮到技术中心。何悦在周五下午发了通知,附了一份活动流程表,从上午九点到下午五点,安排了破冰游戏、团队对抗、烧烤午餐和自由活动。
程司白看到通知的时候第一个反应是想请假。她不喜欢团建,不喜欢那些需要跟不熟的人组队玩游戏的环节,不喜欢在户外晒太阳还要做一些看起来很蠢的动作。但她看到流程表的最后一行写著“备注:缺席需向唐总请假”,她就把请假的念头收起来了。向唐嘉树请假需要解释理由,而她没有理由——“不喜欢”不是一个能被接受的理由。
周六早上八点半,公司在楼下集合。大巴车停在路边,发动机嗡嗡地响,车厢里有股皮革和空气清新剂混在一起的味道。程司白上车的时候发现大部分座位已经被占了,何悦在倒数第二排朝她招手,旁边的座位空著。
她走过去坐下来,把公事包放在膝盖上。何悦递给她一瓶水和一个三明治。
“程姐你吃早饭了吗?”
“吃了。”
“再吃一个。今天要消耗很多体力。”
程司白接过三明治,放在公事包上面,没有打开。她转头看向车窗外,同事们陆续上车,有人在聊天,有人在打电话,有人在找座位。裴衍之上车的时候她看到了——他穿著一件灰色的运动T恤,背著一个黑色的双肩包,头发没有像上班时那样梳整齐,额前有几缕碎发垂下来。
他上车之后往车厢后面走,经过程司白座位的时候看了她一眼,点了点头。她也点了点头。然后他走到最后一排坐下来,把双肩包放在旁边的座位上,拿出手机开始看。
何悦把这一切都看在眼里。她没有掏手机,因为她知道如果现在拍照,程司白会看到。她只是在心里默默地记下了这个场景,打算晚上回去再补发到群组里。
大巴车开了四十分钟,到达拓展基地。基地在一片山坡上,周围是树林,空气里有草和泥土的味道。教练是一个晒得很黑的男人,穿著冲锋衣,拿著一个扩音器,声音大得像在训军。
“所有人分成四个小组!每组八到十个人!组长由组员推选!”
人群开始移动。程司白站在原地没有动,她不擅长这种需要主动找人的环节。何悦拉著她走到一边,陆维安跟过来,然后有几个架构组和业务中台的同事也凑过来了。人越聚越多,最后数了一下,九个人。
“我们组齐了!”何悦举手。
教练走过来,看了看名单。“你们组的组长是谁?”
九个人互相看了看。程司白往后退了一步,何悦注意到了,没有推她,而是转头看向人群的边缘——裴衍之站在最后面,双肩包背在胸前,正在看手机。
“裴哥!”何悦喊了一声,“你是我们组的组长!”
裴衍之抬起头,表情有些意外。他看了看周围的人,又看了看程司白。程司白把目光移开了。
“行。”他把手机放进包里,“第一个游戏是什么?”
第一个游戏是“盲人方阵”。所有人蒙上眼睛,在一个划定的区域内找到一根绳子,然后把绳子拉成一个正方形。过程中不能说话,只能用手势沟通。
教练给每个人发了眼罩。程司白戴上眼罩的瞬间,视觉被切断了,其他的感官变得敏锐起来——她听到风穿过树叶的声音,听到远处有人在笑,听到身边同事的呼吸声。有人碰了一下她的手臂,她本能地缩了一下,然后意识到那是游戏的一部分。
她伸出手,在空气中摸索。手指碰到了一个人的肩膀,布料是棉质的,运动T恤。她的手停在那里,不知道该做什么手势。
那个人抓住了她的手腕。
力度很轻,轻到不会让她觉得被控制。他把她的手引导到一个方向,她的手指碰到了一根绳子——粗糙的,编织的,有纹路的。然后他的手松开了。
程司白握著绳子,等待下一步的指令。绳子被拉紧了,有人在另一端用力,她跟著那个力的方向移动脚步。绳子的张力在变化,左边紧了,右边松了,有人在调整角度。她的手被带著往左移动了两步,然后往后退了一步,然后停下来。
有人在她面前敲了两下手指。那是他们组约定的信号——“到位了”。
她松开绳子,摘下眼罩。
阳光有点刺眼,她瞇了一下眼睛。等视线清晰之后,她看到地上有一个正方形,四条边拉得很直,四个角接近九十度。组员们站在正方形的四个边上,每个人脸上都带著完成任务之后的放松表情。
裴衍之站在她对面,手里握著绳子的一个角。他看到她在看他,点了点头。她没有点头,但她知道自己应该点头。她只是没有来得及,因为何悦已经在旁边欢呼了。
“我们第一名!”
第二个游戏是“两人三足接力”。每组选四对搭档,绑住相邻的脚,绕过标志桶返回,用时最短的组获胜。
何悦主动举手报名,拉著陆维安组成了一对。其他同事也纷纷组队,最后剩下程司白和裴衍之。
“程姐和裴哥一组!”何悦的声音在整个场地上空回荡。程司白看了她一眼,何悦假装没有看到,蹲下来绑带子。
教练递过来一根弹力带。程司白接过来,蹲下来绑在自己右脚和裴衍之的左脚上。带子有点紧,勒在脚踝上有点不舒服,她调整了一下长度,重新绑了一次。裴衍之站在那里没有动,等她自己调整好。
“好了。”她站起来。
两个人并排站著,肩膀之间隔著大概二十公分。程司白能闻到他身上那股柠檬和雪松的味道,比在公司里闻到的更明显,可能是因为在户外,风把味道吹过来了。
“我喊一二一。”裴衍之说,“一的时候你出左脚我出右脚,二的时候你出右脚我出左脚。”
“好。”
“准备好了吗?”
“准备好了。”
“一二一。”
两个人同时迈步。第一步有点别扭,程司白的节奏快了半拍,脚绊到了带子,身体往前倾了一下。裴衍之伸手扶住了她的手臂,稳住了她。
“慢一点。”他说,“不著急。”
“嗯。”
“一二一。”
这一次两个人配合得好多了。脚步的节奏慢慢对齐,先是脚踝上的带子不再拉扯,然后是肩膀的晃动开始同步,最后是呼吸——程司白发现自己呼气的频率和他迈步的频率一致了。呼,迈左脚,吸,迈右脚,呼,迈左脚。
他们绕过标志桶的时候,程司白转头看了一眼旁边的组。何悦和陆维安已经快到终点了,何悦在喊“快快快”,陆维安被她拽著几乎是在跑。其他组也有快到终点的,也有还在半路上挣扎的。
“最后一段。”裴衍之说,“加速。”
“好。”
两个人加快了步频。程司白不再去想哪只脚先出哪只脚后出,她只是跟著他的节奏走。带子还是勒在脚踝上,但她感觉不到了。她只感觉到风,阳光,脚下的草地,还有旁边这个人——他的肩膀在她旁边,近到只要她稍微侧一下身体就能碰到。
他们是第二组到达终点的。何悦和陆维安第一,但何悦冲刺的时候摔了一跤,裤子上沾了草汁,膝盖擦破了一点皮。陆维安蹲下来看她的伤口,她说没事没事,然后站起来拍了拍裤子,继续给其他人加油。
程司白蹲下来解开弹力带的时候,裴衍之也蹲下来了。两个人的手同时碰到带子的搭扣,手指几乎碰到一起。程司白把手缩回来,让他解。
他解开带子,站起来,把手伸给她。程司白看著那只手——手指修长,指节分明,掌心朝上,手指微微张开。她犹豫了一秒,把手放上去。
他把她拉起来了。
动作很轻,轻到不像是在拉一个人,更像是在扶一个随时会自己站起来的人。她的手在他掌心里停留了大概两秒,然后抽出来了。
何悦在不远处看到了这一幕。她没有掏手机。她只是站在那里,膝盖上的草汁还在往下淌,脸上挂著一个很大的笑容。
烧烤午餐在中午十二点开始。基地的工作人员支起了四个烤架,每组一个,食材摆在旁边的桌子上,有鸡翅、牛肉、玉米、香肠和各种蔬菜。何悦自告奋勇当“主烤官”,把陆维安拉过来当助手。两个人站在烤架前面,一个刷油一个翻面,配合得还算默契——除了何悦把第一批鸡翅烤焦了之外。
程司白坐在旁边的长椅上,手里拿著一瓶矿泉水。她不太饿,也不太想动,就坐在那里看其他人忙活。阳光透过树叶的缝隙照下来,在她身上投出一片一片的光斑,像一张被分割了的网。
裴衍之走过来,在她旁边坐下。两个人之间隔著大概三十公分,和在公司会议室里的距离相比,这已经很近很近了。
“你不吃东西?”他问。
“不饿。”
“你今天运动量不小,不吃东西下午会没力气。”
程司白转头看了他一眼。他正在看著烤架的方向,何悦在喊“牛肉好了谁要”,陆维安举著盘子冲过去。阳光从侧面照过来,在他脸上留下一半亮一半暗。他的侧脸很好看,线条比三年前更硬了一些,下巴的弧度更明显了。
“裴衍之。”她说。
“嗯。”
“你变了。”
裴衍之转头看著她。阳光在他眼睛里留下两个小小的光点,像萤幕上的光标——等待输入,等待指令,等待她接下来要说的话。
“哪里变了?”他问。
程司白看著他,看了大概三秒。这三秒里何悦喊了一声“程姐你要不要鸡翅”,她没有听到。陆维安说“程姐好像在忙”,何悦就不再喊了。
“以前你很感性,现在很理性。”程司白说。