-0-第1章软件工程概述-1-1.1计算机软件1、计算机硬件与软件计算机(Computer)由硬件(Hardware)和软件(Software)组成,软件是看得见、摸得着的电子机械设备,如机箱、主板、硬盘、光盘、U盘、电源、显示器、键盘、鼠标、打印机、电缆等。软件是依附在硬件上面的程序、数据和文档的集合,是指挥控制计算机系统(包括硬件系统和软件系统)工作的神经中枢。如果将硬件比作人的身体,那么软件就相当于人的神经中枢和知识才能。软件的分类比较复杂。分类方法不同,内容也不同,表1-1从5个不同角度对软件进行了分类。表1-1软件的分类序号分类方法软件内容1按功能分类系统软件(如操作系统)支撑软件(如数据库管理系统、CASE工具系统)应用软件(如信息系统)2按规模分类小型、中型、大型3按工作方式分类实时软件分时软件交互式软件批处理软件4按服务对象分类项目软件(为用户定制)产品软件(面向特定的客户群开发)5按销售方式分类订单软件(已签订合同)非订单软件(未签订合同)计算机工程(ComputerEngineering)有硬件工程(HardwareEngineering)和软件工程(SoftwareEngineering)组成。硬件工程是研究硬件产生和硬件管理的工程科学,其内容包括计算机网络硬件的分析、设计、生产、采购、验收、安装、培训、维护。软件工程是研究软件生产和软件管理的工程学科,其内容包括市场调研、正式立项、需求分析、项目策划、概要设计、详细设计、编程、测试、试运行、产品发布、用户培训、产品复制、实施、系统维护、版本升级。由于软件的生产和管理比硬件复杂,积累的经验不如硬件那么丰富,所以软件工程研究成为一个长期的热点。由于有这么多软件也需要选型、配置、采购、安装、调试,所以在今天,除了生产硬件的厂商外,纯粹的“硬件工程”几乎不存在,大多数硬件工程都与软件有关,于是就出现了一个新名词“网络工程”,它是介于硬件工程和软件工程质监的系统工程,人们有时也称它为“系统-2-集成工程”。2、软件定义为了弄清软件工程的概念,首先要了解程序和软件的概念。一般认为,程序是计算机为完成特定任务执行的指令的有序集合。站在应用的角度可以更通俗地理解为:面向过程的程序=算法+数据结构面向对象的程序=对象+消息面向构建的程序=构件+架构通常,软件有以下定义:软件=程序+数据+文档这里的“程序”,是对计算机任务的处理对象和处理过则的描述;这里的“文档”,是为了理解程序所需的详细描述性资料;这里的“数据”,主要是软件系统赖以运行的初始化数据。上述定义看起来很简单,实际上却来之不易。表1-2列出了美国人对软件定义的认识过程。知道今天,仍然有少数人认为:“软件就等于程序”。这些人在软件开发工程中,上来就写程序,而不是写文档。软件工程大师RogerSPressman对这些人提出了尖锐的批评:“越早开始写代码的人,就是越迟完成代码的人”。表1-2美国人对软件定义的认识过程年代对软件定义的认识20世纪50年代软件就等于程序,软件系统就是程序系统20世纪60年代软件等于程序+文档。这里的文档是指软件开发工程中的分析、设计、实现、测试、维护文档,不包括管理文档20世纪70年代软件等于程序+文档+数据。这里的数据不仅包括初始化数据、测试数据,还包括研发数据、运行数据、维护数据,也包括软件企业积累的项目工程数据和项目管理数据中的大量决策原始记录数据至于对管理文档的全面认识,那就更晚了。知道1974年,美国人才开始认识到软件需要管理。1984年,美国人开始认识到软件管理是一个过程管理,或是一个管理过程。1991年,出现了软件过程能力成熟度模型CMM(CapabilityMaturityModelforSoftware)1.0版,人们研究了软件过程管理的具体内容与方法,并将软件开发和管理中产生的各种文档叫做“软件工作产品”,而将最后交付给用户使用软件工作产品叫做“软件产品”。1996年,出现了统一建模语言UML0.9版,称软件管理文档为“管理制品”,称软件开发文档为“技术制品”,两者合称为“制-3-品(Artifact)”。3、文档的重要性文档在软件工程中特别重要,文档是否规范与齐全,是衡量软件企业是否成熟的重要性标志之一。软件文档分为开发文档和管理文档两大类。开发文档主要由项目组书写,用于指导软件开发与维护;管理文档主要由软件工程管理部门书写,用于指导软件管理和决策。两类文档的标准、规范和编制模板,全公司范围内要统一,这一工作由软件工程管理部门完成。开发文档是知道软件开发与维护的文档,开发与维护中所有的程序,都是按照开发文档的要求编写与实现的。软件工程规定:文档必须指导程序,而决不允许程序指挥文档;文档与程序必须保持高度一致,而决不允许程序脱离文档。开发文档本身具有严格的层次关系和依赖关系,这种关系反映在如下的覆盖关系之中,即有:《用户需求报告》覆盖《软件合同》/《软件任务书》。《需求规格说明书》覆盖《用户需求报告》。《概要设计说明书》覆盖《需求分析规格说明书》。《详细说明书》覆盖《概要设计说明书》。《源程序》覆盖《详细设计说明书》。《目标程序》覆盖《源程序》。管理文档本身具有严格的时序关系,这种时序关系反映在如下的软件工程中,而工程由一系列的时间序列所组成:需求分析过程管理文档。软件策划过程管理文档。软件设计过程管理文档。软件实现过程管理文档。软件测试过程管理文档。软件测试过程管理文档。软件维护过程管理文档。软件过程改进管理文档。成熟的软件企业,都有一套自己的开发文档和管理文档编写标准所编写模板,在企业内部严格执行。4、软件的最新定义-4-软件=知识+程序+数据+文档定义中增加了“知识”。对这一定义的讨论正在进行。正方认为:因为软件是知识在网络上的体现,所以这个定义非常好。反方认为:程序、数据、文档本身就是知识的载体与表现,所以这个定义有些画蛇添足的意味。1.2软件工程的定义软件工程(SoftwareEngineering,简称为SE)是针对软件这一具有特殊性质的产品的工程化方法。软件工程涵盖了软件生存周期的所有阶段,并提供了一整套工程化的方法,来指导软件人员的工作。“工程”是科学和数学的某种应用,通过这一应用,使自然界的物质和能源的特性能够通过各种结构、机器、产品、系统和过程,成为对人类有用的东西。因而,“软件工程”就是科学和数学的某种应用,通过这一应用,使计算机设备的能力借助于计算机程序、过程和有关文档成为对人类有用的东西。软件工程的成果是为软件设计和开发人员提供思想方法和工具,而软件开发是一项需要良好组织,严密管理且各方面人员配合协作的复杂工作。软件工程正是指导这项工程的一门科学。软件工程在过去一段时间内已经取得了长足的进展,可以说在软件的开发和应用中起到了其应有的作用。高质量的软件工程可以保证软件工业中生产的软件是高质量的产品、用户满意的产品。但是,对软件工程的界定,总是存在一定的差异。软件工程应该包括哪些知识?这里我们引用IEEE在软件工程知识体系指南(SEWBOK:GuidetotheSoftwareEngineeringBodyofKnowledge2004Version)中的定义,它是这样定义软件工程的:1)软件开发、实施、维护的系统化、规范化、质量化的方法的应用,也就是软件的应用工程2)对上述方法的研究。IEEE的软件工程知识体系指南(SWEBOK)中界定了软件工程的10个知识领域(KAs:KnowledgeAreas)即软件需求(Softwarerequirements)、软件设计(Softwaredesign)、软件构建(Softwareconstruction)、软件测试(Softwaretesting)、软件维护(Softwaremaintenance)、软件配置管理(Softwareconfigurationmanagement)、软件工程管理(Softwareengineeringmanagement)、软件工程过程(Softwareengineeringprocess)、软件工程工具和方法(Softwareengineeringtoolsandmethods)和软件质量(Softwarequality)。这10个知识领域的每个知识领域还包括很多子领域。-5-1.3软件工程的起源从时间角度看软件工程起源分为三个阶段。本世纪中期软件产业从零开始起步,在短短的50年的时间里迅速发展成为推动人类社会发展的龙头产业。随着信息产业的发展,软件对人类社会性越来越重要。软件发展的五十年历史中,人们对软件的认识经历了一个由浅到深的过程。第一个写软件的人是Ada(AugustaAdaLovelace),在1860年代他尝试为Babbage(CharlesBabbage)的机械式计算机写软件。尽管失败了,但他将永远载入了计算机发展的史册。1950年代,软件伴随着第一台电子计算机的问世诞生了。以写软件为职业的人也开始出现,他们多是经过训练的数学家和电子工程师。1960年代美国大学里开始出现授予计算机专业的学位,教人们写软件。软件发展的历史可以大致分为如下的三个阶段:第一个阶段是1950年代到1960年代,是程序设计阶段,基本是个体手工劳动的生产方式。这个时期,一个程序是为一个特定的目的而编制的,软件的通用性很有限的。软件往往带有强烈的个人色彩。早期的软件开发没有什么系统的方法可以遵循,软件设计是在某个人的头脑中完成的一个隐藏的过程。而且,除了源代码往往没有软件说明书等文档,因此这个时期尚无软件的概念,基本上只有程序、程序设计概念,不重视程序设计方法,主要是用于科学计算,规模很小、采用简单的工具(基本上采用低级语言),硬件的存储容量小、运行可靠性差。第二阶段是1960年代到1970年代,是软件设计阶段,小组合作生产方式。在这一时期软件开始作为一种产品被广泛使用,出现了“软件作坊”。这个阶段,基本采用高级语言开发工具,开始提出结构化方法。硬件的速度、容量、工作可靠性有明显提高,而且硬件的价格降低。人们开始使用产品软件(可购买),从而建立了软件的概念。程序员数量猛增,但是开发技术没有新的突破,软件开发的方法基本上仍然沿用早期的个体化软件开发方式,软件需求日趋复杂,维护的难度越来越大,开发成本令人吃惊地高,开发人员的开发技术不适应规模大、结构复杂的软件开发,失败的项目越来越多。第三个阶段是从1970年代止今,为软件工程时代,是工程化的生产方式。这个阶段的硬件向超高速、大容量、微型化以及网络化方向发展,第三、四代语言出现。数据库、开发工具、开发环境、网络、分布式、面向对象技术等工具方法都得到应用。软件开发技术有很大进步,但未能获得突破性进展,软件开发技术的进步一直未能满足发展的要求。软件的数量急剧膨胀,一些复杂的、大型的软件开发项目提出来了,在那个时代,很多的软件最后都得到了一个悲惨的结局。很多的软件项目开发时间大大超出了规划的时间表,一些项目导致了财产的流失,甚-6-至某些软件导致了人员伤亡。同时软件开发人员也发现软件开发的难度越来越大,在软件开发中遇到的问题找不到解决的办法,使问题积累起来,形成了尖锐的矛盾,失败的软件开发项目却屡见不鲜,因而导致了软件危机。软件危机指的是在计算机软件的开发和维护过程中所遇到的一系列严重问题。概括来说,软件危机包含两方面问题:一、如何开发软件,以满足不断增长,日趋复杂的需求;二、如何维护数量不断膨胀的软件产品。落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。最为突出的例子是美国IBM公司于1963年~1966年开发的IBM360系列机的操作系统。难怪该项目的负责人FredBrooks(F?D?希罗克斯)在总结该项目时无比沉痛地说:“……正像一只逃亡的野兽落到泥潭中作垂死挣扎,越是挣扎,陷得越深,最后无法逃脱灭顶的灾难,程序设计工作正像这样一个泥潭,一批批程序员被迫在泥潭中拼命挣扎,谁也没有料到问题竟会陷入这样的困境。”IBM360操作系统的历史教训已成为软件开发项目中的典型