来源:技术让梦想更伟大
整理:李肖遥
代码并不是写给人看的,而是交给机器运行的。
所以我们去理解别人的代码时,并不能像看小说一样去通篇的阅读代码,而应该是像研究化石一样去调查它,解密它。有时我们往往也需要把对方的一段代码亲手的实现一遍,然后自己举一反三看自己会怎么去实现它,才能真正地理解。
举个例子:
不管是建一栋楼还是建一栋木屋,大致流程是这样的:画图纸→打地基→整平地面→建框架→砌墙→装修。
虽然大致流程是一样的,但显然建一栋楼所需要实现的细节远远大于建一栋木屋。
如果让一个人去建好一栋楼,这在技术实现和时间成本上是不切实际的。一栋楼的建成是许多分属不同工种的人群共同协作的结果。如果以做一栋楼的标准去建一栋木屋,显然也是不切实际的。比如:不可能用建一栋楼的地基去建一栋木屋。
如果我们要学习如何去建造一栋楼,我们可以先学会如何建一栋“木屋”,然后再深入的学习建造一栋“楼”的某个模块,再转向其他模块的学习。只有通过不断的实践,才有可能建成一栋布局合理、坚固耐用的楼,而不是空想。如果只知道生搬硬套别人的理论知识而不懂得根据实际情况作出改变,就像搭积木一样,建成的楼最终还是会东倒西歪而倒塌。
在战场上可以没有某个士兵,但不能没有拥有全局观念的指挥官,指挥官即使不亲自上战场也能左右整个战争的结果。指挥官也是从士兵做起的,但不是每个士兵都能变成指挥官。
一个人看完Linux内核源码的难度
Linux内核最初是由李纳斯托瓦兹在赫尔辛基大学读书时出于个人爱好而编写的。第1版本于1991年9月发布,当时仅有10000行代码。如今的Linux内核Git源码树中的代码达到了2780万行,核心代码只有2%是由李纳斯托瓦兹自己编写的,其他均是其他个人和组织贡献的,李纳斯托瓦兹公开了Linux但保留了选择新代码和需要合并的新方法的最终裁定权。
这么多的代码一个人可能穷尽一辈子都很难吃透,如果有人能够完全吃透,世界上除了Windows、MacOS、Linux,早就诞生了其他的很流行的系统了。“耐住寂寞,阅读代码”并不是一个可行的办法。在大多数情况下会半途而废,一个月之后,可能全部都忘记了。
学习Linux最重要的是培养自己写代码的能力和对Linux框架结构的了解
假如我们向某个人很有能力的人学习,并不是跟在他的屁股后面,他做什么你就做什么,那你的这个学习的过程只可能形似,而不是神似。当你单独处理某件事时,还是会手忙脚乱、处理的很不好。学习这个人的过程应该是看他处理某件事分开了哪个步骤,每个步骤又是如何处理和衔接的,自己有没有更好的方法实现。
学习Linux也是一样的,你需要知道Linux内核是由哪些模块组成的,这些模块实现的是什么样的功能,这些功能实现的原理是什么,模块与模块之间又是如何衔接才构成了一个完整的系统。通俗一些讲就是要有将军的架构意识和合理调控意识,而不是士兵的冲锋陷阵和奋勇杀敌的意志。因为Linux是一个庞大的系统,而不是时间线上的某一件事情。
没有当过士兵的将军能不能算是好士兵?不能,充其量只能算是“纸上谈兵”,将军只有清楚地了解士兵是如何冲锋陷阵和奋勇杀敌才知道如何去摆兵布阵。所以学习Linux不光光是要有阅读代码的能力,还需要有能熟练写出优秀代码的能力。
比如:
同一个软件项目,有的人项目规划很简洁,有的人项目规划很繁琐,项目规划决定了整体代码的规模。写程序代码实现某个功能时,有的人算法简洁代码量少在硬件上执行效率高,有的人算法繁琐代码量多在硬件上执行效率低。
所以我们对Linux内核的框架结构有了全面的了解之后,可以通过深入的学习某个模块来培养我们写代码的能力。当写代码的能力不断的提升就会对Linux内核有一个比较透彻的理解,这时就已经完全学会了Linux内核。
我们不需要纠结于多久能读完Linux内核源码,而是学会如何去读懂它
有人说穷尽一个人的一生都很难写出媲美Windows、MacOS、Linux那样的系统,但如果你对操作系统有架构层面的全面认识的时候,就不会这么说了。
Windows、MacOS、Linux并不是一个人独立完成的,他们是许许多多的人团队协作的结果。假如一个人独立完成一个操作系统需要100年,通过划分模块,将每个模块分给不同的团队来做,最终每个模块测试完后,整合成一个完整的系统,可能只需要几年。Linux内核从最初的10000行代码到现在的2780万行代码就是全球精英共同贡献的结果。
‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧ END ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