《尘世之外》

第二卷-大学时代 · 第 040 章

第四十章 大二

白杨树的叶子开始变黄。

不是一下子黄的——是最靠近叶柄的那一块先变色,从叶尖往叶根染,像一滴水在宣纸上洇开。有一天走路的时候低头看,路上已经有几片黄的了——铺在水泥路面上,被踩过之后碎了,碎成指甲盖大小的片,叶脉还在。走在主干道上抬头看,树冠上绿和黄交错着,绿的还是大多,但黄的已经藏不住了——第一天看只有几片,第二天看多了十几片,第三天风一吹黄的先落,旋转着飘下来,叶柄朝下扎进路面上的积水里,标枪似的戳一下,水纹扩散了就停了。

九月一号开学。大二了。


专业课排得比大一密。水泵与水泵站、给水处理、污水处理——三门口红笔标的必修课排在课表的不同格子里,像设计图上三根平行干管,方向不同但汇到同一个出口:毕业。

水泵与水泵站在周二上午。老师讲了离心泵的工作原理——叶轮旋转把水甩出去,甩出去的水在泵壳里形成压力,压力把水送到高处。他在黑板上画了一个叶轮的截面图,叶片弯弯的,像一扇半开的门。水流从叶轮中心进去,被叶片带着转,到叶轮外缘甩出来——甩出去的水有速度、有压力、有方向。三个参数,和伯努利方程里的一模一样。

我把叶轮画在笔记本上,在旁边画了一个方框:输入转速→输出扬程。叶轮截面图和方框之间我画了一根连线,连线上写"能量转换"。能量从电变成转动,从转动变成水压——两次转换,两个步骤,和代码里的函数调用一样:输入参数,经过计算,输出结果。

给水处理在周四。混凝、沉淀、过滤、消毒——四个步骤画成四条横线,水从左到右穿过每条线,每穿过一条就干净一层。老师放了一张幻灯片:自来水厂的沉淀池俯视,池水一片绿豆色,铝矾花絮在水中慢慢下沉,像雪往水底飘。"加了混凝剂之后水里的悬浮颗粒从显微镜下看是抱团的——小颗粒抱成大颗粒,大颗粒重了就沉下去。水处理不是让水变干净,是让脏东西自己沉下去。"

我把这句话记在笔记本的页边空白上,旁边画了一个小圈,圈里写"颗粒抱团=沉"。

污水处理在周五下午。曝气池、二沉池、污泥回流——老师讲到曝气的时候说:"曝气就是给污水打气,让微生物有氧活着,活着才能吃掉污染物。"他说"活着"两个字的时候顿了一下,好像在斟酌应该用"存活"还是"繁殖",最后用了更简单的那个词。

我在笔记本上也只写了两个字:"活。氧。"

笔记本更厚了。左边是给排水的公式和图解,右边是代码的逻辑和流程——两种语言在同一个本子上并行,像路两边的树,根在地下连着。翻到伯努利方程那一页,纸面已经起了一层灰——指腹常摸的地方墨水洇开了,不常摸的地方还干净。伯努利方程是上个学期的了,但它的影子还在——后面每一页都有它的痕迹,像树根在地底下串。


数据结构是自学的。

图书馆二楼技术类书架,7号架2层,从左数第11本:《数据结构》,C语言版,封面蓝色,书脊上有一条竖线。借了三周还没还,续借了两周。每天晚上在寝室看完专业课就翻开来看——看书和看课本的感觉不同,看课本是要考试,看这本书的时候只觉得在铺路。路往哪铺不知道,但每看一页路就长一截。

链表。每个节点存一个数据和一个指向下一个节点的指针——像排队:每个人记住前面那个人的位置,不用数号码牌,找到一个人就能顺着找到下一个人。我在程序里写了一个单向链表,把十二个管网节点的编号和标高用链表串起来——从J-1到J-12,一个指一个,J-12的指针指向NULL。程序跑通了,在屏幕上打印出J-1→J-2→J-3→...→J-12→NULL。箭头像管道里的水流方向——从第一个节点流到最后一个,最后一个流到空。

栈。先进后出——像一叠盘子,最后放上去的先拿走。推入和弹出两步操作,时间复杂度O(1)。我在笔记本上画了一个栈,把十二个节点从J-12到J-1一个一个压进去,再一个一个弹出来。弹出来的顺序和压进去的相反。管道检修关阀也是这样——关阀要从末端关,关了最远的管才能关最近的。谁最后进来,谁最先出去。

队列。先进先出——像食堂打饭,先来先打。我写了一个队列程序,把支管的流量一个一个排进去,出队的时候按顺序算。排在前面的管先出水,排在后面的管等前面的出完了再出。和给水处理的沉淀池一样——先沉的先清,后沉的后清。

然后是二叉树。

书上说:二叉树的每个节点最多有两个子节点——左子树和右子树。根节点在最上面,往下分叉,越分越多,末端的叶子节点没有子节点。

我看了一个下午。从根往左走到底是一片叶子,往右走到底又是一片叶子。前序遍历、中序遍历、后序遍历——三种走法走同一棵树,走法不同看到的顺序就不同。前序先看根再看左再看右,中序先看左再看根再看右,后序先看左再看右再看根。

看到下午四点,窗外白杨树的影子拉到桌面上的时候,我愣住了。

城市管网就是一棵树。水源是根节点。干管是树干,从根节点分出来。支管是树枝,从干管分出来。末端的用户是叶子节点——没有子节点,只有水从这里流出。水从根节点出发,经过干管到支管,最后到达每一片叶子——每一个水龙头。

