我在南大的七年
文/刘未鹏
跨进南大校门的第一天,我知道,我*了。
父亲是个对新事物有强烈兴趣的人,村里第一台电视机是他自己组装的,当时全村人都跑过去看,电视机只能收到一个台,CCTV。座机电话是第一个装的。大哥大刚出现的时候,他也是第一个买来用的,那个时候的移动电话真是贵得离谱。
父亲告诉我的第二件最重要的事情是:遇到任何问题,找书去就行。他在自己的专业中完全是自学的。在不属于自己的专业中(后来买了电脑之后需要学习如何架设公司网站,如何网上营销,如何进行电子财务管理,如何使用各种作图软件制图等等)也全都是靠买书自学。
为什么说到这两件事情,因为这是对我一生影响最重大的两个习惯。第一个习惯给了我学习新东西的强烈动机,有了热忱和兴趣,做事情就不觉得累,就自得其乐。第二个习惯则给了我学习任何新东西的方法——不会么?查书去。(当然,学习一门专业并不完全通过看书就行,但这毫无疑问是至关重要的一个途径。)
高三的时候,父亲买了电脑,我立时对这个神奇的事物产生了强烈的兴趣,每期的《电脑爱好者》和《电脑报》都会买来细细看,有时看到各种小工具、技巧还会摘抄下来,回去在自己家里的机器上捣鼓。那个时候我并不知道这样单纯的兴趣会把我引向一条专业的程序员道路。
高三时间变得越来越紧,分配给兴趣的时间越来越少,但兴趣的火花一直都没有熄灭。
跨进南大校门的第一天,我知道,我*了。
这个*并不是说我可以做任何事情了,而是我得到了一个重要的决策的*权,即关于如何利用我的时间。
高考的时候我报了计算机系,但分数差了几分,失之交臂,被调到第二志愿专业——信息与计算科学。当时以为这个专业跟计算机相关的,结果发现是数学系,后来听不少同学提到都上了同样的当。
这里出现了一个歪打正着的事情:我本意并不是上数学系,如果当时知道这个专业是数学系,我可能就不会填报了。但正是因为这个错误,我在数学系好歹也受了一些数学基本功的训练(尽管这个训练的基础是大一上的不多的几节数学分析课,以及每次临考前宿舍哥们例行的“包夜”看书),回过头来看这个基本功在后来还是帮了不少的忙,甚至有一阵子我对数学本身到了很感兴趣的程度。不得不说,这段学习的经历是很锻炼抽象和逻辑思维的。另一方面,困难如数学都学了,对其他学科就不觉得难,不会望而却步。
这是我成长过程中的幸运之一。后面还会提到,还有好几次更大的幸运。
大一上学期很快过去,应该是在大一下学期的时候,学校要开一门C++课程。我利用假期先把课本基本啃掉了,当时动机也很简单,先啃掉,就不用上课了嘛。
另一件事情是我经常喜欢去逛书店,看到侯捷的《深入浅出MFC》上面很多人说这本书好,我当时也对C++有一些基础认识和好感,所以就买下来啃了。一方面侯捷先生写的书的确图文并茂,深入浅出,有意思,另一方面理解一样复杂的东西是个智力挑战。所以看着看着倒是觉得兴致盎然。却不知就这么和C++结下了不解之缘。
这是另一个歪打正着:为什么说是“歪打”呢?因为MFC的设计也并不能说就是C++的Best Practice,另一方面若是以用为本的话也未必就要把MFC的原理摸个透。所以搞不好现在看来我就不会细看这本书。为什么说是“正着”呢?因为理解一个费解的东西本身需要长时间投入注意力,无形中练了理解能力和思维体力(专注),另一方面虽然MFC不是最佳设计,但理解里面的代码却加强了对C++本身的认识,这是基本功;也加强了对C++的兴趣,这是动力,后来这个动力驱使了我去看了大量的系统底层知识,从操作系统代码一直看到硬件体系结构。
大二发生了几件重要的事情:一是我在程序员上发表了第一篇技术文章,是剖析Boost源码的。我已经不记得什么时候、通过什么途径知道Boost这个库的了,总之是知道了,然后也是由于受到侯捷先生源码剖析的影响,也去看源代码,发现很难,越是难就越是觉得有趣,跟踪代码到临晨四点居然越看越精神了,后来火速写了一篇源码剖析。发给《程序员》杂志的技术主编孟岩先生,孟岩先生给了很大的鼓励,于是我很来劲。后来一鼓作气分析了N个库,写了一系列的Boost源码剖析的文章,在网上随处可以搜到这个系列。
这是第二个歪打正着,按理来说,研究语言技巧并不是程序员最佳的时间投入方法。所以现在我可能不会去做这件事情,会认为有更好的时间投入途径。但当时就一头扎了进去。为什么说也是正着呢?因为虽然这也许不是最佳的投入时间的办法,但总归比什么都不专注要强得多,至少这么一深入,对语言的缺陷和陷阱有了更深刻的认识、也锻炼了对代码的亲切感、跟踪调试的耐心(是的,耐心,而不是技巧)。
所以后来我在博客上总结自己学习编程中走过的弯路,孟岩先生说到,是不是弯路,不是那么容易界定的。
的确,也许真的有更好的路,但事前真的很难判断哪条路是最优的,我们能做到的,是把一条路走透了、走深了,只要不是一条太不靠谱的路,深入的过程中总会有很多的收获。只要不是太顽固,善于反省,总有一天也会逐渐意识到越来越靠谱的路。
除了发表第一篇技术文章之外,大二我还用业余时间做了一些技术翻译,寒假里我坐在家里每天晚上翻译半章《Effective C++》,当然,后来我把译稿提交给出版社的编辑时被告知文笔还显生硬。
同一时间,我继续啃N多C++以及底层知识的书,一段时间我的书架上全是这类书,根本不像数学系的学生。非典那阵子,把饭钱都拿来买了书,为什么买得这么疯,也是因为受父亲的一个影响,他告诉我买书不用心疼,因为是长远投资,收益远远大于这点金钱投入。那段时间我边看边写一些代码玩,有模仿Windows核心编程的小程序,也有尝试并失败的小游戏,也有拿来对宿舍玩的游戏文件分析的工具,还有为上机考试写的库,总之玩得不亦乐乎;不像很多知名的程序员在学校里面就写了被广为使用的工具,那个时候我完全没有这个意识,也不知道什么是开源,自己自娱自乐而已,所以没有系统训练编码量和编码素养,比较盲目。
大二下半年还发生了一件重要的事情,我在CSDN上开了一个博客,开始写学习C++和编程的过程中的一些总结。这个博客我一直写到今天,伴随了我整个7年的学习和成长,回过头去看就像时光机一样,能够看到一路过来我都关注了些什么东西,是怎么想的,以及对一些事情的看法是怎么改变的。这些东西如果不记录下来,就会逐渐忘掉,也就无法参照过去的自己,对未来提供更好的借鉴了。所以我一直把记录当做一个很重要的工具。另外我也通过这个博客认识了很多朋友,得到了很多的帮助。
后来,学校提供了转系到软件学院的机会,我立即报名了。后来的两年在软件学院度过。但其实反正我也是自己安排时间,所以无甚区别。
大三大四发生了几件重要的事情:一是荣耀先生邀我合译《Imperfect C++》,我很乐意的接了下来,可没想到这本书比我想象得要密度大得多,六百页,而且排版也很密,我给自己安排了每天6、7页纸的量,大概花了半年多译完。中间有一段时间停滞,荣耀先生给我鼓劲,告诉我一个重要的方法:如果觉得做不下去了,就硬着头皮坚持做,然后就类似于麻木了,适应了,那种望而却步的感觉会逐渐自动退去。惊人的简单,但事实就是如此,硬着头皮,过了那个情绪上最艰难的时候,也就适应了。这本书译完之后,还是有不少的收获,但我总觉得对性格上的磨练才是最有价值的收获。
二是我开始看英文版的书。之前,由于高中不靠谱的英语教育的原因,我恨死了英语,大二的校内四级课程还挂了科,直到大四才补考。但对技术本身的热爱压过了对英语的反感,我还是硬把一整本影印版啃下来了,而且津津有味,这本书就是Jeffrey Richter的《Applied NET Framework Programming》。这个事情的重要性在于,后来我就不再反感和恐惧英语了,这是其一,其二是我开始意识到英文世界的技术资料有多么丰富,所以虽然本身看上去不是一个太起眼的事件,但却是我获取信息方式的一个Tipping Point,一旦熟练掌握了语言这个平台,背后就是一扇大门,通向一个海量的信息源,后来我的信息获取绝大多数便来自于英文,其中尤数wikipedia和英文版的书为多。另外还有一个收益后面会提到。
大四快毕业的时候又发生了一件事情,微软的Eric Jiang通过我的博客找到我,推荐我去微软面试,我随随便便就把粗糙的简历给发过去了,差点因为简历太粗糙被HR直接过滤掉。远程电话面了两轮,远程Coding一轮,然后记得就是飞到北京面试,住在北航招待所。北京的面试又面了好几轮,有考察底层知识的、有考察C/C++的、Net的,还有考察算法的,编码素养的。总之就是公认的基本功考察。最终我还是没能通过面试。个人自己后来总结的结论是算法基本功太差,连什么是动态规划都不知道,编码素养也不够。这部分也是因为本科的学习方法太业余,什么好玩干什么,倒不是说兴趣驱动不好,只是缺乏系统的规划,不清楚也不关心这个领域的蓝图,也弄不清什么是重点。后来在读研的时候恶补了一把算法,好歹弄清了一些基本的概念和思考方法。编码素养的问题也是到了读研的时候才开始思考和学习,现在仍在学习。
另外,在本科阶段,其实我也浪费了很多时间,事实上,是只花了很小一部分时间来学习。之所以还多少学了点东西,完全是仰赖了专注的习惯。而这个专注的习惯其实又是从小受父亲耳濡目染的,父亲会花一整天揣摩一个问题,父亲跟我说过他以前组装电视机时的故事——一切都似乎组装正确,但电视机就是不工作。他苦思冥想,不得其解,当晚,半夜从睡梦中醒来,想到了问题的症结所在。所以,我在啃一些底层知识时如果弄不懂,也会一遍遍读,然后用走路吃饭坐车的时间在脑子里一遍遍去琢磨。我有很多重要的习惯受到父亲的影响,这些习惯自己一般觉察不到,但却默默影响了平时的一点一滴的时间分配和学习轨迹,这些习惯从纸上很难学到,但耳濡目染却会自然而然地学会。
每当有人觉得我本科就做了不少事情的时候,我就会说其实我本科真的浪费了很多时间,而另一方面,这也说明,要掌握一门专业知识,其实每天一点时间,专注、积累和持之以恒也就够了。后来研究生阶段才算真正开始惜时了,于是经历了两年密度很高的学习和思考,心智才成熟了不少。
大四的时候,和很多人一样,我也考研,因为一来也很茫然,二来也希望能够继续有一个宽松的环境继续沉浸在自己的兴趣中。但四年来我都是自己安排时间,逃掉了无数的课,已经对模式化的做题考试产生了抵触,所以考研的复习也没怎么认真准备,那年考研的数学题又偏难,一下慌了神,结果居然把一整页题压在稿纸下忘了做了,心理准备有多不充分可见一斑。考完数学我很沮丧,那么大分值的题目没做,数学肯定过不了了,接下来的专业课就没去考了。后来想想其实还是应该去考一考,多少能为下一年积攒经验。
后来就工作了,没去成微软,经同学张振推荐,就去了南京西门子。心里的打算还是边工作边考研,为什么考研,动机也简单,我心理还没准备好,本科只顾着埋头学好玩的,也不看路,不知道自己想要什么样的工作,想做什么样的事情。去西门子之后更加觉得如此,觉得效率很低,做的事情也并不是我乐意的,每天还要在班车上浪费两个小时,于是没过多久就辞掉了工作。打算复习考研。那个时候大概还有半年多的时间才到考研,所以我中途不紧不慢地又翻译了《Exceptional C++ Style》,占用了不少时间,到最后时间很紧了,就剩两三个月,我才开始认起真来,回想起来这是糟糕的时间管理。结果我不得不作了最坏的打算:顶多调剂去软件学院读研(我报的是计算机系),考虑到我反正是自己安排时间,差别应该不大。幸运的是,最终一分不差地过了线,算是蹭到了计算机系里。虽然如此,还是觉得这种惊险不要发生的好,以后或者其他事情上就不会有这么幸运了,及早准备总是很重要的。
读研期间的两年半,是我自己觉得心智年龄成长最迅速的一段时间。这里也有几个很幸运的事情。一个事情是我的导师陈家骏先生给了我很大的自主,于是我得以有时间安排一些重要的学习,这段时间对我来说很重要,我学习和思考了很多东西,为个人以后的发展作了很多准备,倒是没帮导师做什么事情。所以,硕士毕业离开的时候是既感激也愧疚。
另一个事情是认识同实验室的师兄陈怀兴,严格来说是他先来找我聊天,可见那个时候我仍然还是没有意识到与人交流的重要性的,后来,建立了TopLanguage讨论组之后越发意识到与他人交流的重要性,也开始主动寻找和参与交流,希望以后自己也能组织交流。陈怀兴对算法很有造诣,也是TopCoder上的常客和牛人,那个时候我也正在为以后的工作面试准备一些算法基础,所以经常找他讨论,获益很多。有一句话说:看一个人,只要看他读的书和见的人。还是很有道理的,这两者是一个人成长中最有价值的信息来源。
研一下半年,女朋友找工作的时候需要用到营销方面的知识,于是我去替她找书,偶遇《影响力》这本书,这本书打开了我的视野,让我开始关注一个很有价值的领域:我们如何思考,如何正确地思考。这个领域有很多有意思和有价值的书,我利用近一年的时间,陆陆续续看了近40本相关的书(我把这些书整理了之后以豆列的形式放在豆瓣上),对思维的特点和缺陷,以及如何思考有了很多的了解,这些知识后来很大程度上使我更清晰地认识自己,和自己在学习和生活中面临的各种问题。
也是研一下半年,我建立了一个Google Groups,起名TopLanguage,一开始的时候是因为平常没人讨论问题,憋得难受,希望有人能够说两句,无心插柳柳成荫,后来这个讨论组的交流越来越多,如今已经近两年,组内成员超过了4,000人,两年里我也从中收益颇多,其中最大的收益有两个:一是和人讨论能够激发自己进一步的思考,也促使自己更清晰地表述自己的观点或问题。倒不是说别人就一定告诉你什么新东西,而是讨论对你自己的思维的刺激。二是交流中认识了不少朋友,后来快毕业的时候也受帮助颇多。我一直把TopLanguage的创建看作研究生阶段做得最有意义的事情之一。
此外,我有意识地提前准备了英语,因为我相信如果想要去好的外企,口语不过关很可能成为一块短板(当然,英语作为承载最多技术知识的平台语言还有更大的价值),包括阅读、书写和口语。我想了一个方案,可以不用额外花时间来学习英语:阅读的训练蕴含在平时的英文技术资料的阅读中,尽量读英文的,一来英文资料更一手和全面,二来也顺便练阅读。书写的训练蕴含在去国外邮件列表发技术贴和自己写的英文博客文章中。口语的训练则蕴含在平时的娱乐中——美剧,有一个暑假我几乎天天开着Friends睡觉,另外学校有国外过来的团队演讲我不再错过,而是主动参加,有一次还带他们出去逛南京,说了一天英语,回头在路上听中文都像英文。虽然和外国友人交流的次数不多,但似乎对口语感觉的提高还挺大。后来在微软亚洲研究院的面试最后一轮就是英语的,而且是偏技术的,好在提前准备了,所以毕竟还是顺利地表达出了想表达的意思。
去微软亚洲研究院面试,是因为幸运地认识了微软亚洲研究院技术创新组项目主管邹欣先生。邹欣先生和他组织的团队在那段时间写了《编程之美》,书中有很多很有意思的题目,而我那段时间恰和陈怀兴讨论算法,在讨论组上也组织了专题的讨论,有了一点粗浅的思考,于是和邹欣先生邮件交流,由于对邹欣先生的技术创新组做的事情很有兴趣,所以找工作的时候便向他毛遂自荐。
承蒙邹欣先生推荐,时隔三年,我再次获得了去微软面试的机会。这一次,由于研究生期间作了一些长远准备,所以心里有底了很多,也就比较冷静了,由于当年知识体系的漏洞被我花功夫补了补,所以面试比较顺利。面试的时候邹欣先生更为详细地介绍了技术创新组的工作,我更加感兴趣了,所以尽管已经有另外几个也不错的选择,但心里还是迅速地做了决定。大约一周后,HR通知Offer,我毫不犹豫就接受了。
我想,虽然有很多人本科就明白自己想做什么,我多花了两年多,总还不算太晚。