码踪侠影(0-2)

(本文是之前我在人人网上写的一系列小说,尚未完成,先把目前写的贴到这里吧)

 

 

“你知道吗?我的孩子,我们对主宰这个世界的神秘法则几乎一无所知。” ——教皇儒略三世

(本故事纯属胡扯,如有雷同纯属巧合)

雷哥站在软院一楼的圆厅中,腰沉三寸,足踏两仪,双手自然地搭在身体两侧,不知情的会以为他要跳骑马舞,实际上这是一种极其高深的架势。《五轮书》 里管它叫“无构之构”,《笑傲江湖》里说这是“无招胜有招”,我却知道,这乃是雷哥从C++的虚函数里悟出来的架势,就叫做“虚函数之阵”。

雷哥左面的人身长八尺,着西装革履,戴玄色墨镜,望之若雨果・维文,只是右手拿着一杆长枪,看来与他的一身装束极不协调。雷哥右面的人则是后面弯腰 驼背,前面大腹便便,头上的大胡子和长发散乱地纠结在一起,看来似乎想要模仿Richard Stallman的打扮,却整得神形两不似,只像是屌丝;更蛋疼的是,现在明明是大冬天,这家伙还是穿着一身油迹斑斑的T恤和短裤,让人不禁怀疑他没别的 衣服了。而在雷哥的正前方,则站着一个老头子,一头白发,一袭白袍,无风自动,像极了《魔戒》里的白袍甘道夫。

只听“hello world”的一声大喝,雷哥左侧的雨果・维文忽然出手,一杆长枪以迅雷不及掩耳之势刺向雷哥。只见雷哥不慌不忙,觑准了一个时机,转身移动到枪杆的侧 面,右手轻轻一带,枪尖便朝另一侧刚刚冲过来的Richard Stallman冲了过去,后者一个“冲”字诀刚刚发了出来,见状马上一个驴打滚才堪堪避开,其状狼狈不堪。不过这二人也不相互埋怨,四目一个交会,立马 又一齐冲向了雷哥。

我站在雷哥后方的位置观察着战局,与白袍甘道夫相对而立。只见雷哥虽然以一敌二,却丝毫不落下风。原来“天下武功,唯快不破”,雷哥的武功全都领悟 自C/C++,后者本就在现代编程语言中堪称速度上的无双王者;再加上雷哥这人平时写程序对效率的追求极其苛刻,数据能放在栈里的就不放在堆里,如果带上 汇编优化的三元表达式比if语句更快那就绝不用后者,这种追求在他修炼了传说中的神功秘笈CSAPP后更是进入了一种化境。

反观他的两个对手,速度上明显已经输了一筹。

那雨果・维文的功夫显然来自Java——Java本是为兼容多种平台设计的“一次编译,处处运行”的编程语言,所以从中领悟的功夫自然也是老少咸 宜,即使身着西装革履,也一点不影响招式的发挥;但另一方面来讲,即使施招者穿运动服,也提升不了多少速度——它的速度只能是这么慢了。更重要的是,由于 Java这东西号称“完全面向对象”,所以雨果・维文的每一招——即使是一个“hello world”——都不得不先封装成一个对象,然后出招;这样的后果就是,由于每一招招式都封装了起来,招式与招式之间相互承接的部分就会显得相当生硬,唯 一的办法就是使用各种设计模式来补足——这些设计模式虽然圆滑了招式之间的承接,却进一步降低了其速度。再加上这位雨果・维文似乎对设计模式的掌握还不够 充分,在应付雷哥凌厉的出招时便显得左支右绌。

而那位模仿Richard Stallman装扮的仁兄招式被我观察了许久,才发现并非来自Emacs Lisp,而是Perl。因此他的一招一式都让人搞不明白他到底想干什么,但有时候突然之间那些像疯人跳舞的比划就变成了妙不可言的一击,这着实给雷哥造 成了几次险境。幸而这位Richard Stallman似乎经常稍后自己也理解不了自己的比划是什么意思了,有时前面刚刚一招逼得雷哥暴露出五六个破绽,下面他却忘了该用哪一招;更多时候干脆 比划着比划着,他自己就看不懂自己在比划什么了。幸而如此,即使险象环生,雷哥也能很快从防守之势夺回攻击的主动权,以一敌二而不落下风。

但现在的形势无论对我还是对雷哥来说,都一点也不乐观。因为对面武功最高强的无疑是目前为止还没有出过手的白袍甘道夫,而一但他出手,无论是攻击已经被两 个对手缠住的雷哥,还是直接制服傻站在一旁手无缚鸡之力的我,都可以轻松取得胜利。但奇怪的是,这位甘道夫却只是气定神闲地站在哪里,开始还注视着这场战 局,后来竟是干脆闭上了自己的双眼,任由自己头上的白发飘飘,不知道是在等待着什么,还是在拍摄飘柔的洗发水广告。

看着眼前的雷哥正在力搏二人,我竟然禁不住走神了。我忽然觉得最近几天来发生在我身边的一切真是神奇。数天前我还在实验室里傻盯着面前的笔记本屏 幕,为自己设计的算法被纯随机算法给打败了而感到深深的沮丧;现在我却站在这里看着一幕幕似乎武侠小说里才会出现的情景,陷入这样一个悬疑小说里才会出现 的困境。如果教几天前的我去想像数日之内我的人生观、世界观和价值观会发生翻天覆地的变化,我一定不会相信,但它确实发生了。

这一切应该源于几天前的一个夜晚。因为之前我一不小心拿了点奖学金,橘子和带狗便抓住我要我请客——其中橘子更是不远万里地从同济赶来交大,就为了 吃一顿饭。吃饭的地点是学校外面的海京阁,席间自然是橘子又在谈论谁又拿了哪里的offer之类的话题。不料在餐桌上已渐杯盘狼藉的时候,橘子突然住口不 言,气氛便突然间变得凝固了起来。

