如何给软件“体检”以防止其老化?

更新时间:2014-09-30 09:26:58点击次数:1175次

软件项目随着不断地演化,会变得越来越复杂,而这种复杂性,如果不加以合理的管理,很可能会走上失败的道路。这其中最有可能出现问题就是源代码,在本文,我们就来看看软件是如何越来越变得复杂的,我们如何使用代码指标来提高代码的质量,以避免软件在复杂性变革过程中走向失败。


软件演化过程


自从 1967 年人类研究出软件之后,其在社会上的地位就一直很重要,接下来的日子里就是如何创造出模型和实践来开发出更高质量的软件。还有一部分人就是在不停的追踪研究软件的进化过程,探究这一演化过程到底带来了什么样的后果。


软件演化过程中诞生的法规


在上世纪七十年代,Manny Lehman 提出了一套 8 个法案以详细解释软件演化的方式,下面就是应该和现如今还有关联的 4 个法案。


1. 持续改变


一个软件随着用户的使用量的不断变化,软件会越来越没用,除非这款软件不断适应参加新域的需求,例如:新的法案个规章制度对这一软件的推动。


2. 复杂度不断增加


软件常常会随着时代的发展变得很复杂,复杂程度且越来越高,除非有相关的管理机制出现来管理。


3. 功能不断增长


一款软件的功能数量也会跟着时间的流逝而增加,因为用户的需求在变大。


4. 质量也有可能在下降


软件的质量感毫无疑问会不断下降,阻止这一趋势的办法就是通过人为方法来改善。


软件系统的老化


一旦开发者对软件的复杂度管理失去控制的时候,就会出现一个我们称之为“软件老化Software Aging”的现象,简单说来就是随着时间的流动,其复杂性不断上升,质量不断下降。这些特征会导致一些比较危险的后果,首先就是软件变得无法理解,更没办法修改,会影响团队生产力。正是由于这样,这款软件也就不可靠了,开发者根本没法理解、修改、消除bugs。


从长远角度来说,软件老化的结果就是将这个软件扔掉,然后取代的是一个新的。这很容易理解,与其花很多钱去维护一个老旧的软件,还不如买一个新的、便宜的呢!


 如何阻止软件老化?


这里有一些实践可以帮助我们管理软件复杂性,以此来阻止软件老化的进程。


文档可用于记录软件架构、用户需求,还可以用来解释代码决策。在我看来,给软件架构和用户需求编写文档是最重要的,但我不同意用文档来解释代码。


极限编程(Xtreme programming)所建议的两个实践我认为是比较有用的,尤其是在开发可维护的软件。结对编程(Pair programming)和集体所有(Collective Ownership)能够帮助我们在团队里分享好的知识,这样写出的代码肯定质量是比较高的,因为人们通常是根据不同的观点来编写和分析同一个代码库。


其他的实践我想说的就是代码审核,在这篇文章里它也是重中之重。


代码审核


代码审核就是一种不断分析代码的行为,旨在保证代码标准,符合用户需求。其方式无非就是手动的、自动的。


手动代码审核


手动代码审核通常是由最资深开发人员分析代码,而这些代码通常是由整个团队完成的,这个评审过程非常类似于评审会议(sprint reviews)。手动评审的好处就是能够在团队里分享技术,增加大家对项目的了解程度。相对的就是比较浪费时间,在分析代码的时候根本没时间去写代码。


自动代码审核


虽然可以自动执行代码审核,但是我觉得即使是那样,也不该忽略手动代码审核的地位,事实上我觉得两个方法是互补的。自动代码审核是一个过滤器可以抓住最初的小错误,节省很多时间。使用自动审核就是可以建立一些指导方针,电脑是可以创建一些简单的指标,这些指标在代码衡量里有显示。


代码衡量


代码衡量(Code Metrics)被用来代表不同的软件指标,例如:尺寸大小、复杂性、耦合和内聚。第一个被使用的代码衡量就是六十年代的 Lines Of Code (LOC),用来测量生产力和工作效率。但是使用 LOC 测量不同语言编写的软件的复杂性是不公平的,就像把 Ruby 和 Objective-C 放在一起做比较是不可取的。


随后,就出现了很多有名的代码衡量方式,最为常见的就是1994年提出的CK metrics,还有1995年提出的MOOD metrics。


用来计算代码衡量的工具


有很多工具可以自动计算这些衡量,有的是免费的,有的是收费的,有的支持好几种语言,而有的只支持一种语言。


Sonar


Sonar 应该是企业用的最多的提取衡量数据的工具,它可以分析超过20种编程语言,并提供合理化的图标帮助理解。Sonar 还可以用在开源项目里,如果想把它用在个人项目里的话,可以安装一个本地版本或者是用一个像 CloudBees 一样的服务。


NDepend


NDepend 是一个用来分析.NET 代码的商业工具。可以分析超过 82 个衡量,并且通过不同的图形方式将其视图化。


CodeAnalytics


在我的硕士毕业展示里面,我就是用 CodeAnalytics 从 C# 代码里提取衡量。


写在最后的总结


文章里已经展示软件的进化过程,它的危险性,以及如何组织项目老化。通过代码审核可以最大限度的降低软件复杂性所带来的麻烦。通过代码衡量指标来计算并优化代码质量。


尽管代码衡量已经研究了数十年,但是我想很多开发者和公司都知道其为何物,并知道如何使用它们来改善代码质量,使之更加的可维护,提供更可靠的软件。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息