`

我在南大的七年

 
阅读更多

—— 跨进南大校门的第一天,我知道,我自由了。

父亲是个对新事物有强烈兴趣的人,村里第一台电视机是他自己组装的,当时全村人都跑过去看,电视机只能收到一个台,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,我毫不犹豫就接受了。

我想,虽然有很多人本科就明白自己想做什么,我多花了两年多,总还不算太晚。

--

前些天贴在讨论组上的

分享到:
评论

相关推荐

    南大 南京大学计算机软件复试面试常问问题.rar

    南大 南京大学计算机软件复试面试常问问题南大 南京大学计算机软件复试面试常问问题南大 南京大学计算机软件复试面试常问问题南大 南京大学计算机软件复试面试常问问题南大 南京大学计算机软件复试面试常问问题南大 ...

    南京大学842考研真题(2013-2020年).zip

    南京大学是中国顶尖的高等学府之一,其在各个学科领域都有深厚的学术底蕴和严谨的教学体系。842作为该校一门研究生入学考试科目,反映了南京大学对该领域的高度重视和深入研究。考研,即全国硕士研究生统一入学考试...

    2019南京大学考研复试机试题.zip

    标题"2019南京大学考研复试机试题.zip"明确指出这是一个与2019年南京大学硕士研究生入学考试复试相关的资料压缩包。"机试题"通常指的是计算机科学或相关专业在复试阶段可能会遇到的上机编程题目,考生需要在规定时间...

    南京大学编译原理期末样卷.zip

    《南京大学编译原理期末样卷》是一份珍贵的学习资源,包含了过去若干年南京大学编译原理课程的期末考试真题。编译原理是计算机科学领域的重要学科,它研究如何将高级编程语言转换为机器可执行的低级指令。这份样卷...

    南京大学计算机系统基础PPT

    南京大学的计算机系统基础课程是计算机科学领域的重要学习内容,对于有意报考南京大学计算机系的研究生来说,掌握这部分知识至关重要。这份"南京大学计算机系统基础PPT"包含了丰富的教学资料,旨在帮助学生深入理解...

    南京大学电子邮件管理办法1

    在邮箱管理方面,南京大学实施实名制,用户对邮箱的安全和使用负全责,禁止转让给他人。用户的电子邮件活动需遵守国家法律法规和学校规定,如有可疑活动,网络信息中心有权暂停使用。连续一年未登录的邮箱,中心有权...

    南大通用数据库驱动 jar 包

    南大通用数据库,全称是南京大学通用数据库管理系统(GBase),是由南京大学计算机科学与技术系开发的高性能关系型数据库产品,广泛应用于金融、电信、政府等领域。它的驱动jar包提供了JDBC(Java Database ...

    南京大学软件学院试卷

    南京大学软件学院的离散数学期末试卷主要涵盖了离散数学这一关键领域的诸多核心知识点,它是计算机科学特别是软件工程学科的基础课程。离散数学是研究离散而非连续对象的数学分支,它在计算机科学中的应用广泛,包括...

    南京大学CSmaster经验

    作为中国顶级学府之一,南京大学在计算机科学领域的教育与研究享有盛誉,尤其在人工智能(AI)方面有着深厚的积累。这份资料可能是由一位南大CS硕士生分享的个人经历和心得,旨在帮助零基础或经验不足的学生了解申请...

    南京大学C语言课件

    南京大学C语言课件,内部上课使用,大家可以参考一下

    南京大学考研计算机科学技术复试-编译原理

    南京大学在计算机科学技术的研究生复试中对编译原理进行了考察,主要侧重于理解和分析能力的考查。 #### 二、历年考题分析 根据提供的资料,南京大学从1997年至2007年和2009年的编译原理复试考题进行了整理。这些...

    南京大学第五版物化(下)课后习题答案

    在《南京大学第五版物理化学》下册中,“第八章:电解质溶液”是一个重要的章节。电解质溶液是指在溶剂中能够导电的溶液,其导电性源于溶液中存在的离子。本章节将详细介绍电解质溶液的基本性质,包括电导率、摩尔电...

    南京大学操作系统课件

    南京大学作为中国顶级的高等学府之一,其操作系统课程具有深厚的理论基础和实践应用价值。本课件集是南京大学操作系统课程的教学资料,旨在帮助学生深入理解操作系统的原理与实现。 课件涵盖了操作系统的基础概念,...

    南京大学98-05普通物理+量子力学考研真题.rar

    这份压缩包文件"南京大学98-05普通物理+量子力学考研真题.rar"包含了南京大学在1998年至2005年间考研的普通物理与量子力学科目的试题,对于备考南京大学物理相关研究生课程的学生来说,这是一个极其宝贵的资源。...

    南京大学考博推荐信模板

    南京大学考博推荐信是博士研究生申请过程中必不可少的一部分,它由具有高级职称的专家撰写,以评价和推荐考生的学术能力和潜力。以下是关于南京大学考博推荐信的一些关键知识点: 首先,考生姓名和报考专业是推荐信...

    南京大学软件学院高级算法PPT.rar

    《南京大学软件学院高级算法PPT》是一份珍贵的学习资源,专为软件学院的研究生们设计,涵盖了算法领域的深入知识。这份PPT旨在帮助学生掌握高级算法的核心概念、设计思想和实现技巧,对于提升编程能力,尤其是解决...

    南京大学软件工程培养方案

    请参照南大软件工程硕士的培养方案,为大家了解什么叫工程硕士.

    南京大学考博英语翻译

    南京大学博士研究生入学考试08年英语试题英汉互译部分

    南京大学java课件

    南京大学java的课件!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!...

    南京大学编译原理课件

    南京大学的袁老师编译原理课件为广大学者提供了深入理解这一领域的宝贵资源。这门课程不仅对计算机科学与技术专业的学生至关重要,也是准备报考南京大学计算机系的考生的重要参考资料。 课件涵盖了以下几个核心知识...

Global site tag (gtag.js) - Google Analytics