基本概念
软件的本质特性
- 软件=程序+数据+文档
- 程序:计算机可以接受的一系列指令,运行时可以提供所要求的功能和性能
- 数据:使得程序能够使当地操作信息的数据结构
- 文档:描述程序的研发过、方法和使用的图文资料
- 软件具有复杂性、一致性、可变性、不可见性等,固有的内在特性,这是造成软件开发困难的根本原因
- linux 内核有630个函数,存在1814个函数的调用。
- 软件的本质特性:复杂性
- Google搜索引擎建立在遍布全球30多个站点、超过100万台服务器的云计算设施上。
- Amazon拥有28个云计算中心,在全球的服务器总量超过150万台。
- 阿里云是国内最大的云计算平台,拥有近百万台服务器,分布在北京、上海、深圳、香港和美国等。
- 软件的本质特性:一致性
- 软件不能独立存在,需要依附于一定的环境(如硬件、网络以及其他软件)
- 软件必须遵从人为的惯例并适应已有的技术和系统
- 软件需要随接口不同而改变,随时间推移而变化,而这些变化是不
同人设计的结果
- 软件的本质特性:可变性
- 人们总是认为软件是容易修改的,但忽视了修改所带来的副作用
- 不断的修改最终导致软件的退化,从而结束其生命周期
- 软件的本质特性:不可见性
- 软件是一种“看不见、摸不着”的逻辑实体,不具有空间的形体特征
- 开发人员可以直接看到程序代码,但是源代码并不是软件本身
- 软件是以机器代码的形式运行,但是开发人员无法看到源代码是如何执行的
软件工程的产生与发展
- 软件开发面临的挑战
- 客户不满意:
- 交付的许多功能不是客户需要的
- 交付的日期没有保障
- 客户使用时发现许多Bug
- 项目过程失控:
- 客户需求变化频繁,无力应对
- 无法预见软件的交付质量
- 对流程盲目遵从,忽视客户业务价值
- 风险与成本问题:
- 开发团队专注技术,忽视风险
- 无能力预测成本,导致预算超支
- 无力管理团队:
- 无法评估开发人员能力及工作进度
- 困扰于如何提升团队的能力与效率
- 客户不满意:
- 软件之道
- 软件工程一直致力于探索软件开发问题的解决之道
- 软件的发展历程
- 1956~1967(史前时代)
- 软件开发没有方法可循
- 软件设计是在开发人员脑壳中完成的隐藏过程
- 60世纪中期的软件危机
- 1968~1982(瀑布过程模型)
- 1968年提出“软件工程”结构化开发方法
- 瀑布式软件生命周期模型成为典型
- 1983~1995(质量标准体系)
- 面向对象开发方法
- 软件过程改进运动
- CMM/ISO9000/SPICE等质量标准体系
- 20世纪90年代至今(互联网)
- 敏捷开发方法流行
- 更紧密的团队协作
- 有效应对需求变化
- 快速交付高质量软件
- 迭代和增加开发过程
- 1956~1967(史前时代)
软件工程的基本概念
- 软件工程是:将系统化的、规范化的、可定量的方法应用软件的开发、运行和维护,即工程化应用到软件上;
- 软件工程的目标——创造足够好的软件
- 较低的开发成本
- 按时完成开发任务并及时交付
- 实现客户要求的功能
- 具有良好的性能、可靠性、可扩展性、可移植性等
- 软件维护费用低
- 软件工程的基本要素
- 过程:支持软件开发各个环节的控制和管理
- 软件开发管理
- 软件项目管理计划、软件配置管理计划、软件质量保证计划、评审记录…
- 问题定义
- 构想文档
- 用户故事
- 需求开发
- 分析模型
- 软件需求规格说明
- 软件设计
- 设计模型
- 软件体系结构文档
- 软件详细设计文档
- 软件构造
- 源程序
- 目标代码
- 可执行构件
- 软件测试
- 测试规程
- 测试用例
- 测试报告
- 方法:完成软件开发任务的技术手段
- 面向过程:以算法作为基本构造单元,强调自顶向下的功能分解,将功能和数据进行一定程度的分离。
- 面向对象∶以类为基本程序单元,对象是类的实例化,对象之间以消息传递为基本手段。
- 面向构件∶寻求比类的粒度更大的且易于复用的构件,期望实现软件的再工程。
- 面向服务∶在应用表现层次上将软件构件化,即应用业务过程由服务组成,而服务由构件组装而成。
- 工具:为软件开发方法提供自动或半自动的软件支撑环境
- 需求开发
- 软件建模工具
- 数据库设计工具
- 软件设计
- 软件建模工具
- 数据库设计工具
- 软件构造
- 程序编辑器
- 程序编译器
- 程序解释器
- 程序调试器
- 集成开发环境
- 软件测试
- 单元测试工具
- 静态分析工具
- 自动化测试工具
- 性能测试工具
- 缺陷跟踪工具
- 软件维护
- 代码重构工具
- 逆向工程工具
- 开发管理
- 需求管理工具
- 项目管理工具
- 配置管理工具
- 测试管理工具
- 需求开发
- 软件开发的基本策略
- 软件复用
- 构造一个新的系统不必从零做起,直接复用已有的构件进行组装
- 构件是经过反复使用验证的,由其组成的新系统具有较高的质量
- 分而治之
- 将一个复杂的问题分解成若干个简单的问题,然后逐个解决
- 来源于人们生活与工作的经验,完全适合于技术领域
- 逐步演进
- 软件开发是自底向上逐步有序的生长过程
- 小步快跑∶每走完一步再调整并为下一步确定方向,直到终点
- 优化折中
- 软件开发是自底向上逐步有序的生长过程
- 小步快跑∶每走完一步再调整并为下一步确定方向,直到终点
- 软件复用
- 软件工程学科发展
- 软件工程的Wasserman规范
- 抽象
- 软件建模方法
- 用户界面原型化
- 软件体系结构
- 软件工程
- 软件复用
- 度量
- 工具与集成环境
- 软件工程的Wasserman规范
软件质量实现
- 什么是好的软件
- 用户(功能质量)
- 软件符合指定需求
- 软件几乎没有缺陷
- 软件性能正常
- 软件容易上手,操作方便
- 开发人员(结构质量)
- 代码可测试性
- 代码可维护性
- 代码可读性
- 代码效率︰高效管理资源
- 代码安全:可预防常见威胁
- 投资者(过程质量)
- 软件按时交付
- 软件满足预算
- 可复用的开发过程,确保交付质量
- 用户(功能质量)
- 产品质量维度
- ISO9126质量模型
- 功能性
- 适合性︰当软件在指定条件下使用,其满足明确和隐含要求功能的能力
- 准确性︰软件提供给用户功能的精确度是否符合目标。
- 互操作性︰软件与其它系统进行交互的能力。
- 安全性︰软件保护信息和数据的安全能力。
- 可靠性
- 成熟性︰软件产品避免因软件中错误发生而导致失效的能力。
- 容错性︰软件防止外部接口错误扩散而导致系统失效的能力。
- 可恢复性︰系统失效后,重新恢复原有的功能和性能的能力。
- 易用性
- 易理解性︰软件显示的信息要清晰、准确且易懂,使用户能够快速理解软件。
- 易学习性:软件使用户能学习其应用的能力。
- 易操作性︰软件产品使用户能易于操作和控制它的能力。
- 吸引性︰软件具有的某些独特的、能让用户眼前一亮的属性。
- 效率/性能
- 时间特性∶在规定的条件下,软件产品执行其功能时能够提供适当的响应时间处和理时间以及吞吐率的能力。
- 资源利用︰软件系统在完成用户指定的业务请求所消耗的系统资源,诸如CPU 占有率、内存占有率、网络带宽占有率等
- 可维护性
- 易分析性∶软件提供辅助手段帮助开发人员定位缺陷原因并判断出修改之处。
- 易改变性:软件产品使得指定的修改容易实现的能力。
- 稳定性:软件产品避免由于软件修改而造成意外结果的能力。
- 易测试性︰软件提供辅助性手段帮助测试人员实现其测试意图。
- 可移植性
- 适应性:软件产品无需做任何相应变动就能适应不同运行环境的能力。
- 易安装性︰在平台变化后,成功安装软件的难易程度。
- 共存性:软件产品在公共环境与其共享资源的其他系统共存的能力
- 替换性:软件系统的升级能力,包括在线升级、打补丁升级等。
- 功能性
- 实现软件质量
- 质量不是被测出来的,而是在开发过程中逐渐构建起来的
- 虽然质量不是测出来的,但是未经测试也不可能开发出高质量的软件
- 质量是开发过程的问题,测试是开发过程中不可缺少的重要环节
- 商业环境下的软件质量
- 商业目标决定质量目标:
- 商业目标决定质量目标,不应该把质量目标凌驾于商业目标之上
- 质量是有成本的,不可能为了追求完美的质量而不惜一切代价
- 理想的质量目标不是“零缺陷”,而是恰好让广大用户满意
- 商业目标决定质量目标: