软考教材给软件质量下的定义,源头可以追溯到二十世纪八十年代:软件质量是软件产品满足规定的和隐含的需求能力有关的特征和特性的总和。这个定义里藏着一个关键信息——质量不是"代码写得好不好"这么一句笼统的评价,而是可以被拆解、被度量、被验证的一组属性。规定的需求,指需求规格说明书中明确写出来的功能与非功能要求;隐含的需求,指虽然没有写进文档,但用户基于常识和行业惯例理所当然期待的能力,比如数据不能被随意丢失、系统在断电后能恢复。这两类需求同等重要,考试中经常通过"隐含需求"这个角度出题,考察考生对质量定义完整性的理解。
软件质量模型,就是把这种抽象的质量定义系统化、结构化的分类框架。它把软件质量分解为若干个质量特性,每个特性再细分为若干子特性,子特性之下对应可度量的度量元。所谓质量特性,是软件产品满足质量需求的一组相关属性,比如功能性、可靠性;子特性是对特性的进一步分解,比如可靠性之下分出成熟性、容错性、易恢复性;度量元则是可以实际测量或计算的最小单位,比如平均故障间隔时间、平均修复时间。模型存在的意义在于统一术语、消除歧义。如果没有模型,甲方说的"好用"、开发方理解的"好用"、测试方验证的"好用"可能是三件完全不同的事;有了模型,三方都能指着"易用性"这一特性及其子特性逐条对齐。
从标准的演进看,我国先后采用了两个对应的国家标准:与ISO/IEC 9126对应的GB/T 16260系列标准,以及与ISO/IEC 25010对应的GB/T 25000系列标准。软考教材在软件质量部分引用的正是这套标准体系。模型的三层结构是考试的高频考点:第一层质量特性回答"关注质量的哪个方面",第二层子特性回答"这个方面可以再拆成哪些具体属性",第三层度量元回答"用哪些指标来量化"。需要特别注意的是,模型的层级关系是严格树状的,某个子特性只能归属一个特性,这正是命题人设计归属型选择题的理论依据。
软件质量模型并非一步到位,而是经历了从项目实践清单到国际标准的演进。一九七七年,McCall等人提出了第一个有影响力的软件质量模型,包含十一个质量要素,从三个视角组织:产品运行视角包括正确性、可靠性、效率、完整性、易用性五个要素,回答软件运行时表现如何;产品修正视角包括可维护性、灵活性、可测试性三个要素,回答软件需要修改时成本多高;产品转移视角包括可移植性、可重用性、互操作性三个要素,回答软件能否在新环境中复用。一九七八年,Boehm模型从另一个角度切入,提出三个高层特性:现行实用性、可维护性、可移植性,向下再分解为七个中层特性。这两个模型为后来的标准奠定了基础,但它们带有明显的项目实践色彩,各要素之间存在重叠。一九九一年,国际标准化组织发布ISO/IEC 9126,把质量特性统一为六个,形成标准化的质量模型;二〇一一年,ISO/IEC 25010取代9126,把特性扩展为八个,并首次把使用质量从产品质量中分离出来。理解这条谱系,是记忆全部子特性的逻辑线索。
值得一提的是,软件质量模型是软考体系中少有的横跨多科目的基础考点:软件设计师和软件评测师直接考查特性与子特性的记忆与归类,系统分析师考查质量模型在需求分析与评价中的应用,系统架构设计师则在质量属性场景与架构评估中把模型作为术语底座。同一个知识点在不同级别的考试中层层递进,先记结构、再懂应用,是投入产出比最高的复习路径之一。
质量特性为什么是这么分的?划分依据不是拍脑袋,而是质量问题的不同来源和不同利益相关方的关切。开发者关心代码改起来费不费劲,对应可维护性;运维人员关心系统能不能扛住长时间运行,对应可靠性;终端用户关心功能对不对、反应快不快、界面顺不顺手,对应功能适用性、性能效率和易用性;安全管理员关心数据会不会泄露、操作能否追溯,对应安全性;平台迁移人员关心换一台服务器、换一个操作系统还能不能跑,对应可移植性。八个特性各有各的立场,把软件全生命周期里所有干系人的关切都覆盖到了。反过来说,如果某个特性缺失,就意味着某一类干系人的关切没有被纳入质量管理范畴。
从技术本质上讲,每个特性都在回答一个根本问题。功能适用性回答的是"软件做的事对不对、全不全";可靠性回答的是"软件会不会坏、坏了多久能恢复";性能效率回答的是"软件跑得多快、消耗多少资源";兼容性回答的是"软件能不能和其他系统共存、交互";易用性回答的是"用户用起来费不费劲";安全性回答的是"数据与操作是否可信";可维护性回答的是"修改需要多大代价";可移植性回答的是"换个环境能否运行"。这八个问题互不重叠,任何一个都不能由另一个推导出来——性能再好的软件也可能功能错误,功能再全的软件也可能三天两头崩溃。这就是模型划分的技术合理性所在。
功能适用性包含三个子特性。功能完整性,指功能集合覆盖了所有规定的任务和用户目标,考察的是"有没有漏做";功能正确性,指软件提供了具有所需精度的正确结果,考察的是"做没做对",这是9126中"准确性"的继承者;功能适合性,指功能能促进规定任务的完成,考察的是"做的功能合不合适"。功能适合性这个子特性最容易被人忽略,它的深层含义是:多余的功能同样是一种缺陷。一个计算器软件内置了视频播放模块,虽然不违反正确性和完整性,却增加了学习成本、维护负担和出错面,所以功能不是越多越好,而是越适合越好。这种"过犹不及"的思想,是功能适用性与旧版功能性最本质的差别。
可靠性之下有四个子特性,理解它们的关键是分清故障发生的不同阶段。成熟性,指软件在正常运行中满足可靠性需求的程度,关注的是故障的"少"——缺陷密度低、长期运行故障率低;容错性,指在软件出现故障或违反规定接口时,仍能维持规定性能水平的能力,关注的是故障发生时的"扛"——比如输入非法参数不崩溃、磁盘出错时降级运行;易恢复性,指故障发生后重建性能水平、恢复直接受影响数据所需的时间与努力,关注的是故障之后的"快"——恢复时间短、恢复过程自动化程度高;可用性,指软件在需要使用时可操作和可访问的程度,关注的是"可用时间比例"这个结果。可用性可以用平均故障间隔时间和平均修复时间计算出来,即可用时间占全部时间的比例。注意,这里的可用性是可靠性家族的成员,指的是系统不宕机的程度,与易用性完全是两回事。
性能效率包含时间特性、资源利用性和容量三个子特性。时间特性指响应时间、处理时间、吞吐率等与时间相关的表现;资源利用性指执行功能时消耗的处理器、内存、存储、带宽等资源数量;容量是25010新增的子特性,指软件能够处理的最大并发用户数、最大数据量、最大任务数等极限指标。考试中,负载测试、压力测试验证的正是时间特性与容量,而资源利用性往往通过监控手段获取。易用性的变化幅度最大:9126中只有易理解性、易学性、可操作性三个子特性,25010扩展为六个,新增了用户差错防御、用户界面舒适性和可访问性,并把易理解性调整为可辨识性。可辨识性指用户能否识别软件是否适合其需求;用户差错防御指系统能否预防用户操作出错;可访问性指残障人士等特殊人群能否正常使用。易用性以人为中心,它的评价必须回到真实用户、真实任务、真实环境,这也是易用性测试难以自动化的根本原因。
ISO/IEC 9126把软件质量划分为六个一级特性、二十一个子特性。功能性包含适合性、准确性、互操作性、安全性、功能依从性五个子特性;可靠性包含成熟性、容错性、易恢复性三个子特性;易用性包含易理解性、易学性、可操作性三个子特性;效率包含时间特性、资源特性两个子特性;可维护性包含易分析性、易修改性、稳定性、易测试性四个子特性;可移植性包含适应性、易安装性、共存性、易替换性四个子特性。这个版本有几个明显的特点:安全性只是功能性下的一个子特性,地位不高;互操作性归在功能性之下;效率只有两个子特性,没有容量;没有独立的兼容性特性。软考中级软件设计师教材长期沿用这套六特性框架,考生如果只看教材不看标准演进,就会在遇到25010表述时产生困惑。
ISO/IEC 25010做了重大修订,最醒目的变化是模型一分为二:产品质量模型和使用质量模型。产品质量模型包含八个特性、三十一个子特性。功能适用性包含功能完整性、功能正确性、功能适合性三个子特性;性能效率包含时间特性、资源利用性、容量三个子特性;兼容性包含共存性、互操作性两个子特性;易用性包含可辨识性、易学性、可操作性、用户差错防御、用户界面舒适性、可访问性六个子特性;可靠性包含成熟性、可用性、容错性、易恢复性四
本篇完!