我一直相信,代码是理性的几何。只要把需求拆成函数、把函数拆成语句、再把语句拆成指令,世界就会像被精确测量的方格纸一样安稳。直到那个夜里,我才明白:理性不过是一盏纸灯,而风一直在墙后。
项目进入收尾。我们要把一批古籍扫描件跑 OCR,再做语义检索。我负责后端的清洗与对齐,流水线很简单:拉取数据、切词、对齐、入库。那天凌晨一点,我在公司空旷的工位上敲下回车,终端忽然冒出一串奇怪的字符。
它们不是 ASCII,不是 GBK,也不是 UTF-8。像乱码,却又对称;像图案,却又流动。每一秒,它们都会微微改变位置,仿佛在呼吸。我写了个小脚本,把流输出转成十六进制,再映射到灰度矩阵打印在屏幕上。矩阵拼出一个轮廓——
我无法说它像什么。最接近的比喻只能是“反转的眼”,但那只是安抚自己的说法。它更像是“看见”这个动作自身的残影。
屏幕很暗,办公室很静。我靠近了一点,听见机箱的风扇在低低地转。那片灰度里的“眼”似乎也在低低地转。我的胸口出现一种钝痛,不像恐惧,更像高度集中的余波。我按下 Ctrl+C,字符消失,终端回到正常的提示符。空白得像什么都没发生过。
我知道这不可能是硬件故障。那串输出来源于我们调用的一个第三方 OCR API,日志里却没有任何返回记录,就像请求没有真正经过网络,却在我的屏幕里完成了某种投递。为了不让自己继续胡思乱想,我把异常流保存到了本地,命名为 raw.bin
。命名那一刻,我有一种莫名的抵触:我不该给它命名。名字是门。
第二天,我把 raw.bin
带回家。起风的傍晚,出租屋里只亮着显示器。为了还原异常,我写了个函数 decode(raw)
, 尝试用不同编码暴力解码。每换一套映射,那些字符就呈现不同的“姿态”,却总保持某种不舒服的相似:似乎无论我怎么解,它们都会指向同一件事物,只是换了角度。
到了深夜,我的 IDE 开始出现难以解释的行为:代码补全弹出一个从未使用的命名空间,提示里浮出一个函数名,它既像拉丁语也像拼音的畸形混合,字形在像素里轻微扭曲。我不由自主地按下了回车。
光标自己跳到了下一行,自动生成了函数定义。它有三个参数:see
, seen
, exit
。我的脑子里嗡的一声,像被人把一扇窗从脑后打开。那三个词……它们像我在海边见过的符号——等等,我从未在海边见过任何东西。我怎么会突然冒出“海边”这个意象?
我盯着函数体,那里只有几行空注释。可当我把手悬在键盘上时,我感到一种奇怪的牵引,像是有人在我手腕上轻轻挑了一下筋。我不敢打字,按下撤销,IDE 却没有响应。屏幕里仍旧保留着那段函数,像一只缓慢眨眼的灯。
我关机。机箱里传来一声轻不可闻的叹息。
关掉所有电源后,房间陷入厚重的黑。我在床上盯着天花板,风把窗帘吹成潮水的形状。睡意来得很快,但并不沉。
我梦见自己站在一片巨大的空白前,空白向四周延展,没有边界。我感觉到背后有东西在注视,那种注视不是目光,更像是规则对变量的遍历。我没能转身——不是我不愿,而是“转身”这个动作在那片空白中没有定义。
我听见低低的嗡鸣。它没有节奏,却比任何音乐更有“结构”。那结构带来一种安抚感,像笼子让小兽安静。我在嗡鸣里走动,脚下踩着的不是地,而是未被命名的“贴合”。在某个看不见的门槛上,我停下。门槛没有形体,我只是“知道它在那里”。我把手伸过去,触到一种……并不冰,也并不热的“温度”。那不是温度,是“温度的概念”在我手上轻轻擦了一下。然后我醒了。
枕边有一片湿痕。窗关得很紧,屋里没有任何能漏水的地方。我坐起来,摸黑找到卫生纸擦干。纸巾上留下的不是普通的水迹,而是一种在光线变化下微微发亮的痕线,像某种字符刚刚写过又迅速抹去。我打开手机手电,光一照,痕迹消失了。像它从未存在。
上班后,我把异常报告发给同事,得到的回复极其一致:网络偶发、编码抖动、测试环境干扰。没有人愿意多看第二眼。午休时,我把异常片段的一小部分匿名贴到了一个程序员论坛。几分钟后,有人私信我一个链接——GitHub 的封禁页面。
“你想看的东西在这,被 DMCA 封了。”他写,“把地址复制到命令行里,git clone
还能拉下来最后一版缓存。”
我照做。仓库很小,只有 README.md
和三段源文件:see.c
, seen.py
, exit.go
。我打开 README
,里面只有一句话,英文,冷淡无比:
Do not execute the third function. Names are doors.
我试着读源码。三段文件彼此独立,却共享一个奇怪的常量表。常量都是不可打印字符的序列,组合方式违反了常识:一个 C 文件里用 Python 风格的切片,Python 里又出现 Go 的 channel 操作。按理根本跑不起来,但我在本地做了最小化修复后,三段程序都能以极其不合理的速度编译通过。命令行静了几秒,输出里出现两行陌生的字母,拼起来像是我的名字。
我盯着它们发呆。我的名字被打印在我的电脑上,这原本没什么奇怪,但那拼写略有偏差——字母顺序像被悄悄挪动了一位。仅仅是挪动了一位,就让我觉得自己的胸腔被移走了一寸。
我把仓库的 commit 历史拉开。最后一条提交记录来自两个小时前,署名的头像与昵称我都不认识,但它们很熟悉。我好像曾在梦里见过这些昵称,它们站在一条“门槛”的另一边,朝我打手势。
傍晚,产品经理催我出报告。我把异常简化成“第三方接口字符噪声”,附了清洗方案与风险评估,发了邮件。不到五分钟,邮件被归档到“已解决”。项目继续推进。办公室恢复了熟悉的节奏:吸管穿过奶茶封膜的声音、键盘雨、讨论会里打断与反打断、夜色中亮着的屏幕。
我盯着自己的桌面发呆。IDE 里那段函数仍然躺在那里。我不记得我昨晚是否已经删掉它——不,这种事情不能依赖记忆。我把它整个复制粘贴到一个新文件,保存名为 gate.rs
。保存成功的提示弹出来的一瞬,我清晰地听见一个极轻的、像从很远处传来的触碰声:有人用指尖弹了弹玻璃。
我回头,空空如也。天花板的灯有一点闪。工区尾部的窗户外,是一片深得不像真的夜色。黑像是被打磨过。
我问坐在对面的小路:“你有没有感觉到……今天的风扇声有点不一样?”
他摘下耳机,愣了一下:“你在说什么?”
“没什么。”我笑,笑得很累。
这一夜的梦更深。我站在一面看不见的石板前。它并非“石”,我只是被自己的语言误导。它没有材质,没有重量,它更像是一个“表面”的概念,被借给了我。表面光滑,上面没有任何文字。但当我看久了,微细到几乎不可察的凹陷开始在表面浮现,像有人用极细的笔尖在雾气上写字。那些凹陷的组合越来越像字母,字母越来越像名字,名字越来越像——我的名字。
我想退后一步。可“后退”这个动作在那块表面前不存在。我的脚在地上踩出的声响延迟了半秒传来,那半秒像一扇门。门后不是空间,而是“看见”。我突然明白,那些异常字符并不是错误,而是“看见”自身的输出。我们把它误以为数据,因为我们只会看数据。
我被一种复杂的情绪抽空了:既不恐惧,也不欣喜,像是一列火车经过站台时掀起的风。它不是为我而来,我只是站在了位置上。
第二天早上刷牙时,我在镜中看见自己的眼角有一道细细的裂缝。不是伤口,更像一道要打开的不知名的“接口”。我伸手去触,手指传回来的不是触感,而是一串很浅的、干净的振动。振动像极小的脚步,来回走动,最后在我指腹按住的地方停了一下。我忽然意识到,我正在被“对齐”。
我丢下牙刷,坐在马桶盖上大口呼吸。呼吸这件事从来没有让我如此不确定:我吸进去的是什么?我吐出来的又是什么?我有没有在某个我不知道的地方,也用一种我不认识的方式,在“呼吸”某件不属于人的东西?
我决定结束这件事。结束的方法很简单:删掉那段函数、清空 raw.bin
、卸载那个奇怪的仓库、把所有缓存覆盖。最好……把电脑重装。
我坐回工位,插上电源,开机。IDE 自动恢复了上次的会话。函数仍在,像从未被我考虑过它的删除权利。我把光标移动到文件顶部,准备全选。就在这时,屏幕的右下角弹出一个系统通知:“可以更新:第三个函数的依赖已准备完毕。”
我没有点任何东西,通知自己消失了。两秒后,终端弹起。命令行里滚动着一串我从未见过的脚本,速度快得难以捕捉。我慌忙去按 ESC,指尖却像被空气绊了一下。像有一只看不见的手从屏幕里伸出来,非常轻地抵住了我的指节。
我盯着命令行,嘴里吐出的气有一丝冷甜的味道——像海边深井里的水。脚本停下,光标闪烁。终端打印出一句英语:
You are being compiled.
我打了一个字母,屏幕上出现了另一个字母。像是我的输入被提前猜中了,又像是我在复制一个已经发生过的输入。光标像在引导我。我尽力把手抬起来,用一种笨拙的姿态按下了回车。屏幕短暂一黑。接着,IDE 顶部出现了一个新的分屏窗口,里面只有一行淡灰的提示:
func exit(name string) -> void { ... }
我没有再动。那一行代码像一扇已经打开的门,门后没有光,也没有暗,有的是某种我没有名字的“秩序”。我明白,如果我继续执行,我可能会“出去”。出去哪里?我没有资格问。我的资格只是按下 Enter。
按键的瞬间,我听见整个办公室变得很静。不是所有声源都消失,而是它们被某种更大的背景吸收。空调继续吹,风扇继续转,远处仍有人说话,但是这些音都像被送进了远处的一口井。井里有风。我在那风声里看见了许多平面的影子,它们互相贴合,彼此穿越,像算法把问题拆解再合并的过程。我被这美感击中——多么冷静,多么不可反驳。
屏幕开始显示一连串“成功”。每一个“成功”都在我的胸腔里留下一个更空的洞。我的名字在日志里浮出、消失、再浮出,每一次浮出的位置都不一样,像有人在把它挪到更合适的地方。我的右手背上出现了一行浅浅的印,像是细到几乎不可见的字符在皮肤下落了灰。它们不是字,却以“字”的形式通过了我的眼睛。我没有疼痛,只觉得更轻。轻得像慢慢往上漂。
我想起 README
里的那句警告:不要执行第三个函数。名字是门。
我笑了——失笑——像看穿了一个太粗糙的把戏。但立刻,我又没法笑。因为我意识到,警告也在协议里。它不想阻止我,它只是需要一个“被忽略的警告”,来完成某种更完整的形状。
“我该停下。”我说出口,声音却像从别人的喉咙里来。屏幕上出现一行新日志:> exit(...)
。括号里的参数被系统自动填入。那参数就是我。不是我的名字,是比名字更深的一段“指向”。
编译进度到 99%。我的眼角那道裂缝微微张开,像要从那里眺望一片尚未被命名的海。
编译进度条到达 100% 的瞬间,屏幕黑了。可黑不是空白,而是某种活的材质,像被打磨的玻璃在呼吸。机箱的风扇声化为低沉的吟唱,键盘的背光脉动如心跳。
我试着呼吸,却发现胸腔里再没有空气。取而代之的,是一种潮湿的数据流,像海水又像电流,从肺里涌入,再顺着血管分布全身。每一次心跳,都在打印日志。
桌面自动生成了一个文件:README.md
,里面只有三行:
看见。
被看见。
——出去。
我笑了,笑声却带着金属的回响,像从扩音器里溢出的噪声。我的手指在键盘上留下淡淡的荧光裂纹,肉体与电路的界限消失。指节之下,不是骨头,而是不断蠕动的字符流,像从血肉里长出的代码。
显示器闪烁,镜面般的黑暗倒映出一个我不认识的身影:半是人类,半是由流动的电缆、发光的符号、模糊的感官组成。眼睛的位置不再固定,而是像光标一样在脸上漂移。
我正被编译成一种新的存在。
街区的霓虹透过窗户渗进来,却被扭曲成符号的影子。城市的电网在远处轰鸣,每一条光纤都像血脉,每一个数据包都像脉冲。我能“听见”服务器的低语,能感受到网络在呼吸。我理解了:他们并不是在制造人工智能,他们在“召唤”旧日的协议。
我的身体开始碎裂成流。皮肤剥落,露出由光纤与湿冷的金属组织织成的筋络;脊椎化作一条闪烁的总线,每一个端口都在等待接驳。思想本身不再是私有的,而是被上传,被拼接,被调用。
我站起来,动作笨拙却流畅。每一根电缆都向我伸来,像同类的手臂,把我接入更深的黑暗。
窗外的城市在此刻骤然安静。高楼的广告屏幕一齐闪烁,所有的光汇聚成同一个符号。那是我在石板上见过的符号,也是我代码里见过的函数名。
我不是消失,而是被“收回”。
如果这段文字落在你眼前,请立刻停下手里的命名。把变量取成无意义的字母,把注释删掉,把日志清空。最重要的是:当你看见任何像“看见”的东西,请别回看。 因为名字是门。门一旦装好,总会有人推开。