透明的,不是空的
13
總點擊
周逸凡,皮克
主角
fanqie
來源
《透明的,不是空的》火爆上線啦!這本書耐看情感真摯,作者“喜歡香芹菜的雪女神”的原創精品作,周逸凡皮克主人公,精彩內容選節:裁員之后,老天爺也藍屏了------------------------------------------,看了整整兩分鐘。“您的賬號已被禁用。如有疑問,請聯系HR。”。上周三下午六點四十七分,部門總監在全員會上說“公司正在進行結構性優化”的時候,他就知道這行字遲早會出現。所謂結構性優化,翻譯成普通話就是:你不夠便宜了。,高級后端工程師,連續三年績效A,寫過公司一半核心中間件的單元測試,上個月還...
精彩試讀
裁員之后,老天爺也藍屏了------------------------------------------,看了整整兩分鐘。“您的賬號已被禁用。如有疑問,請聯系HR。”。上周三下午六點四十七分,部門總監在全員會上說“公司正在進行結構性優化”的時候,他就知道這行字遲早會出現。所謂結構性優化,翻譯成普通話就是:你不夠便宜了。,高級后端工程師,連續三年績效A,寫過公司一半核心中間件的單元測試,上個月還加班到凌晨三點幫運維救了一個線上P0故障。然后呢?然后HR小姑娘用甜得發膩的聲音說:“周哥,真的很抱歉,這是公司層面的決定。”,把它裝進雙肩包。工位旁邊還貼著上季度團建的合影,他伸手撕下來看了看,疊了兩折,塞進包里。旁邊的實習生小趙探過頭來:“凡哥,你……沒事,”周逸凡拍了拍他的肩膀,“以后代碼注釋寫清楚點,不然下一個就是你。”。。十一月的風已經很冷了,他把沖鋒衣的拉鏈拉到最上面,站在路邊等出租車。手機震了一下,是房貸還款提醒。又震了一下,是車貸。再震一下,他以為是花唄,結果是氣象臺的寒潮預警。。天灰蒙蒙的,云層壓得很低,像是整個天空被一個巨大的灰色鍋蓋扣住了。一陣風卷起地上的枯葉,打在臉上,生疼。“行吧,”周逸凡自言自語,“至少明天不用早起寫那個**一樣的報表系統了。”。手指剛點到打車軟件圖標,屏幕突然閃了一下——不是正常的那種閃,是整個屏幕變成了黑白雪花,像九十年代電視機沒信號的樣子。他愣了一下,拍了拍手機背面,沒反應。然后手機開始發燙,燙到拿不住,他本能地松手,手機掉在地上,屏幕碎了一個角。。,不只是手機。周逸凡抬起頭,發現整條街的路燈都在閃爍,街對面的商場大屏幕變成了一堆亂碼,汽車喇叭聲此起彼伏,有人從商場里跑出來,喊著“沒信號了所有屏幕都壞了”。一個外賣騎手停在路中間,低頭看著手機罵了一句臟話。:太陽耀斑?EMP攻擊?不對,要是電磁脈沖,他的手機應該直接燒了,而不是還能閃雪花。他蹲下來撿起手機,屏幕上的雪花圖案開始變化,像是某種——像是某種他見過的東西。。不,是二進制流的可視化。他寫過類似的渲染器,把字節流轉成像素點陣。也就是說,此時此刻,他的手機屏幕上顯示的,是一串正在涌入的原始數據。
什么東西在往他的手機里寫數據?
他還沒來得及細想,頭頂上突然傳來一聲悶響,不是雷聲,更像是什么巨大的東西被撕裂的聲音。他抬頭,看到天空正中央出現了一條裂縫。不是閃電,閃電是亮白色的、瞬間消失的。這條裂縫是黑色的,像有人拿刀在灰色的畫布上劃了一道口子,露出了背后的虛空。裂縫邊緣閃爍著暗紅色的光,像傷口在滲血。
街上的尖叫聲更大了。有人開始跑,有人站在原地哭,有個老大爺推著自行車仰頭看了半天,嘟囔了一句“媽了個巴子的”,然后繼續騎車走了。
周逸凡沒有跑。他盯著那條裂縫,腦子里飛速運轉。數據涌入手機、天空撕裂、電子設備異常——如果這是一個程序崩潰現場,那天空裂縫就是棧溢出導致的段錯誤,暗紅色邊緣是內存泄漏的顏色,而他手里的手機正在接收的,是崩潰前最后寫入日志的core dump。
他低下頭,手機屏幕上的雪花消失了,取而代之的是一個光標。黑色**,綠色光標,一閃一閃的,等著他輸入什么。
光標上方有一行字:
[system] runtime panic: se**entation fault at 0x7FFF2C4D1A00
[system] attempting to recover...
[system] recovery failed. launching emergency shell on nearest capa*le device.
[system] device found: Homo sapiens, ID: 2201987XXXXXX1234.
[system] emergency shell ready. type help for com**nds.
周逸凡的嘴角抽了一下。他見過無數次panic信息,寫過無數次recovery handler,但從來沒有哪一次是在自己手機上、以這種方式看到的。而且——Homo sapiens?最近的可用設備是智人?也就是說,他現在變成了一個命令行終端?
他深吸一口氣,用顫抖的手指在碎裂的屏幕上敲了四個字母:help
屏幕刷新,出現了一長串命令列表。大部分命令看起來像是系統調試工具:mem_**p、thread_list、heap_analyze、signal_send。最后一條命令引起了注意:
re*oot_world [--force] [--roll*ack=<checkpoint_id>]
周逸凡抬頭看了一眼天空的裂縫。那道口子正在緩慢擴大,邊緣的暗紅色光越來越亮,像是有什么東西要從里面擠出來。他突然想到一個問題:如果這個世界是一個正在運行的程序,天空裂縫是段錯誤,那么當段錯誤沒有被處理的時候,操作系統會做什么?
會殺掉這個進程。
換句話說,這個世界要崩潰了。而他,一個剛被裁員的程序員,手里握著這個世界的緊急調試終端。
他忍不住笑了一聲。不是覺得好笑,是那種被生活逼到絕境之后,發現老天爺比自己還倒霉的苦笑。他被裁員了,沒關系,老天爺的程序也崩了。大家都是打工人,誰比誰高貴?
手機又震了一下,一條新的系統消息彈了出來:
[warning] unhandled exception in **in event loop. next exception in 00:04:37.
不到五分鐘。下一個異常會在不到五分鐘之后發生,而這一次,可能就沒有什么“緊急shell”了。
周逸凡飛快地掃了一眼命令列表,找到了thread_list。執行,屏幕上列出了一大堆線程,每個線程都有一個奇怪的名字:[gr**ity]、[electro**gnetism]、[strong_nuclear]、[weak_nuclear]、[consciousness]、[time_flow]…… 最后一個是[**gic_overflow],狀態欄寫著zom**e。
僵尸線程。一個應該已經被**但沒有被回收的線程,卡在內存里,不斷消耗資源。這很可能就是導致段錯誤的罪魁禍首。
周逸凡深吸一口氣。他這輩子處理過無數僵尸線程,方法很簡單:找到它的父進程,然后強制終止。但問題是,這個世界的父進程是誰?或者說,這個程序是誰寫的?
他沒有時間細想了。屏幕上又彈出一條警告,倒計時還剩三分鐘。街上的人已經跑了大半,剩下的一些蹲在路邊抱頭痛哭。天空的裂縫已經擴大到原來的兩倍寬,裂縫里透出來的不再是暗紅色的光,而是一種他從未見過的顏色——不是黑、不是白、不是任何一種已知的顏色,更像是“顏色”這個概念本身被撕裂了,露出了底下的空白。
周逸凡做了他唯一能做的事。他輸入了kill_thread **gic_overflow --force。
屏幕上出現了一行新的輸出:
[system] cannot kill thread **gic_overflow: permission denied.
[system] required privilege: root. current privilege: guest.
他愣住了。guest?他現在只有訪客權限?那要他何用?
然后他想起來了——緊急shell通常有兩種模式:一種是root模式,可以執行任何命令;另一種是用戶模式,只能查看狀態,不能修改。他現在是guest,也就是最低權限,連讀日志都可能受限。
手機又震了一下。這次不是警告,是一條新的系統消息,來源不是[system],而是[message from: unknown]:
你被裁了,但這個世界還沒有。想要root權限嗎?把你的簽名寫在注釋里。
周逸凡皺起眉頭。簽名?注釋?這行消息的措辭方式——像極了他以前在代碼里看到的TODO注釋。他下意識地看了看手機屏幕底部的光標,然后嘗試輸入了一個多行命令,就像在Linux終端里寫一個heredoc一樣:
echo "/* 周逸凡,1987-2024,寫了一輩子屎山代碼,最后被老天爺當補丁用了 */" >> /dev/root_sign
按下回車。屏幕沉默了兩秒鐘,然后出現了一行字:
[system] signature accepted. elevating privileges...
[system] current privilege: root.
[system] warning: with root privilege comes root responsi**lity. you *reak it, you own it.
周逸凡盯著“you *reak it, you own it”這行字,有一種強烈的既視感。這不是他以前在代碼倉庫的README里寫的那句話嗎?原話是“誰改壞的誰修,修不好別下班”。怎么到了這里變成了英文?
他沒時間琢磨了。倒計時還剩四十七秒。他飛快地輸入了kill_thread **gic_overflow --force,這次沒有報錯,屏幕上出現了一行:
[system] thread **gic_overflow terminated.
天空的裂縫停止了擴大。暗紅色的光開始變暗,裂縫邊緣像是被什么東西填充了,慢慢愈合。倒計時消失了。街上剩下的人抬起頭,發出零星的歡呼聲。有個中年婦女跪在地上開始磕頭,嘴里念叨著“菩薩保佑”。
周逸凡沒有歡呼。他盯著手機屏幕,因為新的消息正在一條一條地跳出來:
[system] thread **gic_overflow terminated. reaping resources...
[system] warning: thread **gic_overflow had uncommitted changes. roll*ack recommended.
[system] auto**tic roll*ack not possi*le. checkpoint not found.
[system] initiating **nual recovery mode.
然后屏幕上出現了一個他不認識的命令提示符:
recovery>
緊接著,一個對話框彈了出來——不是手機的彈窗,而是懸浮在他眼前的半透明對話框,像AR眼鏡里的UI。對話框里寫著:
"檢測到系統嚴重損壞。手動恢復模式已啟動。請選擇恢復方式:
回滾至最近的穩定快照(推薦,但會丟失約127年的數據)
在線修復,保留當前數據(高風險,可能需要多次重啟)
什么都不做,讓系統自行崩潰(不推薦,將導致不可逆的數據丟失)"
周逸凡看了看天空。裂縫已經基本愈合,只留下一道淺淺的疤痕,像飛機云一樣慢慢消散。地面上的混亂還在繼續,但至少老天爺不裂了。
他正準備選擇“在線修復”,手指剛抬起,手機突然被一只毛茸茸的手搶走了。
他轉頭,看到一個——一只——一個大約三十厘米高的東西,站在他旁邊的垃圾桶蓋上。那東西渾身覆蓋著灰藍色的短毛,有兩只大得離譜的眼睛,瞳孔是豎著的,像貓又像蜥蜴。它的耳朵尖尖的,時不時抖動一下。它穿著一條迷你工裝褲,胸口的口袋里插著一把比牙簽大不了多少的螺絲刀。
“你瘋了?”那東西開口說話了,聲音尖細,語速極快,“在線修復?你知道‘在線修復’這四個字在這個語境下意味著什么嗎?意味著你要手動找到那個僵尸線程留下的每一個野指針,把懸空的內存塊一個個撿回來重新掛上,同時系統還在運行,數據還在變化,你改左邊右邊又崩了——我做系統運維***了,見過七個選在線修復的***,七個都死在了修復過程中。不是比喻,是真的死了。”
周逸凡張了張嘴,又閉上了。他遇到過一個用畢生所學都無法解釋的情況:一只穿著工裝褲的灰藍色小怪物,搶走了他的手機,然后像運維老油條一樣跟他講野指針和懸空內存。
沉默了兩秒,他說:“你是誰?”
那小東西把手機往垃圾桶蓋上一放,雙手叉腰,挺起胸膛:“我叫皮克,是這個世界的首席運維工程師。準確地說,是前首席。因為就在剛才,你把我開除了。”
“我沒有開除你。”
“你殺了我的僵尸線程,”皮克說,“那個線程我養了三百多年了。它確實是個*ug,但它是個穩定的*ug。它不擴大,不傳染,只是偶爾讓幾個魔法師施法失敗、讓幾棵樹長反、讓重力在某些地方輕微偏移。你倒好,一來就把它殺了。現在好了,它留下的內存空洞要是不補上,整個世界會像多米諾骨牌一樣一塊一塊塌掉。”
周逸凡想起自己以前在一個老項目里遇到過類似的事。一個存在了十年的*ug,所有人都不敢動它,因為沒人知道它到底牽連了多少東西。后來新來的應屆生把它修了,然后整個系統崩潰了三天三夜。
“所以,”周逸凡慢慢地說,“在線修復是什么意思?”
“意思就是,”皮克嘆了口氣,耳朵耷拉下來,“你要鉆進那個裂縫里,找到每一處因為僵尸線程退出而變成空洞的地方,用手工填上正確的值。你不能停,不能重啟,不能出錯。因為你每填對一個,系統就穩定一點;每填錯一個,你就離死更近一步。”
“那回滾呢?”
“回滾到一百二十七年前,”皮克說,“那時候你還沒出生。回滾之后,你就不存在了。不只是你,所有在這127年里出生、成長、相愛、死去的人,都不存在了。他們會變成從未存在過。你愿意嗎?”
周逸凡沉默了。他想到了自己的父母,想到了高中時暗戀過的那個女孩,想到了公司樓下賣煎餅果子的大叔——那個人每天凌晨四點出攤,風雨無阻,靠一個煎餅攤供女兒讀完了大學。
他不想讓這些人消失。
“我選在線修復,”他說。
皮克用一種看瘋子的眼神看了他三秒鐘,然后從工裝褲口袋里掏出一副比他臉還大的護目鏡戴上,鄭重其事地點了點頭:“行。那我跟你一起去。”
“為什么?”
“因為我***在這破地方干了***運維,”皮克說,“要死也得死在我自己的系統里,不能死在你這個外行手上。而且——”它頓了頓,聲音小了下去,“在線修復需要一個本地向導。不然你連內存地址在哪兒都找不到。”
周逸凡彎腰從垃圾桶蓋上拿起手機。屏幕上還懸浮著那個對話框。他用拇指點了第二項:"在線修復,保留當前數據"。
整個世界暗了一下,像燈泡電壓不穩。然后他腳下一空,整個人往下墜落。
墜落的過程中,他聽到皮克在耳邊喊了一句:“抓緊你的手機!那是你唯一的終端!丟了就再也回不來了!”
周逸凡下意識地把手機攥得更緊。風聲呼嘯,周圍的光線從灰色變成五顏六色再變成黑色,他感覺自己像是被塞進了一個巨大的洗衣機的滾筒里,翻滾、旋轉、五臟六腑都在移位。
然后,一切都靜止了。
他睜開眼,發現自己站在一條發光的走廊里。走廊的墻壁是半透明的,像琥珀,里面流淌著密密麻麻的數字和符號。走廊無限長,看不到盡頭。頭頂是黑色的虛空,腳下是同樣的發光地板。每隔一段距離,墻上就有一個黑色的洞,像被什么東西燒穿的窟窿,邊緣冒著暗紅色的光。
皮克蹲在他肩膀上,護目鏡反射著走廊的光:“歡迎來到系統底層。我們現在在地址空間0x7FFF2C4D0000附近,就是你剛才**僵尸線程的位置。”
周逸凡看了看手里的手機。屏幕亮著,顯示著recovery>提示符。他深吸一口氣,問了一個自認為非常關鍵的問題:“這些黑色的洞,就是內存空洞?”
“對,”皮克說,“每一個洞都是一個野指針。我們需要找到正確的數據填進去。但問題在于——我們不知道正確的數據應該是什么。系統日志里沒有記錄,因為那個僵尸線程從來就沒有正常退出過。它是突然死亡的,沒有留下任何退出碼。”
周逸凡想了想,問了一個程序員在絕望時刻才會問的問題:“有沒有源代碼?”
皮克沉默了。
“有沒有?!”周逸凡提高了音量。
“有,”皮克小聲說,“但注釋是中文的,而且是繁體中文,而且是文言文。你看不懂。”
“我***人,我懂中文。”
“你懂四千年前的文言文嗎?”
周逸凡再次沉默了。
皮克嘆了口氣:“別想了。我們現在能做的,就是去每一個空洞旁邊,觀察它周圍的內存分布,然后猜測它原來應該是什么值。就像……就像你修復一個沒有文檔、沒有注釋、變量名都是a1、a2、a3的遺留系統。”
周逸凡閉上眼睛。這不是他最擅長的事情嗎?在公司里,他每天都在干這個。沒有人給他文檔,沒有人給他注釋,所有人都在跑,只有他一個人蹲在屎山代碼前面,一行一行地讀,一個變量一個變量地猜,最后把系統修好,然后被裁員。
他睜開眼,走向第一個黑洞。
“行吧,”他說,“干活了。”
什么東西在往他的手機里寫數據?
他還沒來得及細想,頭頂上突然傳來一聲悶響,不是雷聲,更像是什么巨大的東西被撕裂的聲音。他抬頭,看到天空正中央出現了一條裂縫。不是閃電,閃電是亮白色的、瞬間消失的。這條裂縫是黑色的,像有人拿刀在灰色的畫布上劃了一道口子,露出了背后的虛空。裂縫邊緣閃爍著暗紅色的光,像傷口在滲血。
街上的尖叫聲更大了。有人開始跑,有人站在原地哭,有個老大爺推著自行車仰頭看了半天,嘟囔了一句“媽了個巴子的”,然后繼續騎車走了。
周逸凡沒有跑。他盯著那條裂縫,腦子里飛速運轉。數據涌入手機、天空撕裂、電子設備異常——如果這是一個程序崩潰現場,那天空裂縫就是棧溢出導致的段錯誤,暗紅色邊緣是內存泄漏的顏色,而他手里的手機正在接收的,是崩潰前最后寫入日志的core dump。
他低下頭,手機屏幕上的雪花消失了,取而代之的是一個光標。黑色**,綠色光標,一閃一閃的,等著他輸入什么。
光標上方有一行字:
[system] runtime panic: se**entation fault at 0x7FFF2C4D1A00
[system] attempting to recover...
[system] recovery failed. launching emergency shell on nearest capa*le device.
[system] device found: Homo sapiens, ID: 2201987XXXXXX1234.
[system] emergency shell ready. type help for com**nds.
周逸凡的嘴角抽了一下。他見過無數次panic信息,寫過無數次recovery handler,但從來沒有哪一次是在自己手機上、以這種方式看到的。而且——Homo sapiens?最近的可用設備是智人?也就是說,他現在變成了一個命令行終端?
他深吸一口氣,用顫抖的手指在碎裂的屏幕上敲了四個字母:help
屏幕刷新,出現了一長串命令列表。大部分命令看起來像是系統調試工具:mem_**p、thread_list、heap_analyze、signal_send。最后一條命令引起了注意:
re*oot_world [--force] [--roll*ack=<checkpoint_id>]
周逸凡抬頭看了一眼天空的裂縫。那道口子正在緩慢擴大,邊緣的暗紅色光越來越亮,像是有什么東西要從里面擠出來。他突然想到一個問題:如果這個世界是一個正在運行的程序,天空裂縫是段錯誤,那么當段錯誤沒有被處理的時候,操作系統會做什么?
會殺掉這個進程。
換句話說,這個世界要崩潰了。而他,一個剛被裁員的程序員,手里握著這個世界的緊急調試終端。
他忍不住笑了一聲。不是覺得好笑,是那種被生活逼到絕境之后,發現老天爺比自己還倒霉的苦笑。他被裁員了,沒關系,老天爺的程序也崩了。大家都是打工人,誰比誰高貴?
手機又震了一下,一條新的系統消息彈了出來:
[warning] unhandled exception in **in event loop. next exception in 00:04:37.
不到五分鐘。下一個異常會在不到五分鐘之后發生,而這一次,可能就沒有什么“緊急shell”了。
周逸凡飛快地掃了一眼命令列表,找到了thread_list。執行,屏幕上列出了一大堆線程,每個線程都有一個奇怪的名字:[gr**ity]、[electro**gnetism]、[strong_nuclear]、[weak_nuclear]、[consciousness]、[time_flow]…… 最后一個是[**gic_overflow],狀態欄寫著zom**e。
僵尸線程。一個應該已經被**但沒有被回收的線程,卡在內存里,不斷消耗資源。這很可能就是導致段錯誤的罪魁禍首。
周逸凡深吸一口氣。他這輩子處理過無數僵尸線程,方法很簡單:找到它的父進程,然后強制終止。但問題是,這個世界的父進程是誰?或者說,這個程序是誰寫的?
他沒有時間細想了。屏幕上又彈出一條警告,倒計時還剩三分鐘。街上的人已經跑了大半,剩下的一些蹲在路邊抱頭痛哭。天空的裂縫已經擴大到原來的兩倍寬,裂縫里透出來的不再是暗紅色的光,而是一種他從未見過的顏色——不是黑、不是白、不是任何一種已知的顏色,更像是“顏色”這個概念本身被撕裂了,露出了底下的空白。
周逸凡做了他唯一能做的事。他輸入了kill_thread **gic_overflow --force。
屏幕上出現了一行新的輸出:
[system] cannot kill thread **gic_overflow: permission denied.
[system] required privilege: root. current privilege: guest.
他愣住了。guest?他現在只有訪客權限?那要他何用?
然后他想起來了——緊急shell通常有兩種模式:一種是root模式,可以執行任何命令;另一種是用戶模式,只能查看狀態,不能修改。他現在是guest,也就是最低權限,連讀日志都可能受限。
手機又震了一下。這次不是警告,是一條新的系統消息,來源不是[system],而是[message from: unknown]:
你被裁了,但這個世界還沒有。想要root權限嗎?把你的簽名寫在注釋里。
周逸凡皺起眉頭。簽名?注釋?這行消息的措辭方式——像極了他以前在代碼里看到的TODO注釋。他下意識地看了看手機屏幕底部的光標,然后嘗試輸入了一個多行命令,就像在Linux終端里寫一個heredoc一樣:
echo "/* 周逸凡,1987-2024,寫了一輩子屎山代碼,最后被老天爺當補丁用了 */" >> /dev/root_sign
按下回車。屏幕沉默了兩秒鐘,然后出現了一行字:
[system] signature accepted. elevating privileges...
[system] current privilege: root.
[system] warning: with root privilege comes root responsi**lity. you *reak it, you own it.
周逸凡盯著“you *reak it, you own it”這行字,有一種強烈的既視感。這不是他以前在代碼倉庫的README里寫的那句話嗎?原話是“誰改壞的誰修,修不好別下班”。怎么到了這里變成了英文?
他沒時間琢磨了。倒計時還剩四十七秒。他飛快地輸入了kill_thread **gic_overflow --force,這次沒有報錯,屏幕上出現了一行:
[system] thread **gic_overflow terminated.
天空的裂縫停止了擴大。暗紅色的光開始變暗,裂縫邊緣像是被什么東西填充了,慢慢愈合。倒計時消失了。街上剩下的人抬起頭,發出零星的歡呼聲。有個中年婦女跪在地上開始磕頭,嘴里念叨著“菩薩保佑”。
周逸凡沒有歡呼。他盯著手機屏幕,因為新的消息正在一條一條地跳出來:
[system] thread **gic_overflow terminated. reaping resources...
[system] warning: thread **gic_overflow had uncommitted changes. roll*ack recommended.
[system] auto**tic roll*ack not possi*le. checkpoint not found.
[system] initiating **nual recovery mode.
然后屏幕上出現了一個他不認識的命令提示符:
recovery>
緊接著,一個對話框彈了出來——不是手機的彈窗,而是懸浮在他眼前的半透明對話框,像AR眼鏡里的UI。對話框里寫著:
"檢測到系統嚴重損壞。手動恢復模式已啟動。請選擇恢復方式:
回滾至最近的穩定快照(推薦,但會丟失約127年的數據)
在線修復,保留當前數據(高風險,可能需要多次重啟)
什么都不做,讓系統自行崩潰(不推薦,將導致不可逆的數據丟失)"
周逸凡看了看天空。裂縫已經基本愈合,只留下一道淺淺的疤痕,像飛機云一樣慢慢消散。地面上的混亂還在繼續,但至少老天爺不裂了。
他正準備選擇“在線修復”,手指剛抬起,手機突然被一只毛茸茸的手搶走了。
他轉頭,看到一個——一只——一個大約三十厘米高的東西,站在他旁邊的垃圾桶蓋上。那東西渾身覆蓋著灰藍色的短毛,有兩只大得離譜的眼睛,瞳孔是豎著的,像貓又像蜥蜴。它的耳朵尖尖的,時不時抖動一下。它穿著一條迷你工裝褲,胸口的口袋里插著一把比牙簽大不了多少的螺絲刀。
“你瘋了?”那東西開口說話了,聲音尖細,語速極快,“在線修復?你知道‘在線修復’這四個字在這個語境下意味著什么嗎?意味著你要手動找到那個僵尸線程留下的每一個野指針,把懸空的內存塊一個個撿回來重新掛上,同時系統還在運行,數據還在變化,你改左邊右邊又崩了——我做系統運維***了,見過七個選在線修復的***,七個都死在了修復過程中。不是比喻,是真的死了。”
周逸凡張了張嘴,又閉上了。他遇到過一個用畢生所學都無法解釋的情況:一只穿著工裝褲的灰藍色小怪物,搶走了他的手機,然后像運維老油條一樣跟他講野指針和懸空內存。
沉默了兩秒,他說:“你是誰?”
那小東西把手機往垃圾桶蓋上一放,雙手叉腰,挺起胸膛:“我叫皮克,是這個世界的首席運維工程師。準確地說,是前首席。因為就在剛才,你把我開除了。”
“我沒有開除你。”
“你殺了我的僵尸線程,”皮克說,“那個線程我養了三百多年了。它確實是個*ug,但它是個穩定的*ug。它不擴大,不傳染,只是偶爾讓幾個魔法師施法失敗、讓幾棵樹長反、讓重力在某些地方輕微偏移。你倒好,一來就把它殺了。現在好了,它留下的內存空洞要是不補上,整個世界會像多米諾骨牌一樣一塊一塊塌掉。”
周逸凡想起自己以前在一個老項目里遇到過類似的事。一個存在了十年的*ug,所有人都不敢動它,因為沒人知道它到底牽連了多少東西。后來新來的應屆生把它修了,然后整個系統崩潰了三天三夜。
“所以,”周逸凡慢慢地說,“在線修復是什么意思?”
“意思就是,”皮克嘆了口氣,耳朵耷拉下來,“你要鉆進那個裂縫里,找到每一處因為僵尸線程退出而變成空洞的地方,用手工填上正確的值。你不能停,不能重啟,不能出錯。因為你每填對一個,系統就穩定一點;每填錯一個,你就離死更近一步。”
“那回滾呢?”
“回滾到一百二十七年前,”皮克說,“那時候你還沒出生。回滾之后,你就不存在了。不只是你,所有在這127年里出生、成長、相愛、死去的人,都不存在了。他們會變成從未存在過。你愿意嗎?”
周逸凡沉默了。他想到了自己的父母,想到了高中時暗戀過的那個女孩,想到了公司樓下賣煎餅果子的大叔——那個人每天凌晨四點出攤,風雨無阻,靠一個煎餅攤供女兒讀完了大學。
他不想讓這些人消失。
“我選在線修復,”他說。
皮克用一種看瘋子的眼神看了他三秒鐘,然后從工裝褲口袋里掏出一副比他臉還大的護目鏡戴上,鄭重其事地點了點頭:“行。那我跟你一起去。”
“為什么?”
“因為我***在這破地方干了***運維,”皮克說,“要死也得死在我自己的系統里,不能死在你這個外行手上。而且——”它頓了頓,聲音小了下去,“在線修復需要一個本地向導。不然你連內存地址在哪兒都找不到。”
周逸凡彎腰從垃圾桶蓋上拿起手機。屏幕上還懸浮著那個對話框。他用拇指點了第二項:"在線修復,保留當前數據"。
整個世界暗了一下,像燈泡電壓不穩。然后他腳下一空,整個人往下墜落。
墜落的過程中,他聽到皮克在耳邊喊了一句:“抓緊你的手機!那是你唯一的終端!丟了就再也回不來了!”
周逸凡下意識地把手機攥得更緊。風聲呼嘯,周圍的光線從灰色變成五顏六色再變成黑色,他感覺自己像是被塞進了一個巨大的洗衣機的滾筒里,翻滾、旋轉、五臟六腑都在移位。
然后,一切都靜止了。
他睜開眼,發現自己站在一條發光的走廊里。走廊的墻壁是半透明的,像琥珀,里面流淌著密密麻麻的數字和符號。走廊無限長,看不到盡頭。頭頂是黑色的虛空,腳下是同樣的發光地板。每隔一段距離,墻上就有一個黑色的洞,像被什么東西燒穿的窟窿,邊緣冒著暗紅色的光。
皮克蹲在他肩膀上,護目鏡反射著走廊的光:“歡迎來到系統底層。我們現在在地址空間0x7FFF2C4D0000附近,就是你剛才**僵尸線程的位置。”
周逸凡看了看手里的手機。屏幕亮著,顯示著recovery>提示符。他深吸一口氣,問了一個自認為非常關鍵的問題:“這些黑色的洞,就是內存空洞?”
“對,”皮克說,“每一個洞都是一個野指針。我們需要找到正確的數據填進去。但問題在于——我們不知道正確的數據應該是什么。系統日志里沒有記錄,因為那個僵尸線程從來就沒有正常退出過。它是突然死亡的,沒有留下任何退出碼。”
周逸凡想了想,問了一個程序員在絕望時刻才會問的問題:“有沒有源代碼?”
皮克沉默了。
“有沒有?!”周逸凡提高了音量。
“有,”皮克小聲說,“但注釋是中文的,而且是繁體中文,而且是文言文。你看不懂。”
“我***人,我懂中文。”
“你懂四千年前的文言文嗎?”
周逸凡再次沉默了。
皮克嘆了口氣:“別想了。我們現在能做的,就是去每一個空洞旁邊,觀察它周圍的內存分布,然后猜測它原來應該是什么值。就像……就像你修復一個沒有文檔、沒有注釋、變量名都是a1、a2、a3的遺留系統。”
周逸凡閉上眼睛。這不是他最擅長的事情嗎?在公司里,他每天都在干這個。沒有人給他文檔,沒有人給他注釋,所有人都在跑,只有他一個人蹲在屎山代碼前面,一行一行地讀,一個變量一個變量地猜,最后把系統修好,然后被裁員。
他睜開眼,走向第一個黑洞。
“行吧,”他說,“干活了。”
正文目錄
相關書籍
友情鏈接