程司白转头看著他。安检口的灯光从头顶照下来,在他脸上留下一半亮一半暗。亮的那边是他的眼睛,暗的那边是他的嘴角。他的表情很平静,平静得像在等一个他确定会来的结果。但他的眼睛不是。他的眼睛里有什么东西在动——不是碎的那种,是稳定了的那种。像一个被校准过的时钟,滴答滴答,不快不慢,每一个滴答都和上一个滴答间隔相同的时间。
“你妈说得对。”他说。
程司白看著他,没有说话。她不知道该说什么。她只是站在那里,看著他的眼睛,看著那里面稳定的、可靠的、不会崩溃的光。她看了很久。久到安检口的人流换了一批又一批,久到广播里的声音换了好几轮,久到她觉得自己的心跳和他的心跳在某一个瞬间同步了——不是刻意的,是自动的。像两个频率相近的振荡器放在一起。这是物理规律。不需要选择,不需要努力,不需要达成共识。它自己就会发生。
但它在发生了。从三年前就开始了。只是他们花了很长时间才确认这个事实。
回到家里的时候天已经暗了。程司白换了鞋,走进客厅,站在窗前。窗外的城市灯光一格一格地亮起来,远处的写字楼,近处的住宅区,楼下的路灯。所有的光都在自己的位置上,稳定地,持续地,不间断地亮著。她站在窗前,看著那些光,觉得自己也是其中的一盏。不是最亮的,不是最大的,不是最重要的。但它亮著。在自己的位置上,稳定地,持续地,不间断地。不需要证明自己够亮,不需要担心自己会灭,不需要比较谁的光更强。只是亮著。
裴衍之从厨房走出来,端著两杯水。一杯放在茶几上,一杯自己拿著。他走到她身后,站住了。两个人站在窗前,她看著窗外,他看著她。窗外的光透过玻璃照进来,照在她的头发上,在她的肩膀上,在她的手背上。那些光是暖的,不是电梯里灯的那种白晃晃的暖,是另一种。是城市夜晚的暖,是有人在等你的暖,是你不用一个人的暖。
他从背后抱住了她。
很轻,很慢,像在执行一个他准备了很久、练习了很多遍、但真正做的时候还是会紧张的操作。他的手臂从她身后环过来,轻轻地围住她的腰。他的下巴抵在她的头顶上,头发蹭著他的脸颊,有点痒。他没有躲。他只是抱著她,像一个节点在确认另一个节点的状态——你还在吗,我在,你呢。
程司白没有挣扎。她站在窗前,被他从背后抱著,两个人的身体贴在一起,隔著两层布料,她能感觉到他的心跳。不快,但很重,一下一下的,像一个稳定运行的时钟。她的心跳慢慢和它同步了。不是刻意的,是自动的。像两个频率相近的振荡器放在一起。这是物理规律。不需要选择,不需要努力,不需要达成共识。它自己就会发生。
她靠在他怀里,后背贴著他的胸膛,头靠著他的肩膀。窗外的城市灯光一格一格地亮著,远处的写字楼,近处的住宅区,楼下的路灯。所有的光都在自己的位置上,稳定地,持续地,不间断地亮著。她也亮著。在他的怀里,在她的位置上,在这一刻。
“裴衍之。”她说。
“嗯。”
“你的拥抱,比你的代码好。”
裴衍之笑了。他的笑声从胸腔传出来,透过她的后背,传到她的身体里。很轻,很暖,像一段低频的震动——频率很低,波长很长,穿透力很强。它能穿过皮肤,穿过肌肉,穿过骨骼,穿过那些她筑了很多年的墙。那些墙在这一刻全部倒了。不是被推倒的,是它们自己倒的。因为不需要了。她不需要墙了。她只需要一个拥抱。
她闭上眼睛,靠在他怀里,听著他的心跳。滴答滴答,不快不慢,每一个滴答都和上一个滴答间隔相同的时间。她在心里跟著那个节奏数了一会儿,然后不数了。因为她知道,不管她数不数,它都在那里。稳定的,可靠的,不会崩溃的。就像他。一直都在。
周末的咖啡馆比平时安静。没有开会的团队,没有赶项目的程式设计师,没有对著萤幕发呆的产品经理。只有几个零星散坐的人——靠窗的位置一个女生在看书,角落里一个男生戴著耳机打字,吧台旁边一个中年男人在读报纸。背景音乐还是钢琴曲,很轻,轻到像一个人在很远的地方弹奏,音符飘过来的时候已经散了一半,只剩下一些断断续续的轮廓。
程司白坐在靠里的位置,面前摊著一本论文。纸质的,从图书馆借来的,边角有些卷曲,页面上用铅笔画了几条线。她看的是关于分布式系统中部分同步模型下的共识算法改进,作者提出了一种新的逾时机制,可以在不依赖物理时钟的情况下保证活性。这篇论文她读了两遍了,第三遍读到第四页的时候停下来,目光落在一个段落上,没有移动。她的手指夹在页面之间,拇指按著纸张的边缘,中指垫在下面,姿势和翻页之前一模一样。已经维持了大概两分钟了。
裴衍之坐在她旁边,不是对面,是旁边。两个人之间的距离大概二十公分,近到何悦如果在场,会在第一时间把这个数据记录到“共识观察小组”的群公告里。他的电脑萤幕上是一段代码,游标停在第十七行,闪烁的频率稳定,一秒一次,像一个心跳信号。他的手放在键盘上,手指搭在home row的位置,食指在F和J之间轻轻移动,没有按下任何按键。
两个人都没有在专注。
程司白不知道自己在想什么。不是那种“我需要解决一个问题”的想,是那种“我不需要解决任何问题”的想。她的脑子在空转,像一个没有任务的处理器——时钟还在走,电压还在供,温度还在维持,但没有一个进程在占用资源。这是一种她很久没有体验过的状态。她以前不允许自己进入这种状态——空转意味著浪费,浪费意味著低效,低效意味著不够好。但现在她觉得空转也没什么不好。不需要一直在计算,不需要一直在优化,不需要一直在证明自己够快、够好、够值得被选中。有时候只需要坐著,旁边有一个人,手里有一篇论文,背景里有听不清楚的钢琴曲。这就够了。
“裴衍之。”
“嗯。”
“如果分布式系统里的节点,有一天不想再保持连接了,怎么办?”
她说这句话的时候没有抬头,手指还在论文的那一页上,拇指按著边缘,中指垫在下面。她的语气很平,平得像在问一个技术问题——共识算法的逾时参数怎么设置,日志复制的效能瓶颈怎么解决,成员变更的时候怎么保证安全性。但裴衍之听到了这句台词后面的东西。他一直在听。
他没有立刻回答。他把手指从键盘上收回来,放在桌上,手掌朝下,手指微微张开。窗外的阳光照进来,照在他的手背上,把那些骨节和血管照得很清楚。他的手很稳,稳到没有一丝颤抖。但他的答案不是稳的。他的答案是他想了很多年、推演了很多遍、在心里模拟了无数次之后,终于确定下来的那个。
“那就优雅退出。”他说。声音很轻,轻到像是在念一段文档里的规范——节点下线流程,步骤一,步骤二,步骤三,注意事项。但程司白听到了那些步骤后面的东西。那里面有一个节点在说:如果你要走,我不会让你的离开破坏系统的稳定性。不会让你的数据丢失,不会让你的状态不一致,不会让你的痕迹被彻底清除。你会优雅地退出,像一个设计良好的节点应该做到的那样。不丢数据,不影响其他节点,不给系统留下无法修复的裂痕。
程司白抬起头,转头看著他。阳光照在他脸上,把他的侧脸照得很柔和。他的眼睛看著电脑萤幕,萤幕上的代码还停在第十七行,游标还在闪,一秒一次。但她知道他没有在看代码。他在看她。用余光,用耳朵,用那些不需要眼睛就能感知到她的方式。
“但前提是——”他转头看著她,两个人的目光在阳光里相遇。他的眼睛里有光,不是那种碎的、散的、到处都是的光,是那种稳定的、持续的、不间断的光。像一个被校准过的时钟,滴答滴答,不快不慢,每一个滴答都和上一个滴答间隔相同的时间。
“节点之间要先达成共识。”
程司白看著他。阳光照在她的论文上,照在第四页那个她读了三遍的段落上,照在她拇指按著的那个页面边缘上。那篇论文讲的是如何在不可靠的网络环境下达成共识——消息会延迟,节点会崩溃,时钟会不同步。但只要你愿意重发,愿意等待,愿意在超时之后再试一次,最终会收到那个ACK。她读了三遍才发现,这篇论文不是在讲算法。它是在讲一件事——信任不是被证明的,是被选择的。你选择重发,不是因为你确定会收到ACK,是因为你愿意等。你愿意等,不是因为你知道要等多久,是因为你相信等到的东西值得那个时间。