和二叉树不同——管网分叉不止两个方向,一根干管可以分出三根支管、五根支管。但原理是一样的:从根到叶,唯一的方向,唯一的路径。

我把笔记本翻到空白页。在左边画了一棵二叉树,在右边画了一张管网图。两幅图的骨架重合了——根对水源,干管对树干,支管对树枝。我拿红色圆珠笔在两幅图之间画了三条连线,把根连到水源,把树干连到干管,把叶子连到用户。

三条线画完之后,笔记本上出现了一个图:一棵树,一张管网,它们是同一个东西。

我看着这张图看了很久。链表是管网,栈是关阀,队列是水流,树是管网。所有数据结构都能在给排水里找到影子——代码和管道,不是两件事,是一件事的两面。


王强从上铺探出脑袋,看到我笔记本上的图。

"你这是画水管还是画树?"

"都是。"

他挠了挠头。指甲刮过头皮的声音在安静寝室里听得很清楚,沙沙的,像粉笔在黑板上划过一道。

"管网有点像一棵树——水源是根,干管是主干,支管是分支。数据结构里的二叉树也是树。只是一个在纸上,一个在书里。"

他听完之后沉默了三秒。然后从上铺翻了个身,弹簧架咯吱响。

"你们学给排水的脑子都这么怪吗?"

没接话。他已经翻到另一边去了,一只手垂在床沿下面晃,手心里的茧在日光灯下发黄。他明天有机械制图课,但他从来不复习——他说制图不用复习,手会记。手画过的线,眼睛可以忘,手忘不了。


陈默的电话是九月底打来的。

宿舍走廊的IC卡电话响了三声我接的。走廊里有人走过去,球鞋底在瓷砖上吱地响了一声。他说话比上次更短了,背景里有一种不同的声音——以前只有机器声,冲床和研磨的金属噪音;现在多了一层人的声音,远远的有人在喊什么,听不清喊什么但要整齐,声音朝一个方向走——那是组长在喊工号。

"我被提了组长。工资八百。"

"组长?管几个人?"

"管六个人。又是操作又是排班。师父推荐的——说我手稳,心细,行。"

他停了两秒。电话线上有电流的嘶嘶声,从听筒里灌出来,像一阵很远的雨。

"我给妈又寄了三百。"

"好。"

"忙。下次再说。"

咔。挂了。

我拿着听筒站在走廊里。听筒里的忙音嘟嘟嘟地响,每两声之间间隔很短——像心跳,但没有温度。走廊里没有人,灯光照着水泥地,在墙角画出一个长方形的亮区。我把IC卡退出来,十七块三变成了十四块二。电话费扣了三块一。

组长。管六个人。陈默从模具学徒到CNC操作到组长,用了五年。从三百到四百八到八百——八百块,在东莞一间厂房里管六台机器六个人。他想说的全在那两个字里——忙。下次再说。那三秒钟的停顿里有他不说的话——不说累,不说苦,不说"你怎么样"。只说数据:工资八百,寄了三百,管六个人。组长不组长他不提。他只说"手稳,心细,行"——师父说他行,他信了。


晚上从图书馆走回寝室。

九点的校园。路灯从白杨树的枝丫间照下来,把路面切成一块一块的光,黄叶子落在光里像碎金。踩上去是脆的,咔嚓一声,像打开一本书的书脊——书脊断裂的声音和落叶被踩碎的声音差不多。刚踩碎的那片叶子的碎屑粘在鞋底上,走几步又掉了,像踩过一段路又丢掉一段路。

路上遇到大一新生在搬行李。校门口停了两辆大巴,家长和学生挤在路边,蛇皮袋和行李箱在地上排成长龙。有个男生比我还瘦,拖着一个编织袋在台阶上卡住了——编织袋磕在台阶角上,他扯了两下没扯动,站在那里看着袋子发呆。旁边的家长在打电话,声音很大,在问宿舍楼怎么走。路灯把新生的影子拉得很长,影子从台阶上铺到路面上,像一条刚从水里捞出来的绳。

我走过去了。没有帮他。不是不想帮——一年前我也是那个样子,蛇皮袋卡在台阶上,谁也没帮我扯。能卡住你的东西,只能自己扯出来。那时候父亲帮我把蛇皮袋举上车顶的行李架,用绳子捆了两圈。捆完了他拍拍蛇皮袋,好像在拍一头牛的背。然后他站在路边,两只手垂在身体两侧,一动不动。

口袋里的蓝色钢笔在走路的时候碰着大腿一下一下地敲。从图书馆到寝室的路走了快一年了——一年级走的时候觉得长,二年级走的时候觉得短。路还是那条路,脚步快了。

到大二了。口袋里装着的还是那支蓝色钢笔,作文本还在枕头底下,三封信夹在课本里。给排水的课本越来越厚,代码的程序越来越长。笔记本翻开——左边是管道,右边是树,中间三条红线连着两个骨架相同的图。管网是树,树是管网,代码是遍历这两棵树的方法。

在笔记本最后一页写了一行字:

"大二了。管道是树。数据也是树。方向还在。"

白杨树的叶子还在落。一片黄的旋转着掉下来,落在路灯柱脚下,阴影里。踩上去,咔嚓。声音很脆,碎了就是碎了,不会再合回去。

前面寝室楼的灯亮着。617的窗户投出长方形的光,光落在楼下停着的几辆自行车上。自行车的轮辐在灯光里闪了一下——像代码运行的时候屏幕上闪的那一下。如果一切正确,程序运行到最后只留一个结果。如果有一处错误,程序停在半路,屏幕上跳出一串红字。

我走完了那段路。上楼。推门。寝室里的灯还亮着。