HIT Software Construction Review Notes(1-2 Quality Objectives of Software Construction)
第1章:软件构造的观点和质量目标
1.2软件构造的质量目标
1.软件系统的质量属性
外部和内部质量因素
【外部质量因素影响用户,内部质量因素影响软件本身及其开发人员,外部质量是内部质量的结果】
外部质量因素:诸如速度或易用性等质量,可能会被用户检测到。(不仅仅是真正与最终产品互动的人员,还包括购买软件或将与其开发合同的人员)。
适用于软件产品的其他特性(例如模块化或可读)是内部因素,只有可以访问实际软件文本的计算机专业人员才能看到。
最后,只有外部因素真正“碍事”。
但是,实现这些外部因素的关键在于内部因素:为了让用户享受可见的品质,设计师和实施者必须采用内部技术来确保隐藏的品质。
(1)外部质量因素
1.正确性
正确性是软件产品按照其规格所定义的执行其确切任务的能力。
正确性是最主要的质量因素。
确保正确性:一个严肃的软件系统涉及很多领域,因此无法通过在单一级别上处理所有组件和属性来保证其正确性。相反,分层方法是必要的,每一层都依赖于较低层的方法。
假设一个软件系统是分层开发的,每个层在假定其下层也是正确的情况下保证其正确性。
确保正确性的方法:测试和调试。
诸如断言之类的防御性编程旨在帮助构建从一开始就是正确的软件,而不是将其调试成正确性。
2.健壮性
健壮性是软件系统对于异常情况做出适当反应的能力。
健壮性补充了正确性,正确性解决了规范覆盖的情况下系统的行为,健壮性表征了该规范之外发生的事情。
健壮性是为了确保如果出现这种情况,系统不会导致灾难性的事件;它应该产生适当的错误信息,干净地终止它的执行,或者进入所谓的“优雅毁灭”模式。
健壮性与“异常情况”有关,这意味着正常情况和异常情况的概念总是与某个规范相关。
一个异常情况只是一个未被规范覆盖的情况,如果你扩大了规格,那么以前的异常情况就会变得正常,即使它们对应于你不希望发生的错误的用户输入等事件。这种意义上的“正常”并不意味着“理想”,而只是“计划在软件设计中”。虽然起初似乎有些自相矛盾的是,错误的输入应该被称为正常情况,但任何其他方法都不得不依赖于主观标准,因此将是无用的。
3.可扩展性
可扩展性是软件产品适应规格变化的容易程度。
可扩展性的一个问题来源是规模。
对于小型项目而言,变更通常不是一个难题;但随着软件的规模越来越大,适应规格变化也变得越来越难。一个大型的软件系统往往被它的维护者看作是一个巨大的卡片做成的房子,在这个卡片房屋中,拉出任何一个元素(卡片)都可能导致整个房子崩溃。
我们需要可扩展性,因为在所有软件的基础上都存在着一些人为现象,因此是变幻莫测的。
传统的方法没有充分考虑到变化,而是依赖于软件生命周期的理想视图,其中初始分析阶段冻结了需求,其余过程致力于设计和构建解决方案。
两条原则对于提高可扩展性至关重要:
1.设计简单:简单的架构比复杂的架构总是更容易适应变化。
2.分散化:模块越自主,简单变更只会影响一个模块或少量模块的可能性就越大,而不是触发整个系统变化的连锁反应。
4.可复用性
可复用性是软件元素为构建许多不同应用程序提供服务的能力。
对可复用性的需求来自软件系统经常遵循类似模式的观察;应该有可能利用这种共性并避免重新解决以前遇到的问题。通过捕捉这种模式,可重用的软件元素将适用于许多不同的开发。
5.兼容性
兼容性是易于将软件元素与其他元素相结合的性质。
兼容性很重要,因为我们不在真空中开发软件元素:他们需要互相交互。
困难:一个例子是许多操作系统支持的各种不兼容的文件格式。只有在文件格式兼容的情况下,程序才能直接使用他人的结果作为输入。
兼容性的关键在于设计的同质性,以及就程序间通信的标准化约定达成一致。
兼容性的关键是标准化,特别是标准协议。
方法包括:
1.标准化的文件格式,如在Unix系统中,每个文本文件只是一系列字符。
2.标准化的数据结构,就像在Lisp系统中那样,所有的数据和程序都是用二叉树表示的(在Lisp中称为列表)。
3.标准化用户界面,如各种版本的Windows,OS / 2和MacOS,其中所有工具都依赖单一范例与用户进行通信,基于标准组件,如窗口,图标,菜单等。
通过为由软件操作的所有重要实体定义标准化的访问协议来获得更一般的解决方案。
6.效率
效率是软件系统对硬件资源尽可能少的需求的能力,例如处理器时间,内部和外部存储器中占用的空间,通信设备中使用的带宽等。
如果软件不正确,效率并不重要(提出一个新的格言:不要担心它的速度,除非它是正确的)。对效率的关注必须与其他目标(如可扩展性和可重用性)相平衡;极端的优化使软件非常专业化,不适合改变和重用。
在多种质量因素之间进行权衡!
7.可移植性
可移植性便于将软件产品转移到各种硬件和软件环境。
可移植性不仅涉及物理硬件的变体,更涉及硬件 - 软件机器 - 我们真正编程的机器 - 包括操作系统,窗口系统(如果适用)以及其他基本工具。
8.使用方便
易用性是各种背景和资质的人们可以轻松学会使用软件产品并将其应用于解决问题。 它还涵盖了安装,操作和监控的简易性。
考虑的问题:如何为新手用户提供详细的指导和解释,而不会打扰只想做好业务的专家用户?
易于使用的关键之一是结构简单。一个精心设计的系统,按照清晰的思路构建而成,往往比杂乱的学习和使用更容易。
了解用户。一位优秀的设计师必须努力了解系统的用户群体。
9.功能
功能是系统提供的可能性范围。
程序设计中一种不适宜的趋势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程序极为复杂、不灵活、占用过多的磁盘空间。
更容易的问题是可能由于添加新功能而导致一致性的丧失,从而影响其易用性。 用户确实抱怨产品新版本的“花里胡哨”使其使用变得非常复杂。
更难的问题是避免过分关注功能而忘记其他品质(忽视整体质量)。
(奥斯蒙德曲线)
tips:首先考虑一小部分关键特征,并考虑所有质量因素。在开发过程中逐渐添加更多功能,并保证与关键功能相同的质量。
10.及时性
及时性是软件系统在用户需要时或之前发布的能力。
一个出现得太晚的优秀软件产品可能会完全忽略它的目标。
else.其余品质
可验证性是准备验收程序的容易程度,尤其是测试数据,以及在验证和操作阶段检测故障并将其跟踪到错误的容易程度。
完整性是软件系统保护其各种组件(程序,数据)免受未经授权的访问和修改的能力。
可修复性是缺陷修复容易程度的性质。
经济,作为及时性的伴侣,是软件系统能过按照其预算或者小于预算的资金完成的能力。
(2)内部质量因素
源代码相关因素,如代码行(LOC),循环复杂性等。
与结构有关的因素,如耦合度,内聚度等。
可读性,可理解性和清晰度。
复杂度。
大小。
内部质量因素通常用作外部质量因素的部分度量。
(3)质量属性之间的权衡
1.开发人员需要做出权衡。
通常情况下,开发人员会隐式地进行这些折衷,而不会花时间来检查相关问题以及各种可用选项; 效率往往是这种沉默决策中的主导因素。
真正的软件工程方法意味着努力清晰地陈述标准并有意识地做出选择!
2. 作为质量因素之间的权衡可能是必要的,其中一个因素从其他因素中脱颖而出:正确性。
从来没有任何理由为了诸如效率等其他问题而折衷正确性。
如果软件没有执行其功能,则其余都是无用的。
软件构造的关键问题:
上述的所有性质都很重要,但是在目前的软件行业,四个是脱颖而出的:
1-2:正确性和健壮性:可靠性
手段:
系统的软件构建方法
正式规范
在开发过程中自动检查
更好的语言机制
一致性检查工具
3-4:可扩展性和可复用性:模块化
面向对象编程如何提高质量:
正确性:封装,分散。
健壮性:封装,错误处理。
可扩展性:封装,信息隐藏。
可复用性:模块化,组件,模型,模式。
兼容性:标准化模块和接口。
可移植性:信息隐藏,抽象。
易用性:GUI组件,框架。
效率:可重复使用的组件。
及时性:建模,重用。
经济:重用。
功能性:可扩展性。
2.软件构造的五个关键质量目标
1.可理解性
2.可复用性
3.可维护性和适应性
4.健壮性
5.性能
参考资料:HIT软件构造课程,MIT软件构造课程