“因为我其实不是不相信共识。”她说。声音在电梯里显得很清楚,每一个字都很清楚,清楚到像是从一个高保真的音频系统里播放出来的——没有噪音,没有失真,没有压缩。是原来的样子。
裴衍之站在那里,没有动。他的手指在裤缝边攥了一下,又松开了。他在等。等她把那句话说完。他知道她还有话没说完。她总是有话没说完。三年来都是这样——说一半,留一半,把另一半压在嗓子底下,压到她自己都快忘了。但她没忘。她只是不敢说。
“我是不敢申请成为节点。”
程司白说这句话的时候,声音在最后两个字的时候抖了一下。只有一下,很短,短到如果不是电梯里太安静,根本不会注意到。但裴衍之注意到了。他一直都能注意到。他听到了她声音里那个微小的裂缝——不是崩溃,是打开。一个被封死了三年的接口,终于打开了。端口号是多少,协议是什么,数据格式怎么定义——这些都不重要。重要的是它打开了。
电梯里的光照在她脸上,把她眼睛里那层薄薄的东西照得很清楚。那不是眼泪,那是光。是从她眼睛里出来的光,和他眼睛里的光一样——暖的,碎的,散的到处都是的。那些光落在两个人之间的空间里,落在两步的距离上,落在三年的沉默上。那些光在填那些缝隙。一条一条地填,一道一道地填,填到最后,两步变成了一步,一步变成了半步,半步变成了没有。
“现在我申请了。”她看著他的眼睛,一个字一个字地说。每一个字都比前一个字更稳,稳到像是在念一段她终于写对了的代码——没有语法错误,没有逻辑漏洞,没有边界条件遗漏。就是一段简单的代码,做一件简单的事——发送一个请求。
“你要批准吗?”
裴衍之看著她。电梯里的光从头顶照下来,在她的头发上留下一圈浅浅的光晕。她的头发还是乱的,有几缕碎发翘起来,在光晕里显得很软。她的眼睛红了,不是哭的那种红,是那种忍了很久终于不用忍了之后的红。她的嘴唇还在抖,但她没有咬。她让它抖。她不再控制它了。
他走了一步。
两步变成了一步。这一步里有三年,有一千多个夜晚,有无数次打开对话框又关掉的手指,有每一杯凉掉的咖啡,有每一件叠好的外套,有每一句“不打扰了”和“我一直愿意”。这一步很短,短到不到一秒钟。但它走了三年。
他站在她面前。很近,近到她能看到他瞳孔里自己的倒影——头发乱了,眼睛红了,嘴唇在抖。但她看到自己在笑。不是嘴角动一下的那种,是真的笑。从眼睛里出来的笑,从那个刚刚解冻的地方出来的笑,从那个被打开的接口里出来的笑。她不知道自己什么时候开始笑的。也许是在他说“批准”的时候,也许更早,早到她还没有意识到的时候。
“批准。”
一个字。他说出来的时候声音很轻,轻到像是在念一个只有他自己能听到的确认信号。但程司白听到了。她一直都听得到。从三年前他说“好,不打扰了”的时候,她就听到了。只是她当时以为那是结束。现在她知道了——那不是结束,那是超时重传。请求发出去了,没有收到ACK,超时了,重发。等了三年,重发了三年。现在ACK回来了。
“共识达成。”
他说这句话的时候,嘴角扬起来了。不是那种克制的、理性的、成年人的微笑,是那种从心底里涌上来的、压不住的、想要跟全世界分享的笑。他笑得不好看,眼睛瞇成了一条缝,鼻子皱了一下,嘴角歪了一边。但他没有停下来。他已经很久没有这样笑过了。久到他都快忘记笑是什么感觉了。
程司白看著他笑,她也笑了。两个人站在电梯里,面对面,隔著不到一步的距离,对著彼此笑。电梯的门关著,走廊上的感应灯灭了,头顶的灯照下来,在两个人身上投下一圈一圈的光。他们的笑声在电梯里回荡,很轻,很碎,像一段被分割成很多小段的数据流——每一段都是完整的,但拼在一起才是全部的真相。
她伸出手。
不是等他的手来握,是她自己伸出去的。手心朝下,手指微微张开,像一个在发送请求的节点——我准备好了,你呢。她的手在空中停了一秒。这一秒里她感觉到了风——不是走廊上的风,是电梯里的风,是空调系统循环的风,很轻,很凉,从她指尖流过,像一个确认信号——通道是通的,没有阻塞,没有丢包,可以发送。
裴衍之看著那只手。她的手很小,手指很细,指甲剪得很短。他记得这只手——在会议室里握著翻页笔的手,在键盘上飞快敲击的手,在咖啡杯壁上留下指纹的手,在凌晨四点被他握住的手。每一只他都在。每一只他都记得。
他伸出手,接住了。
不是握,是接。掌心朝上,手指微微张开,像一个等待被填满的容器。她的手落在他的掌心里,凉的,轻的,像一个刚刚被创建的新进程——还没有分配内存,还没有加载数据,还不知道自己的使命是什么。但它在运行。它活著。它在发送心跳。
他的手指合拢了,轻轻地,慢慢地,像在确认一个不需要确认的事实——她在了。她不走了。她申请了,他批准了,共识达成了。不需要再证明,不需要再测试,不需要再等待超时重传。就是一个简单的确认——收到,理解,同意。
程司白低头看著两只交握的手。她的手在他的手里,他的手包著她的手。两个人的温度不一样——她的凉,他的暖——但他们在同一个系统里,同一个时钟下,同一个共识算法上。温度会趋同的,物理规律决定的。不需要努力,不需要选择,只要保持连接,它自己就会发生。
她抬起头,看著他。电梯里的灯光照在他脸上,她看到了他眼睛里的那层光——不是碎了的那种,是稳定了的那种。像一个被校准过的时钟,滴答滴答,不快不慢,每一个滴答都和上一个滴答间隔相同的时间。她在心里跟著那个节奏数了一会儿——滴答,滴答,滴答。她的心跳慢慢和它同步了。不是刻意的,是自动的。像两个频率相近的振荡器放在一起。这是物理规律。不需要选择,不需要努力,不需要达成共识。它自己就会发生。
但它已经发生了。共识达成了。在他们决定要达成共识之前,就已经达成了。从她说“好久不见”的时候,从他说“我一直愿意”的时候,从她在巷子里差一点把那句话说完的时候,从他在杯壁上写“别用工作逃避”的时候,从他们在凌晨四点一起找到那个Bug的时候——共识就已经在那里了。只是他们都没有发现。或者他们发现了,但不敢确认。
电梯的门开了。没有人按按钮,它自己开的——有人在一楼按了呼叫。门打开的时候,大厅的灯光照进来,白色的,亮的,和电梯里的光混在一起,分不清哪个是哪个。走廊上站著一个要上楼的人,看到电梯里两个人面对面站著,手握在一起,愣了一下,然后说了声“抱歉”,转身走向另一部电梯。
程司白没有松手。裴衍之也没有松手。两个人站在电梯里,手握著手,看著电梯门慢慢地关上。门关上的时候,大厅的光被切断了,电梯里又只剩头顶那盏白色的灯。光线均匀,温度恒定,一切正常。
“程司白。”裴衍之说。
“嗯。”
“你刚才说你申请成为节点。”
“嗯。”
“你知道节点之间保持连接需要什么吗?”
程司白想了想。她知道技术上的答案——需要心跳,需要共识算法,需要故障检测,需要日志复制。但她知道他不是在问技术。他问的是另一种——她以前从来不用的那种。
“需要什么?”她问。
“需要定期交换心跳。”裴衍之的声音很轻,轻到像是在念一段文档,“需要互相确认对方还在。需要知道对方没有崩溃,没有断网,没有被隔离。需要——”
他停了一下。程司白感觉到他的手指在她手背上轻轻按了一下。不是用力,是确认——你还在吗,我在,你呢。
“需要知道,我不是一个人。”
程司白的手指在他掌心里收紧了。不是用力,是回应——我在,你也不是一个人。
两个人站在电梯里,手握著手,心跳在不同的频率上运行,但通道是开的,数据在传输,共识在达成。不需要再证明,不需要再测试,不需要再等待。就是一个简单的状态——已连接。
电梯的门又关上了。没有人按按钮,没有人要进来,没有人要出去。就他们两个人,在一部停在一楼的电梯里,手握著手,等著谁先按下一个按钮。但没有人按。因为不需要去哪里了。他们已经到了。从三年前就到了。只是花了三年时间,才确认这个目的地是对的。
程司白靠在他肩膀上。不是那种无力的、撑不住的靠,是那种主动的、选择的、愿意把重量交给另一个人的靠。她的头靠在他的肩膀上,头发蹭著他的脖子,有点痒。他没有躲。他只是微微侧了一下头,让她的头发不会戳到眼睛。两个人的肩膀靠在一起,手臂贴著手臂,手扣著手。电梯里很安静,安静到她能听到他的心跳——不快,但很重,一下一下的,像一个稳定运行的时钟。她在心里跟著那个节奏数了一会儿,然后不数了。因为她知道,不管她数不数,它都在那里。稳定的,可靠的,不会崩溃的。
就像他。一直都在。
三个月后,公司楼下的咖啡馆多了一种新的咖啡。不是美式,不是拿铁,是菜单上没有写的一种——两份浓缩加一份热水,放在一个白色的马克杯里,旁边配一小杯冰水。服务员说这是常客自己发明的,没有名字,他们在订单系统里叫它“程式设计师特调”。何悦有一次问服务员那个常客长什么样,服务员说一个女生,头发总是挽得很整齐,每次都带一台电脑,坐在靠窗的位置,对面经常坐一个穿衬衫的男生。何悦说那就是我们公司的,服务员说我知道,他们每天都来。
程司白自己都不知道自己发明了一种咖啡。她只是习惯了那家咖啡馆的美式太苦、拿铁太甜、卡布奇诺的奶泡太厚。她试了几次之后找到了一个平衡点——两份浓缩加一份热水,浓度刚好,温度刚好,不会烫到舌头也不会凉得太快。裴衍之第一次看到她这么点的时候说你这不就是美式吗,她说不一样,美式是浓缩加水,比例是一比二,我这是一比一。裴衍之说那你这叫浓缩加水,不叫美式。她说对,所以它没有名字。后来服务员问她这个咖啡叫什么,她说随便。服务员就在订单系统里打了“程式设计师特调”。裴衍之知道之后笑了很久,笑到何悦从走廊上跑过来问怎么了。
这三个月里很多事情变了。程司白的桌上多了一个杯垫,是裴衍之买的,灰色的,上面印著一行小字:“Hello, World”。她说这个杯垫很无聊,但她每天都在用。何悦注意到她桌上那个白色的马克杯再也没有出现过——它被收进抽屉里了,和那部旧手机放在一起。她没有问为什么,但她知道。有些东西不需要扔掉,只需要收起来。放在一个安全的地方,不会打碎,不会落灰,不会被忘记。
裴衍之的桌上也多了一样东西——一盆仙人掌。很小,装在一个白色的陶瓷盆里,盆上画著一个笑脸。是何悦送的,说是庆祝项目成功的礼物,但其实是她在路边摊看到觉得可爱就买了,不知道送谁,就塞给了裴衍之。裴衍之把它放在显示器旁边,每天浇一次水。程司白说仙人掌不用每天浇水,会烂根。裴衍之说那多久浇一次,她说两周一次。裴衍之说那你帮我记著,她说你自己记,他说我记不住,她说那你写日历提醒,他说好。第二天她发现他在日历上建了一个重复事件,标题是“浇仙人掌”,频率是每十四天一次,提醒时间是上午十点。她看了一眼,什么都没说,但嘴角动了一下。
何悦说他们终于像正常情侣了。说这话的时候是某个周五的下午,她在茶水间碰到程司白,对方正在倒水。水位到杯子的三分之二,不多不少,刚刚好。何悦靠在门框上,手里端著一杯奶茶,吸管咬得变了形。
“程姐,你知道吗,以前我觉得你跟裴哥在一起的时候,像两个在跑分布式系统的节点——永远在同步,永远在确认,永远在担心数据不一致。现在你们像正常情侣了。”
程司白转头看了她一眼。“正常情侣是什么样的?”
何悦想了想。“正常情侣就是——会一起吃饭,一起加班,一起散步。会吵架,会和好,会说一些没用的话。会记得对方不吃辣,会帮对方买咖啡,会在对方加班的时候等一等。就这些。没什么特别的。”
程司白端著水杯走出茶水间。经过何悦身边的时候她停了一下。“那你以前觉得我们是什么?”
何悦咬著吸管,笑了一下。“以前觉得你们是两个在互相发心跳包的节点。一直在确认对方还在不在,但从来不说“我在”。现在你们说了。”
程司白没有接话。她端著水杯走了,脚步声在走廊上响起,一二一二,节奏和以前一样均匀。但何悦听到了那个节奏底下的东西——不是紧张,不是克制,是一种放松。一种只有在确信自己不需要再防御的时候才会出现的放松。
母亲是在一个周末来的。程司白去火车站接她,在出站口等了十分钟。母亲拖著一个行李箱走出来,穿著一件深蓝色的羽绒服,头发烫了新的卷,看起来比上次视频的时候精神了一些。她看到程司白的时候点了点头,没有拥抱,没有寒暄,只是说了一句“瘦了”。程司白说“没有”。两个人并排走出火车站,隔著大概半臂的距离,和以前一样。
但这一次不一样。因为裴衍之在家里等。
程司白没有告诉母亲裴衍之的事。不是不想说,是不知道怎么说。她从来没有跟母亲聊过感情——不是因为母亲不关心,是因为她们之间从来没有那种对话。她们的对话永远是“吃了吗”“工作怎么样”“注意身体”。这些话像一段被重复执行了无数次的代码,每一次输出的结果都一样,但每一次执行的成本都在增加。她不知道怎么打破这个循环。但今天,她觉得也许该打破了。