带狗为了活跃气氛,便告诉我他又买了什么游戏。正当我要进一步询问这个游戏的细节,突然间我感觉到身旁有一阵狂风吹过,随后再定睛一看,只见带狗已 经从他的座位上消失,站到了餐厅的门前,右手还举着他的筷子,仔细一看,中间竟然夹着一颗子弹。但见带狗缓缓地将拿着筷子的手放下,朝门外大喝道:“哪里 的大胆狂徒?站出来!”

我还没来得及对这一切表示惊讶,又一阵狂风吹过,只见橘子已经冲出了餐厅的门外,紧接着我听到外面发出了一声尖叫。于是我马上也离开了餐桌,跑到了餐厅的门口,只见橘子已经抓住了一个人,把他的胳膊反拧在背后,想必刚才那一声尖叫就是因为这事。

“我已经注意你们很久了,还有六个人,都一齐出来吧!”橘子反拧着那个人的胳膊,却朝向马路的另一头喊了起来。当时目睹这一幕的我不禁想要感叹,如果不是因为橘子本人实在有点太没气质,这一段话本可以喊得很霸气的。

只见这句话话音刚落,马路对面忽然出现六个人,排成一个横排一齐横穿马路走了过来——奇怪的是,这时候的马路上好像看不到一辆车经过。这六个人走到 马路的这边,又一齐停了下来,然后他们最左边的一个人——似乎是他们的头领——向前跨了一步,向着橘子和带狗二人抱拳说道:“没想到这里竟然还有两个程序 员,真是失敬。”

带狗皱了皱眉头,问道:“你们也是程序员吗?”

“是的。”对面为首那人答道,“既然大家都是程序员,有话我就直说了。不是朋友,便是敌人。这位姓李的同学的性命我们要了,你们是要交个朋友呢,还是……”说到这里,他看了看我(我不禁打了个寒噤),又故意转身看了看他身旁的另外几人,“与我们兄弟七个为敌呢?”

“你们七个都是这样的水平吗?”橘子看着被他制服的那个家伙,说道,对面为首那人立刻面色一变。

“废话少说,接招吧!”趁着那人面色将变未变的一刹那,带狗突然出手,一掌把他打出了十丈远,然后顺势从侧翼向剩下的五个人杀了过去,对面猝不及 防,阵脚大乱。原来带狗当初是OI出身,一生刷题无数,当年在vijos曾牢据榜首且不提,据说他刷过的题都够编一套四库全书了;所以他刚看见题目便可以 开始写程序,这抢占先机的功夫自然不是其他普通程序员所可以比的。而刚刚带狗攻击对面为首那人的一招,乃是他的独门绝技之一“贪心算法”——据说某年 NOIP的某道题,大家用贪心算法来做的都只拿30分,但同样用贪心算法的带狗却拿了100分,原来他的独门贪心算法可以另辟蹊径,故得以以满分笑傲群 雄。而在带狗击飞对方为首那人以后,剩余的五个人正好在他面前排成了一条直线,这时他便把他在微软实习时候学会的台球技术融入了他的贪心算法之中,这一杆 子下去,导致对方在一瞬之间竟然全部被击倒在地。

当然,这其中的奥妙是我在后来听他们讲述才搞明白的,而在当时我看到的只有电光火石地一闪,然后对方六人全部倒在了地上。

“看来都是这样的水平。”仍然站在一旁扭着某个人胳膊的橘子笑了起来。

“可恶,”对方那个被击飞的首领还活着,他缓缓站了起来,“看来非要给你们点厉害尝尝了。兄弟们,‘七周七语言’之阵!”说罢忽然间又是电光火石地 一闪,对方的七个人全都站在了马路中央,似乎摆成了什么奇特的阵法——甚至包括橘子之前制服的那位,也不知道怎么回事挣脱了橘子的掌控。

“有趣。”带狗这句话还没说完,就冲进了对方七人摆出的阵势之中。因为带狗这种人见到题目就来劲,所以这么说实在不足为奇,这么做其实也是意料之中了。

但意料之外的是,虽然面对的是同样的对手,这次带狗杀进去不久,却渐感不支了。原来这“七周七语言”之阵,是国外一位叫做Bruce A.Tate的大牛发明的阵法,阵法由七人分持七种编程语言构成,这七种语言分别是:Ruby, Io, Prolog, Scala, Erlang, Clojure和Haskell。阵中的每个人分别施展一种编程语言对应的招式,虽然这些招式其实都只是对应语言的入门级别的技巧,但却包括了这些语言各 自最具特色的几个特性,把它们组合在一起,其威力甚至远远超过兰彻斯特平方律。

于是深陷于此阵法中的带狗便会面临这样的窘境:这边刚刚和元编程过了几招,那边突然杀出来函数式编程;本来面对函数式编程就已经有些不适应的带狗, 再碰上逻辑式语言更难免阵脚大乱;最蛋疼的是,那边两个人的招式袭来,你本以为这两个都是你已经有些熟悉了的函数式编程语言,不料转眼之间,一个变成了面 向对象的,一个却施展出了并发之术;而且这个阵法里除了一帮子近战的,竟然还有一个纯粹的远程部队Haskell,不断口中念着各种数学名词施展各类法 术。眼看带狗即将不敌,橘子皱了皱眉头,也冲到了战阵中去。

然而即使橘子加入战局似乎也无法挽回败势——尽管带狗得以多了些时间来喘息,却始终不能从狼狈应对之势转变为进攻之势,而另一边对方的战阵调整,使得橘子也渐渐落入下风。眼看着这二人就要被这阵法围杀,我却因为自己不会一丁点武功而只能傻看着干着急。

