# 看书的一点小建议

大家好,我是小林。

昨天看到小北写了篇「看书的一点小建议 (opens new window)」,写的很不错,今天我也根据自己经历,分享下看计算机基础类书的心得。

每隔一段时间,都有些读者跑来请教我学习的心得。

图片

图片

他们的困惑可以归类这几点:

  • 书看不懂,容易放弃,怎么办?
  • 看书的效率很低,怎么办?
  • 做了很多笔记,依然过会就忘记,怎么办?

这些困惑我曾经也经历过,中途也踩过很多坑,浪费了很多的时间,好在及时反思,调整了看书的方法,后面学习的效率立竿见影。


# 不要直接选择困难模式

大家应该知道计算机书里有个黑皮系列的书,黑皮系列的书有一个共同的特点就是厚重

我相信不少小伙伴在想要学习计算机基础类知识的时候,就买了这类黑皮书,书到货后,我们满怀信心,举着厚重的黑皮书,下决心要把这些黑皮书一页一页地攻读下来,结果不过几天就被劝退了,然后就只有前几页是有翻阅的痕迹,剩下的几百页都完全是新的,最终这些厚厚的黑皮书就成了垫显示器的神器

图片

黑皮系列的书确实都是经典书,豆瓣评分都很高,知识点很全面,是好书无疑。但是这类书并不适合新手入门,你想想我们学习中文的时候,你是拿着新华字典学的吗?很显然不是。

黑皮书就好像游戏里「困难模式」,新人一上来就玩这个模式,根本就体会不到游戏的乐趣了,卸载了游戏那还是小事,如果留下心里阴影,造成不可逆的伤害,这就非常不好了。

说白了,这些厚的不行的计算机书不适合入门,我们应该先从「简单模式」慢慢过渡,要屠龙,得先从新手村起步

就拿我亲身经历举例。

当初在学习计算机网络的时候,看见大家都说《计算机网络-自顶向下》和《TCP/IP 详解》这两本书好,我立马买了学习,这本也是黑皮系列大厚书,奈何小林当时太菜,根本就砍不动这本书,砍两下,刀钝了,就想睡觉。

后面又找了一波书,发现《图解 TCP/IP》、 《图解 HTTP》、《网络是怎么连接的》这几本书都不厚,而且搭配了很多图,我又立马买回来学习。

这几本书读起来不会太困难,不出一个月,我就把这三本书看完了,立马对计算机网络有了个整体且清晰的认识,终于知道了网络七层模型是什么,也知道了两台电脑是如何通过网络进行相互通信的,也知道 HTTP、DNS、TCP、UDP、IP、ICMP、DHCP、ARP 这些常见的协议是用来干嘛的了,成功突破了新手村。

虽然突破了新手村,但是学的知识还不够深入。

所以,我后面回来看《计算机网络-自顶向下》和《TCP/IP 详解》这两本厚厚的书,不过这次就不会那么吃力了。

后面回看这两本书时,我也没有选择从头看到尾,因为有些内容和在新手村看的书的内容重叠了,而且由于在新手村里知道了哪几个协议是常见的,于是就选择了这几个协议的章节进行深入学习,比如:

  • 我想进一步学习 TCP 协议的特性,于是就跳到《TCP/IP 详解》书里讲 TCP 协议的几个章节,我就从中学到了 TCP 流量控制、超时重传、拥塞控制等等。
  • 我想进一步学习 IP 协议,于是就跳到《计算机网络-自顶向下》书里讲 IP 协议的章节,我就从中学到了 IP 协议更多的细节,IP 包头的各个字段用途、寻址、路由转发的原理等等。

看了黑皮书,我也深刻感受到黑皮系列的书确实经典,知识体系很全面,也很细节。

但是这种大且全的书并不意味着适合入门,新手很容易就在各种细节中迷失,而且书上有些不常用的协议我们是可以选择不看的,如果不知道重点很容易就把时间浪费在这些地方,得不偿失。

我是在新手村学习里抓到学习计算机网络的方向,也就是把「键入网址,到网页显示,期间发生了什么?」这个问题所涉及到的协议都要掌握,比如 HTTP、DNS、TCP、UDP、IP、ARP、MAC 等等,然后再查黑皮书对应的章节来深入学习对应的协议。

