第39章 落款

十一点零四分。

林知遥把那只马克杯端到桌边,茶水凉了一半。她没有续,机械地把笔记本推开一指宽,腾出放杯垫的位置。

工作间在二楼最里。窗朝东,外婆生前用来堆杂物,被她清出来摆了一张木头长桌、两只台灯、一把旧办公椅。墙上还有一张外婆贴的年画,红得已经发暗。

她按下电源键。

风扇转了半秒,屏幕亮起。

IDE 自动加载上次的工程。光标停在她三周前最后一次提交后那一行:

```

// TODO: 调度优先级,待重构

```

她盯了几秒,伸手去抓鼠标,又改用键盘。

```

git pull

```

回车。

终端往下滚了一长串。

她看了一眼,手指停住。

不是几条。是几十条。

提交时间从二十六天前一直拖到三天前。每一条都很小,commit message 短得近乎吝啬。

```

fix: 时区

fix: nil 判断

fix: index out of range

refactor: 状态回流

refactor: 拆 channel

hotfix: 重试上限

```

作者栏不是她。

她把字号调大了一档,俯身看清那一行邮箱前缀。

不是她的项目协作账号。

是另一个她见过、但没想到会出现在这里的名字。

林知遥的指腹在键盘边缘按了一下,松开。

她退回到工程根目录,展开 git log,从最近一次往回翻。

一页。

两页。

三页。

提交时间集中在凌晨两点到四点之间。最早的一次是二十六天前的 03:42,最近一次是三天前的 02:17。

中间没有一次是白天。

她把椅子往前挪了半寸,屏幕亮度调低一档。

第一次 diff 展开。

不是大段改写。是注释。

```go

// 这里 ctx 可能为 nil,上游 cancel 后没传下来。先判一下。

```

她看了两秒,鼠标滚轮往下。

```go

// 数组下标用 len()-1,空切片会 panic。补一行 if。

```

```go

// 时区 Asia/Shanghai 在容器里有时拉不到,fallback 用 08:00。

```

都是基础。

都是她自己写的时候,觉得"测过了应该没事"的地方。

她翻到第十一条提交。

```go

// 这段 retry 没设上限,网络抖动会无限堆。建议封一个 backoff,最多三次。

```

下面紧跟着一段她没见过的小函数,十二行,签名规整,变量名和她整个工程的命名风格对上了。

她回滚到自己上一版。

十二行的位置,原本是她写的:

```go

for {

if err := send(); err == nil {

break

}

}

```

她盯了几秒。

把光标移开,继续往下翻。

第十九条提交,注释从基础落到了业务层。

```go

// 这一步如果失败,任务状态会卡在 processing,定时清理拉不回来。

// 加一条失败回流到 pending,记一次重试计数。

```

```go

// 异常分流:DB 写失败和外部 API 失败要分开,后者可恢复,前者不能。

```

```go

// 状态机少一条边:cancelled -> archived。现在直接丢了,审计对不上。

```

她从抽屉里摸出一支笔,在便利贴上记了"状态机闭环"四个字,撕下来,贴在显示器右下角。

笔迹比平时重。

她没察觉。

第二十六条提交,也就是十二天前 02:51 的那一次,她停了下来。

注释只有一行,被单独提到一个文件顶部:

```go

// 该调度逻辑在高并发设备侧会出现延迟堆积,需预留人工接管接口。

```

林知遥的眼睫垂了一下。

这条不像一个外包接单的人会写的话。

外包的人写注释,通常停在"这里有 bug"。再往上一点的,会写"这样写更稳"。

写到"高并发设备侧""人工接管接口"——这是真在工厂里被坑过的人才会随手留下来的提醒。

她没有点开那个人的资料页。

她只是把这条注释复制到便利贴下面那一格,贴上去。

凌晨零点四十一分。

她起身去倒水,拎着杯子走到楼梯口,又折回来。水杯放在桌角,没喝。

她重新坐下。

继续往后翻。

第三十一条,文件路径是 dispatcher/sensor.go。她对这个文件不熟,这是她接手项目时,甲方塞过来让她"先放着,后面再说"的部分。

注释更短:

```go

// 不要假设传感回传永远准时。

// 真实场景里,最先崩的从来不是算法。

```

她把手从键盘上收回来,按在膝盖上。

老宅木地板在这种深夜会不规则地响一下。她听见楼下不知道哪里发出一声轻微的"咯",像是哪根梁在落湿气。

她没动。

过了很久,她把鼠标拖回那行注释,选中,复制,粘贴到工作笔记最上方。

然后回到 git log。

她做了一件原本没打算做的事——把自己上一版整个 checkout 出来,放在另一个分支上。

