提高开发效率之代码改善

你是否经常感觉到开发时间紧张,产品上线总是赶鸭子上架?随后会导致一系列代码维护难,需求迭代复杂。到最后开发的代码变成了无人敢碰的禁区呢?如果是YES,那么接下来的内容值得一读。尽管导致这种现象的原因有很多,如:需求变更频繁,评估时间过于乐观...等等。但是接下来我将会从代码改善这一模块,总结开发经验,将开发效率提升50%以上。

我们的开发时间都被谁吃了

在一些项目中,调试可能占到整个开发周期的50%。对很多程序猿来说,调试是程序设计最为困难的部分,调试原本不应成为最难解决的问题,如果严格遵循代码规范。所以在一开始你就要遵循代码规范来编写代码,提高软件质量,避免调试。如果无可避免的需要调试,那么接下来将会总结我在项目开发中的一些调试手段,这些手段比通常的一些方法为你节省更多精力

调试手段,帮你节省更多调试时间

为什么要讨论调试?难道还有人不知道怎么调试吗?的确如此,并不是每个人都知道怎么调试。一项研究表明,针对同样一组缺陷,经验丰富的程序猿找出缺陷所用的时间大约只是缺乏经验的程序猿们的1/20。并且一些程序猿能够找到更多的缺陷,且能更为准确地对这些缺陷进行修正。所以讨论科学调试方法的意义可想而知。接下来将会对科学调试手段进行介绍。

  1. 代码阅读:NASA软件工程实验室的一项研究发现:阅读代码每小时能够检测出的缺陷要比测试高出80%左右,IBM的一项研究也表明:检查发现一个错误只需要3.5个工作时,而测试则需要花费15~25个工作时。所以你需要先阅读你正在写的程序,如果你确实已经透彻得理解了你写的代码,那么代码是不可能出错的,你应该早就纠正了这些缺陷。或者说你通过阅读代码早就发现了缺陷。思考本身将会更加高效,也更为有趣,所以调试不是一味的打印。
  2. 五连问:每次调试修复错误后都要自己发出五连问:为什么会犯这样都错误?如何更快得发现这个错误?如何预防此类错误?代码中是否还有类似的错误?能否在错误造成麻烦之前干掉它们?当养成这种自我总结的习惯后,你会发现你要调试的东西会越来越少,因为你已经可以明确该缺陷属于哪类缺陷,我提议,在调试修复缺陷后,代码提交的时候,带上五连问的答案作为提交代码说明,一方面是你对此次调试修复的总结,在总结的时候(相当与结对编程)你有可能会突然发现另一个漏洞,另一方面也可以帮助团队更方便得复审你的代码。
  3. 审视自己修正缺陷的方法:你是否只是对缺陷打了一个补丁?并没有找到问题的根源,没有从根源上解决缺陷,从而仅仅治标不治本(这种修正缺陷的方法迟早会出问题),还是精确分析问题根源,对症下药呢?(这才是标准的修正缺陷的方法)
  4. 科学的调试方法:
    a. 通过可重复的实验收集数据 => 根据相关数据的统计构造一个假说 => 设计一个实验来证明或者反证这个假说 =》证明或者反证假说=> 根据需要重复进行上面的步骤。
    b. 将错误稳定下来 => 确定错误的涞源 => 修补缺陷 => 对所修补的地方进行测试 => 查找是否有类似的错误

调试是一片极其富饶的土地,它孕育着你进步的种子,这片土地也是所有软件关键之路所交织的地方:可读性,设计,软件质量,凡是你能想到的无所不包。如果按照以上方法进行调试,你花在调试上的时间会越来越少,甚至无需频繁调试。

如何避免调试

既然调试如此费时费力,那我们为什么不去避免调试呢?调试本身并不会改进代码质量,而是你不规范编码的代价。保证软件质量是避免调试的有效手段,软件的质量必须从开始逐步建立:开发高质量软件产品的最佳途径是精确描述需求,完善设计,并使用高质量的代码编写规范。调试只是迫不得已时采用的手段

保证软件质量

协同构建:“协同构建”包括结对编程,正式检查,非正式技术复查,文档阅读,以及其他让开发人员共同承担创建代码及其他工作产品责任的技术。协同编程的首要目的就是改善软件质量。

  • IBM发现,一小时的代码检查能够节约大约100小时的相关工作(测试和缺陷修正)
  • 惠普公司报告称,它的正式检查计划大约每年为公司节省2150万美元。
  • 帝国化工发现维护400个程序所有文档的费用,仅仅是维护与之类似但未经检查的程序的费用的十分之一
  • 对于一些大型程序的一项研究发现,在正式检查上面花一个小时,平均可以避免33个小时的维护工作,并且检查效能是测试的20倍以上
  • 在引入代码检查之前,一个软件维护组织的55%的单行修改是有错误的。而引入代码复查之后,这个数字降低到了2%。如果考虑所有类型的变更,在引入复查之后95%的修正是一次性正确的。而在没有引入之前只有20%是一次性正确的。
  • 同一组人员开发11个程序,并将它们发布到产品当中。其中前五个没有复查,其平均每百行代码存在4.5个错误。另外6个经过了代码复查,平均每百行代码只有0.82个错误。复查消灭了80%的错误。

各种不同的研究表明,协同开发不但在捕获错误方面比测试效能更高,所能发现的错误类型也不同与测试。协同开发能发现许多硬编码,不恰当注释,重复出现的代码需要同一化等问题,这些是测试发现不了的。协同开发的另一个作用就是让人们意识到他们的代码在被复查,这样他们会小心谨慎得检查自己的工作。协同构建有利于传授公司文化以及编程专业知识,复查可以快速地将所有开发者的水平提升到最优秀的开发者的高度。

开发者测试:你必须期望在你的代码里有错误。尽管这种期望似乎有悖常理,但是你应该期望找到错误的人是你,而不是别人。

  • 对每一项相关的需求进行测试,以确保需求都已经被实现
  • 对每一个相关的设计关注点进行测试,以确保设计已经被实现。
  • 使用一个检查表,其中记录着你在项目迄今为止所犯的,以及过去的项目中所犯的错误类型。
  • 边界值分析,边界值分析的思想就是写一些测试用例来测试边界值条件
  • 测试几类坏数据(数据太少,太多数据,错误数据情况(无效数据,null,undefined,等),长度错误的数据,未初始化的数据)