menu

秋梦无痕

一场秋雨无梦痕,春夜清风冻煞人。冬来冷水寒似铁,夏至京北蟑满城。

Avatar

代码走读常见问题解答

from: http://www.neco.com.cn/DRNECO/Content_003/code%20review.htm

(1) 代码走读都有哪些内容?

代码走读根据目的的不同,可以分为四个层次:
1、检查是否符合编程规范;
2、寻找编译器中的设计陷阱;
3、快速理解源代码,找出流程设计中的问题;
4、对原有代码的重构;

这四个层次可以按照从简单到复杂的顺序进行。

(2) 这四个层次都有什么区别和意义?

1、检查是否符合编程规范;
编程规范融合并提炼了许多人多年开发编程语言程序积累下来的成熟经验,帮助编程者形成良好的编程风格,提高源程序的可读性和可维护性,降低出错的机会,迅速跨入业已存在的且具有相当高度的技术层次,并能够为提高代码的复用性提供积极的参考。

2、找编译器中的设计陷阱;
术语“陷阱”的发展历史并不明确,而且它有多种定义方法。本文定义为编程和设计过程中常见的和可防止的问题,能顺利通过编译,没有任何警告和错误信息,而且计算机严格按照作者写明的代码执行,但是结果却不是作者期望的。许多IT人士都知道,现在市场上有很多新的编译器,它们可以捕获大部分程序错误,但遗憾的是,仍有许多错误是编译器不能发现的。打个比方,拼写检查程序是用来查找拼写错误的,但是,如果单词DOG被错误地写为CAT,您能指出单词CAT(实际是DOG)中的拼写错误吗?很显然,不能。因为这个单词可顺利通过拼写检查程序。

这里描述的陷阱所包括的范围广泛,从较容易的语法问题,基本设计缺陷,到完全错误的行为。利用正确的使用方法来说明这些常见的误解和误用,可以防止编程者出现类似的问题,并防止新一代程序员重复过去的错误。

3、快速理解源代码,找出流程设计中的问题;
无论是沟通程序的操作,还是将知识存储为可执行的形式,软件的源代码都是最终的介质。我们可以将源代码编译成可执行程序,也可以阅读代码来了解程序的功能及其工作方式,还可以修改源代码来改变程序的功能。大多数编程课程和书籍都将重点放到如何从零开始编写程序上。然而,在软件系统的工作投入中,40%~70%是用在系统首次编写完整之后,这些工作一定涉及到阅读、理解、以及修改最初的代码。另外,遗留代码持续不断、不可避免的累积;对软件重用的强调;软件行业中人员的高流动性;同时,开放源代码开发工作和协同开发过程(包括外包、代码走查和极限编程)日益重要,使得代码阅读成为当今软件工程师的一项基本功能。此外,阅读实际的、编写良好的代码,可以更加深入地了解如何改造与编写重要的系统,仅仅编写小型的程序学不到这种能力。

有时,阅读代码是一件不得不去做的事,比如:为了修复、检查或改进现存的代码,都必须去阅读相关的代码。有些时候,阅读代码也许是为了了解程序是如何工作的,对于任何能够“打开盖子”的事务,作为工程技术人员,我们总是倾向于分析一下它的内部结果。您阅读代码可能是想提取可供重用的材料,或者仅仅是出于个人兴趣,将代码作为一种文献。每种原因的代码阅读都有自己的一套技术,强调不同方面的技能。

代码走读中的阅读源代码强调的是通过快速理解源代码,找出流程设计中的问题这个目的。

4、对原有代码的重构;
重构的含义是:在不破坏可观察功能的前提下,借由搬移、提炼、打散、凝聚……,改善事务的体质、强化当前的可读性、为将来的扩充性和维护性做准备、乃至于在过程中找出潜在的“臭虫”,就成了大受欢迎的稳步前进的良方;

(3) 编程规范、设计模式和设计陷阱是什么关系?

模式是避免陷阱或从特定陷阱中恢复的一种方法;

从陷阱的角度来看,设计模式有两个重要属性。首先,他们描述了经过实践证明的成功的设计技术,而且可以用上下文相关的方法定制它们,以适应新的设计情况。其次,更加重要的是,提及特定的模式时,不仅说明了所应用的技术,而且说明了应用的原因以及结果;

当需要时,适合设计或者编码上下文的模式、惯例、编程规范,将“自然地”从自己的潜意识中冒出来,这说明正确使用了模式、惯例、编程规范的一种迹象;

识别陷阱与对条件的反射类似,一朝被蛇咬,十年怕井绳。然而与比赛和打仗一样,为了学习如何识别和避免危险情况,并不需要一定被烧伤或者被枪伤。一般情况下,必要条件就是提前警觉;

(4) 设计模式和重构是什么关系?

设计模式给我们的,不仅仅是一些问题的解决方案,更有追求完美“模型”的渴望,但是,Joshua Kerievsky在那篇著名的《模式与XP》中明白地指出:在设计前期使用模式常常导致过度过程。这是一个残酷的现实,单凭对完美的追求无法写出实用的代码,“实用”是软件压倒一切的要素。

(5) 快速理解源代码和重构是什么关系?

进行重构时,您从一个能够正常工作的系统开始做起,希望确保结束时系统能够正常工作。一套恰当的测试用来可以帮助您满足此项约束,所以重构应该从编写测试用例入手。一种类型的重构专注于修复一种已知的问题点。在此,您必须理解老的代码、设计新的实现、研究新的实现对相关其它代码造成的影响(多数情况下,新代码能够“无声无息”地完成替换)并实现更改,所以重构需要先快速理解老的代码。

(6)快速理解源代码查找缺陷和寻找设计陷阱查找缺陷有什么不同?

快速理解源代码找出的代码中的问题一般是流程设计上和软件需求满足上的特定的问题,需要读者翻很多页(发现前后的关联),而寻找设计陷阱找出的代码中的问题一般是普遍性的问题,一般不需要读者翻页,就在这一行的上下文中就可以找到。

(7)这几个层次的代码走读和单元测试是什么关系?

只有快速理解了源代码才可以完成单元测试,或者说快速理解源代码是完成单元测试的前提;
利用单元测试可以帮助更好地重构;
代码走读发现的问题比单元测试发现的更多、更快和更早;
单元测试发现不了不满足编程规范的问题

(8)代码走读都有哪些方法?

形式上可以遵从同行评审的结构化的正规检视、走查、单人复审等;
人工走读时,检查单可以按照头脑风暴、亲和图、鱼骨图方法形成系统化的检查树和处理机制;
工具走读可以借助一些商用的测试工具和自己开发的辅助工具进行走读。

(9)代码走读听起来是不错,如何才能达到效果吗?

代码走读中使用的检查单(或检查树)是很多人提炼和总结出来的结晶,市场和业界这方面的资料比较缺乏,因为多是个别大公司或个人的心血,所以很少在外面流传,自己研究和总结有点得不偿失,不如参考行业的优秀实践,所以最好接受有经验的专家的培训或向有经验的同行请教,在指导下开展推行,避免浪费自己的宝贵时间。

(10)代码走读和同行评审是什么关系?

同行评审是一种比较偏管理的方法,评审的材料可以包括文档和代码,对于代码的同行评审就是代码走读,本文讲的代码走读偏重于技术层面的方法,两者只有有效地结合才能更大地发挥它们的威力!

评论已关闭