烟头的红光在昏暗的机房里明明灭灭。
陈默靠在服务器机柜上,看着监控屏上跳动的红色倒计时:04:59、04:58……
走廊传来急促的脚步声。
“陈工!陈工你在哪儿?”项目总监刘建国的声音带着哭腔,“钱马上到账!两百万!不,三百万!”
陈默吐出一口烟。
烟雾在应急灯的冷光里缓慢升腾,像某种告别的仪式。
“系统再过五分钟就会完全瘫痪。”他的声音很平静,平静得让人心慌,“现在给我多少钱都没用了。”
刘建国冲进机房,领带歪斜,额头全是汗。
“你故意的?你留了后门?!”
陈默没回答。
他只是看着倒计时变成04:30。
五亿的系统。
一百万的承诺。
一千块的羞辱。
有些账,不是钱能算清的。
![]()
01
陈默推开玻璃门时,前台姑娘正对着小镜子补口红。
“找谁?”她头也没抬。
“刘建国刘总约的。”
姑娘这才抬眼打量他。牛仔裤,灰夹克,背个半旧的黑色双肩包。三十出头的样子,头发有点乱,像刚起床。
“有预约吗?”
“九点半。”陈默看了看墙上的钟,九点二十八。
姑娘在电脑上点了点,撕了张访客贴:“三楼,右转最里面。”
电梯正在维修。陈默爬楼梯上去,三层楼,喘了口气。走廊铺着厚地毯,吸走了所有脚步声。两边的门都关着,磨砂玻璃后面晃动着模糊的人影。
最里面的办公室门开着。
刘建国站在窗前打电话,声音很大:“……放心,王总,肯定搞定!我请的是顶尖高手……”
他转过身,看见陈默,愣了一下,随即堆起笑容,对着话筒说:“好好,人到了,先这样。”
电话挂断。
“陈工!久仰久仰!”刘建国快步走过来握手。他四十多岁,白衬衫熨得平整,头发用发胶固定得一丝不苟,“张教授推荐的人,肯定错不了。”
“刘总。”陈默握了握手,松开。
“坐坐。”刘建国指了指沙发,自己坐回老板椅,“情况张教授跟你说了吧?”
“说了个大概。”陈默把背包放在脚边,“供应链管理系统,上线三个月,最近频繁崩溃。”
“何止崩溃。”刘建国从抽屉里拿出一叠打印纸,推到茶几上,“这是日志。上周三,系统宕机四个小时,华东区三十七家供应商的订单全卡住了。昨天更离谱,整个仓储模块数据错乱,显示有货,仓库是空的。”
陈默拿起日志翻看。
密密麻麻的错误代码,像某种疾病的病历。
“原开发商呢?”
“别提了。”刘建国点了根烟,“深圳那家公司,两个月前倒闭了。源码都没交接清楚,现在根本找不到人。”
“合同金额多少?”
刘建国吐了口烟,笑了:“陈工问这个……”
“我得知道系统值多少钱,才能判断该花多少精力修。”陈默抬起头,“当然,您要是不方便说——”
“五亿三千万。”刘建国说,“含五年维护。”
办公室里安静了几秒。
窗外的城市在晨光里泛着灰白的光。远处有塔吊在转动。
“所以现在,”刘建国把烟按灭在烟灰缸里,“这个价值五亿三千万的系统,像个植物人一样躺在ICU里。陈工,你是我们请的专家。”
陈默合上日志:“我先看看系统。”
“这边请。”
刘建国带他穿过走廊,推开一扇厚重的防火门。冷气扑面而来。
机房很大,目测有两百平。一排排黑色机柜像沉默的墓碑,指示灯闪着绿光。三个工程师坐在监控台前,屏幕上滚动着数据流。
“这位是陈工,来帮忙看看系统。”刘建国介绍,“小李,你配合一下。”
一个戴眼镜的年轻人站起来,点点头,又坐下了。
陈默走到主控台前,拉过一把椅子坐下。键盘很干净,但键帽已经磨得发亮。他敲了几个命令,调出系统架构图。
复杂的网状结构,像城市的血管图。
“崩溃前有什么征兆吗?”他问小李。
小李看了刘建国一眼。
“直说。”刘建国说。
“就是……慢。”小李推了推眼镜,“查询响应时间从两秒变成十秒,有时候二十秒。重启能好一会儿,但过几个小时又不行了。”
“负载呢?”
“不高。CPU平均30%,内存60%。但就是卡。”
陈默调出性能监控。图表上的曲线像心脏病患者的心电图,每隔一段时间就出现一个陡峭的波峰。
“数据库锁。”
“什么?”刘建国凑过来。
“大量死锁。”陈默指着屏幕,“事务互相等待,谁都不释放资源。堆积到一定数量,整个数据库就僵死了。”
“能修吗?”
陈默没回答。他继续敲键盘,调出源代码目录。文件列表快速滚动,他盯着看了半分钟。
“这代码……”他顿了顿,“谁写的?”
“原开发商啊。”
“我是说,哪个程序员写的。”陈默转过头,“这里面的坑,多得能埋下一个团。”
小李忍不住笑了一声,又赶紧憋住。
刘建国的脸色不太好看:“能修就行。陈工,开个价。”
陈默站起来,活动了一下手指关节。机房的白光灯照得他脸色有些苍白。
“一百万。”
刘建国眼皮跳了跳。
“包括彻底排查、修复现有问题,外加三个月的稳定性优化。”陈默说,“预付三十万,验收付清。”
“太高了。”刘建国摇头,“五十万。”
“那您另请高明。”
陈默开始收拾背包。拉链的声音在安静的机房里格外清晰。
“等等。”刘建国拦住他,“八十万。”
陈默背上包,往门口走。
“九十!”
手已经搭在门把上。
“……行,一百万。”刘建国的声音从背后传来,“但我要你签保密协议。这事传出去,公司股价得崩。”
陈默转过身。
“预付三十万,今天到账。”他说,“我现在开始干活。”
刘建国咬了咬牙,掏出手机:“财务,给陈默的个人账户打三十万。对,现在。”
挂掉电话,他盯着陈默:“陈工,我这人说话算话。但丑话说在前头,你要是修不好——”
“修不好,三十万原路退回。”陈默把背包放下,重新坐回控制台前,“给我三天。”
“三天?”
“嗯。”陈默已经开始敲键盘,“对了,我需要最高权限。”
刘建国对小李点点头。小李输入一串密码,退出了账号。
陈默登录系统。
屏幕蓝光映在他脸上。他的眼神很专注,手指在键盘上快速移动,像钢琴家在弹奏一首复杂的曲子。
刘建国看了一会儿,悄悄退了出去。
门关上的时候,陈默抬起头,看了一眼监控摄像头。
红灯亮着。
他重新低下头,嘴角有一丝极淡的、几乎看不见的弧度。
02
深夜十一点,机房只剩陈默一个人。
监控台的烟灰缸里积了七八个烟头。泡面盒放在一边,汤汁已经凝固。屏幕上开着一十多个窗口,代码像瀑布一样滚动。
陈默揉了揉太阳穴,拿起杯子喝了一口。水是凉的。
他调出数据库死锁的详细日志。时间戳精确到毫秒,事务ID、锁类型、等待资源……上万条记录,像一团乱麻。
普通工程师看到这个量级的数据,大概会头皮发麻。
但陈默的眼神很平静。
他写了个脚本,开始自动分析。二十分钟后,结果出来了。问题出在库存盘点模块——一个叫做sync_inventory的存储过程。
点开源码,陈默皱起眉。
这代码写得简直是一场灾难。
嵌套循环里套着嵌套循环,每次盘点都要全表扫描。
更糟糕的是,开发者在事务里加了人工延迟,美其名曰“避免并发冲突”。
结果就是:十个并发盘点请求,能产生一百个死锁。
“这种水平也敢接五亿的项目。”陈默低声说。
他新建了一个文件,开始重写。键盘的敲击声在空旷的机房里回响,清脆、急促、有节奏。窗外的城市已经暗了大半,只有零星的灯光还亮着。
凌晨三点,新代码写完。
陈默没有立即部署。
他调出系统调用链,顺着库存模块往下挖。
采购、订单、物流、财务……模块之间通过消息队列通信,但队列配置有问题,消息积压严重。
就像一个心血管堵塞的病人。
他继续写修复脚本。手指有些僵硬,起身活动了一下,又坐回去。
天快亮的时候,机房的门开了。
小李端着两杯咖啡进来,看到陈默还坐在那儿,愣了一下:“陈工,你一晚上没睡?”
“嗯。”陈默接过咖啡,温度刚好。
“有什么进展吗?”
“找到几个主要问题。”陈默喝了口咖啡,苦得他眯了眯眼,“但系统太复杂,得一层层剥。”
小李在他旁边坐下,看着满屏的代码:“说真的,这系统刚上线的时候我就觉得不对劲。测试期短,压力测试根本没做够。可上面催得急,非要按期上线。”
“常见。”陈默说。
“你以前遇到过这种项目?”
“遇到过。”陈默盯着屏幕,“结局都不太好。”
小李还想问什么,陈默已经转回身,继续敲键盘。那意思很明显:别打扰我工作。
小李讪讪地站起来,走了。
上午九点,刘建国来了。
“怎么样?”他眼里有血丝,大概也没睡好。
“库存模块的问题找到了,正在修复。”陈默没回头,“但系统还有更深层的问题。”
“什么问题?”
“架构缺陷。”陈默调出系统拓扑图,“模块之间耦合太紧,一个地方出问题,全盘皆受牵连。消息队列没有容错机制,数据库连接池配置不合理……”
“你就说,能不能修到不崩溃?”刘建国打断他。
陈默转过身,看着他:“能。但只是暂时。就像给癌症病人吃止痛药,肿瘤还在。”
“先止痛。”刘建国说,“股价不能再跌了。下周有机构要来调研,系统必须稳定。”
“那需要加钱。”
“什么?”刘建国的声音提高了,“我们谈好了一百万!”
“那是彻底修复的价格。”陈默平静地说,“如果您只想暂时稳住,我可以做个应急补丁。五十万。”
刘建国的脸色变了变。
“……行。”他从牙缝里挤出这个字,“但今天就要见效。”
“下午三点,您来验收。”
刘建国走了,门关得很重。
陈默重新面对屏幕。他删掉了刚刚写的重构方案,新建了一个文件夹,命名为“hotfix”。
手指在键盘上停留了几秒。
然后开始敲代码。
这一次,他的速度慢了很多。每写几行,就要停下来想一想。有时候删掉重写,有时候加一段注释。
中午十二点,小李送来盒饭。
陈默接过,放在一边,继续工作。
“陈工,吃饭吧。”小李说,“身体要紧。”
“马上就好。”
下午两点四十,最后一个测试用例通过。
陈默保存代码,部署到测试环境。运行监控脚本,各项指标正常。死锁消失了,响应时间稳定在两秒以内。
他靠在椅背上,长长地吐了口气。
眼睛干涩得发疼。
两点五十五,刘建国带着两个人进来。一个是技术总监,姓王,秃顶,一脸严肃。另一个是财务部的女经理,手里拿着平板电脑。
“可以演示了。”陈默说。
小李在测试终端上操作。下单、查询库存、生成发货单、更新财务数据……一连串操作,流畅得让人意外。
王总监亲自上手试了试,点点头:“响应速度确实上来了。”
“能扛住压力吗?”刘建国问。
陈默调出压力测试工具,模拟了两百个并发用户。系统负载稳步上升,但始终没有崩溃。二十分钟后,测试结束,成功率100%。
“好!”刘建国一拍大腿,“陈工,厉害!”
财务经理在平板上点了几下:“陈工,尾款七十万,按合同是验收后支付。刘总特批,可以先付一半,三十五万,今天到账。”
陈默看着她:“合同说验收付清。”
“流程需要时间。”刘建国走过来,拍拍他的肩,“放心,剩下的三十五万,一周内肯定给你。公司这么大,还能赖你的账?”
陈默没说话。
“这样,”刘建国掏出钱包,数出两千现金,“你先拿着,当辛苦费。剩下的钱,财务走完流程就打。”
现金放在监控台上,红彤彤的两沓。
陈默看着那两千块钱,又看了看刘建国诚恳的脸。
“行。”他说。
“爽快!”刘建国笑了,“晚上一起吃个饭?我订了位置。”
“不了,我回去睡觉。”
陈默关掉电脑,收拾背包。那两千块钱他没拿,留在台子上。
“钱您收着。”他说,“等尾款到了再说。”
刘建国的笑容僵了一下,随即恢复自然:“也好,也好。”
陈默背着包走出机房。走廊里,几个员工正在小声议论什么,看到他过来,立刻闭嘴散开。
电梯这次能用了。
金属门映出他疲惫的脸。眼睛下面是深深的黑影。
电梯下行,失重感让胃里一阵翻涌。
走出大楼时,阳光刺眼。他眯起眼睛,在路边站了一会儿,才朝地铁站走去。
背包里,电脑还温着。
里面除了修复代码,还有一个隐藏文件夹。
加密的,密码只有他知道。
![]()
03
一周过去了。
陈默的手机很安静。没有短信,没有转账提醒,连个电话都没有。
他坐在出租屋的电脑前,屏幕上是那个加密文件夹。光标在密码输入框里闪烁,一闪一闪,像在催促什么。
第八天早上,他拨了刘建国的电话。
响了三声,接通。
“陈工啊!”刘建国的声音一如既往的热情,“正要给你打电话呢!怎么样,休息好了吗?”
“尾款还没到。”陈默说。
“哎呀,正要跟你说这个。”刘建国叹了口气,“财务那边遇到点麻烦。公司最近资金紧张,几个大项目的回款都延迟了。你那笔钱,可能还得等几天。”
“几天?”
“这个……说不准。”刘建国压低了声音,“实不相瞒,陈工,公司现在处境不太好。上次系统崩溃的事,虽然你解决了,但影响已经传出去了。这周股价又跌了五个点。”
“这样,你再等等。”刘建国说,“我这边一有消息,马上通知你。”
电话挂了。
陈默放下手机,点了根烟。烟雾在晨光里缓缓上升。窗外,对面楼有人家在晾衣服,湿漉漉的床单在风里飘荡。
他打开浏览器,搜了那家公司的股票代码。
K线图一路向下,像悬崖的剖面。最新公告:重大资产重组停牌。
难怪没钱。
但这不是赖账的理由。
他又等了两天。第十天下午,他去了公司。
前台换了个人,是个年轻男孩。陈默说要找刘建国,男孩查了查,说刘总在开会。
“我等他。”
陈默在接待区的沙发上坐下。
沙发很软,坐下去整个人都陷进去。
墙上的电视正在播财经新闻,女主播的声音字正腔圆:“……传统制造业数字化转型面临阵痛……”
等了四十分钟,刘建国才出现。
他身边围着三四个人,边走边交代事情。看到陈默,他愣了一下,随即笑起来:“陈工!怎么来了也不提前说一声?”
“电话打不通。”陈默站起来。
“哎呀,开会调静音了。”刘建国对身边的人摆摆手,“你们先去吧。”等人走远,他揽住陈默的肩,“走,去我办公室说。”
办公室里多了盆绿植,叶子油亮亮的。
“坐。”刘建国亲自倒了杯茶,“陈工,我知道你为什么来。钱的事,我比你还急。”
“那就付钱。”陈默没碰那杯茶。
“真不是不付。”刘建国在自己位置上坐下,双手交叉放在桌上,“公司现在什么情况,你可能也知道了。现金流断裂,银行在催贷,供应商在堵门。你那七十万,说多不多,说少不少,但现在真拿不出来。”
“合同呢?”
“合同当然有效。”刘建国拉开抽屉,拿出一份文件,“你看,我都准备好了。延期付款协议,利息按银行基准利率算。只要你签字,钱一到账,我第一个付你。”
陈默接过协议。条款写得很漂亮,违约责任、利息计算、支付时限……一应俱全。
但都是空话。
“我要现金。”他说。
刘建国的笑容淡了些:“陈工,互相理解一下。你也看到了,这公司上上下下几百号人,工资都快发不出来了。你这七十万,能救急。”
“我的劳动报酬,不是捐款。”
气氛僵住了。
刘建国端起茶杯,慢慢喝了一口。放下杯子时,瓷器碰撞的声音很清脆。
“这样。”他说,“我再私人贴你五万。七十五万,下个月十五号,一次性到账。”
“今天能付多少?”
“今天……”刘建国苦笑,“账上只剩几万块钱,要给保洁和保安发工资。”
陈默站起来。
“陈工——”
“法庭见。”陈默往门口走。
“等等!”刘建国也站起来,“你真要闹到那一步?诉讼周期多长你清楚吧?一年?两年?就算你赢了,公司破产清算,你能拿到多少钱?”
陈默的手停在门把上。
“现实点,陈工。”刘建国的声音从背后传来,“签了延期协议,钱还有希望。闹翻了,你一分都拿不到。”
窗外的天色暗了下来。乌云压得很低,要下雨了。
刘建国站在办公桌后,背挺得笔直,像个谈判桌上的将军。
“三十万。”陈默说。
“什么?”
“今天付我三十万,剩下的我不要了。”陈默说,“两清。”
刘建国盯着他,像是在判断这是不是陷阱。
“十五万。”他说。
“二十五。”
“二十。”刘建国咬牙,“最多二十万。我现在就让财务凑。”
陈默看了他几秒。
“行。”
刘建国松了口气,拿起电话:“财务,准备二十万现金。对,现在。”
挂掉电话,他又恢复了那副笑脸:“陈工,这就对了。生意场上,以和为贵嘛。”
陈默没接话。
二十分钟后,财务经理提着个黑色塑料袋进来。她把袋子放在茶几上,拉链敞开,里面是整齐的钞票。
“二十万,你点点。”
陈默走过去,拿起一沓。是真钞。他数了十沓,放回袋子里,拉上拉链。
“收据。”财务经理递过来一张纸。
陈默签了字。
“合作愉快。”刘建国伸出手。
陈默没握。他提起袋子,转身就走。
“陈工。”刘建国叫住他。
陈默停下来,没回头。
“那个应急补丁,”刘建国说,“能管多久?”
“看运气。”陈默说。
“什么意思?”
“意思是,系统根本问题没解决。”陈默拉开门,“就像用胶带粘漏水的管子,什么时候崩,看压力多大。”
门关上了。
走廊里空荡荡的。陈默提着袋子,一步步走下楼梯。袋子很沉,勒得手疼。
走出大楼时,雨已经开始下了。细密的雨丝斜织下来,打湿了地面。
他在屋檐下站了一会儿,掏出烟,点燃。
烟雾混着水汽,模糊了视线。
口袋里的手机震动了一下。他拿出来看,是银行短信:账户收入1100元。
备注:劳务费。
陈默盯着那行数字,看了很久。
雨越下越大。
他把手机放回口袋,提起袋子,走进雨里。
雨水很快打湿了头发,顺着脸颊往下淌。
他没擦。
04
出租屋里,黑色塑料袋堆在墙角。
陈默洗了个热水澡,换了身干衣服。擦头发时,毛巾上有淡淡的血腥味——牙龈出血了,最近熬夜太多。
他打开电脑,登录银行账户。
余额:1100.37元。
那二十万现金他没存,就扔在墙角,像一袋垃圾。
手机又响了,这次是微信。小李发来的消息:“陈工,系统又出问题了。比之前还严重。”
陈默没回。
他打开那个加密文件夹,输入密码。里面只有一个文件,是个监控脚本。双击运行,屏幕黑了一瞬,然后弹出一个命令行窗口。
代码开始滚动。
这是他留在系统里的后门——不,不能叫后门。只是个健康检查程序,每隔一小时采集一次系统状态,加密后发到他的服务器。
权限是他修复时顺便要的。刘建国催得急,没仔细看授权列表就签字了。
现在,这个程序成了他的眼睛。
数据加载完毕。图表显示,系统负载在过去二十四小时里飙升了三次,每次都在崩溃边缘拉回。死锁数量在增加,消息队列积压超过警戒线。
那个应急补丁,正在失效。
陈默调出详细日志。
问题出在采购模块——有人批量导入了几千条供应商数据,触发了全表重建索引的操作。
这个操作本该在凌晨执行,但不知谁改了定时任务,放在了白天高峰期。
蠢货。
他关掉窗口,点了根烟。
烟灰缸已经满了,他懒得倒。烟灰积成一个小山包,最下面那层已经变成灰白色。
手机又震。还是小李:“陈工,看到消息了吗?刘总让我联系你,说可以加钱。”
陈默吐出口烟。
烟雾在屏幕前散开,代码变得模糊。
他掐灭烟,打字回复:“什么价?”
小李很快回:“你说。只要能解决问题。”
“两百万。”
对方正在输入,停了,又输入。
“陈工,这太高了。”
“那就让系统崩。”
这次沉默的时间更长。陈默能想象屏幕那头的人有多慌张——小李只是个普通工程师,担不起这个责任。
五分钟后,消息来了:“刘总说可以谈。你能来公司吗?”
“先付一百万定金。”陈默打字,“到账我过去。”
“这……”
“或者你们自己解决。”
发完这条,他把手机静音,扔到床上。
窗外的雨停了,但天色还是阴沉沉的。远处传来救护车的鸣笛声,由远及近,又由近及远。
他重新坐回电脑前,打开另一个加密文件。
这是系统的完整架构图,他修复时画的。
每个模块、每个接口、每个数据库表的关系,都标注得清清楚楚。
红色的是已知问题,黄色的是潜在风险,绿色的是已经修复的。
整张图大部分是红色和黄色。
绿色区域只有零星几点,像沙漠里的几棵草。
他放大库存模块。应急补丁的原理很简单:在死锁形成前,强行杀死耗时最长的查询。就像给疼痛的病人打吗啡,不治病,但能让他暂时安静。
副作用是:被杀死的查询可能涉及重要数据更新。一次两次没事,次数多了,数据一致性就会出问题。
他现在就能看到苗头——库存表和流水表已经有微小的差异,大概差了几十件货。没人发现,因为差异还没大到触发警报。
但雪崩的时候,没有一片雪花是无辜的。
手机在床上震动,屏幕亮了一下又暗下去。
陈默没理。
他调出系统部署时的原始文档。
五百多页的PDF,他快速浏览着。
在“非功能性需求”那一章,找到一行小字:系统需支持7×24小时不间断运行,年可用性不低于99.99%。
99.99%。
意味着一年里最多只能宕机52分钟。
过去三个月,这个系统已经宕机超过四十个小时。
合同里的违约金条款,应该很吓人。
陈默关掉文档,打开新闻网站。搜那家公司的名字,最新的一条是三天前的:“XX科技陷债务危机,多家供应商停止供货”。
评论里有知情人士爆料:公司实际控制人正在境外,疑似跑路。
他关了网页,靠在椅背上。
眼睛很涩,滴了眼药水,刺激得流眼泪。他擦了擦,指尖是湿的。
天完全黑了。
他打开灯,昏黄的光填满房间。墙角那袋钱在阴影里,像个沉默的证人。
手机又亮了。这次是电话,刘建国打来的。
陈默看着屏幕亮起、熄灭、再亮起。第三次时,他接了。
“陈工。”刘建国的声音很疲惫,“我们谈谈。”
“钱到账了?”
“……还没。”刘建国顿了顿,“但我在想办法。你能不能先过来看看?系统快撑不住了。”
“我过去也解决不了根本问题。”
“能撑一天是一天。”刘建国声音里带着恳求,“陈工,公司垮了,你那七十万更没着落。帮帮忙,就当帮你自己。”
“这样,”刘建国说,“只要你今天能让系统稳定下来,我私人担保,三天内付你五十万。现金。”
“你拿什么担保?”
“我……”刘建国语塞。
电话里传来打火机的声音,他点了根烟。
“陈工,我知道你生气。”烟雾让他的声音有些模糊,“之前是我不对。但人在江湖,身不由己。上面有股东,下面有员工,我夹在中间,难啊。”
陈默看着屏幕上的监控数据。系统负载又冲上了一个高峰,CPU使用率突破90%。
“我现在过去。”他说。
刘建国像是没反应过来:“……什么?”
“但我有个条件。”陈默说,“我要所有模块的最高权限,包括财务和人事。修复期间,任何人不得干预。”
“不同意就算了。”
“同意!”刘建国立刻说,“都同意!你现在过来,我让保安给你开闸。”
陈默站起来,活动了一下僵硬的脖子。骨节发出轻微的响声。
他走到墙角,提起那袋钱,拉开拉链,拿出一沓。剩下的,他塞进了床底下的行李箱里。
换衣服,穿鞋,拿上背包。
出门前,他看了一眼电脑屏幕。
监控程序还在运行,红色的警报闪烁。
倒计时:未知。
他关掉屏幕,锁上门。
楼梯间的声控灯坏了,他摸黑下楼。脚步声在空荡荡的楼道里回响,一声,又一声。
像心跳。
![]()
05
公司大堂的灯只开了一半,光线昏暗。
保安趴在桌上睡觉,听到脚步声,抬起头,睡眼惺忪:“找谁?”
“刘总约的。”
保安看了看登记本,递过笔:“签一下。”
陈默签了名。保安按了电梯,金属门缓缓打开。轿厢里的灯光惨白,映出他疲惫的脸。
三楼,机房。
刘建国已经等在那里,还有王总监和小李。三个人站在监控台前,屏幕上全是红色警报。
“陈工!”刘建国迎上来,“你可算来了。”
陈默没寒暄,直接走到主控台前坐下。背包放在脚边,从侧袋掏出自己的键盘,换上。
“什么情况?”
“从下午开始,订单模块就卡。”小李指着其中一个屏幕,“用户投诉进不了系统,客服电话被打爆了。”
陈默调出订单模块的日志。大量的超时错误,数据库连接池耗尽。
“谁动过配置?”
王总监咳嗽了一声:“……我。上午优化了一下连接数,想提高性能。”
“改了多少?”
“从一百改到两百。”
陈默闭了闭眼。
连接数不是越多越好。每个连接都要占用内存,两百个并发连接,足以把数据库拖垮。
“改回去。”他说。
“现在改?会不会……”
“改。”
王总监看了刘建国一眼。刘建国点头:“听陈工的。”
小李操作,把连接数改回一百。十分钟后,超时错误开始减少,但系统负载仍然很高。
“不止这个问题。”陈默调出全链路监控,“消息队列积压了上万条消息,消费者进程死了三个。”
“怎么死的?”
“内存泄漏。”陈默快速敲着键盘,“代码里有处资源没释放,运行时间一长,进程自己就崩溃了。”
“能。”陈默开始写补丁,“但需要重启消息队列服务。重启期间,所有异步操作都会暂停。”
“暂停多久?”
“五分钟。”
刘建国看了看表,晚上九点二十。
“现在用户少,可以重启。”王总监说。
“那就现在。”陈默部署补丁,点击重启。
进度条开始缓慢移动:1%、2%……
所有人都盯着屏幕。
机房里的空调嗡嗡作响,吹出冷风。陈默的后背出了一层薄汗,被冷气一激,打了个寒颤。
进度条到50%时,卡住了。
“怎么回事?”刘建国问。
陈默没回答。他调出日志,快速浏览。然后骂了句脏话,声音很低,但所有人都听到了。
“怎么了?”小李问。
“依赖的服务没停干净。”陈默的手指在键盘上飞舞,“有进程还占着端口。得强杀。”
他打开终端,输入命令。
屏幕上滚过一串串代码。红色的错误信息,黄色的警告,绿色的成功提示。像一场无声的战争。
进度条终于动了:51%、52%……
刘建国走到窗边,点了根烟。火光在黑暗的玻璃上反射出一个红点,明明灭灭。
“陈工,”他没回头,“这次修好,能管多久?”
“看你们怎么用。”陈默说,“如果还像现在这样乱改配置,随时会崩。”
“那彻底解决,要多久?”
陈默停下手,转过头看他:“你想彻底解决?”
“想。”刘建国转过身,脸上有烟雾缭绕,“这系统像颗定时炸弹,我睡不踏实。”
“三个月。”陈默说,“重写核心模块,优化架构,重建监控体系。但你们等不了三个月。”
“为什么?”
“因为系统撑不了那么久。”陈默指了指屏幕,“现在的状态,就像用胶水粘起来的瓷器,随时会碎。”
进度条到了80%。
机房的门突然被推开。
一个穿着西装的中年男人闯进来,脸色铁青:“刘建国!怎么回事?北美那边的订单全卡住了!”
刘建国脸色一变:“张总,您怎么来了?”
“我再不来,公司就垮了!”张总指着屏幕,“客户在骂娘!供应商在催款!你这个技术总监怎么当的?”
王总监低下头,不敢说话。
“正在修,正在修。”刘建国赔着笑,“陈工,还需要多久?”
“两分钟。”陈默说。
“快点!”张总拉了把椅子坐下,跷起二郎腿,“我就在这儿等。”
气氛更紧张了。
进度条缓慢爬升:85%、90%……
陈默盯着日志,手指在桌面上轻轻敲击。这是他的习惯,思考时无意识的小动作。
95%。
手机响了,张总的。他接起来,语气立刻变得恭敬:“王董……是,是,我知道……正在处理……一定,一定……”
挂掉电话,他额头冒汗。
“董事长亲自过问了。”他看着刘建国,“天亮前必须解决。否则,你我都要滚蛋。”
刘建国脸色发白。
进度条:99%。
停住了。
所有人都屏住呼吸。
一秒,两秒,三秒。
100%。
屏幕刷新,所有服务状态变成绿色。消息队列积压数开始下降,从一万降到八千,五千,一千……
“好了。”陈默说。
刘建国长出一口气,整个人瘫在椅子上。
张总站起来,走到监控台前看了看,点点头:“行,暂时过关。”他看了眼陈默,“你就是那个外援?”
“陈默。”
“技术不错。”张总从口袋里掏出名片盒,抽出一张递过来,“有没有兴趣来我们集团?年薪翻倍。”
陈默没接名片。
“张总,”刘建国赶紧打圆场,“陈工还在帮我们修复系统……”
“修复?”张总笑了,那笑容很冷,“这破系统还有修复的价值吗?我早说了,该换新的。你们非要修修补补,浪费钱。”
他拍了拍陈默的肩:“小伙子,想清楚了联系我。跟着这群人,没前途。”
说完,他走了。
门关上,机房里的空气还是凝固的。
刘建国抹了把脸,挤出笑容:“陈工,别介意。张总就这脾气。”
陈默没说话。他保存了工作记录,开始收拾东西。
“那个……陈工。”刘建国走过来,“彻底修复的事,我们再谈谈?”
“谈什么?”
“价格。”刘建国压低声音,“两百万,你刚才说的。我给你。但我要你签长期顾问合同,保证系统三年内不出大问题。”
陈默拉上背包拉链。
“钱呢?”
“分期付。先付五十万,剩下的按月付。”刘建国说,“这是我能争取到的最好条件。”
陈默背起包,看着他。
刘建国的眼神很诚恳,甚至有点卑微。眼角的皱纹很深,头发里夹着几根白的。
“我需要想想。”陈默说。
“明天给我答复?”
“嗯。”
陈默走向门口。手搭上门把时,刘建国又叫住他。
“陈工。”
陈默回头。
“今天……谢谢。”刘建国说,“真的。”
陈默点点头,拉开门。
走廊的灯很亮,刺得眼睛疼。
他走进电梯,按下1楼。金属门合上,镜子里的自己脸色苍白,眼圈发黑。
电梯下行时,他拿出手机。
银行APP,余额还是1100.37元。
那张1100元的入账记录,像个嘲讽的表情,挂在交易列表的最上面。
他关掉手机,放回口袋。
电梯到了。
门开时,大堂的保安已经醒了,正在看手机视频。看到他,点了点头。
陈默走出大楼。
夜风很凉,吹在脸上,像冷水泼面。
他点了根烟,站在路边等车。
手机震动,是监控程序发来的警报邮件。
标题:系统健康度降至临界值。
他没点开看。
只是抽着烟,看着街上的车流。红色的尾灯连成一条线,蜿蜒着消失在夜色深处。
一辆出租车停下,他拉开车门。
“去哪儿?”司机问。
陈默报出地址,靠在后座上,闭上了眼睛。
车开动了。
城市在窗外倒退,灯火阑珊。
06
接下来的三天,陈默没去公司。
他把自己关在出租屋里,电脑几乎没关过。监控程序每小时发来一份报告,系统状态像过山车一样起伏——时而平稳,时而濒临崩溃。
刘建国每天打三个电话,语气一次比一次急。
“陈工,考虑得怎么样?”
“还在想。”
“不能再拖了!今天上午又宕机了十分钟!”
“知道了。”
第四天早上,陈默主动打给刘建国。
“我同意了。”他说,“两百万,长期顾问合同。”
电话那头,刘建国像是松了口气:“太好了!我马上让法务拟合同。”
“但我有个要求。”
“你说。”
“预付一百万。”陈默说,“今天到账。剩下的分期。”
刘建国沉默了。
“陈工,这不合规矩……”
“那就算了。”
“等等!”刘建国急了,“我申请一下。你等我电话。”
陈默放下手机,打开监控程序。系统负载曲线又出现一个陡峭的波峰,时间是凌晨三点——那个时候,应该没什么人用系统。
他调出那个时间段的日志。
自动化脚本在执行数据归档。这是正常的维护操作,但脚本写得有问题,锁定了大表,导致其他查询全部阻塞。
运维水平太差。
一个小时后,刘建国回电。
“批了。”他的声音有些沙哑,“一百万,今天下午到账。但法务要求你先签合同,款后付。”
“可以。”陈默说,“合同发我邮箱。”
“你现在能来公司吗?有些技术细节要对接。”
“下午吧。”
“好,下午见。”
中午,合同发来了。二十多页的PDF,陈默快速浏览了一遍。核心条款没什么问题,两百万分二十四期支付,他需要提供7×24小时技术支持。
但在违约责任那一条,字很小:如因顾问方故意或重大过失导致系统故障,顾问方需承担全部损失。
“全部损失”没定义上限。
而系统价值五亿三千万。
陈默笑了笑,签了电子签名,发回去。
下午两点,他到了公司。
前台没人,大堂空荡荡的。电梯还是那部,轿厢里的广告屏黑了,只剩一个红色的楼层数字在跳动。
三楼机房,刘建国和王总监都在。
还有法务部的一个女人,戴眼镜,很干练的样子。
“陈工,合同收到了吧?”女人递过来纸质版,“麻烦在这里签字。”
陈默接过笔,在最后一页签下名字。字迹很工整,和他的人一样,没什么特色。
“款呢?”他问。
“财务在走流程。”刘建国说,“最晚五点前到账。”
陈默点点头,在主控台前坐下。电脑开着,屏幕上是他上次留下的监控程序界面。
“现在有什么问题?”他问。
“还是老毛病。”王总监说,“时快时慢,不稳定。”
陈默调出性能数据。CPU使用率在40%到80%之间波动,内存使用率稳定在70%。看起来正常,但数据库的锁等待时间明显偏高。
“有慢查询。”他说,“得优化。”
“怎么优化?”
“给我一周时间,重写最耗资源的几个存储过程。”陈默新建了一个文档,“这期间系统可能会变慢,但不会崩。”
“一周……”刘建国皱眉,“能不能快点儿?下周有重要客户演示。”
“那就别催。”陈默开始写方案,“质量需要时间。”
刘建国和王总监对视一眼,没再说什么。
法务部的女人走了。机房又只剩下他们三个,还有嗡嗡作响的服务器。
陈默写了一会儿方案,忽然停下来。
“刘总。”
“嗯?”
“那二十万现金,您拿回去了吗?”陈默转过头,“我那天忘在墙角了。”
刘建国愣了一下,随即笑道:“早拿回来了。怎么,陈工后悔了?”
“不是。”陈默转回屏幕,“就是问问。”
他继续敲键盘,但速度慢了下来。
监控程序的警报又闪了。这次是磁盘空间不足——日志文件增长太快,已经占用了90%的空间。
“日志该清理了。”陈默说。
“小李!”刘建国喊了一声。
小李从隔壁的小办公室跑过来。
“把系统日志清理一下。”刘建国吩咐,“留最近三天的就行。”
“现在清理?”小李看了看陈默。
“现在。”
小李坐到另一台终端前,开始操作。命令执行,进度条开始移动。
陈默继续写他的优化方案。但眼角余光一直盯着监控屏幕。
磁盘使用率:91%、90%、89%……
突然,数字停住了。
然后开始反向跳动:90%、91%、92%……
“怎么回事?”小李慌了,“清理命令在执行,但空间没释放!”
陈默立刻调出进程列表。清理进程确实在运行,但另一个备份进程也在同时启动——那是日志备份作业,定时把日志压缩存档。
两个进程在争抢同一批文件。
锁住了。
“停掉备份!”陈默说。
小李手忙脚乱地操作,但已经晚了。数据库开始报错:无法写入日志。紧接着,所有写操作全部挂起。
只读查询还能用,但任何更新、插入、删除,全部卡死。
“完了……”王总监脸色发白。
刘建国冲过来,盯着屏幕:“陈工!快想办法!”
陈默敲了几个命令,试图杀死备份进程。但进程处于不可中断状态,杀不掉。
磁盘使用率:93%、94%……
“重启数据库。”他说。
“现在重启?”刘建国声音都变了,“业务怎么办?”