不料忽然之间天空中劈下来一道奔雷,正巧击中了对方的一员,后者随即变得烟消云散。交战的双方立刻都呆住了。定睛一看,原来从天上劈下来的这样东西竟是个公文包,而这个公文包不知为什么我觉得有一些眼熟。

“何方妖孽!凭尔等道行,也敢冒充程序员!”突然间一个熟悉的声音在我耳边响起,我转身一看,韩骏韩总不知道什么时候已经站在了我的身边,虽然在斥 责对手,但一张脸却笑得跟弥勒佛似的——难怪,这世界上能把这么霸气的一段话说得像开玩笑的人实在也不多了。刚才那个公文包显然是韩总一直带在身边的,怪 不得我觉得眼熟。原来刚才韩总通过飘在天空中的一朵Azure云获取了一个雷击的函数,用C#的delegate委托给了他的公文包,然后奇袭了对方。

“七周七语言”的阵法失去了其中任何一个角色,便再也构不成一个完整的阵法了。因为这剩下的六个人各自对自己使用的语言其实只是略知皮毛,就比如那 个用Haskell的大法师,经常念个咒然后发现这个咒没法编译通过,其实是对Haskell的类型系统还没能理解清楚。于是接下来韩总运起C#大法,与 橘子、带狗配合起来,砍瓜切菜般地便扫荡起了对手。橘子看韩总用起C#,干脆自己也用起了C#。那边韩总看橘子也用C#,就架起了一个WCF想要施展组合 技,不料橘子却好像没看见一样自顾自地先一招二分匹配,再一招网络流,耍得不亦乐乎。原来橘子这人其实用什么语言都一样,语言特性一向是他无视的对象。因 为对手太弱,不一会儿三人便如风卷残云一般把剩下几人也给打败了。

“幸好他们不是真正的程序员,否则今天不可能赢下这一场。”打完这一仗之后,韩总捡起他的公文包,又望了望天边的那朵Azure云,感叹道。

“你说他们不是真正的程序员,那他们是什么人?”带狗问道。

“他们根本不是人。”韩总回答。

“那他们是……?”

“宏。”

橘子和带狗交换了一个疑惑的眼神。

“喂喂喂,”在一旁傻站着的我突然反应了过来,“这这这……这到底是怎么回事?你们怎么突然之间就会武功了?他们那群……东西……又是怎么回事?”

橘子、带狗、韩总三个互相看了看。

“这个,说来话长……”

 

 

世界上有10种,一种是懂二进制的人,一种是不懂二进制的人。

(本故事纯属胡扯,如有雷同纯属巧合)

“被……被神选中的人!?”我惊讶的喊声引得周围的路人带着诧异的表情纷纷侧目。带狗连忙示意我噤声。

“没错,每个程序员都是被神选中的人。他们的血液里流淌着0和1的信号,他们天生就可以用可计算理论来思考问题。不同于碌碌无为的凡人,他们生来就知道自己来到这个世界上的目的,他们都知道自己是来拯救这个世界的。”韩总一边继续走一边压低声音对我解释道。

我是一名普普通通的软院学生。这一天的白天我还坐在实验室,傻看着自己的笔记本屏幕拍了一天的代码;这天晚上,我却亲眼目睹了原本我以为已经相当熟 悉的三位朋友,各自施展出我只在读武侠和奇幻小说时想象过的各种武功与法术,打败了六个自称想要来取我性命的家伙。我亲眼看到平时举动都非常正常的带狗用 筷子夹住了一颗子弹,我看到以拖延症著称的橘子在一瞬间从餐厅飞跃而出,并制服了一个对手,我还看到那个整天笑得跟弥勒佛似的“闵行股神”韩总用雷电劈死 了一个人——不,他们还告诉我,那些对手不是人,而是……宏?

“这到底是怎么回事?”目睹了这整场战斗的我满腹疑惑。

“这个,说来话长……”橘子、带狗、韩总三人互相看了看对方之后,韩总决定先开口,“我们先回你的宿舍,边走边说吧。”

“不过,好像你得先把餐馆里的帐结了。”橘子若无其事地说道。

“他们会再来吗?”我站在餐馆的前台,一边结帐一边心有余悸地望着门外。刚才那些人被击倒以后全都像烟雾一般消失了,我不能确定他们是不是真的死 了,我也不知道会不会有更多的人来……取我性命。然而奇怪的是,尽管刚才发生了如此惊世骇俗的一幕,餐馆里其他人的脸上我却找不到一点惊讶的表情。

“虚拟化技术。”带狗看出了我眼中的疑惑,对我解释道:“那些家伙在伏击之前在这里搭建了一个虚拟机,你和他们都被放到了这个虚拟机当中,其他人看不到这里的一切。”

“但是有经验的程序员可以辨别出这些。”橘子接道,“所以我和带狗能够在他们攻击之前就察觉到这些,然后hack到这个虚拟机当中。”

“幸好他们实在太弱了,”带狗继续说道,“这年头拿空密码就能access的地方不多了。”

“我也是碰巧路过这里,察觉到这里有违规建立的虚拟机,知道一定有什么蹊跷,决定进来看看。”韩总说。

说话之间,我已经把账给结了,我觉得餐馆的这些人听到我们的对话,也会以为我们是在谈论什么电子游戏吧。

走出餐馆,我们发现带狗刚才在打斗的时候不小心把自己的钥匙弄折了,我们只好在刚刚在大街上打完一架后,像偷车贼一样把他的车抬回去。走在回宿舍的 路上,橘子、带狗和韩总互相做了些自我介绍,他们虽然暑假都在微软实习过,可能还一起打过几盘台球或桌上足球,却还没多少机会互相认识。

“你们还没回答我,他们还会再来吗?”看到他们还没有回答我前一个问题,我只好自己又问了一遍。

