第1章 世界静默,键盘独鸣
褚云帆是被一阵刺耳的警报声吵醒的。
那声音像是用生锈的锯子切割金属,尖锐得能刺穿耳膜。他猛地从工位上抬起头,后颈传来一阵僵硬的酸痛------昨晚又通宵了。
眼前的世界模糊了几秒。
他习惯性地伸手去摸眼镜,手指触到冰凉的镜架。戴上。
视野清晰起来。
然后他愣住了。
深蓝科技开放式办公区的景象,和他记忆中任何一次加班后的清晨都不同。
太吵了。
不是键盘敲击声------那种清脆规律的"咔嗒咔嗒"早就消失了。取而代之的是一片混乱的、毫无节奏的敲打声,像是幼儿园小朋友在胡乱拍打玩具琴。
褚云帆揉了揉酸涩的眼睛。
他看见左侧工位的李工。
李工是公司十年的老程序员,秃顶,脾气暴躁,但代码写得极稳。此刻他正对着屏幕,双手悬在键盘上方,手指微微颤抖。他的嘴唇在动,好像在默念什么咒语。
然后他按下一个键。
"a"。
屏幕上跳出一个字母。
李工盯着那个"a",额头渗出细密的汗珠。他深吸一口气,又按下一个键。
"s"。
"d"。
"f"。
他像是在玩打字游戏,但打出来的字母毫无意义。asdfasdfasdf------一行行重复的字符在屏幕上滚动。
"不对......"李工喃喃自语,"循环......for循环该怎么写来着?"
他的手指悬在键盘上,迟迟落不下去。
好像有什么东西卡住了。
褚云帆转过头。
整个办公区两百多个工位,所有人都在做同样的事------对着键盘发呆,然后敲出乱七八糟的字符。有人试图写注释,打出来的却是"#¥%......&*()"。有人想定义变量,屏幕上出现的是"int a = ;;;;;;;;;"。
分号。
无数个分号。
像是某种集体癔症。
"谁能写个循环?!"
一声咆哮从过道传来。
主管老王站在走廊中央,四十多岁的中年男人,此刻脸涨得通红。他手里举着一台平板电脑,屏幕上是半截代码------看起来像是某个脚本的开头,但语法完全错了。
"就一个简单的for循环!"老王的声音在发抖,"迭代数组!打印数字!这他妈是实习生第一天就该会的东西!"
没人回应。
只有键盘的胡乱敲击声。
老王走到最近的一个工位,抢过员工的键盘。他深吸一口气,手指放在键盘上。
然后僵住了。
他的嘴唇在动,好像在回忆什么。几秒钟后,他开始敲击。
for (i = 0; i < 10; i++)
打到"i++"时,他停住了。
"加加......"老王盯着屏幕,"是i++还是++i?前置和后置有什么区别来着?"
他想了五秒钟。
然后删掉了整行。
重新打。
for (int i = 0; i < 10; i = i + 1)
这次语法对了。
但老王盯着那行代码,眼神空洞。他好像不记得接下来该写什么了。大括号?语句块?打印函数?
他的手在颤抖。
最终,他敲下一个分号,结束了这行代码。
for (int i = 0; i < 10; i = i + 1);
一个空循环。
毫无意义。
老王把键盘扔回桌上,发出"砰"的一声。他环顾四周,眼神里第一次出现了褚云帆从未见过的情绪。
恐惧。
"你们......"老王的声音低了下来,"你们都忘了吗?"
没人回答。
褚云帆低下头,看向自己的屏幕。
他的终端还开着。昨晚通宵重构的那个模块,代码还停留在编辑器中。三百多行,结构清晰,注释完整,是他花了六个小时精心打磨的。
他下意识地滚动鼠标。
代码正常显示。
没有乱码。
他愣了一下。
然后,几乎是出于本能------程序员的本能,那种写完代码总要测试一下的本能------他新建了一个文件。
手指放在键盘上。
肌肉记忆开始工作。
他甚至没有思考,指尖就动了起来。敲击声清脆、连贯、有节奏,和周围那片混乱的噪音形成鲜明对比。
print('Hello World')
回车。
屏幕下方,终端窗口弹出。
清晰的白色字体显示在黑色背景上:
Hello World
成功了。
褚云帆盯着那行字,看了三秒钟。
然后他猛地抬起头。
办公室里突然安静了。
不知道从什么时候开始,所有人都停下了手里的动作。键盘声消失了。说话声消失了。连呼吸声都好像变轻了。
两百多双眼睛,齐刷刷地看向他。
那些眼神很复杂。
有困惑。
有茫然。
但更多的是......一种褚云帆无法理解的东西。像是原始人看到同部落的人突然徒手生起了火。像是中世纪农民看到邻居念出了恶魔的文字。
怪物。
他们在看一个怪物。
褚云帆的后背瞬间被冷汗浸湿。
他几乎是条件反射地按下Ctrl+A,然后Delete。屏幕上的代码消失了。终端窗口关闭了。他抬起头,脸上挤出一个和周围人同样困惑的表情。
"怎么了?"他问,声音有点干涩,"你们......都看着我干嘛?"
没人说话。
李工张了张嘴,好像想说什么,但最终只是摇了摇头,转回了自己的屏幕。
老王盯着褚云帆看了几秒,眼神里的恐惧慢慢变成了怀疑。但他也没说什么,只是转身走回了自己的办公室,重重关上了门。
警报声还在响。
但已经没人管了。
褚云帆坐在工位上,心脏狂跳。他强迫自己深呼吸,一次,两次。手指在桌子下面微微颤抖。
不对劲。
太不对劲了。
他打开浏览器,点开新闻网站。
首页全是乱码。
不,不是乱码------是各种语法的碎片。中文里夹杂着英文单词,英文句子里混着编程语言的符号。像是整个网站的渲染引擎崩了。
他刷新。
还是这样。
他换了个网站。
同样的情况。
最终,他在一个极简的纯文本论坛上,看到了一条还能勉强阅读的消息:
【紧急通知:全球范围内出现未知技术故障。编程语言理解能力普遍异常。建议所有技术人员停止操作,等待进一步通知。】
下面跟了几百条回复。
"我连Hello World都写不出来了......"
"变量是什么?函数是什么?我好像做了个梦,梦里我会写代码,但醒来全忘了。"
"不是忘了!是脑子转不动!我看到for这个单词,知道它是循环,但就是想不起来该怎么用!"
"全球性的?不只是我们公司?"
"不只是我们国家。我刚问了国外的朋友,一样。"
褚云帆一条条往下翻。
手指越来越冷。
中午十二点,公司强制断网。
广播里传来行政总监的声音,听起来很疲惫:"全体同事请注意,接上级通知,即刻起停止所有技术相关工作。请大家......保持冷静。等待进一步安排。"
办公区一片死寂。
没人动。
大家就坐在工位上,盯着黑屏的显示器,或者盯着自己的手。好像只要多看一会儿,那些丢失的技能就会回来。
褚云帆站起来,走向茶水间。
路过李工工位时,他瞥了一眼屏幕。
李工在写文档。
用中文。
"如何打开终端:第一步,找到屏幕左下角的开始菜单。第二步,点击。第三步,在搜索框里输入'cmd'。第四步......"
他写得很慢。
每一个字都要想很久。
好像这不是常识,而是某种需要详细记录的秘密知识。
茶水间里,几个同事在低声说话。
"你还能记得多少?"
"我......我记得if是判断。else是否则。但具体怎么写,我脑子里一片空白。"
"我也是。就好像有人把我大脑里关于编程的那部分,整个挖掉了。"
"不是挖掉。"另一个声音说,"是蒙上了一层雾。你知道雾后面有东西,但就是看不清。"
褚云帆接了一杯水。
水温很正常。
但他喝下去的时候,感觉喉咙发干。
下午两点,公司宣布提前下班。
"基础设施不稳定,"老王在群里发消息,"交通系统可能受影响,大家早点回家。"
没人欢呼。
大家沉默地收拾东西,沉默地离开工位。动作都很慢,好像还在消化今天发生的一切。
褚云帆背起包,走进电梯。
电梯里有六个人。
没人说话。
大家盯着楼层数字,眼神空洞。
电梯下到一楼,"叮"的一声开门。
褚云帆走出去,然后停住了脚步。
大厦外的景象,比他想象的更糟。
街道上,红绿灯在胡乱闪烁。
不是故障的那种闪烁------是毫无规律。红灯亮0.5秒,绿灯亮2秒,黄灯亮0.1秒,然后又跳回红灯。三个灯有时候会同时亮起,发出刺眼的光。
十字路口堵成了一团。
自动驾驶汽车停在路中间,有的在缓慢地原地转圈,有的在前后轻微挪动,像是失去了方向的昆虫。一辆公交车的电子屏上滚动着乱码,司机试图手动操作,但方向盘好像锁死了。
人行道上,人们拿着手机,脸上都是茫然。
"地图用不了了......"
"叫车软件显示服务器错误。"
"连扫码支付都不行了!刚才买瓶水,扫了五分钟都没反应!"
褚云帆站在大厦门口,看着这一切。
阳光很好。
天空很蓝。
但世界好像突然变成了一个劣质的、漏洞百出的程序。每一个模块都在报错,每一个函数都在崩溃。
他抬起左手,看了一眼手腕上的表。
那是一块老旧的电子表,表盘不是数字,而是一行不断跳动的代码。
是他自己改装的。
表盘上显示着:
while (true) { display_time(); sleep(1000); }
一个无限循环,每秒刷新一次时间。
此刻,代码正常滚动。
时间正常显示。
14:37:05。
褚云帆盯着那行代码,看了很久。
然后他抬起头,看向街道对面。
那里有一家咖啡馆,橱窗上贴着二维码,旁边写着"扫码点单,享受优惠"。一个年轻人正拿着手机对着二维码,反复调整角度,表情越来越烦躁。
"怎么扫不出来啊......"年轻人嘟囔。
褚云帆知道为什么。
扫码程序底层依赖图像识别库,识别库依赖算法,算法依赖代码。
代码写不出来了。
所以识别库无法更新,算法无法优化,程序最终会随着设备老化而逐渐失效。
就像现在。
就像整个世界。
他深吸一口气,把袖子拉下来,盖住手表。
然后迈开脚步,走进混乱的街道。
回家的路原本只需要二十分钟。
今天他走了一个小时。
因为要避开所有依赖智能调度的路口,要绕开那些在原地打转的自动驾驶汽车,要小心突然乱闪的交通信号灯。
路上,他看到了更多细节。
一家银行的ATM机,屏幕蓝屏,显示着一串错误代码。几个人围在旁边,试图理解那些代码的意思,但显然失败了。
一个外卖机器人卡在路边绿化带里,轮子空转,扬声器里反复播放:"路径规划错误,请稍候......路径规划错误,请稍候......"
便利店门口,电子广告牌上本该播放促销视频的区域,现在显示着一行行调试信息:
Segmentation fault (core dumped)