进度条旁边有个小备注:“今日提交三次代码,均未通过自动化测试。”
陈默点开详情。三次失败都是同一个原因:内存队列的初始化参数错误,导致服务启动后立刻崩溃。
提交时间分别是晚上八点、十点、十一点半。
一次比一次晚。
他往后靠在椅背上。椅背发出不堪重负的咯吱声。
窗外有野猫在叫。声音拖得很长,像婴儿哭。
第二天早上七点半,陈默到公司时,王涛已经在了。
他坐在工位里,面前摆着两个空咖啡罐。头发乱糟糟地翘着,眼睛肿得像核桃。
“早。”王涛哑着嗓子说,手指还在敲键盘。
陈默闻到空气里有薄荷糖的味道。很冲,盖不住隔夜的口气。
“通宵了?”陈默问。
“没,四点回去躺了会儿。”王涛揉了揉太阳穴,“刚把昨晚那个参数 bug 修了。测试过了。”
他说得轻描淡写,但敲键盘的手指在发抖。不是冷,是肌肉过度疲劳后的生理反应。
李薇和张猛前后脚进来。李薇拎着豆浆和包子,塑料袋窸窣响。张猛还是那件灰色卫衣,袖子挽到手肘。
“王涛你这……”张猛看见王涛的样子,话说到一半咽回去,皱了皱眉。
“没事。”王涛抢先说,“队列服务调通了,等会儿可以联调。”
他说着就要站起来,腿一软,又坐回椅子上。椅轮向后滑了半米,撞到隔板。
咚的一声闷响。
李薇放下豆浆,小声问:“你要不……先去睡会儿?联调我们可以先准备。”
“不用。”王涛抓着桌沿站起来,这次稳住了,“早弄完早踏实。”
他说完就往会议室走。脚步有点飘,像踩在棉花上。
张猛看向陈默,眼神里带着询问。陈默摇了摇头。
联调安排在九点。会议室的白板已经擦干净,画上了新的数据流向图。
王涛把笔记本接上投影。屏幕亮起,队列服务的监控面板跳出来。绿色指标一行行滚动,看起来很健康。
“我先跑个 demo。”王涛清了清嗓子,声音还是很哑。
他点开测试脚本。命令行窗口弹出,日志开始刷屏。
前几行正常。队列启动,生产者投递消息,消费者接收处理。延迟数字很低,都在毫秒级。
王涛肩膀松了一些。他舔了舔干裂的嘴唇,手指在触摸板上滑动。
到第一百条消息时,日志突然卡住。
光标停在那里,一动不动。
会议室安静得能听见空调送风声。王涛脸上的血色一点点褪下去。
他按了下刷新。没反应。又按了强制终止快捷键。
命令行窗口还是僵着。
“我看看。”张猛站起来,走到王涛电脑前。他俯身看了眼进程管理器,“队列服务进程还在,但 cpu 占用零。死锁了。”
王涛没说话。他盯着屏幕,呼吸变得很急,胸口起伏明显。
李薇调出自己的监控工具。她快速敲了几个命令,屏幕跳出堆栈信息。
“你看这里。”她指着一段代码,“内存队列的锁获取顺序有问题。生产者拿到锁A等锁B,消费者拿了锁B等锁A。”
典型的死锁场景。教科书里都写过。
王涛肩膀塌了下去。他伸手抓了抓头发,手指扯下来几根,自己都没察觉。
“这个锁顺序……”他声音发虚,“我昨晚改参数时调整过,可能……可能没测全。”
陈默看着投影上的堆栈信息。那行出错的代码后面,跟着提交记录的时间戳:凌晨三点二十。
“先恢复吧。”陈默开口,“用昨天的稳定版本。”
王涛机械地点点头。他退出死锁的测试环境,切回代码仓库。手指在触摸板上划了好几次,才点中正确的版本标签。
回滚,重启。
这次服务正常跑起来了。监控面板上绿色指标重新开始滚动。
但会议室里的气氛已经变了。
张猛坐回椅子上,抱起胳膊。他没看王涛,盯着投影上的监控图表,嘴角抿得很紧。
李薇小声叹了口气,关掉堆栈信息窗口。她端起已经凉了的豆浆,喝了一口,又放下。
王涛还站着。他盯着重新运行的服务,眼神有点空,像没聚焦。
“继续。”陈默说。
后续的联调走得很顺。张猛的同步链路表现稳定,王涛的队列在回滚版本后也没再出问题。数据从一端流到另一端,延迟控制在预期内。
但王涛每次操作前都会停顿一下。点鼠标前停顿,输命令前停顿,甚至说话前也要吸一口气。
像怕再出错。
中午吃饭时,王涛没去。他说不饿,趴在工位上补觉。
陈默和李薇、张猛坐在楼下的快餐店。塑料桌椅油腻腻的,桌角贴着褪色的菜单。
“他这样不行。”张猛夹了块红烧肉,没吃,放在米饭上,“才第一天正式开发,就搞出死锁。后面压力更大,怎么办?”
李薇用筷子戳着碗里的青菜。“他太急了。那个锁顺序的问题,明明写个单元测试就能发现。”
这章没有结束,请点击下一页继续阅读!