不过最原始的三个理念还是在的,我告诫自己即使不听讲,也不能浪费时间。所以,我把听课做作业上节省下来的时间,用在了看喜欢的计算机书和学习编程上了。于是,整个大一大二,我凭借着简单的自学的理念,开始了两件事情,敲 《Thinking in Java》(TIJ) 和 《The TeXbook》 上的没一个样例。
敲 TIJ 的机缘其实很简单,我是在软件学院听课的时候看到他们教 Java, 但是他们用的 《Java 大学教程》太贵了,我舍不得买。 我在网上搜了一圈,发现 《Thinking in Java》是一个免费的英文电子书。 于是,我就在数学系的机房,每天下午和晚上,开着一台计算机,屏幕上放着这个电子书,再用我的很土的笔记本,运行着未注册的 JCreator, 一个字母一个字母的敲 TIJ 上面的程序。我很偏激的认为拷贝粘帖的程序记不住,所以每个字母都自己手敲。 就这样,花了一个学期,居然就把所有的程序敲完了,基本上 Java 的方方面面,我也了然于胸了。
敲完 Thinking in Java 之前没几天,我们就期末考试了。那一次考试的试题是 LaTeX 排版的,而不是手写的。 我考试的时候就问监考老师这玩意怎么排版出来的,因为我知道 Word 这个软件做不到这个效果。监考老师除了对我不认真考试表示不满外, 还算仁慈,告诉了我 LaTeX 这个名词。 寒假里,我就买了一本 LaTeX 教程。然后,突然认识到,原来 TeX 居然是我最热爱的 Knuth 的杰作,于是我就疯狂的开始学 TeX。 我的方法还是一样, 敲例子。 记得 TeXbook 上有一个程序, Knuth 让大家自己照着敲入计算机, 然后还很幽默的说,实验证明,只有很少的人会按照他说的敲入这个程序,而这部分人,却是学 TeX 最好的人。看到这里我会心一笑,觉得自己的方法原来也不算笨。从此,一字不漏敲入一本书的程序成了我推荐别人学习语言的最好办法。 我后来大四又敲了 A Byte of Python,前段时间又敲玩了 The Awk Book,都是不到一个月瞬间从初学者成为细节很熟悉顺手拈来使用者。顺着这个方法,大二我把 《组合数学引论》 和上海交通大学出版的一本 《离散数学》 上的题目都做一题不漏做完了。当时选者两本书也没有特别的目的,就觉得这东西应该是计算机的数学基础。这些积累,在大四全部都显现了出来。
我个人认为, 《Thinking in Java》 和 《The TeXbook》都算得上是理论和实践结合的精品书,是经典的英文原版书。我一上来就读了这两本书,阅读品味就上升了不少,而且变得“崇洋媚外”了,任何时候都以英文原版书为第一选项了。也因为此,虽然我自学的过程中没有高人指点,但自学最重要的一个环节—选书–的盲目性就大大减少了。我记得那时候我看得最多的书就是华章引进的书,黑封面的,我们图书馆里有将近半书架,如果一一细读,穷尽四年是看不完的。但华章的书也不是本本经典,我那时候开始注意选择,细读开头十几页后,基本能决定这个书该不该看。所以即使当时没人指点,全靠自学,读的书还算过得去。那时候南大计算机系的教材,有的我看,有的我觉得不适合自己,就找替代品了。我觉得选书这个事情上,因为有前两本书的标杆,我少走了不少弯路。从这两本书开始,我疯狂的读书就开始了。南大的浦口校区的硬件条件并不好,唯一有空调且可以上自习的地方恰好图书馆。因此我每个暑假,基本上都是很早就过去占位,晚上很晚回去睡觉。我对小说等其他书也不感兴趣,就整天看自己觉得好的计算机书和数学书,做笔记。某天,我开始了一个雄心勃勃的计划:读完 TP312 书架。
考研这个事情,我至今觉得运气远大于真正的付出,结果也非常出乎我的预料。记得结果刚出来,同学帮我查分的时候,我根本不相信自己考这么好,还放话说如果考这么好,请全宿舍吃饭(我记得兜里面当时只有200块钱,根本没法请人吃饭,后来还是借钱请客的)。考研结果出来之后,迷茫的我得到了一个非常好的保底,我就比较得陇望蜀了。其实在当时我的心里,我并没有认真想过以后要具体干什么,只是隐隐约约觉得要不去北京,要不就去美国。有了北大这个机会,我就调高了自己的心理标杆,定下了两个大的,具体的目标,或者说是圣杯,一个是进 Google 中国, 一个是到美国名校读计算机,有了考研这个保底,在2月份过完年,我就不慌不忙的认真准备这两件事情了。
我10月份的时候给 Google 投了一份简历,很快在11月份就被拒了。 而我的搭档李获鼎在签了 IBM offer 的第二天,却收到了 Google 的面试邀请(我相信凭他的实力,如果晚一天签约, 现在就在 Google了)。我听了之后觉得很奇怪,按说我们两个,做的项目是一样的, 学得科目也一样的,写的简历互相也看过,都差不多的,我被拒了,他被邀请了,这个好像不大对。 我心里的不服气,反应在行动上,就是每天上网看 Google 中国最近又招了几个人,怎么招的。那时候互联网上盛传的故事是一个人给李开复用很多不同的邮箱发邮件,以保证简历能够万无一失到达,结果瞬间被录用了。这个故事的内容和合理性放在一边,我对故事主人公的精神很感兴趣。我觉得我也可以再试试,说不定坚持就是胜利。正好那个时候,Google 的一些副总裁到北大有个宣讲活动, 说好了现场接受简历的。 我从当时在北大的女友那里得到了这个消息,回来把简历梳理了一下,让她帮打出来,又交了一次。这一次,简历直接交给了某个副总裁,成功了!几周后,HR 就给我打电话,安排机票和宾馆,让我去 Google 面试。
面试的过程平淡无奇,题目不是《编程珠玑》上的,就是《计算机程序设计艺术》上的,再不然就是网上贴出来的。我个人感觉,面试题就那么多,多做做基本上就了然于胸了。我从找工作一开始,就做了个有心人,每天都上网看面试题。这次面试前,我又把《编程珠玑》这些书复习了一遍。同时我知道自己在面向对象编程方面很欠缺,又看到有面试过的人说面向对象也考,就顺带看了《设计模式》。我还比较有心,花了几个晚上,捣鼓了一个移植于 Mac 的,基于 MVC 的可以当场演示的 Java 小游戏,面试当天我还给面试官演示了这个小游戏的架构和用到的设计模式,这样,我感觉,自己面向对象开发方面的弱点就让这个小游戏的演示给弥补了,面试官也一致说好玩。 很快,四轮面试就结束后, HR 把我带着去见李开复。李开复博士是个风趣的,或者说很善于观察人的人。他见到我的第一句话竟然是半调侃的 “小伙子, 我们 Google 不能解决北京户口啊”,我承认当时的确穿得很民工,因为网上说Google 是个很随意的公司,我是继续以凉鞋装备和鸟巢一样的头发去面试的。我也做了一些功课,所以谈话总的来说还比较水产。说了一会儿后,我就抛出了为什么 Google 拒我一次又让我再面试这个问题,他说这事情还很罕见,要是我再网申,基本上简历是不可能的浮出水面的, 因为数据库里面已经有标记了,不过我这样二进宫算是精神可嘉。这时候我才回忆起面试的一个MM手上拿的简历,的确是我第二次提交书面简历的复印件,而不是网申的打印版,可见还是坚持再投一次好。(这个坚持,我也是和搭档李获鼎学到的, IBM 二面就有拒他的意思, 他要求 HR 再给一次终面的机会,终面刚结束,HR 就和他握手恭喜他加入 IBM 了,所以面试这个事情,坚持到最后的才是胜利者)。 当天和李开复谈完出来,HR 冲我笑笑,握握手,说,就你和他谈得时间最长。我基本上知道, 这个事情成了。