下一章 上一章 目录 设置
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.
```
她没有点开。
光标还停在她那行落款下面。
闪一下。
再闪一下。