《202X年全面软件质量管理》由会员分享,可在线阅读,更多相关《202X年全面软件质量管理(30页珍藏版)》请在金锄头文库上搜索。
1、全面软件质量管理 剖析软件质量的内涵 内建高质量而非修补质量 目录 1 引言2 软件质量属性和质量要素3 商业目标决定质量目标4 质量保证能够保证质量吗5 质量人员的状况6 全面软件质量管理 模型7 全面软件质量管理 制定质量计划8 全面软件质量管理 技术评审9 全面软件质量管理 软件测试10 全面软件质量管理 过程检查11 全面软件质量管理 缺陷跟踪工具 1 引言 软件质量管理是充满争论的话题 被人们奉为软件质量管理圣经的CMM和ISO9001似乎并不奏效 现实和理想之间的差距太大 经典软件工程教科书以及CMM和ISO9001总是抛开商业目标谈质量管理 本末倒置 纸上谈兵 误导了大量读者 所
2、以质量管理才变得那么艰辛 世界上还没有万能的软件质量管理圣经 我们不要迷信CMM和ISO9000 要多向有实战经验的同行专家请教 但是不要轻信 纸上谈兵 的专家 本文给出了一套实用主义的 全面软件质量管理 方法 重要的理念 商业目标决定质量目标 提高软件质量的最终目的是为了赢利 而不是创造完美无缺的产品 因此对于普通商业软件而言 并不是 质量越高越好 而是恰好让广大用户满意 并且将提高质量所付出的代价控制在预算之内 2 软件质量属性和质量要素 2 1如何描述质量词典对质量的定义是 典型的或本质的特征 事物固有的或区别于其他事物的特征或本质 优良或出色的程度 CMM对质量的定义是 一个系统 组件
3、或过程符合特定需求的程度 一个系统 组件或过程符合客户或用户的要求或期望的程度 上述定义很抽象 人们看了准会一脸迷惘 就让我们用 人的健康 来类比解释软件质量 古时候人们以为长得结实 饭量大就是健康 这显然是不科学的 现代人总是通过考察多方面的生理因素来判断是否健康 如测量身高 体重 心跳 血压 血液 体温等 如果上述因素都合格 那么表明这人是健康的 如果某个因素不合格 则表明此人在某个方面不健康 医生会对症下药 通过类比 我们这样理解软件质量 软件质量是许多质量属性的综合体现 各种质量属性反映了软件质量的方方面面 人们通过改善软件的各种质量属性 从而提高软件的整体质量 否则无从下手 软件的质
4、量属性很多 如正确性 精确性 健壮性 可靠性 容错性 性能 易用性 安全性 可扩展性 可复用性 兼容性 可移植性 可测试性 可维护性 灵活性等 上述这些质量属性之间 你中有我 我中有他 非常缠绵 如果开发人员每天要面对那么多的质量属性咬文嚼字 不久就会迂腐得像孔乙己 因此我们有必要对质量属性做些分类和整合 质量属性可分为两大类 功能性 与 非功能性 后者有时也称为 能力 Capability 2 软件质量属性和质量要素 2 2十大软件质量因素功能性质量因素 正确性 健壮性 可靠性非功能性质量因素 性能 易用性 清晰性 安全性 可扩展性 兼容性 可移植性为什么是 十大 质量因素 逐一解释 十大
5、质量因素 参见 高质量程序设计指南 C C语言 2 3软件质量要素什么是软件质量要素 1 从技术角度讲 对软件整体质量影响最大的那些质量属性才是质量要素 2 从商业角度讲 客户最关心的 能成为卖点的质量属性才是质量要素 对于一个特定的软件而言 我们首先判断什么是质量要素 才能给出提高质量的具体措施 而不是一股脑地想把所有的质量属性都做好 否则不仅做不好 还可能得不偿失 如果某些质量属性并不能产生显著的经济效益 我们可以忽略它们 把精力用在对经济效益贡献最大的质量要素上 简而言之 只有质量要素才值得开发人员下功夫去改善 2 软件质量属性和质量要素 2 4正确性正确性是指软件按照需求正确执行任务的
6、能力 正确性 的语义涵盖了 精确性 正确性无疑是第一重要的软件质量属性 技术评审和测试的第一关都是检查工作成果的正确性 机器不会主动欺骗人 软件运行出错通常都是人造成的 所以不要找借口埋怨机器有毛病 2 5健壮性健壮性是指在异常情况下 软件能够正常运行的能力 正确性描述软件在需求范围之内的行为 而健壮性描述软件在需求范围之外的行为 开发者往往把异常情况错当成正常情况而不作处理 结果降低了健壮性 用户才不管正确性与健壮性的区别 反正软件出了差错都是开发方的错 所以提高软件的健壮性也是开发者的义务 健壮性有两层含义 一是容错能力 二是恢复能力 从语义上理解 恢复不及容错那么健壮 Unix容错能力很
7、强 可惜不好用 Windows容错能力较差 但是恢复能力很好 而且很好用 占了90 的操作系统市场 2 软件质量属性和质量要素 2 6可靠性可靠性是指在一定的环境下 在给定的时间内 系统不发生故障的概率 可靠性本来是硬件领域的术语 比如某个电子设备在刚开始工作时挺好的 但由于器件在工作中其物理性质会发生变化 如发热 慢慢地系统的功能或性能就会失常 所以一个从设计到生产完全正确的硬件系统 在工作中未必就是可靠的 软件在运行时不会发生物理性质的变化 人们常以为如果软件的某个功能是正确的 那么它一辈子都是正确的 可是我们无法对软件进行彻底地测试 无法根除软件中潜在的错误 平时软件运行得好好的 说不准
8、哪一天就不正常了 如有千年等一回的 千年虫 问题 司空见惯的 内存泄露 误差累积 问题等等 软件可靠性分析通常采用统计方法 遗憾的是目前可供第一线开发人员使用的成果很少见 大多数文章限于理论研究 口语中的可靠性含义宽泛 几乎囊括了正确性 健壮性 只要人们发现系统有毛病 便归结为可靠性差 从专业角度讲 这种说法是确切的 时隐时现的错误一般都属于可靠性问题 纠错的代价很高 例如当维护人员十万火急地赶到现场时 错误消失了 等维护人员回家后 错误又出现了 软件可靠性问题主要是在编程时候埋下的祸害 很难测试出来 应当提倡规范化程序设计 预防可靠性祸害 2 软件质量属性和质量要素 2 7性能性能通常是指软
9、件的 时间 空间 效率 而不仅是指软件的运行速度 人们总希望软件的运行速度高些 并且占用资源少些 既要马儿跑得快 又要马儿吃的少 性能优化的关键工作是找出限制性能的 瓶颈 不要在无关痛痒的地方瞎忙乎 例如在大学里当教师 光靠使劲讲课或者埋头做实验 职称是升不快的 有些人找到了突破口 一年之内 造 它几十篇文章 争取破格升副教授 教授 程序员可以通过优化数据结构 算法和代码来提高软件的性能 例如数据库程序的优化 算法复杂度分析是很好的方法 可以达到 未卜先知 的功效 性能优化就好像从海绵里挤水一样 你不挤 水就不出来 你越挤海绵越干 有些程序员认为现在的计算机不仅速度越来越高 而且内存越来越大
10、因此软件性能优化的必要性下降了 这种看法是不对的 殊不知随着机器的升级 软件系统也越来越庞大了和复杂了 性能优化仍然大有必要 最具有代表性的是三维游戏软件 例如 DeltaForce 古墓丽影 反恐精英 等 如果不对软件 关键是游戏引擎 做精益求精的优化 要想在一台普通的PC上顺畅地玩游戏是不太可能的 2 软件质量属性和质量要素 2 8易用性易用性是指用户使用软件的容易程度 现代人的生活节奏快 干啥事都想图个方便 所以把易用性作为重要的质量属性对待无可非议 导致软件易用性差的根本原因 理工科大学教育存在缺陷 没有开设人机工程学 美学 心理学这些必修课 大部分开发人员不知道如何设计易用的软件产品
11、 开发人员犯了 错位 的毛病 他以为只要自己用起来方便 用户也就会满意 软件的易用性要让用户来评价 当用户真的感到软件很好用时 一股温暖的感觉油然而生 于是就用 界面友好 方便易用 等词来评价软件产品 2 9清晰性清晰意味者所有的工作成果易读 易理解 可以提高团队开发效率 降低维护代价 开发人员只有在自己思路清晰的时候才可能写出让别人易读 易理解的程序和文档 可理解的东西通常是简洁的 一个原始问题可能很复杂 但高水平的人就能够把软件系统设计得很简洁 如果软件系统臃肿不堪 它迟早会出问题 所以简洁是人们对工作 精益求精 的结果 而不是潦草应付的结果 与简洁对立的是 罗里罗嗦 千万不要把在学校里
12、造文章 的手法用于开发产品 如果把文章写得很简洁 让人很容易理解 投稿往往中不了 只有加上一些玄乎的东西 把本来简单的弄成复杂的 才会增加投稿的命中率 2 软件质量属性和质量要素 2 10安全性这里安全性是指信息安全 英文是Security而不是Safety 安全性是指防止系统被非法入侵的能力 既属于技术问题又属于管理问题 信息安全是一门比较深奥的学问 其发展是建立在正义与邪恶的斗争之上 这世界似乎不存在绝对安全的系统 连美国军方的系统都频频遭黑客入侵 如今全球黑客泛滥 真是 道高一尺 魔高一丈 啊 开发商和客户愿意为提高安全性而投入的资金是有限的 他们要考虑值不值得 究竟什么样的安全性是令人
13、满意的呢 一般地 如果黑客为非法入侵花费的代价 考虑时间 费用 风险等因素 高于得到的好处 那么这样的系统可以认为是安全的 对于普通软件 并不一点要追求很高的安全性 也不能完全忽视安全性 要先分析黑客行为 2 软件质量属性和质量要素 2 11可扩展性可扩展性反映软件适应 变化 的能力 在软件开发过程中 变化 是司空见惯的事情 如需求 设计的变化 算法的改进 程序的变化等等 由于软件是 软 的 是否它天生就容易修改以适应 变化 关键要看软件的规模和复杂性如果软件规模很小 问题很简单 那么修改起来的确比较容易 这时就无所谓 可扩展性 了 要是软件的代码只有100行 那么 软件工程 也就用不着了 如
14、果软件规模很大 问题很复杂 倘若软件的可扩展性不好 那么该软件就像用卡片造成的房子 抽出或者塞进去一张卡片都有可能使房子倒塌 现代软件产品通常采用 增量开发模式 不断推出新版本 获取增值利润 可扩展性越来越重要 可扩展性是系统设计阶段重点考虑的质量属性 谈到软件的可扩展性 开发人员首先想到的是怎样提高可扩展性 于是努力去设计很好的体系结构来提高可扩展性 却不考虑该不该做这件事 从商业角度考虑 如果某个软件将不断地推出新版本 那么可扩展性很重要 但是如果软件永远都不会有下个版本 一次性买卖 那么根本无需提高可扩展性 何必自找苦吃呢 2 软件质量属性和质量要素 2 12兼容性兼容性是指不同产品 或
15、者新老产品 相互交换信息的能力 例如两个字处理软件的文件格式兼容 那么它们都可以操作对方的文件 这种能力对用户很有好处 兼容性的商业规则 弱者设法与强者兼容 否则无容身之地 强者应当避免被兼容 否则市场将被瓜分 如果你经常看香港拍的 黑帮 影片 你就很容易明白这个道理 金山软件公司的WPS与微软的Word之争 WPS一定要与Word兼容 否则活不下去 但是Word绝对不会与WPS兼容 除非WPS又在中国称老大 中国联通和中国移动的手机互联互通问题 互联网的价值与用户数量的平方成正比 2 13可移植性软件的可移植性指的是软件不经修改或稍加修改就可以运行于不同软硬件环境 CPU OS和编译器 的能
16、力 主要体现为代码的可移植性 编程语言越低级 用它编写的程序越难移植 反之则越容易 这是因为 不同的硬件体系结构 例如IntelCPU和SPARCCPU 使用不同的指令集和字长 而OS和编译器可以屏蔽这种差异 所以高级语言的可移植性更好 Java程序号称 一次编译 到处运行 具有100 的可移植性 为了提高Java程序的性能 最新的Java标准允许人们使用一些与平台相关的优化技术 这样优化后的Java程序虽然不能 一次编译 到处运行 仍然能够 一次编程 到处编译 软件设计时应该将 设备相关程序 与 设备无关程序 分开 将 功能模块 与 用户界面 分开 3 商业目标决定质量目标 3 1教科书的片面观点大凡软件工程教科书为了强调质量的重要性 总是要举一些历史上发生过的重大软件质量事故 例如航天飞机爆炸 核电站失事 爱国者导弹发生故障等等 这些事故的确不是危言耸听 给人们敲响了质量的警钟 学术界总是喜欢宣扬质量至上的理念 而忽视企业的商业利益 将质量目标凌驾于商业目标之上 我不能评判这种现象是好还是坏 但是的确误导了大量读者 许多软件人员都有 质量越高越好 的观念 这是被教科书灌输的 而不是