我正在参与「掘金启航方案」
本文从研发角度探讨下高质量软件应具有哪些特色,以及怎么衡量软件质量。
软件质量的分类
软件质量一般能够分为:内部质量和外部质量。
内部质量
内部质量是指软件的结构和代码质量,以及其是否适合保护、扩展和重构。它重视的是软件本身的特性和特色,包含:
- 可读性:代码易于阅览和理解;
- 易保护性:代码易于修正和保护;
- 可测验性:代码易于编写单元测验并进行自动化测验;
- 可靠性:代码安稳、不容易溃散或呈现错误;
- 可扩展性:代码能够方便地进行扩展;
- 可重用性:代码可被复用于其他项目中。
内部质量直接影响软件的可保护性和开发功率。如果软件的内部质量很差,那么开发人员或许需求花费更多的时刻修正问题,而不是开发新功用。
外部质量
外部质量是指软件的用户体验和其契合用户需求的程度。它重视的是软件的功用和表现形式,包含:
- 功用性:软件是否具有所需的功用,并且这些功用是否能够正常作业;
- 易用性:软件是否易于运用,是否契合用户的期望;
- 功用:软件是否运转快速并响应敏捷;
- 兼容性:软件是否能够在不同的操作系统和设备上正常作业。
外部质量如果很差,那么用户在运用软件进程中或许会遇到问题,而这些问题或许会影响用户体验,导致用户丢失。
为什么内部质量更重要
内部质量高的中心降低了未来改变的本钱。
能够参考下图的时刻-功用累计关系图。
关于内部质量比较差的软件,尽管初期进展敏捷,但是随着时刻的消逝,增加新功用变得越来越困难。甚至一个小改动也需求程序员理解很多代码。当开发做代码改变时,还或许产生意想不到的缺点,因此导致测验时刻长,需求更高本钱来做缺点修正和验证。
关于内部质量高的软件,则与其相反,能够参考下图的比较。
内部质量高的软件更容易被完成。
内部质量高的软件特色之一就是易读性。 这样利于开发者更快弄清楚应用程序是怎么运转的,这样就能够知道怎么增加新功用。如果将软件很好地划分为不同的完成模块,则开发者没必要阅览一切代码,只需求快速找到触及功用变动模块的代码就行。
怎么衡量软件质量
Cyclomatic Complexity(圈杂乱度)
Cyclomatic Complexity通过核算代码中不同途径的数量来衡量代码的杂乱程度。圈杂乱度越高,表明代码的控制流程越杂乱,或许存在更多的错误和缺点。
下面举例说明Cyclomatic Complexity怎么核算。
public int calculate(x, y) {
if (x >= 20) {
if (y >= 20) {
return y;
}
return x;
}
return x + y;
}
这段代码的流程图如下:
圈杂乱度的公式如下:
E – N + 2
其间 E 表明图中的边数(上图中的一切形状),N 表明节点数(上图中的一切箭头)。因此,在我们的例子中,6 – 5 + 2 = 3,的确这段代码包含三条途径。
Maintainability Index(可保护性指数)
Maintainability Index(可保护性指数)是一种用于评价软件代码可保护性的目标。它一般考虑代码的杂乱度、长度和注释等要素,并将这些要素整合成一个分数来衡量代码的可读性、可保护性和可重构性。
一般状况下,可保护性指数的分数范围是 [0,100],分数越高表明代码的可保护性越好。可保护性指数能够帮助开发人员识别哪些代码需求改善,以进步代码的可保护性和可读性,从而减少保护本钱、降低缺点率,进步代码的质量。
Dependencies(依靠)
软件的开发进程势必会依靠外部框架和库,这些框架和库本身也会经常更新(保护者会增加和删除功用、修正错误、改善功用,并修补安全漏洞)。
旧版本库和框架一般会对依靠它的软件质量产生负面影响。例如安全漏洞是显着的风险(例如22年8月份的
Apachelog4j漏洞)。
SQALE评价法
SQALE评价法主要重视四个目标:
- 技术债:即未来要花费的时刻和资源去修正当前存在的问题
- 可保护性:即代码的易读性、可理解性和可扩展性,从代码的模块化程度、命名规范、注释等要素,并对这些要素进行打分。
- 可靠性:即软件的安稳性和可靠性,评价代码中存在的错误、漏洞和异常处理状况。如果存在较多的问题,他们就需求考虑重新规划代码或增加更多的测验用例。
- 功用:即软件的响应速度和处理能力