技术评审会的会议室冷气开得太足,程司白把西装外套的袖口往下拽了拽,指尖触到手腕上一小片冰凉的皮肤。
她面前摊著一本笔记本,打开到第三页,上面是她手写的技术要点——字迹工整得像打印体,每个术语后面都跟著精确的页码标注。这是她的习惯,开会前会把对方方案的技术文档读三遍,第一遍理解架构,第二遍找漏洞,第三遍准备反驳。
投影幕上正在播放架构方案的最后一页。
“……综上所述,业务中台采用基于Paxos的数据一致性方案,可以保证在分布式节点出现故障时,系统仍能达成共识。预计吞吐量每秒一万两千笔交易,延迟控制在三百毫秒以内。”
裴衍之站在投影幕前,手里握著翻页笔,声音平稳,语速适中。他穿著深蓝色的衬衫,袖口挽到小臂中段,露出腕上的手表——那是三年前程司白送他的生日礼物,她认出来了,因为表盘上有一道细微的刮痕,是她当时包礼物时不小心用剪刀划的。
她把目光从那道刮痕上移开,低头在笔记本上写了两个字:延迟。
裴衍之说完最后一句话,会议室陷入短暂的安静。技术总监唐嘉树坐在会议桌中间的位置,点了点头,正要开口。
“我有问题。”
程司白的声音不大,但足够清晰。她抬起头,目光越过会议桌上散落的笔记型电脑和矿泉水瓶,直直落在裴衍之脸上。
“程司白,架构组负责人。”她自我介绍,虽然在座所有人都知道她是谁,“关于数据一致性方案,我有几个技术细节需要确认。”
裴衍之的表情没变,只是翻页笔在他指尖转了半圈。“请说。”
“第一,”程司白翻开笔记本,念出她事先准备好的问题,“Paxos算法在多个提案者并发场景下,活锁问题如何解决?你的方案文档第4.3节提到“通过随机超时机制避免”,但我没有看到具体的数学证明。”
“第二,你的方案假设网络延迟在可预测范围内,但业务中台需要对接海外节点,跨洲网络的延迟抖动会导致频繁的领导者选举,这时候系统的可用性是多少?你的文档没有给出数据。”
“第三,”她停顿了一下,把笔记本翻到下一页,“你在容错设计中采用的是少数服从多数的投票机制,但当三个机房中的一个出现网络分区时,你怎么保证剩下的两个机房不会出现脑裂?”
她一口气说完,会议室里的温度仿佛又降了几度。
坐在程司白旁边的何悦悄悄往椅子里缩了缩,眼睛却亮得发光,手在桌子底下飞快地给同事发消息:“程姐开杀了。”
裴衍之沉默了三秒。
这三秒里,程司白注意到他的右手拇指按了一下翻页笔的按钮,那是他思考时的小动作,三年前她就知道。他没有慌乱,也没有急著辩解,而是把翻页笔放在桌上,双手撑著会议桌的边缘。
“程司白,”他叫她的名字,语气和当年在她家楼下说“晚安”时一模一样,平静、克制、带著某种她说不清楚的温度,“你提的三个问题,我逐个回答。”
“第一,活锁问题的解决方案不是随机超时,是带有退避机制的随机超时。数学证明在方案附录B,如果你看完了全文,应该能找到。”
程司白的手指在笔记本边缘轻轻敲了一下。她确实没有看附录。
“第二,海外节点的延迟抖动问题,我们做过模拟测试,数据在测试报告第七章。结论是在三百毫秒的延迟下,领导者选举频率会增加百分之十五,但系统可用性仍保持在百分之九十九点九以上。”
“第三,”他微微侧头,目光从她脸上移到投影幕上,又移回来,“网络分区场景下的脑裂问题,我的方案确实没有给出完美解决方案。因为在分布式系统里,脑裂没有完美解法,只有取舍。我选择的是优先保证数据一致性,牺牲一部分可用性——也就是CP系统。你的架构组在三个月前的技术评审中,不也投票通过了同样的取舍原则吗?”
最后一句话像一把手术刀,精准地切开了她的防线。
程司白面无表情地看著他,笔记本上的字迹在她视线里变得模糊了一瞬。她当然记得那次评审,是她亲自主持的,是她说服所有人接受CP原则,是她写下了技术决策文档的最终版本。
她没有反驳,因为他说的都是事实。
唐嘉树在这时候开口了,声音温和,带著某种长辈特有的从容:“看来两位对技术方案的理解都很深入。程司白,你对裴衍之的方案还有其他意见吗?”
程司白把笔记本合上。“有。他的方案整体架构没有问题,但数据一致性方案太弱,不符合公司的技术标准。我建议否决,重新设计。”
“否决”两个字落地的瞬间,裴衍之的表情终于出现了一丝裂缝。他的眉头微微皱起,嘴角抿成一条直线,那是他在压制情绪的标志——程司白见过这个表情,三年前她说“我们分手吧”的时候,他也是这样。
“程司白,”裴衍之的声音比之前低了半度,“我的方案完全符合公司技术标准。你说的“太弱”,具体是指什么?如果你拿不出具体的技术依据,只是因为个人偏好而否决,那这场评审就没有意义了。”
“个人偏好?”程司白站起来,手掌撑著桌面,“裴衍之,你觉得我是在针对你?”
“我没有这么说。”裴衍之也站直了身体,“但你的反对意见集中在数据一致性上,而这个问题在我们系统的业务场景中并不是瓶颈。你在用理论上的极端情况否定一个在实践中可行的方案。”
“实践可行不代表架构优雅。”
“架构优雅不代表能按时上线。”
会议室的空气凝结了。何悦缩在椅子上大气都不敢喘,坐在裴衍之旁边的陆维安试图开口缓和气氛,被唐嘉树一个眼神制止了。
唐嘉树站起来,走到会议桌的中间位置,把两人的视线隔开。“够了。”
他看看程司白,又看看裴衍之,语气平静得像在讨论今天的天气:“技术方案有分歧很正常,吵架解决不了问题。这样吧,这个项目架构组和业务中台必须合作,否则不启动。你们回去再讨论,下周一给我一个双方都能接受的方案。”
“唐总——”程司白开口。
“没有商量的余地。”唐嘉树打断她,拿起桌上的笔记本,“散会。”
会议室里的人陆续离开。何悦收拾东西的时候频频看向程司白,想说什么又不敢,最后只是小声说了句“程姐,我先走了”,就抱著笔记本匆匆出了门。
陆维安走到裴衍之旁边,低声问:“裴哥,你还好吧?”
裴衍之没回答,只是把翻页笔放回桌上,开始收拾自己的东西。
程司白是最后一个起身的。她把笔记本放进公事包,拉上拉链,转头看见裴衍之正把方案文档装进文件夹。他的动作很慢,每一页都对得很整齐,像是在刻意拖延什么。
她没有等他,拎著公事包走向会议室的门。
电梯在大楼的东侧,需要经过一条长长的走廊。程司白的脚步声在走廊里回荡,高跟鞋敲击大理石地面,节奏均匀,像一段没有感情的程式码。
她在电梯前停下来,按了下楼键。
电梯门打开的时候,身后传来另一个脚步声。
裴衍之走进电梯,站在她旁边,按了同一层楼的按钮。
电梯门关上,狭小的空间里只有他们两个人。程司白看著电梯门上反射的倒影,他站在她右后方,比她高出大半个头,肩膀的线条比三年前宽了一些。
电梯开始下降。
沉默持续了大概十秒,程司白先开口了。
“好久不见。”
她说这话的时候没有转头,声音很轻,像是在自言自语。电梯里的空调嗡嗡作响,几乎要把这三个字吞没。
裴衍之沉默了三秒。
这三秒里,程司白看见电梯门的倒影中,他垂在身侧的手握了一下拳头,又松开。
“好久不见。”
他的声音比她想像中平静,平静得像在确认一个无关紧要的事实。
电梯到达楼层,门打开。程司白走出去,没有回头,脚步声沿著走廊一路远去。
裴衍之站在电梯里,手指按在开门键上,看著她的背影消失在走廊尽头。
她还是那个样子,走路的姿势、说话的语气、甚至提问题的角度,都和三年前一模一样。唯一不同的是,她现在是架构组的负责人,坐在会议桌的主位,有资格否决他的方案。
电梯门缓缓关上,裴衍之没有走出去。
他靠在电梯的墙上,闭了一下眼睛。脑子里翻来覆去只有一个念头:她瘦了。
程司白回到工位的时候,何悦正在茶水间门口探头探脑地张望,看到她走过来,立刻缩回去假装倒水。
程司白没理她,坐到自己的位置上,打开抽屉,从最里面拿出一部旧手机。
那是她三年前用的手机,萤幕上有几道细微的刮痕,边框的漆磨掉了一小块。她按了一下电源键,电池还有一半的电量——她每隔几个月会给它充一次电,从来不开机,只是怕电池坏掉。
她打开手机,点进讯息应用程式,找到那个没有备注名的对话框。
对话框里只有几条讯息,时间停留在三年前的某个深夜。
她发的:“裴衍之,我们不合适。你太感性了,我不需要。”
他回的:“好,不打扰了。”
她盯著这几行字看了很久,萤幕的光映在她脸上,把她的表情照得一片空白。
旁边的何悦终于忍不住了,端著一杯水走过来,假装不经意地问:“程姐,你在看什么?”
程司白按掉萤幕,把手机放回抽屉,锁上。
“没什么。”
她的声音很平,平得像一面结了冰的湖。
何悦识趣地没再问,端著水走开了,走了几步又回头看了一眼。
程司白已经打开了电脑,萤幕上是裴衍之的技术方案文档。她的手指放在键盘上,却一个字都没有打。
萤幕的光照著她的脸,她的表情很平静,平静得像一个正在执行程式码的机器。
但如果有人仔细看她的眼睛,会发现她的目光根本没有聚焦在萤幕上。
她在看萤幕里反射的自己。
那个自己穿著整齐的西装,头发挽得一丝不苟,表情冷静,姿态从容——和三分钟前在电梯里说“好久不见”时一模一样。
她忽然觉得有点讽刺。
她是做分布式系统的工程师,每天的工作是让成千上万个节点达成共识。她可以设计出最优雅的共识算法,可以解决最复杂的数据一致性问题,可以用数学证明一个系统最终会收敛到正确的状态。
但她不知道怎么让两个人,达成共识。
窗外是城市的夜景,办公区里只剩下零星几个加班的同事。程司白关掉文档,打开一个新的程式码档案,在里面写了一行注释:
// TODO: 解决共识问题
她看著这行字,忽然觉得好笑,又觉得荒谬。
系统的共识问题,她可以写出完美的证明。
人与人之间的共识问题,她连一个变数都定义不清楚。
远处某个工位传来键盘敲击的声音,节奏稳定,像一段没有感情的白噪音。
程司白关掉编辑器,关掉电脑,拿起公事包走出办公室。
经过裴衍之团队的办公区域时,她没有停下脚步,也没有转头去看。
但如果她转头,她会看见裴衍之的工位上灯还亮著,萤幕上打开的正是她的架构组文档。
他也在看。
只是两个人都假装,没有在看。
电梯门关上的声音在她身后响起的时候,程司白没有回头。
走廊很长,从电梯口到架构组的办公区域需要经过三扇窗户、一个茶水间、一面贴满技术海报的墙。她的脚步声均匀地敲击在大理石地面上,每一步的间隔都几乎相等——这是她从小养成的习惯,走路的时候会在心里数拍子,一二一二,像一段稳定的时钟信号。
这是她让自己保持冷静的方式。
架构组的办公区域在走廊尽头,靠窗的一排工位。程司白的工位在角落,桌上放著一个萤幕擦拭布、一个白色的马克杯、一本翻开到第七章的《分布式系统原理与实践》。她的东西永远摆在固定的位置,笔在右边,笔记本在左边,键盘正对萤幕,连滑鼠垫的边缘都与桌沿平行。
她坐下来的时候,手指碰到键盘,冰凉的触感让她想起刚才会议室里的冷气。
裴衍之站在投影幕前的样子还在她脑海里转。他瘦了一些,下巴的线条比三年前更硬,说话的时候习惯性地微微侧头,眼睛会瞇起来一点——那是他在思考的标志。以前她觉得那个表情很好看,现在她觉得那个表情很讨厌。
不是因为不好看,是因为她还记得。
她打开抽屉拿充电线的时候,手指碰到了一个硬邦邦的东西。
是一部旧手机。
萤幕上没有裂痕,但边框的漆磨掉了一小块,那是她当年摔的。分手那天她把手机摔在地上,捡起来之后发现除了边框掉漆之外什么问题都没有,像他们的关系——表面上完好无损,其实某个角落已经碎了。
她按了一下电源键。
萤幕亮起来的瞬间,桌面上那张照片让她呼吸停了一秒。
照片里是两年前的某个周末,他们在公司的天台上。裴衍之穿著一件灰色的连帽衫,手里拿著两杯咖啡,对著镜头笑得很开心。她站在他旁边,头发被风吹乱了,嘴角有一点点上扬的弧度——那是她为数不多的、被拍下来的笑容。
她记得那天。那天他们加班到凌晨三点,终于把一个困扰了两周的性能瓶颈解决了。裴衍之说要去天台看日出,她说无聊,但还是跟著去了。日出还没出来的时候他说,程司白你知道吗,这是我进公司以来最开心的一天。她问为什么。他说因为你今天笑了三次。
她当时觉得这个人真的很奇怪,会去数别人笑了几次。
现在她觉得这个人真的很讨厌,因为她记得那天她确实笑了三次。
程司白盯著那张照片看了大概十秒,然后把手机翻过去,萤幕朝下扣在桌上。
她不想看。她不能看。
那些记忆像潮水一样涌上来,不管她怎么筑坝都没用。
三年前她刚进这家公司的时候,还不是架构组的负责人。她只是一个刚毕业的工程师,坐在大开放区最角落的工位上,每天写程式码、修Bug、开会的时候一句话都不说。同事们觉得她高冷,其实她只是不知道怎么开口。她从小就不擅长这件事——跟人说话,跟人靠近,跟人建立某种不需要证明的关系。
裴衍之是第一个让她觉得说话没那么难的人。
他坐在她隔壁的工位,每天早上来的时候会跟她说早安,声音很轻,像怕打扰她。午饭时间他会问她要不要一起,她说不用,他就点点头,自己去了。第二天还是会问。第三天也是。第四天也是。
大概过了一个月,她终于说了一句“好”。
那是她第一次跟同事一起吃午饭。食堂很吵,到处都是说话的声音。裴衍之坐在她对面,一边吃饭一边跟她讲他最近在做的项目,讲到有趣的地方会自己先笑起来。她发现他笑起来的时候眼睛会弯成两道月牙,看起来很温暖。
她不知道自己有没有笑。但那天下午写程式码的时候,她发现自己哼了一首歌。
那是她很久没有做过的事。
后来他们开始一起加班、一起吃饭、一起在下班的路上走一段路。裴衍之住在公司北边,她住在东边,其实完全不顺路,但他每次都会说“我刚好也要往这边走”,然后陪她走十五分钟到她家楼下。
她知道他在说谎。但她没有拆穿。
因为那十五分钟的路程,是她一天中最放松的时间。他们会聊今天遇到的技术难题,聊最近看的书,聊小时候的事。她告诉他自己是单亲家庭,妈妈是高中数学老师,从小对她要求很严格。他说他家里开了个小公司,爸妈经常吵架,但吵完之后会一起去吃火锅。
她说:“你们家好奇怪。”
他说:“你们家也好奇怪。”
她问:“哪里奇怪?”
他说:“你妈把你教得太好了,好到你有时候不像一个真人。”
她不懂这句话是什么意思。他解释说:“真人会犯错,会撒娇,会说自己累。你不会。你像一个写得很完美的程式,永远不会崩溃,但也永远不会更新。”
她当时觉得他在胡说八道。现在想起来,他说的可能是对的。
母亲的电话总是打得很准时,每周六晚上八点,从来不迟到也不早到。
程司白拿出手机,翻到通话记录。上周六的通话时长是四分三十秒,再上周是三分五十秒,再上周是五分十秒。每次的通话内容都差不多——母亲问她吃饭了吗、工作怎么样、有没有加班,她回答吃了、还行、加了一点。然后母亲说注意身体,她说好。然后母亲说挂了吧,她说好。
四分三十秒里,有三分钟是沉默。
她记得小时候不是这样的。小时候母亲会抱著她讲故事,会在她发烧的时候整夜不睡守著她,会在她考了一百分的时候笑著摸她的头。但母亲也很少笑,大部分时候眉头是皱著的,眼睛里有一种她说不清楚的东西——后来她才知道那叫疲惫。
父亲在她三岁的时候离开了。母亲从来不提原因,只在某一次她问“为什么别人都有爸爸”的时候说了一句话。
那句话她记了二十五年。
“司白,妈妈一个人把你拉扯大,你要记住,这世上能靠的只有自己。”
那天母亲说这话的时候没有看她,正在厨房里洗碗。水龙头的声音很大,哗哗哗地响,但每一个字她都听得很清楚。
从那天起,她就学会了一件事:不要依赖任何人。
依赖是危险的。依赖意味著你把一部分自己交给了别人,而别人随时可以拿走。她的父亲拿走了母亲的一部分,母亲从此再也没有完整过。她不要那样。
所以她拼命读书、拼命工作、拼命让自己变强。她不跟同事走得太近,不交太多朋友,不在任何人面前哭。她把自己活成了一个孤岛,岛上有完善的基础设施、稳定的电力供应、备份的发电机组——她不需要任何外界的补给,也能运转得很好。
直到裴衍之出现。
直到她发现自己开始期待他的消息。
那种感觉很陌生,陌生到让她害怕。每天早上打开手机的时候,她会先看有没有他的讯息。开会的时候她会想他中午会不会来找她吃饭。加班到很晚的时候她会想他会不会又说“刚好顺路”。
她发现自己开始依赖他。
不是那种“我需要你的帮忙”的依赖,是那种“我想见到你”的依赖。后者更可怕,因为前者可以用逻辑解释,后者没有理由。
她试过说服自己这只是一时的错觉。她试过刻意疏远他,不回他的讯息、不跟他吃午饭、不让他陪她走那十五分钟。但每次他问“你今天怎么了”的时候,她就会心软。
心软是最大的弱点。
分手那天是个周六。母亲的电话刚打完,内容和往常一样——吃饭了吗、工作怎么样、有没有加班、注意身体、挂了吧。挂了电话之后她坐在床上,手机萤幕亮著,上面是裴衍之发来的讯息。
“明天要不要一起去那家新开的书店?听说有很多技术书。”
她看著这行字,手指悬在萤幕上方。
她很想回“好”。
这个念头让她全身发冷。
她想起母亲说的话。她想起父亲离开之后母亲再也没有笑过的样子。她想起自己发过誓不要变成那样。
依赖等于脆弱。脆弱等于受伤。受伤等于无法修复。
这个逻辑链条在她脑子里转了一圈又一圈,像一个死循环,永远跳不出来。
她打了四个字:“我们分手吧。”
发送之后她把手机摔在地上,然后捡起来,看到他回了三个问号。
她没有解释。她不知道怎么解释。她总不能说“因为我太喜欢你了,我怕有一天你不喜欢我了,我会崩溃”。那太可笑了。她是一个工程师,工程师不会说这种话。
她又发了一条:“裴衍之,我们不合适。你太感性了,我不需要。”
这条发出去之后,他没有立刻回。
她等了五分钟、十分钟、半个小时。手机萤幕暗了又亮,亮了又暗。她把对话框打开关上、关上打开,重复了不知道多少次。
最后他回了四个字:“好,不打扰了。”
她把对话框删了。
但她没有把他从通讯录里删掉。她也不知道为什么。
“程姐?”
办公室的灯不知道什么时候暗了下来。窗外的天色已经完全黑了,城市的灯光从玻璃窗照进来,在桌面上投下一片橘黄色的光。
程司白抬起头,看见何悦站在门口,手里端著一杯水,表情小心翼翼,像一只试探著要不要靠近的猫。
“程姐,你还没走啊?”何悦走进来,目光在她脸上停留了一下,“你脸色不太好,是不是不舒服?”
“没有。”程司白把扣在桌上的手机翻过来,萤幕朝下放进抽屉,动作很快,像在藏什么不该被看到的东西。
何悦假装没看见,自顾自地坐到旁边的椅子上,喝了口水,然后沉默了大概五秒。
这五秒里程司白知道她要问什么了。何悦这个人藏不住话,每次要问敏感问题之前都会先喝一口水,然后沉默五秒,像是在给自己打气。
“程姐,你跟裴哥是不是认识啊?”
来了。
程司白的手指在键盘上停了一下。“不熟。”
两个字,干脆俐落,像一段编译通过的程式码,没有任何语法错误。
何悦“哦”了一声,又喝了口水,明显还想说什么,但看到程司白的表情之后把话吞回去了。她站起来,走到门口的时候回头看了一眼。
“程姐,早点回去休息吧。”
门轻轻关上。
程司白坐在位置上没有动。
窗外的城市灯光在玻璃上晕开,变成一片模糊的光斑。办公区里只剩她一个人,空调的嗡嗡声在寂静中被放大了无数倍,像一段单调的白噪音。
她打开电脑,点进项目管理系统,找到裴衍之提交的技术方案。
方案文档很长,目录就有三页。他的写作风格还是老样子——逻辑清晰、条理分明,每一章前面都有一段简短的概述,让读者在进入细节之前先理解整体框架。这是她以前教他的方法,没想到他现在用得很好。
她快速翻阅著,从第一章到第十章,从架构设计到部署方案。她不得不承认这是一份很优秀的方案,比她预期中好得多。每一个技术决策都有充分的理由,每一个风险点都有对应的应对措施,连她之前质疑的三个问题,除了脑裂那个确实没有完美解法之外,另外两个他都在附录里给出了详细的证明和测试数据。
她翻到最后一页。
那是方案签署页,上面有裴衍之的电子签名,签名下面是一行小字:
“感谢架构组的支持,期待合作。——裴衍之”
程司白盯著这行字看了很久。
“感谢架构组的支持。”
她知道这只是方案文档的标准结尾,每个提交方案的人都会写类似的一句话。但她还是忍不住去想,他写这行字的时候是什么表情?是公事公办的客套,还是——
她打断自己的念头。
不要想这些。不需要想这些。
她把文档关掉,关上电脑,拎起公事包走出办公室。
经过走廊的时候,她经过那面贴满技术海报的墙。海报上写著一行大字:“分布式系统的最终一致性:理论与实践。”
最终一致性。
这个词在分布式系统里的意思是:系统不保证在任何时刻数据都是一致的,但保证在足够长的时间之后,所有节点最终会达成一致。
她想,人与人之间有没有最终一致性?
如果有,需要多长时间?
电梯到了,门打开。她走进去,按了一楼的按钮。
电梯下降的时候,她想起刚才在电梯里说的那句“好久不见”。
他的回答也是“好久不见”。
她不知道他有没有变。至少从技术方案来看,他变得比以前更理性了。以前他总是凭直觉做决定,现在他会用数据说话。以前他会说“我觉得这样更好”,现在他会说“测试数据证明这样更好”。
这不是她以前希望他变成的样子吗?
一个够理性的人。
一个不会让她觉得危险的人。
电梯门打开,一楼的大厅很安静,只有保全坐在前台后面看手机。程司白走出大楼,夜风吹过来,带著城市夜晚特有的温度——不冷,也不暖,刚刚好让人觉得清醒。
她站在大楼门口,抬头看了一眼。
十五楼的灯还亮著。