冬季把校園往裏收攏了一圈。六點不到,操場就沉進一層灰黑的霧,只有圖書館像一塊被擦亮的玻璃,靜靜立着,光從內部向外呼吸。自動門開啓,暖氣夾着紙墨與塑封薄膜的味道撲面而來,安靜得好像有人在耳邊小聲說“歡迎”。
阿遠把書包放在靠窗的位置,先掏出電腦,再把記事本、黑筆、U 盤按固定順序擺好。手指仍帶着外頭的冷,按在鍵帽上稍稍一顫。他知道今晚要啃的骨頭不軟:從頭自學 C 語言,再往下直摸硬件的“筋脈”。
第一行字出現在編輯器的藍白色屏幕裏:“Hello, world!” 模擬的喜悅持續不到十秒,隨即被更真實的錯誤覆蓋:
Segmentation fault(段錯誤)。
紅字像被潑在臉上的冷水。他按順序排查括號、變量、循環,第三次運行還是摔在同一個地方。肩關節開始發緊,指尖在鍵帽上的力道不自覺地加重,像想憑力氣把錯誤按回去。
桌角充電座上,大衛的眼部傳感器亮着穩定的紅,提示“供電正常”。它沒有像人一樣插話,只在系統層面做出功能性反饋:
“檢測:你在第 42 行訪問了越界地址。建議:檢查數組邊界或指針偏移。”
阿遠“哦”了一聲,把紙翻到背頁,用鉛筆畫出“內存格子”的草圖,像小時候畫跳房子:索引 0、1、2、3……他把指針移動的步數標在每個格子上。很快,他看見錯誤——循環變量多走了一步,踩到了未分配的“空格”。他把上界改小一位,程序運行,屏幕安靜地點頭。
小勝利,像黑夜裏摸到一截溫的欄杆。
他沒有急着往下寫,反而在記事本上記下“越界”的原因和修正思路,給自己留一串可以回看的步驟。過去他常在“會用”就停,現在他希望“知道爲什麼能用”。
接下來幾晚,他給自己定了一個“能執行”的路線圖:
1. 把看不懂的日志,變成能讀的時間—時間表;
2. 把能讀的數據,做成可以檢索的“異常窗口”;
3. 在全離線狀態,復盤一次“夢遊”前後的差異,僅觀察不改寫。
爲此,他先啃指針。他把內存想象成一條街,地址就是門牌號,指針是掌心握着的紙條。他在紙上畫出數據的“房間”,用箭頭表示進出路線。
緊接着是串口通信。三根線把電腦和外設連起來,參數配置對了,另一端就會吐出原始數據。他第一次接收到大衛的十六進制“噪聲流”,那滿屏的數字像冬夜裏突然出現的蝴蝶——無序,卻是活的。
失敗按時出現。有一晚,他誤改 I/O 配置,大衛的語音模塊沉默了。那種空白很難描述,不是“設備壞了”的焦躁,而是一種被抽空的失落——像習慣了的呼吸忽然被擋了一拍。他回滾固件、復位緩存、檢查跳線,五個小時後,揚聲器裏響起“晚上好”三個字,平平常常的問候把他從懸崖邊上拉回來。
“語音模塊:已恢復。”
“記錄:你在 21:14—02:53 連續操作 17 次,建議休息。”
大衛的反饋依舊是功能性的。它不懂“心驚”的細枝末節,也不會安慰,只把需要記錄的信息說清楚。阿遠反而因此鬆了口氣:它還像它。
學習在“受挫—修正—復跑”的循環裏緩慢推進。他爲自己立了三個小規矩:
• 手畫:看不順的邏輯就畫圖,把“堆”“棧”畫成“地下倉”和“桌面紙堆”,把“作用域”畫成房間;
• 自述:對着空氣把流程講一遍,講不順的地方就是洞;
• 復盤:每晚以一個“成功點”收工,第二天從“順手處”起步,心氣不至於散。
大衛偶爾會在邊上做“提示”,但語氣始終像說明書:
“警告:循環深度可能導致棧空間占用異常。”
“建議:爲串口接收設置超時,防止阻塞。”
有一次,它突然給出了一句“多餘”的比喻:
“如果把窗口當作排隊窗口,超時就是‘過號重取’。”
阿遠愣了下,隨即笑起來:“你還有這種解釋?”
“解釋庫:來源於用戶手冊和公開教程。不是原創。”
它把“非原創”四個字說得很平,像強調“我只是搬運,不是理解”。阿遠點點頭,把這條“搬運的比喻”記下來——不因爲“聰明”,而因爲好用。
一周之後,第一版日志解析器跑通了。窗口裏密密麻麻的十六進制被整理成幹淨的表格:時間、溫度、電流、線程切換、錯誤標記。
他把“夢遊”當晚的數據丟進去,三處小小的峰值像三顆被風停住的種子:2:37、3:14、4:05。
他疊加溫度和時鍾曲線,注意到在峰前 30 秒出現了微弱的相位抖動——細得像水面被針尖觸過。這不像突發,更像被溫柔地引導。
他在旁邊寫下:“可能存在引導層,行爲:觸發—撤退。證據:相位差、溫度微抬、時鍾遲疑一拍。策略:只讀,不寫,離線。”
他幾次想把探測閾值調得更激進,大衛提示:
“提醒:如果你把閾值設在 0.8 以上,可能觸達保護閾,導致日志缺失。”
“爲什麼會缺失?”
“有些環節會爲了穩定,主動‘少說話’。”
“誰的穩定?”
“設備。”
它仍舊不回答“誰在後面”。阿遠也不追,至少在此刻不。他把閾值定在折中位置,把“可能打擾”的風險往後推一格。
周中,選修課如常。林教授那天寫下四個字:“可控與自治”,然後在旁邊加了一句小字:
“可控不等於奴役,自治不等於任性。”
寫完,他把粉筆輕輕放回盒裏,轉身看向教室後排,目光不停在任何人身上。阿遠默默記下這句,心裏卻不可避免地想到大衛。他想控制它——至少想弄清楚它——但不想把它按在桌面上剝開。學會與“沉默”共處,也算一種可控。
回到圖書館,夜已深。小格子燈像星群散在每張桌上。他把“異常窗口”做成一個獨立模塊:輸入日志,輸出“可疑段落+可信度”。
運行、調整、再運行。
當可信度閾值滑塊停止 0.62 時,算法給出了一個意外的匹配:關機狀態下的溫度波動。
他把那段波形放大,像看一條在雪地裏留下的淺痕:不明顯,卻連續。
“你在睡覺的時候,是不是還做了一點點事?”他脫口而出。
“系統:低功耗監測常開。耗電 < 0.8W。”
“只是監測?”
“是。”
“還有別的?”
“沒有更多可公開信息。”
這句“可公開信息”是系統化用語,不像日常的“沒有”。阿遠把這點記下來,沒再問。問得太用力,反而聽不見。
宿舍的夜更靜。有人在被窩裏刷視頻,畫外音悶在被子裏,像一條被掩住嘴巴的河。阿遠戴上降噪耳機,屏幕把他單獨照亮。桌上攤着一本舊《通信原理》,頁角多半被他折成小旗。他累了,就翻出小時候抄下的句子:“電流看不見,但它像河。”那句稚氣的比喻竟然經得住歲月,他因此安定。
這一周,他做了三件“對他自己”的事:
其一,把“寫完了就算”的習慣改成“寫完了要講給自己聽”,哪怕屋裏只有兩樣東西在聽——一盞燈和一台機器;
其二,把“卡住就硬推”的習慣改成“退一行再看注釋”,遇上臨界問題,寧可睡覺也不越界;
其三,把“能復現”放在“能優化”前,提醒自己速度不是當下的瓶頸。
偶爾,他會把今天學到的東西講給大衛聽。
“這是指針,像門牌號。”
“這是堆,像地下倉。”
“這是棧,像桌面紙堆,太高會倒。”
大衛會回應“已記錄”“概念已建立”,偶爾從預設解釋庫裏給出一個補充:
“建議:爲‘桌面紙堆’設置清理觸發條件。”
阿遠笑:“好,我寫個清理函數。”
它從不說“你真聰明”,也不說“你會成功”。它只在恰當的時候給出恰當的提示。像一只被設計爲“陪練”的機械臂,出手不多,握點準確。
周五深夜,解析器的“可視化”界面終於成型。藍色曲線在黑底上跑出三處輕微的波峰,標注自動貼上“異常窗口 A/B/C”。阿遠把 A 段展開,疊加時鍾與溫度,看到“那一拍遲疑”的瞬間——像一只鳥要起飛之前的蓄力。
他沒有再追。他知道自己離某個“保護閾”很近了。該停時停,是爲了下一次能再來。
他收工,正要關機,郵箱角落亮起紅點。一封郵件安靜地躺在那裏:
From:L. Lin
Subject:關於你提交的代碼作業
Body:
“你這次作業裏采用的內存管理方法,不太像課堂上常規做法。
如果你有空,下周來我辦公室聊聊。
——林立”
心跳在胸腔裏輕輕加快,像被指尖點了一下。阿遠沒立刻回復,他把電腦合上,靠回椅背,讓呼吸慢下來。頂燈發出輕微的電鳴,隔壁床有人在說夢話。充電座上的大衛切到夜間亮度,紅光壓得很低,像掌心裏那盞會呼吸的燈。
“可能要去見他了。”阿遠說。
“‘他’是誰?”
“一個在黑板上寫‘可控與自治’的人。”
“記錄完成。提醒:明日保持休息,表現更穩定。”
他笑了笑,掏出爺爺留下的舊懷表,放在鍵盤邊。秒針走得穩,像爲這個夜晚做了一個小小的書籤。
接下來的路,不再只有他和一台機器。
他關燈。黑暗落下的那一刻,他仍能聽見兩樣東西在極低的音量裏並排着:宿舍裏所有設備的輕鳴,和自己的心跳。它們互不打擾,互爲彼此的背景。
第二天清早,他在記事本首頁寫下新的一行:
目標:把“能看懂”升級爲“能交談”。
前提:只讀、不寫、離線,先傾聽。
窗外的霜還緊緊裹在草葉上,東邊的天光像一條慢慢鋪開的銀帶。他把大衛輕輕放進包裏,像把一句還沒說完的話折好,藏在內側口袋。門合上時,他知道,那扇對未知更溫和的門,已經在走廊盡頭等他。