学习内核的好处很多,在学习过程中不仅可以夯实大量理论基础,还可以学习到很多编码惯用法,提升学习能力和分析能力。
但是如果问其如何学习Linux内核,不同的人会给出不同的答案,有的人会告诉你先去看看0.11的内核源码,有的人则是推荐先看《Linux内核设计与实现》这样的书,有的人则会说先把内存寻址学懂,然后再开始考虑网络协议栈和文件系统之类的内容。
如果是以前,我一般都是上面的几个答案,不过今天的内容并不从这几个角度去介绍,而是介绍一些我学习过程中的一些小技巧。
高度决定视角,视角决定行动在学习内核过程中最容易犯的错误,也是非常难掌握的其实是你站在一个什么样的高度上去学习。
站什么样的高度去学习也与自身的能力相关,所以这个问题其实更多是在新开始学习的学习者感到非常痛苦的一件事。一方面又希望自己能学懂,但是又不知道如何开始入手。
我列举几个常见的例子:
(1) 一开始就看源码,最开始我也做过这种事,内核有什么都不知道,结果就想着啃0.11的内核,结果很显然,2天立马放弃,完全看不懂。
(2) 翻开书从第一页开始往下啃,如果这本书比较薄还好,如果比较厚,比如《深入Linux内核架构》,那看2天也得放弃。
(3) 不喜欢看目录,不喜欢快速浏览,就想着一个一个字眼的往下抠。如果本身有一定基础,看的时候还不会觉得腻,但是很快就发现,看了半天,什么都没有记住。
还有很多类似的问题,这些都是我们平时学习的时候特别容易出现的一些误区。这些其实都是没有正确审视自己的能力,胡乱挑选高度导致。
高度是什么?说了半天,这个高度到底是什么?我这里给一个我自己的界定:
高度:指切入问题时采取的抽象程度。
语文不好,说的乱七八糟,说的直白一些,也就是说:
高度越高,也就是越偏向于理解各种抽象概念,倾向于构建对整体结构的一个认知,忽略一些不必要细节,不关心技术实现手段。
高度越低,也就是越偏向于对使用技术的选择,倾向于代码实现的各个细节,但是前提一般会在某个抽象的概念领域内进行各种细节性的讨论。
我们的大脑更倾向于理解抽象的内容,但是在行动时,我们却更倾向于去把握细节性的内容。结果导致的内容就是,我们总是希望通过学习细节来构造对抽象概念的理解,最后被细节性内容中各种噪声干扰思绪,产生一种“这东西好难”的错觉。在理解了这点,那高度对我们的行为有和指导意义也就呼之欲出了?以读书为例
站的越高,意味着自己看的内容越粗糙,也就是看书的时候不会去逐字逐句的看,而是一个章节一个章节的看,极端的情况就是只看目录,在这个过程中主要集中精力构建整体结构,对核心的概念进行抽象。这时候学的内容都相对表面,但是好处就是对以后的学习有很强的指导意义,缺点很明显,会让人底气不足,而且在达到一定程度后,很容易到达瓶颈,发觉怎么看都看不懂了。
站的越低,意味着自己看的内容很细致,看书的时候就是一个个字眼的扣,极端情况就是开始阅读源码,去看开源社区的各种问题。但是就像诗句说的,站的越低,也就常有一种“不识庐山真面目,只缘身在此山中”的感觉。这种情况下特别容易被各种细节干扰,例如为什么要有这些参数,为什么这里需要判断这个条件等等这些细枝末节的问题。
如何运用高度以前对一篇博文印象很深刻,作者理解的学习曲线划分成了两个比较大的过程,上升的过程就是一个不断学习积累的过程,而平缓没有增长的过程则是对之前积累到饱和的知识进行消化的过程。
我将这个学习过程进行进一步的划分,我觉得在学习积累的前半部分应该以偏向学习抽象概念为主,而后半部分应该偏向学习实现细节。
所以个人的心得是从高到低的学习,在一个新的学习阶段,应该先多花点时间学习一些概念化的内容,这时候切忌去看具体的实现,而是多考虑如何在大脑中构建各种抽象模型,对整体的架构有所概念了,然后开始学习一些细节性的内容,比如开始看些源码,抠写书上的字眼,读读一些具体的博客什么的。
注:在图中还有一个消化过程,这个过程的主要任务就是将不同的知识点进行串联,形成一个有粗有细的知识拓扑网络。