下一章 上一章 目录 设置
4、八年的代码 ...
-
傅北辰站在她旁边,低头看着她,表情有点无奈,但眼里的温柔浓得像化不开的墨。
“你笑什么?”他问。
林溪抬起头,脸上全是泪痕,但眼睛亮得像两颗星星。她看着傅北辰,看着他难得一见的困惑表情,笑得更大声了:
“傅北辰!你知道我为了追上你,写了多少行代码吗?!”
傅北辰想了想,认真地回答:“根据你在GitHub上的提交记录,过去八年一共是——大概一百六十万行。”
林溪的笑声戛然而止。
她瞪大了眼睛,用一种“你怎么会知道这个”的表情看着他。
傅北辰的耳朵又红了。
他移开目光,声音变得很轻:“我说了。从你大一交上那份作业起,我就一直在给你改BUG。”
他顿了顿,补充道:“GitHub上的也是。你的每一个开源项目,我都看过。包括你上周提交的那个支付接口优化方案——第三十七行到第四十二行的并发处理逻辑,可以写得更好。我明天给你改。”
林溪蹲在地上,仰着头看着这个男人,看着他的耳朵红得快要滴血,看着他的表情努力维持着冷静但眼底全是慌张,看着他站在那里——这个传说中的技术大神,这个“用键盘守护世界”的男人——像一个做错了事被当场抓获的孩子。
她的鼻子又酸了,但这次她忍住了。
她站起来,拍了拍膝盖上不存在的灰尘,深吸一口气,然后做了一件她想了八年但从来没有勇气做的事——
她伸出手,握住了他的手。
他的手很大,手指很长,掌心干燥温暖。指尖有薄薄的茧——那是长年累月敲键盘磨出来的。
林溪握着他的手,仰起头,看着他的眼睛,一字一句地说:
“傅北辰,我的BUG,我愿意让你改一辈子。”
傅北辰的手指在她掌心里微微颤了一下。
然后他反手握住了她的手,握得很紧,像是怕她跑掉一样。
“说话算话。”他说。
声音低哑,带着一种隐忍了很久的、终于决堤的深情。
窗外的城市霓虹灯在深夜里孤独地亮着,但三楼的这扇窗户里面,不再孤独了。
凌晨三点的云顶科技技术研发中心,两个人站在空荡荡的办公室里,手牵着手,中间隔着的不是八年的距离,而是一段终于走到终点的代码。
哦对了——那天晚上,傅北辰确实给林溪改了那个支付接口的并发处理逻辑。
改完之后,他在代码注释里写了一句话:
// 改完了。写得很好,但还可以更好。就像你一样。
林溪第二天早上看到这条注释的时候,在工位上哭了整整十分钟。
然后她在下面加了一条注释:
// 谢谢师兄。那我的终身代码,你负责维护吗?
傅北辰回复:
// 已接手。版本号:v1.0.0-alpha。进入长期维护阶段,无停止服务计划。
那一夜之后,林溪觉得自己像被人格式化了又重新安装了操作系统——表面上看,一切如常,还是那个写代码时六亲不认的技术骨干,但底层的逻辑已经完全重写了。
她开始注意一些以前不会注意的事情。
比如,每天早上到公司的时候,她的工位上会多一杯咖啡——美式,少糖,加一份燕麦奶。是她最喜欢的口味。没有人看到她旁边的位置上有过人,但咖啡永远是热的。
比如,她提交的每一段代码,code review 的反馈都比以前快了。以前要等大半天,现在基本上提交后半小时内就有回复。评论的风格很统一:精准、简洁、偶尔会在最后加一个“?”。
比如,她的 GitHub 主页上,那个 Followers 列表里多了一个用户名——“beichen”。这个账号没有任何公开仓库,没有头像,没有个人介绍,只有一个 Follow 的时间戳:2018年9月15日。
那是她研究生入学的第一天。
林溪发现这件事的那个中午,一个人坐在公司天台的休息区,对着手机屏幕发了整整二十分钟的呆。
阳光打在她的脸上,晒得她脸颊发烫——但她知道,那不是太阳的缘故。
“这也太离谱了吧……”她喃喃自语,声音被天台的风吹散了。
她点进“beichen”的账号,试图找到更多信息。但那个账号就像一面白墙,干干净净,什么都没有。
唯一的一条动态,是五年前给她的一个开源项目点了一个星。
那个项目是她研究生时期写的第一个正经项目——一个轻量级的网络爬虫框架。代码质量只能说一般,bug 也不少,但那是她第一次尝试独立完成一个完整的工程。
傅北辰给那个项目点了星。
在所有人面前。
在那个她不知道的地方。
林溪把手机扣在膝盖上,仰头看着天空。天很蓝,云很白,六月的阳光热烈得有点过分。她闭上眼睛,感觉到睫毛上沾了一点点湿意。
“傅北辰,你这个人……”她小声说,声音被风吞没了,“真的是……闷骚到了一种境界。”
她笑着摇了摇头,站起来,拍了拍裙子上的灰,走回了办公室。
接下来的日子,两个人的相处模式发生了一些微妙的变化——微妙到全公司的人都能感觉到,但谁也说不清楚到底哪里变了。
最明显的变化是:傅北辰开始频繁地出现在云顶科技。
以前他是“外援”,只有在发生重大安全事件的时候才会被请过来。现在他成了“常客”,隔三差五就来技术中心转一圈,美其名曰“帮你们做安全巡检”。
老周对此求之不得——傅北辰这种级别的人愿意主动来帮忙,简直是天上掉馅饼。他甚至开始考虑要不要给傅北辰开一份顾问合同。
“北辰啊,你要不要考虑来我们公司全职?”老周在一次安全会议后试探性地问,“条件你随便开。”
傅北辰看了老周一眼,面无表情地说:“我在国家队有编制。”
老周立刻闭嘴了。
但他注意到,傅北辰说这句话的时候,目光飘向了办公室的另一头——那里,林溪正对着屏幕咬牙切齿地改代码。
那种目光很轻,轻得像羽毛落在水面上,几乎没有涟漪。
但老周是个过来人,他在那一瞬间什么都明白了。
“哦——”老周在心里拉了一个长长的尾音,然后意味深长地笑了,“原来如此。”
从那以后,老周开始有意无意地给林溪安排一些“需要和安全团队配合”的任务。
每次傅北辰来公司,他都会“恰好”有个会要开,然后把两个人留在同一个会议室里。
林溪不是没有察觉到老周的用意,但她懒得拆穿——因为她确实需要和安全团队配合,而且……她也不排斥和傅北辰待在一起。
一点也不排斥。
甚至有点……期待。
这天下午,林溪正在工位上调试一个分布式事务的 bug,遇到了一个棘手的问题。
她在网上搜了半天,试了各种方案,都不行。
她习惯性地打开 GitHub,准备去搜一下有没有类似的 issue——
然后她停住了。
她的手指悬在键盘上方,犹豫了三秒。
然后她关掉了 GitHub,打开了另一个界面——公司内部的即时通讯工具。
她在联系人列表里翻了一会儿,找到了一个名字:傅北辰。
备注是系统自动生成的:傅北辰(外聘安全顾问)。
林溪盯着这个名字看了五秒,深吸一口气,打了一行字:
“傅师兄,有个技术问题想请教你,方便吗?”
消息发出去之后,她立刻后悔了。
“这也太刻意了吧……他会不会觉得我在找借口搭话……虽然我确实是在找借口搭话……但是问题也是真的有问题啊……”
她把脸埋进手掌里,耳朵又开始发烫。
消息发出去十七秒后,回复来了。
不是文字,是一个语音通话的邀请。
林溪看着屏幕上跳动的“傅北辰”三个字,心跳瞬间飙到了一百八。
她慌乱地抓起桌上的耳机,插上,接通。
“喂?”她的声音有点抖。
“什么问题?”傅北辰的声音从耳机里传出来,低沉,平静,带着一点电流的杂音,像深夜电台的主播。
林溪努力让自己的声音听起来正常一点:“我在做一个分布式事务的补偿逻辑,用的是 TCC 模式,但是在 Try 阶段如果有一个参与者超时,整个事务的回滚逻辑会触发两次——一次是超时触发的,一次是手动触发的,导致数据状态被重复更新。”
她说这段话的时候,语速很快,像在念代码注释。这是她的职业习惯——说技术问题的时候,必须精确、完整、没有歧义。
傅北辰沉默了三秒。
“你的超时时间设置是多少?”
“三秒。”
“太短了。改成五秒。”
“我试过五秒,但用户体验会变差——用户操作后要等五秒才能得到反馈,这个延迟在我们这个业务场景里不可接受。”
“那就不要用 TCC。”傅北辰的语气依然是那种不紧不慢的平淡,“你这个场景更适合用 SAGA 模式。TCC 要求每个参与者都实现 Try-Confirm-Cancel,耦合度太高了。SAGA 是事件驱动的,通过补偿事务来回滚,超时处理会更优雅。”
林溪愣了一下。
SAGA 模式。
她不是没想过,但她一直觉得 SAGA 的实现复杂度太高,而且公司的中间件对 SAGA 的支持不如 TCC 成熟。
“但是 SAGA 的——”她刚想反驳。
“我知道你在想什么。”傅北辰打断了她,“你觉得 SAGA 的实现成本高。但你的场景里只有三个参与者,每个参与者的补偿逻辑都很简单,用 SAGA 反而比 TCC 更干净。我给你发一段示例代码,你看一下。”
通话那头传来键盘敲击的声音——很快,很密,像一阵急促的雨点打在玻璃上。
三十秒后,林溪的通讯工具里收到了一段代码。
她点开一看,瞳孔微微收缩了一下。
那是一段完整的 SAGA 编排代码,针对她的业务场景量身定制的。代码里不仅包含了三个参与者的协调逻辑,还处理了超时、重试、幂等等所有边界情况。每一行都有注释,注释的风格她太熟悉了——精准、简洁,偶尔会在关键逻辑旁边加一个“注意”标签。