凌晨三点的机房,只有顾以风面前的电脑还亮着。
幽蓝的屏幕光在他脸上投下深浅不一的阴影,指尖敲击键盘的声音被空旷的房间放大,像春蚕在啃食最后的桑叶。代码编辑器里,一行行绿色的字符正在缓慢生长,构成一个复杂的递归函数 —— 本该是为下周的程序设计竞赛准备的优化算法,此刻却歪歪扭扭地,朝着某个不可控的方向蔓延。
他停下动作,指尖悬在 Enter 键上方三毫米处。屏幕右下角的时间跳成 03:17,□□ 图标有一下没一下地闪着,是盛夏发来的那句 “今天的钢琴曲很好听”,已经晾在对话框里四个小时零十二分钟。
顾以风的指尖在触控板上滑动,调出隐藏的文件夹。里面只有一个文档,命名是一串乱码 “053 075 06D 06D 065 072”—— 用十六进制转成 ASCII 码,是 “Summer”。
文档创建于雨夜分耳机的第二天。
那天回到宿舍,他把湿透的衬衫扔进洗衣篓时,指尖还残留着耳机线的触感,温热的,带着点潮湿的汗意。钢琴曲的旋律在脑子里盘旋不去,不是 CD 里的完美版本,而是混着雨声、带着她呼吸节奏的那个版本。他坐在书桌前,打开电脑,本想继续调试算法,光标却在空白文档里晃了很久,最终敲下的,是完全无关的字符。
include stdioh int main char heart
编译结果是红色的报错:error: initializer string for array of chars is too long
他盯着那行报错看了三分钟,忽然低低地笑了一声。活了十八年,拿过十五个国际竞赛奖项,在 IOI 赛场上用七十二小时写出过让裁判惊叹的核心算法,居然会在定义字符数组时犯这种低级错误 ,把 “Summer” 当成五个字母,忘了算结尾的空字符。
像个刚学 C 语言的新手。
窗外的月光穿过百叶窗,在键盘上投下细长的影子,像谁的手指在琴键上跳跃。顾以风想起雨夜分耳机时,盛夏的耳尖蹭过他手背的触感,很轻,像羽毛扫过,却让他敲代码的手在那一秒失了准头。
他重新修改代码,这次用了字符串指针:
include stringhint main
char summer "盛夏";while
printf ("我循环遍历了所有可能,最终的最优解是 s", summer);
编译通过了,却在运行时陷入死循环。屏幕上反复滚动着 “我循环遍历了所有可能,最终的最优解是盛夏”,绿色的字符像条没有尽头的河流,把他的影子泡得发涨。
顾以风按下 Ctrl C 强制终止程序,屏幕上跳出 Program terminated with signal SIGINT 。他靠在椅背上,盯着天花板上的吊扇。扇叶积着薄薄的灰,在月光里缓慢转动,像在计算某个无解的方程式。
他不是个擅长表达的人。
小时候参加信息学奥赛,颁奖礼上被要求说获奖感言,他站在台上,对着聚光灯只说了句 “谢谢编译器”,引来台下一片哄笑。后来进了国家队,教练评价他 “代码比语言更有温度”,那些简洁、高效、逻辑严密的字符,能精准地表达他所有的想法,从排序算法到路径规划,从神经网络到量子计算,唯独解释不了心跳的异常。
比如此刻,胸腔里的震动频率明显高于静息状态,像有个劣质的振荡器在里面嗡嗡作响。
他点开文档,开始第三次尝试。这次不用 C 语言了,换了更贴近自然语言的 Python:
def love (summer):
if len (summer) :
return False else:
for i in range (1000000):
print ("第 n 次心动" format )
return True
love ("盛夏")
运行结果是不断刷新的 “第 1 次心动”“第 2 次心动”…… 直到内存溢出,屏幕上跳出 MemoryError 。他看着那串红色的错误提示,忽然想起图书馆的 0.7 秒对视 —— 她的瞳孔在阳光下是浅褐色的,像加了滤镜的琥珀,里面清晰地映着他的影子,比任何调试工具都更能暴露他的异常。
原来心动是会内存溢出的。
顾以风关掉 Python 解释器,打开绘图软件。他很少用这种可视化工具,手指在数位板上显得有些笨拙,线条歪歪扭扭,像刚学画画的小孩。但他画得很认真,先画了坐标系,横轴是时间,纵轴是心率,然后用红色的曲线连接起一个个点:
军训夜跑时,看到她弯腰咳嗽,心率 112 次/分;
医务室走廊,监护仪显示她血氧下降,心率 108 次 / 分;
理论课上,她的笔没水时,心率 124 次 / 分;
图书馆对视 0.7 秒,心率 136 次 / 分;
雨夜分耳机,她的肩膀碰到他时,心率 142 次 / 分。
曲线最后冲上屏幕顶端,像座陡峭的山峰。他在旁边用小字标注:数据异常,无法拟合函数。
其实是可以拟合的。用最小二乘法,总能找到一条近似曲线。但他不想。那些心跳不是冰冷的数据,是她咳嗽时发颤的肩膀,是她接过铅笔时泛红的耳尖,是她耳机里漏出的钢琴声,是所有无法被算法定义的瞬间。
机房的空调突然响了一声,冷风卷着灰尘吹过来,拂过他的后颈。顾以风打了个寒颤,指尖的温度却在升高。他重新打开代码编辑器,敲下一段全新的代码,这次不用任何编程语言,而是用了最基础的伪代码:
算法:向 Summer 告白
输入:所有关于她的碎片(哮喘喷雾的薄荷味 / 速写本上的小猫 / 解题时咬笔的习惯)
输出:无法定义
步骤 1:观察她的呼吸频率,确保不引发哮喘
步骤 2:选择合适的场景(排除人群密集处 / 避免强光直射)
步骤 3:组织语言(删除所有专业术语 / 控制在 20 字以内)
步骤 4:执行告白
异常处理:
若她拒绝:返回初始状态,继续观察
若她接受:无法定义
他在 “无法定义” 的位置停留了很久,敲了又删,删了又敲,最终只留下一个空白的注释符/。
该怎么定义接受后的状态?是像并查集那样合并两个独立的集合,还是像双向链表那样建立永久的连接?好像都不对。那些逻辑严密的数据结构,解释不了想要靠近一个人的冲动。
窗外的天色开始泛白,远处传来清洁工扫地的声音。顾以风保存文档,关掉电脑。屏幕熄灭的瞬间,他的影子在墙上短暂地扭曲了一下,像个被揉皱的纸团。
他站起身,走到窗边。晨雾还没散,香樟树的轮廓在雾里若隐若现,像幅未完成的素描。昨天傍晚,他在这里看到盛夏抱着速写本往图书馆走,军绿色的裙摆扫过草地,带起一串细碎的蒲公英,其中一朵刚好落在她的发梢上。
那个画面,他记了整整十二个小时。
顾以风从口袋里摸出手机,点开与盛夏的对话框。那句 “今天的钢琴曲很好听” 还躺在那里,像颗等待被拆解的数据包。他的指尖在屏幕上反复摩挲,最终敲下一行字:
明天下午三点,图书馆三楼,有本《算法导论》想借你。
发送成功的提示弹出时,他忽然想起那封始终编译错误的情书。或许,有些心意本就不该用代码表达。就像此刻,不需要复杂的算法,不需要严密的逻辑,只需要一句简单的邀约,像往平静的湖面投颗石子,不管涟漪是大是小,至少要有勇气把石子扔出去。
晨雾里,第一只鸟开始鸣叫。顾以风转身离开机房,脚步比来时轻快了些。指尖残留的键盘温度,和即将到来的三点钟,像两个未被定义的变量,在他心里悄悄等待着被赋值的时刻。
那封编译错误的情书,他没删。就像那些无法被算法解释的心动,虽然 “错误”,却真实存在过。