软件设计背景了解
学会使用/有单测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
来源:知乎
2:找不到好的文档,就看他的测试用例,也是有一样的功效的。因为测试都是从文档出发编写的,而不是从代码出发编写的。
3:找不到文档和测试用例?请联系作者。作者不肯给,就换一个库。
来源:知乎
读代码还是要层次化、带着问题去阅读:
- 首先整体了解这个软件是干什么,使用者是谁?解决什么问题?包含哪些大的模块,各个模块的作用是什么,各个模块的调用关系怎么样?
- 然后对于每一个模块,这个模块是干什么的?为什么要有这个模块?这个模块怎么实现的?
- 最后细化到每一个包,每一个类,每一个函数方法。
个人不不喜欢bottom-up的阅读方法,有时候会一头扎进去,出不来了。
这种方式适合读一些比较优秀的开源项目的代码,也会很好地提高内功。
来源:知乎
先从main()开始,top-down地画出整个程序的流程图(动图),捡主要的大function出来作为节点,然后看每个节点的作用是什么,节点之间如何互动,期间穿插bottom-up的方法补充细节。
更多的,其实看陌生代码整个人的思路是非线性的,重要的是坚持看下来,时间长了自然就熟悉前人思路了。
<repositories>
<repository>
<id>local-file</id>
<url>file://${basedir}/lib/</url>
<layout>default</layout>
</repository>
</repositories>
查了半天,突发奇想,看看maven的settings.xml文件,发现里面有个mirror,直接把所有源都镜像屏蔽了,难怪下载不到。吐血。如果对mirror不熟悉的话,得找死。
当码农真辛苦啊。