1.1软件危机
1.1.1软件危机的介绍
软件危机定义:在计算机软件开发和维护过程中所遇到的一系列严重的问题。
软件危机包含下述两方面的问题:
- 如何开发软件,以满足对软件日益增长的需求。
- 如何维护数量不断膨胀的已有软件。
软件危机有以下一些典型表现:
- 对软件开发成本和进度的估计很不准确。
- 用户对“已完成的”软件系统不满意。
- 软件产品的质量靠不住。
- 软件是不可维护的。
- 软件没有适当的文档资料。
- 软件成本在计算机系统总成本中所占的比例逐年上升。
- 软件开发生产率提高的速度远远跟不上计算机应用迅速普及深入的趋势。
1.1.2产生软件危机的原因
原因:一方面与软件本身的特点有关,另一方面和软件开发与维护的方法不正确有关。
软件的生命周期:一个软件从定义、开发、使用和维护,直到最终被废弃。
软件开发最初的工作:(步骤严格依次向下)
- 问题定义(确定软件要解决的问题是什么)
- 可行性研究(决定该问题是否存在一个可行的解决办法)
- 需求分析(深入具体地了解用户的要求)
软件开发时期的工作:(步骤严格依次向下)
- 软件设计(通常分为概要设计和详细设计两个阶段)
- 编写程序
- 软件测试(工作量占软件开发全部工作量的40%~50%)
经过以上步骤,最后才能交付使用。
一个软件产品必须由一个完整的配置组成,软件配置主要包括程序、文档和数据等成分。
做好软件定义时期的工作,是降低软件成本提高软件质量的关键。
软件维护的费用占总费用的55%~70%。软件工程学的一个重要目标就是提高软件的可维护性,减少软件维护的代价。
1.1.3消除软件危机的途径
软件定义:是程序、数据及相关文档的完整集合。
软件工程支撑环境:把各个阶段使用的软件工具有机地集合成一个整体,支持软件开发的全过程。
解决软件危机的途径:既要有技术措施(方法和工具),又要有必要的组织管理措施。
1.2软件工程
1.2.1软件工程的介绍
软件工程是指导计算机软件开发和维护的一门工程学科。
1993年IEEE给出软件工程的定义:把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件。
软件工程本质特性:
1.软件工程关于大型程序的构造;
“大”与“小”的分界线并不十分清晰。通常把一个人在较短时间内写出都程序称为小型程序,而把多人合作用时半年以上才写出的程序称为大型程序。传统的程序设计技术和工具是支持小型程序设计的,不能简单地把这些技术和工具用于开发大型程序。
2.软件工程的中心课题是控制复杂性
通常,软件所解决的问题十分复杂,以致不能把问题作为一个整体通盘考虑。人们不得不把问题分解,使得分解出的每个部分是可理解的,而且各部分之间保持简单的通信关系。用这种方法并不能降低问题的整体复杂性,但是却可使它变成可以管理的。注意,许多软件的复杂性主要不是由问题的内在复杂性造成的,而是由必须处理的大量细节造成的。
3.软件经常变化
绝大多数软件都模拟了现实世界的某一部分,例如,处理读者对图书馆提出的需求或跟踪银行内钱的流通过程。现实世界在不断变化,软件为了不被很快海汰,必须随着所模拟的现实世界一起变化。因此,在软件系统交付使用后仍然需要耗费成本,而且在开发过程中必须考虑软件将来可能发生的变化。
4.开发软件的效率非常重要
目前,社会对新应用系统的需求超过了人力资源所能提供的限度,软件供不应求的现象日益严重。因此,软件工程的一个重要课题就是,寻求开发与维护软件的更好更有效的方法和工具。
5.和谐的合作是开发软件的关键
软件处理的问题十分庞大,必须多人协同工作才能解决这类问题。为了有效地合作,必须明确地规定每个人的责任和相互通信的方法。事实上仅有上述规定还不够,每个人还必须严格地按规定行事。为了迫使大家遵守规定,应该运用标准和规程。通常,可以用工具来支持这些标准和规程。总之,纪律是成功地完成软件开发项目的一个关键。
6.软件必须有效地支持它的用户
开发软件的目的是支持用户的工作。软件提供的功能应该能有效地协助用户完成他们的工作。如果用户对软件系统不满意,可以弃用该系统,或者立即提出新的需求。因此,仅仅用正确的方法构造系统还不够,还必须构造出正确的系统。
7.在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品。
这个特性与前两个特性紧密相关。软件工程师是诸如Java 程序设计、软件体系结构、测试或统一建模语言(UML)等方面的专家,他们通常并不是图书馆管理、航空控制或银行事务等领域的专家,但是他们却不得不为这些领域开发应用系统。缺乏应用领域的相关知识,是软件开发项目出现问题的常见原因。
软件工程本质特性汇总:
- 软件工程关注于大型程序的构造
- 软件工程的中心课题是控制复杂性
- 软件经常变化
- 开发软件的效率非常重要
- 和谐地合作是开发软件的关键
- 软件必须有效地支持用户
- 在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品。
1.2.2软件工程的基本原理
7条原理相互独立,缺一不可。
1.用分阶段的生命周期计划严格管理
有人经统计发现,在不成功的软件项目中有一半左右是由于计划不周造成的,可见把建立完善的计划作为第一条基本原理是吸取了前人的教训而提出来的。
在软件开发与维护的漫长的生命周期中,需要完成许多性质各异的工作。这条基本原理意味着,应该把软件生命周期划分成若干个阶段,并相应地制定出切实可行的计划,然后严格按照计划对软件的开发与维护工作进行管理。
2.坚持进行阶段评审
当时已经认识到,软件的质量保证工作不能等到编码阶段结束之后再进行。这样说
至少有两个理由:第一,大部分错误是在编码之前造成的,例如,根据 Boehm 等人的统计,
设计错误占软件错误的63%,编码错误仅占37%;第二,错误发现与改正得越晚,所需付出的代价也越高(参见图1.1)。因此,在每个阶段都进行严格的评审,以便尽早发现在软件开发过程中所犯的错误,是一条必须遵循的重要原则。
3.实行严格的产品控制
在软件开发过程中不应随意改变需求,因为改变一项需求往往需要付出较高的代价。但是,在软件开发过程中改变需求又是难免的,只能依靠科学的产品控制技术来顺应这种要求。也就是说,当改变需求时,为了保持软件各个配置成分的一致性,必须实行严格的产品控制,其中主要是实行基准配置管理。基线配置管理是经过阶段评审后的软件配置成分。
4.采用现代程序设计技术
实践表明,采用先进的技术不仅可以提高软件开发和维护的效率,而且还可以提高软件产品的质量。
5.结果应能清楚地审查
软件产品不同于一般的物理产品,它是看不见摸不着的逻辑产品。软件开发人员的工作进展情况可见性差,难以准确度量,从而使软件产品开发过程比一般产品的开发过程更难与评价管理。
6.开发小组的人员应该少而精
软件开发小组的组成人员的素质应该好,而人数则不宜过多。开发小组的素质和数量是影响软件产品质量和开发效率的重要因素。当开发小组的人数为N时,可能的通信路径有N(N-1)条,可见随着人数N的增大,通信开销将急剧增加。
7.承认不断改进软件工程实践的必要性
遵循上述6条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产,但是,仅有上述6条原理并不能保证软件开发与维护的过程能赶上时代前进的步伐,能跟上技术的不断进步。因此要承认不断改进软件工程实践的必要性。
软件工程7条原理汇总:
- 用分阶段的生命周期计划严格管理
- 坚持进行阶段评审
- 实行严格的产品控制
- 采用现代化程序设计技术
- 结果应该能清楚地审查
- 开发小组成员应该少而精
- 承认不断改进软件工程实践的必要性
1.2.3软件工程方法学
方法学也称为范型,定义:在软件生命周期全过程中使用的一整套技术方法的集合。
软件工程方法学包含三个要素:方法、工具和过程。
使用最广泛都软件工程方法学,分别是:传统方法学和面向对象方法学。
1.传统方法学
传统方法学也称为生命周期方法学或结构化范型。
传统方法学采用结构化技术依赖完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用,它把软件生命周期的全过程划分为若干个阶段,顺序地完成每个阶段的任务。前一个阶段任务的完成是后一个阶段工作的前提和基础,后一个阶段的完成通常是前一个阶段提出的解法更进一步具体化,加进了更多的实现细节。
每个阶段的开始和结束都有严格的标准,前一个阶段的结束标准就是后一个阶段开始的标准。此外每个阶段结束都要进行技术审查和管理审查。审查的标准:交出“最新式的”高质量文档资料。
审查可以保证了软件质量,提高了软件的可维护性。
采用周期方法学可以提高软件开发的成功率,软件开发的生产率也能明显的提高。
2.面向对象方法学
面向对象方法学具有以下四个要点:
- 把对象(object)作为融合了数据及在数据上的操作行为的统一的软件构件。面向对象程序是由对象组成的,程序中任何元素都是对象,复杂对象由比较简单的对象组合而成。也就是说,用对象分解取代了传统方法的功能分解。
- 把所有对象都划分成类(class)。每个类都定义了一组数据和一组操作,类是对具有相同数据和相同操作的一组相似对象的定义。数据用于表示对象的静态属性,是对象的状态信息,而施加于数据之上的操作用于实现对象的动态行为。
- 按照父类(或称为基类)与子类(或称为派生类)的关系,把若干个相关类组成一个层次结构的系统(也称为类等级)。在类等级中,下层派生类自动拥有上层基类中定义的数据和操作,这种现象称为继承。
- 对象彼此间仅能通过发送消息互相联系。对象的所有私有信息都被封装在该对象内,不能从外界直接访问,这就是通常所说的封装性
面向对象方法学的出发点和基本原则,是尽量模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界,解决问题的方法与过程,使描述问题的问题空间(问题域)与实现解法的解空间(求解域)在结构上尽可能的一致。
传统方法学强调自顶向下顺序地完成软件开发的各阶段任务。
采用面向对象方法学开发软件可以降低软件产品的复杂性,提高软件的可理解性,简化了软件开发和维护工作。面向对象范型的另一个优点是促进了软件重用。
1.3软件生命周期
软件生命周期由软件定义、软件开发和运行维护3个时期组成,每一时期又分为若干个阶段。
软件定义时期的任务是:确定软件开发工程必须完成的总目标;确定工程的可行性;导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项工程需要的资源和成本,并且制定工程进度表。
这个时期都工作通常又称为系统分析,由系统分析员负责。
软件定义时期分为3个阶段:问题定义、可行性研究、需求分析。
开发时期具体设计和实现前一个时期定义的软件,分为4个阶段:总体设计,详细设计,编码和单元测试,综合测试。前两个阶段又称为系统设计,后两个阶段分为系统实现。
维护时期的任务是:使软件持久的满足用户的需要。通常对维护时期不在划分阶段。
1.3.1问题定义
要做的工作是:确定要解决的问题是什么。
1.3.2可行性研究
所做的工作是:分析对于所确定的问题是否有行得通的解决办法。
这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。
1.3.3需求分析
所做的工作是:确定为了解决这个问题,目标系统必须做什么,主要是确定目标系统必须具备哪些功能。
用户了解他们所面对的问题,知道必须做什么,但是通常不能完整准确地表达出他们的要求,更不知道怎样利用计算机解决他们的问题;软件开发人员知道怎样用软件实现人们的要求,但是对特定用户的且休要求并不完全清楚。因此,系统分析员在需求分析阶段必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法表示系统的逻辑模型。
1.3.4总体设计
所做的工作是:应该怎样实现目标系统。总体设计又称为概要设计。
上述设计工作确定了解决问题的策略及目标系统中应包含的程序,但是,怎样设计这些程序呢?软件设计的一条基本原理就是,程序应该模块化,也就是说,一个程序应该由若干个规模适中的模块按合理的层次结构组织而成。因此,总体设计的另一项主要任务就是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系。
1.3.5详细设计
所做的工作是:应该怎样具体的实现这个系统。
这个阶段是任务还不是编写程序,而是设计除程序的详细规格说明书。
详细设计也称为模块设计,详细的设计每个模块,确定实现模块功能所需要的算法和数据结构。
1.3.6编码和单元测试
关键任务:写出正确的容易理解,容易维护的程序模块。
1.3.7综合测试
关键任务:通过各种类型的测试(及相应的调试)使软件达到预定的要求。
最基本的测试是集成测试和验收测试。
测试测试:根据软件设计的软件结构把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试。
验收测试:按照规格说明书的规定(通常在需求分析阶段确定),由用户(或在用户积极参加下)对目标系统进行验收。
必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。
1.3.8软件维护
关键任务:通过各种必要的维护活动是系统持久都满足用户的需要。
4类维护活动:
改正性维护,也就是诊断和改正在使用过程中发现的软件错误;
适应性维护,即修改软件以适应环境的变化:
完善性维护,即根据用户的要求改进或扩充软件使它更完善;
预防性维护,即修改软件,为将来的维护活动预先做准备。
1.4软件过程
软件过程定义:为了获得高质量软件所需要完成的一系列任务的框架。它规定了完成各项任务都工作步骤。
过程定义了运用方法的顺序、应该交付的文档资料、为保证软件质量和协调变化所需要采取的管理措施,以及标志软件开发各个阶段任务完成的里程碑。
通常使用生命周期模型简洁地描述软件过程。生命周期模型规定了把生命周期划分成哪些阶段及各个阶段的执行顺序,因此,也称为过程模型。
1.4.1瀑布模型
瀑布模型的指导思想:清楚地区分逻辑设计和物理设计,尽可能推迟程序的物理实现。
瀑布模型的特点
- 阶段间具有顺序性和依赖性
- 推迟实现的观点
- 质量保证的观点
瀑布模型的优点:
- 可强迫开发人员采用规定的方法
- 规定了每个阶段必须提交的文档
- 每个阶段交出的所有产品都必须经过质量保证小组的仔细验证
瀑布模型是一种文档驱动模型,这也是它的缺点。
1.4.2快速原型模型
快速模型是快速建立起来的可以在计算机上运行的程序,它所完成的功能往往是最终产品能完成的功能的一个子集。
快速原型模型的优点:
- 有助于保证用户的需求得到满足
- 软件产品的开发基本上是线性顺序进行的。
1.4.3增量模型
增量模型也称为渐增模型。增量模型是把软件产品作为一系列的增量构件来设计、编码、集成和测试。
使用增量模型,第一个增量构件往往实现软件的基本需求,提供最核心的功能。
把软件产品分解成增量构件时,应该让构件规模适中,过大或过小都不好。还必须遵守的约束条件是:
当把新构件集成到现有的软件中时,所形成的产品必须是可测试的。
增量模型的优点:
- 能在较短的时间内向用户提交可完成部分工作的产品
- 可以使用户有充裕的时间学习和适应新产品,减少一个全新的软件可能给客户组织带来的冲击。
增量模型困难的是:
- 在把每个新的增量构件集成到现有软件中时,必须不破坏原来已经开发出的产品。
此外,软件的体系结构必须是开放的,从长远的看,这样的软件可维护性比封闭结构的软件好。
增量模型一方面要求开发人员把软件看作一个整体,另一方面把软件看作构件序列。
1.4.4螺旋模型
螺旋模型的基本思想:使用原型及其他方法来尽量降低风险。
换句话说,就是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。
螺旋模型的优点:
- 对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标。
- 减少了过多测试或测试不足所带来的风险。
螺旋模型主要适用于内部开发的大规模软件项目,螺旋模型的优势在于,它是风险驱动的,但是,这也可能是它的一个弱点。
1.4.5喷泉模型
喷泉模型,是典型的面向对象的软件过程模型之一。
体现了面向对象软件开发过程迭代和无缝的特性。
为避免使用喷泉模型开发软件时,开发过程过分无序,应该把一个线性过程作为总目标。
1.4.6Rational统一过程
RUP总结了经过多年商业化验证的6条最有效的软件开发经验,这些经验被称为“最佳实践”。
1.最佳实践
- 迭代式开发 线性顺序的开发方法不可能开发出当今客户需要的大型复杂软件系统。需求会经常改变,需要有一 种能够通过一系列细化、若干个渐近的反复过程而得出有效解决方案的迭代方法。
- 管理需求 在开发软件的过程中,客户需求将不断发生变化,因此,确定系统的需求是一个连续的过程。
- 使用基于构件的体系结构 所谓构件就是功能清晰的模块或子系统。系统可以由已经存在的、由第三方开发商提供的构件组 成,因此构件使软件重用成为可能。
- 可视化建模 为了更好地理解问题,人们常常采用建立问题模型的方法。所谓模型,就是为了理解事物而对事物 作出的一种抽象。
- 验证软件质量 某些软件不受用户欢迎的一个重要原因,是其质量低下。
- 控制软件变更 在变更是不可避免的环境中,必须具有管理变更的能力,才能确保每个修改都是可接受的而且能被跟踪的。
2.RUP软件开发生命周期
RUP软件开发生命周期是一个二维的生命周期模型。
(1) 核心工作流
RUP中有9个核心工作流,其中前6个为核心过程工作流程,后3个为核心支持工作流程。下面简要地叙述各个工作流程的基本任务。
- 业务建模:深入了解使用目标系统的机构及其商业运作, 评估目标系统对使用它的机构的影响。
- 需求:捕获客户的需求,并且使开发人员和用户达成对需求描述的共识。
- 分析与设计:把需求分析的结果转化成分析模型与设计模型。
- 实现:把设计模型转换成实现结果
- 测试:检查各个子系统的交互与集成,验证所有需求是否都被正确地实现了。
- 部署:成功地生成目标系统的可运行的版本,并把软件移交给最终用户。
- 配置与变更管理:跟踪并维护在软件开发过程中产生的所有制品的完整性和一致性。
- 项目管理:提供项目管理框架,为软件开发项目制定计划、人员配备、执行和监控等方面的实用准则,并为风险管理提供框架。
- 环境:向软件开发机构提供软件开发环境,包括过程管理和工具支持。
(2)工作阶段
RUP 把软件生命周期划分成4个连续的阶段。每个阶段都有明确的目标,并且定义了用来评估是否达到这些目标的里程碑。
下面简述四个阶段的工作目标:
- 初始阶段:建立业务模型,定义最终产品视图,并且确定项目的范围。
- 精化阶段:设计并确定系统的体系结构,制定项目计划,确定资源需求。
- 构建阶段:开发出所有构件和应用程序,把它们集成为客户需要的产品,并且测试所有功能
- 移交阶段:把开发出都产品提交给用户使用。
(3)RUP迭代式开发
RUP强调采用迭代和渐增的方式来开发软件,整个项目开发过程由多个迭代过程组成。在每次迭代中只考虑系统的一部分需求,针对这部分需求进行分析、设计、实现、测试和部署等工作,每次迭代都是在系统已完成部分的基础上进行的,每次给系统增加一些新的功能,如此循环往复地进行下去,直至完成最终项目。
1.4.7敏捷过程与极限编程
1.敏捷过程
四个价值观:
- 个体和交互胜过过程和工具
- 可以工作的软件胜过面面俱到的文档
- 客户合作胜过合同谈判
- 响应变化胜过遵循计划
理解上述4个价值观声明时应该注意,这些声明只不过是对不同因素在保证软件开发成功方面所起作用的大小做了比较,说一个因素更重要并不是说其他因素不重要,更不是说某个因素可以被其他因素代替。
根据上述价值观提出的软件过程统称为敏捷过程,其中最重要的是极限编程。
2.极限编程
极限二字含义:把好的开发实践运用到极致
极限编程广泛用于需求模糊且经常改变的场合。
(1)极限编程的有效实践
①客户作为开发团队的成员 ②使用用户素材 ③短交付周期 ④验收测试 ⑤结对编程
⑥测试驱动开发 ⑦集体所有 ⑧持续集成 ⑨可持续的开发速度 ⑩开放的工作空间
11.及时调整计划 12.简单的设计 13.重构 14.使用隐喻
1.4.8微软过程
1.微软过程准则
- 项目计划应该兼顾未来的不确定因素。
- 用有效的风险管理来减少不确定因素的影响。
- 经常生成并快速地测试软件的过渡版本,从而提高产品的稳定性和可预测性。
- 采用快速循环、递进的开发过程。
- 用创造性的工作来平衡产品特性和产品成本。
- 项目进度表应该具有较高稳定性和权威性。
- 使用小型项目组并发地完成开发工作。
- 在项目早期把软件配置基线化,项目后期则冻结产品。
- 使用原型验证概念,对项目进行早期论证。
- 把零缺陷作为追求的目标。
- 里程碑评审会的目的是改进工作,切忌相互指责。
2.微软软件生命周期
微软过程把软件生命周期划分五个阶段,分别是:
- 规划阶段
- 设计阶段
- 开发阶段
- 稳定阶段
- 发布阶段
3.微软过程模型
微软过程的每一个生命周期发布了一个递进的软件版本,各个生命周期持续、快速地迭代循环。
微软过程综合了Rational统一过程和敏捷过程的许多优点,但是对方法、工具和产品等方面的论述不如RUP和敏捷过程全面。在开发的实践中,这三个过程应该结合起来,取长补短。
习题
- 软件危机的定义?软件危机包含了哪方面的问题?软件危机的典型表现?
- 软件危机的原因是什么,解决软件危机的途径是什么?
- 软件的生命周期?软件的定义是什么?
- 程序,数据,文档的定义?
- 什么是软件工程支撑的环境?
- 软件工程学的一个重要目标是什么?
- 软件工程的定义?软件工程的本质特性有哪些?软件工程的基本原理有哪些?
- 什么是范型?软件工程学的三要素是哪些?
- 传统方法学也称为什么?传统方法学的要点?传统方法学的优点又是什么?
- 结构化分析的要点?结构化设计的要点?
- 面向对象方法学的四个要点?面向对象方法学的出发点和基本原则?面向对象方法学的优点?
- 软件的生命周期分为哪三个时期?软件过程的定义?
- 瀑布模型的指导思想?瀑布模型的特点和优点是什么?瀑布模型的缺点是什么?
- 什么是快速原型模型?它的优点是什么?
- 增量模型遵守的约束条件?增量模型的优点有?增量模型困难的是?
- 螺旋模型的基本思想是什么?它的优点有哪些?螺旋模型的缺点是什么?
- 喷泉模型的特性?
- 最佳实践有?
- RUP的核心工作流有什么?RUP的工作阶段分为哪几个阶段?RUP强调采用什么方式来开发软件?
- 敏捷过程的4个价值观是什么?