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

来源:互联网 发布:想学电脑编程 编辑:程序博客网 时间:2024/05/17 10:26

首先先强调一个观点,源码不是读出来的,而是debug出来的(标题党).

0.首先还是要知道怎么用,大体的概念,当你只通过源码阅读遇到瓶颈时,debug就能扫清你的疑问.在对应的地方设置debug.(特别是call hierechary流程特别长时,)

1. 第一句话偏激了点,但debug在毫无文档的情况下是一个保底通用方法: 如果读源码费劲时,那么请debug了解执行流程和启动流程.(知道了业务和设计文旦,但不一定知道很细的各个类的作用)

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

3. 再返回去了解架构什么的.

4.

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

 4.2中间件系统. 启动过程,配置配置过程(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 0
原创粉丝点击