1 软件与软件危机
1.1 软件的特性
- 软件是一种逻辑实体,而非具体的物理实体;
- 软件产品的生产主要是研制;
- 软件具有“复杂性”,其开发和运行常受到计算机系统的限制;
- 软件成本昂贵,其开发方式目前未完全摆脱手工生产方式;
- 软件不存在磨损和老化问题,但是存在退化问题。
软件产品一般分为两类:通用软件产品(如数据库软件、文字处理软件、绘图软件、工程管理工具…)和定制软件产品(如电子设备的控制软件、特定的业务处理系统、空中交通管制系统…)。
1.2 软件的发展
- 程序设计时代:1946~1956年,生产方式为个体手工劳动,使用机器语言和汇编语言,程序难读难修改,可靠性差;
- 程序系统时代:1956~1968年,生产方式为作坊式的小集团合作生产,使用高级语言,提出了结构化方法,该阶段产生软件危机。
- 软件工程时代:1968年至今,生产方式为工程化的生产,使用数据库、开发工具、分布式、面向对象技术等来开发软件,开发技术有很大进步,但没有突破性进展,软件价格不断上升,没有完全摆脱软件危机。
1.3 软件危机
随着计算机应用的日益普及,软件数量急剧增长,软件产品质量低下,可维护性差,这些问题不断堆积形成日益尖锐的矛盾,这种现象即为软件危机。
为此,NATO(北约组织)于1967年提出“软件工程”概念,次年于计算机科学国际会议上得到签署,软件工程学由此产生。
1.软件危机的主要表现
- 对软件开发成本和进度的估计常常很不准确;
- 用户对“已完成的”软件系统不满意的现象经常发生;
- 软件产品的质量往往靠不住;
- 软件常常是不可维护的;
- 软件通常没有对应的文档资料;
- 软件成本在计算机系统总成本中所占的比例逐年上升;
- 软件开发生产率提高的速度远远跟不上计算机应用迅速普及及深入的趋势。
2.产生软件危机的原因
- 软件是计算机的逻辑部件而不是物理部件。软件问题是在开发时期引入的而在测试阶段没能测出来的故障,修改软件故障要修改软件原来的设计。
- 软件不同于一般程序,它的一个显著特点是规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。为了在预定时间内开发出规模庞大的软件,必须由许多人分工合作,软件开发工作量随软件规模增大非线性增长。
- 与早期软件开发个体化特点有关:认为软件开发就是写程序并设法使之运行,轻视需求分析和软件维护。也就是说是和软件开发和维护有关的许多错误认识和作法的形成,可以归因于在计算机系统发展的早期阶段软件开发的个体化特点。
- 缺乏正确的理论指导。缺乏有力的方法学和工具方面的支持。由于软件开发不同于大多数其他工业产品,其开发过程是复杂的逻辑思维过程,其产品极大程度地依赖于开发人员高度的智力投入。由于过分地依靠程序设计人员在软件开发过程中的技巧和创造性,加剧软件开发产品的个性化,也是发生软件开发危机的一个重要原因。
3.缓解软件危机的途径
- 方法:推广使用在实践中总结出来的开发软件的成功的技术和方法;
- 工具:开发和使用好的软件工具;
- 组织管理:组织良好、管理严密、各类人员协同配合。
2 软件工程
2.1 软件工程的概念
软件工程是一类工程,是将理论与知识应用于实践的科学,它借鉴了传统工程的原则与方法以求高效的开发高质量的软件。
2.2 软件工程框架
软件工程的框架可概括为:目标、过程、原则。
- 目标:生产具有正确性、可用性以及开销合宜的产品;
- 过程:生产一个最终可以满足需求且达到工程目标的软件产品所需要的步骤,包括开发过程、运作i过程、维护过程;
- 原则:选取适宜的开发范型、采用合适的设计方法、提供高质量的工程支持、重视开发过程的管理。
2.3 软件生命周期
软件生命周期(Software Life Cycle,SLC)是指软件产生直到报废的生命周期,包括可行性分析和项目开发计划、需求分析、概要设计、详细设计、编码、测试、维护等阶段。
- 可行性分析和项目开发计划:该阶段回答的问题是要解决什么问题?需要多少费用?需要多长时间?
- 需求分析:确定软件系统必须具备的功能;
- 概要设计:开发人员把确定的个项功能需求转换成需要的体系结构,即设计软件的结构;
- 详细设计:为每个模块的功能进行具体描述,即模块的控制结构是怎样的;
- 编码:把每个模块的控制结构转换成程序代码;
- 测试:保证软件质量的重要手段,设计测试用例以检验软件的组成;
- 维护:已交付的软件投入正式使用后,为了改正软件运行错误,或者为了满足用户新的需求而加入新功能的修改软件的过程。
3 软件过程模型
3.1 瀑布模型
该模型规定了各项关键的软件工程活动,自上而下,如同瀑布一样固定次序。
1.特点
瀑布模型是以文档形式驱动的,是一种整体开发模型,逆转性很差或着说不可逆转。
2.适用条件
- 开发期间需求没有或者很少变化;
- 分析设计人员对应用领域很熟悉;
- 低风险项目;
- 用户使用环境很稳定;
- 用户提出需求以外,很少参与开发工作。
3.优点
- 每个阶段的任务与目标很明确;
- 可为每个阶段指定开发计划,进行成本预算,组织开发力量了;
- 通过阶段评审,将开发过程纳入正确轨道;
- 严格的计划性保证软件产品按时交付。
4.缺点
- 缺乏灵活性,无法适应用户需求的改变;
- 开始阶段的小错误被逐渐放大,可能导致软件产品报废;
- 返回上一级的开发需要十分高昂的代价;
- 随着软件规模和复杂性的增加,软件成品成功的概率大幅下降。
3.2 快速原型模型
借助软件开发工具或环境尽快的构造一个实际系统的简化模型。
1.特点
- 利用原型法技术能够快速实现系统的初步模型,以便准确的获取用户的需求;
- 采用逐步求精方法使原型逐步完善。
2.适用条件
- 不能预先确切定义需求的软件开发;
- 项目组成员不能很好协同配合,相互交流或通信上存在困难;
- 已有产品或产品的原型,只需客户化的工程项目;
- 项目所在领域是那些简单而熟悉的行业;
- 要求进行产品移植或升级的软件项目。
3.优点
- 开发者与用户充分交流,可以澄清模糊需求;
- 开发过程与用户培训过程同步;
- 为用户需求的改变提供了充分的余地;
- 开发风险低,产品柔性好;
- 开发费用低,时间短;
- 系统易维护,对用户友好。
4.缺点
- 开发者在不熟悉的领域中不易分清主次,原型不切题;
- 限制了开发人员的创新;
3.3 增量模型
也称为渐增模型,是遵循递增方式来进行软件开发的。在该模型中,软件产品被作为一组增量构件(模块),其中第一个增量构件往往实现软件的基本需求,提供最核心的功能。
1.特点
- 任务或功能模块驱动,可以分阶段提交产品;
- 开发过程中有多个任务单,多个任务单的集合构成项目的《需求规格说明书》。
2.适用条件
- 客户能够接收分阶段交付;
- 项目为中等或高风险项目;
- 用户可参与到整个软件开发过程中;
- 开发需要使用面向对象语言或第四代语言;
- 软件开发组织拥有较好的类库,构件库。
3.优点
- 短时间内向用户交付可完成部分工作的产品;
- 逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品;
- 项目总体性失败的风险比较低。
4.缺点
- 分析设计人员若对应用领域不熟悉,难以一步到位;
- 软件系统的组装和拆卸行不强。
3.4 螺旋模型
该模型综合了瀑布模型和快速原型模型的优点,还增加了两者都忽视的风险分析,把开发活动和风险管理结合起来,将风险减到最小并控制风险。
1.特点
- 每一圈是一个阶段;
- 每一个阶段又有一个活动;
- 降低了开发的风险。
2.适用
- 内部开发的大规模软件项目。
3.优点:风险驱动
4.缺点:只能用于大型内部软件产品,开发者必须精通风险分析和风险排除。