“可能会。”带狗说,“但等你到交大就安全了。”

“交大的防火墙可不是摆设。”韩总说。

“果然是世界一流大学。”这种时候橘子竟然还能一脸淡定地开玩笑。

“哦……”显然他们的回答根本不能为我解惑,但我急着抛出下一个问题,“这一切到底是怎么回事?”

“唉,真是头疼。看来我们只好告诉你了。”橘子说。

“不管你以前听过多少种对这个世界的理论或解释。下面你听到的才是真相。”带狗说。

“世界上所有的程序员都是神选中的人。”

接下来便是文章开头所出现的情景了。

根据他们的解释,世界上至少存在两类人,一种是凡人,一种是程序员(“实际上我们把凡人称作……麻瓜。”橘子说)。凡人可能会在他的一生中不断地思 考他人生的目标是什么;但程序员则不同,他们自出生之日起就知道他们的目标是什么,这中间他们可能会因为沉溺于凡人的生活而短暂地遗忘掉这些使命,但一旦 让他们接触计算机,接触编程,他们便会立刻回想起这一切。程序员称自己为被“神”选中的人,但他们所说的神却并不是宗教意义上的神这个“神”的概念更像是 希腊哲学里的“逻各斯”的概念,和古代中国哲学中所说的“道”。

一个程序员不需要多少教学就能理解计算机的基本工作原理;他在接触编程以后很快就能掌握如何用编程来解决实际问题——因为这和他的思维方式本来就是 一致的。对他来说操纵计算机就好像凡人操纵自己的手和脚一样简单自然。也正因为他的思维与计算机程序犹如一体,他能够跟轻松地把程序用到自己的身体上来, 突破凡人认为不可思议的物理限制,施展出各种神奇的武功与法术。

然而,这件事实一直以来只是程序员间的不传之秘。原来每个程序员天生便绑定了一个协议,这个协议要求他们除非特殊情况,不得对凡人透露这个事实。因 此尽管存在着无数有关程序员的段子,凡人并没有真正意识到世界上还有程序员这个物种的存在。当然,前面之所以说“至少存在两类人”,是因为程序员们也不能 确定世界上是否只有这两类人存在:程序员界普遍相信这个世界还有数学家、物理学家等不同的物种。刚刚他们发现对我透露事实的限制被解除了,显然刚才就属于 他们协议中的“特殊情况”,所以他们才决定告诉我真相。

不过,他们告诉我的这些事情中最颠覆我三观的,也是最让我无法接受的事实就是,我不是一个程序员。

“胡……胡说八道,我学编程学了这么多年!你们是什么人!你们凭什么忽然跑出来说我不是程序员!”我指着带狗怒喝道,“我是NOIP一等奖!”这句 话刚说完,我突然想起带狗是NOIP满分,“呃……我的意思是……我本科期间在软院拿了国奖!”然后我又突然发现我现在指着的韩总也是国奖,“我…… 我……我直升了本院的研究生!”擦,此时我指着的橘子好像拿了Google美国总部的offer。“我的意思是……我……我……我……我靠!”

他们也告诉我,这个世界上以为自己是程序员的凡人还有很多。

“比如有位姓谭的老先生,竟然写了一堆《BASIC语言》《C程序设计》之类的书,其中错误百出,颇让程序员界苦恼了一阵。据说一些程序员因此又写了一些为他的书纠错的书,每一本都他的书要厚……更糟糕的是,国内写这种漏洞百出的书的可不止谭老先生一个人。”带狗说。

“你知道吗?我们院那个被称作‘天神’的田生,其实也不是程序员。程序员的思维方式通常是比较相似的,比如,他们笑点都一致地比较歪……”韩骏说 道,“而世界上只有程序员有这种思维方式。但,呃,但这个田生的思维方式实在太奇特了,这种思维方式竟然使得他也能掌握高超的编程技术,而且写出来的代码 风格和程序员、凡人都不大一样……我们有人怀疑这可能是一种新物种……其他自以为是‘程序员’的凡人基本上都达不到这种境界的。”

“我们统称这类人为‘伪程序员’。”橘子说。

后来,我也从一开始的坚决不相信,慢慢地接受了他们说的,我不是程序员这么一个事实。但这里还有一个非常关键的问题没有解决。

“那……那些人……呃,或者像你们说的,宏。他们为什么要……要……要杀我?”

此时我们已经赶回了学校里我的宿舍,因为我的舍友全都跑出去实习了,我们四个人便一人一把椅子坐在我的宿舍。听了我的问题,他们三人又互相看了一眼,然后橘子坦诚地说:“这个,我们也不知道。”

“呃,不过我们确实有一些推测。事实上,程序员界早就在对待伪程序员的态度上存在着分歧。”带狗说,“一派人认为程序员和伪程序员之间应该和平相 处,而另一派,想必你也猜到了,他们认为程序只能交给程序员来写。在后面这一派中,还有一类最激进的,他们主张‘消灭伪程序员’和‘程序员统治世界’。虽 说如此,但他们之前还从来没有行动过。”

“你的意思是……这一派的人……想要消灭伪……呃……想要杀我?”我觉得自己的嗓子有点干。

“也不像。刚才我发邮件问了很多程序员,他们附近都没有出现这类‘宏’跑出来杀人的情况。显然他们的目标仅仅是你一个人。”橘子说。

“会不会你的邮件被监听和篡改了呢?”我弱弱地问道。

“我们的邮件都是用PGP签名和加密的。”橘子的回答使我大吃一惊,我一直以为他不懂这些东西的,而他看我的眼神就像是在说:“你以为哥的Google offer真是运气好拿到的吗?”

