软件的概念
计算机软件指计算机系统中的程序及其文档。
程序:是计算任务的处理对象和处理规则的描述(形式上是源码、二进制码)。
文档:是为了便于了解程序所需的阐明性资料。
软件发展的3个阶段
- 第一阶段:
时间:1946-1956年
标志:从计算机问世到实用的高级程序语言出现前
特点:输入输出量较小,但计算量较大
开发方式:主要采用个体开发方式 - 第二阶段:
时间:1956-1968年
标志:从实用的高级程序语言出现到软件工程出现前
特点:计算量不大,但输入、输出量较大
开发方式:逐步从个体方式转向合作方式 - 第三阶段:
时间:1968年-至今
标志:从软件工程出现到现在
特点:受制于所嵌入的宿主系统,而不只是受制于其功能要求
开发方式:由个体合作方式转向工程方式
软件的特点vs硬件
- 软件是一种逻辑实体,而不是有形的系统元件,其开发成本和进度难以准确估算。
- 软件是被开发的或被设计的,没有明显的制造过程,一旦开发成功,只需复制即可,但其维护的工作量大。
-
软件的使用没有硬件那样的机械磨损和老化问题。
软件的维护可能会引入副作用,使故障率升高。
软件的分类
- 系统软件:位于计算机系统中最靠近硬件的一层,其它软件一般都通过系统软件发挥作用,它与具体的应用领域无关。如操作系统、编译程序等。
- 支持软件:支持软件的开发和维护的软件。如数据库管理系统、网络软件、软件开发环境等。
- 应用软件:特定应用领域专用的软件。如实时软件、嵌入式软件、科学和工程计算软件、事务处理软件、人工智能软件等。
软件工程的定义
IEEE:
① 将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;
② 在①中所述方法的研究
软件生存周期的概念及若干个阶段
- 软件有一个孕育、诞生、成长、成熟、衰亡的生存过程。这个过程即为计算机软件的生存周期。
- 软件生存周期大体可分为如下几个活动:计算机系统工程、需求分析、设计、编码、测试、运行和维护。
软件过程指软件生存周期中的一系列相关的过程。过程是活动的集合,活动是任务的集合。
与开发有关的活动主要:
- 源代码管理(配置管理)
- 质量保障(软件测试、Debug)
- 需求分析
- 架构设计
- 程序理解
- 软件维护(运营)
- 软件项目管理
CMM的目的
CMM(Capability Maturity Model)能力成熟度模型
- 开始,用于评价软件机构的软件过程能力成熟度的模型
- 发展之初,提供一种评价软件承接方能力的方法,为大型软件项目的招投标活动提供一种全面而客观的评审依据。
- 后来,又同时被软件组织用于改进其软件过程
软件过程模型
软件过程模型是软件开发全部过程、活动和任务的结构框架,也称软件开发模型或软件生存周期模型
瀑布模型
1970年W.Royce提出瀑布模型
特征
- 接受上一阶段的结果作为本阶段的输入
- 利用这一输入实施本阶段应完成的活动
- 对本阶段的工作进行评审
- 将本阶段的结果作为输出,传递给下一阶段
缺点
- 缺乏灵活性,难以适应需求不明确或需求经常变化的软件开发
- 开发早期存在的问题往往要到交付使用时才发现,维护代价大
演化模型
可以在获取了一组基本的需求后,通过快速分析构造出该软件的一个初始可运行版本,称之为原型(prototype),然后根据用户在试用原型的过程中提出的意见和建议、或者增加新的需求,对原型进行改造,获得原型的新版本,重复这一过程,最终得到令客户满意的软件产品。
演化模型的开发过程就是从构造初始的原型出发,逐步将其演化成最终软件产品的过程。演化模型适用于对软件需求缺乏准确认识的情况。典型的演化模型有:增量模型、原型模型、螺旋模型。
增量模型
增量模型将软件的开发过程分成若干个日程时间交错的线性序列,每个线性序列产生软件的一个可发布的“增量”版本,后一个版本是对前一版本的修改和补充,重复增量发布的过程,直至产生最终的完善产品。
增量模型融合了瀑布模型的基本成分(重复地应用)和演化模型的迭代特征。
增量模型强调每一个增量都发布一个可运行的产品。
增量模型特别适用于:
- 需求经常变化的软件开发
- 市场急需而开发人员和资金不能在设定的市场期限之前实现一个完善的产品的软件开发
增量模型能有计划地管理技术风险,如早期增量版本中避免采用尚未成熟的技术。
原型模型
- 原型(prototype)是预期系统的一个可执行版本,它反映了系统性质(如功能、计算结果等)的一个选定的子集。一个原型不必满足目标软件的所有约束,其目的是能快速、低成本地构建原型
- 原型方法从软件工程师与客户的交流开始,其目的是定义软件的总体目标,标识需求。然后快速制订原型开发的计划,确定原型的目标和范围,采用快速设计的方式对其建模,并构建原型
- 被开发的原型应交付给客户试用,并收集客户的反馈意见,这些反馈意见可在下一轮迭代中对原型进行改进。在前一个原型需要改进,或者需要扩展其范围的时候,进入下一轮原型的迭代开发
原型的类型:
- 探索型(exploratory prototyping)
目的是要弄清目标系统的要求,确定所希望的特性,并探讨多种方案的可行性 - 实验型(experimental prototyping)
目的是验证方案或算法的合理性,它是在大规模开发和实现前,用于考核方案是否合适,规格说明是否可靠 - 演化型(evolutionary prototyping)
目的是将原型作为目标系统的一部分,通过对原型的多次改进,逐步将原型演化成最终的目标系统
原型的使用策略:
- 废弃(throw away)策略
主要用于探索型和实验型原型的开发。这种原型通常被废丢,然后根据探索或实验的结果用良好的结构和设计思想重新设计目标系统 - 追加(add on)策略
主要用于演化型原型的开发。这种原型通常是实现了目标系统中已明确定义的特性的一个子集,通过对它的不断修改和扩充,逐步追加新的要求,最后使其演化成最终的目标系统
原型可作为单独的过程模型使用,它也可作为一种方法或实现技术应用于其它的过程模型中。
螺旋模型
B.Boehm于1988年提出
是瀑布模型和演化(原型)模型的结合,并增加了风险分析。
螺旋模型沿着螺线旋转,在四个象限上分别表达四个方面的活动,即:
- 制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件
- 风险分析:评价所选的方案,识别风险,消除风险
- 工程实施:实施软件开发,验证工作产品
-
客户评估:评价开发工作,提出修正建议