第639章 第 639 章

程司白转头看著他。安检口的灯光从头顶照下来,在他脸上留下一半亮一半暗。亮的那边是他的眼睛,暗的那边是他的嘴角。他的表情很平静,平静得像在等一个他确定会来的结果。但他的眼睛不是。他的眼睛里有什么东西在动——不是碎的那种,是稳定了的那种。像一个被校准过的时钟,滴答滴答,不快不慢,每一个滴答都和上一个滴答间隔相同的时间。

“你妈说得对。”他说。

程司白看著他,没有说话。她不知道该说什么。她只是站在那里,看著他的眼睛,看著那里面稳定的、可靠的、不会崩溃的光。她看了很久。久到安检口的人流换了一批又一批,久到广播里的声音换了好几轮,久到她觉得自己的心跳和他的心跳在某一个瞬间同步了——不是刻意的,是自动的。像两个频率相近的振荡器放在一起。这是物理规律。不需要选择,不需要努力,不需要达成共识。它自己就会发生。

但它在发生了。从三年前就开始了。只是他们花了很长时间才确认这个事实。

回到家里的时候天已经暗了。程司白换了鞋,走进客厅,站在窗前。窗外的城市灯光一格一格地亮起来,远处的写字楼,近处的住宅区,楼下的路灯。所有的光都在自己的位置上,稳定地,持续地,不间断地亮著。她站在窗前,看著那些光,觉得自己也是其中的一盏。不是最亮的,不是最大的,不是最重要的。但它亮著。在自己的位置上,稳定地,持续地,不间断地。不需要证明自己够亮,不需要担心自己会灭,不需要比较谁的光更强。只是亮著。

裴衍之从厨房走出来,端著两杯水。一杯放在茶几上,一杯自己拿著。他走到她身后,站住了。两个人站在窗前,她看著窗外,他看著她。窗外的光透过玻璃照进来,照在她的头发上,在她的肩膀上,在她的手背上。那些光是暖的,不是电梯里灯的那种白晃晃的暖,是另一种。是城市夜晚的暖,是有人在等你的暖,是你不用一个人的暖。

他从背后抱住了她。

很轻,很慢,像在执行一个他准备了很久、练习了很多遍、但真正做的时候还是会紧张的操作。他的手臂从她身后环过来,轻轻地围住她的腰。他的下巴抵在她的头顶上,头发蹭著他的脸颊,有点痒。他没有躲。他只是抱著她,像一个节点在确认另一个节点的状态——你还在吗,我在,你呢。

程司白没有挣扎。她站在窗前,被他从背后抱著,两个人的身体贴在一起,隔著两层布料,她能感觉到他的心跳。不快,但很重,一下一下的,像一个稳定运行的时钟。她的心跳慢慢和它同步了。不是刻意的,是自动的。像两个频率相近的振荡器放在一起。这是物理规律。不需要选择,不需要努力,不需要达成共识。它自己就会发生。

她靠在他怀里,后背贴著他的胸膛,头靠著他的肩膀。窗外的城市灯光一格一格地亮著,远处的写字楼,近处的住宅区,楼下的路灯。所有的光都在自己的位置上,稳定地,持续地,不间断地亮著。她也亮著。在他的怀里,在她的位置上,在这一刻。

“裴衍之。”她说。

“嗯。”

“你的拥抱,比你的代码好。”

裴衍之笑了。他的笑声从胸腔传出来,透过她的后背,传到她的身体里。很轻,很暖,像一段低频的震动——频率很低,波长很长,穿透力很强。它能穿过皮肤,穿过肌肉,穿过骨骼,穿过那些她筑了很多年的墙。那些墙在这一刻全部倒了。不是被推倒的,是它们自己倒的。因为不需要了。她不需要墙了。她只需要一个拥抱。

