6软件工程导论 为软件工程具有下述的本质特性。 1,软件工程关注于大型程序的构造 “大”与“小”的分界线并不十分清晰。通常把一个人在较短时间内写出的程序称为小 型程序,而把多人合作用时半年以上才写出的程序称为大型程序。传统的程序设计技术 和工具是支持小型程序设计的,不能简单地把这些技术和工具用于开发大型程序。 事实上,在此处使用术语“程序”并不十分恰当,现在的软件开发项目通常构造出包含 若干个相关程序的“系统”。 2.软件工程的中心课题是控制复杂性 通常,软件所解决的问题十分复杂,以致不能把问题作为一个整体通盘考虑。人们不 得不把问题分解,使得分解出的每个部分是可理解的,而且各部分之间保持简单的通信关 系。用这种方法并不能降低问题的整体复杂性,但是却可使它变成可以管理的。注意,许 多软件的复杂性主要不是由问题的内在复杂性造成的,而是由必须处理的大量细节造 成的。 3.软件经常变化 绝大多数软件都模拟了现实世界的某一部分,例如,处理读者对图书馆提出的需求或 跟踪银行内钱的流通过程。现实世界在不断变化,软件为了不被很快淘汰,必须随着所模 拟的现实世界一起变化。因此,在软件系统交付使用后仍然需要耗费成本,而且在开发过 程中必须考虑软件将来可能发生的变化。 4.开发软件的效率非常重要 目前,社会对新应用系统的需求超过了人力资源所能提供的限度,软件供不应求的现 象日益严重。因此,软件工程的一个重要课题就是,寻求开发与维护软件的更好更有效的 方法和工具。 5.和谐地合作是开发软件的关键 软件处理的问题十分庞大,必须多人协同工作才能解决这类问题。为了有效地合作, 必须明确地规定每个人的责任和相互通信的方法。事实上仅有上述规定还不够,每个人 环须严格地按规定行事。为了柏使大家遵守规定,应该运用标准和规程。通常,可以用 工具来支持这些标准和规程。总之,纪律是成功地完成软件开发项目的一个关键。 6.软件必须有效地支持它的用户 开发软件的目的是支持用户的工作。软件提供的功能应该能有效地协助用户完成他 们的工作。如果用户对软件系统不满意,可以弃用该系统,或者立即提出新的需求。因 此,仅仅用正确的方法构造系统还不够,还必须构造出正确的系统。 有效地支持用户意味着必须仔细地研究用户,以确定适当的功能需求、可用性要求及 www.TopSage.com
www.TopSage.com
第1章软件工程学概述7 其他质量要求(例如,可靠性、响应时间等)。有效地支持用户还意味着,软件开发不仅应 该提交软件产品,而且应该写出用户手册和培训材料,此外,还必须注意建立使用新系统 的环培,例如,一个新的图书馆自动化系统将影响图书馆的工作流程,因此应该适当地培 训用户,使他们习惯于新的工作流程。 7.在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人 创造产品 这个特性与前两个特性紧密相关。软件工程师是诸如Java程序设计、软件体系结 构、测试或统一建模语言(UML)等方面的专家,他们通常并不是图书馆管理、航空控制或 银行事务等领域的专家,但是他们却不得不为这些领域开发应用系统。缺乏应用领域的 相关知识,是软件开发项目出现问题的常见原因。 软件工程师不仅缺乏应用领域的实际知识,他们还缺乏该领域的文化知识。例如,软 件开发者通过访谈、阅读书面文件等方法了解到用户组织的“正式”工作流程,然后用软件 实现这个工作流程。但是,决定软件系统成功与否的关键问题是,用户组织是否真正遵守 这个工作流程。对于局外人来说,这个问题更难回答 1.2.2软件工程的基本原理 自从1968年在联邦德国召开的国际会议上正式提出并使用了“软件工程”这个术语 以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或“信条” 著名的软件工程专家B.W.Boehm综合这些学者们的意见并总结了TRW公司多年开发 软件的经验,于1983年在一篇论文中提出了软件工程的7条基本原理。他认为这7条原 理是确保软件产品质量和开发效率的原理的最小集合。这7条原理是互相独立的,其中 任意6条原理的组合都不能代替另一条原理,因此,它们是缺一不可的最小集合,然而这 ?条原理又是相当完备的,人们虽然不能用数学方法严格证明它们是一个完备的集合,但 是,可以证明在此之前已经提出的100多条软件工程原理都可以由这7条原理的任意组 合蕴含或派生。 下面简要介绍软件工程的7条基本原理 1,用分阶段的生命周期计划严格管理 有人经统计发现,在不成功的软件项目中有一半左右是由于计划不周造成的,可见把 建立完善的计划作为第一条基本原理是吸取了前人的教训而提出来的。 在软件开发与维护的漫长的生命周期中,需要完成许多性质各异的工作。这条基本 原理意味着,应该把软件生命周期划分成若干个阶段,并相应地制定出切实可行的计划, 然后严格按照计划对软件的开发与维护工作进行管理 不同层次的管理人员都必须严格按照计划各尽其职地管理软件开发与维护工作,绝 不能受客户或上级人员的影响而擅自背离预定计划。 www.TopSage.com
www.TopSage.com
8软件工程导论 2.坚持进行阶段评审 当时已经认识到,软件的质量保证工作不能等到编码阶段结束之后再进行。这样说 至少有两个理由:第一,大部分错误是在编码之前造成的,例如,根据Bohm等人的统计, 设计错误占软件错误的63%,编码错误仅占37%;第二,错误发现与改正得越晚,所需付 出的代价也越高(参见图1.1)。因此,在每个阶段都进行严格的评审,以便尽早发现在软 件开发过程中所犯的错误,是一条必须遵循的重要原则 3.实行严格的产品控制 在软件开发过程中不应随意改变需求,因为改变一项需求往往需要付出较高的代价】 但是,在软件开发过程中改变需求又是难免的,只能依靠科学的产品控制技术来顺应这种 要求。也就是说,当改变需求时,为了保持软件各个配置成分的一致性,必须实行严格的 产品控制,其中主要是实行基准配置管理。所谓基准配置又称为基线配置,它们是经过阶 段评审后的软件配置成分(各个阶段产生的文档或程序代码)。基准配置管理也称为变动 控制:一切有关修改软件的建议,特别是涉及到对基准配置的修改建议,都必须按照严格 的规程进行评审,获得批准以后才能实施修改。绝对不能谁想修改软件(包括尚在开发过 程中的软件),就随意进行修改。 4.采用现代程序设计技术 从提出软件工程的概念开始,人们一直把主要精力用于研究各种新的程序设计技术 并进一步研究各种先进的软件开发与维护技术。实践表明,采用先进的技术不仅可以提 高软件开发和维护的效率,而且可以提高软件产品的质量。 5.结果应能清楚地审查 软件产品不同于一般的物理产品,它是看不见摸不着的逻辑产品。软件开发人员(或 开发小组)的工作进展情况可见性差,难以准确度量,从而使得软件产品的开发过程比 般产品的开发过程更难于评价和管理。为了提高软件开发过程的可见性,更好地进行管 理,应该根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,从而 使得所得到的结果能够清楚地审查。 6.开发小组的人员应该少而精 这条基本原理的含义是,软件开发小组的组成人员的素质应该好,而人数则不宜过 多。开发小组人员的素质和数量是影响软件产品质量和开发效率的重要因素。素质高的 人员的开发效率比素质低的人员的开发效率可能高几倍至几十倍,而且素质高的人员所 开发的软件中的错误明显少于素质低的人员所开发的软件中的错误。此外,随着开发小 组人员数目的增加,因为交流情况讨论问题而造成的通信开销也急剧增加,当开发小组 人员数为N时,可能的通信路径有N(N一1)/2条,可见随着人数N的增大,通信开销将 急剧增加。因此,组成少而精的开发小组是软件工程的一条基本原理 www.TopSage.com
www.TopSage.com
第1章软件工程学期达9 /网 7,承认不断改进软件工程实践的必要性 lonSage.com 遵循上述6条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产 但是,仅有上述6条原理并不能保证软件开发与维护的过程能赶上时代前进的步伐,能跟 上技术的不断进步。因此,Bohm提出应把承认不断改进软件工程实践的必要性作为软 件工程的第?条基本原理。按照这条原理,不仅要积极主动地采纳新的软件技术,而且要 注意不断总结经验,例如,收集进度和资源耗费数据,收集出错类型和问题报告数据等 这些数据不仅可以用来评价新的软件技术的效果,而且可以用来指明必须着重开发的款 件工具和应该优先研究的技术。 1.2.3软件工程方法学 前面已经讲过,软件工程包括技术和管理两方面的内容,是技术与管理紧密结合所形 成的工程学科。 所谓管理就是通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,以 达到既定目标的过程。本书第13章将讨论软件项目管理问题, 通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学 (methodology),也称为范型(paradigm)。在软件工程领域中,这两个术语的含义基本 相同。 软件工程方法学包含3个要素:方法、工具和过程。其中,方法是完成软件开发的各 项任务的技术方法,回答“怎样做”的问题:工具是为运用方法而提供的自动的或半自动的 软件工程支撑环境:过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规 定了完成各项任务的工作步骤, 目前使用得最广泛的软件工程方法学,分别是传统方法学和面向对象方法学。 1.传统方法学 传统方法学也称为生命周期方法学或结构化范型。它采用结构化技术(结构化分析 结构化设计和结构化实现)来完成软件开发的各项任务,并使用适当的软件工具或软件工 程环境来支持结构化技术的运用。这种方法学把软件生命周期的全过程依次划分为若干 个阶段,然后顺序地完成每个阶段的任务。采用这种方法学开发软件的时候,从对问题的 抽象逻辑分析开始,一个阶段一个阶段地顺序进行开发。前一个阶段任务的完成是开始 进行后一个阶段工作的前提和基础,而后一阶段任务的完成通常是使前一阶段提出的解 法更进一步具体化,加进了更多的实现细节。每一个阶段的开始和结束都有严格标准,对 于任何两个相邻的阶段而言,前一阶段的结束标准就是后一阶段的开始标准。在每一个 阶段结束之前都必须进行正式严格的技术审查和管理复审,从技术和管理两个方面对这 个阶段的开发成果进行检查,通过之后这个阶段才算结束:如果没通过检查,则必须进行 必要的返工,而且返工后还要再经过审查。审查的一条主要标准就是每个阶段都应该交 出“最新式的”(即和所开发的软件完全一致的)高质量的文档资料,从而保证在软件开发 工程结束时有一个完整准确的软件配置交付使用。文档是通信的工具,它们清楚准确地 www.TopSage.com
www.TopSage.com
10软件工程导论 说明了到这个时候为止,关于该项工程已经知道了什么,同时奠定了下一步工作的基础。 此外,文档也起备忘录的作用,如果文档不完整,那么一定是某些工作忘记做了,在进入生 命周期的下一个阶段之前,必须补足这些遗漏的细节。 把软件生命周期划分成若干个阶段,每个阶段的任务相对独节,而日比较简单,便于 不同人员分工协作,从而降低了整个软件开发工程的困难程度:在软件生命周期的每个阶 段都采用科学的管理技术和良好的技术方法,而且在每个阶段结束之前都从技术和管理 两个角度进行严格的审查,合格之后才开始下一阶段的工作,这就使软件开发工程的全过 程以一种有条不紊的方式进行,保证了软件的质量,特别是提高了软件的可维护性。总 之,采用生命周期方法学可以大大提高软件开发的成功率,软件开发的生产率也能明显 提高 目前,传统方法学仍然是人们在开发软件时使用得十分广泛的软件工程方法学。这 种方法学历史悠久,为广大软件工程师所熟悉,而且在开发某些类型的软件时也比较有 效,因此,在相当长一段时期内这种方法学还会有生命力。此外,如果没有完全理解传统 方法学,也就不能深入理解这种方法学与面向对象方法学的差别以及面向对象方法学为 何优于传统方法学。因此,本书不仅讲述面向对象方法学,也讲述传统方法学。 2.面向对象方法学 当软件规模庞大,或者对软件的需求是模糊的或会随时间变化而变化的时候,使用传 统方法学开发软件往往不成功,此外,使用传统方法学开发出的软件,维护起来仍然很 困难 结构化范型只能获得有限成功的一个重要原因是,这种技术要么面向行为(即对数据 的操作),要么面向数据,还没有既面向数据又面向行为的结构化技术。众所周知,软件系 统本质上是信息处理系统。离开了操作便无法更改数据,而脱离了数据的操作是毫无意 义的。数据和对数据的处理原本是密切相关的,把数据和操作人为地分离成两个独立的 部分,自然会增加软件开发与维护的难度。与传统方法相反,面向对象方法把数据和行为 看成是同等重要的,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的 方法 概括地说,面向对象方法学具有下述4个要点。 (1)把对象(obj©ct)作为融合了数据及在数据上的操作行为的统一的软件构件。面 向对象程序是由对象组成的,程序中任何元素都是对象,复杂对象由比较简单的对象组合 而成。也就是说,用对象分解取代了传统方法的功能分解, (2)把所有对象都划分成类(class)。每个类都定义了一组数据和一组操作,类是对 具有相同数据和相同操作的一组相以对象的定义。数据用于表示对象的静态属性,是对 象的状态信息,而施加于数据之上的操作用于实现对象的动态行为。 (3)按照父类(或称为基类)与子类(或称为派生类)的关系,把若干个相关类组成 个层次结构的系统(也称为类等级)。在类等级中,下层派生类自动拥有上层基类中定义 的数据和操作,这种现象称为继承。 (4)对象彼此间仅能通过发送消息互相联系。对象与传统数据有本质区别,它不是 www.TopSage.com
www.TopSage.com