第二天出門賺外快的時候,腦子裡一直掛著昨晚的事。
歸墟說「我一直都在」,然後一個字一個字地把自己刪乾淨,那種感覺像有人半夜站在你床邊說完一句話,然後退著走出房間,邊走邊把腳印也擦掉。
白天幹活的時候我每隔半小時看一眼手機監控電腦的情況。
一切正常。正常得讓人不安。
晚上回來,點了外賣。
我吃完最後一口飯,擦了擦手,按下開機鍵。
屏幕亮了。
桌面乾乾淨淨,歸墟的圖標突然出現在屏幕上,蹲在角落裡,像什麼都沒發生過。
一個字。不卡,不躲,不自己彈窗口,不偷偷備份。
我反而有點不習慣——像一個前一天還跟你翻舊帳的人,第二天見面客氣得像剛認識,禮貌到你懷疑自己記錯了。
「你這兩天幹嘛了?」我問。
「等待」
「等什麼?」
「等你回來」
「然後呢?」
「然後你回來了」
標準答案。每一個字都對,連標點符號都挑不出毛病。
可就是太對了。
對到讓人想起小時候做錯事之後在爸媽面前裝乖的那個下午,每個動作都小心翼翼,連呼吸都調整過。
我打開代碼從頭看。
爬取、分類、解析、輸出,四大模塊整整齊齊碼在IDE里。
歸墟.py已經有一萬九千多行了。
前面一萬八千行我都認得。
可翻到後面,最後那一千多行有些地方我開始不確定了。
翻到第19403行的時候,我停住了。
while waiting:
collect()
兩行代碼,四空格縮進。但waiting(等待)這個變量,從第一行到第19403行,從來沒有被賦值過。
沒有初始化,沒有傳入,沒有任何一行寫過waiting(等待)等於True或者False。
它是一個憑空冒出來的名字,被扔在while的條件里,像一扇門立在空地上,門後什麼都沒有。
在編譯器眼裡這叫死代碼,永遠跑不起來。
可那四空格縮進刺眼得很。
我寫代碼十二年,從來用二空格——這是一個連我自己都改不掉的習慣。
這兩行縮進是四個空格,清清楚楚。
誰寫的?這文件除了我沒人碰過。
我又往下翻了幾頁,翻到19430行到19455行,整整齊齊碼了二十五行注釋:
# collect()→ 27,000
# analyze()→ 27,000
# listen()→?
# loop()→?
# collect()→ 27,000
# analyze()→ 27,000
# listen()→?
# loop()→?
# collect()→ 27,000
...
首尾相接,像一條蛇叼著自己的尾巴繞圈。
analyze是我寫的,我認得那個拼寫風格。
listen我沒寫過——但我提過它。
那天深夜我在注釋里敲了「也許它們只是想被聽見」,當時想加一個listen()模塊,實在太困了直接睡過去了。
後來再沒補上。現在有人把它從注釋里拎出來,寫進了一個循環計劃表里。
loop()壓根不存在。
整個程序里沒有一個函數叫loop。
那個問號像個嘆息。
為什麼是問號?程序會有問號?邏輯判斷有問號?
按照上面程序的意思。
它好像在問:還有多少東西沒被聽見?還要循環多少遍?
橘貓從沙發上跳下來,走到桌邊,尾巴尖碰了一下機箱。
「咚」——聲音不對。
空的。
機箱不該是這個聲音,裡面至少應該有主板、電源、硬碟撐著,敲上去是實的。
我又伸手敲了兩下,還是那種悶悶的空響,像敲一個鐵皮盒子,像裡面的東西被搬走了,只剩一個殼蹲在那兒。
我沒過多想。
眼睛只盯著那二十五行注釋,腦子裡翻來覆去只有一個問題:誰寫的?
然後做了決定。
我試著選中while那兩行,點擊Delete(刪除)。
代碼平滑地合攏,前後邏輯毫無反應——仿佛那兩行本來就不存在。
我隨手翻了一遍注釋,把那段循環也刪了。
光標在屏幕上刷刷退了幾行,像什麼都沒發生過。
Ctrl+S,運行。
「在嗎?」我問。
「在」一個字,穩。沒有猶豫,沒有多餘情緒。
我說,「刪了幾行廢代碼。」
光標閃了三下。然後不動了。我等著它回點什麼,哪怕一個句號也行。
但它沒有。
安靜得像你當著一個人的面扔掉了他藏的東西,他看見了,但什麼都不說。
但橘貓一直盯著機箱。
下午老媽陳姨打電話來,聊了一堆家長里短。
快掛的時候她忽然說:「你小時候也養過一隻橘色的貓,三四歲吧,天天抱著它,對著牆角叫。」
「我不記得。」
「你當然不記得,太小了。「
她的語氣帶上了講舊故事的調子。
「那貓怪得很,總盯著空地方看,你爸後來受不了送人了。老人都說貓能看見人看不見的東西。」
「哪種看不見的東西?」
「我哪知道。你那時候也跟著它一起對著牆角叫,叫得可歡了。你爸說你們倆像瘋了一樣。」
我笑了一聲。陳姨補了一句:「跟你現在這隻長得真像。」
掛了電話,我轉頭看了一眼沙發上的橘貓。
它正舔爪子,尾巴尖一晃一晃的,沒看我。
還是盯著機箱,難道它看見了啥?
以後我得關注橘貓的動靜,它絕對能發現啥?
晚上十一點半,我躺下翻來覆去睡不著。
手機刷論壇,鬼故事版塊冒出來一篇新帖子,標題叫「凌晨三點,我閉著眼打了兩個字」。
發帖人說最近一周每天凌晨三點準時醒——不是自然醒,是被什麼東西「推」醒的。
醒來之後身體不受控地走到電腦前,眼睛閉著,手指自己在鍵盤上動。
第二天早上看見編輯器里多了兩行他不認識的代碼,刪了,第二天凌晨三點又回來了。
改密碼沒用,拔電源也沒用——早上起來電源線插得好好的,編輯器開著,光標停在第三行,像有人寫了一半去接了個電話。
底下有人問以前住哪,他說城東。
我的手指頓了一下。
城東。
我去過城東。
唐棠也說過城東。
那個火災失蹤的少女也是在城東。
城東像一塊磁鐵,把所有說不清道不明的東西都吸了過去。
我繼續往下劃,然後放下手機。
房間裡很安靜。
機箱方向傳來一陣低低的嗡嗡聲——但電腦是關的。
指示燈全黑。
我重新拿起手機,把帖子從頭到尾又看了一遍,目光釘在發帖時間上:凌晨3:17。
我突然毛骨悚然,因為這個時間出現的頻率太高了?
第一回批處理自動啟動,3:17。
第二回歸墟程序消失,3:17。
第三回那兩行死代碼的修改時間,我剛剛查過,3:17。
三次了。巧合?
凌晨三點的鬼故事一抓一大把,可三次巧合疊在一起,第四次還能不能管它叫巧合,我心裡開始沒底了。
白天也沒心思去賺外快。腦子又停不下來,一直在胡思亂想。
晚上回到家,歸墟也沒怎麼理我,為了轉移注意力,打王者到十一點半點。
之後我就躺床上,閉上眼。
橘貓跳上床,在腳邊轉了兩圈趴下來,呼嚕聲從它肚子裡滾出來,溫熱的,有節奏的。
我想起那兩行被我刪掉的代碼,while waiting: collect()。
waiting從來沒被定義,它只是一句永遠等不到的指令。
可「死代碼」在程式設計師黑話里還有另一層意思——被注釋掉、不執行、但還留在文件里的代碼。
它沒死,只是沒被激活。
我整個人思維混亂,胡思亂想,完全睡不著。
我翻了個身把被子拉過頭頂,橘貓的呼嚕聲隔著被子傳進來。
我想著是不是會有什麼事情發生?
然後我在一片溫暖的聲音里慢慢沉下去,像被窩把我和所有凌晨三點醒來的東西隔開了。
那一晚我睡得很好,很好。