零、软件工程概述
软件
软件是独立于硬件的,以程序代码为核心的逻辑单元。
软件 = 程序 + 文档 + 数据
- 程序:机器指令的集合
- 文档:描述程序操作与使用的文档
- 数据:程序运行时需要使用的信息
注:
- 编程是软件开发活动的核心,但软件开发远比编程要复杂!
- 软件是一种知识/逻辑型产品
软件危机
软件工程产生的原因就是要 解决软件危机。
1968年,北大西洋公约组织的计算机科学家们在联邦德国召开的国际学术会议上,提出“软件危机(Software crisis)”。
软件危机:指的是计算机软件的开发和维护过程中遇到的一系列严重的问题。
常见软件危机情况:
- 开发成本超出预算,实际进度比预定计划一再拖延。
- 软件产品的质量往往靠不住,Bug一大堆,Patch一个接一个。
- 用户对“已完成”的系统不满意的现象经常发生。
- 软件的可维护性程度非常低。
- 软件通常没有适当的文档资料。
- 软件的成本不断提高。
- 软件开发生产率的提高赶不上硬件的发展和人们需求的增长。
软件危机中相对次要的因素是:开发进度
软件工程
定义 [IEEE610.12-1990]
-
应用系统的、规范的、可量化的方法来开发、运行和维护软件,即将工程应用到软件。
-
对1)中各种方法的研究。
目的:用“工程”解决软件危机。
软件工程的动机
① 要解决的问题?
软件危机…
混乱的现实世界中的复杂问题…
② 要解决的实际问题范围广泛
没有行业和领域限制,需要客户和用户紧密合作。
实际问题通常模糊不清。
③ 科学性、实践性和工艺性并重
软件工程/工程的特点:
- 软件工程追求足够好,不是最好。
- 成本效益比有效的方案,都是足够好的方案。
目的与意义: 软件、软件工程要服务于整个社会的进步。
三要素
3个要素: 方法、过程和工具。
-
方法:完成软件开发各项任务的技术方法,回答“怎么做” I结构化方法,面向对象方法
-
过程:是为了获得高质量软件所需要完成的一系列任务框架,回答“啥时候做”
1.需求工程,2.软件设计3.软件构造4.软件测试5.软件交付6.软件维护 -
工具:为运用方法提供的自动或半自动软件工程支撑环境
模型,文档
软件开发典型阶段
-
需求工程:软件系统要完成哪些功能。
-
软件设计:软件系统要如何完成功能。
-
软件实现:构建软件系统。
-
软件测试:验证软件产品的质量。
(综合测试是在软件设计阶段设计的) -
软件交付:将软件交付给客户和用户。
-
软件维护:保障用户能够正常使用软件
(花费时间最多的阶段)
软件生命周期模型与过程模型
软件生命周期: 软件从生产到报废的全过程。
生命周期模型: 将软件生命周期划分为不同的阶段。
为了从宏观上清晰的描述软件开发活动,人们将生命周期分割为不同阶段,每个阶段都有明确的输入/输出、主要活动、执行人;且各个阶段形成明确、连续的顺序过程,这些阶段的划分被称为软件生命周期模型。
作用: 指导软件开发活动按照什么样的顺序进行组织和执行。
软件生命周期模型中的典型开发阶段存在着天然的前后顺序,但是软件系统并不都是按照生命周期模型中各个阶段的顺序来开发的
软件开发过程模型: 对软件生命周期模型更详细和准确的描述。
软件生命周期模型只是界定了软件开发的不同阶段和阶段之间的顺序关系,软件过程模型则进一步详细说明各个阶段的任务、活动、对象及其组织、控制过程。与简略的软件生命周期模型不同,软件过程模型可以被看做是网络化的活动组织。
因为要在整体上遵守软件生命周期的约束,所以不同的软件生命周期模型展开后是不同的软件过程模型。另一方面,同样的活动和任务也会有不同的组织方式,
所以,同一个软件生命周期可以存在不同的软件过程模型。
有以下常见的软件过程模型:
1)瀑布模型(线性模型)
瀑布模型是最基本的软件(开发)过程模型
过程:按照软件生命周期建模,但是返回到前一阶段
适合开发场景:
- 需求非常成熟稳定;
- 所需的技术成熟、可靠无技术难点;
- 复杂度适中的系统。
例如:图书馆借阅系统
2)增量迭代模型
过程:先开发核心需求,然后增量叠加
适合开发场景:
- 需求较成熟、稳定; 客户和用户目标明确。但需求会出现变化。
- 为满足质量需要,技术有升级的可能性。
- 规模大;复杂度高的软件
例如:购物系统
3)演化模型
过程:先开发核心需求,然后增量叠加,然后根据用户反馈修改
适合开发场景:
- 不稳定领域的大规模软件系统。客户和用户目标经常变化,
- 时常尝试创新,随时应用新技术。
- 软件规模大;复杂程度高。
例如:微信等国民应用
4)原型模型
过程:先开发原型系统确定需求,再开发
适合开发场景:
- 新颖的领域;需求不确定。
- 技术不稳定。
例如:智能家居系统