煙頭的紅光在昏暗的機房里明明滅滅。
陳默靠在服務器機柜上,看著監控屏上跳動的紅色倒計時: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%……
“重啟數據庫。”他說。
“現在重啟?”劉建國聲音都變了,“業務怎么辦?”