下一章 上一章 目录 设置
2、【第二章?Bug Reproduction】 ...
-
国庆假期,南江大学人去楼空。
实验楼 503 却还亮着,像黑夜里的唯一断点。
我和祁雁行被老师点名留下来,给校赛平台打补丁——其实就是把去年他写的评测系统重写一遍,理由很官方:“旧代码耦合度高,不利于后续迭代。”
翻译成人话:祁雁行的代码只有祁雁行能看懂,而老师不想在凌晨三点给他打电话。
“喂,野生编译器。”我抱着笔记本进门,把一杯冰美式放到他左手边,“加糖了,省得你毒舌低血糖。”
他瞥我一眼,没道谢,只把杯子推回两厘米,刚好避开他正在画时序图的鼠标垫。
动作很小,却像一条隐形的代码规范:
// 安全距离:2 cm,防止液体溅射导致短路。
我耸耸肩,在他对面坐下。屏幕上是熟悉的 C++,一行行模板元编程像被施了混淆咒。我看久了,太阳穴突突直跳,便掏出耳机,点开歌单《Lo-Fi Beats to Debug/Relax》。
第一首鼓点刚落,祁雁行伸手摘了我一边耳机,语气淡淡:“BPM 120,影响我思考。”
“……”我深呼吸,把歌单切成《4’33》——约翰·凯奇的沉默曲。
结果他眉头皱得更紧:“风扇噪音 42 dB,采样率过低。”
我摔鼠标:“祁雁行,你是不是对‘合作’两个字过敏?”
他指尖敲桌,语速仍旧不紧不慢:“不,我只是对低效率过敏。”
说完把屏幕转向我——
原来他两分钟前就把旧代码拆成了三大模块,函数指针换成 std::function,内存池重写,还顺手加了 CI 脚本。
“那你叫我留下来干嘛?”我目瞪口呆。
“测试。”他递给我一张便签,上面用铅笔写着一行输入格式,字迹干净得像反汇编后的机器码:
[n, m, q] ≤ 1e5
我咬牙切齿,却又莫名兴奋。
和祁雁行并肩 debug 是一种古怪的极限运动:
他负责把难度调到地狱级,我负责在地狱里找到彩蛋。
凌晨一点,测试数据跑完,最后一组点 AC。
我伸懒腰,椅子滚轮吱呀。祁雁行忽然开口:“你饿吗?”
“实验室禁止明火。”我提醒他。
他“嗯”了一声,拉开抽屉,拿出一包泡面、一只生鸡蛋,还有——一只迷你电煮锅。
我睁大眼:“这就是你说的‘对低效率过敏’?”
祁雁行把锅塞进我怀里,声音低低的:“你效率低,所以我准备提前缓存。”
十分钟后,泡面香气蒸腾。
祁雁行坐在窗边,夜风吹乱他额前的碎发。我隔着雾气偷看他,发现他的睫毛在橘黄灯光下投出一小撮柔软的影子。
那一刻,他一点也不像传闻里那个能把学长怼到退赛的毒舌大神,反而像个……需要加血的 NPC。
“祁雁行。”
“说。”
“你为什么总是一个人?”
他搅面的手停了一下,筷子尖在汤里画了个小漩涡,然后抬眼看我。
“因为一个人写代码更快。”
“那现在呢?”
他把面碗推到我面前,声音轻得像怕惊动什么:“现在两个人,也还行。”
我低头喝汤,热气糊了镜片,世界顿时只剩下一团暖光。
祁雁行收拾锅具,指尖被烫得微红,却固执地不肯让我帮忙。
我突然想起 GitHub 上他个人主页的那句简介:
Issues welcome, humans optional.
忍不住笑出声。
optional?骗人。
至少此刻,他的 optional 里,有我。
两点半,补丁打包上传。
老师发来微信:
“辛苦了!明天给你们放一天假。”
我回了个“OK”的熊猫头表情包,顺手把实验室灯关掉。
黑暗中,只有服务器风扇在转。
祁雁行站在门口,背光,轮廓被走廊的应急灯拉得很长。
“才子涵。”
“嗯?”
“锁门。”
我走近,钥匙插进锁孔的一瞬,听见他补了一句:
“还有——谢谢。”
咔哒。
门合上的声音和心跳重叠,像一次无声的 push origin master。
回宿舍路上,夜风有点凉。
我打开手机备忘录,新建一条:
// 2023-10-02 02:48
// 发现 Bug:祁雁行声称讨厌低效,却愿意为我煮面。
// 状态:待复现。
// 优先级:最高。
耳机里随机播放到下一首歌,鼓点 118 BPM,刚好比他的心跳慢一点。