她闭上眼睛,靠在他怀里,听著他的心跳。滴答滴答,不快不慢,每一个滴答都和上一个滴答间隔相同的时间。她在心里跟著那个节奏数了一会儿,然后不数了。因为她知道,不管她数不数,它都在那里。稳定的,可靠的,不会崩溃的。就像他。一直都在。

周末的咖啡馆比平时安静。没有开会的团队,没有赶项目的程式设计师,没有对著萤幕发呆的产品经理。只有几个零星散坐的人——靠窗的位置一个女生在看书,角落里一个男生戴著耳机打字,吧台旁边一个中年男人在读报纸。背景音乐还是钢琴曲,很轻,轻到像一个人在很远的地方弹奏,音符飘过来的时候已经散了一半,只剩下一些断断续续的轮廓。

程司白坐在靠里的位置,面前摊著一本论文。纸质的,从图书馆借来的,边角有些卷曲,页面上用铅笔画了几条线。她看的是关于分布式系统中部分同步模型下的共识算法改进,作者提出了一种新的逾时机制,可以在不依赖物理时钟的情况下保证活性。这篇论文她读了两遍了,第三遍读到第四页的时候停下来,目光落在一个段落上,没有移动。她的手指夹在页面之间,拇指按著纸张的边缘,中指垫在下面,姿势和翻页之前一模一样。已经维持了大概两分钟了。

裴衍之坐在她旁边,不是对面,是旁边。两个人之间的距离大概二十公分,近到何悦如果在场,会在第一时间把这个数据记录到“共识观察小组”的群公告里。他的电脑萤幕上是一段代码,游标停在第十七行,闪烁的频率稳定,一秒一次,像一个心跳信号。他的手放在键盘上,手指搭在home row的位置,食指在F和J之间轻轻移动,没有按下任何按键。

两个人都没有在专注。

程司白不知道自己在想什么。不是那种“我需要解决一个问题”的想,是那种“我不需要解决任何问题”的想。她的脑子在空转,像一个没有任务的处理器——时钟还在走,电压还在供,温度还在维持,但没有一个进程在占用资源。这是一种她很久没有体验过的状态。她以前不允许自己进入这种状态——空转意味著浪费,浪费意味著低效,低效意味著不够好。但现在她觉得空转也没什么不好。不需要一直在计算,不需要一直在优化,不需要一直在证明自己够快、够好、够值得被选中。有时候只需要坐著,旁边有一个人,手里有一篇论文,背景里有听不清楚的钢琴曲。这就够了。

“裴衍之。”

“嗯。”

“如果分布式系统里的节点,有一天不想再保持连接了,怎么办?”

她说这句话的时候没有抬头,手指还在论文的那一页上,拇指按著边缘,中指垫在下面。她的语气很平,平得像在问一个技术问题——共识算法的逾时参数怎么设置,日志复制的效能瓶颈怎么解决,成员变更的时候怎么保证安全性。但裴衍之听到了这句台词后面的东西。他一直在听。

他没有立刻回答。他把手指从键盘上收回来,放在桌上,手掌朝下,手指微微张开。窗外的阳光照进来,照在他的手背上,把那些骨节和血管照得很清楚。他的手很稳,稳到没有一丝颤抖。但他的答案不是稳的。他的答案是他想了很多年、推演了很多遍、在心里模拟了无数次之后,终于确定下来的那个。

“那就优雅退出。”他说。声音很轻,轻到像是在念一段文档里的规范——节点下线流程,步骤一,步骤二,步骤三,注意事项。但程司白听到了那些步骤后面的东西。那里面有一个节点在说:如果你要走,我不会让你的离开破坏系统的稳定性。不会让你的数据丢失,不会让你的状态不一致,不会让你的痕迹被彻底清除。你会优雅地退出,像一个设计良好的节点应该做到的那样。不丢数据,不影响其他节点,不给系统留下无法修复的裂痕。

程司白抬起头,转头看著他。阳光照在他脸上,把他的侧脸照得很柔和。他的眼睛看著电脑萤幕,萤幕上的代码还停在第十七行,游标还在闪,一秒一次。但她知道他没有在看代码。他在看她。用余光,用耳朵,用那些不需要眼睛就能感知到她的方式。

