调 bug 的小女孩

富兰克林大楼的七楼一直是个神秘的存在。每天晚上十点钟之后,每一层楼的灯光都将逐渐消失,唯有这一层还在深深夜幕里独自释放着光芒,远远望去,就像空中楼阁一样。“那一层楼是做什么的啊?”有时,三五成群奔向夜生活的路人会这样问。“那里是程序员们工作的地方。”懂行的人会这样解释,“干这行的,bug 波谲云诡,需求变幻莫测,常覆三军。是故此地往往鬼哭,天阴则闻!”

今晚的七层楼却有些反常。平时充斥着键盘声与机箱风扇声的工作间,此刻却异常安静。几乎所有人都回家了,因为他们的新产品刚刚上线,也因为今天是平安夜——虽然没有人过圣诞节,但节日本来不就是一个公认的偷懒的借口么?

但是,角落处窗户边还有一个小女孩留在这里。一双洁白而纤细的手搭在键盘上,左手小指放在 caps lock 的位置,食指与中指看似摆得漫不经心,却笼罩了 f, b, n 三个按键——那是 Emacs 的战斗姿态。键盘的左边杂乱地堆着一摞 Intel 手册,右边是已经半凉了的咖啡,几滴咖啡沿着杯子滴在了曾经洁白的桌子上,但小女孩没有注意到,因为她双眼正紧紧地盯着屏幕,一动不动。如果不是偶尔的眨眼,人们或许会以为是入定的高僧。“调完这个 bug 我就回去。”当十二点的钟声响起时,小女孩这样告诉自己——而那已经是一个半小时之前的事情了。

这着实是个狡猾的 bug!顾之在前,忽焉在后。每当你以为接近真相时,事情却开始变得更加扑朔迷离。在一个小时前,小女孩忽然发现一处嵌套的循环语句写错了顺序时,她以为终于找到了祸根。但是对那处错误的修正,却似乎对程序正确性没有丝毫影响。“这不可能。”在无数次 make clean 依然无果后,小女孩陷入了迷惘。她呆呆地盯着屏幕上的那段代码,仿佛看久了,bug 就会自己跳出来举手投降一般。但最后投降的是小女孩,她觉得那块屏幕都在嘲笑自己。“再看一遍代码吧。”小女孩决定,“一定是哪处传参数时把指针的类型搞错了。每次都是这样。”

念念不忘,必有回响。就在刚才,小女孩终于锁定了一处错误——在一个本该传递指针的地方,她传进了一个指针的指针。“Gotcha!” 小女孩原本静止的手指忽地在键盘上跃动,犹如“银瓶乍破水浆迸”;寂静的工作间忽然被此起彼伏的按键声占领,好似“铁骑突出刀枪鸣”。但见小女孩“嘈嘈切切错杂弹”,工作间里”大珠小珠落玉盘“,转瞬间错误已被修复,测试程序已经运行。当第一组测试程序终于通过时,小女孩从座椅上飞跃而起,好像一个三十年不曾离开沙发的宅男,突然看到了自己心仪球队四十年来的第一个进球。

也许在外界看来,小女孩只是在电脑前静静地呆坐了许久,然后敲了几下键盘。然而只有小女孩自己知道她刚刚经历了怎样艰苦卓绝的斗争,只有她自己知道她刚刚如何用尽所有的智慧与力量击败了一个不可战胜的敌人。”果然是个关于指针的 bug!“小女孩说,神情就像战胜了阿瑞斯的雅典娜。啊呀!公孙龙说:“物莫非指,而指非指。“佛曰:”如人以手,指月示人。彼人因指,当因看月。“说的不就是这个 bug 么?此刻的小女孩,仿佛站在人类智慧的巅峰上高呼,跨越时空与人类先贤们遥相呼应。

但比起战神阿瑞斯,程序的 bug 更像九头蛇——砍下它一个头,又会有两个在它原来的地方长出来。小女孩的兴奋没能持续多久,因为很快她就发现,一个原本能够通过的测试,现在却失败了。看到这一幕的小女孩回到座位上,低下头,把脸埋在长发间许久,往漆黑一片的窗外望了望,起身冲了一杯新的咖啡。”既然已经这么晚了,就干脆再把这个 bug 调出来再回家吧。”小女孩想,“也许只要几分钟就能解决了呢。”