所以现在的情况是,没有人知道为什么那些“宏”会突然跑出来要取我性命,而目前看来,我们(其实是他们)也不知道如何查出那些宏的来源。幸而交大的 校园,有一个相当经得起考验的防火墙保护着,接下来的两天,我都没有再遭遇过任何袭击,而我虽然也为此失眠了一个晚上,后来也渐渐从变故中恢复了过来,开 始投入到原本的工作中去——直到两天后的晚上。

那天我从实验室出来,正好碰上了微软实习下班回来的韩总,一时兴起,便决定一起去学校里新建的第六餐厅尝尝鲜,不料却又碰上了两个杀手。

“眼睛不要向后看,一直往前走。”刚刚走道餐厅的中央,韩总突然压低声音,非常严肃地对我说。

“发生什么了?”我一边询问一边忍着不向后回头。

“那边有两个宏,来者不善。”韩总说。

“你……你打得过他们的吧?”听到这句话马上我腿就软了。

“打得过,但……我需要先争取一些时间。所以不要让他们注意到我们,不要回头,一直往前走。”韩总依然很严肃。

“为……为什么?”我拼命才维持着前进的步伐。

“你还记得我的功夫是来自C#吧……”

“嗯……那又怎么了?”

“呃……我需要一些时间来启动Visual Studio……”

听了这话,我只好哭笑不得地继续往前走。不料那边的两个宏,似乎注意到了我们的反常举动,决定立刻进攻,而这时韩总的Visual Studio现在还没有打开……

“砰!”忽然一声巨响,我连忙回过头来,只见两个黑衣墨镜的人痛苦地躺在地上,而这两个人和我们中间,伫立着一个瘦小的身影。尽管只能看到背影,但 一看到那件衣服,我就知道是王佳骏来了,那可是我这辈子只见他穿过的三件衣服之一!王佳骏!那个拿手机挂GitHub的男人!他随时随地都准备着用代码来 搏斗!

“今天下午我们实验室的主机被SYN Flood攻击的时候我就觉得不对劲。”王佳骏说道,“等你一走,攻击就停止了,这更加让我觉得事有蹊跷,所以刚才一路跟着你走了过来。第六餐厅是学校刚建的,这一块的防火墙还没部署好,使得这些家伙有了可趁之机。”

那两个黑衣人似乎还想拼命一搏,只见王佳骏顺手抄起了背包里的一个开源软件,轻轻一抖,变成了一根少林棍,一棒子抡下去,两个黑衣人便烟消云散了。而这时,韩总的Visual Studio也启动好了……

经历了这件事情之后,在我的强烈要求下,韩总和佳骏决定尝试教我如何把程序转换为武功。“既然你们的武功都出自程序,我也学了这么多年程序,凭什么 你们可以施展功夫我却不可以!更何况以后如果我自己一个人走在大街上,再碰到这些想杀我的家伙怎么办!”但这一尝试坚持了不到一天,便在他们二人“朽木不 可雕也”的叹息声中宣告失败了。不过,虽然他们的教学没能让我成功把程序转换为武功,自那天之后,我却可以看懂他们的招式了!有些时候我甚至可以指出他们 招式中的漏洞——尽管我依然无法自己去攻击那一点。这种事情说来玄妙,更违背我对这个世界的理解,但既然我的三观已经被刷新过多少次了,想想也不多这一次 了。

然而我们三个都还怀有一丝幻想,那就是有朝一日我能开窍,但这一天来临的可能性,伴随著时间的流逝,却从来没有增加过。所以现在我生活中的一大乐趣 便是看这些程序员之间过招了,韩总和佳骏也总是以教学为名在我的寝室里对战——因为在交大建设虚拟机的限制比较严,他们只好在这么一个促狭的地方比试,以 免被他人看到。

在他们的过招之间我看出来韩总身怀C++和C#两套招式——但他的这两套招式却都是以Visual Studio为内功心法,这就导致他开战前总需要很长的等待时间。因为韩总最近在微软实习,所以C#用得越来越多,C#这东西是用JIT编译器编译的,所 以他的每招招式第一次出现会很慢,后面用起这些招式却可以快上许多;所以想要攻其不备,就要在合适的时机诱导他使出之前没有出现过的招式。

王佳骏则往往以C++这一至刚王者应战,不过由于他的内功心法来自gcc和vim,启动速度自然比韩总要快上许多;但因为C++这东西实在太蛋疼了,有时候一套连招放得正爽突然间就segmentation fault了,这时候的佳骏完全是空门大开。

对韩总来说,千军万马中取敌军bug犹如探囊取物。原来他在微软做的是Software Development Engineer in Test。据说他刚开始实习的第二个星期,老板就给了他包含数个文件、每个文件数千行、没有注释、没有文档的程序,并告诉他其中有几个bug,让他找出来 bug出在哪儿。经历了这种磨练的韩总,早已练出了探寻敌方漏洞的火焰金睛。

但通常情况下王佳骏不会给韩总太多的机会,原来他除了擅长使用C++以外,还特别擅长使用各种已经被广泛测试的开源软件。他的那个背包名字叫做 KDE,他用它的各种activity把诸多软件管理了起来,这样可以在不同的战斗情况下迅速切换不同的装备:前一秒你看他拿着刀和盾牌,也许下一秒他就 切入了你的防线之内亮出两把匕首来。不过KDE存在一个蛋疼之处就是很多地方中文翻译竟然写反了,有的明明是“previous”,却被翻译成“下一 个”,明明是“next”,却被翻译成“上一个”,这导致有时候佳骏想要前进,结果反倒后退了一大步。

很快这二人的对战也惊动了我寝室隔壁的雷哥,于是后来他也加入到了每天在我的寝室举行的擂台之中。雷哥以Qt为内功心法,却既不用Qt的技巧,也坚 决鄙视STL,一招一式皆来自纯种的C/C++。他又犹好以汇编级别的优化来提升招式的速度,背诵英特尔CPU每个寄存器的名字比自己寝室同学的名字还要 熟。他甚至在玩DotA的时候也经常会通过汇编级别的优化来提升自己的APM——至此我才终于明白为什么这人整天玩DotA还能把程序写得那么好。

 

 