“但前提是——”他转头看著她,两个人的目光在阳光里相遇。他的眼睛里有光,不是那种碎的、散的、到处都是的光,是那种稳定的、持续的、不间断的光。像一个被校准过的时钟,滴答滴答,不快不慢,每一个滴答都和上一个滴答间隔相同的时间。

“节点之间要先达成共识。”

程司白看著他。阳光照在她的论文上,照在第四页那个她读了三遍的段落上,照在她拇指按著的那个页面边缘上。那篇论文讲的是如何在不可靠的网络环境下达成共识——消息会延迟,节点会崩溃,时钟会不同步。但只要你愿意重发,愿意等待,愿意在超时之后再试一次,最终会收到那个ACK。她读了三遍才发现,这篇论文不是在讲算法。它是在讲一件事——信任不是被证明的,是被选择的。你选择重发,不是因为你确定会收到ACK,是因为你愿意等。你愿意等,不是因为你知道要等多久,是因为你相信等到的东西值得那个时间。

“所以我们现在有共识了吗?”她问。声音比刚才更轻了,轻到像是在问一个她已经知道答案的问题。但她还是想听他说出来。就像一个已经收到ACK的节点,还是会定期发送心跳——不是因为不信任,是因为确认本身就是一种信任。

裴衍之看著她,嘴角扬起来了。不是那种克制的、理性的、成年人的微笑,是那种从心底里涌上来的、压不住的、想要跟她一起分享的笑。他笑起来的时候眼睛会瞇成一条缝,眼角会挤出细细的纹路,鼻子会皱一下,嘴角会歪向一边。他笑得不好看。但她觉得很好看。

“我们一直有共识。”他说,“只是你之前没发现。”

程司白看著他,看了大概三秒。这三秒里背景音乐换了一首,还是钢琴曲,比之前那首稍微快一些,音符之间的间隔更短,像一段正在加速的节奏。她的心跳没有加速,它稳定在一个频率上,不快不慢,和他的心跳同频。不是刻意的,是自动的。从某一天开始就是这样了,她不知道是哪一天,也许是咖啡馆的那个晚上,也许是电梯里的那个晚上,也许更早,早到她还没有意识到的时候。但它在。一直在。

她笑了。

不是嘴角动一下的那种,是真的笑了。笑容从她的眼睛里开始,蔓延到脸颊,蔓延到嘴角,蔓延到整个脸上。她笑得不好看,眼睛瞇成了一条缝,鼻子皱了一下,嘴唇因为笑得太用力而有点疼。但她没有停下来。这是她第一次在书里笑。不是微笑,不是浅笑,不是那种克制地、礼貌地、不露出任何破绽的笑。是那种从心底里涌上来的、压不住的、想要跟他一起分享的笑。

她笑的时候眼睛里有光。那光是暖的,不是窗外阳光照进来的那种暖,是另一种。是她在电梯里说“我留下”的时候有的那种,是她在会议室里说“谢谢你”的时候有的那种,是她在巷子里差一点把那句话说完的时候有的那种。那种光一直在她眼睛里,只是以前她把它压在水面下,压到看不见,压到她自己都以为没有了。但它在。一直在。

“裴衍之,你的比喻真的很烂。”她说。声音里带著笑,带著那种从心底里涌上来的、压不住的、想要跟他一起分享的笑。每一个字都在笑,“共识”“节点”“优雅退出”,这些词从她嘴里说出来的时候,不再是技术文档里的术语了。它们变成了另一种东西,一种只有他们两个人能听懂的语言。

