<audio id="audio" title="100 | 高效学习：面对枯燥和量大的知识" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/80/1e/80b3803c703ed1eb79d725f6c4f3801e.mp3"></audio>

# 如何面对枯燥的知识

首先，我们要知道，为什么会有枯燥的知识？一般来说，枯燥的东西通常是你不感兴趣的东西，而你不感兴趣的东西，可能是你并不知道有什么用的东西。这样的知识通常是比较底层或是抽象度比较高的知识，比如：线性代数，或者一些操作系统内部的原理……越理论的东西就越让人觉得枯燥。

我还记得，当初上大学学习《计算机网络》时，直接学习那个七层协议，以及那些报文，让我感觉枯燥得不行。那个时候，完全不知道这些东西有什么用，因为我连网络是什么都没有见过。直到有一天，我在老师的公司里看到了网卡、网线和Hub，然后了解了Windows NT的域和IP地址，然后用Power Builder 连上了SQL Server，用SQL写入并读取了数据，我才真正明白网络原来有这么好玩。

我开始学习《TCP/IP 详解》，又感到一阵枯燥。然后，有一个同事给我递来了《Unix网络编程》，我照着其中的例子，写了一个聊天服务器，前端用Delphi写了一个QQ的样子，那种兴奋劲就别提了。再后来，因为要处理网络问题，调优网络性能，我才发现，以前随便学了点的《TCP/IP详解》对我在排查网络问题上有很大的帮助。这个时候，我才认真地看了这本书，也正是这个时候，才算是真正读进去了。

后来，我让我团队的一个人学《TCP/IP详解》这本书，他发现有点难啃就买了一本《图解TCP/IP》。我找来一看，发现这种图文并茂的书真是增加了很不错的阅读体验，一下子就觉得不是很枯燥了。这让我回想起来那本《从一到无穷大》的相对论科普书，简单、一点也不枯燥。然而，能把这么复杂的问题用这么简单的语言讲清楚的一定是这个领域的大牛了。

我列举我的这个学习过程，就是想说，如果你发现有些知识太过于枯燥，那么可以通过下面的方法解决。

1. 这个知识对于你来说来太高级了，你可能不知道能用在什么地方。
1. 人的认知是从感性认识向理性认识转化的，所以，你可能要先去找一下应用场景，学点更实用的，再回来学理论。
1. 学习需要有反馈，有成就感，带着相关问题去学习会更好。
1. 当然，找到牛人来给你讲解，也是一个很不错的手段。

# 如何面对大量的知识

看过《程序员练级攻略》的朋友们，一定会有这样的疑问，东西太多了，怎么学。我给你的建议是，一点一点学，一口一口吃。你可以使用我前面说过的那些方法，注重基础，画知识图，多问为什么，多动手，然后坚持住，哪怕你每周就学一个知识点，你一年也可以学到50个知识点。只要你在进步，总有一天可以把这些知识学到手的。

当然，你的目的不是学完这些知识，因为学无止境，你永远也学不完，所以你在学习时，一定不要学在表面上，一定要学到本质，学到原理上，那些东西是不容易变的，也是经得住时间考验的。把学习当成投资，这是这个世界上回报最好的投资。

带着问题去学习，带着要解决的东西去学习，带着挑战去学习，于是每当你解决了一个问题，做了一个功能，完成了一个挑战，你就会感到兴奋和有成就感。这样，你也就找到了源源不断的学习驱动力。

把你学习的心得、过程、笔记、代码分享出来，找到和你一同学习的人，因为一个人长跑很辛苦，有人同行就会好很多，就算没有人同行，你的读者，你的观众也会为你鼓掌加油，这些也是让你持续前行的动力。

人的一生是要永远学习的。加油！

# 认真阅读文档

我发现很多技术问题都是出在技术人员不认真读技术手册上，我自己也一样。在我的成长生涯中，我发现很多答案或其实都在文档中，而我却没有仔细地去读一下。可能是，我们都不想投入太多的时间吧。

在这里，我想说，用户手册（User Manual）一定要好好地读一读，很多很多提示都在里面了，这是让你可以少掉很多坑的法宝。比如：Unix和Linux的man，Docker和Kubernetes的官方文档，Git的操作文档……你的很多很多问题的答案都在这些文档中。

