计算机考研经验 ③

三年前,我从某二本院校经管专业毕业,出于对编程的兴趣跨考了计算机的研究生,第一次准备不充分失败了,第二次考完研后,为了提高自己的编程能力,我参加了王道训练营第三期,在王道收获了很多,其中最重要的是学习的态度和方法。训练营结束后,怀着对未来的憧憬开始了研究生生活。时光荏苒,三年的研究生生活转瞬即逝,虽然现在水平还是比较弱,但相比三年前的自己还是有明显的进步,在校招时拿到了几个批发价的offer(新美大、cvte、ctrip、zte、滴滴、360、腾讯)。在王道一定还有一些像我一样基础薄弱的非科班同学,为了提高自己的编程能力努力奋斗着,应风华哥的邀请,写这篇帖子给后来的道友分享一下我读研期间的学习经历,跟大家交流一下学习方法。我主要是通过看书,看公开课并做课后实验,读源码来学习。下面分别介绍一下:

0.程序设计

《c++primer》这本经典书是c++入门的最好选择。
《The C programming language》这本书是c语言作者写的,书上的练习题做完很有收获,而且它的附录我觉得非常好,从c语言设计的角度讲解了很多内容,举个例子,一些笔试题里经常出现的一些复杂的声明,都在附录里有详细的解释。
《effective c++》《more effective c++》《c++沉思录》,这几本书也很经典,一些面试题都可以在这里找到答案,看起来也很快,几天就能看一遍。
《深度探索c++对象模型》,这本书也是非常重要的一本书,看完对c++的底层机制理解更深刻了,看懂这本书校招很多分析代码的c++笔试题都迎刃而解。
《STL源码剖析》,我觉得这本书也很重要,面试的时候常见的c++问题都能从这本书找到答案,比如vector底层原理,map和set底层的红黑树,迭代器,容器的内存分配等等。看这本书的时候在网上下载了侯捷的SGI STL源码注释版,配合着书看效果更好。
《设计模式--可复用面向对象软件的基础》这本书是设计模式的经典之作,里面的例子都是c++代码,很容易看懂。
《设计模式之禅》这本书相比上一本更偏重实践,里面有很多具体的实现方式。
在实习的时候看了《mysql必知必会》《高性能mysql》,因为开发业务代码需要熟练掌握sql,还要对数据库性能优化有一定了解。除了关系型数据库,还要掌握一些诸如Memcache、Redis等Nosql数据库,我看了《Redis设计与实现》,结合源码学习redis的底层机制,对工作有很大帮助。

1. 操作系统

