关于阅读源代码

2016-10-13

  我刚开始学习编程的时候,总想着去学习一些成熟的、有名的项目的源代码,告诉自己这样优质的项目代码质量一定很不错。我曾经试图学习emacs,scheme,vim,Python,Erlang,JVM,linux,couchdb,mysql,lua,redis,bullet,physX,OpenGL ES(树莓派上面GPU driver 就曾开源过),STL,openni,LLVM等等,现在想想,部分原因是想和这些有名的东西扯上点关系,增加自己面试时的装X程度,后来是想把某个开源项目研究透了,变成手中的一把利剑,成为领域内的高手。我多次实践,并没有长久的坚持下去,并没有达到自己预想的那种吃透一个开源项目可以管饱两年的状态。我不认为是我毅力不够,而是我隐隐觉得这种方式对我来讲效率并不高。想从开源项目的源代码中学习,这个出发点是好的,如果没有具体的学习目标、好的方法步骤、适当的总结,而把学习开源代码当作目的,这就不好了。学习开源代码,是一种锻炼方法,是为了学习他人的经验,应用到自己将要做的项目中。漫无目的的随处看看,强行分析,希望获取零星的收获,就像在海边寻找贝壳寄希望于运气。我曾很长时间关注淘宝褚霸,表面上看起来是研究Erlang多年,遵从一万小时理论,但是,我也并不清楚他的时间分配和兴趣范围。便无从判断人家变成大牛的主要原因是不是学习开源代码。
  我们从源代码中学习,一般学习的目标有:

  一般而言,我们学习的开源项目分为:库、框架、开源程序。
  对于lib,如libevent,ACE,JSON lib, XML lib,log lib,OpenCV, OpenGL ES,blas,bullet之类的,各种语言都有,数量最为庞大,多数代码规模不大,结构相对简单,我看过的blog中去分析这些源代码的文章最多。因为lib只适用于某些功能,不复杂,所以,多数分析偏向浅显。但是,对于学习者的帮助也是很大的。因为lib一般独立,能够学到如何分拆层次。lib可能会对于不同的需求有不同的实现,会有一些设计模式。如果想要从lib中学习如何写程序,这大抵是不靠谱的。
  学习框架代码也普遍的,框架和业务模型结合程度比较高,做Web的总会想要自己写出可运行的PHP或者Java MVC框架或者分布式框架,做网络游戏的想学习大型网络游戏服务端是如何设计的,学习现有框架,多只是想知道框架的结构和在系统中的运行过程,自己改改也能够实现出来的,有人给你讲课,也能学会这些东西。对于有几个小项目经验,想要更进一步,构建大型系统,却经验不够的人,研究框架是有必要的。
  对于开源程序,这就有些难度,多是系统级的程序,如mysql,nginx,tomcat,linux kernel,lua,Python,层次多,规模大,领域专一,可能带有各种hack和平台相关代码。分析起来难度最大。多是在工作稳定之后,想要更进一步才会去做。进入工作正轨后,就会发现,我们的工作所需的各项能力中,重要的不是对这个底层细节特别熟悉,而是对全局的掌握,是能够按照需求近最大限度的利用现有的工具。如有两三年的WEB方面工作经验,多不再局限于去分析一些lib的代码,想要知道如何实现,而是知道那个易用,把业务转换为程序才是公司需要的能力。
  想要通过开源项目,把某个方向做精通了,也是好事。但是,谁又能知道走出圈子看看,未可知能见识到新的天地。阅读学习开源代码,发生在我们职业生涯的各个阶段,所以学习的目的也随之变化。对于多数从普通学校刚毕业的人,参与的项目不多,又难以有把业务用程序实现的经验,需要靠这些小的实验项目,源代码学习来表明自己的经验,这是无可厚非的,也推荐这么做。对于工作稳定后,需要把理论和实践并重,把时间都花费在学习开源项目上也是不好的。找到适合自己当前能力范围内的开源项目进行学习,也要确定好适合自己的方向。毕业生一上来就想分析Linux kernel,做PHP、Java Web开发的同学,想在互联网方向发展,去分析mysql,nginx代码,究竟想从中学到什么呢?分析开源的程序的源代码能学到什么呢?学习设计模式?设计模式这个概念被过分的夸大了,没有那么重要。“代码风格”的话更无所谓了。还是说明一点,学习开源项目只是一种锻炼方法,而不是目的。什么是学习目的,这点才是最需要花功夫搞清楚的。
  以上是我这几年的经验,或许不正确,等三年后再来回顾。

 

如果有任何意见,欢迎留言讨论。


[ 主页 ]
COMMENTS
POST A COMMENT

(optional)



(optional)