百度的园区在西北旺——玻璃幕墙的大楼,七八栋,中间有草坪和人行道。草坪修剪得齐整。楼门口的保安穿着制服,胸口别着工牌,工牌上有照片和名字。进出门要刷卡,卡是RFID的,靠近读卡器嘀一声,闸机的金属翼片收回去,人就能过。
我站在楼门口。三月的北京还很冷——不是哈尔滨那种冻到骨头里的冷,是干冷,风从西北方向刮过来,带着沙。沙打在脸上细碎地疼,像砂纸磨。嘴唇干,舔一下更干。
工牌是HR刚发的。塑封的,白底蓝字:"林之宇 算法工程师"。照片是早上在HR办公室拍的,白墙当背景,我站直了看镜头,表情比平时还木。摄像头亮了一下红灯——咔——快门的声音很短,像鼠标点了一下。
算法工程师。
不是给排水工程师。
把工牌别在衬衫上。别针穿过布料的时候扎了一下手指,不疼,但出来了一小滴血。我用另一只手擦掉。
卫生间。镜子里的自己比两年前瘦了一点——设计院的两年没让人胖,画图费眼睛,算数费脑子,食堂的饭不好吃。脸颊的骨头比以前明显了。衬衫是白的,领口扣到了第二颗。工牌别在左胸口,蓝字在白衬衫上很醒目。
算法工程师。五个字。给排水工程师也是五个字。字数一样,内容全换了。给排水工程师——管子、水压、流量、坡度。算法工程师——代码、数据、复杂度、迭代。五个字换了四个,只留了一个"工程师"。
工程师——做事的人。不管做的是管子还是代码,都是做事的人。
钢笔还在衬衫口袋里——右手边,工牌在左边。笔帽上的裂痕和透明胶在镜子里看不太清楚,但手摸得到,胶带的边翘了一点。设计院的两年我每天握着鼠标画图,钢笔用得少了,但每天还是拿出来,在笔记本上写几行。写的不是管网数据了,是想法,碎片,零散的字句。
洗手。水龙头是感应的——手伸过去水就出来了。水流从龙头出来,落进不锈钢水槽,打了旋,从排水口流走。感应水龙头不需要人拧——设计院的水龙头是手拧的,拧开哗哗响,关上要拧紧,不紧就滴水。滴、滴、滴——每两秒一滴,落在不锈钢水槽里,那个声音我在设计院听了两年。百度的水龙头不滴水。水流出来,用完,走掉。没有人关心水从哪来、往哪去——和设计院不一样。在设计院我算的就是水从哪来、往哪去。
擦干手。纸巾从纸巾盒里抽出来——一次性的,用完扔掉。设计院的卫生间用的是布毛巾——公用的,挂在墙上,灰白色,不知道多少人擦过手。百度的纸巾白得刺眼。两个地方的差别从这个卫生间就能看出来——一个是省的,一个是花的。省的和花的不是同一种活法。
走出卫生间。
工位在B座七楼。开放式的办公区——没有墙,没有隔间,一百多张桌子排成方阵,每张桌上两台显示器、一个键盘、一个鼠标、一堆外卖盒子。外卖盒子摞了三四层,红油和米粒粘在盒壁上,筷子横在上面。红牛罐子立在显示器后面,一排,空的,铝皮捏瘪了几个。还有可乐罐,也是空的。
空气里有股味道——外卖的油、咖啡的苦、人体散发的热——三种味道搅在一起,闷。比设计院闷。设计院的空气是环氧树脂味加日光灯的臭氧味——不好闻,但至少是同一种味道,闻久了就闻不到了。百度的味道是混的——外卖味每天不一样,今天麻辣明天酸汤后天黄焖鸡,闻不到习惯。
我的位置在靠窗那排。坐下。椅子是转椅,坐垫被前任坐出了一个凹——人体的形状印在海绵里,腰的位置凹得最深。桌面被擦过,但还是有一层薄薄的油——手指摸上去涩的。摸完手指有油,和摸铸铁管的沥青防腐层一样——黑色、粘、洗不掉。
打开笔记本电脑。百度的IT已经装好了环境——Linux系统,代码仓库的权限开通了,文档库可以访问。终端窗口打开——黑色的背景。绿色的光标在左上角闪烁。
手指放在键盘上。很久没有这种感觉了——设计院用鼠标画图,用的是右手食指和中指。写代码用十个手指,键盘上飞,像弹琴,但不是琴,是逻辑。从手指到键盘到屏幕到编译器到机器码到CPU,一层一层,每一层都有自己的规则。
第一行代码:
回车。光标跳到下一行。和八年前在高中机房写第一行QBASIC的时候一样——先声明,后执行。宋老师给的那张软盘上就是从这一行开始的——#include <stdio.h>。那时候是C,现在是C++。语言换了,开头仍然让我觉得熟。
然后是函数签名、变量声明、循环体、返回值——代码一行一行往下长。屏幕上的字不再是实验室里那套管网程序,但手指敲下去的时候,仍然先想输入,再想处理,最后才想结果。
技术负责人叫刘洋,三十出头,圆脸,戴眼镜,说话快——不是赵启明那种有条理的快,是省时间的快,每个字之间没有空隙。他的工位上有三个显示器——两个跑代码,一个跑监控。监控屏幕上密密麻麻的绿字,和服务器日志一样。
"你负责路线规划的优化模块。Dijkstra。"
"Dijkstra。"
"对。最短路径。"他在白板上画了几个点和几条线——点的位置不精确,线画得歪歪扭扭,但结构是清楚的。点和线的关系才是重点,形状不是。"这是路口,这是路。每条路有权重——距离、拥堵系数、限速。用户输入起点终点,你要在几百毫秒内算出最优路线。"
几百毫秒。在设计院算一组水压要跑半小时——遗传算法迭代几千代,适应度才收敛。几百毫秒——这是实时的。水龙头打开的瞬间水就来了——没有人愿意等三十秒才出水。用户也是——输入目的地之后要立刻看到路线。
"数据量多大?"
"北京的路网,六万多个节点,十几万条边。"
六万多个节点。我在设计院画的管网最多十二个节点。六万对十二——五千倍。五千倍的数据量,五千分之一的时间限制。
"Dijkstra我写过。管网优化用的。"
"管网?"他停了一下,看我。镜片后面的眼睛亮了一下——不是惊喜,是好奇。"给排水的管网?"
"嗯。"
"一样的。图论嘛。"他笑了一下——很短的笑,嘴角动了一下就收回去了。"节点和边,权重和路径。给它一张图,它就找路。"
相似的算法。他说得很随意,像说"同一把扳手"。但对我来说不一样。给排水的管网里流的是水,路网里走的是车。水不走回头路,人会。
但算法不管这些。算法只看节点、边、权重和路径。给它一个图,它给你一条最短路。
下午四点。窗外的北京——环路、高架桥、写字楼、居民楼——灰蒙蒙的一片。三月的北京天不蓝,空气里浮着沙。沙是内蒙古来的——西北风把沙吹过来,沙在天上飘了一天,落在玻璃幕墙上变成灰。
站在窗前往下看。十五楼。底下的马路是一条灰色的线,线上有车在走。从高处看车很小,白的黑的红的灰的,被路推着走,被灯拦下来,被弯道分到不同的方向。
管网的俯视图——我在CAD上画过无数次。蓝线是给水管,细线是排水管。从水源到干管到支管到用户——从大到小,从粗到细,从高压到低压。
路网的俯视图——现在我看到了真的。主干道,支路,路口,红绿灯,都在窗外。
管网和路网。
我把手伸进衬衫口袋摸了一下钢笔。笔帽的裂纹硌了一下指肚——凉的。
笔记本还在手提包里——翻开到那页:"管网→算法→?"问号后面还没填。但现在我可以在问号后面加一个词了:管网→算法→路网。不是答案,是一个新问题。
坐下。打开终端。继续写代码。#include <iostream>的下一行是什么——int main()。主函数。一切从这里开始。
算法工程师的第一天。玻璃楼、外卖味、转椅、两个屏幕。和设计院的九张桌子、日光灯、蓝图完全不同。但算法没变——Dijkstra还是Dijkstra,节点还是节点,边还是边。换了一层皮,骨头是同一副。
窗外天暗了。北京的灯亮了。路网在窗外动,算法在屏幕上跑。