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