然而当小女孩再次回过神来时,已经是凌晨三点了。如果不是某路人声嘶力竭的歌声撕破了寂静的夜,小女孩不知道自己还会在代码中沉浸多久。“雨纷纷,旧代码 bug 深。我听闻,你还在码论文……” 一定又是哪个毕不了业的博士吧,听着那人唱歌的小女孩心想。由于这附近有所大学,这种故事总会在同事们的闲谈间出现。”博士易老,教授难封……“窗外歌唱的声音越来越沙哑,但此刻听来,却有种说不出的动人。

小女孩的思绪随着歌声飞扬,不知道为什么,想起了她的前男友。”封侯非我意,但愿海波平。”这是他们刚结识时他的 QQ 签名。在她的记忆里,他一直是一个浅薄,鲁莽,明明一无所长却对自己的伟大有着无与伦比的自信,明明一身毛病却喜欢处处指摘他人的人。无论从哪方面看,他都与她,或者她想象中的他天差地别,但当时的她却无可救药地迷恋上了他。也许是因为他的热情,也许是因为他的自信,也许还有些许原因是他长得挺帅,但那绝对不是主要原因。绝对不是。

她还记得曾有一次他对她说:“技术没什么用。技术学得再好,也不过是做一颗螺丝钉罢了。世界需要的是能够敏锐地洞察其走向,引领潮流的人,就像史蒂夫·乔布斯。最重要的是 vision!Vision, you know?” 上一次她听说他的消息,是来自朋友们的八卦,他似乎跟随他所谓的 vision,去做大家都在做的共享单车去了。

为什么想起了他?小女孩问自己。难道是后悔自己选择的道路了么?不会的。小女孩摇了摇头。也许在外人看来,小女孩所做的世界上最单调无聊的工作——每日对着同一张屏幕,望着天书般的代码。但小女孩知道,她所做的是也许世界上最执着于消灭单调的工作。在那方寸代码间的世界里,每天面临的都是一场全新的挑战,而每场挑战都如一次华美的旅行——数据与函数层层抽象,有若蒙德里安的风格画;多线程任务交相辉映,好似巴赫的赋格曲。

虽然程序中偶有 bug……或者说常有 bug……总有 bug,但那对线索条分缕析、对现象抽丝剥茧,逐渐还原真相的过程又何尝不是一种有趣的体验?小女孩深夜还留在公司,执着于那上万行代码间一个细微的 bug,除了有些许工作上的压力,以及或许她也没什么别的事情好做之外,也不正是因为她对这份工作的喜爱么?这世界上喜欢夸夸其谈的人何其之多,但小女孩知道,她才是在改变这个世界的人物……但,真的是这样么?还是说,她只是又一个一边固守在自己的舒适区,一边为自己辩解的平常人罢了?

“不,不要再胡思乱想了。”小女孩告诉自己。毕竟,她还有一个 bug 需要处理。可是它在哪里呢?小女孩的眼睛从程序的开头,扫到结尾,从一个文件,跳到另一个文件,但那 bug 始终温柔不肯,藏得太深。是哪处字符串操作出现了失误么?是某个对象初始化出现了问题么?还是某个资源忘了加锁了?小女孩望了望窗外,稀疏的夜空里织女星闪亮。小女孩捋起了袖子。可能性很多,但她有的是时间。

可是,渐渐地,小女孩发现自己迷失在了那循环语句间。她朝自以为正确的方向走去,却仿佛在递归调用里越陷越深。她伸出手来想要抓住什么,却发现自己的手握着铅笔在画另一只手,而那另一只手也握着铅笔画着她的这只手。远处,一个被咬了一口的苹果从树上落下来,落在翻开的一本书上。一阵风吹过把书本合上,再翻开时里面却只剩下了一只飞虫。小女孩的大学同学们忽然出现在她面前,其中也有她的前男友。他们一个个都成了百万富翁,并大声嘲笑程序员们开发出了人工智能后,首先被人工智能取代的就是程序员。小女孩知道这一切都不是真的,所以她掏出笔记本来想要从代码间找出 bug 来。她疯狂地修改代码,于是天变成了紫色的,山变成了粉色的,草变成了红色的,但她却怎么也无法把那些笑声消除掉……直到她按下了关机键,世界才慢慢沉寂下来。

第二天早上,程序员们陆续来上班时,他们发现了睡倒在办公桌上的小女孩,右手边还放着一杯已经凉透了的咖啡。当她的同事打开代码的提交记录后,会发现几处巧妙的修改,修复了许多产品中已知的顽固 bug. “好一个聪明的小女孩。”有些同事会这样想。但没有人会去叫醒她,也没有人太过在意,毕竟这样的事,在公司里,天天都会发生。