计谋之始,是要让敌人知道你的下一步。然后,小心预测敌人以后的每一步。 ——陈某《火凤燎原》第20卷

(本故事纯属胡扯,如有雷同纯属巧合)

我悠闲地走在徐家汇的马路上,手机放在外衣内侧的口袋里,耳机从里面连出来。但耳机里播放的不是音乐,而是:

“出现了!附近有异常的数据流,你感觉到了吗?”这是王佳骏的声音。

“三土,他们可能正在建设虚拟机,我们需要一些时间来定位他们。”这是橘子的声音,“这段时间需要你在人群中忽隐忽现,既不能让他们轻易地找到你,也不能让他们因为找不到你而中断了进程。”

我取下耳机,用右手摸了馍自己的鼻子——这是约定的暗号,接下来就只能看运气是不是在我们这边了。

 

我是一名普普通通的软院学生,几天前我还在实验室里焦头烂额地读论文、拍代码,忽然间我却陷入了一种武侠悬疑小说般的剧情中去。我亲眼目睹了几个我 自以为已经非常了解的朋友,施展出不可思议的功夫,打败了几个同样身怀武功、却声称要来取我性命的家伙——而我的朋友们告诉我,这些家伙不是人,他们叫做 “宏”。

我的朋友们还告诉我,世界上存在至少两种人——凡人和程序员。程序员的思维方式天生就和计算机编程所需要的思维方式完全一致,这就意味着他们不需要 多少教学就能够掌握计算机工作的基本原理,接触编程以后很快就能利用编程解决实际问题,甚至还能把计算机程序用到自己的身体上来,突破凡人眼中的物理限 制,施展出各种神奇的武功或法术。

不过他们告诉我的这些事情中一个最悲伤的事实则是:我只是个凡人。尽管这么多年来我也常常以程序员自诩,但按照他们的分类来说,我只能算得上“伪程 序员”,因此我无法像他们一样把计算机程序当武功来耍。我也尝试着让他们教我如何把计算机程序转换为武功,但这一尝试终以失败告终;不过这一尝试也并非毫 无收获,至少在那以后我终于可以看懂他们的一招一式究竟来自哪些程序,有时甚至能发现他们过招时暴露出的破绽。

你瞧,此时雷哥和韩总正在我的寝室里切磋功夫。但见韩总一招攻向雷哥,是拳是掌是冲是劈却看不分明,原来这是C#中的var关键字,可以声明变量却 不指定类型,具体的类型可以等到这一招用到时再由编译器来推断。雷哥知道厉害,也不正面对招,只把当前位置的指针+1,闪了开来,然后转而向韩总发起了凌 厉的攻势。两人立刻战作一团。

除了这些,由于保密协议的解除,我也开始更加了解程序员界。比如程序员和凡人之间的冲突:这主要是因为凡人不理解程序员的工作,更不理解程序员工作 的目的(“喂,老婆,我今天为Linux的进程调度策略贡献了一个patch!”“啊,恭喜你,亲爱的。但……那是什么意思呢……”“呃……总之,是很突 出的成就吧!”“哦……啊!那是不是能拿很多钱啊?”“……”)。当年电影《社交网络》刚出炉之时,这部片子的主角Mark Zuckerberg本人就曾批评说,电影的剧情描绘得好像他是想进入社交团体而制作的Facebook,拍电影的人(指凡人)并不理解他们(指程序员) 做某样东西,只是因为他们(指程序员)喜欢这么做。

由此导致的另一个问题是,程序员和凡人的品味也不大相同。比如曾经有一个程序员在女友生日的时候写了一个程序送给她,其他程序员都觉得非常浪漫而纷 纷分享此事,可惜那位女友却丝毫不理解这是什么东西;在凡人看来,一朵玫瑰花似乎就远比一个程序更加浪漫。这只是他们不理解,因为程序员多么爱着他们的程 序,所以他们才会选择把他们最爱的东西献给他们最爱的人。

程序员与凡人之间的冲突不止出现在生活的一面,也出现在程序员的工作中。许多凡人曾经尝试过学习编程,但后来他们中的一些人竟然因为学不会编程,摇 身一变,成了项目经理,或者雇佣程序员创业的创业者。由于大多数凡人出身的项目经理或创业者并不理解程序员的工作和工作方式,他们的行为在程序员看来就是 添乱,这就是程序员和项目经理的互相鄙视的原由。

但事实上大多数的程序员还是鼓励凡人学习程序的——他们认为即使不从事编程的工作,学习程序对每个人也都会非常有帮助。因此他们也不遗余力地撰写各 种“零基础学编程”之类的教程,发起各类免费教编程的活动。甚至有位程序员写了本书叫做HTML for Babies,在他看来,也许从小就培养孩子们学习编程,他们就可以学会用程序员的思维方式来思考问题,从而在未来成长为一名真正的程序员。

“咚咚”。王佳骏的敲门声打断了雷哥与韩总的切磋——之前他因为呆在实验室赶论文而没能参加今天的擂台。“啊,既然你们都到了,”看到王佳骏到来后,我说,“那就来讨论讨论我的计划吧。”

“你的计划?”三个人带着诧异的表情,异口同声地问道。

 

我疾步快走在徐家汇的马路上,一会儿弯下腰混入人群之间,一会儿却又昂着头站在十字路口。那些宏一定已经知道我在这里了,虽然我不知道他们在哪里, 但我知道他们已经到了。我不能让他们这么容易地抓到我,所以我必须躲在人群当中,但我又必须让他们了解到我现在大概在哪一片区域,所以我又要时不时地露一 下头。

