评审会结束之后,程司白在工位上坐了半个小时,把联合压力测试的计划表排了出来。三天,七十二小时,覆盖十二个核心场景,每一个场景的测试参数她都写得很详细,精确到小数点后两位。她把计划表发给裴衍之的时候附了一行注释:“如果没有意见,明天上午九点开始。”
发送之后她关掉邮件,靠在椅背上。办公区里很安静,大部分人还在会议室里没有回来。窗外的阳光照在百叶窗上,在地上投下一条一条的光影。她看著那些光影,觉得它们像一段被分割的数据流——每一段都是完整的,但拼在一起才是全部的真相。
唐嘉树出现在办公区门口的时候,她没有注意到。直到他走到她面前,把一杯茶放在她桌上,她才抬起头。
“有空吗?”唐嘉树拉了一把椅子坐下,语气和往常一样随意,像在问一个技术问题。
程司白点了点头。唐嘉树是她在这家公司最尊敬的人,不是因为他的职位,是因为他看问题的方式——他总是能在技术问题背后看到人的问题,而且他从来不说废话。
“今天的评审会,你觉得怎么样?”唐嘉树喝了一口茶。
“正常。两种方案各有优劣,需要更多测试数据来支撑决策。”
“我不是问方案。”唐嘉树放下茶杯,看著她,“我是问你和裴衍之。”
程司白的手指在键盘上停了一下。“我们合作正常。”
“正常。”唐嘉树重复了这个词,嘴角动了一下,像是在笑又不像,“你知道吗,我做了二十年技术管理,见过很多技术合伙人吵架。有的吵完就散了,有的吵完反而更好了。你和裴衍之属于哪一种?”
程司白没有回答。
“你们今天的评审会,我注意到一件事。”唐嘉树的语速很慢,像在调试一段复杂的代码,每一行都要看清楚,“裴衍之在会上帮你的方案说话。他说Raft在高并发场景下表现更好,还给出了数据支持。你注意到了吗?”
“注意到了。”
“你觉得他为什么这么做?”
“因为数据支持那个结论。”
“数据也支持他的方案在边缘网络下更好。”唐嘉树说,“他完全可以不提你的优势,只强调自己的。但他没有。他选择了把两种方案的优劣都摆在台面上,让业务方自己做决定。这是一个非常公正的技术判断。”
程司白没有接话。她知道唐嘉树要说什么了。
“但我不觉得他只是在做技术判断。”唐嘉树的声音放低了一些,低到只有他们两个人能听见,“程司白,你知道他为什么坚持用Paxos吗?”
程司白的手指从键盘上收回来,放在膝盖上。她的手指很凉,凉到她自己都感觉到了。
“因为他不想让你的架构背负不必要的风险。”唐嘉树说这话的时候语气很平静,平静得像在解释一个技术概念,“Paxos是成熟方案,出问题的概率低。他知道你的Raft方案性能更好,但他更担心的是——如果Raft上线后出了问题,你是架构组的负责人,你要承担责任。”
程司白觉得自己的胸口被什么东西撞了一下。不是很重,但很准,准到正好撞在那个她一直在保护的地方。
“他选Paxos,不是因为他觉得自己的方案更好。”唐嘉树站起来,把茶杯端在手里,“是因为他不想让你冒险。”
程司白坐在椅子上,没有动。办公区里的光影随著太阳的角度移动了一点,原来在她桌上的那条光斑现在移到了地上。她看著那条光斑,觉得它像一个被移动了的指针——指向的还是同一个方向,但位置变了。
“我可能错了。”她说。
声音很轻,轻到她自己都不确定有没有说出口。但唐嘉树听到了。他站在那里,低头看著她,没有说话,只是点了点头,然后转身走了。
程司白一个人坐在办公区里,周围没有人。她的电脑萤幕暗了,键盘上的灯也灭了,只有窗外的阳光照进来,照在她桌上那个白色的马克杯上。杯子里没有水,空空的,干干净净的,像一个被清空了的容器。
她想起评审会上裴衍之说的那句话:“你什么时候学会共同承担了?”
她没有学会。她从来没有学过。她学到的都是相反的——靠自己,不要麻烦别人,不要让任何人为你承担任何东西。这是母亲教她的,也是生活教她的。她以为这是对的。她以为这是最安全的生存策略。
但现在她发现,这个策略有一个漏洞。
它保护了她不受到伤害,但也让她无法靠近任何人。她把所有的入口都封死了,外面的进不来,里面的出不去。她一个人住在一个密封的容器里,安全,稳定,但也很孤独。
裴衍之在过去的两周里,每天给她带咖啡。美式的,拿铁的,加了两份浓缩的。每一杯她都喝了,每一杯她都没有说谢谢。他还在杯壁上写字——“别用工作逃避”“不用现在回答我”。每一行字她都看了,每一行字她都记住了,但她一个字都没有回。
他为什么还要继续?
她不明白。
如果一个人给你发消息你不回,给你带咖啡你不说谢谢,在走廊上跟你说话你转身就走——正常人早就放弃了。三年前他放弃了,因为她说了“不打扰了”,他就真的不打扰了。她以为那就是答案——他不够坚持,他不够想要,他不够喜欢。
但现在她知道了。那不是不够。那是尊重。她说了不要,他就不要了。他没有纠缠,没有追问,没有在她家楼下等一整夜——因为他觉得那是她想要的。
她当时觉得那就是答案。现在她觉得那不是答案,那是一个误解。
一个持续了三年的误解。
裴衍之回到工位的时候,发现唐嘉树坐在他的位置上。
“唐总。”他站在旁边,没有坐下。
唐嘉树站起来,把位置让给他,自己拉了一把椅子坐在旁边。两个人沉默了一会儿,办公区里有其他同事在走动,有人叫了外卖,空气里有饭菜的味道。
“今天的评审会,你的表现不错。”唐嘉树说。
裴衍之没有接话。他知道唐嘉树不是来夸他的。
“你知道程司白为什么非要选Raft吗?”唐嘉树问。
裴衍之的手指在键盘边缘敲了一下。“因为性能好。”
“性能只是表面。”唐嘉树靠在椅背上,双手交叉放在腹部,“她想证明自己这三年没有白过。她想证明她离开你是对的。她想证明她一个人可以做得更好。”
裴衍之没有说话。这些话他不是没有想过,只是从来没有说出口。说出来就太像在为自己找理由了——她不是不喜欢你,她只是需要证明自己。这种话听起来像借口。
“她需要你的认可。”唐嘉树说这句话的时候,语气和说“今天天气不错”一样平淡,“她不会承认,她自己可能都没有意识到。但她选择Raft,有一部分原因是她想让你看见——你看,我做到了。”
裴衍之靠在椅背上,看著天花板。那盏旧灯管还在,光线不均匀,中间亮两边暗。他盯著那盏灯,脑子里反反复复转著一个念头。
她想让我看见。
他一直以为她想让他看不见。看不见她加班到凌晨,看不见她把外套叠好放回他的椅子上,看不见她在巷子里打电话的时候眼眶红了。她一直在躲,一直在藏,一直在说“不需要”。
但她想让我看见。
她选Raft,是因为她想让我看见她的成长。她在评审会上展示八千次测试数据,是因为她想让我看见她的专业。她喝了我买的拿铁,是因为她想让我看见——她愿意试一下。
她一直都在让我看见。
只是我没有看懂。
“唐总。”裴衍之坐直身体,“你为什么跟我们说这些?”
唐嘉树站起来,端著茶杯走到窗边。窗外的阳光很亮,照在他的后背上,把他的影子投在地上,长长的,瘦瘦的。
“因为我年纪大了,看不得年轻人浪费时间。”他转过身,背对著窗户,脸在逆光中看不清楚,“你们两个人,一个用工作逃避感情,一个用理性压制感情。你们以为这是成熟,其实这是胆小。”
裴衍之没有反驳。
“你知道分布式系统里最难解决的问题是什么吗?”唐嘉树问。
“共识。”
“不对。”唐嘉树摇了摇头,“共识有算法可以解决。最难解决的问题是——节点之间愿不愿意交换信息。算法只能保证交换信息之后能达成共识,但不能让节点愿意交换信息。如果两个节点互相不信任,不愿意交换自己的状态,再好的共识算法也没用。”
他把茶杯放在桌上,发出轻轻的一声响。
“你们两个人,就是两个不愿意交换信息的节点。程司白不愿意告诉你她在想什么,你不愿意告诉她你在怕什么。你们各自跑在自己的时钟里,永远对不上时间戳。”
裴衍之坐在椅子上,手指放在键盘上,没有敲。萤幕上是程司白刚才发过来的联合压力测试计划表,七十二小时,十二个场景,每一个参数都写得很详细。她在注释里写了“如果没有意见,明天上午九点开始”。
他看著这行字,想起她在走廊上说的那句话:“我只是不想你在上线后出问题。”
她不想我出问题。
不是因为我是业务中台的负责人。
是因为我是裴衍之。
他终于确定了。
唐嘉树走了之后,裴衍之在工位上坐了很久。他没有写程式码,没有看测试报告,只是坐著,看著萤幕上那封邮件。窗外的光线从白色变成橘黄色,办公区里的人陆续走了,灯一盏一盏地灭了。他没有注意到。
他在想一个问题。
三年前她提出分手的时候,他说“好,不打扰了”。他以为那是正确的选择——她想要什么,他就给她什么。她想要自由,他给自由。她想要安静,他给安静。他以为这就是爱一个人的方式——尊重她的选择,不打扰她的生活。
但现在他觉得,也许那不是她想要的。
她想要的可能不是不打扰。她想要的是——被打扰了也不会走的人。
一个不管她说多少次“不需要”,都会继续站在那里的人。
一个在她说“我们不合适”的时候,会说“我觉得挺合适的”的人。
一个在她关机三天的时候,不会发“好,不打扰了”,而是会站在她家楼下,等到她开门为止的人。
他没有做到这些。他选择了体面,选择了理性,选择了成年人该有的克制。他以为那是对的。但现在他觉得,那不是对的,那是胆小。
他怕被拒绝。怕她说了不要,他还在,显得很可笑。怕她觉得他纠缠不清,觉得他不够理性,觉得他还是三年前那个太感性的人。
所以他选择了安全的方式——不打扰。安全,体面,不会被拒绝。但也不会被接受。
他拿出手机,打开跟程司白的对话框。对话框里还是一条消息都没有——他发的那条“不是要证明自己”还在那里,她没有回。这条消息已经发了十几天了,像一个没有收到确认的请求,超时了,但他没有重发。
他打了一行字:“程司白,我可能选错了。”
看了很久,删掉了。
又打了一行字:“我不是不想打扰你,是怕你觉得我烦。”
删掉了。
又打了一行字:“明天见。”
没有删。但也没有发送。
他把手机放回口袋,站起来,走出办公区。走廊上的感应灯亮了,光线白得刺眼。他走到电梯前,按了下楼键。
电梯门打开的时候,他看到里面站著一个人。
程司白。
她站在电梯的角落里,手里拎著公事包,外套的拉链拉到最高。她看到他的时候眼神闪了一下——很快,快到几乎看不出来,但他看到了。
“你还没走?”她问。
“刚忙完。”他走进电梯,站在另一边。
电梯门关上,开始下降。两个人都没有说话,电梯里只有机械运转的声音,低沉的,均匀的,像一段没有感情的白噪音。
楼层数字从十五跳到十四,十三,十二。
“程司白。”他开口了。
“嗯。”
“你发的测试计划表我看了。没问题,明天上午九点开始。”
“好。”
电梯到了十楼。沉默又回来了,比之前更厚,更重,像一个被压缩了的档案,体积很小但内容很多。
“刚才唐总找我谈话了。”裴衍之说。
程司白的手指在公事包的提手上紧了一下。“他也找我了。”
“他跟你说了什么?”
电梯到了八楼。程司白沉默了几秒,这几秒里电梯的数字跳了两次,从八到七,从七到六。
“他说你选Paxos是因为不想让我的架构承担风险。”她说。
裴衍之没有否认。
电梯到了五楼。程司白转头看著他。电梯里的光线很均匀,照在他的脸上,把他的表情照得很清楚。他没有看她,目光落在电梯门上,嘴唇抿成一条直线。
“是真的吗?”她问。
裴衍之沉默了三秒。“是真的。”
电梯到了一楼。门打开,两个人站在里面,没有人走出去。
大厅里传来保全走动的声音,脚步声很远,模模糊糊的,像一段信号不好的广播。程司白站在电梯里,手里的公事包垂在身侧,她的手指攥著提手的皮质部分,指尖因为用力而发白。
“裴衍之。”她说。
“嗯。”
“方案的事,我们谈谈。”
裴衍之转头看著她。她的表情很平静,但她的眼睛不是。她的眼睛里有什么东西在动,很慢,很小心,像一个第一次走出安全区的程序,不知道边界在哪里,不知道会不会崩溃,但它还是走出了第一步。
“好。”他说。
程司白走出电梯,脚步声在大厅里响起。裴衍之跟在后面,两个人隔著两三步的距离,一前一后走出大楼。夜风吹过来,十一月的风已经很冷了,程司白把领口往上拉了拉,裴衍之看到了,把外套的拉链拉到最高。
两个人站在大楼门口,谁都没有先开口。
街上的车流很少,路灯的光照在空荡荡的人行道上,投出一片一片的橘黄色光斑。对面写字楼的灯还亮著,有人在加班,窗户里透出白色的光,一格一格的,像一个巨大的监控面板。
程司白转头看著裴衍之。
“去楼下咖啡馆吧。”她说,“这里不方便说话。”
裴衍之看著她的眼睛。那里面有什么东西在动,比刚才在电梯里更快了一些,像一个参数被调高了的进程——还在可控范围内,但已经不是休眠状态了。
“好。”
公司楼下的咖啡馆叫“深夜编译器”,名字是一个工程师取的,因为它二十四小时营业,永远亮著灯,永远有人坐在里面对著萤幕敲键盘。程司白从来没有来过这里——她不喜欢咖啡馆,不喜欢那种坐著不动就能闻到别人身上味道的空间,不喜欢背景音乐里那种故作深沉的爵士乐。
但今天晚上,她推开了门。
咖啡馆里人不多,靠窗的位置坐著一个正在开视频会议的人,角落里有一对情侣共用一副耳机听音乐。背景音乐是钢琴曲,很轻,轻到几乎听不出旋律,只有一些断断续续的音符在空气里飘。
程司白选了一个靠里的位置,卡座,两张沙发面对面,中间隔著一张窄窄的桌子。她把公事包放在旁边,坐下来的时候发现沙发太软了,整个人陷进去了一点。她不习惯这种柔软,身体微微绷紧,调整了一下坐姿,让自己看起来不那么局促。
裴衍之坐在对面。他把电脑放在桌上,没有打开,只是放在那里,像一个不需要使用的工具。服务员走过来,两个人同时说“美式”,然后对视了一眼。
“我还是美式。”程司白说。
“我知道。”裴衍之对服务员点了点头,“两杯美式。”
服务员走了。桌上剩下一盏小台灯,灯光是暖黄色的,照在两个人之间的桌面上,把木纹照得很清楚。程司白看著那些木纹,觉得它们像一段没有规律的日志——看起来是乱的,但如果你花足够的时间去读,也许能找到某种模式。
沉默持续了大约十秒。
程司白先开口了。
“我承认一件事。”她的声音比在会议室里低了一些,低到背景音乐几乎要盖过去,“我想用Raft,有一部分原因是想证明自己。”
裴衍之没有说话,只是看著她。台灯的光照在她脸上,把她下巴的线条照得很柔和,不像在会议室里那么硬。
“三年前离开那家公司之后,我去读了硕士,考了架构师认证,从工程师做到Team Leader。我做这些的时候,脑子里有一个声音一直在说——你要证明给所有人看,你可以。你不需要任何人。”
她停了一下,手指在桌面上轻轻敲了一下。
“但今天在评审会上,唐总问我为什么非要Raft的时候,我发现那个声音还在。不是因为性能更好,不是因为架构更优雅。是因为我想让你看见,我这三年没有白过。”
她说完这些话的时候,手指停止了敲击。桌面上的木纹在灯光下显得很安静,一条一条的,像一段被暂停的波形。
裴衍之沉默了几秒。这几秒里程司白听到背景音乐换了一首,还是钢琴曲,比之前那首更低了一些,音符之间的间隔更长。
“我也承认一件事。”他说,“我想用Paxos,有一部分原因是怕你承担风险。”
程司白的手指在桌面上动了一下。
“你的Raft方案性能确实更好,这个我知道。但我更担心的是——如果上线之后出了问题,你是架构组的负责人。所有人会看著你,问你怎么办。我不想看到那个画面。”
他说这话的时候语气很平静,平静得像在解释一个技术参数。但程司白听到了他声音底下的东西——那里面有一种她熟悉的频率,三年前她在他说“晚安”的时候听到过,在他说“别太累了”的时候听到过,在他说“你可以叫我一起”的时候听到过。
那是担心的频率。
“所以你选Paxos,不是因为你觉得它更好。”她说。
“不是。”裴衍之说,“是因为它更安全。不是对系统安全,是对你安全。”
程司白低下头,看著桌上的木纹。那些纹路在灯光下显得更清楚了,弯弯曲曲的,像一段没有起点也没有终点的路。她的视线沿著其中一条纹路走,从桌子的这一端走到那一端,发现它没有连到任何地方,在中间就断了。
“我三年前说你不够理性。”她说,“但其实我不是那个意思。”
裴衍之没有问她是什么意思。他坐在那里,身体微微前倾,双手放在桌上,手掌朝上,手指微微张开。那是一个开放的姿势——不设防,不防御,不保护自己。
“我是不敢。”程司白说,“我发现自己开始期待你的消息,开始算你什么时候会来找我吃饭,开始在那十五分钟的路程里不想回家。我很害怕。我怕如果继续下去,我会变成我妈那样——把全部的自己交出去,然后被剩下。”
她的声音在最后几个字的时候抖了一下。只有一下,然后就恢复了平稳。但裴衍之听到了。
“你妈没有被剩下。”他说。
程司白抬起头。
“她有你。”裴衍之看著她,台灯的光照在他眼睛里,把瞳孔照得很亮,“你一直在她身边。你没有走。”
程司白觉得眼眶有点热。她咬了一下嘴唇内侧,把那点热意压了回去。
“你也不会被剩下。”裴衍之的声音很轻,轻到像是在自言自语,“如果你不想被剩下,就不会。”
程司白没有说话。她不知道该说什么。她的逻辑系统在这一刻完全失灵了——没有输入可以处理,没有输出可以生成,所有的进程都挂起了,等待某个她没有的资源。
服务员端著两杯咖啡过来,打破了沉默。美式,不加糖不加奶,两杯都冒著热气。程司白端起杯子喝了一口,烫的,舌尖被烫了一下,但那点痛感让她清醒了一些。
“方案的事。”她把杯子放下,“我们需要一个折中方案。”
裴衍之也端起咖啡喝了一口,点了点头。“灰度上线。先用Paxos跑核心业务,用Raft跑边缘业务。对比数据跑一个月,再决定最终方案。”
程司白想了想。“不对。应该是反过来。Raft的性能更好,应该用在核心业务上。Paxos更稳定,用在边缘业务上更合适。”
“边缘业务的网络条件差,更需要稳定性。”
“但边缘业务的流量只有核心业务的十分之一。即使Paxos在边缘网络下表现更好,影响范围也有限。如果Raft在核心业务上出了问题,影响的是全部用户。”
“所以你的意思是把风险最高的方案用在最重要的业务上?”
“我的意思是把性能最好的方案用在最重要的业务上。风险可以通过监控和快速回滚来控制。”
两个人沉默了几秒,各自喝了一口咖啡。
“各退一步。”裴衍之说,“核心业务同时跑两套方案,用一致性哈希分流。百分之五十的流量走Raft,百分之五十走Paxos。对比跑两周,哪个好就用哪个。”
程司白在脑子里快速推演了一下这个方案的可行性。一致性哈希可以保证同一个用户的请求始终被路由到同一个方案,不会出现数据不一致的问题。两周的对比时间足够长,能覆盖到高低峰不同时段的流量。如果其中一个方案出现问题,可以快速切换到另一个方案,影响范围不超过百分之五十。
“可以。”她说,“但两周太短。三周。第一周观察,第二周校准,第三周做最终决策。”
“行。”
两个人同时端起咖啡杯,喝了一口。杯子的边缘碰到了嘴唇,温热的液体流进喉咙,带著咖啡特有的苦味。程司白不喜欢苦味,但她习惯了。习惯是一种很奇怪的东西——你每天都喝一样的东西,不是因为喜欢,是因为你知道它不会让你失望。
“裴衍之。”她放下杯子。
“嗯。”
“谢谢你。”
裴衍之的手指在杯壁上停了一下。“谢什么?”
程司白看著他。台灯的光照在两个人之间的桌面上,把木纹照得很清楚。那些弯弯曲曲的线条在灯光下显得很安静,像一段已经稳定下来的曲线——没有波动,没有异常,一切都在正常范围内。
“谢谢你,还愿意跟我合作。”她说。
裴衍之沉默了三秒。这三秒里背景音乐又换了一首,还是钢琴曲,比之前那首更轻了一些,音符之间的空隙更大,像一段有很多休止符的乐谱——声音和沉默交替出现,沉默比声音更长。
“程司白。”他说。
“嗯。”
“我一直愿意。”
这五个字说出来的时候,他的声音很平,平得像在说一个他一直知道的事实。没有强调,没有修饰,没有多余的语气词。就是一个简单的陈述句,主语谓语宾语,结构完整,语法正确,没有任何歧义。
但程司白听到了这五个字里面的所有东西。
三年。一千多天。从“好,不打扰了”到“我一直愿意”。中间隔著无数个失眠的夜晚,无数次打开对话框又关掉,无数次在走廊上擦肩而过却假装没有看见。他一直在。不是不打扰的那种在,是愿意被打扰的那种在。
她低下头,喝了一口咖啡。咖啡已经不烫了,温的,苦味比刚才淡了一些。杯子里的液面下降了一截,露出杯壁内侧一层浅浅的褐色痕迹,是咖啡干了之后留下来的。
她的耳尖红了。
不是那种被烫到之后的红,是另一种——从皮肤底下慢慢渗上来的,一层一层的,像一个参数被逐渐调高的系统,温度在上升,但没有报警,没有崩溃,一切都在可控范围内。
裴衍之看到了。他没有说破,只是端起自己的咖啡喝了一口,然后把杯子放下,动作很轻,轻到没有发出任何声音。
两个人在暖黄色的灯光下坐著,中间隔著一张窄窄的桌子。桌上放著两杯喝了一半的咖啡,一台没有打开的电脑,一盏照著木纹的台灯。背景音乐还在放,钢琴曲,很轻,轻到像一个人在很远的地方自言自语。
程司白的手机震了一下。
她拿起来看,是何悦发来的消息。
“程姐,唐总说项目下周开始灰度上线,你们准备好了吗?”
她看了一眼对面的裴衍之。他正在看手机,大概是同一条消息——何悦喜欢在群组里同步发送,确保每个人都能同时收到。
她打了两个字:“准备好了。”