操作系统阅读了《操作系统--精髓与设计原理》,结合清华大学的公开课(http://www.xuetangx.com/courses/course-v1:TsinghuaX+30240243X+sp/about)学习。这门公开课的配套实验非常好,要实现一个名为ucore的linux系统,作业更多时候是读很多代码,自己填写部分函数,所以也相对比较容易,通过动手实践有很大收获。还可以通过实验掌握gdb、valgrind等一些调试工具、提高c语言的编程能力,加深对操作系统的理解。在做作业实现ucore的过程中,我还参考了《深入LINUX内核架构》。
还有《深入理解计算机系统》,同样看华盛顿大学的公开课CSE 351 《The hardware/Software interface》( http://courses.cs.washington.edu/courses/cse351/16au/index.html)并完成实验作业,这门公开课的实验就是《深入理解计算机系统》前面讲到的8个实验,我觉得很有挑战性,印象最深的第二个实验二进制炸弹,需要反编译二进制代码并找到秘钥,为了做这些实验,又学习了很多知识,比如看了王爽《汇编语言》、《程序员自我修养--链接装载与库》,阅读intel IA32手册学习函数调用、保护模式、用户态和系统态的切换等。总之,通过这些实验,能掌握很多系统底层的知识,并且也能提高自己的编程能力。还有《UNIX环境高级编程》,这本书是风华哥给发的,这本书我是编程遇到问题查阅相关部分看的,带着问题看书理解的比较深刻。

2.计算机网络

看完了《TCP/IP详解,卷一》,阅读这部书使我对计算机网络有了更深入细致的理解。看书的过程中,自己也通过参考网上的资料实现了一个抓包分析的小程序,把数据包一层一层按照书上讲的协议分解出来,加深了对网络原理的理解。还有《UNIX网络编程》,看这本书的时候阅读了一个简单的web服务器代码(http://lifeofzjs.com/blog/2015/05/16/how-to-write-a-server/),读代码的时候遇到不懂的地方就看书上相关部分。然后读了《深入理解Ngnix-模块开发与架构解析》这本书,结合nginx源码看,了解了Nginx的原理,对高并发的理解很有帮助。

3.编译原理

学习了公开课(https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/about),做作业实现一个叫Cool的编译器。
阅读《自制编程语言》,这本书实现了2个编译器,一个是无类型的crowbar,一个是静态类型语言Diksam,通过阅读这些源码,对编程语言底层的机制有了更深入的理解。还有《编译器设计》以及龙书,都是在做公开课作业和看《自制编程语言》时参考其中的原理讲解。

4.算法

看了coursera上的算法课(https://www.coursera.org/learn/algorithms-part1,还有个part2),配套教材是《算法》作者是sedgewick(这本书还有个配套网站http://algs4.cs.princeton.edu/home/上面有很多资源,还有内容勘误,书上的错误会对理解造成障碍,我觉得看书的时候尽量找到勘误把错误修改了再看),这门课的作业也设计的非常好,做完了之后收获很大。而且《算法》这本书是用java实现的算法,api很清晰,尤其是讲排序时编写代码用动画展示排序过程,对理解算法很有帮助。这本书我觉得比《算法导论》更容易读。

5.读源码

侯捷在《STL源码剖析》序言中写道:“追踪一流作品并于其中吸收养分,远比自己关起们来写个三流作品,价值高得多”。我深受这句话影响,看了一些优秀的源码。除了上面讲过的那些源码,还有网上看到别人推荐的好源码,比如学习网络编程时看了linux2.6内核中的select,epoll的代码实现,再比如google的轻量级数据库leveldb的代码(https://github.com/google/leveldb)。还有深度学习库Caffe源码(https://github.com/BVLC/caffe),以及mxnet源码(https://github.com/dmlc/mxnet/)。推荐一个源码阅读工具Understand,这个软件可以画出函数调用关系图。遇到不懂的代码就自己写写调试一下,在网上找别人读源码的笔记看,可以用xmind画思维导图把源码的架构画出来,可以帮助理解。我觉得读源码对提高自己编程能力有很大帮助,读源码过程中经常会学习到很精妙的设计。
看书的过程中会遇到不懂的,我觉得不懂是因为有些背景知识没有掌握,我会先跳过继续看后面,有时候把后面的知识看了就懂了前面的,或者在看其他书的时候会突然明白了之前看不懂的地方,所以我看书的时候遇到不懂的先放下,以后再反过来看之前看不懂的地方,很多书都看了不止一遍。看书自学需要大块的自由时间,看视频效率比较低,我逃了研一的大部分课加上导师管的松才完成上面那些内容。其实那些公开课最大的帮助还是在于做课后实验,如果时间不充裕可以把课件看看只做实验。学习总结很重要,《暗时间》里有句话“书写是最好的思考”,我深以为然。我有个喜欢交流的同学,我们经常会把学到的给对方讲,有的时候会遇到自己理解的盲区或者有偏差的地方,讲着讲着就卡壳了,这时候再去看资料,直到给别人讲懂了才算自己真的懂了。
最后我再分享一下校招的准备,校招要求低,应该比社招简单很多。校招前先把基础知识梳理一遍,我用的是《王道程序员求职宝典》,多做几遍上面的题,校招笔试很多选择题都能找到类似的题。多刷leetcode和《剑指offer》《编程之美》《编程珠玑》上的算法题,牛客网上有很多题库,尽量多刷,见得多了遇到题目就有思路了。面试时很多面试官会出一些开放性的系统设计题,我看了《大型网站技术架构-核心原理与案例分析》《淘宝技术这十年》等,面试时可以参考里面的内容讲。关于面试网上面筋很多,我就不再赘述了。校招面试官考察的基础知识很多,其实只要心态好,跟面试官有效沟通,把自己平常积累的知识展现出来,每次面试完总结自己的不足,通过校招面试还是很简单的。
以上就是我学习的经历,读研后大家的研究方向不同,专业课程的学习就不再赘述了。我很多时间花在打基础上了。各位道友还是要根据自己的实际情况有的放矢的制定适合自己的学习计划,只要态度认真,坚持不懈的按计划学习,一定能取得很大的进步。
最后,祝各位道友在求知和求职的道路上一帆风顺!祝王道越办越好!

你可能感兴趣的:(计算机考研经验 ③)