不仅仅是计算机网络,我在学习操作系统、计算机组成原理、网络编程等等也是用这套方法,都是先看新手村的书,得知了哪些是重点知识后,再跳到黑皮书里对应该知识的章节进行深入学习。

当初在学网络编程的时候,看见网上的人都说 UNP(Unix 网络编程)、APUE(Unix 高级环境编程)这两本书是网络编程圣经的书,那么好学的小林,那肯定毫无犹豫买了。

书到货后,我瞬间就懵逼了,这两本书是我买过最厚的书,这尼玛怎么学?

跟着书本的节奏,学了一段的时间,是懂了些 Linux 网络和系统 API 的用法,摸索来摸索去都是各个 API 的细节,始终不知道高并发网络框架是如何实现的

图片

后面我又重新找了一波关于网络编程的书,找到了这两本:《TCP/IP 网络编程》和《Linux高性能服务器编程》。

  • 《TCP/IP 网络编程》绝对是新手村级别的书,书里的内容不会有过多的术语,作者都用大白话来表达,配图也很清晰,也有介绍我想知道的网络框架,虽然是比较基础的多进程服务端模型、多线程服务端模型、异步 IO 模型。而且最后一章实现了简单的 HTTP 服务端,让我知道了从代码角度是怎么解析 HTTP 报文的,以及状态机是如何实现和运转的。
  • 《Linux高性能服务器编程》这本书主要是网络框架为主,前几章关于网络基础知识对于掌握了计算机网络知识的同学可以直接跳过的,你看,很多知识是想通的,当我们知道掌握了这块知识后,在学习新一本书的时候,就可以跳过重叠的内容。在这本书我学到了,Reactor、Proactor、信号、定时器、多进程编程、多线程编程、进程池和线程池等。

这两本书让我大概知道了如果一个服务端要服务多个客户端时,不是就简单写个 socket 编程就完事,而是还要结合 IO 多路复用 + 多线程的思想,也就是 Reactor 的设计理念,知道了这些事情后,后面我在看很多开源框架的网络模型时候,发现大多数基于 Reactor 的思想来实现的。

有了网络编程总体的视角后,在需要深入理解 socket api 中各种属性设置(超时、非阻塞 IO、阻塞 IO 等)和异常处理就要回归 APUE 这本书。

到这里我才知道 UNP 和 APUE 为什么会被称为网络编程圣经级别的书,原因是书里各种细节和异常都写的很全,也很细致,可以应对工作中很多问题。

但是事实证明,它并不是个入门级的书,所以 UNP 和 APUE 的用途比较像字典,在需要的时候去查阅就好。

学习算机组成也一样,我先看《程序是怎么样跑起来的》这本书,知道了程序跑起来的大概过程以及涉及到的知识点,然后带着这个问题,从《计算机组成与设计》这本黑皮书找到每一部分的细节,通过进一步学习,知道了程序编译过程,知道了 Intel x86 的指令结构,知道了计算机是如何存储并计算浮点数的,知道了 CPU 执行程序的工作流程,知道了计算机存储结构金字塔模型等等。

所以,大家在学习的时候,应该避免直接学大而全的书,我们要先从入门级别的书看起,抓住了主线重点知识后,再通过查阅这类大而全的书来进行深入学习。


# 不要只局限学一本书

我在学习的时候,有个习惯,喜欢找同类型的书一起学,就不会说学操作系统的时候,就只看一本理论书,而是结合 Linux 系统编程和内核分析的书一起看,一层层的深入一个知识点

比如,我在学习操作系统的时候,在《现代操作系统》学了「进程与线程」的内容,而这本书介绍的内容比较概念性的,知识点也比较笼统,不够具体。

然后我就会去学《Unix 高级环境编程》第 7 章「进程环境」、第 8 章「进程控制」、第 11 章「线程」、第 12 章「线程控制」、第 15 章「进程间通信」,这一系列章节看完后,就知道了 Linux 是如果通过创建进程和线程,不只局限于理论了,还学会了应用。

当然这还不够,我还会去学《深入 Linux 内核架构》第 2 章关于进程和线程的Linux 源码分析,发现 Linux 中进程和线程实际上都是用一个结构体 task_struct 来表示的。让我很惊叹的是, Linux 操作系统对于进程和线程的创建,都是调用 do_fork 函数实现的。

