程序代码阅读技巧

一、代码阅读的必要性

阅读别人的代码作为研发人员是一件经常要做的事情。一个是学习新的编程语言的时候通过阅读别人的代码是个最佳的学习方法,另外是积累编程经验。如果你有机 会阅读一些操作系统的代码会帮助你理解一些基本的原理。更有就是在你作为一个质量确保人员或一个小领导的时候如果你要做白盒测试的时候没有阅读代码的能力 是不能完成相应的任务。最后一个就是如果你中途接手一个项目的时候或给一个项目做售后服务的时候是要有阅读代码的能力的。

二、收集所有可能收集的材料

阅读代码要做的第一件事情是收集所有和项目相关的资料。比如你要做一个项目的售后服务,那么你首先要搞明白项目做什么用的,那么调研文件、概要设计文 件、周详设计文件、测试文件、使用手册都是你要最先搞到手的。如果你是为了学习那么尽量收集和你的学习有关的资料,比如你想学习linux的文件系统的代 码,那最佳要找到linux的使用手册、及文件系统设计的方法、数据结构的说明。(这些资料在书店里都能找到)。

  材料的种类分为几种类型

1. 基础资料

比如你阅读turbo c2的原始码你要有turbo c2的函数手册,使用手册等专业书籍,msc 6.0或java 的话不仅要有函数手册,还要有类库函数手册。这些资料都是你的基础资料。另外你要有一些关于uml的资料能作为查询手册也是个不错的选择

2. 和程式相关的专业资料

每一个程式都是和相关行业相关的。比如我阅读过一个关于气象分析方面的代码,因为里边用到了一个复杂的数据转换公式,所以不得不把自己的大学时候课本,找出来来复习一下高等数学的内容。如果你想阅读linux的文件管理的代码,那么找一本讲解linux文件系统的书对你的帮助会非常大。

3. 相关项目的文件资料

这一部分的资料分为两种,一个相关行业的资料,比如你要阅读一个税务系统的代码那么有一些财务/税务系统的专业资料和国家的相关的法律、法规的资料是 必不可少的。此外就是关于这个项目的需求分析报告、概要设计报告、周详设计报告,使用手册、测试报告等,尽量多收集对你以后的代码阅读是非常重要的。

三、知识准备

了解基础知识,不要上来就阅读代码,打好基础能做到事半功倍的效果。

四、留备份,构造可运行的环境

代码拿到手之后的第一件事情是先做备份,最佳是刻在一个光盘上,在代码阅读的时候一点不动代码是非常困难的一件事情,特别是你要做一些修改性或增强性 维护的时候。而一旦做修改就可能发生问题,到时候要恢复是经常发生的事情,如果你不能非常好的使用版本控制软件那么先留一个备份是个最起码的需求了。

在做完备份之后最佳给自己构造一个可运行的环境,当然可能会非常麻烦,但可运行代码和不可运行的代码阅读起来难度会差非常多的。所以多用一点时间搭建 一个环境是非常值得的,而且我们阅读代码主要是为了修改其中的问题或做移植操作。不能运行的代码除了能学到一些技术以外,用处有限。

五、找开始的地方

做什么事情都要知道从那里开始,读程式也不例外。在c语言里,首先要找到main()函数,然后逐层去阅读,其他的程式无论是vb、delphi都要首先找到程式头,否则你是非常难分析清晰程式的层次关系。

六、分层次阅读

