注:总结了网上几篇高赞的文章后。写下的这篇如何阅读开源代码
为什么要阅读开源代码
-
提升自己
阅读开源代码你能看见很多自己没有用过的语言特性,好的代码结构,以及一些代码规范
-
解决已知问题
有时候自己或者公司的项目遇到困难了,不一定都要自己造轮子,尝试寻找开源方案也是一种选择
如何阅读开源代码
一 了解自己的需求
为什么要看,是学习别人的代码,还是因为用了他的代码,出了问题需要解决,还是说单纯的问了找工作去了解这个项目。
给自己定好需求才知道自己该了解这个项目到哪个程度。
- 如果是一心求学,那么我们应该深入的去了解。尽量吃透每一个模块。
- 如果是解决bug,我们梳理完大致的子模块流程,就可以开始寻找问题所在了。
- 如果是为了应付面试,我们甚至可以不用看项目先,先去找有没有别人总结好的文章,看看符不符合现在面试的要求即可。
二 准备工作
一上来就怼着某个函数某个文件看是很难一下子弄懂的。
- 先去看项目的README,查看项目的官网介绍。了解项目的背景以及解决了什么问题。
- 了解项目中运用的技术,知道出现的专业词汇是什么意思。
- 如果项目比较大,只用github看会很麻烦,建议git clone 拉下来用自己比较顺手的编辑器来阅读,例如我比较喜欢用vscode。
- 如果可以,尽量选版本低一些的,学起来会更加的轻松,等阅读完再去看看新版的也会更得心应手。
- 先准备一些书籍或者文档。英文的会更好,国内的很多时效性已经不够了。
- 如果有运行的环境,最好能够跑一跑项目的实例,一般在
example
或者demo
目录下面。能够很快的有些许成就感。已经看到一些不曾见过的打印也对自己接下来的阅读更有信心。
三 开始阅读
当我们已经大致的梳理完了项目的整体结构,知道了项目中运用了哪些技术,有哪些专业词汇。
-
查看项目的文档,一般在
doc
目录下面。基本所有的项目都会配备文档,可能是md也可能是rst。而且这里面的文档大概率会比官网的文档时效性好。(起码我现在在看的cyclonedds是如此的)
-
了解各个模块的作用和直接的依赖关系,以及开放了哪些接口。
每一个模块只有少数的接口开放,很快就能够知道这个模块对外提供什么样的能力。以及这个模块的作用。
-
如果你看的是c/c++的项目并且你对makefile或者cmake比较熟悉,能够看懂。那么我建议可以去看看项目的构建。其实这也是快速了解模块依赖关系的一种方法。
-
查看重要的数据结构,函数名。
程序是数据结构和算法。数据结构可以看出一些设计者的思想和代码的架构。好的项目基本上看他的函数名就知道这里面做了什么。
-
先顾主,再顾旁。应该先梳理重要的流程,再去梳理其余的。
例如我在看dds 是如何发送消息的时候,我明确了我是要看dds怎么发出去的。那么当遇到拼接消息,校验消息的代码。先都可以不管他。除非我是需要看他如何校验的。
-
添加自己的注释,以免你看了后面又忘了前面。
-
如果有条件,可以自己添加注释或者单步调试。没有什么比这个更让你记忆深刻了。
四 总结
阅读代码,特别是大型项目的代码。对大部分人来说是一件不算简单的事情。所以我们最好能够有所总结。好记性不如烂笔头。
- 可以写篇博客,画画流程图,类图或者写一个总结出来。
- 思考一下别人为什么这么写,他的设计是怎么样的,又是怎么想的。
- 思考一下我自己来实现这一套会如何实现,会不会考虑到这些问题。
五 最后
-
选择与你当前的编程技能与知识水平相当的项目。
一上来就看linux内核实现。兴致勃勃的看了一会发现太困难就放弃了。又想看stl实现,发现全是下划线。又受不了放弃了。所以还是要慢慢深入,根据自己情况尽力而为。
参考(还有几篇找不到了):
为什么我们需要读源码 如何阅读开源代码