裴衍之看著她笑,他也笑了。两个人坐在咖啡馆的卡座里,对著彼此笑。桌上放著一台没在写代码的电脑,一本没在读的论文,两杯没喝完的咖啡。阳光照在杯壁上,照在键盘上,照在两个人之间那二十公分的距离上。那二十公分里有风,有阳光,有空气中飘浮的灰尘,有钢琴曲的音符。但它们都在那里,没有谁要越过那二十公分,没有谁要把那二十公分填满。因为不需要。他们已经连接了。不是通过距离,是通过共识。一个不需要证明的、不需要测试的、不需要等待逾时重传的共识。它在三年前就达成了,只是花了很长时间才确认。

“但你看懂了。”他说。

程司白没有否认。她低下头,看著桌上那篇论文,第四页,第三段。她读了三遍的那个段落。她现在知道为什么读了三遍都没有读进去了——不是因为太难,是因为她在等。等一个她不需要读论文就能得到的答案。那个答案不在论文里,在旁边。在她旁边二十公分的地方,在一双正在笑的眼睛里,在一段不需要校准就能同步的心跳里。那个答案很简单——信任不是被证明的,是被选择的。你不需要证明一个人不会离开,你只需要选择相信他不会。你不需要证明一段关系不会失败,你只需要选择参与它。你不需要证明两个人比一个人更好,你只需要选择试试看。

她选择了。

窗外是城市的灯光。不是晚上的那种亮,是下午的那种。阳光照在对面写字楼的玻璃幕墙上,反射出一片金色的光。那片光照进咖啡馆,照在两个人的身上,把他们的影子投在身后的墙上——两个影子靠在一起,肩膀重叠,分不清哪个是谁的。咖啡馆里很安静。背景音乐换了一首,还是钢琴曲,很轻,轻到像一个人在很远的地方弹奏,音符飘过来的时候已经散了一半,只剩下一些断断续续的轮廓。吧台后面有人在洗杯子,水龙头的声音哗哗地响,和钢琴声混在一起,变成一种她说不清楚的白噪音。不是那种空调的、单调的、没有温度的白噪音,是另一种。是有人在的白噪音。是有人在旁边翻动书页的声音,是有人在键盘上敲击的声音,是有人在二十公分的地方呼吸的声音。这些声音很小,小到如果你不在认真听,根本不会注意到。但她听到了。她一直在听。

他们并排坐著。她对著论文,他对著电脑。两个人的萤幕朝不同的方向,键盘在不同的高度,咖啡在不同的温度。但他们的肩膀轻轻挨在一起。隔著两层布料,她能感觉到他肩膀的温度——不是那种烫的、灼人的热,是那种温的、恒定的、让人想一直靠著的那种暖。她没有靠上去,只是挨著。两个人的肩膀之间没有一条缝,那条缝在三个月前的电梯里就消失了。不是被填满的,是它自己合上的。就像两个频率相近的振荡器放在一起,时间长了就会同步。这是物理规律。不需要选择,不需要努力,不需要达成共识。它自己就会发生。但它发生了。在他们决定让它发生之前,就发生了。

程司白低头看著论文。第四页,第三段。她还是没有读进去。但她不著急了。她不需要今天读完这篇论文,不需要明天理解这个算法,不需要下周把它应用到系统里。她可以慢慢读。今天读一段,明天读一段,后天再读一段。读不懂也没关系,可以问旁边的人。他可能懂,可能也不懂。但他会跟她一起读。两个人读一篇论文,比一个人快还是慢?她不知道。她只知道两个人读一篇论文的时候,读不进去也没关系。因为你不会觉得是自己不够好。你会觉得——也许这篇论文本来就不值得读进去。也许值得读进去的东西不在论文里。也许值得读进去的东西在旁边,在二十公分的地方,在一个正在跟你一起浪费时间的人身上。

她把论文合上了。动作很轻,轻到没有发出声音。裴衍之没有转头看她,但他感觉到了。他的手从键盘上移开,放在桌上,手掌朝上,手指微微张开。那是一个开放的姿势——不设防,不防御,不保护自己。她把手放在他的掌心里。她的手很小,手指很细,指甲剪得很短。她的手很凉,他的手很暖。他的手指合拢了,轻轻地,慢慢地,像在握一件他等了很多年终于等到的东西。