我不知道露头多久才是安全的,我只好在我觉得快要紧张得窒息的时候马上躲起来。我既不知道当露头的时候他们看见我没有,也不知道躲避的时候我是否成 功从他们的视线中消失掉了。也许人群中就有一个狡猾的家伙,只等待我走到他身边当头一枪把我杀掉。想到这里我的两腿开始发软。我开始后悔我制定了这样一个 危险的计划。

在两次针对我的袭击事件发生之后,我意识到我不能够坐以待毙。我在交大的时候可以称得上安全,可是难道我要一辈子不离开交大?既然学习把程序转换为武功这条道路行不通,我就只好兵行险着,引蛇出洞。

 

“引蛇出洞?你是什么意思?”王佳骏问我。

“我不可能一辈子呆在交大。我也不可能在交大外面的每一刻身边都带着一个程序员做保镖吧!”我说,“既然我们不知道对方是谁,有什么目的,既然我们迟早要和他们决一胜负,与其坐以待毙,不如我们来掌握主动权!”

“具体你想要怎么做?”雷哥问道。

“以我为诱饵。让我在交大之外出现。既然他们的目标是我,他们一定会来攻击我,这时候你们早就在附近埋伏着,把那些家伙一网打尽!”我回答道。虽然看不见我自己的脸,但我似乎能感觉此刻我的两眼一定在放着光。

“那你把那些家伙一网打尽又能干什么呢?”雷哥问道,“他们背后的主谋又未必会现身。”

“我们知道那些家伙是宏,对吗?”我反问道。

“没错。”韩总答道。

“能够把宏使用得这么灵活的语言,天底下恐怕只有Lisp了吧。”我说道。“还记得Lisp魔咒吗?”

他们三人互相对视了一眼,点了点头。“Lisp魔咒”一词来自于一位叫做Rudolf Winestock的家伙写的一篇文章,这篇文章的中文翻译叫做《Lisp魔咒:对Lisp的非技术性吐槽》,里面提出一个观点:Lisp语言的强大是它 最致命的天敌,每两个或三个Lisp程序员就会开发一套自己的库,这些库具备开发者所需的所有功能和大部分人所需的80%的功能,但没有一个能成为通用的 标准。

“而宏是Lisp中最灵活的东西。由于宏的存在,不同的开发者写出来的Lisp代码可能完全不一样。”我继续补充道,“所以,也许如果我们能抓到一个宏,根据它的代码风格,我们就能找出幕后的主谋……”

“你的全部计划都只是基于一些‘猜测’。”雷哥相当犀利地指出了这一问题。

“不错,但除了赌一把,你还有更好的办法吗?”

 

当我刚在徐家汇的马路上出现的时候,王佳骏和橘子已经在一座高楼上找好了位置,俯瞰整个场景。在我被发现之后,对手们一定会花时间建立虚拟机,并把 我放置进去。那时我就需要尽可能拖延(却不能暂停)他们建立虚拟机的进程——通过时不时让他们找不到我,好让王佳骏和橘子定位虚拟机的创建者——也就是那 些要取我性命的宏。

“出现了!附近有异常的数据流,你感觉到了吗?”王佳骏说道。他们用手机和我保持联络,所以他们的每一句话我都能听到。

“三土,他们可能正在建设虚拟机,我们需要一些时间来定位他们。”橘子立刻通过手机对我说,“这段时间需要你在人群中忽隐忽现,既不能让他们轻易地找到你,也不能让他们找不到你而中断了进程。”看到我摸鼻子的动作,他们便挂掉了手机。

“一个……两个……三个……”此时王佳骏正在一个个定位我们的对手。

“他们就快要完成了,你现在定位了几个?”橘子一边看着我在大街上忽隐忽现,一边问道。

“五个。”王佳骏回答道。

“五个……突然袭击的话我们是可以在一瞬间把他们制服的。”橘子说道。

“他们的虚拟机就要完成了,三土有危险了,我们需要马上进去!”

“入口在这里。糟了,被加密了!”

“我看看,是RC4!我可以破掉它,但我需要先抓到一定数量的数据帧。”

“那就只能看运气是不是在我们这边了。”

与此同时,正在人群间穿行的我忽然发现周围的人都消失了。我转身一看,只见许多稀奇古怪的字节正在形成一个个人形。虚拟机已经建成了。他们来了。

 

“经历了前面两次事件,他们再架设的虚拟机想必就没那么容易攻破了。”韩总说。

“如果被加密了的话,最好的情况下我们也需要一些时间来破解它。”王佳骏说,“最坏的情况下……”

“你想清楚了吗?即使在最好的情况下,你也需要独自和那些家伙周旋上一阵……而你这种手无缚鸡之力的家伙……”雷哥说,“要知道,虽然虚拟机里的你并不是真正的你,他们杀掉的也不是真正的你,但一旦你的大脑以为你死掉了,现实中的你也就活不了……”

“我知道。”虽然觉得嗓子有点干,但我却感到一种说不出的兴奋,“Let’s do this.”

 

“Shut the f**k up!”

眼看着那些宏出现在我周围,情急之下,我竟气运丹田,吼出了这么一声。不料这一吼竟有若携奔雷之势,直贯斗牛。那些宏听到我这一吼,不禁都愣在了那 里。原来这一吼乃是程序员界的第一大佬Linus Torvalds的一大绝技,当年他在mailing list里曾用在这句话把一个维护者骂得体无完肤。因为这招不需要任何程序技巧,所以即使像我这种凡人也能够吼出来。但如果我是在正常的世界里吼上这么一 声,恐怕没有什么作用;但因为这台虚拟机的操作系统内核是Linux,Linus的霸气弥漫其间,这样一吼便立刻把这些Linus的霸气聚集了起来,其威 力自然非同小可。