在阅读代码的时候不要一头就扎下去,这样往往容易只见树木不见森林,阅读代码比较好的方法有一点象二叉树的广度优先的遍历。在程式主体一般会比较简 单,调用的函数会比较少,根据函数的名字及层次关系一般能确定每一个函数的大致用途,将你的理解作为注解写在这些函数的边上。当然非常难一次就将全部注解 都写正确,有时候甚至可能是你猜测的结果,不过没有关系这些注解在阅读过程是不断修正的,直到你全部理解了代码为止。一般来说采用逐层阅读的方法能是你系 统的理解保持在一个正确的方向上。避免一下子扎入到细节的问题上。在分层次阅读的时候要注意一个问题,就是将系统的函数和研发人员编写代码区分开。在c, c++,java ,delphi中都有自己的系统函数,不要去阅读这些系统函数,除非你要学习他们的编程方法,否则只会浪费你的时间。将系统函数表示出来,注明他们的作用 即可,区分系统函数和自编函数有几个方法,一个是系统函数的编程风格一般会比较好,而自编的函数的编程风格一般比较会比较差。从变量名、行之间的缩进、注 解等方面一般能分辨出来,另外一个是象ms c6++会在你编程的时候给你生成一大堆文件出来,其中有非常多文件是你用不到了,能根据文件名来区分一下时候是系统函数,最后如果你实在确定不了,那就 用研发系统的帮助系统去查一下函数名,对一下参数等来确定即可。

七、写注解

写注解是在阅读代码中最重要的一个步骤,在我们阅读的原始码一般来说是我们不熟悉的系统,阅读别人的代码一般会有几个问题:

1. 搞明白别人的编程思想不 是一件非常容易的事情,即使你知道这段程式的思路的时候也是相同。
2. 阅读代码的时候代码量一般会比较大,如果不及时写注解,往往会造成读明白了后边忘了前边的现象。
3. 阅读代码的时候难免会出现理解错误,如果没有及时的写注解非常难及时的发现这些错误。
4. 有时候不写注解非常难确定一个函数你是否阅读过,他的功能是什么,经常会发生重复阅读、理解的现象。

好了,说一些写注解的基本方法:

1. 猜测地去写,刚开始阅读一个代码的时候,你非常难一下子就确定所有的函数的功能,不妨采用采用猜测的方法去写注解, 根据函数的名字、位置写一个大致的注解,当然一般会有错误,但你的注解实际是不断调整的,直到最后你理解了全部代码。
2. 按功能去写,别把注解写成语法说明书,千万别看到fopen就写打开文件,看到fread就写读数据,这样的注解一点用处都没有,而应该写在此处研发参数设置文件(****.dat)读出系统初始化参数……这样才是有用的注解。
3. 在写注解的使用另外要注意的一个问题是分清晰系统自动生成的代码和用户自己研发的代码,一般来说没有必要写系统自动生成的代码。象delphi的代码,我们往往要自己编写一些自己的代码段,还要对一些系统自动生成的代码段进行修改,这些代码在阅读过程是要写注解的,但有一些没有修改过的自动生成的代码就没有必要写注解了。
4.在主要代码段要写较为周详的注解。有一些函数或类在程式中起关键的作用,那么要写比较周详的注解。这样对你理解代码有非常大的帮助。
5. 对你理解起来比较困难的地方要写周详的注解,在这些地方往往会有一些编程的技巧。不理解这些编程技巧对 你以后的理解或移植会有问题。
6. 写中文注解。如果你的英文足够的好,不用看这条了,但非常多的人英文实在不怎么样,那就写中文注解吧,我们写注解是为了加 快自己的理解速度。中文在大多数的时候比英文更适应中国人。和其写一些谁也看不懂的英文注解还不如不写。

八、重复阅读

一次就能将所有的代码都阅读明白的人是没有的,至少我还没有遇见过。反复的去阅读同一段代码有助于得代码的理解。一般来说,在第一次阅读代码的时候你 能跳过非常多一时不明白的代码段,只写一些简单的注解,在以后的重复阅读过程用,你对代码的理解会比上一次理解的更深刻,这样你能修改那些注解错误的地方 和上一次没有理解的对方。一般来说,对代码阅读3~4次基本能理解代码的含义和作用。

九、运行并修改代码

如果你的代码是可运行的,那么先让他运行起来,用单步跟踪的方法来阅读代码,会提高你的代码速度。代码通过看中间变量了解代码的含义,而且对以后的修改会提供非常大的帮助。
用自己的代码代替原有代码,看效果,但在之前要保留原始码。
600行的一个函数,阅读起来非常困难,这是编程人的不好习惯。在阅读这个代码的时候将代码进行修改,变成了14个函数。每一个大约是40-50 行左右。

