[转]阅读源码的感悟

 原文链接http://www.csdn.net/article/2014-06-05/2820092-interview-with-pengxu

源码阅读其实是一个逆向的工程,这期间必须会遇到种种问题。一般来说,我会遵循这样一个思维范式——Problem domain→model→architecture&implementation→improvement→best practice。

1. 首先搞清楚要分析的产品解决的问题是什么,这个问题在哪个大的范畴里,也就是要搞清楚problem domain。一个著名的开源产品必定在Wikipedia上有相应的条目,所以一开始去看wikipedia是破题的一种极好方式。

2. 清楚要分析产品的大体框架和关键性的概念,也就是理解清楚architecture和key concept。

3. 将分析的产品实实在在的运行起来,我一般选择debian或archlinux作为工作平台,它们提供了丰富的软件包,可以很快的将东西安装并运行。熟悉Linux本身对于开源项目的源码阅读还是大有裨益的。

4. 修改日志级别,得到丰富的日志信息。有了这个为基础,再来开始真正的源码阅读和分析。

5. 源码分析的时候,要始终问这几个问题。

  • 进程以及线程的启动顺序
  • 搞清楚调用关系call flow
    • 这一部分代码是在同一个进程中么,同一个线程中么,运行在同一台机器中么
    • 每一个线程都要问清楚,什么时候启动的,什么时候停止的
    • 消息传递的路径,针对每一个函数,搞清楚,input是谁传给我的,output要传给谁,由哪个来传
    • 搞清楚上述的问题之后,就将最开始提到的对architecture的了解做到具体而微了。有了这个基础之后,再继续往下问
      • 当前实现的性能如何,比如i/o, cpu, network 这个需要做相应的测试方面的试验
      • 当前的解决方案还有优化空间吗,比如针对spark中的scheduling问题,就有sparrow的优化机制提出

      6. 碰到具体的问题一时解决不了怎么办

      • 用好google,用好stackoverflow
      • 将碰到的问题模型化,写一些验证性的代码,或者是写一个小的demo来验证,我在解决许多很妖的bug,也是采用类似的思路
      • 找到相应的用户论坛,发帖虚心请教
      • 如果还是不行,就先搁一搁,去看能看懂的地方

      7. 编程语言选择

      • 源码阅读中可能遇到的一个问题就是这个语言是新近出来的,我根本没学过,我需要系统去掌握该语言之后,才能来看源码么。我的看法是可以边看边学,在掌握语言的过程中,牢牢把握住这几个问题
        • 基本语法:数据类型、控制语句、函数定义
        • 是否支持FP
        • 多态和继承
        • 现代编程语言基本上都混合了面向过程,面向对象和函数式编程的特点,即便是C++或新近的java8都如此。
        • Storm用Clojure来编写,而Spark使用Scala,就语言的偏好来说,我更喜欢Clojure一些。 

        稍微总结一下,我想源码分析心中要有两幅大图,将整体与局部很好的结合起来思考

        • 一是太极图,要有整体性的思维,要对architecture有掌握,对其在整个生态系统中的定位要清楚,东方式的思维强调整体性
        • 二是数学中常见的笛卡尔坐标体系,将大的问题拆分之后一一研究,做到具体而微,西方式的思维强调个性
        • 0
          点赞
        • 0
          收藏
          觉得还不错? 一键收藏
        • 0
          评论
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值