图片

只不过传递的参数不同,通过参数的不同来控制是复制父进程的资源(内存、文件描述、信号量等),还是引用父进程的资源,这样会更加深刻知道进程和线程的区别。

再比如,我在学习计算机网络的时候,在《图解 TCP/IP》学到了第六章关于 TCP 超时重传、流量控制、拥塞控制等内容,这本书讲的比较浅。

为了更深入理解 TCP,我就会去看《TCP/IP 详解》第 17 到 24 章,这几章都是详细介绍了 TCP,在这里会学到更全面的 TCP,比如 同时打开或关闭、negle 算法、往返时间 RTT 的计算、还有拥塞控制、快速重传、快速恢复、慢启动这些过程中的拥塞窗口是怎么变化的等等。

但是我在学《TCP/IP 详解》遇到了点困难,因为书里的案例有些地方看的不清晰,也不容易懂,特别是那些 TCP 抓包图,看到瞎眼。

后面我找到了本神书:《TCP/IP Guide》,很可惜只有英文的,我只看了这本书讲滑动窗口和流量控制的章节,因为这本书的精华就是这两个,其他的一般般,这两个章节的配图特别多,也很清晰。

图片

我就在这知道了发送窗口和接收窗口的工作过程,也知道了滑动窗口对流量的影响,也知道了操作系统内存紧张的时候,也会影响滑动窗口,以及糊涂窗口综合症等等。

所以在学习一个知识的时候,大家不一定要把一本书从头看到尾后,才去学另外一本书。

最好的方式是在一本书看完某个章节的知识点后,马上去学另外一本相对比较深入的书的对应章节的内容,这样一层一层的深入下去,你对这个知识点的掌握就会很深刻了。


# 不要只看不动手

计算机类的知识都比较庞大,单纯只看很容易就忘记的了,当然即使做了笔记也会忘记。

就像小林写了很多文章,每篇文章的内容我也不一定都记得住,但是当我回看文章后,知识点很快会被唤醒起来。

所以记笔记的好处在于后面复习的时候,可以很快就能回想起来。

记笔记的方式有很多种,手写在笔记本、在书上标注、在 world 文档记录等等,但这些我觉得都不是好的方式。

我觉得比较好的方式是思维导图,把思维导图当作一课自己的知识树,每深入学一个知识点的时候,就开一个分支去记录,记录的内容最好是用自己的话来描述,而不是复制书上的内容,这样只是单纯的 copy,最好经过自己大脑的思考,用自己的话做个小总结,这样的知识点不容易忘。

还有很多知识其实可以结合生活中的场景来记忆,这样想忘记都难,比如阻塞 IO、非阻塞 IO、同步 IO 和异步 IO,我之前文章用去饭堂打菜的场景来介绍它们之间的区别。

图片

再比如介绍各种进程调度算法,我之前文章用银行业务办理的场景来介绍。

图片


# 总结

最后做个总结,回答开头的问题。

书看不懂,容易放弃,怎么办?

不要一开始选择困难模式,也就是不要一开始选择大而全的书,这类书一般不适合入门学习。

我们先要找新手村级别的书来入门,新手村的书一般很快就看完的,看完后我们大概就知道这类书籍的重点知识,然后再通过查阅这些大而全的书的目录来学习对应章节的内容。

看书的效率很低,怎么办?

其实书并不一定要全部从头看完的,而且也不要固执到一直只看一本书。

最好在学习某个知识点的时候,通过看多本书来一层层的学习这个知识点,这样你学起来的知识点会比较全面,也更加深入。

按这种方式学,你会发现很多书都被你不经意间看了 7788 的。

做了很多笔记,依然过会就忘记,怎么办?

做笔记建议使用思维导图,把思维导图当作一课自己的知识树,每深入学一个知识点的时候,就开一个分支去记录。

在记录笔记的时候,尽量少 copy 书上的内容,最好还是经过自己思考后用自己的话输出的笔记,而且可以搭配生活场景来加深记忆点。


最新的图解文章都在公众号首发,别忘记关注哦!!如果你想加入百人技术交流群,扫码下方二维码回复「加群」。

img

上次更新: 10/27/2023