关于我们
书单推荐
新书推荐
|
软件工程基础与应用
本书第2版选择学生广为熟知的案例为导引, 系统地介绍软件工程的基本概念、软件生命周期、需求的获取及可行性研究的内容, 特别是结构化方法、面向对象技术与UM建模等主流开发方法的基本原理、特点、一般工具及其在项目开发过程中的具体运用, 以及软件测试的常用方法、项目管理的一般知识等。
序
软件工程学科的发展有其历史的必然。近半个世纪以来,随着通信、计算机、网络应用的普及,作为其灵魂的软件的开发显得越来越重要。无数的反例证明,如果软件产品的质量达不到要求,带来的损失是极其严重的。为保证或提高软件产品的质量,最关键的问题就是从技术和管理两方面双管齐下,使用得到实际考验的一系列最佳软件开发实践,作为我们工作的指导原则,切实做好软件开发的各项活动。 有人讲,软件工程课程学不学没有用处。事实上是这样吗?绝对不是。我在给清华大学计算机系的工程硕士上软件工程课的时候,他们说,他们上的所有课程中,这门课最有用。因为他们都是从事软件开发多年的在职研究生,他们反映,多年来困惑他们的很多问题,从课程中都能找到对应的解决方法。有时,看上去是一句普通的“原则”,在实践上却能解决大问题。所以,虽然课本中讲了许多条条框框,其实都是有其实践背景的。 还有人讲,软件工程这门课程太枯燥,听不懂,做不会,学习起来提不起兴趣。这就是学习方法问题了。软件工程有一条主线,即软件生命周期过程。它的特点是分阶段、有迭代。 从软件开发方法来看,不论是传统的结构化方法,还是面向对象方法,或新的面向服务架构,它们都有各自的适用领域,有不同的视角、不同的活动组织方式和不同的架构。 从软件工程过程来看,最基本的是开发过程、运行过程和维护过程,此外还有各种支持过程和组织过程,它们为基本过程提供辅助支持和各种保证。 从软件工程管理来看,有整体管理,包括启动、计划、执行、控制和收尾5大过程,此外,还要考虑需求、成本、进度、质量、人员、沟通和风险等方面的管理活动。 如果我们明确了软件工程的主要方面,就可以有目的、系统地进行课程的学习了。 总之,对于软件工程,应首先想到它是有用的,也可能将来工作后用不到操作系统原理、计算机原理等课程所讲的内容,但只要是从事软件开发,软件工程就是回避不了的。其次,要有它不难学的思想。关键是对将来自己工作的领域要有规划,找准方向,有针对性地学习。特别地,由于社会需求〖1〗软件工程基础与应用(第2版)序[3]〖3〗是不断变化的,软件开发技术是不断进步的,软件开发工具是层出不穷的,我们不要一味追求新的,而应该从最成熟、最可靠的技术和工具学起。在学校里打好基础,将来在工作中就很容易接受新东西。 马小军老师从事软件工程的教学已经20多年了,我与她的相识是在20世纪90年代初她听我的软件工程课的时候。她是一位对工作很认真的老师,在这么多年的教学中已经积累了丰富的教学经验,并领导了许多软件开发项目,从如何培养应用型技术人才角度出发,对软件工程的教学体系、课程内容选材和实践活动组织等各方面都有很好的想法,这本教材的编写就体现了她的教学思路和多年教学的体会,有理论,有案例,全书在内容组织方面注重科学性和系统性,在行文叙述方面颇具简洁性和可读性。我推荐同学们认真阅读,切实领会其实质,不断进步。 清华大学计算机系教授殷人昆 2013年7月
第1章概述/1
1.1软件的基本概念及特点1 1.1.1软件是什么1 1.1.2软件的分类3 1.1.3软件的发展5 1.2软件工程的提出6 1.2.1软件工程提出的导火索6 1.2.2软件工程的原理8 1.2.3软件工程的目标9 1.3软件开发方法10 1.3.1结构化方法10 1.3.2原型化方法11 1.3.3面向对象方法12 1.3.4敏捷开发方法13 1.4软件工程师的职业道德与素质14 本章小结15 习题16 第2章软件生存周期模型/17 2.1软件生存周期及其组成17 2.1.1软件生存周期的概念和提出的意义17 2.1.2软件生存周期的划分与组成18 2.2软件开发模型19 2.2.1瀑布模型20 2.2.2快速原型模型21 2.2.3增量模型22 2.2.4螺旋模型22 2.2.5喷泉模型23 2.3常用软件建模工具24 2.3.1Microsoft Visio24〖1〗软件工程基础与应用(第2版)目录[3]〖3〗2.3.2Rational Rose27 本章小结28 习题29 第3章用户需求调研与可行性分析/30 3.1用户需求调研30 3.1.1关于需求30 3.1.2用户需求调研的必要性30 3.1.3需求调研方法32 3.1.4调研内容和步骤32 3.2业务描述35 3.2.1业务流程定义35 3.2.2业务流程图36 3.3软件项目可行性分析39 3.4成本/效益分析41 3.4.1软件开发成本估算41 3.4.2软件效益分析42 本章小结44 习题44 第4章基于结构化方法的需求分析/45 4.1需求分析简述45 4.1.1何为需求分析45 4.1.2需求分析的主要任务46 4.1.3需求分析的原则47 4.1.4需求分析方法的分类48 4.2结构化分析48 4.2.1结构化分析的特点和原则48 4.2.2结构化分析的主要工具49 4.3数据流程图的构建50 4.3.1构建数据流程图的作用50 4.3.2数据流程图的基本符号51 4.3.3构建数据流程图的步骤52 4.3.4构建数据流程图需要注意的问题53 4.4数据字典56 4.4.1构建数据字典的意义和用途56 4.4.2数据字典的主要内容56 4.4.3构建数据字典使用的符号57 4.4.4数据字典举例58 4.5结构化分析建模综合举例58 4.5.1系统数据流程图58 4.5.2系统数据字典61 本章小结64 习题64 第5章系统概要设计/66 5.1简述66 5.1.1概要设计基本任务66 5.1.2概要设计基本方法67 5.2概要设计基本原理69 5.2.1模块化69 5.2.2抽象70 5.2.3逐步求精70 5.2.4信息隐藏和局部化71 5.2.5模块独立性71 5.3结构化系统设计74 5.3.1软件结构图种形式74 5.3.2数据流程图的分类75 5.3.3变换型设计76 5.3.4事务型设计77 5.4软件结构的其他描述工具——HIPO图81 5.5软件结构的优化准则83 5.6结构化设计综合举例85 本章小结88 习题88 第6章详细设计与编码实现/90 6.1详细设计的基本任务90 6.2详细设计的常用工具90 6.2.1程序流程图91 6.2.2盒图92 6.2.3PAD图93 6.2.4判定表与判定树93 6.2.5过程设计语言的使用95 6.3人机界面的设计96 6.3.1人机界面一般风格97 6.3.2人机界面设计原则及相关问题99 6.3.3人机界面设计过程100 6.4详细设计综合举例100 6.4.1人机界面100 6.4.2数据库表设计101 6.4.3模块设计103 6.5编码实现106 6.5.1编码工具介绍106 6.5.2编码工具的选择107 6.5.3编码原则107 6.5.4编码举例108 本章小结111 习题112 第7章面向对象技术/113 7.1面向对象概述113 7.1.1面向对象提出的背景113 7.1.2面向对象方法简介114 7.1.3面向对象基本概念115 7.1.4面向对象的特征118 7.2面向对象分析119 7.2.1面向对象分析任务概述119 7.2.2面向对象分析模型120 7.2.3面向对象分析过程126 7.3面向对象设计128 7.3.1面向对象设计任务128 7.3.2面向对象设计与面向对象分析的关系129 7.3.3面向对象设计基本原则130 7.3.4面向对象设计模型132 7.3.5面向对象设计过程132 本章小结135 习题135 第8章UML建模/137 8.1UML概述137 8.1.1发展历史137 8.1.2UML简介138 8.1.3视图138 8.1.4UML中的图139 8.2用例模型的构建140 8.2.1用例图的模型元素141 8.2.2确定参与者142 8.2.3确定用例142 8.3静态模型的构建146 8.3.1类图和对象图146 8.3.2标识类的方法150 8.3.3包图153 8.4动态模型的构建156 8.4.1顺序图156 8.4.2协作图157 8.4.3状态图和活动图158 8.5物理体系结构的构建161 8.5.1组件图161 8.5.2部署图162 8.6综合实例163 8.6.1系统分析163 8.6.2系统设计172 8.6.3物理结构设计176 本章小结180 习题181 第9章测试与维护/183 9.1软件测试简介183 9.1.1测试定义183 9.1.2软件测试的原则184 9.1.3软件测试的对象185 9.2软件测试模型185 9.2.1V模型185 9.2.2W模型186 9.3软件测试的一般过程187 9.3.1测试需求分析阶段187 9.3.2测试计划阶段187 9.3.3测试方案设计阶段188 9.3.4测试用例实现阶段188 9.3.5测试执行阶段188 9.3.6评价与关闭阶段189 9.4软件测试常用方法189 9.4.1黑盒测试与白盒测试189 9.4.2黑盒测试法189 9.4.3白盒测试法194 9.5面向对象测试197 9.6软件测试自动化与测试工具199 9.6.1软件测试自动化199 9.6.2软件测试工具200 9.7软件调试201 9.7.1软件调试基本概念201 9.7.2软件测试和软件调试的区别201 9.7.3软件调试的步骤201 9.7.4软件调试方法202 9.8软件维护203 9.8.1软件维护的定义203 9.8.2影响维护工作量的因素203 9.8.3软件维护成本204 9.8.4软件维护过程204 9.8.5软件的可维护性与提高方法206 本章小结207 习题207 第10章软件项目管理/209 10.1软件规模估算209 10.1.1软件规模估算概述209 10.1.2软件规模估算常用方法210 10.2风险管理211 10.2.1软件项目风险定义及管理重要性211 10.2.2风险识别212 10.2.3风险分析及量化212 10.2.4风险应对计划212 10.2.5风险监控213 10.3人员组织213 10.3.1团队管理概述213 10.3.2软件项目组织计划213 10.3.3项目组织形式214 10.3.4团队的组建215 10.3.5团队合作与沟通217 10.4进度管理217 10.4.1进度管理定义217 10.4.2进度管理过程217 10.4.3软件项目任务分解218 10.4.4软件项目进度计划219 10.4.5进度控制223 10.5质量管理224 10.5.1软件质量的定义224 10.5.2软件质量模型225 10.5.3软件质量保证226 10.5.4软件质量控制226 本章小结228 习题228 参考文献/230
第5章系统概要设计需求分析中得到的系统分析模型解决了“系统必须做什么”的问题,而“系统怎么做”是由系统概要设计来完成的。概要设计的基本目的就是回答“系统应该如何实现?”这个问题。通过这个阶段的工作将划分出组成系统的物理元素: 模块、文件、数据库等等,但是每个物理元素仍然为“黑盒子”——即内部结构是不可见、不明确的。概要设计阶段的另一项重要任务是设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。
本章主要介绍系统概要设计的任务、基本原理、概要设计的基本方法以及软件结构的描述工具。 本章要点: 概要设计的基本任务; 概要设计基本原理; 内聚和耦合; 结构化设计: 软件结构图、变换型和事务型设计; 软件结构的优化。 5.1简述 我们知道,软件设计是把一个软件需求转换为软件表示的过程,而概要设计(又称结构设计)就是软件设计最初形成的一个表示(这里的表示是一个名词),它描述了软件总的体系结构。简单地说,软件概要设计就是设计出软件的总体结构框架。 5.1.1概要设计基本任务 软件概要设计阶段要完成的任务主要体现在这样4个方面: 软件结构设计、数据结构及数据库设计、编写概要设计文档、设计评审。 1. 软件结构设计 在需求分析阶段,采用结构化技术已经通过抽象确定出软件系统的功能,并按自顶向下分层描述的方法构建出功能模型——数据流程图,而在概要设计阶段,需要进一步分解,将逻辑功能转化为功能模块,并按层次体现模块间的结构。具体过程如下: (1) 采用某种设计方法,将一个复杂的系统按功能划分成模块。所谓模块就是可独立存在、有唯一的命名且可直接访问的程序单元,每个模块完成一个相对独立的功能,通常具有功能、逻辑、接口和状态等4个基本属性。 (2) 确定每个模块的功能。 (3) 确定模块之间的调用关系。 (4) 软件工程基础与应用(第2版)第5章系统概要设计[3]〖3〗(4) 确定模块之间的接口,即模块之间传递的信息。 (5) 评价模块结构的质量。 2. 数据结构及数据库设计 对于大型数据处理的软件系统,数据是系统的核心内容和处理对象,对数据进行准确定义和描述是系统概要设计的重要工作,其中包括数据结构及数据库设计两方面的内容。 (1) 数据结构的设计。逐步细化的方法也适用于数据结构的设计。在需求分析阶段,已通过数据字典对数据的组成、操作约束、数据之间的关系等方面进行了描述,确定了数据的结构特性,在概要设计阶段要进一步细化。 (2) 数据库的设计。数据库的设计指数据存储文件的设计,主要进行以下几方面设计: 逻辑设计。在ER模型的基础上,结合具体的DBMS特征来建立数据库的逻辑结构。对于关系型的DBMS来说,将概念结构转换为数据库表结构,要给出数据库表结构的定义,即定义所含的数据项、类型、长度及它们之间的层次或相互关系的表格等。 物理设计。物理设计就是设计数据模式的物理细节,如数据项存储要求、存取方式、索引的建立等。 3. 编写概要设计文档 按照软件工程的理念和生存周期的要求,在概要设计结束之前,需要编写概要设计文档,为后期软件实现、修改和升级打下基础,同时也为用户使用提供帮助。在概要设计阶段,主要有以下文档需要编写: (1) 概要设计说明书。 (2) 数据库设计说明书。 (3) 用户手册。 (4) 测试计划的修订版。 4. 评审 概要设计的最后一个任务就是评审,在概要设计中,对设计部分是否完整地实现了需求中规定的功能和性能要求、设计方案的可行性、关键的处理和内外部接口定义正确性与有效性以及各部分之间的一致性等都要进行评审,以免在后续设计实现中出现大的问题而返工。 以上就是软件概要设计的4个基本任务,可以用8个字总结概括: 两类结构,文档评审。 5.1.2概要设计基本方法 软件概要设计的方法主要有结构化设计、面向对象的设计和面向数据结构的设计。本节主要介绍这几种广泛使用的概要设计方法。 1. 结构化设计方法 结构化设计方法是基于模块化、自顶向下细化、结构化程序设计等技术思想的基础上发展起来的。结构化设计方法给出一组帮助设计人员在模块层次上区分设计质量的原理与技术,与结构化分析方法衔接起来使用,以数据流程图为基础导出软件的模块结构。在设计过程中,它从整个软件的结构出发,利用软件结构图表述模块之间的调用关系。 结构化设计的步骤如下: (1) 评审和细化数据流程图。 (2) 分析并确定数据流程图的类型。 (3) 基于上层数据流程图映射出软件模块结构的上层框架。 (4) 基于下层数据流程图逐步分解高层模块,设计中下层模块结构。 (5) 对模块结构进行优化,得到更为合理的软件结构。 (6) 描述模块接口。 2. 面向对象设计方法 面向对象设计方法是面向对象技术中的一个环节,是对面向对象分析的模型进行完善设计。面向对象分析方法是把问题当作一组相互作用的实体,并确定实体间的关系。而面向对象设计更多地关心对象间的协作。 面向对象设计的主要作用是对分析模型进行整理,生成设计模型,为面向对象编程提供开发依据。面向对象设计内容包括架构设计、用例设计、子系统设计和类设计等。其中,架构设计的重点在于系统的体系框架的合理性,保证系统架构在系统的各个非功能性需求中保持一种平衡;子系统设计一般是采用纵向切割,关注的是系统的功能划分;类设计是通过一组对象交互展示系统的逻辑实现。具体论述详见7.3节。 3. Jackson设计方法 该方法由M.A.Jackson提出,其特点是从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其他细节,即能够得到完整的程序结构图。这一方法对输入、输出数据结构明确的中小型系统特别有效,如商业应用中的文件表格处理。该方法也可与其他方法结合,用于模块的详细设计。 Jackson方法有时也称为面向数据结构的软件设计方法。该方法一般通过以下5个步骤来完成设计: (1) 分析并确定输入数据和输出数据的逻辑结构,并用Jackson结构图来表示这些数据结构。 (2) 找出输入数据结构和输出数据结构中有对应关系的数据单元。 (3) 按以下的规则由输入、输出的数据结构导出程序结构。 为每一对在输入数据结构和输出数据结构中有对应关系的单元画一个处理框。 为输入和输出数据结构中剩余的数据单元画一个处理框。所有处理框在程序结构图上的位置,应与由它处理的数据单元在数据结构Jackson图上的位置一致。必要时,可以对映射导出的程序结构图进行进一步的细化。 (4) 列出对每一对输入、输出数据结构所做的基本操作以及操作的条件,并把它们分配到程序结构图的适当位置。 (5) 用伪码写出每个处理框的算法。 5.2概要设计基本原理 本节讲述在软件设计过程中应该遵循的基本原理和相关概念。 5.2.1模块化 如前所述已知,模块是具有特定功能且可以独立存在的单元,对后期编码而言,就是程序代码和数据结构的集合体。按照模块的定义,过程、函数、子程序和宏等都可视为模块。面向对象方法学中的类是模块,类内的方法(或称为服务)也可以是模块。模块是构成软件的基本单元。 模块化就是把一个大的软件系统划分为多个模块的过程,其中的每个模块完成一个简单功能,把这些模块集成起来构成一个软件系统,可以满足用户的需求,完成指定的功能。 如果一个软件系统仅设计为由一个模块组成,它的复杂性将增加,很难被人理解,也不可能做到全面考虑。所以,在软件设计时一般要将一个大的系统基于模块化进行分解,降低软件开发的复杂度。根据人类解决问题的一般规律,模块越复杂,开发的难度也越大。具体理由论述如下。 ……
你还可能感兴趣
我要评论
|