1.1 软件及软件的特点
一、软件的定义
软件是能够完成预定功能和性能的可执行的计算机程序和使程序正常执行所需要的数据,加上描述程序的操作和使用的文档。
软件 = 程序+数据+文档
程序:按事先设计的功能和性能要求执行的指令序列。
数据:是程序能够正常操纵信息的数据结构。
文档:与程序开发、维护和使用有关的图文资料。
二、软件的特点
(一)软件是一种逻辑实体,而不是具体的物理实体,具有抽象性。
(二)软件的生产与硬件的制造不同,是人类智力劳动的产物。
(三)软件在运行使用过程中,不会磨损和老化,但存在退化问题。
(四)软件的开发至今尚未完全摆脱手工艺的开发方式。
(五)软件的开发和运行必须依附于特定的计算机系统环境。
软、硬件失效情况的对比:
硬件失效率情况
软件失效率情况
三、软件的分类
(一)按照功能的不同,软件可以分为:系统软件、支撑软件和应用软件。
①系统软件:管理、控制和维护计算机及其外部设备的软件,为用户提供良好界面,并支持应用软件的开发和运行。
②支撑软件:以系统软件为基础,以提高系统性能为主要目标,支撑应用软件的开发与运行。
③应用软件:提供特定应用服务的软件,是程序设计人员为各种应用目的而开发的软件,是为解决各类实际问题而设计的软件。
(二)根据软件服务对象的不同,软件可分为:通用软件和定制软件。
①通用软件:由特点的软件开发机构开发,面向市场公开销售的独立运行的软件系统。
②定制软件:面向特定的用户需求,由软件开发机构在合同的约束下开发的软件。
(三)按照规模的不同,软件可以分为:小型、中型、大型和超大型。
(四)按照工作方式的不同,软件可以分为:实时软件、分时软件、交互软件、批处理软件。
1.2 软件危机及其表现
一、软件危机
软件危机:泛指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
二、软件危机的产生原因
(一)用户需求不明确
(二)缺乏正确的理论指导
(三)软件开发规模越来越大
(四)软件复杂度越来越高
三、软件危机的表现
(一)软件开发进度难以预测
(二)软件开发成本难以控制
(三)开发的软件产品不能满足用户的需求
(四)软件产品质量无法保证
(五)软件产品难以维护
(六)软件缺少适当的文档资料
解决软件危机的途径:
软件开发的工程化方法——“软件工程”。
1.3 软件工程
一、软件工程的概念
为了经济地获得可靠的和能在实际机器上高效运行的软件,而建立和使用的健全的工程规则。
电气和电子工程师协会(IEEE):
①将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。
②软件工程是一门研究用工程化方法开发和维护有效的、实用的、高质量的软件的工程的学科。
二、软件工程的目标
软件工程的目的是:应用计算机科学、数学及管理科学等原理,借鉴传统工程的原则和方法创建软件,以达到改善生产效率、提高质量、降低成本的目的。
软件工程是一种层次化技术,包括三个要素:过程、方法、和工具。
过程:将软件工程的方法和工具综合起来以达到合理、及时地进行计算机软件开发的目的。
方法:提供了建造软件在技术上需要“如何做”,包括需求分析、设计、编程、测试和维护。
工具:对过程和方法提供了自动或半自动的支持。
三、软件生存周期(SLC)
(一)软件计划
主要确定要解决的“问题是什么”以及“解决问题的可行方案”。即,确定要开发软件系统的总目标,给出它的功能、性能、可靠性以及接口等方面的概要性要求。
(二)需求分析
主要确定目标系统要“做什么”。即,对软件计划阶段的要求进一步细化和求精,加强并集中软件的需求分析和规格说明。
(三)软件设计
主要确定目标系统要“怎么做”。软件设计是将需求转换成为软件的表示,包括数据结构、软件结构、接口表示和过程细节。
(四)编码
体现了目标系统的“具体实现”,编码是将设计转换成计算机可以接受的语言代码——源程序。
(五)测试
软件测试是保证软件质量的重要手段,其主要任务是检查该软件是否符合要求,其目的是发现软件存在的错误。
(六)维护与运行
软件维护的实质是对软件继续进行差错、纠错、修改和确认的过程。
(七)退役
当软件经过一段时期运行和服务后,便可能报废或退役。
报废和退役的主要原因:
①为满足用户的需求所做的维护费用太高,可能比新开发一个软件所花费的代价更高。
②维护的少量变化对于依赖性很强的软件的整体功能而言,有极大的危险。
③环境的变更导致软件的更换。如:硬件或操作系统。
④用户不再需要这个软件。
四、软件生存周期各阶段的关键问题
1.4 软件开发模型
软件开发模型是软件开发过程、活动和任务的结构框架,能清晰、直观地表达软件开发全部过程,能明确规定要完成的活动和任务。用来作为软件项目工作的基础。
一、瀑布模型
(一)主要思想
将软件生存周期的各项活动规定为按固定顺序而连接的若干阶段工作,形如瀑布流水,最终得到软件产品。
软件生命周期划分为:制定计划、需求分析、软件设计、程序编写、软件测试和运行维护基本活动。
(二)瀑布模型的优点
①为项目提供了按阶段划分的检查点。
②当前一个阶段完成后,只需要去关注后续阶段。
③可在迭代模型中应用瀑布模型。
④它提供了一个模板,这个模板使得分析、设计、编码、测试和支持的方法可以在该模板下有一个共同的指导。
(三)瀑布模型的缺点
①各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量。
②由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。
③早期的错误可能要等到开发后期的测试阶段才能发现,进而带来严重的后果。
④瀑布漠型的突出缺点是不适应用户需求的变化。
(四)瀑布模型的贡献
提供了一个漠板,使得分析、设计、编码和测试可以在该漠板的指导下进行,在降低软件复杂性,促进软件工程化方发挥了重要作用,是软件工程实践中应用最广泛的过程模型之一。
二、快速原型模型
(一)原型模型的主要思想
①先快速建立一个能够反映用户主要需求的原型。
②让用户很快地看到未来系统的概貌,判断哪些功能是符合需要的,哪些方而还需要改进。
③然后将原型反复改进。
(二)原型模型的优点
①开发者与用户充分交流,可以澄清模糊需求,需求定义比其他模型好得多。
②开发过程与用户培训过程同步。
③为用户需求的改变提供了充分的余地。
④开发风险低,产品柔性好。
⑤开发费用低,时间短。
⑥系统易维护,对用户更友好。
(三)原型模型的缺点
①开发者在不熟悉的领域时,不易分清主次,原型不切题。
②产品原型在一定程度上限制了开发人员的创新。
③随着更改次数的增多,次要部分越来越大,“淹没”了主要部分。
④原型过快收敛于需求集合,而忽略了一些基本点。
⑤资源规划和管理较为困难,随时更新文档也带来麻烦。
⑥只注意原型是否满意,忽略了原型环境与用户环境的差异。
(四)原型模型的使用范围
对所开发的领域比较熟悉而性有快速的原型开发工具;可以以原型模型作为软件的开发模型。
三、增量模型
(一)增量模型的主要思想
把待开发的软件系统模块化,将每个模块作为一个增量组件,从而分批次地分析、设计、编码和测试这些增量组件。
(二)增量模型的优点
①将待开发的软件系统模块化,可以分批次地提交软件产品,使用户可以及时了解软件项目的进展。
②以组件为单位进行开发降低了软件开发的风险。一个开发周期内的错误不会影响到整个软件系统。
③开发顺序灵活。开发人员可以对组件的实现顺序进行优先级排序,先完成需求稳定的核心组件。当组件的优先级发生变化时,还能及时地对实现顺序进行调整。
(三)增量模型的缺点
如果待开发的软件系统很难被模块化,那么将会给增量开发带来很多麻烦。
四、螺旋模型
(一)螺旋模型的主要思想
①螺旋模型:采用一种周期性的方法,来进行系统开发。
②原型模型 + 瀑布模型
③风险分析:
—— 在造成危害之前,及时对风险进行识别、分析,采取对策,进而消除或减少风险的损害。
模型包含的4个任务区域:
①制定计划:确定目标,选择方案,设定约束条件;
②风险分析:评估方案,分析该策略可能存在的风险;
③实施工程:实现本螺旋周期的目标;
④评估:评价前一步的结果,并且计划下一轮的工作。
(二)螺旋模型的优点
①设计上的灵活性,可以在项目的各个阶段进行变更。
②以小的分段来构建大型系统,使成本计算变得简单容易。
③客户始终参与每个阶段的开发,保证了项目不偏离正确方向以及项目的可控性。
④随着项目推进,客户始终掌握项目的最新信息 , 从而他或她能够和管理层有效地交互。
⑤客户认可这种公司内部的开发方式带来的良好的沟通和高质量的产品。
(三)螺旋模型的缺点
①采用螺旋模型需要具有相当丰富的风险评估经验和专门知识。
②在风险较大的项目开发中,如果未能够及时标识风险,势必造成重大损失。
③过多的迭代次数会增加开发成本,延迟提交时间。
五、喷泉模型
(二)喷泉模型的优点
①喷泉模型不像瀑布模型那样,需要分析活动结束后才开始设计活动,设计活动结束后才开始编码活动。
②该模型的各个阶段没有明显的界限,开发人员可以同步进行开发。
③其优点是可以提高软件项目开发效率,节省开发时间,适应于面向对象的软件开发过程。
(三)喷泉模型的缺点
①由于喷泉模型在各个开发阶段是重叠的,在开发过程中需要大量的开发人员,因此,不利于项目的管理。
②此外,喷泉模型要求严格管理文档,使得审核的难度加大,尤其是面对可能随时加入各种信息、需求与资料的情况。