工作间只开了一盏台灯。
光圈压在桌面上,把周围的暗推到墙角去。老式木桌年久失修,漆皮在台灯底座那一圈磨掉了一小块。键盘左边那只马克杯壁挂着一道干掉的浅褐色印子,咖啡液蒸发后留下的弧形痕迹,像某种无人问津的地质年轮。林知遥伸手碰了一下杯身,凉透了。
指尖上残留着那股凉意。她收回手,在牛仔裤侧边蹭了一下。
她把库存模块的异常分支折叠又展开。
母婴店白天报过一次重复扣减库存。付款页一卡,用户多按了一次提交。这种事在弱网下不算稀奇。店主电话里的声音带着点焦躁,说顾客在柜台前等,后台显示库存扣了两份,实际货架只剩一份。她记得自己当时隔着手机屏幕点头,嗯嗯嗯,挂掉之后在备忘录里写:查回滚。
她回看自己上周写的那一段,回滚和库存释放之间留了一个含糊处。当时写得急,凌晨两点多,脑子里想着先跑通主流程,边界情况以后补。以后。这个词在代码注释里等于永远。光标停在 `rollbackOrder` 前一行。
窗外隐约传来一声狗叫。远,听不清是哪个方向。这条街夜里很安静,安静到能听见自己呼吸。
她敲了一行注释。
```js
// 待确认:弱网重复提交时,库存锁定与订单回滚的先后顺序
```
打完最后一个字,她的手指悬在键盘上方,没有立刻落下去。"待确认"三个字其实是一种推诿。确认什么?向谁确认?她知道答案,只是不想把那个名字从脑子里拎出来放到明面上。
光标往下走半行。
```js
// 如果按
```
闪了三下。
屏幕的冷白光在她脸上一明一暗。她盯着那三个字,"如果按"——按什么?按他的思路?按他上次改那个支付模块的写法?她甚至不确定自己想写什么,只是手指先动了。
她按退格,把这半行删掉。
光标退回去的时候发出一声极轻的提示音。或者没有。可能是她自己的错觉。
屏幕右下角,远程桌面那一栏的连接列表多出一个亮着的小绿点。江屿的工位机在线。
鼠标在绿点上停了一下。
绿。很浅的那种绿,系统默认的在线状态色。不是微信的那种亮绿,更像医院走廊里指示灯的颜色。她想起上次在厂房里看见他,隔着一排货架,他在跟仓管说什么,声音很低,听不清。后来他转过身,看见她,点了一下头。
就那一下。
她没有右键,也没有切到微信。
桌上那杯凉透的咖啡映着屏幕的光,杯底的残渣已经沉淀成一小圈深褐色。她把异常分支重新折起来,提交。提交说明只一行:
```
fix(stock): mark weak-network rollback boundary as TBD
```
TBD。To be determined。待定。又是一种推诿。她在提交按钮上方停了零点几秒,然后点下去。进度条转了一圈,绿色的勾。
合电脑前,她又看了一眼连接列表。绿点还在。她把屏幕合到一半,停住,手指捏着屏幕边缘,指甲盖发白。又抬起一点,确认那个状态是"在线",不是"断开重连"。
在线。
不是断开后又连上,是一直在。
然后合上。
电脑合拢的声音在安静的房间里显得有些突兀。金属转轴的轻响,像一声被压低的叹息。
台灯按下去之前,她把凉马克杯端起来。杯身上的褐色印子在灯光下显得更深了,像一道干涸的河床。她端着,看了一眼厨房的方向,没倒掉,又放回原位。
杯底在桌上磕了一声。
她按灭台灯。黑暗一下子涌上来,眼睛需要几秒钟适应。窗外有一点月光,不多,勉强能看清门的轮廓。
上楼的时候,她没有回头。
---
清晨六点多,外面还不亮。
天色是那种深灰与浅灰交界的模糊状态,像一张曝光不足的照片。窗户玻璃上凝了一层薄薄的水汽,外面的轮廓都显得柔和,模糊。
她下楼本来是为了把那只杯子拿去厨房。脚踩在楼梯上,木板发出轻微的吱嘎声,这栋老房子的每一级台阶都有自己的声音。路过工作间门口,她的脚步慢下来,停住。
门没关严。昨晚她走的时候随手带上的,现在门缝透出一线黑。
她站在门口,手搭在门框上。指尖碰到漆皮剥落的地方,有点粗糙。
然后拐了进来。
电脑掀开。屏幕的冷光打在脸上半秒,眼睛本能地眯了一下,亮度自动调下去。她的脸在屏幕反光里映出一个模糊的轮廓,眼下有一点青。昨晚没睡好,或者睡了,但不踏实。
她没先看连接列表,点开仓库。
提交记录最上面一条,时间戳 03:47。
03:47。凌晨三点四十七分。
她看着那个数字,手指无意识地在触控板边缘划了一下。那个时间她应该已经躺在床上了。躺着,睁着眼睛,听窗外不知道哪里传来的风声。三点四十七分。他在做什么?坐在厂房那边的工位上,对着屏幕,敲下这一行?
她拉开 diff。
绿色新增行不多。屏幕上绿色的加号竖成一小排,不长,克制。江屿没有动她那段半成品函数的结构,没有抽出新的工具方法,也没有把她那串 `if-else` 改成 `switch`。她知道他有这个习惯——他写的代码干净,逻辑走向明确,像工厂车间里摆放整齐的零件,各归各位。但他这次没改。
变量名沿用 `pendingOrder` 和 `stockSnapshot`,连那一处偏长的 `stockSnapshot.currentHoldList` 都没有改短。她盯着那一行看了几秒。这个变量名是她自己起的,当时想着"当前持有列表",直译过来就是 currentHoldList,有点啰嗦,但语义清楚。他没改。
异常分支的位置也没动,仍然挂在主逻辑后面。
她想起以前看过一篇文章,说代码审查有两种风格,一种是"我来告诉你怎么写更好",一种是"我顺着你的思路往前走一步"。他是后一种。
新增行贴着她昨晚留出来的空位长出来。像一株植物从她挖好的坑里冒出头,根系在土里接上了什么。
她先看见注释。
```js
// 先收边界,再走主流程
```
四个空格缩进。
不是 tab。
她用的是四个空格。editorconfig 里配好的。他原本习惯 tab,她记得他上次提交的那个工具函数里全是 tab 缩进。这次他换了。
四个空格。
她的手指在键盘上空悬着,没有落下去。
往下翻,`stockSnapshot` 内部多了一个字段。
```js
held_at: timestamp
```
时间戳。库存被锁住的那一刻的时间戳。有了这个字段,回滚的时候就能判断这笔锁定存在了多久,超过阈值的自动释放,没超过的等一等。她昨晚想到过这个方向,但没想清楚怎么落地。他落地了。
光标在这一行上停了一下。她没改,也没问,继续往下翻。
她昨晚原本想在自己那行注释后跟一句"可重构"。鼠标已经移到行尾,光标在那里一闪一闪。可重构。三个字。她按住没动,听见自己的呼吸声。过了两秒,光标退回行首,把那三个字一并从草稿里删掉。
可重构。意思是"我知道这里可以写得更好,但我现在没想清楚,你来"。她不想说这句话。不想用这种方式开口。
她又端起马克杯。
杯身还是凉的,凉意从掌心透进来。她把杯口凑近,低头看了一眼——忘了昨晚没倒。杯底的残渣干涸成一小块,边缘发白。
她把杯子放回原位。
重新坐下。
椅背发出一声轻响,老旧的弹簧在抗议。窗外的天色又亮了一点,深灰变成浅灰,玻璃上的水汽开始往下淌,留下几道细细的痕迹。
---
第二处异常分支她只改了一行。
```js
// 待确认:是否拆分库存锁与订单状态写入
```
提交。
提交按钮点下去的那一刻,她意识到自己的手心有一点潮。不是紧张,是什么别的东西。像在等一个回音,又不确定那个回音会不会来。
她没切窗口,继续往下看。屏幕右下角那个绿点一直在。中间没有弹窗,没有"对方正在输入",没有 @,没有微信图标跳起来。
安静。
她把代码页往下滚,看完一段,又滚回来。眼睛在屏幕上移动,脑子里想的是另一件事。他在线。他看见了。他没说话。
这是一种什么样的沉默?