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