1、1 1第1章 导 论第1章 导 论1.1 软件1.2 软件工程概述1.3 软件工程方法1.4 CASE工具与集成化的软件开发环境1.5 软件工程知识体系本章小结习题2 2第1章 导 论1.1 软 件软件不是物理产品而是逻辑产品,在开发、维护方面与硬件产品相比有着完全不同的特性:(1)软件是设计开发的,而非传统意义上生产制造的。软件和硬件均可通过设计获得好的产品品质,但硬件制造阶段的质量问题是易于控制和纠正的,而软件生产阶段的质量控制要困难得多。相比硬件的生产,软件开发过度依赖于开发人员的素质、能力及协作,软件项目管理过程不能像硬件制造那样进行。3 3第1章 导 论(2)软件不会磨损。随着时间的
2、推移,灰尘、振动、不当使用、温度等因素的影响,硬件的失效率会增大,这称之为磨损。而软件则不会受上述环境的影响。硬件和软件的失效率曲线如图1.1所示。4 4第1章 导 论图1.1 硬件和软件失效率曲线对比5 5第1章 导 论(3)大多数软件是根据客户的要求定制的。硬件通常是依据一定规范标准来制造的,软件则多数是根据客户的要求定制的。虽然目前商业化软件的组件技术发展很快,但完全使用现成的组件实现软件系统仍不现实,基于组件的软件开发模式仍然需要根据软件需求来开发系统。6 6第1章 导 论1.1.1 软件的发展1942年,伴随着第一台计算机的诞生,计算机程序开始出现。通常,软件发展至今可被划分为四个阶
3、段。7 7第1章 导 论1.1.2 软件的类型软件从功能角度分为系统软件和应用软件,从服务对象的角度分为通用软件和定制软件。8 8第1章 导 论1.1.3 软件质量特性质量特性是“产品、过程或体系与需求有关的固有特性”。软件质量特性反映了软件的本质。9 9第1章 导 论软件质量的定义有多种,美国国家标准学会(ANSI)在其ANSI/ASQCA3/1978标准中将软件质量定义为:“软件质量是软件产品或服务的特性和特征的整体,它取决于软件满足给定需求的能力”。具体来说,软件质量就是软件符合明确描述的功能和性能需求、文档中明确描述的开发标准,以及所有专业开发的软件都应具备的隐含特征的程度。1010第
4、1章 导 论软件质量通常采用质量模型来建立用户视角和开发者视角的软件质量特性间的关系,如Bohem的质量模型、McCall的质量模型以及ISO的质量模型。图1.2为McCall的质量模型。1111第1章 导 论图1.2 McCall的软件质量模型1212第1章 导 论McCall的模型中给出了11个质量要素,如表1.1所示。11个质量要素分为三类,对应软件的运行特性、修改特性和转换特性。软件的运行特性包括正确性、可靠性、有效性、完整性和可用性;修改特性是指软件承受修改的能力,包括可维护性、灵活性和可测试性;软件的转换特性包括可移植性、可复用性和互操作性。1313第1章 导 论1414第1章 导
5、 论McCall的模型中给出了一组较易度量的软件质量评价准则,共20种。评价准则能够比较完整、准确地描述质量,且比较容易量化和度量。表1.2列出了对它们的描述。1515第1章 导 论1616第1章 导 论软件质量要素Fj的评价可用下列公式计算:j=1,2,11其中,Mk是软件质量要素Fj对第k种评价标准的测量值,Cjk是相应的加权系数。lkkjkjMCF11717第1章 导 论由于McCall定义的评价准则多数没有客观的度量方法,因此只能凭主观印象为评价准则定值。McCall将评价准则分为010级,0级最低,10级最高。加权系数Cjk满足其中Cjk0,当质量要素Fj与k项评价准则无关时,Cjk
6、=0,l表示评价准则的项数,对于McCall的评价准则,l=20。lkjkC11,1818第1章 导 论1.2 软件工程概述1.2.1 软件危机软件危机主要表现在以下几方面:(1)软件开发无计划性。(2)软件需求不充分。(3)软件开发过程无规范。(4)软件产品无评测手段。1919第1章 导 论1.2.2 软件工程IEEE关于软件工程的定义为:软件工程是:将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即将工程化应用到软件上;对中所述方法的研究。软件工程具有三要素:方法(Methods)、工具(Tools)和过程(Procedures)。2020第1章 导 论软件工程方法可提供如
7、何构造软件的技术。软件工程方法覆盖面很广,包括需求分析、设计建模、编程、测试和其他的支持。软件工程方法依赖于一组基本原则,如Demarco(1978)和Jacobson(1983)提出的结构化的方法,Booch(1994)和Rumbaugh(1991)建议的面向对象的方法。软件方法包括一组对需求和设计、算法过程、编码、测试和维护的定义元素等。软件工程方法贯穿于软件开发过程,起着核心的作用。表1.3列出了一些软件工程方法元素。2121第1章 导 论2222第1章 导 论软件工程工具提供自动化或半自动化的支持,包括模型建立、代码生成、程序静态分析、软件测试、过程管理等。软件工程过程是用合适的方法、
8、语言和工具由软件工程师进行软件活动的集合。软件工程过程定义了一个框架,是软件项目管理控制的基础。软件工程过程建立了一个环境以便于技术方法的采用、可交付产品(文档、报告以及格式等)的产生,并帮助确保质量和变更的控制,使软件管理人员能对它们的进展进行评价。2323第1章 导 论软件工程遵循一些通用的原则,这些原则主要包括:(1)抽象即抽取事物的本质特性和行为,是软件工程的本质方法原则之一,贯穿于软件过程。在需求定义阶段对业务流、数据流的建模。设计阶段体系结构、类继承关系的建模均为抽象。(2)模块化原则要求软件系统逻辑上应分解成具有独立性的模块,模块应具有功能内聚和弱耦合的特点,模块之间通过某种交互
9、和控制关系构成系统结构。模块大小应适中,过大会导致模块内部逻辑过于复杂,太小则使系统的整个结构趋于复杂。模块化思想有利于降低软件问题的复杂度,也有助于软件的理解和维护。2424第1章 导 论(3)信息隐蔽是指软件模块的封装应使模块的内部细节尽量不暴露在外,与其他模块的联系仅限于模块的接口,如类封装了属性和方法,方法的调用和属性的访问都通过类接口。信息隐蔽原则使模块之间弱耦合,有利于软件维护和修改。(4)一致性是指在整个软件过程中,软件制品包括文档和程序均使用一致的概念、符号、术语,有着一致的软硬件接口,并且系统的定义和实现行为也应保持一致。如系统中对Undo命令项的定义是撤消前一步的行为结果,
10、系统响应该项的行为就是回到该动作前的系统状态,且任何时候只能做出该行为。2525第1章 导 论(5)完整性是指系统不丢失任何所需要的部分,实现系统所需功能的程度。(6)可验证性是指系统的设计与实现应遵循易被测试、验证的原则,以保证交付和系统的正确性检查。如要求系统的查询响应时间小于5秒,就是一种可验证的系统指标。对于有些安全和可靠性要求极高的系统,必要时其模型的构建也应该是可验证的,这时往往采用形式化的模型描述和形式证明来保证系统的正确性。2626第1章 导 论1.2.3 软件过程每个软件过程都有活动框架,软件过程框架定义了活动的时间、人员、工作内容和达到预期目标的途径,如图1.3所示。272
11、7第1章 导 论图1.3 软件过程框架2828第1章 导 论不同的机构和组织、不同的软件产品可能会有过程活动的差异,通用的过程框架可适用于绝大多数的软件项目,一般包含以下框架活动:(1)软件定义(Software Specification):与客户间大量的交流与协作,获取需求、定义软件的功能和限制,构建需求分析模型,形成正式的需求规格说明。(2)软件设计和实现(Software Design and Implementation):设计如何实现需求,产生设计规格说明,并编码实现满足定义的软件。2929第1章 导 论(3)软件验证(Software Validation):评审、测试软件产品,
12、包括各种文档、模型、程序,验证软件以确保它可以满足用户的需求。(4)软件演化(Software Evolution):软件交付后的维护活动,以满足用户需求的变化。软件在交付运行后,会遭遇变更,这是因为软件本身可能存在的缺陷以及用户对软件需求的变化。3030第1章 导 论不同的软件过程以不同的方式组织这些软件活动,软件过程的抽象称之为过程模型。在长期的工程实践和研究中,已形成了一些典型的过程模型,主要包括:瀑布模型、演化式开发、形式化开发、基于组件的开发、螺旋模型、增量模型等。3131第1章 导 论1.3 软件工程方法1.3.1 结构化分析和设计方法结构化方法是一种传统的软件工程方法。它采用结构
13、化分析(SA)、结构化设计(Structural,SD)、结构化程序设计和测试来完成软件开发的各项任务,并使用适当的软件工具或软件工程环境来支持结构化技术的运用。3232第1章 导 论1结构化分析方法结构化分析的主要步骤如下:(1)分析需求关系中数据的加工处理流程,建立数据流模型。(2)生成数据字典并对模型中的元素进行描述。(3)建立人机接口模型。(4)定义完整的需求规格说明。图1.4是一个ATM取款过程的数据流图。3333第1章 导 论图1.4 取款数据流图3434第1章 导 论2结构化设计方法结构化设计的实质是将DFD转变成系统结构模型的过程,软件系统结构是指软件模块间的关系。设计的第一步
14、是进行DFD的类型区分,一般来说,DFD可分为两种类型:变换型和事务型。变换型数据流的特点是DFD可以明显地分为“输入处理输出”三部分,而事务型DFD则是对某个数据的加工分为不同的加工流。图1.5是一个变换型DFD转换为系统结构的示意图。3535第1章 导 论图1.5 DFD转换为系统结构的示意图3636第1章 导 论 在图1.5中,左边的由结构化分析构建的数据流模型被分为三部分:即输入流/输入加工、转换流/中心加工、输出流/输出加工,结构化的设计过程则将该DFD转换为由三个子模块构成的系统结构模型,即输入模块CI、转换模块CT和输出模块CO。3737第1章 导 论1.3.2 面向对象软件工程
15、方法Coad和Yourdon给出了面向对象系统的定义:面向对象=对象+类+继承+消息面向对象程序是由对象类构成的,程序中的基本元素是对象,复杂对象由比较简单的对象组合而成。对象是封装了数据和数据操作行为的软件组件,数据用于表示对象的静态属性,是对象的状态信息,而施加于数据之上的操作用于实现对象的动态行为。3838第1章 导 论 面向对象分析(Object Oriented Analysis)是运用面向对象的方法进行需求分析,主要任务是分析和理解软件系统的问题域,找出描述问题域和系统责任所需的类和对象,分析它们的内部构成和外部关系,建立OOA模型。面向对象设计(Object Oriented D
16、esign)是根据已建立的分析模型、运用面向对象的技术进行系统设计。它将OOA模型直接变成OOD模型,并且补充与实现有关的部分,如人机界面、数据存储、任务管理等。3939第1章 导 论图1.6是面向对象分析和设计的示意图。从图中可以看出,问题域中的实体,经过分析,被抽象为分析类模型,而分析类经过设计精化则被映射为子系统和设计类。4040第1章 导 论图1.6 面向对象分析和设计示意图4141第1章 导 论 面向对象编程(Object Oriented Programming)采用面向对象的编程语言实现设计模型。面向对象测试(Object Oriented Testing)运用面向对象技术进行以
17、对象概念为中心的软件测试。它以类作为基本的测试单位,集中检查在类定义之内的属性、服务和有限的对外接口,大大减少了错误的影响范围。4242第1章 导 论 面向对象维护(Object Oriented Software Maintenance)的最大难点在于人们对软件的理解过程中所遇到的障碍。在面向对象方法中,各阶段的表示是一致的,从而大大降低了理解的难度。对象的封装性也使一个对象的修改对其他对象的影响较小。因此,如果已经理解了面向对象的软件,面向对象的维护很容易,但面向对象的软件却不易理解。4343第1章 导 论1.3.3 用例驱动的软件开发方法用例是UML模型中的术语,用例模型可用于描述软件需
18、求。用例驱动的软件开发方法是Rational统一开发过程(RUP)的核心内容,表1.4描述了Rational统一过程活动和所产生的相关模型。需求活动捕获客户需求并用用例模型进行描述,然后分析、设计系统产生分析和设计模型以满足用例,进而在实现模型中实现该系统,实现模型中包括所有的代码,即组件。4444第1章 导 论4545第1章 导 论1.4 CASE工具与集成化的软件开发环境工具是软件工程三要素之一,在软件工程过程中使用软件工具可以提高软件开发的效率,减低成本和提高质量。CASE工具可以被分为三类:工具、工作台和集成的软件开发环境,如表1.5所示。4646第1章 导 论4747第1章 导 论良
19、好的集成化开发环境一般具有以下特点:(1)具有软件工程数据库。数据库用于存储软件项目在生存周期中的全部信息,如项目合同、计划、进度、软件设计文档和测试计划等,集成开发环境中的各种工具均可对其访问。(2)具有项目管理机制,可进行任务的分解和进度控制。(3)具有版本控制和配置管理机制。(4)支持软件工程师之间的通信。4848第1章 导 论1.5 软件工程知识体系 SWEBOK将软件工程体系划分为10个知识域:软件需求、软件设计、软件构造、软件测试、软件维护、软件配置管理、软件工程管理、软件长程过程、软件工程工具与方法、软件质量。SWEBOK结构如表1.6所示。4949第1章 导 论5050第1章
20、导 论软件工程学科是一门交叉学科,运用了多学科的原理和方法,Daniel M.Berryd对软件工程有以下的定义:软件工程是这样的工程形式,它运用系统的、规范的、量化的方法和计算机科学、设计、工程、管理、数学、心理学、社会学等学科的原理,创建、开发、实施和维护有效成本、可靠的、高质量的软件问题解决方案。5151第1章 导 论本 章 小 结随着软件技术的发展,应用领域的扩展和软件规模及复杂性的增加,软件的开发越来越多地面临很多问题:软件开发无计划性、软件需求不充分、软件开发过程无规范、软件产品无评测手段。这些问题使得软件项目经常无法在预定的时间、经费内,保证质量的完成,称为软件危机。5252第1
21、章 导 论因此人们希望采用工程化的思想来指导软件开发,软件工程由此提出。软件工程是一门工程学科,采用系统和组织的方法、建立和使用一套合理的工程原则,将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护。软件工程包含三要素,方法、工具和过程。5353第1章 导 论软件工程方法提供如何构造软件的技术和语言用以支持软件的分析、设计和实现,工具为方法和语言提供自动化或半自动化的支持,过程则是用合适的方法、语言和工具由软件工程师进行软件活动的集合。典型的软件开发方法包括结构化开发方法和面向对象的开发方法。软件工程方法提供有效、高质量的软件开发支持,并可有效降低软件危机带来的影响。5454第1章
22、 导 论习 题1给出一些软件的例子,说明哪些是通用软件,哪些是定制软件?2书中有关软件的定义是否可应用于网站?请说明理由。3举例详细说明图1.1实际的失效曲线。4软件应该具有哪些属性?5软件质量是指什么?软件具有哪些质量特性(要素)?6如何评价软件质量?5555第1章 导 论7通过网络和其他途径查找其他软件危机的案例。8为什么要用工程化原则来指导软件开发?9软件生存期是指什么?软件过程包含哪些活动?10什么是软件工程?软件工程主要包含哪些要素?11说明结构化软件开发方法和面向对象方法之间的区别。12CASE在软件工程中有何意义?讨论CASE技术的引进是否会导致前所未有的劳动力市场的变化,或者至少临时性地取代了人们的工作。5656第1章 导 论13为什么面向开放的市场销售的通用软件产品的系统测试成本特别高?14为什么在现实中使用的软件系统必须变更,否则系统将变得越来越不适用?