1、内容简介软件工程作为支撑软件产业的新学科,其发展正方兴未艾。作者针对软件工程学科的特点,系统讲解软件工程的基本概念、原理与方法,全面介绍了软件工程的由来和软件开发模型,传统软件工程和面向对象软件工程的软件开发过程。全书内容组织分为准备篇、实施篇和实践篇,全书结构以项目为中心,以活动为基本单位,通过完成若干活动最终达到任务的完成,并以多个任务的完成而实现了项目的完成。全书共设计 36 个任务,每部分目标明确,重点突出。全书内容丰富,组织结构严谨,原理与方法相结合,丰富的图表与实例应用相结合,讲解由浅入深,既体现知识点的连贯性,完整性,又体现知识在实际中的应用,适合作为本科院校软件工程、计算机科学
2、技术、计算机应用、信息管理及相关专业的教材,也可供从事软件开发人员、科研人员以及有关大专院校师生的参考书。0前言随着计算机技术的不断发展及其在各领域的广泛应用,对软件产品出现供不应求的现象,因此我国目前急需开发高质量的软件产品,这样就需要大量的软件开发型人才。而软件工程这门学科就是为了培养软件开发的高级人才而开设的,它是指导软件生产和管理的一门新兴的、综合性的应用科学。但在软件工程教学方面,在沿袭了传统的教学手段、教学方法的基础上,作为一门新兴学科,必须要有不同于其他行业独特的一面,在教学方法和教材编写上需要推陈出新。然而,虽然目前国内软件工程教材品种繁多,但大部分不符合培养技能型紧缺人才的需
3、求,与软件企业实际开发相脱节。本书编著者从事软件开发与软件教学 30 余年,结合长期教学经验和工程项目实践,参考国内外众多最新(版本)教材和论文精选内容,改变现有的教材侧重理论、书中实例较少、内容不够集中的现状,以视野独特,构思新颖,内容风趣,不落窠臼,令人耳目一新的框架结构;注重基础性、系统性、实用性、新颖性,结合大量的软件项目分析实例,深入浅出的阐述了软件工程的具体内容。堪称难得,以至回味无穷。本教材力图做到改变软件工程教学抽象、单调、死板的现状的编写方法,以“任务驱动”教学为核心,构建了以“项目”为中心,以“任务”为中枢,以“活动”为最小单元来组织实施教学。将一个任务分解成若干个活动,每
4、一个教学活动有明确的目的,只有这些活动完成了,教学任务也就完成了,同时所有的任务完成也就使一个子项目结束了,只有将所有的子项目完成了,也就完成了整个软件工程的教学内容。在教材编写中,每一个子项目都有相应的目标和能力,同时给出了本项目的学习要点。对于项目的每个任务都包括需要解决的主要问题、任务目标及完成任务的途径;对于最小的教学单位活动都有活动内容和目标,同时对于每一活动、任务均有相应的习题和测评,用于评价学生的学习效果。在结构上通过引例创设教学情境,在 强 烈 的 问 题 动 机 驱 动 下 , 趣味性导入任务、活动或是项目,可 以 更 大 地 激 发 学 生 们 的 求 知 欲 望 , 逐
5、步 形 成 一 个感 知 心 智 活 动 的 良 性 循 环 , 从 而 培 养 学 生 独 立 探 索 、 勇 于 开 拓 进 取 的 自 学 能 力 。本教材由 3 篇共 36 个任务所构成,共包含着 103 个活动内容。第 1 篇准备篇,讲述了软件工程的由来,软件工程的重要性及软件开发模型。第 2 篇实施篇,分别讲述了软件工程的原理、方法和技术,包括传统的软件工程学和面向对象的软件工程中需求分析-软件设计-软件实现-软件测试及项目管理,并以实例说明。第 3 篇实践篇,完成了书后部分习题的解答,另一方面给出了一个实例完成了软件计划、分析、设计和测试的文档,这一部分对于提高学生软件工程实践起
6、到了关键性的作用。本书主要有以下特点:(1) 在保证体系完整性的基础上,不过度强调基础理论的深度和难度,坚持“够用为度”的原则。1(2)采用“任务驱动”的编写方式,任务以活动来构成,并以活动为最小教学单位,在部分内容上设置引例,以此增加教材的实用性和趣味性,这样能够活跃课堂气氛,又能达到满意的教学效果。(3)教材内容生动活泼,改变一般软件工程教材学生学起来枯燥的情况。(4)每一项目、任务和活动都有其目标和测评,学习有目的,并且能自己检验学习的效果。本教材是作者多年从事该领域工作,并参阅了大量文献和论著、期刊文献,以及与相关专家、学者及学生的交流中编写而成。本书由张兆印策划。任务任务 8 由张兆
7、印编写;任务 9任务 18 由邓琨编写;任务 19任务 25 由金英编写;任务 26任务 36 由惠丽编写;其余部分由张兆印编写。全书由张兆印统一修改定稿。由于作者水平有限,加上时间仓促,难免有错误和不妥之处,恳请读者批评指正。目录准备篇 1项目准备 软件工程概述 1任务 1 软件工程课程的重要性 .2活动 1 软件的定义 .2活动 2 软件危机 .3活动 3 软件工程的定义 .5活动 4 软件工程方法学的重要性 .6任务 2 软件生存周期的基本任务 .8活动 1 软件生存周期的定义与划分 .8活动 2 软件生存周期各阶段的主要任务 10任务 3 软件开发模型 .13活动 1 软件开发模型的定
8、义 13活动 2 瀑布模型 14活动 3 快速原型模型 16活动 4 增量模型 17活动 5 螺旋模型 23活动 6 喷泉模型 26活动 7 构件集成模型 27项目小结 .29习题 .29传统软件工程篇 33项目- 1 软件项目计划 33任务 4 问题定义 .34任务 5 可行性研究 .36活动 1 可行性研究的重要性 36活动 2 系统流程图 37活动 3 成本效益分析 .39活动 4 可行性研究的内容 43活动 5 可行性研究的步骤及相关技术 44项目小结 .50习题 .51项目- 2 结构化分析 53I任务 6 需求分析的任务与步骤 53活动 需求分析的任务 .54活动 需求分析的步骤
9、55任务 7 识别系统需求 .58活动 1 识别系统相关者 59活动 2 访谈的技术 60活动 3 观察系统物理工作流程 61活动 4 建立联合分析小组 62活动 5 快速原型 63任务 8 分析建模 .64活动 1 结构化分析模型 65活动 2 面向对象分析模型 66活动 3 数据流图 67活动 4 数据字典 73活动 5 加工说明(加工逻辑) .76活动 6 实体关系图 80活动 7 控制流图(CFD)与控制说明(CSPEC) 82活动 8 状态转换图 85活动 9 结构化分析实例 88项目小结 .90习题 .92项目- 3 结构化设计 97任务 9 结构化分析与设计的关系 .97任务 1
10、0 结构化设计的概念 .99活动 1 模块化 99活动 2 抽象 .101活动 3 逐步求精 .102活动 4 信息隐藏 .104活动 5 内聚 .105活动 6 耦合 .107活动 7 模块独立性 .110任务 11 结构化设计方法 .110活动 1 SC 图 111活动 2 数据流图的类型与 SD 方法的步骤 113活动 3 变换映射 .115II活动 4 事务映射 .120活动 5 结构化设计的优化规则 .123项目小结 .126习题 .126项目- 4 过程设计 129任务 12 过程设计的目的和任务 .129任务 13 过程设计的表达工具 .130活动 1 程序流程图 .131活动
11、2 N-S 图 .133活动 3 PAD 图 .135活动 4 PDL138任务 14 面向数据结构的分析设计方法 .140活动 1 Jackson 方法的应用范围 .140活动 2 Jackson 图基本结构 .141活动 3 Jackson 伪代码 .143活动 4 Jackson 方法的设计步骤 .144活动 5 Jackson 方法实例分析 145项目小结 .148习题 .149项目- 5 编码 151任务 15 编码和语言选择 .153活动 1 编码语言的选择 .154活动 2 编码风格 .156项目小结 .164习题 .164项目- 6 测试与纠错 165任务 16 软件测试基础
12、.166活动 1 测试的目的和任务 .166活动 2 测试的特性 .168活动 3 测试准则 .169活动 4 测试的种类 .170任务 17 黑盒测试技术 .172活动 1 黑盒测试的功能及应该考虑的几个问题 .172 活动测评 173III活动 2 等价分类法 .173活动 3 边界值分析法 .177活动 4 错误猜测法 .180任务 18 白盒测试法 .181活动 1 逻辑覆盖测试法 .181活动 2 路径测试法 .185活动 3 程序测试实例分析 .193任务 19 多模块程序的测试策略 .199活动 1 测试的层次性 .199活动 2 程序错误的类型 .201活动 3 单元测试 .2
13、03活动 4 集成测试 .207活动 5 确认测试 .211活动 6 系统测试 .212活动 7 终止测试的标准 .213任务 20 软件纠错 .214活动 1 纠错的策略 214活动 2 调试(纠错)的原则 217活动 3 常用的纠错技术 217项目小结 .220习题 .221面向对象软件工程篇 225项目- 7 面向对象分析 225任务 21 面向对象的相关概念 .226活动 1 对象 .226活动 2 类 .229活动 3 实例 .230活动 4 消息 .230活动 5 方法(Method) .231活动 6 属性(Attribute) 231活动 7 封装(Encapsulation)
14、 232活动 8 继承(Inheritance) 233活动 9 多态性(Polymorphism) .234活动 10 重载(Overloading) .235活动 11 结构与连接 235IV任务 22 面向对象分析过程 .237活动 1 三个子模型和五个层次 .238活动 2 OOA 过程 239活动 3 需求陈述 241任务 23 建立对象模型 .243活动 1 确定类与对象 .244活动 2 确定对象关系模型 .247活动 3 划分主题 .249活动 4 确定属性 .251活动 5 识别结构 .253任务 24 建立动态模型 .255活动 1 编写脚本 .256活动 2 建立事件跟踪
15、图 .258活动 3 确定状态转换图 .260任务 25 建立功能模型 .262活动 1 画出基本系统模型图 .262活动 2 画出功能级数据流图 .263活动 3 描述处理框功能 .264活动 4 定义服务 .265活动 5 面向对象分析实例 .266项目小结 .272习题 .273项目- 8 面向对象设计 275任务 26 面向对象设计的准则 .276任务 27 优化规则 .278任务 28 系统分解与组织 .281任务 29 问题域子系统(PDC)的设计 .283任务 30 人 机交互子系统(HIC)的设计 285任务 31 任务管理子系统的设计 .288任务 32 数据管理(DMC)子
16、系统设计 .291任务 33 类中服务的设计 .295项目小结 .297习题 .297项目- 9 面向对象实现 299任务 34 面向对象编程 .299活动 1 非面向对象的语言与面向对象的语言 .300V活动 2 面向对象语言的选择 .300活动 3 面向对象概念的编程实现 .301任务 35 面向对象测试 .304项目小结 .307习题 .307项目- 10 软件工程管理 308任务 36 软件工程管理软件估算模型 .308活动 1 软件估算模型 .308活动 2 人员的分配与组织 .312活动 3 项目进度安排 .315项目小结 .317习题 .317实践篇 319习题答案 .319软件
17、工程实验 .337附录一 中英文对照表 365参考文献 3686准备篇项目准备 软件工程概述本项目学习目标本项目是软件工程的基础,通过学习项目准备内容,可为后续项目的学习打下坚实的基础。通过对本项目内容的讲解,使学生在理解软件工程学重要性的基础上,掌握软件、软件工程的定义;掌握软件危机产生的原因,并知道如何预防软件危机;软件生存周期由哪些阶段组成,了解各阶段要完成的主要任务;深入了解有哪些软件开发模型,并清楚知道对于一个要开发的软件,究竟使用哪种软件开发模型更加合理。阅读本项目后,应具备如下能力 深刻体会软件工程学的重要性 明确软件生存周期各个阶段要完成的主要任务 对相关概念的理解能力 软件开
18、发模型的应用能力本项目学习要点 软件危机的主要表现 学习软件工程学的目的 软件开发生存周期 软件开发模型 引例提到软件开发,很多人认为就是坐在计算机前面编写代码。其实,编写代码仅仅是软件开发过程中一个很小的部分。举个例子来说,盖一座大楼时所涉及的工作不仅仅是砌砖和垒墙,还必须对建筑进行主体设计、绘制图纸、估算建筑成本、安排任务、验收建筑质量等。相同的道理,软件开发过程所涉及的环节和活动也不仅仅是编写代码这样简单。比如:在编码前,要了解编写的程序是为了解决一个什么样的问题,即实现什么样的功能,对于规模较大的软件,应该对该软件的系统架构进行整体的规划;编码完成之后,还要考虑采用什么样的方法和途径来
19、减少软件系统中存在的错误。软件产品交付给用户后,要考虑怎样对软件系统进行维护,以及在这个过程中如何保证软件产品质量等一系列问题。软件工程就是一门将所有与软件开发相关的活动归纳在一起,并形成系统的方法和理论的一门学科。项目准备这一部分主要讲述了软件工程的基本概念和软件工程学的重要性,软件生存周期的基本任务和软件开发模型这 3 个任务。任务 1 软件工程课程的重要性需解决的主要问题 你开发过软件吗?你知道应该如何开发一个软件吗?在一个软件开发活动中最重要7的是什么呢?你知道为什么要学习软件工程这门学科吗?要想知道这些内容就需要认真学习本任务。任务目标 通过对本任务的学习,掌握软件、软件工程、软件危
20、机和软件生存周期的定义,同时理解软件工程方法学的重要性。完成任务的途径 主要以提出概念为主,适当的时候以客观世界存在的已知事实或生活中的实例加以说明,以此增强其趣味性和适用性。活动 1 软件的定义活动内容: 有人认为程序就是软件,你认为这样对吗? 程序又是什么呢?程序一定是可以执行的吗? 文档就是文字资料吗?它的作用是什么呢? 数据又指的是什么呢?活动目标: 掌握软件和文档的含义; 了解软件和文档的意义。计算机通过运行程序来实现各种不同的应用。把各种不同功能的程序,包括用户为自己特定目的而编写的应用程序、检查和诊断机器系统的程序、支持用户应用程序运行的系统程序、管理和控制机器系统资源的程序等通
21、常称为软件。它是计算机系统中与硬件相互依存的另一部分,与硬件合为一体完成系统的功能。在上世纪 90 年代之前,有些初学者认为软件就是程序,其实这个理解是不完全正确的,软件离不开程序,但程序并不是软件的全部。这里引用著名的美国软件工程教材作者R.S.Pressman 对于软件的定义:“软件是能够完成预定功能和性能的可执行的计算机程序和使程序正常执行所需的数据,加上描述程序的操作和使用的文档” 。简明地表述,可以写作“软件程序+数据+文档” 。 活动测评 何为软件? 何为文档?软件:软件是能够完成预定功能和性能的可执行的计算机程序和使程序正常执行所需的数据,加上描述程序的操作和使用的文档。程 序
22、: 是 为 了 解 决 某 个 特 定 问 题 而 用 程 序 设 计 语 言 编 写 的 适 合 计 算 机 处 理 的 语 句 序 列 。文档(即各种报告、说明、手册的总称):是软件开发的记录,主要供人们阅读,既可以用于专业人员和用户之间的通信与交流,也可以用于软件开发过程的管理和运行阶段的维护。数据:使程序正常运行所需要的输入信息。8活动 2 软件危机活动内容: 你知道什么是软件危机吗? 软件危机主要表现在哪些方面呢?活动目标: 掌握软件危机的定义; 熟知软件危机的主要表现。 引例1963 年,美国用于控制火星探测器计算机软件中的一个“, ”号被误写为“ ”,最终致使飞往火星的探测器发生
23、爆炸,造成高达数亿美元的损失。美国 IBM 公司于 1963-1966 年开发了 IBM360 系列机的操作系统,该操作系统花了约5000 人年的工作量,最多时,有 1000 人投入开发工作,写出近 100 万行的源程序。尽管投入了这么多的人力和物力,得到的结果却极其糟糕。据统计,这个操作系统每次发行的新版本都是从前一版本中找出 1000 个程序错误而修正的结果。该项目负责人在项目结束后的总结中写到:“正像一只逃亡的野兽落到泥潭中做垂死挣扎,越是挣扎,陷得越深,最后无法逃脱灭顶的灾难程序设计工作正像这样一个泥潭一批批程序员被迫在泥潭中挣扎谁也没有料到问题竟会陷入这样的困境” 。上面提到的两个事
24、件,在软件开发历史进程中可谓赫赫有名,直到今天,软件开发者仍然常常提起它们。遗憾的是,这并非是因为它们给软件开发者带来荣耀或灵感,而是因为人们要借助于它们的失败,给后世的软件开发者以警醒和教训。在 20 世纪 70 年代之前,这类事件并不罕见。并且随着软件规模的扩大、软件复杂度的增强,类似事件越来越多。后来,人们知道,这一切都是由游荡在软件世界里的幽灵“软件危机”造成的。软件危机:软件危机是指软件开发和维护过程中遇到的一系列严重问题,长期找不到解决这些问题的办法,使得问题逐渐积累起来,形成了尖锐的矛盾,从而导致了软件危机。软件危机包含下面两方面的问题:其一是如何开发软件来满足软件日益增长的需求
25、;其二是如何维护软件。具体的说,软件危机有以下主要表现:1. 对软件开发成本和进度的估计常常不是很准确。大型软件的开发费用经常超出预算,完成时间也常常脱期,延期几个月甚至几年的现象并不罕见。2. 用户对“已完成的”软件系统不满意的现象经常发生。为了赶进度或是节约成本所采取的一些办法往往损害了软件产品的质量。软件开发人员在对用户的需求只有模糊的了解,甚至对所要解决的问题还没有确切认识的情况下就着手编程序。软件开发人员和用户之间的信息交流往往很不充分,“闭门造车”必然导致最终产品不符合用户的实际需要。3. 软件产品的质量往往靠不住。软件可靠性和质量保证的定量概念刚刚出现不久,软件质量保证技术还没有
26、坚持不懈地应用到软件开发的全过程中,这些都导致软件产品发生质量问题。4. 软 件 通 常 没 有 适 当 的 文 档 资 料 。 计 算 机 软 件 不 仅 只 有 程 序 , 还 应 该 有 一 整 套 文 档 资 料 。5. 软件规模的增长,增加了它的复杂度。【例 1.1】1968 年美国航空公司订票系统达到 30 万条指令。9【例 1.2】IBM360 OS 第 16 版达到 100 万条指令,花了 5000 个人年。【例 1.3】1973 年美国阿波罗计划达到 1 千万条指令。6. 软件开发生产率提高的速度,远远跟不上计算机应用普及深入的趋势,软件产品“供不应求”的现象使人类不能充分利
27、用现代计算机硬件提供的巨大潜力。7. 软件维护费用急剧上升,直接威胁计算机应用的扩大。软件维护费用大约占到软件总花费的 2/3,比开发费用高出一倍。维护费用既耗费财力,也耗费人力。8. 软件成本在计算机系统总成本中所占的比例逐年上升,如图 1.1 所示。图 1.1 硬件/软件成本变化趋势以上列举的仅仅是软件危机的一些明显的表现,与软件开发和维护有关的问题远远不止这些。 活动测评 何为软件危机? 软件危机有哪些主要表现?活动 3 软件工程的定义活动内容: 软件工程这个概念是在有软件之日起就有了吗?它是怎么形成的呢? 活动目标: 准确掌握软件工程的确切定义并理解其含义。首先,采用工程化方法和途径来
28、开发与维护软件。软件开发应是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目,必须充分吸收和借鉴人类长期以来从事各种工程项目所积累的行之有效的原理、概念、技术和方法。应该推广使用在实践中总结出来的软件开发的成功技术和方法,并且研究探索更好更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的一些错误概念和做法。下面给出软件工程在不同阶段的几个定义:1983 年 IEEE 给软件工程定义是:“软件工程是开发、运行、维护和修复软件的系统方法。”这个定义主要强调软件工程是系统方法而不是某种神秘的个人技巧。Fairly 认为:“软件工程学是为了在成本限额以内按时完成开发和修改软件产品所
29、需要的系统生产和维护技术及管理学科。”这个定义明确指出了软件工程的目标是在成本限额内按时完成开发和修改软件的工作,同时也指出了软件工程包含技术和管理两方面的内容。10Fritz Bauer 给出了下述定义:“软件工程是为了经济地获得可靠的且能在实际机器上有效运行的软件,而建立和使用完善的工程化原则。”这个定义不仅指出软件工程的目标是经济地开发出高质量的软件,而且强调了软件工程是一门工程学科,它应该建立并使用完善的工程化原则。1993 年 IEEE 进一步给出了一个更全面的定义:软件工程是:把系统化的、规范的、可度量的途径应用于软件开发、运行和维护的过程,也就是把工程化应用于软件中;研究中提到的
30、途径。认真研究上述这些关于软件工程的定义,有助于我们建立起对软件工程这门工程学科全面的整体性认识。 活动测评 软件工程的含义是什么?软件工程:采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以便经济地开发出高质量的软件并有效地维护它,这就是软件工程。活动 4 软件工程方法学的重要性活动内容: 应该知道软件工程方法学的三要素,弄清楚为什么要学习软件工程。 软 件 工 程 这 门 学 科 只 对 软 件 开 发 有 用 吗 ? 对 于 指 导 日 常 工 作 、 学 习 与 处 事 有 帮 助 吗 ?活动目标: 掌握软件工
31、程在软件开发,运行和维护过程中的重要性; 掌握软件工程在日常生活中的重要性。 引例有这样一个笑话:一个旅客走进硅谷的一家宠物店,浏览展示的宠物。这时,走进一个顾客,对店主说:“我要买一只 C 猴。 ”店主点了点头,走到商店一头的兽笼边,抓出一只猴,递给顾客,说:“总共 5000 美元。 ”顾客付完款,然后带走了他的猴子。有位顾客非常惊讶,走到店主跟前说:“那只猴子也太贵了!”店主说:“那只猴子能用 C 编程,非常快,代码紧凑高效,所以值那么多钱。 ”这时,这位旅客看到了笼子中的另一只猴子,它标价 10000 美元。于是又问:“那只更贵了!它能做什么?”店主回答:“哦,那是一只C+猴,它会面向对
32、象的编程,会用 Visual C+,还懂得一点 Java,是非常有用的。 ”顾客又逛了一会儿,发现了第三只猴子,它独占一个笼子,脖子上的标价是 50000 美元。旅客倒抽一口气,问道:“那只猴子比其他所有猴子加起来都贵!它究竟能做什么?”店主说:“它一种语言也不会,不过它是系统分析师。 ”系统分析师为什么这样重要, 在本活动中介绍的软件工程学就是为了培养软件系统分析师所做的准备。但首先要弄清楚为什么要学习软件工程学。1. 软件工程方法学的三个要素软件工程方法学包括三个要素,即方法、工具和过程。软件工程过程定义了技术方法的采用、工程产品(包括模型、文档、数据、报告、表格等)的产生、质量的保证和变
33、更的管理,从而将人员、技术、组织与管理有机地结合在11一起,实现在规定的时间和预算内开发高质量软件的目标。软件工程方法为软件开发提供了“如何做”的技术,通常包括某种语言或图形的模型表示方法、良好的设计实践以及质量保证标准等。软件工程工具为软件工程方法提供了自动的或半自动的软件支撑环境,辅助软件开发任务的完成。现有的软件工具覆盖了从需求分析、系统建模、代码生成、程序调试和软件测试等多个方面,形成了集成化的软件工程开发环境 CASE。2. 为什么要学习软件工程学计算机专业包括两大方向,一个是硬件,一个是软件。硬件专业主要就业方向是从事计算机维护、计算机控制系统电路设计以及计算机硬件系统的设计。可计
34、算机硬件维护需用人才相对很少,一般情况下硬件很少出故障,又由于计算机的高集成度,所以出现故障也难以修复,一般来说只是利用新的硬件进行替换处理。计算机硬件系统的设计所需要的人力非常少。随着科学技术的不断发展,对于软件,尤其是对应用软件需要不断增加,所以需要大量的软件开发型人才。有人错误的认为软件开发就是编程序。这可是错误的理解,软件离不开程序,而程序只是软件的一个主要载体。想像一下,假如一个软件有几万行、几十万行、甚至是百万行和千万行的源程序呢,一个人或几个人是无法完成的,需要的时间也有长达几年的。这样的软件只会编程能完成吗?可以做个不恰当的比喻,现在盖一栋大楼,会编程序就相当于会砌砖,你能说会
35、砌砖就能建起摩天大厦吗?其实建一个摩天大厦最主要的是设计人员。做为软件开发行业主要有程序员,系统分析员,软件设计工程师,软件工程师,以及项目经理等多种职业。要想当一个好的程序员就要学习软件工程的编码这一部分。要当好系统分析员,就要认真学习软件需求分析,要想做好软件设计工程师就得学好软件设计,要想做好软件测试工程师就得学好软件测试的内容,要想做好项目经理就要学习项目计划、可行性研究和项目管理这些内容。总之只有学好软件工程学才有可能胜任这些工作。其实编程除了计算机专业外,理工科学生都能编程序,你的特长在哪里呢?那就是你学习了怎样开发软件和维护软件及怎样对软件开发过程进行控制。 活动测评 软件工程的
36、三要素是什么? 为什么要学习软件工程学? 任务小结 本任务围绕着为什么要学习软件工程而给出了相关的定义,理解软件危机、软件工程的概念,开设软件工程这门学科的重要性,了解软件危机主要有哪些表现,以及软件工程学在软件开发、运行和维护中的重要作用,它对人们的日常生活有什么样的意义。 任务测评 文档在软件开发和维护过程中的重要作用是什么? 怎样才有可能降低或消除软件危机?软件工程的三要素:即方法、工具和过程。12任务 2 软件生存周期的基本任务当你确定要开发一个软件时,你就得首先知道开发一个软件的全过程需要经过哪些阶段,每一阶段的主要任务是什么,只有知道了这些才有可能确定开发计划的安排。需解决的主要问
37、题 弄清软件生存周期的基本概念和各阶段的基本任务。任务目标 熟练掌握软件生存周期分哪几个时期,熟知每个时期有哪几个阶段,明确每个阶段的主要任务。完成任务的途径 通过现实生活中的实例来说明并理解软件生存周期及软件生存周期各个阶段要完成的主要任务。活动 1 软件生存周期的定义与划分活动内容: 软 件 生 存 周 期 的 定 义 ; 软 件 生 存 周 期 分 成 哪 几 个 时 期 ; 每 个 时 期 分 成 哪 几 个 阶 段 。活动目标: 熟练掌握软件生存周期有哪几个阶段?各阶段间的关系是什么?任 何 有 生 命 的 动 物 、 植 物 和 人 , 都 有 一 个 生 存 周 期 。 例 如
38、, 人 的 生 存 周 期 如 表1-1 所 示 。表 1-1 人的生存周期周期序号 周期划分 周期名称 周期的主要活动1 妊娠和分娩 胎儿 定期到妇幼保健院或妇产科医院检查2 0-3 岁 婴儿 请保姆看护或上托儿所3 3-6 岁 幼儿 上幼儿园4 6-12 岁 儿童 上小学,好好学习,天天向上5 12-18 岁 少年 上中学,参加中考、高考,自古英雄出少年6 18-30 岁 青年 上大学、攻读硕士、博士学位、应聘就业7 30-60 岁 中年 上班,追求事业上的成就、成功、贡献8 60 岁以上 老年 退休,老有所乐,写回忆录,立遗嘱9 因故因病去世 死亡 丧事从简,长眠于地下即使是没有生命的事
39、物或实体,例如,计算机、汽车、房子等都有一个生存周期,这个生存周期就是它们的使用寿命,即使用周期。软件生存周期就是从提出计划开发软件产品开始,直到该软件产品被淘汰的全过程。软件生存周期一般划分为计划、开发和运行 3 个时期,每个时期又区分为若干阶段。计划时期有问题定义和可行性研究两个阶段。开发时期有需求分析、系统设计(包括总体设计和详细设计) 、编码和测试 4 个阶段,后两个阶段为系统实现。运行时期主要是系统维护阶段。这个阶段的主要任务是使软件持久地满足用户的需要。具体地说,当软件在使用过程中发现错误时应该加以改正;当环境改变时应该修改软件以适应新的环境;当用户有新要求时应该及时改进软件以满足
40、用户的新需要。13图 1.2 列出了一个典型的软件生存周期。研究软件生存周期是为了更科学、更有效地组织和管理软件的生产,从而使软件产品更可靠、更经济。采用软件生存周期来使软件开发分阶段依次进行。前一个阶段任务的完成是后一个阶段任务的前提和基础,而后一阶段的开始与结束都有严格的标准,每一个阶段结束之前都要接受严格的技术和管理评审。每一阶段的任务相对独立,有利于简化问题且便于不同人员分工协作。其严格而科学的评审制度保证了软件的质量,提高了软件的可维护性,从而大大提高了软件开发的成功率和生产率。 活动测评 软件生存周期的定义?各阶段之间的关系是什么?问 题 定 义可 行 性 研 究需 求 分 析软
41、件 设 计编 码测 试维 护计 划 时 期运 行 时 期开 发 时 期图 1.2 典型的软件生存周期活动 2 软件生存周期各阶段的主要任务活动内容: 你 知 道 软 件 生 存 周 期 的 各 个 阶 段 的 主 要 任 务 是 什 么 吗 ? 能 用 自 己 的 语 言 表 述 清 楚 吗 ?活动目标: 熟练掌握软件生存周期各个阶段的主要任务。1. 问题定义这是计划时期的第一步,这一阶段的主要任务是弄清“用户需要计算机解决什么问题” ,如果不知道问题是什么就试图解决这个问题,显然这种做法是盲目的,只会白白浪费时间和金钱,最终得出的结论可能是毫无意义的。例如,在专业设置上,如果培养目标不明确,
42、则培养出来的学生也一定难以符合社会的需要与认可。只有在向社会做了大量的调研,了解就业需求后,根据需求设置专业,并制定培养目标、设计培养方案和教学计划,按照教学计划组织教学与管理,才可能培养出社会需要的人才。相反如果不做调研,盲目开设专业必然导致培养的学生就业难或无法就软件生存周期:从提出计划开发软件产品开始,直到该软件产品被淘汰的全过程。14业的现象。对于一个软件来说,首先通过对客户的访问调查,系统分析员扼要地写出关于问题性质、工程目标和工程规模的书面报告,经过讨论和必要的修改,这份报告在得到客户的确认后,才可进入到下一阶段的可行性研究。2. 可行性研究这个阶段是为前一步提出的问题寻求一种到多
43、种在技术上可行、且在经济上有较高效益的可操作解决方案。为此,系统分析员应在高层次上作一次大大简化了的需求分析与概要设计,并写出“可行性论证报告”是最为重要的。这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决方法。例如,一个人想研发一个给自行车安装计程器的产品,没有研究经济效益,结果生产出来了没有人买,只有自己的自行车安装上了,所有的投入一去不复返。这说明经济上是不可行的。又如,一个人想炒股票,但没有炒股票的方法与技术,看到别人炒股票挣钱,他也去炒,结果将自己多年的积蓄全部赔了进去。这说明了技术上是不可行的。可行性研究的结果是让部门负责人做出是否继续
44、进行这项工程决定的重要依据,一般来说,只有投资可能获得较大效益的那些工程项目才值得继续进行下去,可行性研究以后的那些阶段将需要投入更多的人力和物力。及时终止不值得投资的工程项目,可以避免更大的浪费。3. 需求分析这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题目标系统必须做什么” ,这个阶段的主要任务是确定目标系统必须具备哪些功能。对于用户来说,通常不能准确地表达出他们的要求,更不知道应该怎么利用计算机来解决他们的问题,另一方面,软件开发人员虽然知道怎样用软件实现用户的要求,但对用户的具体要求并不完全清楚。因此在分析阶段系统分析员必须与用户合作,相互配合,充分交流与交换意
45、见,最终获得用户对软件的需求,并由系统分析员来完成系统逻辑模型的建立。对于传统的软件工程来说系统逻辑模型通常包括数据流图、数据字典和简要的算法逻辑说明。而对于面向对象的软件工程来说是用例图、类对象模型、对象关系模型、以及事件轨迹图和状态转换图等。这个阶段的一项重要任务是必须准确完整地体现用户的要求,并用正式文档准确地记录对目标系统的需求,这份文档就称为需求规格说明书。4. 概要设计这一阶段解决的主要问题是“应该怎样实现这个目标系统” ,建立可行性设计方案。首先,应该设计出实现目标系统的几种可能方案,方案的制定可根据软件开发的成本来划分,应该设计出低成本、中等成本和高成本 3 种设计方案,软件工
46、程师应该能用适当的表达工具描述每种方案,分析每种方案的优缺点,并在充分权衡各种方案的基础上,推荐一个最佳方案。此外还应该制定出实现最佳方案的详细计划。如果客户接受所推荐方案,则应该进一步完成下述的另一项主要任务。这一阶段要解决的另一个主要任务是“软件体系结构的设计” 。即将需求分析阶段建立的逻辑模型转换成设计阶段的体系结构模型,软件体系结构设计的一条基本原则就是“程序模块化” ,也就是把一个程序划分为若干个规模适中的模块,按合理的层次结构组织而成一个软件系统。155. 详细设计这个阶段的任务还不是编写程序,它的关键问题是“应该怎样具体实现这个目标系统” 。设计每个模块,确定实现模块功能所需要的
47、算法和数据结构。可以使用程序流程图、PAD图、PDL 语言及伪代码等表达工具进行描述。6. 编码和单元测试编码的目的是选定确定的程序设计语言,将模块的过程性描述翻译成用该语言所书写的源程序。这个阶段的主要任务是写出正确的、容易维护的程序模块。单元测试是对每一个程序模块按照某种测试策略给出测试用例。单元测试是非常重要的,这部分的测试用例选择主要由程序员来完成,因为这些程序模块是由他们完成的,他们最清楚模块的程序结构和模块功能。7. 综合测试这 个 阶 段 的 关 键 任 务 是 通 过 各 种 类 型 的 测 试 ( 及 相 应 的 调 试 ) 使 软 件 达 到 预 定 的 要 求 。最基本的
48、测试包括集成测试和确认测试。集成测试是根据设计的软件结构,把经过单元检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试。验收测试:按照规格说明书的规定(通常在需求分析阶段确定) ,由用户(或在用户积极参与下)对目标系统进行验收。应该用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来,作为软件配置的一个组成部分。8. 软件维护维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。通常有 4 类维护活动,他们分别是:改正性维护:诊断和改正在使用过程中发现的软件错误适应性维护:修改软件以适应环境的变化完善性维护:根据用户的要求改进或扩充软件使它更完善
49、预防性维护:修改软件为将来的维护活动预先做准备虽然没有把维护阶段进一步划分成更小的阶段,但是实际上每一项维护活动都应该经过提出要求(或问题报告)分析维护要求提出维护方案审批维护方案确定维护计划修改软件设计修改程序测试程序复查验收等一系列步骤,因此实质上是经历了一次压缩和简化了的软件定义和开发的全过程。每一项维护活动都应该准确地记录下来,作为正式的文档资料加以保存。 活动测评 软件生存周期各阶段的主要任务? 任务小结 本任务围绕着软件生存周期这 8 个阶段说明了各阶段主要完成的任务。前一个任务的完成是后一个阶段的开始。强调可行性研究的重要性,而可行性要有几套可行的设计方案,对于商业软件要重点研究其软件开发的经济可行性。对于软件需求分析,主要弄明白需求分析它对于软件是否能开发成功所起的关键作用,不进行需求分析就开发软件其成功性会低之又低。弄清软件设计对于软件结构好坏的影响是非常重要的,这方面包括体系结构的设计,16算法设计及用户界面设计等内容。软件测试对于软件