两个版本并排开。

左边是她。

右边是他。

她从第一个文件开始,一行一行对。

不是修。是看。

她原以为会看到很多"被改掉"的地方。结果不是。

他几乎没动她的架构。

她写了一个三层的任务分发,他保留了三层。她用 channel 拆 worker,他保留了 channel。她在状态机里偷懒省了两条边,他没把她的省略改回去——他在那两条边上各加了一行注释,标"这里现在不补,上线后第一周一定会爆"。

他没有推翻她。

他在她最容易塌的地方加了锁,在异常没有出口的地方补了出口,在边界情况没考虑到的地方扩了边界。

像是有人沿着她已经搭好的脚手架,从下往上,把每一根没拧紧的螺丝拧了一遍。

林知遥坐了一会儿。

她把右手离开鼠标,抬起来,在自己左手无名指内侧那颗小痣上轻轻碰了一下。

碰了一下,松开。

凌晨一点五十三分。

她新开了一个分支。

```

git checkout -b dispatch-refactor

```

她重新打开 dispatcher 模块。

按照那条"高并发设备侧会出现延迟堆积"的注释,她开始拆。

原本是一条主队列吃所有任务。她把它拆成三块——

主队列,跑常规调度。

人工接管队列,留给那种系统判断不了、必须等人工确认的异常任务。

延迟堆积监控,单独起一个 goroutine,每三十秒采一次队列长度,超过阈值就打告警。

她敲到一半,删了一行。

她原来写的是固定阈值。

她想起他在另一个文件里写过的一句注释:"不要把魔法数字写死,留给配置中心"。

她把固定阈值换成可配置项,补了默认值,再补了一行注释,说明默认值的依据。

注释她用中文。

他的注释也都是中文。

凌晨两点四十六分。

她在人工接管队列里加了一段。

这段不在他的提示里。

任务进入人工接管队列时,要按业务影响排序——金额大的、时效紧的、客户等级高的先排在前面。她写了一个简单的优先级评分函数,三个维度,各占权重。

写完以后,她退回去,把整段读了一遍。

她在评分函数顶部留了一行注释:

```go

// 接管队列里的任务不能 FIFO,人工处理速度赶不上业务窗口。

// 优先级按金额、时效、客户等级三项加权,权重先固定,后续接配置。

```

她看了一会儿,没有再动那行。

她不是被修补的那一方。

她在他拆的结构上,把他没顾上的那一层补了进去。

凌晨三点二十分。

她去了一趟洗手间,回来路上经过楼梯口,顺手把过道灯关了。一楼是黑的。

她坐回去。

四点零八分,她改完了最后一个文件。

git status 提示有十七个文件待提交。

她先没提交。

她把光标拉回到 dispatcher/sensor.go,移到那条注释下方:

```go

// 不要假设传感回传永远准时。

// 真实场景里,最先崩的从来不是算法。

```

光标在下面那行闪。

她敲了两个字。

```

// 原来

```

停了半秒。

退格,删掉。

她把手从键盘上抬起来,看了一眼窗外。

天还没亮,但已经不是纯黑。东边那一小块从墨色变成了灰蓝。

她把手放回键盘。

再敲一次。

```

// 原来

```

光标又闪了几下。

退格,删掉。

她想了想,改成了另一行。

```

// 谢谢。——林知遥

```

打完,她没有立刻保存。

她把"林知遥"三个字看了两秒。

不是工程里随便一行调试注释的口气。也不是日常代码里那种"to whom it may concern"。

是落款。

她按下 Ctrl S。

```

git add .

git commit -m "refactor: 调度模块拆分 接管优先级"

git push

```

终端跑完最后一行。

```

remote: Synced.

```

绿色那行字停在最下面。

林知遥没有关电脑。

她也没有起身。

椅子往后挪了一指,她把双手交叠放在膝上,目光留在屏幕上那行注释下面。

```

// 谢谢。——林知遥

```

提交记录里,她的名字第一次和他并排。

四点五十二分。

天又亮了一层。窗外能看见院里那棵老枣树的轮廓,叶子还黑,枝条已经能数清。

楼下传来一点极轻的动静。

不像脚步,更像是有人把什么东西从工作台上拿起来又放回去——金属碰到木头,一下,很短。

接着是一声更轻的,像是水龙头被拧开半圈又拧紧。

她坐着没有动。

屏幕右下角弹出一条小提示。

```

1 new commit on origin/main.

```

她没有点开。

光标还停在她那行落款下面。

闪一下。

再闪一下。

< 上一章 目录 下一章 >
×
回到小城之后
连载中匿名 /