转知乎:如何阅读源代码-- 源码理解不是读出来的,是用来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
来源:知乎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不熟悉的话,得找死。
当码农真辛苦啊。
- 转知乎:如何阅读源代码-- 源码理解不是读出来的,是用来debug出来的.
- 一流是做出来的,不是评估出来的
- 好产品是做出来的,不是炒作出来的
- 小动物是用来爱护的不是用来欺负的
- 高手是打出来、练出来的,不是学习出来的!
- 好的架构化是进化而来的,不是设计出来的
- 2011国庆总结——代码不是写出来的,是设计出来的
- 制度是生长出来的 不是制造出来的
- 关于Android源码的理解以及如何阅读源码
- 谈谈房子——房子是用来住的,不是用来炒的
- 如何阅读别人的源代码
- 如何阅读别人的源代码
- 如何阅读别人的源代码
- 如何阅读别人的源代码
- 如何阅读别人的源代码
- 如何阅读别人的源代码
- 如何阅读别人的源代码
- 如何阅读别人的源代码
- python 正则表达式
- 笔试面试总结
- R语言数据集合并、数据增减、不等长合并
- HTML5的canvas画布常用绘图命令总结
- POJ 3734_Blocks
- 转知乎:如何阅读源代码-- 源码理解不是读出来的,是用来debug出来的.
- 什么是引力波
- LeetCode55. Jump Game
- hdoj4956Poor Hanamichi【暴力】
- HUST 1017 Exact Cover(舞蹈链模板)
- 20160204.CCPP体系详解(0014天)
- Unity中关于单位像素与单位长度的关系
- 十大编程算法助程序员走上高手之路
- JDBC各种数据库的连接的URL