软件工程导论
1.1.3 消除软件危机的途径
为了消除软件危机,首先应该对计算机软件有一个 正确的认识。正如1.1.2节中讲过的,应该彻底消除 在计算机系统早期发展阶段形成的“软件就是程序” 的错误观念。一个软件必须由一个完整的配置组成, 事实上,软件是程序、数据及相关文档的完整集合。 其中,程序是能够完成预定功能和性能的可执行的 指令序列;数据是使程序能够适当地处理信息的数 据结构;文档是开发、使用和维护程序所需要的图 文资料。
4、目前相当多的软件专业人员对软件开发和维护 还有不少糊涂观念,在实践过程中或多或少地采用 了错误的方法和技术,这可能是使软件问题发展成 软件危机的主要原因。 与软件开发和维护有关的许多错误认识和作法的形 成,可以归因于在计算机系统发展的早期阶段软件 开发的个体化特点。错误的认识和作法主要表现为 忽视软件需求分析的重要性,认为软件开发就是写 程序并设法使之运行,轻视软件维护等。
问题发现的时间
作好软件定义时期的工作,是降低软件成本提 高软件质量的关键。如果软件开发人员在定义时期 没有正确全面地理解用户需求,直到测试阶段或软 件交付使用后才发现“已完成的”软件不完全符合 用户的需要,这时再修改就为时已晚了。
严重的问题是,在软件开发的不同阶段进行修改需 要付出的代价是很不相同的,在早期引入变动,涉 及的面较少,因而代价也比较低;而在开发的中期 软件配置的许多成分已经完成,引入一个变动要对 所有已完成的配置成分都做相应的修改,不仅工作 量大,而且逻辑上也更复杂,因此付出的代价剧增; 在软件“已经完成”时再引入变动,当然需要付出 更高的代价。根据美国一些软件公司的统计资料, 在后期引入一个变动比在早期引入相同变动所需付 出的代价高2~3个数量级。图1.1定性地描绘了在 不同时期引入一个变动需要付出的代价的变化趋势。
开发时期具体设计和实现在前一个时期定义的软件, 它通常由下述4个阶段组成:总体设计,详细设计, 编码和单元测试,综合测试。其中前两个阶段又称 为系统设计,后两个阶段又称为系统实现。 维护时期的主要任务是使软件持久地满足用户的需 要。具体地说,当软件在使用过程中发现错误时应 该加以改正;当环境改变时应该修改软件以适应新 的环境;当用户有新要求时应该及时改进软件以满 足用户的新需要。通常对维护时期不再进一步划分 阶段,但是每一次维护活动本质上都是一次压缩和 简化了的定义和开发过程。
1.2.3 软件工程方法学
软件工程包括技术和管理两方面的内容,是技术与 管理紧密结合所形成的工程学科。 所谓管理就是通过计划、组织和控制等一系列活动, 合理地配置和使用各种资源,以达到既定目标的过 程。 通常把在软件生命周期全过程中使用的一整套技术 方法的集合称为方法学(methodology),也称为范 型(paradigm)。在软件工程领域中,这两个术语的 含义基本相同。
1.1.2 产生软件危机的原因
在软件开发和维护的过程中存在这么多严重问题, 一方面与软件本身的特点有关,另一方面也和软件 开发与维护的方法不正确有关。
1、由于软件缺乏“可见性”,在写出程序代码并在计算机 上试运行之前,软件开发过程的进展情况较难衡量,软件 的质量也较难评价,因此,管理和控制软件开发过程相当 困难。 2、软件在运行过程中不会因为使用时间过长而被“用坏”, 如果运行中发现了错误 ,很可能是遇到了一个在开发时期 引入的在测试阶段没能检测出来的错误。因此,软件维护 通常意味着改正或修改原来的设计,这就在客观上使得软 件较难维护。 3、规模庞大,需多人分工合作。如何保证每个人完成的工 作合在一起确实能构成一个高质量的大型软件系统,更是 一个极端复杂困难的问题,不仅涉及许多技术问题,诸如 分析方法、设计方法、形式说明方法、版本控制等,更重 要的是必须有严格而科学的管理。
1. 传统方法学 传统方法学也称为生命周期方法学或结构化范型。 它采用结构化技术(结构化分析、结构化设计和结 构化实现)来完成软件开发的各项任务,并使用适 当的软件工具或软件工程环境来支持结构化技术的 运用。这种方法学把软件生命周期的全过程依次划 分为若干个阶段,然后顺序地完成每个阶段的任务。 采用这种方法学开发软件的时候,从对问题的抽象 逻辑分析开始,一个阶段一个阶段地进行开发。
(1) 对软件开发成本和进度的估计常常很不准确。 (2) 用户对“已完成的”软件系统不满意的现象经 常发生。 (3) 软件产品的质量往往靠不住。 (4) 软件常常是不可维护的。 (5) 软件通常没有适当的文档资料。 (6) 软件成本在计算机系统总成本中所占的比例逐 年上升。 (7) 软件开发生产率提高的速度,远远跟不上计算 机应用迅速普及深入的趋势。
1.3 软件生命周期*
概括地说,软件生命周期由软件定义、软件开发和 运行维护(也称为软件维护)3个时期组成,每个时 期又进一步划分成若干个阶段。 软件定义时期的任务是: 确定软件开发工程必须 完成的总目标;确定工程的可行性;导出实现工程 目标应该采用的策略及系统必须完成的功能;估计 完成该项工程需要的资源和成本,并且制定工程进 度表。这个时期的工作通常又称为系统分析,由系 统分析员负责完成。软件定义时期通常进一步划分 成3个阶段,即问题定义、可行性研究和需求分析。
1.2.2 软件工程的基本原理
自从1968年在联邦德国召开的国际会议上正式提出 并使用了“软件工程”这个术语以来,研究软件工 程的专家学者们陆续提出了100多条关于软件工程 的准则或“信条”。著名的软件工程专家 B.W.Boehm综合这些学者们的意见并总结了TRW 公司多年开发软件的经验,于1983年在一篇论文中 提出了软件工程的7条基本原理。他认为这7条原理 是确保软件产品质量和开发效率的原理的最小集合。
1、正确的认识 2、协同配合,吸取经验 3、使用以往的成功技术和方法 4、开发和使用更好的软件工具 总之,为了解决软件危机,既要有技术措施(方法 和工具),又要有必要的组织管理措施。软件工程 正是从管理和技术两方面研究如何更好地开发和维 护计算机软件的一门新兴学科。
1.2 软件工程
1.2.1 软件工程的介绍
(3) 按照父类(或称为基类)与子类(或称为派生类)的 关系,把若干个相关类组成一个层次结构的系统 (也称为类等级)。在类等级中,下层派生类自动拥 有上层基类中定义的数据和操作,这种现象称为继 承。 (4) 对象彼此间仅能通过发送消息互相联系。对象 与传统数据有本质区别,它不是被动地等待外界对 它施加操作,相反,它是数据处理的主体,必须向 它发消息,请求它执行它的某个操作以处理它的数 据,而不能从外界直接对它的数据进行处理。也就 是说,对象的所有私有信息都被封装在该对象内, 不能从外界直接访问,这就是通常所说的封装性。
ቤተ መጻሕፍቲ ባይዱ
下面简要介绍软件工程的7条基本原理。 1. 用分阶段的生命周期计划进行严格管理 2. 坚持进行阶段评审 3. 实行严格的产品控制 4. 采用现代程序设计技术 结构分析(SA)和结构设计(SD)技术 面向对象分析(OOA)和面向对象设计(OOD)技术 5. 结果应能清楚地审查 6. 开发小组的人员应该少而精 7. 承认不断改进软件工程实践的必要性
下面扼要介绍软件生命周期每个阶段的基本任务。 1. 问题定义 问题定义阶段必须回答的关键问题是:“要解决的 问题是什么?”如果不知道问题是什么就试图解决这 个问题,显然是盲目的,只会白白浪费时间和金钱, 最终得出的结果很可能是毫无意义的。尽管确切地 定义问题的必要性是十分明显的,但是在实践中它 却可能是最容易被忽视的一个步骤。 通过对客户的访问调查,系统分析员扼要地写出关 于问题性质、工程目标和工程规模的书面报告,经 过讨论和必要的修改之后这份报告应该得到客户的 确认。
2. 面向对象方法学 当软件规模庞大,或者对软件的需求是模糊的或会 随时间而变化的时候,使用传统方法学开发软件往 往不成功,此外,使用传统方法学开发出的软件, 维护起来仍然很困难。 面向对象方法把数据和行为看成同等重要,它是一 种以数据为主线,把数据和对数据的操作紧密地结 合起来的方法。
概括地说,面向对象方法学具有下述4个要点。 (1) 把对象(object)作为融合了数据及在数据上的操 作行为的统一的软件构件。面向对象程序是由对象 组成的,程序中任何元素都是对象,复杂对象由比 较简单的对象组合而成。也就是说,用对象分解取 代了传统方法的功能分解。 (2) 把所有对象都划分成类(class)。每个类都定义了 一组数据和一组操作,类是对具有相同数据和相同 操作的一组相似对象的定义。数据用于表示对象的 静态属性,是对象的状态信息,而施加于数据之上 的操作用于实现对象的动态行为。
普通高校本科计算机专业特色教材精选
张海藩 编著
软件工程导论(第5版)
主讲教师:司春景 QQ:402326542
第1章 软件工程学概述
1.1 软件危机
1.2 软件工程
1.3 软件生命周期
1.4 软件过程
1.5 小结
习题
1.1 软件危机
软件危机是指在计算机软件的开发和维护过程中所 遇到的一系列严重问题。这些问题绝不仅仅是不能 正常运行的软件才具有的,实际上,几乎所有软件 都不同程度地存在这些问题。 概括地说,软件危机包含下述两方面的问题:如何 开发软件,以满足对软件日益增长的需求;如何维 护数量不断膨胀的已有软件。 具体地说,软件危机主要有以下一些典型表现。
1968年在第一届NATO会议上曾经给出了软件工程 的一个早期定义:“软件工程就是为了经济地获得 可靠的且能在实际机器上有效地运行的软件,而建 立和使用完善的工程原理。”这个定义不仅指出了 软件工程的目标是经济地开发出高质量的软件,而 且强调了软件工程是一门工程学科,它应该建立并 使用完善的工程原理。 1993年IEEE进一步给出了一个更全面更具体的定 义:“软件工程是: ①把系统的、规范的、可度 量的途径应用于软件开发、运行和维护过程,也就 是把工程应用于软件; ②研究①中提到的途径。”
虽然软件工程的不同定义使用了不同词句,强调的 重点也有差异,但是,人们普遍认为软件工程具有 下述的本质特性。 1. 软件工程关注于大型程序(软件系统)的构造 2. 软件工程的中心课题是控制复杂性 3. 软件经常变化 4. 开发软件的效率非常重要(即时性) 5. 和谐地合作是开发软件的关键 6. 软件必须有效地支持它的用户 7. 在软件工程领域中是由具有一种文化背景的人替 具有另一种文化背景的人(完成一些工作)