天天看点

Software Construction学习——软件的质量属性

软件的质量是衡量软件好坏的一个重要的指标;在软件构造的过程中需要了解如果达不到质量指标,会有什么后果;还需要了解有哪些面向质量指标的软件构造技术。

一.软件系统的质量属性

外部质量因素(External quality factor):外部质量因素比如软件使用的速度和难易度,这些因素都会被用户所探查到。

内在因素(internal factors):内部质量因素比如模块化编程、代码可读性。内部因素一般只对于那些能接触到软件代码本身的开发者而言。

综上,只有外部质量因素起到了作用;但是达到外部质量因素的关键是内部质量因素。即外部质量取决于内部质量。

***********分割线*************

(一)外部质量因素

正确性(Correctness):正确性是指软件能准确地按照所提供spec执行。正确性是最主要的质量指标。

保证正确性的方法:

1.分层——一个真正的软件系统涉及了许多领域,因此同对于多个要素进行分析,从而确保正确性是不太可能实现的。取而代之的是一种分层的方法,每一层都依赖于较低的一层。假设软件系统是层状的,每一层保证自己的正确性,同时假设其下层是正确的。 

Software Construction学习——软件的质量属性

2. 测试和调试(Testing and debugging)——发现不正确,消除bug(JUnit)

3. 防御式编程(Defensive programming)——在写程序的时候就保持正确性(assert)

4. 形式化方法(Formal approach)——数学技巧来验证代码的正确性

健壮性(Robustness):软件对于异常输入能否做出合理的反应。如果软件接受到了异常输入,健壮性保证软件并不会产生灾难性的反应,而是产生一些合理的错误信息,然后终止程序的执行。

与正确性的区别:

1. 健壮性是对正确性的补充

2. 正确性是指对spec内合理的输入做出的合理的反应,而健壮性是要求对于spec声明之外的非法输入做出合理的反应。(异常输入:未被spec所覆盖的情况)

Software Construction学习——软件的质量属性

可扩展性(Extendibility):对软件的spec进行修改,是否容易?一般来说,软件规模越大,软件扩展起来越不容易。大的软件系统就像一个用纸牌搭成的房子,抽取出任何一张都有可能导致整个房子的坍塌。但是扩展是必须的,因为软件要应对变化。

增加可扩展性的两个必要原则:

1. 简约设计主义(Design Simplicity):一个简洁的软件架构能更加容易的适应变化。

2. 分离设计主义(Decentralization):更多的自主的模块,就有可能使得变化的影响局限在几个模块之内而不是引起整个系统的变化。

可复用性(Reusability):软件在开发之后能适用于多个不同的应用领域。可复用性的出现是因为软件系统经常出现一些重复的模式,这就可能从其中抽取共性,并且对于那些已经遇到过的问题,要避免重新设计解决方案。

兼容性(Compatibility):不同软件之间可以很容易的结合,而不引起冲突。软件的兼容性之所以重要是因为我们不是在一个“真空”的环境之中进行软件的开发,软件之间是需要进行交互的。

兼容性的关键是——保持设计的同构性,并遵守标准。

方法包括:

1. 标准文件格式——就如同在Unix系统下,所有文件都是一连串简单的字符。

2. 标准数据结构——在Lisp系统下,所有的数据和程序都表示为二叉树。

3. 标准用户界面——Windows,MacOS,所有与用户交互的工具都基于一个简单的范例。

效率(Efficiency):在实现同样目标下,时间复杂度、空间复杂度较低,对于硬件的需求越低越好。

    性能毫无意义,除非有足够的正确性。对于性能的关注要与其他质量属性进行这种。有时候过度的优化会导致软件不再适应变化和复用。
“We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.”  ——Donald Knuth

可移植性(Portability):软件可以方便的在不同环境下进行移植,不仅仅是硬件不同,还包括不同的操作系统。

易用性(Ease of use):对于不同水平和年龄的人而言,软件是容易安装、操作的;并且给用户提供了详细的指南。

    结构的简易性(Structural simplicity):一个更加简洁的、全面的结构,通常会比那些复杂的要更容易使用

    了解用户(Know the user):一个好的设计者必须要了解软件的使用者群体。

功能性(Functionality):系统所提供的可能性的范围(Functionality is the extent of possibilities provided by a system不是特别理解)。程序设计中一种不适宜的趋势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程序极其复杂、不灵活、占用过多磁盘空间。与此同时,还存在一个更加困难的问题是开发者在关注功能性的同时,忽略了其他的质量属性。

Software Construction学习——软件的质量属性

及时性(Timeliness):软件能在用户的需求被了解到之前就已经存在了。一个软件如果出现的太晚,那就有可能失去它的目标用户。

其它的外部质量属性:

    可验证性(Verifiability):能简单的提供测试数据,并且容易跟踪错误

    完整性(Integrity):软件能保护自身的代码和数据,防止非授权的途径对其进行访问和修改

    可修复性(Repairability):有促进修复的能力

    经济性(Economy):及时性的附加,能在预算之内完成软件的构造

(二)内部质量因素

复杂度(Complexity)基本上是所有外部质量因素的敌人。

源代码相关:LOC(Lines of Code)和圈复杂度(Cyclomatic Complexity)……

Software Construction学习——软件的质量属性

架构相关:耦合度,内聚程度

可读性(Readability)        可理解性(Understandability)        简洁性(Clearness)        大小(Size)

(三)质量属性的权衡

· 完整性 vs 易用性——如果要保证程序的完整性,就必须要加入各种各样的保护措施,而这些措施势必会降低程序的易用性

· 经济型 vs 功能性——实现更多的功能意味着要花费更多的资金

· 效率 vs 可移植性、复用性——最佳的效率要求对于特定的硬件和软件环境有着合适的兼容程度,但同时就代表软件只能在特定的环境下使用,违背了可移植性。而对于spec的最佳的适应情况,就有可能使得复用性受损。

· 及时性 vs 可扩展性——及时性有可能要求开发者去进行“迅速的开发”,从而导致软件并没有那么强的可扩展性。

综上,软件的开发者需要对质量属性进行一个权衡(Tradeoff)

    - 一般来说,软件开发者会隐式的去进行各种质量属性的权衡,而效率通常占据了主导

    - 一个真正的软件工程方法意味着有一个明确的标准,并且要有意识的做出选择

    - 正确的软件开发过程中,开发者应该将不同质量因素之间如何做出折中的设计决策和标准明确的写下来

有一个因素是绝对不能被放入权衡范围之内的:正确性

在如今的软件工业之中,有四个质量属性是最重要的:

· 正确性和健壮性:可靠性(reliability)

    系统的软件构建方法

    正规的spec

    在开发过程中进行自动检查

    更好的语言机制

    持续的检测工具

· 可扩展性和复用性: 模块化( modularity)    

(四)在软件构造过程中五个需要注意的质量目标

1.“优雅而美丽”的代码 -> 更容易理解(Understandability)

Software Construction学习——软件的质量属性

2. 重复使用的设计方案 -> 降低开发成本(Reusablility)

Software Construction学习——软件的质量属性

3. 低复杂度 -> 适应变化,更容易扩展(Extendibility, Maintainability)

Software Construction学习——软件的质量属性

4.健壮性和正确性 -> 遇到bug程序仍能够正常运行(Robustness, Correctness)

Software Construction学习——软件的质量属性

5. 程序的行为和效率 -> 更加有效率的运行(Efficiency,Performance)

Software Construction学习——软件的质量属性

继续阅读