转知乎:如何阅读源代码-- 源码理解不是读出来的,是用来debug出来的.

软件设计背景了解

学会使用/有单测case

    熟悉类图的前提是要了解动态流程,本质的数据流. 类都是为了复用抽象使用的. case越多,使用场景越多, 抽象会越多,类也会越多.

模块架构了解

代码结构了解

开始阅读/debug

    首先先强调一个观点,源码不是读出来的,而是debug出来的(标题党). 首先还是要知道怎么用, 大体的概念, 当你只通过源码阅读遇到瓶颈时,debug就能扫清你的疑问.在对应的地方设置debug.(特别是call hierechary流程特别长时), 读源码费劲时,那么请debug了解执,行流程和启动流程.(知道了业务和设计文档,但不一定知道很细的各个类的作用)

   如何发现debug点

         1. 可以从启动的打印入手,把日志级别开为debug

         2. 从设计文档里找对应的想了解的类. 

   产出:

         画出类图(idea有工具), 画出流程图

               

         业务系统,有表的先看表.  后面看能不能将表拆出. 业务垂直切割,水平分割. 还有就是边界. 功能需求,性能需求,安全需求.

         中间件系统. 启动过程,配置配置过程(spring的FactoryBean定义过程,FactoryBean的实例化过程).执行过程,将代码分层. 哪些是DO,哪些是中间BO. 框架看回调,模式看回调,看接口. 然后就是算法逻辑了.

     

看到知乎几位同学所答,甚为同意

0. 使用过,看用户文档,下载可执行包进行使用。

1. 使用过,或者知道是干什么的

2. 看设计文档,理解大概(能理解对应的术语和背后的领域含义)

     注:大部分情况,1,2,3 都没有啥问题。只有极少数情况才会有问题。 如果1,2都不过关,那就要去补基础知识。或者先看他的用户文档,进行使用。

3. 看quick start 或者自己找个单测跑跑

4. 大致理解单测结构和代码结构。整理出代码结构文档。这个是看细节代码比较重要的。

5. 带着设计文档没有介绍的问题去跑单测,debug (从而看懂代码)理解持久化类(数据库对象,文件对象)/长期内存类(例如:线程池对象,连接池对象,线程,连接),忽略Bussiniss Object

     例如kafka 的分区和rocketmq的分区的区别,即持久化区别。

     这个比较难的,如果没有人能直接回答的话。设计文档上也没有明确说明。好在rocketmq上已经回答了该问题。

6. 画出模块图和框架图

      多层,上下左右. 盘路

代码结构图可以是这样的

 

1.链接:http://www.zhihu.com/question/21186887/answer/18200218

来源:知乎
 

1:读文档。尽管读了文档你不一定知道每一个代码的细节,但是如果你了解那个问题的话,你一定知道怎么写可以写出一个满足文档的内容。这个时候大脑里面就可以有个框架,先猜一猜,然后看代码,事半功倍。这样你还可以学到新的知识,如果代码跟你写的不一样,要么就是你傻逼,要么就是作者傻逼,你总会学到东西的。
2:找不到好的文档,就看他的测试用例,也是有一样的功效的。因为测试都是从文档出发编写的,而不是从代码出发编写的。

3:找不到文档和测试用例?请联系作者。作者不肯给,就换一个库。

 

 

2. 链接:http://www.zhihu.com/question/21186887/answer/18206842
来源:知乎

读代码还是要层次化、带着问题去阅读:
  • 首先整体了解这个软件是干什么,使用者是谁?解决什么问题?包含哪些大的模块,各个模块的作用是什么,各个模块的调用关系怎么样?
  • 然后对于每一个模块,这个模块是干什么的?为什么要有这个模块?这个模块怎么实现的?
  • 最后细化到每一个包,每一个类,每一个函数方法。
从上到下,一一击破每一个问题,认真去 思考他这样设计、写代码的好处,因为好的软件都会满足这种从抽象->具体的原则的。
个人不不喜欢bottom-up的阅读方法,有时候会一头扎进去,出不来了。
这种方式适合读一些比较优秀的开源项目的代码,也会很好地提高内功。
 

 

 

 

3.链接:http://www.zhihu.com/question/21186887/answer/18229165
来源:知乎
 
过去一个月做项目看前人代码,汇编、C、单片机、VB差不多几万行,基本没注释没文档,到现在也有些许经验,希望有所帮助:
先从main()开始,top-down地画出整个程序的流程图(动图),捡主要的大function出来作为节点,然后看每个节点的作用是什么,节点之间如何互动,期间穿插bottom-up的方法补充细节。
更多的,其实看陌生代码整个人的思路是非线性的,重要的是坚持看下来,时间长了自然就熟悉前人思路了。
最后得到类图(静态图)
 
说到这个会被很多问题卡住。上次看druid源代码,想mvn编译下,发现jar包找不到。
明明pom里配置了本地文件系统的reposity
<repositories>
   <repository>
      <id>local-file</id>
      <url>file://${basedir}/lib/</url>
      <layout>default</layout>
   </repository>
</repositories>

查了半天,突发奇想,看看maven的settings.xml文件,发现里面有个mirror,直接把所有源都镜像屏蔽了,难怪下载不到。吐血。如果对mirror不熟悉的话,得找死。

当码农真辛苦啊。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值