不知道大家有没有这种感受?当你拿到一本书并准备读时,总是想在几天之内就把它看完;看到后面就不想往前翻;每天以看了多少页书为衡量自己今天的价值,而不是吸收了多少知识;看完一本书总感觉脑袋空空的,看了后面忘了前面的......当然你可能还会碰到很多看书的烦恼,下面我就谈谈自己对看书的一些思考。
首先这里先做一个假定,假设你手里读的书一定是一本经典的、优秀的书。如果不是,那么就赶紧扔了,一本好书是一个好老师,而一本渣书简直害死人...
接下来我把计算机类的书大致归为三大类:
(1)语言方面的书。比如C、Java、Python等等
(2)算法书籍。《算法导论》、《编程珠玑》等等
(3)某一特定类别的书。比如操作系统、编译原理、网络、Linux内核、服务器原理等等需要很大的精力才能彻底掌握的书。
当然这个归类是非常粗浅的,针对不同种类的书,我们的阅读策略也会有所侧重。
首先针对第一类书。诀窍就一个字:练。
作为一个新手,千万不要陷入语言的细枝末节中,有些人学语言的方式实在是让人哭笑不得,比如他要学Java,他拿着一本java编程思想使劲地看,看了后面忘了前面,把自己搞的痛苦不堪,最后感叹一句:Java真难!(我亲眼见过,,还不止一两个,也是醉了)。还有一些人,从网上或者什么地方找来一些教学视频,然后坐在那一边翘着二郎腿一边貌似“聚精会神”地看,中途偶尔QQ上来人了还要聊几句(哥们,你当是看电影么?)。这两种学习方式看上去不同,其实本质上是一样的,都是一种被动地接受知识的方式。
这种方式及其低效,记住:代码是敲出来的,不是看或者听出来的!无论你是看书或者看视频,其实都不要紧,关键是一定要自己动手把它敲出来。当书看完或者视频看完后,你手上应该有大量的代码,这个时候再把这些代码敲个十几遍,此时你的脑子里留下的就是代码而不是文字或者声音了。
说到这,让我想起了我们的英语教育,,个人感觉学英语最有效的方法就是把自己置于一个英语环境或给自己创造一个英语环境,接下来就是使劲地说。。这样,不到几个月,保证你的英语棒棒哒!而不是拼命地背单词或看语法。。(好了,不吐槽英语了O(∩_∩)O!)。
接下来说说该如何看算法书。诀窍:理解+运用。
学算法不同于学语言,学算法最重要的不是记忆,而是理解。关于如何理解算法那也没什么好说的了,看每个人的悟性还有坚持了,当然去网上找一些容易理解的资料或者跟同学探讨会对你学算法非常有帮助。
我们这里重点说说为什么要强调运用。因为算法这种东西本质上是比较难理解的,比较难理解的东西就比较容易遗忘,比如你好不容易花了很长时间理解一个动归算法或KMP算法,然后你自认为自己彻底掌握了,然后扔在那几个月不管它。然后就没有然后了......
因此算法一旦理解了以后相当重要的一点就是一定要去运用,在不同的场景中去运用。那么到底怎么运用呢?比如你的算法书后面的习题,还有现在很多高校有很好的ACM OJ,上面有大量的算法设计题,这些都是非常好的资源。当你用你目前已经理解的算法去解算法题时,这个过程本身会进一步促进你对这个算法的理解,并且加强你的记忆。比如可能过一段时间你把这个算法忘了,但是当你一想起你解的那道题时,你又把那个算法回忆起来了。因为我们人脑总是不太容易记住那些抽象的概念,而对那些具体的东西记得比较牢。
话说回来,运用算法去解题是非常花费时间的,有时候一道题你可能半天都AC不了。。所以我建议那些现在还在读书的学生,如果你未来想走IT技术的道路,还是去学学算法吧。对你是绝对有好处的!你工作以后可能想学都没时间了!
最后谈谈对第三类书的学习。
第三类书通常都是一些理论性很强的书,比较难以消化,而且短时期内看不出它有什么价值。对于很多程序员来说感觉用不上。但是可以这么说:对这一类书理解有多深决定了你是一个攻城狮还是一个程序猿。
当然每个人都有他自己的选择,并不是所有人都想在技术这条路上走得很远,如果你是那个想在技术上成就自己的人,那么欢迎一起来探讨。如果不是,那么就当随便看看好了。
针对这一类书籍的特点,我总结了自己的读书方法——三遍读书法。是的,没错!起码三遍。对于这类书籍,要么不读,要读起码读三遍。其实,在现实中,有很多人对于自己读过的书是不太愿意再去读的,不管是技术书还是其他方面的书。这可能跟人把读书看得过于功利有关,认为读过的书再去读就是浪费时间,还不如去读新的书。
如果你问一个人你为什么要读一本书时,他可能会告诉你为了学新的知识或获取新的思想。的确,目的确实没错,可是往往他忽略了一个简单的道理:一本书如果只读一遍,那么你最多只能吸收10%的知识。如果你再读第二遍、第三遍。。。你所吸收的知识就能成倍地增长,当你再读下去的时候,你已经不止是简单地再吸收书本身的知识了,你会形成自己的思考,也许这就是古人说的读书百遍,其义自现吧!
所以说,如果一本经典的书拿来,你只准备看一遍,那么还是别看了,纯粹浪费时间!既然说一本好书要读好几遍,那么问题来了:我该如何读这本书呢?是从头到脚重复地看还是有其他的方法呢?当然有。我这里为什么要提三遍读书法,这其实是对投入与产出的一种权衡,谁都知道多看几遍越好,但是现实中往往很难让你有足够的时间去反复地看,这时候就需要找到能尽可能用最少的时间来获得最大的收获的方法。
那么三遍读书法具体是怎么来操作的呢?假如你拿到一本技术书籍
第一遍
尽可能在比较短的时间内过完这本书。在第一遍中,不要陷入某个具体的知识点,这一遍的主要目的是能把握每个章节的重要知识点,记住,是把握,而不是理解透彻。这一遍讲究的是快、高效。千万不要拖太长的时间。而且对于第一遍读完后的“成果”要牢记,最好把它记录下来,因为它们是整本书的骨架。
第二遍
第二遍讲究的是慢、理解。第二遍一定要慢,要尽可能地把知识点都理解,千万不要贪快,不要讲究进度。记住,在这一遍中:欲速则不达!遇到实在不懂的点,可以先放一放,等看到后面了再回过头来理解一下,或者请教一下其他人。
不建议边看边做笔记,最好在读完每一章或者每一节后,把书本合上,然后在脑子里去回忆你看过的部分,尤其是重点知识点,然后把它记录下来,这样比单纯记笔记效率要高很多。(个人比较推荐写博客。千万别觉得自己水平不够,不好意思写博客。记住,写博客不仅仅是为了给别人看,更重要的是对自己学过知识点的一种思路上的整理,通常这种整理都是非常高效的。另外,新手往往觉得写博客很费时间,但是相信我,如果你真的用心在写博客,它绝对不会辜负你的这些时间的!)这样一遍完成后,你对整本书已经有了一个比较完整的理解了。这个时候,你可以去看看你自己写的博客,不用着急读第三遍。
第三遍
通常如果你认认真真地读完第二遍后,你可以先放一放。人的大脑还是需要一些时间来慢慢消化的,哪怕是潜意识的,况且,短时间内连续读好几遍确实会让人感觉厌烦。这样过了一段时间后(比如去看看一些其它书啊等等),你再开始读第三遍,相信这个时候你很感觉很轻松(人往往对熟悉的知识有一种愉悦感),这个时候你不仅仅巩固了你之前的知识,甚至有可能还会让你产生新的想法,比如当你把操作系统的理论知识都掌握得差不多时,你可能会好奇它究竟是怎么工作的,你会产生想要去读内核源码的冲动。当然这就进入另一种境界啦!(当你研究过源码再来看操作系统的理论书籍时,你甚至都能知道哪些书写得好哪些书写得渣了呢!(^o^)/~)。
最后,我还是想说,哪怕对于这些理论性很强的书,要想真正得理解它们,还需要动手实践,比如学操作系统的可以试着去看源码,学编译原理的可以试着自己做一个小型编译器,学网络原理的可以自己去搭建网络环境来加深对网络的理解等等。
借用陆游的名句:纸上得来终觉浅,绝知此事要躬行!
当然,以上只是我个人对看书的一些想法,也不一定对。每个人都有适合自己的方法。