# 《高质量程序设计指南:c++/c语言 第三版》 > 通过渐构方法进行拆书 > 遵照书中的掌机顺序进行拆分,会删除部分无用描述 ## 1. 高质量软件开发之道 ### 1.1 如何理解软件的质量 #### `#d` 什么是质量? 词典的定义是: ① 典型的或本质的特征; ② 事物固有的或区别于其他事物的特征或本质; ③ 优良或出色的程度。 CMM对质量的定义是: ① 一个系统、组件或过程符合特定需求的程度; ② 一个系统、组件或过程符合客户或用户的要求或期望的程度。 #### `#t` 人类的健康 早先人们以为长得结实、饭量大就是健康,这显然是不科学的。 现代人总是通过考察多方面的生理因素来判断是否健康,如测量身高、体重、心跳、血压、血液、体温等。 如果上述因素都合格,那么表明这人是健康的。 如果某个因素不合格,则表明此人在某个方面不健康,医生会对症下药。 同理,我们也可以通过考察软件的质量属性来评价软件的质量,并给出提高软件质量的方法。 #### `#c` 何为质量 正确运行的软件未必是高质量软件 一提起软件的质量属性, 人们首先想到的是“正确性”。“正确性”的确很重要,但运行正确的软件就是高质量的软件吗? 不见得,因为这个软件也许运行速度很低,并且浪费内存,甚至代码写得一塌糊涂, 除了开发者本人谁也看不懂,也不会使用。可见正确性只是反映软件质量的一个因素而已。 #### `#c` 何为质量 多种多样的软件质量评判标准 什么是质量? 软件质量的评判标准所使用的新词可谓层出不穷。 如正确性、 精确性, 健壮性、 可靠性、 容错性、 性能、 易用性、 安全性、 可扩展性、 可复用性、 兼容性、 可移植性、 可测试性、 可维护性、 灵活性等。 除此之外还可以列出十几个 上述这些质量属性“你中有我,我中有他”。 如果开发人员每天都要面对那么多的质量属性咬文嚼字,不久就会迂腐得像孔乙己, 因此我们有必要对质量属性做些分类和整合。 #### `#d` 软件质量属性的分类 质量属性可分为两大类:“功能性”与“非功能性”,后者有时也称为“能力”(Capability)。 功能性质量属性有3个: 正确性、健壮性和可靠性; 非功能性质量属性有7个: 性能、易用性、清晰性、安全性、可扩展性、兼容性和可移植性。 #### `#c` 质量属性分类 为什么要如此分类 软件质量属性的分类 为什么碰巧是“10大”呢? 不为什么,只是方便记忆而已(如同国际、国内经常评“10大”那样)。 为什么“10大”里面不包括 可测试性、 可维护性、 灵活性、 它们不也是很重要的吗? 它们是很重要,但不是软件产品的卖点,所以挤不进“10大”行列。 我认为如果做好了上述“10大”质量属性,软件将会自然而然地具备良好的可测试性、可维护性。 人们很少纯粹地去提高可测试性和可维护性,勿要颠倒因果。 至于灵活性,它有益处也有坏处, 该灵活的地方已经被其他属性覆盖,而不该灵活的地方就不要刻意去追求。 #### `#c` 质量属性分类 区分重要的属性 软件质量属性的分类 根据经验,如果你想一股脑儿地把任何事情都做好, 结果通常是什么都做不好,做事总是要分主次的。 什么是重要的质量属性,应当视具体产品的特征和应用环境而定,请读者不要受本书观点的限制。 最简单的判别方式就是考察该质量属性是否被用户关注(即卖点)。 ### 1.2 十大软件质量属性的详解 #### 正确性 ##### `#d` 正确性的定义 正确性是指软件按照需求正确执行任务的能力。 这里“正确性”的语义涵盖了“精确性”。 ##### `#c` 属性定义 正确性的重要性 正确性无疑是第一重要的软件质量属性。 如果软件运行不正确,将会给用户造成不便甚至损失。 技术评审和测试的第一关都是检查工作成果的正确性。 正确性说起来容易做起来难。 因为从“需求开发”到“系统设计”再到“实现”,任何一个环节出现差错都会降低正确性。 机器不会主动欺骗人,软件运行出错通常都是人造成的,所以不要找借口埋怨机器有毛病。 开发任何软件,开发者都要为“正确”两字竭尽全力。 #### 健壮性 ##### `#d` 健壮性定义 健壮性是指在异常情况下,软件能够正常运行的能力。 ##### `#d` 正确性与健壮性的区别 正确性描述软件在需求范围之内的行为, 健壮性描述软件在需求范围之外的行为。 ##### `#c` 属性区分 都是开发商的问题 正确性与健壮性的区别 可是正常情况与异常情况并不容易区分, 开发者往往要么没想到异常情况, 要么把异常情况错当成正常情况而不做处理,结果降低了健壮性。 用户才不管正确性与健壮性的区别,反正软件出了差错都是开发方的错。 所以提高软件的健壮性也是开发者的义务。 ##### `#d` 健壮性的两层含义 一是容错能力,二是恢复能力。 ###### `#d` 容错能力 容错是指发生异常情况时系统不出错误的能力 ###### `#e` 容错能力的重要性 容错能力 对于应用于航空航天、武器、金融等领域的这类高风险系统,容错设计非常重要。 容错是非常健壮的意思,比如UNIX的容错能力很强,很难使系统出问题。 ##### `#d` 恢复能力 而恢复则是指软件发生错误后(不论死活)重新运行时,能否恢复到没有发生错误前的状态的能力。 ##### `#t` 恢复能力与容错能力的区别 恢复能力 例如,某人挨了坏蛋一顿拳脚, 特别健壮的人一点事都没有,表示有容错能力; 比较健壮的人,虽然被打倒在地, 过了一会还能爬起来,除了皮肉之痛外倒也不用去医院, 表示恢复能力比较强; 而虚弱的人可能短期恢复不过来,得在病床上躺很久。 ##### `#e` 恢复能力的价值 恢复能力 Microsoft公司早期的窗口系统,如Windows 3.x和Windows 9x,动不动就死机, 其容错性的确比较差。 但它们的恢复能力还不错, 机器重新启动后一般都能正常运行,看在这个份上, 人们也愿意将就着用。 #### 可靠性 ##### `#d` 什么是可靠性 可靠性不同于正确性和健壮性, 软件可靠性问题通常是由于设计中没有料到的异常和测试中没有暴露的代码缺陷引起的。 可靠性是一个与时间相关的属性, 指的是在一定环境下,在一定的时间段内, 程序不出现故障的概率,因此是一个统计量, 通常用平均无故障时间(MTTF, mean-time to fault)来衡量。 ##### `#d` 可靠性的历史 可靠性本来是硬件领域的术语。 比如某个电子设备在刚开始工作时挺好的, 但由于器件在工作中其物理性质会发生变化(如发热、老化等), 慢慢地系统的功能或性能就会失常。 所以一个从设计到生产完全正确的硬件系统,在工作中未必就是可靠的。 人们有时把可靠性叫做稳定性。 ##### `#c` 可靠性意义 可靠性对于软件领域 什么是可靠性 软件在运行时不会发生物理性质的变化, 人们常认为如果软件的某个功能是正确的, 那么它一辈子都是正确的。 可是我们无法对软件进行彻底的测试,无法根除软件中潜在的错误。 平时软件运行得好好的, 说不准哪一天就不正常了,因此把可靠性引入软件领域是很有意义的。 ##### `#e` “千年虫”问题 > 原书未提及,自行了解 ##### `#e` “内存泄露”问题 > 原书未提及,自行了解 ##### `#e` “误差累积”问题 > 原书未提及,自行了解