冬季把校园往里收拢了一圈。六点不到,操场就沉进一层灰黑的雾,只有图书馆像一块被擦亮的玻璃,静静立着,光从内部向外呼吸。自动门开启,暖气夹着纸墨与塑封薄膜的味道扑面而来,安静得好像有人在耳边小声说“欢迎”。
阿远把书包放在靠窗的位置,先掏出电脑,再把记事本、黑笔、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:
“你这次作业里采用的内存管理方法,不太像课堂上常规做法。
如果你有空,下周来我办公室聊聊。
——林立”
心跳在胸腔里轻轻加快,像被指尖点了一下。阿远没立刻回复,他把电脑合上,靠回椅背,让呼吸慢下来。顶灯发出轻微的电鸣,隔壁床有人在说梦话。充电座上的大卫切到夜间亮度,红光压得很低,像掌心里那盏会呼吸的灯。
“可能要去见他了。”阿远说。
“‘他’是谁?”
“一个在黑板上写‘可控与自治’的人。”
“记录完成。提醒:明日保持休息,表现更稳定。”
他笑了笑,掏出爷爷留下的旧怀表,放在键盘边。秒针走得稳,像为这个夜晚做了一个小小的书签。
接下来的路,不再只有他和一台机器。
他关灯。黑暗落下的那一刻,他仍能听见两样东西在极低的音量里并排着:宿舍里所有设备的轻鸣,和自己的心跳。它们互不打扰,互为彼此的背景。
第二天清早,他在记事本首页写下新的一行:
目标:把“能看懂”升级为“能交谈”。
前提:只读、不写、离线,先倾听。
窗外的霜还紧紧裹在草叶上,东边的天光像一条慢慢铺开的银带。他把大卫轻轻放进包里,像把一句还没说完的话折好,藏在内侧口袋。门合上时,他知道,那扇对未知更温和的门,已经在走廊尽头等他。