1.1 软件危机
1.1.1 软件危机的介绍
- 软件危机的概念
- 软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
- 软件危机的典型表现
- ① 对软件开发成本和进度的估计不准确。
- ② 用户对“已完成的”软件系统不满意的现象经常发生。
- ③ 软件产品的质量往往靠不住。
- ④ 软件常常是不可维护的。
- ⑤ 软件通常没有适当的文档资料。
- ⑥ 软件成本在计算机系统总成本中所占的比例逐年上升。
- ⑦ 软件开发跟不上计算机应用迅速普及深入的趋势。
1.1.2 产生软件危机的原因
- 客观原因
- ① 软件是计算机系统中的逻辑部件,缺乏“可见性”,因此管理和控制软件开发过程相当困难。
- ② 软件维护通常意味着改正或修改原来的设计,因此软件较难维护。
- ③ 软件规模庞大,而程序复杂性将随着程序规模的增加而呈指数上升。
- 主观原因
- ① 存在与软件开发和维护有关的许多错误认识和做法。
- ② 对用户要求没有完整准确的认识就匆忙着手编写程序。
- ③ 开发人员只重视程序而忽视软件配置的其余成分(文档和数据等)。
- ④ 软件开发人员轻视维护。
1.1.3 消除软件危机的途径
- 软件
- 软件是程序、数据及相关文档的完整集合
- 软件=程序+数据+文档。
- 消除软件危机的途径
- 应该对计算机软件有一个正确的认识,软件=程序+数据+相关文档;
- 应该充分认识到软件开发是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。
- 应该推广使用在实践中总结出来的开发软件的成功的技术和方法, 并且研究探索更好更有效的技术和方法。
- 应该开发和使用更好的软件工具。
1.2 软件工程
1.2.1 软件工程的介绍
- 软件工程的概念
- 指导计算机软件开发和维护的一门工程学科。
- 采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来, 以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
- 软件工程的本质特征
- ① 软件工程关注于大型程序的构造;
- ② 软件工程的中心课题是控制复杂性;
- ③ 软件经常变化;
- ④ 开发软件的效率非常重要;
- ⑤ 和谐地合作是开发软件的关键;
- ⑥ 软件必须有效地支持它的用户;
- ⑦ 软件工程领域由具有一种文化背景的人替具有另一种文化背景的人创造产品。
1.2.2 软件工程的基本原理
- 七条基本原理
- ① 用分阶段的生命周期计划严格管理;
- ② 坚持进行阶段评审;
- ③ 实行严格的产品控制;
- ④ 采用现代程序设计技术;
- ⑤ 结果应能清楚地审查;
- ⑥ 开发小组的人员应该少而精;
- ⑦ 承认不断改进软件工程实践的必要性。
- 七条基本原理的意义
- 这七条原理是确保软件产品质量和开发效率的原理的最小集合,它们是互相独立的,而且是缺一不可的最小集合,然而这七条原理又是相当完备的。
1.2.3 软件工程方法学
- 软件工程包括技术和管理两方面的内容。
- 软件工程是技术与管理紧密结合所形成的工程学科。
- 软件工程方法学概念
- 通常把软件生命周期全过程中使用的一整套技术方法的集合称为方法学,也称为范型。
- 目前使用得最广泛的软件工程方法学,分别是传统方法学和面向对象方法学。
- 软件工程方法学的三要素
- 软件工程方法学包括3个要素:方法、工具和过程。
- 传统方法学(生命周期方法学或结构化范型)
- ① 定义
- 采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。
- ② 优点
- a.把软件生命周期划分成若干相对独立、简单的阶段,便于不同人员分工协作,降低开发的困难程度;
- b.开发过程中采用科学的管理技术和良好的技术方法,且在每个阶段结束之前都进行严格的审查,保证了软件的质量,提高了软件的可维护性;
- c.大大提高了软件开发的成功率和生产率。
- ③ 缺点
- a.不适用于软件规模庞大、或者对软件的需求是模糊的或会随时间变化而变化的情况。
- b.结构化范型技术把数据和操作人为地分离成两个独立的部分,增加了软件开发与维护的难度。
- 面向对象方法学
- ① 定义
- 面向对象方法是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。
- ② 要点
- a.把对象作为融合了数据及在数据上的操作行为的统一的软件构件;
- b.把所有对象都划分成类;
- c.继承性;
- d.对象彼此间仅能通过发送消息互相联系。
- ③ 与传统方法学的对比
- a.传统方法学强调自顶向下、逐层分解、顺序开发。
- b.面向对象方法学强调主动地多次反复迭代地开发,保证了在各项开发活动之间的平滑过渡。
- ④ 优点
- a.降低了软件产品的复杂性;
- b.提高了软件的可理解性;
- c.简化了软件的开发和维护工作;
- d.提高了软件的可重用性。
- 【注意】常考面向对象方法学的基本特征:类、继承、封装、多态。结合第9章掌握其含义和意义。
1.3 软件生命周期组成
- 软件生命周期由软件定义、软件开发、运行维护(软件维护)组成。
- 软件定义
- 软件定义时期通常进一步划分成3个阶段,即问题定义、可行性研究和需求分析。
- 可行性研究的结果是客户作出是否继续进行这项工程的决定的重要依据
- 需求分析阶段的重要任务,用正式文档准确记录对目标系统的需求,这份文档为规格说明书
- 软件开发
- 通常由下述4个阶段组成:总体设计,详细设计(模块设计),编码和单元测试,综合测试。
- 其中前两个阶段又称为系统设计,后两个阶段又称为系统实现。
- 详细设计是详细设计每个模块,确定实现模块功能所需的算法和数据结构
- 【注意】考题中常设置选项:在详细设计阶段编写代码。这是错误的, 在编码和单元测试阶段才编写代码。
- 综合测试阶段中最基本的测试,集成测试和验收测试
- 运行和维护(软件维护)
- 维护时期主要任务使软件持久地满足用户的需要。
- 维护活动的分类
- ① 改正性维护;
- ② 适应性维护;
- ③ 完善性维护;
- ④ 预防性维护。
1.4 软件过程概念
- 软件过程的定义
- 软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
- 软件过程的表示
- 使用生命周期模型简洁地描述软件过程。
- 软件生命周期模型
- 软件生命周期模型是软件开发的全部过程、活动和任务的结构框 架。软件生命周期模型能清晰、直观地表达软件开发全过程,明确规定了要完成的主要活动和任务,用来作为项目开发的基础。
- 通常使用生命周期模型简洁地描述软件过程。
- 软件生命周期模型规定了把生命周期划分为哪些阶段以及各个阶段的执行顺序。
- 【注意】着重掌握瀑布模型、快速原型模型、螺旋模型、增量模型、喷泉模型。
1.4.1 瀑布模型
- ① 开发流程
- 实际的瀑布模型是带“反馈环”的,如图所示(图中实线箭头表示开发过程,虚线箭头表示维护过程)。
- 【注意】传统的瀑布模型没有图中的反馈环。
- ② 特点
- 第一,阶段间具有顺序性和依赖性;
- 第二,推迟实现的观点;
- 第三,质量保证的观点。
- ③ 瀑布模型的优缺点
- a.优点
- 第一,可强迫开发人员采用规范的方法;
- 第二,严格地规定了每个阶段必须提交的文档;
- 第三,要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证;
- 第四,对文档的约束,使软件维护变得容易一些,且能降低软件预算。
- b.缺点
- 第一:瀑布模型是由文档驱动的。
- 第二:缺乏对于需求变更和项目变化的适应性。
- 第三:用户只有在生命周期的后期才能看到结果;
- ④ 适用范围
- 适用于用户需求明确、完整、无重大变化的软件项目开发。
1.4.2 快速原型模型
- ① 开发流程
- 如图所示(图中实线箭头表示开发过程,虚线箭头表示维护过程)。
- 快速原型模型是不带反馈环的。
- 【注意】快速原型模型弥补了瀑布模型不适用于需求动态变更的缺点, 其本质是“快速”。
- ② 优点
- a.克服了瀑布模型的缺点,对于需求变更具有更好的适应性;
- b.开发费用低、开发周期短且对用户更友好。
- ③ 缺点
- a.客户与开发者对原型理解不同;
- b.本质是快速,没有考虑软件的总体质量和可维护性,最终产品质量较差;
- c.不利于开发人员的创新。
- ④ 适用范围
- a.对所开发的领域比较熟悉而且有快速的原型开发工具;
- b.项目招投标时,可以以原型模型作为软件的开发模型;
- c.进行产品移植或升级时,或对已有产品原型进行客户化工作时。
1.4.3 增量模型
- ① 开发步骤
- 增量模型也称为渐增模型,如图所示。
- ② 原理
- 把软件产品作为多个增量构件来设计、编码、集成、测试,开发人员一个构件接一个构件地向用户提交产品。
- ③ 优点
- a.能在较短时间内向用户提交可完成部分工作的产品。
- b.逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品。
- ④ 技术难点
- a.要求软件体系结构必须是开放的。
- b.增量模型本身是自相矛盾的。
- c.增量模型的灵活性很容易退化为边做边改模型,从而使软件过程的控制失去整体性。
- ⑤ 风险更大的增量模型
- 【注意】每个增量构件的开发采用瀑布模型。
- ⑥ 适用范围
- a.进行已有产品升级或新版本开发;
- b.对完成期限严格要求的产品;
- c.对所开发的领域比较熟悉而且已有原型系统
1.4.4 螺旋模型
- ① 基本思想
- 可以把它看作在每个阶段之前都增加了风险分析过程的快速原型模型, 如图所示。
- ② 原理
- 完整的螺旋模型如图所示。
- ③ 应用
- 螺旋模型主要适用于内部开发的大规模软件项目。
- ④ 优点
- a.有利于已有软件的重用,有助于把软件质量作为软件开发的一个重要目标;
- b.减少了过多测试(浪费资金)或测试不足(产品故障多)所带来的风险;
- c.在螺旋模型中维护只是模型的另一个周期,在维护和开发之间并没有本质区别。
- ⑤ 缺点
- 螺旋模型是风险驱动的。要求软件开发人员具有丰富的风险评估经验和这方面的专门知识。
- 过多的迭代次数会增加开发成本,延迟提交时间。
- ⑥ 适用范围
- 适用于内部开发的大规模软件项目。
1.4.5 喷泉模型
- ① 开发流程
- 图所示的喷泉模型,是典型的面向对象的软件过程模型之一。
- ② 特点
- a.喷泉模型是一种以用户需求为动力,以对象为驱动的模型,主要用于描述面向对象的软件开发过程。
- b.体现了面向对象软件开发过程迭代和无缝的特性。
1.4.6 Rational统一过程(RUP)
- ① RUP软件开发生命周期
- RUP软件开发生命周期是一个二维的面向对象的生命周期模型,如图所示。图中纵轴代表核心工作流,横轴代表时间。
- ② 核心工作流
- 如上图纵轴所示,由上至下有九个核心工作流,前六个为核心过程工作流程,后三个为核心支持工作流程。
- ③ 工作阶段
- a.初始阶段。
- b.精化阶段。
- c.构建阶段。
- d.移交阶段。
- ④ 特点
- a.采用迭代和渐增的方式开发软件。
- b.具有多功能性和广泛适用性。
1.4.7 敏捷过程
- 敏捷过程能够较好地适应商业竞争环境下对小型项目提出的有限资源和有限开发时间的约束。敏捷过程中最重要的是极限编程。
1.4.8 极限编程
- ① 极限编程的整体开发过程
- 图描述了极限编程的整体开发过程。
- ② 极限编程的迭代过程
- 图描述了极限编程的迭代开发过程。
- ③ 特点
- a.以极限编程为代表的敏捷过程,具有对变化和不确定性的更快速、更敏捷的反应特性;
- b.在快速的同时仍然能够保持可持续的开发速度。
1.4.9 微软过程
- ① 微软软件生命周期
- 微软过程把软件生命周期划分成五个阶段,图描绘了生命周期的阶段及每个阶段的主要里程碑。
- ② 微软过程模型
- a.定义
- 微软过程的每一个生命周期发布一个递进的软件版本,各个生命周期持续、快速地迭代循环
- 图描绘了微软过程的生命周期模型。
- b.特点
- 第一,适用于商业环境下具有有限资源和有限开发时间约束的项目;
- 第二,微软过程也有某些不足之处,例如,对方法、工具和产品等方面的论述不如RUP和敏捷过程全面,人们对它的某些准则本身也有不同意见。