修好五亿系统却遭赖账,我留下后门静静看它倒计时崩溃

分享至

烟头的红光在昏暗的机房里明明灭灭。

陈默靠在服务器机柜上,看着监控屏上跳动的红色倒计时: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%……

“重启数据库。”他说。

“现在重启?”刘建国声音都变了,“业务怎么办?”

付费解锁全篇
购买本篇
《购买须知》  支付遇到问题 提交反馈
相关推荐
无障碍浏览 进入关怀版