Tools - 一些代码阅读的方法
1 初始能力
让阅读思路清晰连贯,保持在程序的流程架构和逻辑实现上,不被语法、编程技巧和业务流程等频繁地阻碍和打断。
- 语言基础:熟悉基础语法,常用的函数、库、编程技巧等;
- 了解设计模式、构建工具、代码风格;
- 了解业务背景和逻辑;
即便此时,还不具备完全理解代码的能力,但通过接触这些代码,至少可以熟悉项目的样貌。
2 工具使用
- Source Insight - 具有强劲的代码浏览和分析功能
- Doxygen - 项目文档工具
- grep命令 - 用于全局搜索
- 利用代码结构分析功能或插件生成UML图
- Python Call Graph - 生成python函数调用关系图
- 代码转换成流程图 - 在线工具
- 浏览器插件Octotree - 直观显示Github项目树形结构
- 浏览器插件Git History - 直观显示Github项目历史记录
- ......
3 准备动作
明确问题与需求:
- 为什么要阅读源代码?要解决什么具体问题?要达到怎样的程度和效果?
- 当前状态(初始能力、资源投入等)如何?是否足够支撑开始并完成这样的代码阅读?
- 没有目标和无法完成的阅读,就难以获得实际的收获;
- 对于知名项目,收集规整已有的代码分析资料;
- 确认辅助信息来源:官方文档、项目文档、搜索引擎等;
- 确认代码版本(早期版本或当前能够理解的版本)和编码风格;
- ......
4 一些方法和注意事项
“因地制宜,因人而异”。
问题需求、资源投入、项目状态的不同,适用的阅读方法和工具自然也就不同。
直接啃代码的方式适合解决具体的细节问题,简单粗暴,速度快效果好。
但如果想完整而深入地了解一个有规模和难度的项目,又该如何进行呢?
一些方法:
- 阅读“README”;
- 通过查看提交和版本日志,研读所关注的功能和优化;
- 搭建测试环境并运行Demo或示例,观察运行状态,从外部了解核心功能和运行方式,形成总体认知;
- 善用文档:quickstart、tutorial等内容中的示例往往是非常有效的了解途径;
- 整体把握,分层阅读:先整体后局部,借助工具生成UML图或流程图等,从整体了解代码结构和调用关系,确定阅读的层次和顺序;
- 寻找程序入口,根据实际情况确定阅读的切入点;
- 逐行或者逐个函数跟踪变量值;
- 为代码写注释,解释各个函数的使用方法,各个变量的用途,以及任何其它方面的内容,只要能帮助理解代码即可。必要时形成文档;
- 问题列表:记录疑问和问题并归纳成表,解决问题的过程也就是代码逐渐清晰的过程;
- 查看单元测试,编写测试用例,抛异常,Debug所关注的执行过程,观察现象和日志,明确调用关系和执行路径;
- 它山之石,可以攻玉。借鉴代码,解决当前实际问题。
- ......
注意事项:
- 带着问题与需求阅读代码,围绕根本和主干,没有必要通读源码,更不应该沉陷于细节;
- 必要时略过难以理解的地方,不过度纠结于某一行某一段;
- 理解项目作者的思考方式,
- 低头专注代码,抬头思考架构,从整体的角度来看待局部实现的过程;
- ......
5 下一步
迭代式理解
软件是成长起来的,而不是搭建完成的。
对项目代码的理解,只是当时的理解,受限于当时的技能水平,知识结构,资源投入,甚至是身心状态。
经过一段时间磨砺和成长,回头再阅读同样的项目代码,往往会有新的发现和理解。改善适用性
“学以致用”是获得知识技能的最有效途径之一。
实现自己的需求和想法,最终形成更适合的版本。
在现有“轮子”的基础上去制造“一个更完善轮子”,在这样的二次开发过程中,可以验证代码理解。获得建议与批判
落后的起源是“故步自封”、“自以为是”和“自欺欺人”。
归纳并分享你的理解,会获得更全面更专业更中肯的建议与批判。
争议之中,也恰恰隐含着成长与改变的线索与机遇。
6 参考信息
7 多余的话
每个人都是某一方面的菜鸟,某一细节的白痴。
It’s not the languages that matter but what you do with them.(编程语言这东西并不重要,重要的是你用这些语言做的事情。)
Tools - 一些代码阅读的方法的更多相关文章
- Python3练习题系列(08)——代码阅读方法及字典跳转表理解
问题:分析下面代码 cities['_find'] = find_city city_found = cities['_find'](cities, state) 分析过程: 一个函数也可以作为一个变 ...
- Spring Ioc代码阅读
1,理解控制反转 以前一直说着这个词,然后把它等于上ioc这个词,再等于上代码里一个bean里依赖了其他bean,不用new,用注解,用xml去描述,就可以了.能用就行了,实际理论的不管也不影响编 ...
- Android C代码回调java方法
本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...
- Linux协议栈代码阅读笔记(二)网络接口的配置
Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...
- 图形化代码阅读工具——Scitools Understand
Scitools出品的Understand 2.0.用了很多年了,比Source Insight强大很多.以前的名字叫Understand for C/C++,Understand for Java, ...
- 编写OC高质量的代码的有效方法
1. 写这个只是为了自己记忆,有相关pdf文件,如需要留下邮箱.. 2. 在类的头文件中尽量少引入其他头文件 除非确有必要,否则不要引入头文件.一般来说,应在某个类的头文件中使用向前声明来提及别的类( ...
- Python - 关于代码阅读的一些建议
初始能力 让阅读思路保持清晰连贯,主力关注在流程架构和逻辑实现上,不被语法.技巧和业务流程等频繁地阻碍和打断. 建议基本满足以下条件,再开始进行代码阅读: 具备一定的语言基础:熟悉基础语法,常用的函数 ...
- Bleve代码阅读(二)——Index Mapping
引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...
- py-faster-rcnn代码阅读1-train_net.py & train.py
# train_net.py#!/usr/bin/env python # -------------------------------------------------------- # Fas ...
随机推荐
- metrics+spring+influxdb整合
1.在maven项目的pom.xml引入metrics-spring和metrics-influxdb两个jar包 <dependency> <groupId>com.ryan ...
- git pull时解决分支分叉(branch diverged)问题
git pull时出现分支冲突(branch diverged) $ git status # On branch feature/worker-interface # Your branch and ...
- java学习笔记(六):变量类型
java一共三种变量: 局部变量(本地变量):方法调用时创建,方法结束时销毁 实例变量(全局变量):类创建时创建,类销毁时销毁 类变量(静态变量):程序启动是创建,程序销毁时销毁 public cla ...
- 《CSAPP》虚拟存储器
虚拟存储器与物理存储器 虚拟存储器(VM)被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组.每一个字节都有一个唯一的虚拟地址,这个唯一的虚拟地址作为数组的索引.磁盘上的数组内容被缓存在主 ...
- Windows驱动开发VS2012 DDK/WDK的环境配置
[开发Windows驱动的配置是很必要的,下文将详细介绍VS2012如何配置驱动开发环境] [转载] 以下部分内容是转载博客:http://blog.csdn.net/huangxy10/articl ...
- vm ware虚拟机ping不通解决办法
本人是linux菜鸟,在使用vm ware的时候,在多台电脑上安装了多个虚拟机,这多台电脑是同一网段的,并且能够互相ping通,但是vm ware下的虚拟机就无法ping通 通过自己的各种才是,发现在 ...
- BZOJ2212或洛谷3521 [POI2011]ROT-Tree Rotations
BZOJ原题链接 洛谷原题链接 线段树合并裸题. 因为交换子树只会对子树内部的逆序对产生影响,所以我们计算交换前的逆序对个数和交换后的个数,取\(\min\)即可. 对每个叶子节点建一棵动态开点线段树 ...
- 锻造(forging)
--九校联考24OI__D1T1 题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打,于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现--自己连一个史莱姆都打不过了. 勇 ...
- IFrame跨域访问&&IFrame跨域访问自定义高度
1.IFrame跨域访问: http://blog.csdn.net/fdipzone/article/details/17619673 2.IFrame跨域访问自定义高度: 由于JS禁止跨域访问,如 ...
- shell启动执行cypher语句
1.跳转到目录:cd /data/soft/neo4j-community-not/ 2.修改配置文件:nano ./conf/neo4j.conf: 3. 登录:bin/cypher-shell - ...