两个人开始讨论测试用例的具体设计。程司白负责架构层的部分,裴衍之负责业务层的部分,中间有大量的接口需要对齐。他们一条一条地过,从输入参数到输出格式,从异常处理到日志记录,每一个细节都没有放过。
会议进行到一半的时候,陆维安推门进来了。
“裴哥,我——”他看到程司白坐在里面,声音忽然变小了,“我是不是打扰了?”
“没有。”裴衍之说,“什么事?”
陆维安走进来,手里拿著一份文件。“测试环境的资源申请表,需要你签字。”
裴衍之接过文件,签了名,还给他。陆维安接过文件的时候看了程司白一眼,嘴唇动了动,像是想说什么,最后还是没有说。
他走出会议室的时候回头看了一眼。程司白没有注意到,她正在看测试用例的文档。裴衍之注意到了。
下午四点半,测试用例的初稿完成了。程司白把文档保存好,合上电脑。
“今天就到这里。明天上午我把模拟环境搭好,你那边的数据准备好了就开始跑测试。”
“好。”
程司白站起来,拿起电脑和笔记本,走出会议室。走廊上空无一人,她的脚步声在大理石地面上响起,节奏均匀。
她走到茶水间门口的时候,陆维安从里面走出来。
“程姐。”
程司白停下脚步。“有事?”
陆维安手里端著一杯咖啡,表情有点紧张。他比程司白小一岁,个子很高,但站著的时候习惯微微驼背,看起来像一只还没长开的长颈鹿。
“那个……程姐,你明天中午有空吗?我想请你喝杯咖啡,讨论一下技术问题。”
程司白看著他。他的耳朵有点红,咖啡杯被他握得很紧,指节都发白了。
“什么技术问题?”
“就是……关于共识算法选型的一些细节。我有点不太理解你方案里的那个动态超时机制,想请你讲解一下。”
程司白想了一下。“你可以在邮件里问我。”
“邮件里说不清楚……”陆维安的声音越来越小,“算了,没关系,我回去再看一下文档。”
他转身要走。
“明天中午十二点半,楼下咖啡馆。”程司白说,“我有半个小时。”
陆维安转过身,眼睛亮了一下。“好!谢谢程姐!”
他快步走开了,脚步比来的时候轻快了很多。
程司白看著他的背影消失在走廊尽头,继续往自己的工位走。经过业务中台办公区域的时候,她看到裴衍之坐在工位上,正在看手机。
她没有停下来。
下午六点,程司白收拾东西准备下班。今天的工作进度比她预期中快,测试用例的初稿完成了,模拟环境的配置也写好了脚本,明天上午直接跑就可以。
她把电脑关掉,拿起公事包,走出办公区。走廊上空无一人,大部分同事都已经走了。电梯门打开的时候,裴衍之从另一边走过来。
两个人在电梯门口对视了一眼。
裴衍之按下楼键,门打开,两个人走进去。
电梯里只有他们两个人。楼层数字从十五跳到十四,十三,十二。
“陆维安约你喝咖啡?”裴衍之的声音在电梯里显得很平静。
程司白看著电梯门上反射的倒影。“嗯,但我拒绝了。”
“我听到的版本是他约到了。”
“我后来同意了。”程司白说,“他说是技术问题。”
电梯到了十楼。裴衍之沉默了几秒。
“你为什么同意?”
程司白转头看了他一眼。他没有看她,目光落在电梯门上,表情很平静,平静得像在问一个完全无关紧要的问题。
“因为他技术不够好。”她说。
电梯到了八楼。裴衍之的嘴角动了一下,幅度很小,小到如果不是程司白在看他的倒影,根本不会注意到。
“他技术不够好,所以你愿意花时间教他?”他说。
“对。”
“那我技术够好吗?”
电梯到了五楼。程司白没有立刻回答。
电梯门的倒影里,裴衍之的目光从门上移开,落在她的侧脸上。她没有转头,但她知道他在看她。
“你技术够好。”她说,“所以我不需要花时间教你。”
电梯到了一楼。门打开。
程司白走出去,脚步声在大厅里响起,一二一二,节奏均匀。
裴衍之站在电梯里,手指按在开门键上,看著她的背影走出大厅,推开玻璃门,消失在街角的转弯处。
他松开按键,电梯门缓缓关上。
电梯开始上升的时候,他靠在墙上,闭了一下眼睛。
“因为他技术不够好。”
他听懂了。
她不是在说陆维安的技术。
她是在说,她愿意跟陆维安喝咖啡,是因为陆维安不够好,所以她不用担心。她不用担心喝咖啡的时候会心跳加速,不用担心说话的时候会词不达意,不用担心离开的时候会回头看。
她愿意跟一个不够好的人喝咖啡。
但跟一个够好的人,她连一杯咖啡都不敢喝。
电梯到了十五楼,门打开。裴衍之走出来,走廊上很安静,办公区里只剩几盏灯还亮著。
他走到自己的工位前,坐下来,打开电脑。
萤幕上是程司白下午发过来的测试用例文档。他从头到尾看了一遍,在几个地方加了注释,然后保存,关闭。
手机震了一下。
他拿起来看,是陆维安发的消息。
“裴哥,明天中午我要跟程姐喝咖啡讨论技术问题,你有没有什么问题想让我帮你问的?”
裴衍之看著这条消息,打了几个字,删掉。又打了几个字,又删掉。
最后他回了一句:“没有。好好学。”
陆维安秒回:“好的裴哥!”
裴衍之把手机放在桌上,靠在椅背上,看著天花板。
天花板上有一盏灯,灯管有点旧了,光线不是很均匀,中间亮两边暗。他盯著那盏灯看了很久,脑子里反反复复转著一句话。
“因为他技术不够好。”
她说这句话的时候语气很平,平得像在念一段程式码注释。但他听到了注释背后的那层意思。
她没有变。
她还是那个用技术术语来表达一切的人。喜欢一个人她说不出来,所以她说“你的代码写得很好”。想念一个人她说不出来,所以她说“这个问题只有你能解决”。害怕一个人她说不出来,所以她说“我们不合适”。
现在她说“因为他技术不够好”。
他在想,在她心里,他的技术够好。
这算不算一种肯定?
他觉得自己很可笑。三十岁的人了,还在分析前女友说的话,像一个刚学会解码的初级工程师,对著一段简单的字符串反复解析,试图从里面读出不存在的信息。
但他知道,那段字符串里有信息。
只是他不知道怎么解码。
或者他知道,但他不敢解。
测试跑了三天,数据开始慢慢出来。
程司白每天早上八点到公司,第一件事就是打开监控面板,看昨晚自动执行的测试结果。Raft变体的数据一天比一天好,吞吐量稳定在一万四千笔交易以上,延迟控制在两百五十毫秒以内。她把每一轮的数据都记录在一个表格里,用蓝色标注达标的项目,用红色标注需要优化的项目。蓝色越来越多,红色越来越少。
裴衍之那边的Paxos测试也在同步进行。两个人每天下午两点在会议室四碰头,交换数据,讨论差异,调整参数。会议室的空调修好之后就再也没有坏过,温度恒定在二十二度,舒适得让人想睡觉。但他们都没有睡意。三天下来,测试用例从最初的五十个增加到了八十个,边缘场景覆盖率从百分之九十五提升到了百分之九十七点五。
何悦每天准时在“共识观察小组”里汇报进度。她的汇报风格越来越像技术周报——“Day1: 双方在会议室四进行了为期两小时的技术磋商,达成三项共识,零项争议。Day2: 磋商时长缩短至一小时三十分钟,达成两项共识,新增一项待讨论事项。Day3: 磋商时长一小时,达成零项共识,零项争议。备注:双方可能已经不需要说话就能互相理解了。”
陆维安在群组里回了一个问号。
何悦:“你不懂。这是默契。”
第四天晚上,测试进入关键阶段。
程司白需要在凌晨跑一轮大规模的压力测试,模拟双十一级别的流量冲击。她下午的时候把测试脚本又检查了三遍,确认每一个参数都设置正确,然后在系统里预约了晚上十点到凌晨两点的计算资源。
十点整,测试准时启动。
监控面板上的数字开始跳动。每秒一千笔,两千笔,五千笔。吞吐量曲线平稳上升,延迟曲线在两百毫秒的位置上轻微波动,没有出现异常尖峰。程司白盯著萤幕,手指放在键盘上,随时准备介入。
十点半,流量达到每秒八千笔。系统开始出现轻微的性能抖动,延迟上升到两百八十毫秒,但在预期范围内。她在笔记本上记录了这个数据,继续观察。
十一点,流量突破每秒一万笔。监控面板上的曲线开始出现不规则的波动,延迟在两百五十到三百五十毫秒之间来回跳动。她打开日志系统,开始逐条排查。
十一点二十分,她发现了一个问题。在流量高峰期间,领导者选举的触发频率比预期中高了百分之十五。原因是动态超时窗口的校准算法在极端负载下反应不够快,网络延迟的抖动幅度超过了算法预设的阈值。
她开始修改参数。先把超时窗口从两百到四百毫秒调整为两百五十到四百五十毫秒,重新跑了一轮模拟,效果不明显。又把校准频率从每秒一次改为每秒两次,再跑一轮,延迟下降了二十毫秒,但还是不够。
十一点五十分,她决定重写校准算法的一部分逻辑。把原本的线性调整改为指数加权移动平均,让算法对最近的网络状况更加敏感。她手指在键盘上飞快地敲,眼睛盯著萤幕,大脑全速运转。
十二点十分,新算法部署完毕。她重新启动测试,流量从每秒八千笔开始爬升。
曲线平稳了。
延迟稳定在两百四十毫秒上下,波动幅度不超过百分之五。领导者选举的频率降回了设计预期值。她盯著萤幕看了五分钟,确认数据稳定之后,在笔记本上写了一行字:“优化成功。延迟降低百分之十二。”
她靠在椅背上,呼了一口气。
办公区里很安静。窗外的城市灯光透过玻璃照进来,在桌面上投下一片橘黄色的光。她转头看了一眼走廊,对面的办公区域灯还亮著。
她没有觉得奇怪。这三天她已经习惯了——不管她加班到多晚,对面的灯总是亮著的。有时候她能看到裴衍之坐在工位上,有时候只能看到萤幕的光,但她知道他在。
十二点四十分,她把第三轮测试跑完,数据全部记录好,开始收拾东西。站起来的时候觉得脖子有点酸,她伸手揉了一下,发现肩膀也僵了。
她决定再坐一会儿。
趴在桌上的时候她想,就瞇五分钟。五分钟之后就起来,把测试结果发给裴衍之,然后回家。
五分钟变成了五十分钟。
裴衍之从对面办公区域走过来的时候,走廊上的感应灯亮了。他手里端著一杯水,打算去茶水间续一杯,经过架构组办公区域的时候看到角落里还亮著一盏灯。
他停下脚步。
程司白趴在桌上,脸朝著窗户的方向,头发散下来遮住了半张脸。她的电脑还开著,萤幕上是监控面板,曲线平稳,一切正常。键盘旁边放著笔记本,翻开到最新的一页,上面是她工整的字迹:“优化成功。延迟降低百分之十二。”
他站在那里看了大概十秒。
然后他走过去,把水杯放在旁边的桌上,脱下自己的外套,轻轻盖在她身上。动作很慢,很小心,像在操作一个容易崩溃的系统——每一步都要确认不会触发异常。
外套碰到她肩膀的时候她动了一下,眉头微微皱起,但没有醒。她的呼吸很浅,很均匀,睫毛在脸颊上投下一小片阴影。
裴衍之站在她旁边,低头看著她。
他想伸手把她脸上的头发拨开。手指动了一下,又收回去了。
他转身走回自己的工位,打开电脑,继续写测试报告。
凌晨一点四十分,程司白醒了。
她睁开眼睛的时候发现自己趴在桌上,脖子酸得厉害,右手因为压了太久而发麻。她动了一下,肩膀上有什么东西滑下来。
一件外套。深蓝色的,袖口挽到小臂中段,内衬是灰色的绒布。
她认得这件外套。
三年前他穿的就是这件。有一次她加班到很晚,趴在桌上睡著了,醒来的时候身上也盖著这件外套。那次他还在旁边放了一杯咖啡和一张纸条。纸条上写著“别太累了”。
这次没有纸条。只有外套。
她把外套拿起来,抱在手里。绒布的触感很柔软,带著一点点温度,还有那股柠檬和雪松的味道。
她坐在那里,抱著那件外套,发了大概两分钟的呆。
然后她把外套叠好。四折,边角对齐,折成一个整齐的长方形。她折得很仔细,像在写一段需要严格遵守格式规范的代码——每一行都对齐,每一个括号都在正确的位置上。
她把叠好的外套放在椅子背上,关掉电脑,关掉灯,走出办公区。
经过业务中台办公区域的时候,灯已经灭了。他在她醒来之前就走了。或者他根本没有走,只是把灯关了,在黑暗里坐了一会儿。她不知道。
她把外套带走了。
第二天早上,程司白比平时早了二十分钟到公司。
她走到业务中台办公区域的时候,裴衍之还没有来。他的工位很整齐,键盘放在正中间,萤幕擦得很干净,文件夹立在显示器旁边,每一份的书脊都朝同一个方向。
她把叠好的外套放在他的椅子上。
没有留纸条。没有发消息。什么都没有。