举个例子，很多年前，我掉了一个坑，我把这个问题记录在了文章《 [C/C++返回内部静态成员的陷阱](https://blog.csdn.net/haoel/article/details/1388498) 》中。 其中提到了一个函数 `char *inet_ntoa(struct in_addr in);`，我还批评了一下这个函数。然而，只要你man 一下这个函数，就可以看到：“The string is returned in a statically allocated buffer, which subsequent calls will overwrite”。

还有，很多中国的文档都会教人把tcp_tw_recycle和tcp_tw_resue这两个参数打开。然而，只要你man 一下 [TCP(7)](http://man7.org/linux/man-pages/man7/tcp.7.html) ，就可以看到这样的描述：

<img src="https://static001.geekbang.org/resource/image/63/29/6380f606c4a66bb0a869c19b8ea1ad29.png" alt="">

你就可以看到这两个参数都是不建议被打开的。

认真阅读用户手册不但可以让你少掉很多坑，同时，还能让你学习到很多。

# 其它几个实用的技巧

<li>
**用不同的方式来学习同一个东西**。比如：通过看书，听课，创建脑图，写博客，讲课，解决实际问题，等等。
</li>
<li>
**不要被打断**。被打断简直就是学习的天敌，所以，你在学习的时候，最好把手机设置成勿扰模式放在一边，然后把电脑上的所有通知也关掉，最好到一个别人找不到你的地方。
</li>
<li>
**总结压缩信息**。当你获得太多的信息时，你需要有一个“压缩算法”。我常用的压缩算法是只关心关键点，所以，你需要使用表格、图示、笔记或者脑图来帮助你压缩信息。
</li>
<li>
**把未知关联到已知**。把你新学的知识点关联到已知的事物上来。比如，你在学习Go语言，你就把一些知识关联到自己已经学过的语言上比如C和Java。通过类比，你会学得更扎实，也会思考得更多。
</li>
<li>
**用教的方式来学习**。你想想，如果你过几天要在公开场合对很多人讲一个技术，那么这个压力会让你学得更好。因为要教给别人，所以，这么高的标准需要你不但要把自己已掌握的东西学好，还要把周边的也一并学了，才可能做到百问不倒。你才敢去教别人，不是么？（试试教6岁的孩子编程，如果你掌握了这种技能，那么你一定是把知识吃得非常透彻了。）
</li>
<li>
**学以致用**。把学到的东西用起来，没有什么比用起来能让你的知识更巩固的了。在实践中，你才会有更为真实的体会，你才会遇到非常细节和非常具体的问题，这些都会让你重新思考，或深化学习。
</li>
<li>
**不要记忆**。聪明的人不会记忆知识的，他们会找方法，那些可以推导出知识或答案的方法。这也是为什么外国人特别喜欢方法论。
</li>
<li>
**多犯错误**。犯错会让你学得到更多，通过错误总结教训，你会比没有犯过错的人体会得更深。但是千万不要犯低级错误，也不要同一个错误犯两次。
</li>

如果你有更好的一些技巧，欢迎你分享出来。

# 小结

总结一下今天的内容。首先，我先分析了为什么会有枯燥的知识。我认为，枯燥的知识通常是你不感兴趣的知识，也有可能是你不知道有什么用的东西。然后，结合自己的经历给出了面对枯燥的知识时该怎样做。此外，我们身处在信息爆炸时代，如何面对如此量大的知识，也是我们面临的一个挑战。我建议，一定不要学在表面上，一定要学到本质上、原理上，一定要学那些不容易改变，能经得住时间考验的东西。

随后，我分享了认真阅读文档的重要性，不仅可以让你少掉很多坑，还可以让你学习到很多知识。最后，我分享了好几条实用的学习技巧，这些也是我在工作中慢慢收集和总结起来的。希望对你有帮助。

下面是《高效学习》系列文章的目录。

- [端正学习态度](https://time.geekbang.org/column/article/14271)
- [源头、原理和知识地图](https://time.geekbang.org/column/article/14321)
- [深度，归纳和坚持实践](https://time.geekbang.org/column/article/14360)
- [如何学习和阅读代码](https://time.geekbang.org/column/article/14380)
- [面对枯燥和量大的知识](https://time.geekbang.org/column/article/14389)