分析一个源代码,一个有效的方法是:

   1、阅读源代码的说明文档,比如本例中的README, 作者写的非常的详细,仔细读过之后,在阅读程序的时候往往能够从README文件中找到相应的说明,从而简化了源程序的阅读工作。

   2、如果源代码有文档目录,一般为doc或者docs, 最好也在阅读源程序之前仔细阅读,因为这些文档同样起了很好的说明注释作用。

   3、从makefile文件入手,分析源代码的层次结构,找出哪个是主程序,哪些是函数包。这对于快速把握程序结构有很大帮助。

   4、从main函数入手,一步一步往下阅读,遇到可以猜测出意思来的简单的函数,可以跳过。但是一定要注意程序中使用的全局变量(如果是C程序),可以把关键的数据结构说明拷贝到一个文本编辑器中以便随时查找。

   5、分析函数包(针对C程序),要注意哪些是全局函数,哪些是内部使用的函数,注意extern关键字。对于变量,也需要同样注意。先分析清楚内部函数,再来分析外部函数,因为内部函数肯定是在外部函数中被调用的。

   6、需要说明的是数据结构的重要性:对于一个C程序来说,所有的函数都是在操作同一些数据,而由于没有较好的封装性,这些数据可能出现在程序的任何地方,被任何函数修改,所以一定要注意这些数据的定义和意义,也要注意是哪些函数在对它们进行操作,做了哪些改变。

   7、在阅读程序的同时,最好能够把程序存入到cvs之类的版本控制器中去,在需要的时候可以对源代码做一些修改试验,因为动手修改是比仅仅是阅读要好得多的读程序的方法。在你修改运行程序的时候,可以从cvs中把原来的代码调出来与你改动的部分进行比较(diff命令), 可以看出一些源代码的优缺点并且能够实际的练习自己的编程技术。

   8、阅读程序的同时,要注意一些小工具的使用,能够提高速度,比如vi中的查找功能,模式匹配查找,做标记,还有grep,find这两个最强大最常用的文本搜索工具的使用。

   对于一个Unix/Linux下面以命令行方式运行的程序,有这么一些套路,大家可以在阅读程序的时候作为参考。

   1、在程序开头,往往都是分析命令行,根据命令行参数对一些变量或者数组,或者结构赋值,后面的程序就是根据这些变量来进行不同的操作。

   2、分析命令行之后,进行数据准备,往往是计数器清空,结构清零等等。

   3、在程序中间有一些预编译选项,可以在makefile中找到相应部分。

   4、注意程序中对于日志的处理,和调试选项打开的时候做的动作,这些对于调试程序有很大的帮助。

   5、注意多线程对数据的操作

程序代码阅读技巧

时间: 2024-08-04 22:26:59

程序代码阅读技巧的相关文章

如何阅读他人的程序代码

近日,在互联网上游荡,偶然发现一篇曾经的文章,是关于如何阅读他人程序代码的,阅后颇为受益,于是乎重新整理了一下格式,将此文转载如下: 如何阅读他人的程序代码 文/王建兴   作者简介: 王建兴,清华大学资讯工程系的博士研究生,研究兴趣包括计算机网络.点对点网络.分布式网络管理.以及行动式代理人,专长则是Internet应用系统的开发.曾参与过的开发项目性质十分广泛而且不同,从ERP.PC Game到P2P网络电话都在他的涉猎范围之内. 一.读懂程序代码,使心法皆为我所用 程序代码是别人写的,只有

C#开发技巧之2—设置程序代码行号

大家在初学C#的时候有没有这样的想法呢——设置行号来方便自己找到错误代码的位置.现在一客为大家带来福利了哦,O(∩_∩)O~ 1. 实例说明: 在“环境”设置的“文本编辑器”项中,我们可以设置后台代码的行号显示功能. 2. 设置步骤: (1)打开Visual Studio 2008开发环境,在菜单栏中选择工具—> 选项,弹出如图1所示对话框: 图1 选项对话框 (2)选择“文本编辑器“节点下的”所有语言“选项,并在右侧选中”行号”复选框,最后点击确定.如图2: 图2 C#开发技巧之2-设置程序代

