当前课程知识点:软件工程 > 第1章 初识软件工程 > 1.5 软件质量实现 > 讲授视频
软件已经成为人们生活中
不可缺少的一部分
正是由于软件越来越重要
人们对其质量的要求
也就越来越高
人们都希望开发高质量的软件
但是由于受到市场因素的牵制
不可能达到“完美”这个标准
因此 软件工程的目标
不是实现“完美”
而是达到“足够好”
那么 什么是好的软件呢
质量是一个复杂多面的概念
不同的人从各自的视角
会有不同的理解和要求
对于用户来说
他们更关心的是系统的功能质量
比如说
是否满足了自己的需求
是否存在影响使用的缺陷
软件性能如何
以及是否容易使用等
开发人员
更多关心的是系统的结构质量
主要包括代码的可读性
可测试性 可维护性
以及效率和安全等方面的因素
对于投资者来说
软件开发的过程质量更为重要
他们主要关心的是
项目是否可以在
规定的时间和预算内交付
最终产品的交付质量
是否可以保证
通常来说
软件质量应该涵盖软件过程
软件产品和产品效用三个方面
软件过程用过程质量来衡量
软件产品则包括
内在质量和外在质量两部分
产品的效用用使用质量来衡量
那么过程的质量会影响到
软件产品内在的代码质量
而代码质量的好坏
决定了产品的外在质量
外在质量最终影响到
用户的使用质量
因此
我们必须用有效的方法
来检验整个开发过程
程序代码和最终产品
并对用户的使用质量进行监测
质量大师温伯格认为
质量就是软件产品
对于某个(或某些)人的价值
这里的某个或某些人
通常指的就是用户
在这一句话中
包含了两个层次的质量含义
即“正确的软件”
和“软件运行正确”
所谓“正确的软件”
是说一个软件
要能够满足用户的需求
为用户创造价值
比如说带来工作的便利
创造了利润或者减少成本
而“软件运行正确”
说的是软件没有或很少有Bug
扩展性强 性能良好
易用性高等
我们开发的软件
既要是正确的
也要是运行正确的
这是曾经引发全球热潮的
谷歌眼镜(Google glass)
从2015年1月19日开始
不再接受订单
与此同时
谷歌还关闭了
“探索者”这个软件开发项目
除去销售策略欠佳方面的原因
一个关键的问题在于
谷歌自己也不清楚
谷歌眼镜存在的目的
它是让用户更便捷地
获得电子邮件等通知信息
还是更迅速地拍照
由于需求调研不足
产品过于超前
再加上价格昂贵等因素
使得这款看起来很酷的产品
很快就丧失了对用户的吸引力
前面我们提到过
微软的Vista系统
这是一个典型的
“运行不正确”的软件
Vista系统
应该说是用户非常期待的
也是满足用户需求的
但是由于莫名其妙的死机
以及很差的运行效率等
一系列缺陷
最终导致许多用户弃用
甚至有的用户
选择退回到XP版本
所以微软不得不在两年之后
用Win 7取代了Vista
上面两个事例很好地说明了
一个好的软件
既要是“正确的”
也要是“运行正确的”
这两者是相辅相成的
前者关系到软件的成败
后者关系到软件的好坏
对于开发团队来说
尤其是偏重技术的开发团队
往往过分注重后者
也就是说“运行正确”
经常会陷入到
在软件开发过程中的
技术细节中
而忽略了前者
也就是
软件需要符合用户的需求
这样开发出的软件
经常是能用
但不是用户满意的产品
从软件产品的角度来看
高质量意味着
做了用户想要它做的事情
能够正确有效地
使用计算机资源
易于用户学习和使用
系统设计良好
代码编写规范
而且易于测试和维护
在理解了质量的基本含义之后
我们要考虑一下
应该如何评价质量
这是一个可爱的小胖子
你会因为这个人长得结实
饭量大
就断定他是健康的吗
显然这不是一个科学的判断方法
现代人一般会通过
考察多方面的生理因素
来判断这个人是否健康
例如使用医学仪器
对身高 体重 心脏 血压 血液
体温等一系列指标进行测量
如果所有指标都是合格的
那么可以说这个人是健康的
如果某项指标不合格
就说明这个人
可能存在一定的健康隐患
医生会做出进一步的诊断
并对症下药
同样的道理
产品的质量
也是可以从多个维度
来进行评价的
David Garvin提出了一种
多维度的质量评价模型
具体包括性能质量 产品特色
可靠性 符合性 耐久性
可服务性以及外观性和感知性
等8个维度
不同的属性反映了
产品质量的不同方面
我们可以通过
改善产品的各个质量属性
来提高整个产品的质量
我们用一个汽车的例子
来说明一下Garvin的
8个质量维度
汽车首先是要满足
人们出行的驾驶需要
所以在功能和性能上符合要求
为最终用户提供价值
除了主要的产品特性之外
如果还有一些诸如自动泊车
未关门报警
在遥控器锁车的时候
自动检测
并关闭敞开的车窗等特性
这些特性会给用户带来意外的惊喜
当然
汽车要可靠安全
要符合国家或行业的相关标准
日常维修不能损坏
和降低车辆的性能
维修时间
是在可接受的范围之内
除了这些主要的产品特性之外
人们对产品的审美
也是必不可少的
当然这个审美是各有不同
是非常主观的
也许有的人
欣赏某种优雅 稳重的外形
有人则喜欢醒目
动感的外在
但是对于产品来说
审美这个性质是非常重要的
有时候一些偏见
也会影响人们对质量的感知
例如企业或者品牌的声誉
会让人对产品质量产生相应的感觉
Gravin的质量维度
是一个通用的产品评价体系
并不是专门为软件制定的
但是它也同样适用于软件产品
ISO9126模型
是一种评价软件质量的通用模型
它定义了软件的6个质量属性
即功能性 可靠性 易用性
效率或性能
以及可维护性和可移植性
每一个属性
又细分成一系列子属性
下面我们简单地解释一下
每个质量属性的含义
功能性包括适合性 准确性
互操作性和安全性四个子属性
适合性就是说
软件提供了用户所需要的功能
同时软件提供的功能
也是用户所需要的
准确性是指软件提供
用户功能的精确度
达到要求
比如说运算结果的准确
数字没有偏差等等
互操作性是软件
和其它系统进行交互的能力
当然软件还要有
保护信息和数据的安全能力
比如说
我们在京东网站上购买商品
像关键字搜索 商品质量浏览
选购商品 生成产品订单等
都是用户需要的主要功能
订单费用的结算
也必须是运行准确的
同时这个系统
还会和银行卡支付系统进行交互
系统也要保证用户账号的安全
可靠性指的是
系统是否能够在一个
稳定的状态下满足用户的使用
那么这就意味着
软件要有代码出错的处理能力
对外部出现错误时
软件仍然能够保持
正常的运行状态
当然软件不可能
绝对不出现问题
但是在失效发生的情况下
系统应该能够
重新恢复到正常的运行
同时恢复受直接影响的数据
易用性是指
在规定的条件下使用时
软件产品被理解 学习
使用和吸引用户的能力
软件的易用性
是用户在使用过程中
所实际感受到的系统质量
它会直接影响到
用户对产品的满意度
性能也是影响产品质量的
一个重要因素
通常从时间特性
和资源使用两个方面
来衡量系统的性能水平
比如说
我们打开一个商品网页
浏览商品的时候
希望系统对用户请求
具有快速的响应和处理
同时消耗的系统资源
和网络带宽比较低
对于开发人员来说
可维护性和可移植性
是非常重要的
可维护性
用于衡量软件产品被修改的时候
需要花费多大的努力
可移植性
是指软件从一种环境
迁移到另一种环境的难易程度
现在大家考虑一个问题
软件质量是如何实现的
或者说
如何才能有效地提高软件质量
软件开发过程
包括了分析 设计 实现
测试等一系列活动
测试是检验软件产品的
一个重要的手段
但是质量是能够测出来的吗
实际上到测试的阶段
软件质量的问题如果发生
已经很难进行纠正
所以说 质量并不是测出来的
而是在开发过程中
逐渐的构建起来的
构建高质量代码
是每一个软件工程师
义不容辞的责任
当然
测试也是开发过程中
不可缺少的一个重要环节
因此 对于软件开发来说
高质量的设计 规范的编码
以及有效的测试是保证
软件产品质量的三个重要方面
也是提高软件质量的必要手段
现在问题又来了
软件质量的重要性
是无容置疑的
那么是不是质量越高就越好
或者是说
软件产品是不是应该
追求“零缺陷”
下面我们来看
两种不同的使用环境
对软件质量的不同要求
对于航天软件来说
如果在发射时软件出现问题
就会造成巨大的损失
所以说在发射之前
只要发现任何异常
就会立即取消发射指令
直到异常被消除为止
在这种情况下
软件的质量越高越好
软件产品追求的是“零缺陷”
像许多互联网软件
例如新浪微博
百度导航等
在产品还存在一定缺陷的情况下
就发布上线
之后再不断地更新版本
修复已有的缺陷
似乎在这种情况下
用户也是可以接受
一个有缺陷的软件产品的
那么大家想一想
为什么这种系统
不像航天系统一样
需要在发布之前
修复所发现的任何缺陷呢
显然
我们不能抛开商业目标
来谈论产品质量
企业的根本目标
是要获得尽可能多的利润
为了提高用户对产品的满意度
企业必须提高产品质量
但是也不可能
为了追求完美的质量
而不惜一切代价
质量是有成本的
当企业为提高质量所付出的代价
超过了产品收益时
这个产品也就没有商业价值了
因此
企业必须权衡质量
效率和成本三个因素
产品质量太低或太高
都不利于企业的长远发展
理想的质量目标
不是“零缺陷”
而是恰好让用户满意
并且将提高质量
所付出的代价控制在预算之内
-1.1 软件无处不在
--讲课视频
-1.2 软件的本质特性
--讲授视频
-1.3 软件工程的产生与发展
--讲授视频
-1.4 软件工程的基本概念
--讲授视频
-1.5 软件质量实现
--讲授视频
-1.6 业界人士谈软件工程
-测验题--作业
-讨论题
--讨论题
-作业题
--第一张 作业题
-2.1 编程过程与规范
--讲课视频
-2.2 良好的编程实践
--讲课视频
-2.3 Python集成开发环境
--讲课视频
-2.4 代码静态检查
--讲课视频
-2.5 代码性能分析
--讲课视频
-2.6 结对编程实践
--讲课视频
-2.7 刘贺谈软件工程
--讲课视频
--讨论
-测验题--作业
-作业题
--第二章 作业题
-3.1 单元测试概述
--讲课视频
-3.2 黑盒测试方法
--黑盒测试方法
-3.3 白盒测试方法
--基本概念
--代码覆盖标准
--基本路径测试
-3.4 单元测试工具
--单元测试工具
--html
-测验题--作业
-作业题
--第三章 作业题
--作业题附件
-4.1 软件过程
--讲课视频
-4.2 软件过程模型
--讲课视频
-4.3 敏捷开发过程
--讲课视频
-4.4 微软公司开发过程
--邹欣经理自我介绍
--微软开发过程之一
--微软开发过程之二
-测验题--作业
-5.1 团队组织与管理
--讲课视频
-5.2 项目沟通管理
--讲课视频
-5.3 软件项目计划
--讲课视频
-5.4 软件项目估算
--讲课视频
-测验题--作业
-讨论题
--讨论
-6.1 敏捷开发之Scrum
-- 敏捷开发之Scrum
--html
-6.2 用户故事与估算
--讲课视频
-6.3 团队协作工具Tower
-6.4 配置管理
--讲课视频
-6.5 配置管理工具Git
--讲课视频
-测验题--作业
-作业题--作业
-7.1 需求工程师
--讲课视频
-7.2 需求定义
--讲课视频
-7.3 需求的类型
--讲课视频
--讲课视频(2)
-7.4 需求工程过程
--讲课视频
-7.5 需求的主要来源
--讲课视频
-7.6 需求获取技术
--讲课视频
--讲课视频二
--讲课视频三
-7.7 撰写需求文档
--讲课视频
-测验题--作业
-讨论题
--讨论
-8.1 用例建模概念
--讲课视频
-8.2 用例建模过程
--讲课视频
-8.3 用例建模精讲
--讲课视频
-8.4 建模工具介绍
--讲课视频
-8.5 微信抢票应用案例
--讲课视频
-测验题--作业
-讨论题
--讨论
-9.1 面向对象分析
--讲课视频
-9.2 CRC卡片分拣法
--讲课视频-1
--讲课视频-2
-9.3 面向对象设计
--讲课视频-1
--讲课视频-2
-9.4 类图建模
--讲课视频-1
--讲课视频-2
-第9章 面向对象分析与设计--测验题
-讨论题
--讨论
-10.1 顺序图概念
--讲课视频
-10.2 顺序图建模
--讲课视频
-10.3 顺序图风格
--讲义视频
-10.4 状态建模
--讲课视频
-10.5 状态图
--讲课视频
-10.6 状态图精讲
--讲义视频
-测验题--作业
-讨论题
--讨论
-11.1 软件体系结构概念
--讲授视频
-11.2 软件设计原则
--讲授视频
-11.3 软件体系结构风格(一)
--讲授视频
-11.4 软件体系结构风格(二)
--讲授视频
-11.5 软件体系结构风格(三)
--讲授视频
-11.6 软件设计过程
--讲授视频
-11.7 Web系统架构设计
--讲授视频
-11.8 数据库选择策略
--讲授视频
-测验题--作业
-作业题
--html
--html
--html
-作业题--作业
-12.1 交互设计概述
--讲授视频
-12.2 交互设计目标
--讲授视频
-12.3 GUI设计原则
--讲课视频
-12.4 KLM效率模型
--Video
-12.5 Fitts定律
--讲授视频
-12.6 交互设计过程
--讲授视频
-测验题--作业
-13.1 软件测试概念
--讲课视频
-13.2 软件测试类型
--讲课视频
-13.3 软件功能测试
--讲课视频
-13.4 软件性能测试
--讲课视频
-测验题--作业
-14.1 软件部署与交付
--讲课视频
-14.2 软件演化与维护
--讲课视频
-测验题--作业
-第一部分:基础知识
-第二部分:编程与测试(选做)