第 1 章 — 第一章:末班車之後的0號月台
內湖科技園區晚間九點四十七分,雨剛停,路面上還積著一層薄薄的油光,倒映出整排辦公大樓冷白色的燈管。
林煜辰抱著一個紙箱站在沛特科技的玻璃門外,紙箱裡裝著他的馬克杯、用了三年的機械式鍵盤、一本寫滿註解的《JavaScript權威指南》,還有公司發的資遣通知書。那張紙被折成四分之一,塞在鍵盤底下,卻還是露出一角,上頭印著人事章。
「煜辰,不是我要針對你,」一個小時前,主管李協理拍著他的肩膀,笑得像是真的很惋惜,「公司這季要轉型,後端人力過剩。你來三年,表現大家都看在眼裡,只是剛好你的職位被優化掉了。共體時艱,懂嗎?資遣費會照勞基法給,你年輕,出去很快就找到更好的。」
林煜辰記得自己當時點了頭,沒有吵,也沒有問為什麼同期進來、程式碼寫得比他還亂的學弟留下來了。他只是把識別證拔下來,放在桌上,輕輕推回去。李協理愣了一下,隨即就把識別證掃進抽屜,好像那是一個已經處理完的檔案。
二十八歲,前後端工程師,月薪五萬二,在台北租一間雅房,扣掉勞健保跟房租,每個月能存一萬出頭。這個數字在台北不算窮,也不算活得好,只是剛好能讓人覺得自己還算正常。直到今天晚上,他才發現正常是一種需要每天打卡才能維持的狀態,一旦刷不出來,就立刻被系統踢出。
他把紙箱抱得更緊,紙箱的底部因為雨氣有點軟。園區的下班人潮已經散得差不多,只剩下幾輛外送機車呼嘯而過。他沿著瑞光路往捷運站走,內湖的風帶著潮濕的鐵鏽味,路過便利商店時,店員正在把過期的御飯糰往報廢籃裡丟。
他本來想直接回家,想了想又轉進巷口的便利商店,買了一罐金牌啤酒。店員沒有多問,刷完條碼找零,連發票都沒有主動印。林煜辰拉開拉環,啤酒的泡沫溢出來,沾在手指上冰涼黏膩。他一口氣喝掉半罐,苦味卡在喉嚨裡,反而讓胸口那股悶住的東西稍微鬆開。
「幹。」他低聲罵了一句,不知道在罵誰。
港墘站的捷運入口在夜色裡亮著藍白色的燈,電扶梯緩緩往下,空蕩蕩的。時間是二十三點三十一分,末班車的提示音在空曠的穿堂迴盪。林煜辰把空罐捏扁,丟進回收桶,抱著紙箱刷卡進站。閘門發出嗶的一聲,螢幕顯示余额還有兩百一十八元。
月台上人很少,零星幾個加班到這個時間的工程師、低頭滑手機的大學生,還有一個穿著雨衣的外送員靠在柱子上打瞌睡。所有人都很安靜,只有軌道深處傳來低沉的震動。林煜辰把紙箱放在腳邊,靠著柱子,無意識地滑開手機。人力銀行的通知跳出來,顯示他今天投了十七封履歷,已讀回覆是零。他把手機關掉,塞回口袋。
列車進站的風先到,帶著一股地下道特有的霉味。車門打開,車廂裡的燈光偏黃,人更少。林煜辰抱起紙箱走進去,選了一個靠門的位子坐下,把紙箱放在膝蓋上。車門關上,列車啟動,窗外的廣告燈箱飛快地往後退,映在玻璃上的是一張疲憊的臉,眼下有淡淡的黑眼圈,黑色連帽外套的帽緣被雨沾濕,貼在額頭上。
他看著玻璃裡的自己,忽然覺得有點陌生。這個人三年前剛進沛特的時候,還會因為解決一個非同步請求的競態問題而興奮到半夜睡不著,會在程式碼的註解裡寫下「此處有雷,別動」。現在他的註解只剩下「依需求修改」和「暫時解法,上線後再優化」。上线後再也没有优化過。
車廂廣播響起,女聲平穩地報站名:「下一站,南港軟體園區。」林煜辰沒有抬頭,他住在南港展覽館附近,本來就該坐到終點再轉一次公車。車廂微微晃動,燈光閃了一下。
第二次閃爍的時候,他感覺到不對勁。
車廂內的燈光不是單純的電壓不穩,那種閃爍帶著一種延遲,像是影格丟失。眼前的扶手、座椅、甚至對面乘客的臉,都出現了極細微的殘影,殘影的邊緣有著類似亂碼的細小黑點,像是螢幕上的壞點。林煜辰皺起眉,以為自己喝了酒眼花,揉了揉眼睛。
再睜開眼時,壞點變多了。
它們不再只是點,而是像瀑布一樣,從車廂的天花板往下流動,一行一行半透明的代碼,速度快到看不清內容,只能隱約辨認出其中夾雜著「ERROR」、「NULL」、「REPEAT」之類的字樣。代碼流過的地方,現實的材質變得稀薄,像是貼圖沒有載入完成。
他猛地站起來,紙箱差點掉在地上。對面原本低頭滑手機的女生抬起頭,看了他一眼,又低下頭,完全沒有看見那些代碼。車廂裡的其他人也一樣,沒有任何反應。
「下一站,0號月台。」廣播的女聲忽然變了。
聲音還是那個女聲,卻像是被拉長、被降調,字與字之間夾雜著電流的雜訊。0號月台?板南線沒有0號月台。林煜辰的背脊竄起一股涼意,他衝到車門邊,想去按緊急通話鈕,手指卻在半空中停住。車窗外的黑暗裡,軌道不再是往南港展覽館的方向,而是一條筆直向下、看不見盡頭的隧道,隧道的牆壁上爬滿了跟車廂裡一樣的黑色代碼,像是血管。
列車沒有減速,直接駛入黑暗。
強烈的失重感襲來,耳朵嗡嗡作響,膝蓋上的紙箱變得異常沉重。林煜辰扶住扶手,指節發白。車廂內的燈光徹底轉為詭異的慘白色,所有人的動作在這一瞬間同步停頓,像是影片被按下了暫停。接著,暫停結束,車門無聲地滑開。
門外不是南港展覽館。
那是一個他從未見過的月台。
月台的磁磚是舊式的白色小方磚,許多已經龜裂,天花板的日光燈有一半不亮,剩下的一半發出嗡嗡的低鳴,不斷閃爍。月台的指示牌上用泛黃的燈箱寫著「0號月台」,字體是早年的手寫楷書,邊緣還在滲水。空氣中充滿一股消毒水混雜著霉味的氣息,潮濕而冰冷,吸進肺裡會讓人有種被水浸濕的感覺。更遠的地方,月台的盡頭是一片濃得化不開的黑暗,黑暗裡隱約有軌道延伸進去,卻沒有任何出口的標示。
月台上擠滿了人。
不,擠滿了通勤客。
他們穿著上班族的襯衫、套裝、工程師常見的格子衫,每個人都低著頭,盯著手中的手機。手機螢幕亮著,卻沒有任何畫面,只有一片慘白的光,照在他們的臉上。林煜辰的視線落在最近一個男人的臉上,然後呼吸停住了。
那張臉沒有五官。
沒有眼睛,沒有鼻子,沒有嘴巴,只有一片平滑的、像是未完成建模的皮膚,皮膚的質感還帶著塑膠的光澤。慘白的手機光從下方打上去,讓那張無臉顯得更加平坦而詭異。所有的人都是這樣,無臉,低頭,滑手機,肩膀隨著列車的震動輕輕晃動,卻沒有一個人發出聲音。
林煜辰抱著紙箱,站在車門口,進也不是,退也不是。車廂裡原本的幾個乘客已經不見了,整節車廂只剩下他一個人。他身後是空蕩的車廂,身前是整個月台的無臉通勤客。列車的門在身後緩緩關上,發出氣壓閉合的聲音,然後整列車無聲地退入黑暗,消失了。
月台的時鐘指向十二點零三分,秒針卡住不動。
有一個無臉通勤客抬起了頭。
雖然沒有眼睛,林煜辰卻能清楚感覺到自己被鎖定了。那是一種被掃描的感覺,從頭到腳,像是有一道不可見的光束在讀取他的資料。接著,第二個、第三個,越來越多的無臉人抬起頭,全部轉向他。他們沒有移動,只是轉頭,那個動作整齊得令人頭皮發麻,紙箱裡的馬克杯輕輕晃了一下,發出清脆的碰撞聲。
【偵測到F級BUG:無臉通勤客群體】
一個冰冷的、毫無感情的聲音直接在腦中響起,不是透過耳朵,而是直接在意識裡炸開。林煜辰抱著頭後退一步,撞在月台的柱子上,柱子冰冷潮濕。
【污染數值:62%】
【警告:宿主已進入高污染區,認知同化開始】
眼前跳出一個半透明的介面,像是擴增實境的視窗,邊緣還在閃爍紅色的警告框。介面的左上角顯示一個不斷攀升的百分比,62%、63%、64%,每跳一下,林煜辰就覺得自己的臉有點麻,像是血液不流通。
他下意識地摸了摸自己的臉,指尖傳來的觸感讓他恐慌——皮膚變得異常光滑,鼻樑的起伏似乎在變平。他衝到月台邊緣一根不鏽鋼柱子前,柱面倒映出他的臉,那張臉的五官正在淡化,眼睛變成兩條細縫,嘴巴的輪廓越來越模糊。
無臉通勤客們開始往他靠近,沒有腳步聲,只有手機螢幕的光在移動,像是一片慘白的潮水。他們的動作緩慢,卻帶著一種無法違逆的規則感,好像只要被包圍,就會永遠變成他們的一員。
「滾開!」林煜辰大喊,聲音在空曠的月台裡迴盪,卻沒有任何回應。無臉人們只是更靠近,舉起手機,對著他,那些慘白的螢幕像是一面面鏡子,要把他吸進去。
【都市除錯系統綁定成功】
【宿主:林煜辰,身份確認:失業社畜,適配度:91%】
【強制任務觸發:首次除錯】
【任務目標:在直播狀態下找出BUG核心邏輯漏洞,並執行除錯指令】
【失敗懲罰:同化為無臉通勤客】
【強制開啟全網直播:午夜除錯頻道】
腦中的聲音還沒結束,林煜辰口袋裡的手機忽然自己亮起,震動起來,螢幕上自動開啟了一個他從未下載過的直播應用程式。介面粗糙,像是工程師臨時拼湊的測試版,標題自動生成為「午夜除錯頻道首播:0號月台的無臉人」,右上角的觀看人數從0開始跳動。
1、3、7、15,數字快速上升。
彈幕在下一秒刷了出來。
「笑死,這什麼爛特效,面具都不戴好一點?」
「午夜探險?又是一個想紅想瘋的,還0號月台,捷運什麼時候有0號月台了?」
「主播演技好爛,紙箱哪裡買的?」
「特效太假了,那個臉是直接P掉的吧,建模都沒做完。」
「散了散了,劇本寫差一點。」
觀看人數已經到89人,而且還在增加。林煜辰看著那些彈幕,憤怒和恐懼混在一起,他想關掉直播,卻發現手機像是黏在手上,怎麼也無法退出。更恐怖的是,隨著觀看人數的增加,無臉通勤客們的動作變得更快了,污染數值也從64%跳到了68%。
彈幕的嘲笑,正在讓這個BUG變強。
林煜辰靠在柱子上,胸口劇烈起伏。他的視線因為恐懼而模糊,卻在模糊中看見了不一樣的東西。每一個無臉通勤客的頭頂,都浮現出一行半透明的、由雜亂符號組成的代碼,代碼的最末端,有一個不斷閃爍的紅色標籤——【異常代碼:FACE_NULL】。而在月台天花板的日光燈管上,也有一行更大的代碼,像是這個空間的總開關,標示著【場景規則:不可直視無臉者之面部,直視者將被讀取】。
不可直視?
林煜辰愣住了。他剛才就是因為直視了那張無臉,污染才會飆升。這個規則本身就是漏洞——如果不能看臉,那要怎麼確認對方是誰?這個城市的程式,用了一個最偷懶的辦法,直接把臉刪掉了。
他抱著紙箱的手在顫抖,直播間的彈幕還在刷:「主播怎麼不說話?卡了?」、「快點演啊,我等著看鬼出來嚇人」。觀看人數已經破百,突破一百的瞬間,系統彈出一個提示:【觀看人數突破100,解鎖彈幕算力轉化,直播即收容條件已滿足】。
月台的燈光又閃了一下,所有的無臉通勤客同時停下腳步,整齊地舉起手機,將慘白的螢幕對準林煜辰。那一刻,林煜辰感覺到自己的五官正在被強行抹平,視線開始變白。他知道不能再等了。
他舉起還在直播的手機,用盡全身力氣,將鏡頭對準了離他最近的那個無臉通勤客,然後做了一個所有人都沒有想到的動作——他打開了手機的閃光燈。
強烈的白光在慘白的月台上炸開。
那個被閃光燈直射的無臉通勤客,臉上平滑的皮膚竟然反射出刺眼的光,像是鏡面。牠發出一聲無聲的尖叫,頭頂的【FACE_NULL】代碼劇烈地扭曲、閃爍,污染數值在這一瞬間亂跳。整個0號月台的代碼瀑布都像是被干擾的訊號,出現了大面積的雜訊。
林煜辰的腦中,系統的聲音再次響起,這一次帶著一絲急促:
【偵測到邏輯衝突:無臉者被強光直射面部,規則矛盾】
【是否執行除錯指令:RESTART】
林煜辰沒有猶豫,幾乎是用吼的喊出來,聲音因為恐懼而沙啞,卻在直播間裡清晰無比:
「執行!」
話音落下的瞬間,時間彷彿被按下了暫停。所有無臉通勤客的動作都凝固了,他們頭頂的代碼同時碎裂,化作無數光點。月台的日光燈一盞接一盞爆開,卻沒有玻璃碎裂的聲音,只有代碼崩解的細碎聲響。林煜辰手中的手機震動得發燙,直播間的彈幕在這一刻像是被清空,隨後又以更瘋狂的速度刷屏。
而在所有光點的中央,林煜辰看見,這座城市的天空,不,應該說是這個裡側月台的天花板背後,露出了一角巨大的、由無數黑色代碼組成的瀑布,它們像血液一樣在城市的上空流動,冰冷而龐大。
台北這座城市,正在當機。
而他,剛剛按下了第一個重啟鍵。
讀者留言