《代码阅读方法与实践之读书笔记之一》

阅读代码是程序员的基本技能,同时也是软件开发.维护.演进.审查和重用过程中不可或缺的组成部分.<代码阅读方法与实践之读书笔记之一>这本书围绕代码阅读,详细论述了相关的知识与技能.我希望通过仔细阅读并学习本书,可以快速地提高我的代码阅读的技能与技巧,进而从现有的优秀代码.算法.构架.设计中汲取营养,提高自身的开发与设计能力.此次读了此书的前四章,以下是我从中汲取到的宝贵养分: 从第一章<导论>一节中我体会到了我们要养成一个经常花时间阅读别人编写的高品质代码的习惯,因为阅读高品质的代码

第二个简单程序代码

这是我模彷我们老师的课堂例子,自己编写的一个简单程序:这里我发现自己的编码素质有待提高.初学者,望能得到你们的评价和 程序代码如下: import java.util.*;                                       //导入 java.util 这个包内的所有类*表示这个包下的所有类库(不包括子包) public class JavaAdd {                                    //定义类 public static void

推荐几本C#程序员阅读的书籍

楼主这些年一直追随微软技术,也看了不少书籍,整理出一些个人认为不错的经典,推荐给各位阅读,以共同进步. 推荐顺序是由浅入深,深入浅出. <Professional C#>,中文名<C#高级编程>,最新版本:第8版. 点评:本书的中文引进版虽然起名为“高级”编程,但个人认为做为入门或者全面了解.NET比较合适,因为其虽全面,但不够深入.60%+的篇幅在全面概括C#的特性,其余的章节涉及到了WPF,WCF,ASP.NET,Windows Runtime,Windows 8 商店应用,消

编写高质量JAVA程序代码的建议

--------------------------------------------------------------------------------------------------- 前言:原著<改善JAVA程序的151个建议>有151个建议,我在拜读的过程根据自己的理解合并了其中的几个,并将每个建议的核心要义进行了一次纯手工提炼,以方便想阅读这本书的同行能够更快的掌握这本书的所有核心内容. -------------------------------------------

每周一书-编写高质量代码:改善C程序代码的125个建议

首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10余年开发经验的资深C语言专家全面从C语法和C11标准两大方面深入探讨编写高质量C代码的技巧.禁忌和实践 C语言因为既具有高级语言特性,又具有汇编语言特性,所以它是近二十几年来使用较为广泛.生命力较强的编程语言.无论是操作系统.嵌入式系统.普通应用软件,还是移动智能设备开发,它都能够很好地胜任,是公认的强大的语

《代码阅读方法与实践》阅读笔记之二

时间过得真快,一转眼,10天就过去了,感觉上次写阅读笔记的场景仿佛还历历在目.<代码阅读方法与实践>这本书真的很难写笔记,本来我看这本书的名字还以为书里大概写的都是些代码阅读的简易方法,心想着这就好写笔记了,没想到竟然好多都是我们之前学过的东西,这倒让我有点无从下手了.大概像我们这些还没有太多经历的大学生,总是习惯于尽量避免自己的工作量,总是试图找到一些完成事情的捷径吧.总之,尽管我不想承认,但我自己心里很清楚,我就是这种人.下面开始言归正传,说说接下来的几章内容归纳. 这本书在前面已经分析了

代码阅读方法与实践(三)

我们分析的许多系统都遵循一种简单的“主程序和子例程”结构.常见的.重要的结构可以归类为少数迥然相异的构架类型:集中式储存库.数据流.面向对象或分层构架.这些构架类型常常结合成一个层次结构用来控制大型系统的复杂性.接下来我们将独立的分析每种构架类型,但是一个系统可以同时展示出多种不同的构架类型.以不同的方式检查同一个系统.分许系统的不同部分.或使用不同级别的分解,都有可能发现不同的架构类型. 集中式储存库的构架模型依赖于一个中心过程或数据结构,他在系统中担任控制或信息的集线器.即使不需要数据库提供