窗外是城市的灯光。阳光照在两个人交握的手上,照在她的手背上,照在他的手指间。那些光在指缝里穿过,投在桌上,一条一条的,像一段被分割的数据流。每一条都是完整的,但拼在一起才是全部的真相。

分布式系统的难题,从来不是算法。算法有证明,有测试,有边界条件。你可以写一个函数,输入是节点的状态,输出是共识的结果。确定性的,可重复的,可以被验证的。但人与人之间没有这样的函数。没有输入,没有输出,没有确定性的结果。你只能在不知道结果的情况下做出选择,在不确定对方会不会回应的情况下发送请求,在没有收到ACK的时候决定是重发还是超时。这不是算法能解决的问题。这是信任的问题。信任不是被证明的,是被选择的。你选择相信一个人不会离开,不是因为他有不会离开的证明,是因为你愿意承担他会离开的风险。你选择相信一段关系不会失败,不是因为它有不会失败的保证,是因为你愿意参与它的失败和成功。你选择相信两个人比一个人更好,不是因为数据支持这个结论,是因为你愿意试试看。你愿意在不知道结果的情况下,把请求发送出去。然后等待。超时了,重发。再等待。再超时,再重发。你不知道要等多久,你不知道会不会收到ACK。但你愿意等。因为你相信,等到的东西值得那个时间。

程司白坐在咖啡馆里,手被裴衍之握著,肩膀挨著裴衍之的肩膀,窗外是城市的灯光。她的论文合上了,他的电脑待机了,两杯咖啡凉了。背景音乐换了一首,她没有听出来是什么曲子,也许是某首她听过的,也许不是。不重要。她不需要知道背景音乐是什么,不需要读完那篇论文,不需要写完那段代码。她只需要坐在这里,手被握著,肩膀挨著肩膀,等著太阳下山,等著城市的灯光从金色变成橘色再变成白色,等著咖啡馆里的客人来来走走,等著那个她等了三年才等到的人,继续等下去。不需要等什么特定的东西,不需要等一个结果,不需要等一个答案。只是等。在一起等。

她花了三年才明白这件事。信任不是被证明的,是被选择的。你不需要证明一个人值得信任,你只需要选择相信他。你不需要证明一段关系不会失败,你只需要选择参与它。你不需要证明两个人比一个人更好,你只需要选择试试看。她选择了。在三年前的电梯里,她选择了离开。在三个月前的电梯里,她选择了留下。在今天的咖啡馆里,她选择了不再选择。她只是待在这里,手被握著,肩膀挨著肩膀,等著看接下来会发生什么。不知道会发生什么。不知道系统会不会崩溃,不知道节点会不会故障,不知道网络会不会分区。但她不怕了。不是因为她变强了,是因为她知道了——即使系统崩溃了,有人会和她一起排查。即使节点故障了,有人会和她一起恢复。即使网络分区了,有人会在那边等著,等网络恢复的时候,第一时间发送心跳。她在这边,他在那边。中间隔著二十公分,隔著三年的时间,隔著一千多个没有说出口的夜晚。但那二十公分里现在没有墙了,三年的时间里现在没有空了,一千多个夜晚里现在没有沉默了。它们被填满了。被咖啡填满,被外套填满,被纸条填满,被“别用工作逃避”填满,被“我一直愿意”填满,被“我留下”填满,被“批准”填满。被每一次心跳填满。

她闭上眼睛。阳光透过眼皮照进来,橘红色的,温暖的,像一个信号——系统正常,连接稳定,共识达成。不需要再证明,不需要再测试,不需要再等待逾时重传。就是一个简单的状态。已连接。她靠在裴衍之的肩膀上,头发蹭著他的脖子。他的手握著她的手,手指扣著手指,掌心贴著掌心。两个人的心跳在不同的频率上运行,但通道是开的,数据在传输,共识在维持。不需要加速,不需要优化,不需要提升吞吐量。只需要保持这个频率,不快不慢,每一个滴答都和上一个滴答间隔相同的时间。她在心里跟著那个节奏数了一会儿。滴答,滴答,滴答。然后不数了。因为她知道,不管她数不数,它都在那里。稳定的,可靠的,不会崩溃的。

