← Lock

第 2 章:第二章:五天前——星期一的會議

会议室的中央空调在头顶嗡嗡作响,冷气出风口正对着陈志明的后颈。他无意识地转了一下椅子角度,避开那股凉意,视线落在投影幕上。

「电商结账系统重构,时程六周。」

林副总用雷射笔点着投影片上的甘特图,语气像在念一份已经定案的公文。会议室里坐着工程部第二小组的全部八个人,加上产品经理小琪,还有两个志明不太熟的 QA。

「这个案子很重要,」林副总放下雷射笔,环视一圈,目光最后停在志明身上,「志明,你来做技术负责人。」

志明点了一下头。他早就猜到了——这种跨组整合的案子,副总是不会交给别人的。

「技术选型、架构、时程控管,你全权处理。」林副总补了一句,嘴角挂着那种熟悉的笑容,「这件事你看着办,我相信你的判断。」

这句话落在会议室里,像一颗石子丢进平静的水面。志明感觉到左侧有一道目光,不用看也知道是老张。

「好。」志明说。


会议结束后,人群三三两两地散去。志明收拾笔记本电脑的时候,发现大卫还坐在位子上,盯着自己的萤幕,手指在桌面上轻轻敲着。

「怎么了?」志明走过去。

大卫抬起头,犹豫了一下:「Zhi哥,你决定用哪个金流套件了吗?」

「还在评估。」志明拉了把椅子坐下,「目前看起来有两个选项。一个是老牌的,稳定但文件旧。另一个是新的,社群活跃,Laravel 10 原生支持。」

「新的那個是 pay-bridge/payment-kit?」

「对。」

大卫皱了皱眉:「我昨天有看一下它的 GitHub……有几个 Issue 在讨论 Race Condition 的问题。」

志明注意到,当大卫说出「pay-bridge/payment-kit」这个名字的时候,坐在会议室角落里的老张,手指在桌面下微微一顿——不是敲桌子的那种顿,是一种下意识的、像是被什么击中后的停顿。老张的目光从自己的笔电萤幕抬起来,扫过大卫,扫过志明,然后又低下去了。

什么都没说。

「哪个 Issue?」

「#247。标题是『Duplicate charge under concurrent requests』。」大卫把浏览器打开,拉到一个页面,「这里。有人测到在同时收到两笔 webhook callback 的时候,订单状态更新会有竞态问题,导致重复扣款。」

志明凑过去看。Issue 的描述很详细,还附了 log 截图。发 Issue 的人说他在 production 环境遇到了这个问题,已经影响了几十个客户。

「这个 Issue 多久了?」

「开了一年半。」大卫滚动页面,「状态是 Open,maintainer 最后一次回是八个月前,说『我们会看』,然后就没了。」

志明沉默了几秒。会议室的空调声突然变得很大。

「另一个选项呢?」大卫问。

「另一个要自己刻,至少多两周。」

大卫没说话。他不需要说——两周对六周的时程来说意味着什么,两个人都清楚。

「先用了,」志明把笔电盖上,「有问题再说。」

大卫张了张嘴,又闭上了。他点点头,站起来走了。


志明走到茶水间倒咖啡的时候,老张正靠在窗边抽烟。公司的禁烟区在茶水间外面,但老张从来不遵守。

「副总的『我相信你』,」老张吐出一口烟,「听起来真舒服。」

志明没接话,把咖啡机的杯子拿出来。

「六周,」老张弹了弹烟灰,「用那个有 Race Condition 的套件。你算过风险吗?」

「我还没决定——」

「你刚才在会议上说『先用了有问题再说』,」老张打断他,「我在场。」

咖啡太烫,志明喝了一口,舌尖发麻。

「老张,你如果有更好的方案,现在说。」

老张把烟按灭在窗台上的宝特瓶里,那个瓶子里已经有十几根烟蒂,液面发黄。

「没有。」老张说。

他走了。


下午两点,志明在 Slack 上发了一条消息到团队群组:

> 技术选型确认:金流套件用 pay-bridge/payment-kit。时程不变,六周后上线。大家开始准备。

小琪回了一个 OK 的手势。

大卫没有回复。

老张的头像亮着,但没有反应。

志明关掉 Slack,打开编辑器,开始写 project skeleton。Laravel 的 Service Provider、PaymentService、WebhookController、Queue Job——架构在他脑子里已经跑过很多遍了。他写得很流畅,手指在键盘上几乎没有停顿。

写到一半的时候,他停下来,打开浏览器,又看了一次那个 GitHub Issue。

Issue #247 的页面还开着。最下面有一则留言,三天前留的:

> Any update on this? We're seeing it in production more frequently now.

没有回应。

志明把浏览器关掉。


晚上七点半,办公室里只剩下志明和两三个加班的同事。他站在落地窗前,看着楼下的车流。手机震动了一下,是雅婷传的讯息:

> 今天几点回来?

志明打字:

> 大概九点。

他看着这行字,又加了一句:

> 对不起,最近比较忙。

雅婷秒回:

> 没关系。女儿睡了,我留饭给你。

志明把手机收起来,坐回座位。他打开终端机,跑了一下 composer require pay-bridge/payment-kit,看着依赖项一个个被下载、安装。终端机跳出绿色的 Package installed successfully

他盯着那行字看了很久。

Package installed successfully

綠色的字,看起來一切正常。但志明不知道為什麼,胃裡有一種說不上來的感覺。不是後悔——還沒有到後悔的程度。更像是一種預感。就是你站在月台上,火車還沒進站,但你已經聽到鐵軌傳來的那種遠遠的震動。

他把終端機關掉。


## 如果志明说了不


会议室里的空调还是在响。

如果——如果志明在那个当下,看着大卫打开的那个 GitHub Issue,做了不一样的选择。

「这个 Package 有风险,」如果志明说了,「我需要多两周做压力测试。」

林副总的表情会是什么?

志明闭上眼睛,几乎可以看见。

副总会先沉默。不是那种「我在思考」的沉默,而是那种「你怎么不配合」的沉默。然后他会说:「好吧,但你要对这个决定负责。」

这句话和「我相信你的判断」一样轻,但重量完全不同。

「你要对这个决定负责」——意思是:如果后来出了事,是你选的,不是我逼的。

而「我相信你的判断」——意思是:如果后来出了事,是你决定的,我只是信任你。

两种说法,责任归属一模一样。但前者会让志明在会议上被贴上「不配合」的标签,后者不会。

如果志明说了「不」,六周变成八周。八周的时程,副总不会说什么,但工程部的周会上,别的 Team Lead 会怎么看?「志明的案子延期了」「他是不是估时程的能力有问题?」

这些话不会当面对他说,但会传到副总耳朵里。然后副总在绩效评估的时候,会在「领导力」那一栏打一个 B+ 而不是 A。

然后年底调薪的时候,志明的幅度会少 2,000 块。

2,000 块。雅婷的孕妇营养品、女儿的幼稚园学费、车贷。

如果志明说了不,他会准时回家。女儿不会在九点半还等爸爸。雅婷不会挺着七个月的肚子一个人帮女儿洗澡然后哄睡。

如果志明说了不,六周变成八周,但系统不会有 Race Condition。不会有重复扣款。不会有记者会。不会有凌晨三点的崩溃。

如果志明说了不。


但志明没有说。

会议室里,他看着副总的笑容,点了头。

「这件事你看着办,我相信你的判断。」

「好。」

这个「好」字很轻。轻到志明后来回想的时候,几乎听不见。

但它落下来的地方,比他自己以为的要深得多。

3102 字 •