眼看这一吼奏效,我立刻瞅准了之前计划好的逃跑路线,撒腿就跑。“砰!砰!砰!”枪声在我背后响了起来。此时我刚刚跑进一幢楼,墙壁被子弹射中后飞溅起的水泥块砸到了我的后背。“卧槽!他们竟然用枪的!”此刻我的大脑几乎是一片空白,只想到了这么一件事情。

惊魂未定之刻,忽然又是一声巨响,一个拳头从我身旁的墙壁中穿出,照着我的头部打了过来。我马上一个躲闪,堪堪避开,却跌倒在了地上。这时另一个家 伙也跑到了门口,举起他的手枪来。我立刻一个闪身,滚到了一旁,只见我刚才跌倒的地方溅射出蓝色的火花。我连忙爬起身来,向着另一个方向跑了起来——我觉 得我这辈子都没跑这么快过。枪声依然不断在我身后响起,我只好沿着“之”字形路线奔跑,并尽量把各种掩体放到我的身后。

前面有一扇门。我立刻冲了过去打开了门。只见一个黑衣人已经站在了门的外边,黑洞洞的枪口正对着我的双眼之间。

“Game over。”他笑道。

与此同时,王佳骏和橘子刚刚破解掉这些宏使用的加密方法,hack到这台虚拟机当中。

但他们刚刚进入虚拟机,便感觉到脖颈间有些凉意,他们低头一看,又互相对视了一眼,才发现各自脖子上已经被别人架上了一把剑。

“二位,恭候多时了。”一位身着布衣的家伙站在他们面前,笑着说道。

“Game over。”黑衣人笑道。黑洞洞的枪口正对着我的双目之间。完了,我想道。于是我闭上了眼睛。

“砰!”这一声却不大像枪声。

我睁开眼一看,只见黑衣人正惊慌失措地看着自己被溅上了许多水的衣服。手中捏着的枪不知何时已经变成了一个爆掉的气球。

缓冲区溢出攻击。我笑了。雷哥来了。

眼前的黑衣人还在试图搞明白刚才的一刹那到底发生了什么,一个紫色的身影已经扑了过来,一拳把他击倒在地。定睛一看,一个穿着紫色衣服的小伙朝我笑 了笑,果然是雷哥。原来刚才他用缓冲区溢出攻击把黑衣人手中的枪改写成了一个装满水的气球,黑衣人一抠动扳机,气球爆裂,一堆水便飞溅到了他的衣服上。然 后雷哥又用一连串的指针操作,让自己飞速移动到了此处,一拳击倒了对手。

此时我背后的黑衣人也刚刚追了上来,跑动中瞄准着我的脑袋。而他却不知道,在他的侧面,韩总已经架着一朵Azure云,飞了过来,手中的棒子挥动,也是一招把对手打倒在地上。

“你太慢了。”雷哥向韩总喊道。这时又一个黑衣人出现在雷哥面前,雷哥淡然一笑,一拳递了出来。但见一时之间,我的眼前似乎全是雷哥的拳影。原来这 套招式叫做“流水拳”,乃是雷哥从CPU流水线中悟出的招式。这套招式中的第一拳还没有发完,第二拳、第三拳、第四拳便如绵绵流水一般跟了上来。对手自然 招架不住,连连后退。

那边又有两个黑衣人扑向了韩总。但见韩总挠了挠头,双手一晃,竟然凭空变出了许多飞镖来,然后一齐掷出,顿时天空中好似漫天花雨。原来这一招乃是国 外一位叫做Jeffrey Ritchter的大侠自创的AsyncEnumerator,通过这一招可以使用C#便捷地进行异步编程。对手躲闪不及,纷纷中招倒地。此时雷哥也刚刚 制服了他的对手,这次轮到韩总笑道:“你太慢了。”

这时一个布衣人忽然出现在马路的对面,他的身后跟着两个黑衣人。这二人每个人的手上都拿着一把剑,剑分别架在橘子和王佳骏的脖子上。

“很聪明。”只见布衣人布衣飘飘,跨步走到了马路中央,一边走还一边鼓掌,这神情活脱脱地像是陈道明,“用这两个人来定位我们,和破解我们的系统,吸引我们伏击他们。其实却另有两个同伴来救你。不错的计划。”

“谢谢。”我忍不住答道。

“只是……”布衣人话音一转,看了看橘子和佳骏,“既然他们二人已经落在了我们手上。你们要怎么办?你们能无视他们的性命吗?”

此时雷哥、韩总和我都笑了起来,布衣人立感不妙,回头一看,橘子和佳骏都已经消失了,两个黑衣人也为眼前的这一幕感到愕然。不给他们足够的思考时间,橘子和佳骏又在他们的背后出现,各自用一招把他们打倒在地。

“Respberry Pi。”王佳骏弯腰捡起了掉在地上的一个小盒子,解释道,“你们之前抓到的我们只是这上面的虚拟桌面,只是一个客户端,真正的我们在服务端,在另一个地方。”

 

“经历了前面两次事件之后,你突然出现在交大之外,周围没有任何程序员的保护,难道他们不会怀疑吗?”在我的寝室里,雷哥、韩总、王佳骏刚和我通过Skype连上了橘子和带狗,给他们讲述了我的计划,现在这正是带狗的声音。

“当然会。”我说,“所谓的计策正是让对手知道你的第一步,然后预测他们会为此做些什么。”

“你是说,他们看到你这样出现,一定会知道附近埋伏了别的程序员。”带狗说,“所以……他们会想办法定位这些程序员。”

“不错,所以我们的计划其实是从这里出发。”我说。

“那你打算怎么办?”橘子问。

“虚拟桌面。”一旁的王佳骏笑着回答道。

(未完待续)