就像他。一直都在。

分手之后的第一百三十七天,他在程式码里写了一个Bug。

不是那种逻辑错误或者边界条件遗漏的Bug,是一种他从来没犯过的、低级的、让人看了会摇头的Bug。他在一个共识算法的实现里,把“term”这个变数名写成了“temper”。编译器报错的时候他盯著那行红色的提示看了很久,久到萤幕暗了两次。他没有改。他把那行代码注释掉了,然后在下面重新写了一行,用了另一个变数名。从那天起,他再也没有在程式码里写过“consensus”这个词。

不是刻意的。手指打到“c”的时候会停下来,像一段卡住的循环——条件不满足,无法进入下一条指令。他试过强迫自己打完整,打出来之后盯著萤幕看,觉得这八个字母长得很奇怪。c-o-n-s-e-n-s-u-s。明明是八个很正常的字母,他却觉得它们在发光,刺眼的那种。他把那行代码删了,换成了“agree”。后来又换成了“protocol”,再后来换成了“distribute”。他换了很多种说法,每一种都绕过了那八个字母。就像他在生活里绕过了很多东西——那家咖啡馆,那条她走过的路,那个她说“晚安”的楼下。

他以为绕过去就好了。绕过去就不用想了,不用疼了,不用在凌晨三点醒来的时候发现自己在翻一个不会再有新消息的对话框。但他发现绕过去不是解决方案,绕过去只是把问题推迟了。问题还在,在那条他不敢走的路的尽头,在那个他不敢点的对话框的底部,在那八个字母的背后。它一直在。

离职是在分手之后的第二个月。他把辞职信交给主管的时候,对方问他要去哪里,他说创业。对方说挺好的,年轻人该闯一闯。他没有说实话。他不是去闯,他是去躲。躲开那个空著的工位,躲开那把没有人坐的椅子,躲开那盆她留下来的仙人掌——她走的时候没有带走,他每天帮它浇水,浇了两个月,浇到根都烂了。他把仙人掌扔进垃圾桶的时候,花盆碎了,泥土散了一地。他蹲在地上收拾了很久,久到保洁阿姨过来说小伙子你让开我来扫。他说不用,我自己来。他用手指把那些碎土一点一点地捡起来,放进垃圾袋里。指甲缝里全是土,洗了三遍才洗干净。

创业的那两年他写了很多代码。前端、后端、资料库、运维,什么都写。他不挑项目,不挑客户,不挑技术栈。只要手指在键盘上,脑子就不会去想别的事情。他把自己变成了一个满载运行的系统——CPU百分之百,记忆体百分之九十五,没有空闲进程,没有多余资源。这样就不会有进程被分配到那个被她占用的记忆体位址。那个位址他没有释放,他只是把它标记为已删除。指针还在,指向的空间还在,数据还在。只是系统不会再去读取了。不会去读就不会知道那些数据还在。不知道还在就可以假装它们不在了。这是操作系统的逻辑,也是他的逻辑。

但他偶尔会读取错误。比如在写日志的时候,比如在编译的时候,比如在终端里输入指令的时候。手指会不听话,会打出那个名字。不是全名,是拼音首字母。c-s-b。三个字母,出现在命令行里,出现在档案路径里,出现在注释里。他看到的时候会愣一下,然后删掉。动作很快,快到像在处理一个异常——捕获,忽略,继续执行。但异常不会因为你忽略它就不存在。它在日志里,在堆叠里,在每一个你没有处理的catch区块里。它会积累,会溢出,会在某一个你没有防备的时刻,把整个系统冲垮。

< 上一章 目录 下一章 >
×
宿山行
连载中帝谛 /