首页 > IT资讯 > 正文

我们应该怎么阅读学习开源代码呢?

开源代码作为一种特色的产物,随着物联网的进步得到了前所未有的发展。一开始,很多代码其实不是开源工程,后来软件的开发商发现根本没法用这些代码来挣钱,所以索性把这些代码发布到网上,让更多的人来进行维护和开发,比如说IBM的eclipse就是这样。

 

当然,在网络上还是存在很多志趣相同的人,因为网络让他们走在了一起,一起讨论方案,一起讨论软件架构,慢慢社区的影响力也会越来越大,这方面做的最好的就是Linux、kde、gnome等软件。

 

后来,在社区发展起来后,很多的大公司为了让这些开源软件在自己的硬件设备上跑起来,纷纷对这些开源工程投入资源、建立相应的基金会、贡献代码等,比如说hp、富士通等。等到后期,一些公司主动开发开源软件,根本不指望他们能给公司带来什么收益,而是希望借此带来广阔的人气,比如说Android软件。

 

关于开源代码,其实可以说的内容很多,每个人也有自己的心得体会。今天主要是抛砖引玉,谈谈学习开源代码的一些小经验。


开源代码的特点

相比较私有软件,开源代码有很多的自己的特点,我们不妨聊聊看看,


开源代码质量差别迥异;

开源代码形态各异,有的是完整的软件,有的只是插件;

开源代码热度不一样,很多软件其实已经没有人维护了;

开源代码一般没有专门的支持人员,很多事情需要自己解决;

开源代码的编译环境迥异,要努力寻找合适自己的。


如何阅读代码?

要阅读代码,需要很多的前期条件。首先,你得把软件编译出来吧;其次你需要基本的软件知识吧,常用的调试方法也必须掌握;最后,对于软件本身需要的内容你得明白吧,搞视频播放的得知道视频编解码的相关知识,搞压缩软件的要知道压缩的相关算法,搞搜索引擎需要知道爬行、分词和索引查找的相关知识吧,当然这些都是一些基础条件。那么,如果我们已经做到了上面几点,接下来应该怎么做呢?


下载代码,本地编译通过,生成版本;

熟练使用该软件,明白软件的基本功能和操作方法;

根据软件功能分析软件的模块结构;

寻找到某一个软件最被可能断住的地方设置断点,查看上下文;

围绕上下文判断代码的来龙去脉,逐步展开;

尝试修改代码,重新编译验证自己的想法,循环之;

不断拓展代码的阅读范围,注意记录笔记和与网友分享;

分析代码的时候,忌快,一目十行不如看懂一行。

 

编译环境

对于C语言和C++与来说,使用的比较多的还是windows环境和linux环境。其实C语言的编译其实挺简单的,windows上面有visual studio帮忙,linux上面有autoconf和automake这个强大工具,编译看上去是件容易的事情,其实不然,


不同的编译器对C语言的支持标准是不一样的;

编译器的不同版本也会出现编译不一致的情况;

很多软件常常需要进行修改,这就是对大家基本功的考验;

某些软件需要依赖第三方库,需要自己动手编译;

部分软件只支持高版本的编译器,移植到低版本的编译器要靠自己;

部分软件使用linux可以编译通过,但是在windows的cygwin就是编译不过;

部分软件编译时间长,而且内存占用大,一旦编译失败,前功尽弃;

头文件失败、链接失败、数据类型转变失败,很多情况需要自己处理解决。


如何选择代码?

网上的代码很多,但是要选择真正对自己有用的代码。否则,对于那些低质量的代码,即使你下载下来也没有什么用。


下载高质量的代码;

下载的代码要结构清晰、编写规范;

下载的代码要可编译;

下载的代码最好一直在演进中;

下载的代码最好经过了很长时间的验证;

下载可以独立使用的一段代码,好阅读、好总结;

使用业内广泛使用的开源代码,降低成本,尽量不要一个人战斗。


相关工具下载

目前关于代码下载的办法还是很多的,当然最简单、最方便的还是直接从服务器上面进行下载使用,不过现在也有很多的下载软件了,比如说,

svn工具;

Git工具;

ftp工具等等。


如何寻找代码?

首推的当然是github;

到sourceforge上查找相关代码;

到google code上面查找具体的代码;

直接到开源项目网站上面寻找代码;

到csdn等网站下载代码,偶尔会有意外的收获;

到图书出版社下载图书附录的代码;


一些简单的学习项目推荐

chrome源码;

redis源码;

nginx源码;


其他的经验

相信重复的力量

读源码过程中最深的一点体会就是,重复重复再重复。当年读ttserver源码是刚入行,本来对C就不熟,ttserver里有很多比较奇怪的代码习惯,于是硬着头皮vim一行一行一遍一遍地看,有些不懂的地方,看十来遍,还真就懂了,可能算是量变引发质变吧。


从数据结构入手,先想后读

然后后来我学聪明了一点,不再从main函数一行一行的开始,学着先读 .h 文件,了解数据结构,结合能找着的文档,脑补作者的思路,在这个基础上再去读源码,看自己和作者想的有什么不一样,经常能发现自己错误或者不周全的地方,偶尔也能窃喜和大师们的不谋而合。


善用工具

再后来发现原来有ctags这类东西,如有神助,加上这时对C语言的基本写法有了一些了解,读码效率顿时提升。今年下半年在lua和nginx中选了先读nginx代码,目前结合一些工具做记录,也颇有成效。


理论与实践结合

当然,我读过的所有源码,都不是为了读而读,基本都是我工作中经常会用到,会面对的一些东西。所以这里有一点也很重要,建议最好先了解你这个东西的功用,再去读源码,否则真的很难读懂。最最好的当然是经常用到的东西,自己对其本身的功能已经很熟悉了,甚至说内部实现机理都能略说一二,这时候读起来肯定更省力。


教就是学

读码之后写文章也不错,有时候你以为自己读懂了,真提笔要写一个模块分析的时候,突然发现还有东西是模糊的,或者前后逻辑串起来是矛盾的,这种事也常有。于是我一直认为,能真正写出一篇让人看得懂,没有问题的分析文章,才真的算是读懂了一个模块。


上一篇:谷歌机器学习TensorFlow新版发布,成最受欢迎深度学习项目
下一篇:联通混改方案或已敲定:阿里腾讯百度可能都会参与

PythonTab微信公众号:

Python技术交流互助群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854