为何要读源代码,如何阅读源代码

因为项目的需求,最近花了较多的时间来看开源项目的代码,在本文中,简单总结一下对为何要看源码、如何看源码这两个问题的思考。html

本文地址:http://www.javashuo.com/article/p-rvqiwgun-z.htmlpython

看源码的意义

看源码只是一种方法、手段,而不是目的。我也曾经给本身制定过“阅读xxx源码”的目标,如今看起来真的很蠢,一点不smart(specific、measurable、attainable、relevant、time-bound)。只有搞清楚了阅读代码的目标,才能有的放矢,抓住重点,高效达成任务。面试

看源码的意义总结起来包含但不限于如下几点:redis

第一:解决问题(BUG)算法

只要是代码,就会有bug,只是说bug的多与少、深与浅罢了。如今你们都喜欢发布、使用开源项目,不一样的开源项目社区成熟度、代码质量又会有较大的差别,遇到bug就不足为奇了。mongodb

固然,遇到bug确定是先在网上搜索是否有相似的问题,通常能够在google、Stack Overflow、项目的issues里面有对应的关键词搜索。若是搜不到,那么就只能看源码解决了架构

第二:知其因此然框架

我在如何学习新技术、团队技术选型时要注意些什么里面提到过,若是咱们须要将一个开源项目用到本身的项目中,那么就必须了解这项项目的优缺点,并深知原理,对部分细节(尤为是项目的优点、feature)进行深刻研究。若是是成熟的开源项目,遇到问题也许能google到不少答案;但若是是一个处于快速发展中的开源项目,多了解其架构、核心原理,也能帮助快速定位问题。分布式

另外,有的项目文档可能不那么丰富,但又不得不使用,那么如何以正确的姿式使用呢?也得参考源码函数

第三:学习

看源码也是一种不错的学习方式(虽然不必定不是最佳的方式),尤为对于比较优秀的开源项目,能让人大开眼界。

即便是出于学习的目的,也是有不少侧重的,好比

  • 学习语言:代码风格、规范、惯用法、高级语法。对于某个语言的新手,找一个熟悉领域的开源项目来深刻掌握这门语言,也是一个不错的注意。
  • 学习设计:数据接口、框架、总体架构
  • 学习理论:算法、协议。好比我以前写过的raft协议,光看论文是很枯燥的,并且算法理论到工程实践仍是有必定的差距,这个时候结合开源项目(mongodb)实现每每更事半功倍。
  • 其余

第四:改造

通常来讲,咱们刚开始仅仅是使用一个开源项目,但随着使用的深刻,会发现一些本身须要的功能并无很好的支持,向项目组提的issues也可能得不到快速的响应,这个时候就要本身开分支,改代码,加功能了。固然,比较好的是将本身分支比较好的新feature 给原项目提merge request,反哺开源项目,好比阿里的Blink

第五:借鉴

他山之石能够攻玉,若是有须要从新开始本身造轮子,那么参考一些已有的、优秀的轮子确定是有好处的。

副产品:找工做

这一点,不该该做为咱们阅读源码的出发点,可是确实能在实际中对找工做、面试有加成,算是副产品吧。

如何看源码

看源码的目的很大程度上影响了看源码的方式、须要阅读的代码的范围。好比说,若是是为了修一个线上bug,那么阅读代码的范围就牢牢围绕bug自己;而若是是为了了解某个分布式算法,那就须要按大量的、可能运行在不一样节点(进程)上的代码,了解其交互原理、工做流程。

下面说一些通用的方法。

先看文档,总体把握

通常来讲,文档是对代码的高度凝练,一个高质量的开源通常会包含tutorial、specification、API reference等documents,经过选择性的略读、精读这些文档,就能大体了解项目的总体架构、设计原则。正确的路线是经过文档去认识这个项目,然乎经过阅读代码去验证文档、深刻细节,而不是经过直接啃源码来了解这个项目,以偏概全。

理解代码组织,文件名,类名

当须要看代码的时候,不要找到一个文件就开始,先看看代码组织,粗略看看文件名、类名,基本就能猜想到每一部分。好比redis的源码就组织得很好,基本上看文件名就能够快速定位每个command的实现位置。

关注一个问题,从问题追踪代码

看源码的目标决定了此时此刻的关注点,不论是解决遇到的bug仍是学习某个算法,都让咱们聚焦到一个具体的问题,从这个具体的问题去追踪代码,忽略掉当前无需关注的细枝末节,步步深刻,直达目标。固然在解决一个问题的时候,有可能会引起新的问题,尤为是学习的时候,此时只需记录新问题(放到收集篮,不要当即发散),待以前追踪的问题解决以后,再来看新发现的问题。

解决一个issue

若是本身没有问题,那么就帮忙解决别人的问题,一般来讲,开源项目都有许多待解决的issue,从中选择一个入手便可。

调试

只要能够,必定先让代码编译经过、跑起来,这样不论是加log、打印调用栈仍是断点调试都方便不少。尤为是对于像python这种动态类型代码,不跑起来很难知道到底在干啥。

加注释,作笔记

若是某份源代码的阅读并非一锤子买卖,往后还可能回顾、从新阅读,那么就必定要作好代码注释和笔记。笔记主要是框架图、类图、流程图,目标是创建索引,方便往后快速回忆。而注释就是阅读代码时的细节,从新阅读的时候看注释(特别是函数的注释)能节省不少时间。

以上,仅仅是一些我的总结,还请多多指教!