1、第一章软件工程与软件危机1、什么是软件软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。软件=程序+数据+文档2、软件的分类(划分)按软件的功能进行划分:系统软件、支撑软件、应用软件按软件规模进行划分:微型、小型 、中型、大型 、甚大型、极大型按软件工作方式划分:实时处理软件(Real-Time) 、分时软件(Share-Time) 、交互式软件、批处理软件按软件服务对象的范围划分:项目软件、产品软件按使用的频度进行划分:一次使用、频繁使用按软件失效的影响进行划分:高可靠性软件、一般可靠性软件3、软件的发展与软件危机软件发展阶段(从 40 年代第一台计算机出
2、现)程序设计阶段 50 至 60 年程序系统阶段 60 至 70 年软件工程阶段 70 年代以后软件危机(Software Crisis): 软件的整体质量较低,及期限、费用等问题4、软件工程的定义及研究内容定义:软件工程是一门旨在生产满足用户需求的、及时交付、不超过预算的和无故障(Bug)的软件的学科,为达到这些目标,必须在软件生产的所有阶段采用合适的技术。软件工程三要素:(一组)方法、 (一系列)工具和(一个)过程5、软件生存期(生命周期)定义:软件有一个孕育、诞生、成长、成熟、衰亡的生存过程。这个过程即为计算机软件的生存期软件生存期的六个步骤,即制定计划、需求分析、软件设计、程序编码、软
3、件测试及运行维护瀑布模型优点:1.近乎强迫式规则,每个阶段有文档需确认。2.带反馈环。缺点:1 生产软件仍不能完全满足需求。2 积累错误。越早出现的错误,暴露的时间越晚,排除故障付出的代价就越高。 螺旋模型(Spiral Model)螺旋模型沿着螺线旋转,在四个象限上分别表达四个方面的活动,即:制定计划确定软件目标,选定实施方案,弄清项目开发的限制风险分析分析所选方案,考虑如何识别和消除风险实施工程实施软件开发客户评估评价开发工作,提出修正建议6、软件开发方法软件开发方法:结构化软件开发方法和面向对象软件开发结构化软件开发方法:数据处理系统:结构化分析,设计,Jackson 方法大型复杂系统:
4、SADT实时事务处理:FSM(有穷状态机,Finite State Mechanism)并发系统:Petri 网面向对象的软件开发方法: OOT第二章系统分析(定制计划,可行性研究)1、定制计划阶段目标与任务目标:解决的问题是什么?(软件项目计划的第一个活动是确定范围)任务:确定软件范围,给出可行性分析,由用户决定“行”或“不行” 。软件范围描述了将被处理的数据和控制、功能、性能(如处理及响应时间) 、约束(外部硬件,可用能存或其他已有系统对软件的限制) 、接口及可靠性。2、确定软件范围所需信息的方法 (1)软件工程师(分析员)与客户交流(会谈式):集中于客户、总体目标及收益;集中在客户对软件
5、解决方案的想法;“元问题” (集中于会谈效果)(2)联合小组形式,其中一种方法:便利应用规约技术 FAST, 如由 IBM 公司开发的 JAD。此处有习题:传送带分类系统(CLSS)3、可行性研究的方面 可行性研究的四维:1。技术 2。财政 3。时间 4。资源经济可行性:进行成本效益分析,评估项目的开发成本。技术可行性:现有技术是否实现系统的功能,满足约束,风险有多大!对系统的性能、可靠性、可维护性以及生产率等方面的信息进行评价。法律可行性:系统开发可能导致的责任(合同责任、法律责任,专利、版权等)抉择:对系统不同方案的对比、选择4、可行性研究的步骤(八个步骤) 5、系统流程图 此处有习题:请
6、画出由下列文字描述的系统流程图(某城市招干考试成绩统计系统)6、成本效益分析 基于代码行估计(LOC:Line of Code,单位 kLoc)如,2900 行源代码,注释,测试,等 200 行,总工作量 9 人/月生产率(Production Rate)=源代码行/总工作量=(2900-200)/9=300Loc/PM基于功能点(FP:Function Point)估计基于过程估计经验估计(自动软件估计) (公式)第三章软件需求分析1、需求分析的任务:“理解、分解和表达”理解:通过调查分析,来定义用户的需求,以达到对用户需求的共同的理解(理解软件需求)目的:理解问题的数据域(数据流、数据内容
7、、数据结构)和功能域。分解:通过结构化分析方法,自顶向下,逐层分析的方式对问题进行分解和不断细化。目的:确定系统的构成和主要成份。表达:把共同的理解和结构化分析的结果用双方均能理解的方法描述出来,写入需求规格说明(SRS) 2、结构化的分析方法(SA)采用自顶向下,逐层分解的方法采用特定的描述方法:数据流图(DFD)数据流动数据字典(DD)数据定义、内容、结构结构化英语/伪码(SE/PDL)处理的逻辑描述判定表(Decision Table) 、判定树(Decision Tree)3、数据流图(DFD:Data Flow Diagram)定义:描述数据在软件系统中流动和处理的图形工具。 数据流
8、图中的概念1。父图与子图 2。分层图的编号3。局部文件4、数据字典(DD=Data Dictionary)定义:以准确的、无二义性的方式定义数据流图(DFD)中出现的所有被命名的图形元素,包括数据流、数据文件、数据项(条目) 、加工(处理) ,源和汇。数据字典(DD=Date Dictionary)_DD 中定义内容:1。数据流如: 选课单=学生学号+课程编码2。数据文件 文件:开课清单,类型:文本,构成:课程纪录课程纪录=课程代码+名称+注册费用+任课教师+课时+3。数据 课程代码=7 位数字,如 00010054。加工(处理):加工名称,流入/出数据,数据处理过程等,主要描述加工步骤5。源
9、和汇:产生数据或接受数据的部分此处有习题:1、编写银行取款过程的数据流图的 DD2、采用判断表和判断树描述下列文字叙述的内容5、系统动态分析分析系统的动作,描述系统的行为 最常用的动态分析方法:状态迁移图状态迁移图是描述系统的状态如何相应外部的信号进行推移的一种图形表示。圆圈“”表示可得到的系统状态箭头“”表示从一种状态向另一种状态的迁移。可得到的状态就绪,运行,等待生成的事件t1,t2, t3, t4 t1 中断事件 t2 中断已处理 t3 分配 CPU t4 用完 CPU 时间时序图Petri 网基本符号:位置,转移,输入,输出函数一组位置(place) 。 “”表示状态(条件,要求)转移
10、(转换) (transition) “”, “|”系统中的事件转移的输入 “” ,事件发生的前提转移的输出 “” ,事件发生的结果 此处有习题:某企业销售管理系统(画出分层 DFD)6、数据及数据库需求的设计方法ER 模型,范式有关数据库的基本概念在软件系统中需要处理的数据是现实世界中存在的事物及其联系的反映。人们通常将与数据处理有关的的领域分为三个世界:现实世界、信息世界、数据世界关系规范化的程度,通常按属性间的依赖程度来区分,并以范式 NF (Normal Form) 来表达。常用的范式分为第一范式(1NF) 、第二范式(2NF)和第三范式(3NF)判断规范化程度的条件是:关系中所有属性都
11、是“单纯域” ,即不出现“表中有表”非主属性完全函数依赖于关键字非主属性相互独立,即任何非主属性间不存在函数依赖。如果一个关系连条件都不满足,则这个关系是非规范化的。如果一个关系仅满足条件 ,则这个关系满足第一范式 (1NF)。如果一个关系满足条件 、 ,但不满足 ,则这个关系满足第二范式 (2NF)。如果一个关系同时满足条件 、 和 ,则这个关系表满足第三范式(3NF)。当数据模型达到 3NF,一般情况下就能满足数据库应用的需要。第 4 章 软件设计方法1、软件设计的目标和任务根据用信息域表示的软件需求,以及功能和性能需求,进行:数据设计、系统结构设计、模块(过程)设计。从工程管理的角度来看
12、,软件设计分两步完成:概要设计;详细设计,即模块设计,或过程设计。2、软件设计基础自顶向下,逐步细化将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。软件结构软件结构包括两部分。程序的模块结构和数据的结构软件的体系结构通过一个划分过程来完成。程序结构程序结构表明了程序各个部件(模块)的组织情况,是软件的过程表示。 结构图(简称 SC 图)结构图反映程序中模块之间的层次调用关系和联系:它以特定的符号表示模块、模块间的调用关系和模块间信息的传递软件设计的七条基本原则1)模块化(modularity)2) 抽象(
13、Abstract)3) 信息隐蔽(Hiding)4) 信息局部化(localization)5) 一致性(Uniformity)6)完整性(Completeness)7) 确定性(Confirmability)3、模块独立性“模块” ,又称“组件” 。它一般具有如下三个基本属性:功能:描述该模块实现什么功能逻辑:描述模块内部怎么做状态:该模块使用时的环境和条件在描述一个模块时,还必须按模块的外部特性与内部特性分别描述模块独立性, 是指软件系统中每个模块只涉及软件要求的具体的子功能, 而和软件系统中其它的模块的接口是简单的例如, 若一个模块只具有单一的功能且与其它模块没有太多的联系, 则称此模块
14、具有模块独立性一般采用两个准则度量模块独立性。即模块间耦合和模块内聚。耦合是模块之间的互相连接的紧密程度的度量。内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。模块独立性比较强的模块应是高内聚低耦合的模块。尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,尽量避免使用内容耦合。4、结构化设计方法(SD)首先研究、分析和审查数据流图。然后根据数据流图决定问题的类型。数据处理问题典型的类型有两种:变换型和事务型。针对两种不同的类型分别进行分析处理。变换型系统结构图:变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。相应于取得数据、变换数据、给出数据,变
15、换型系统结构图由输入、中心变换和输出等三部分组成。事务型系统结构图它接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后给出结果。在事务型系统结构图中,事务中心模块按所接受的事务的类型,选择某一事务处理模块执行。各事务处理模块并列。每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。5、详细(过程)设计任务:从软件开发的工程化观点来看,在使用程序设计语言编制程序以前,需要对所采用算法的逻辑关系进行分析,设计出全部必要的过程细节,并给予清晰的表达。在过程设计阶段,要决定各个模块的实现算法,并精确地表达这些算法。表达过程规格说明的工具叫做详细设计工具,
16、它可以分为以下三类:图形工具程序流程图(Program Flow Chart=PFC),N-S 图,PAD 图) 表格工具判定表(Decision Table) 语言工具伪码(PDL) 程序流程图也称为程序框图,程序流程图使用五种基本控制结构是:N-S 图也叫做盒图。五种基本控制结构由五种图形构件表示:PAD 也设置了五种基本控制结构的图式,并允许递归使用:此处有习题:NS 盒图及 PAD 图表示程序流程第五章 Jackson 系统开发方法(JSD)JSP:适用于小系统的开发,或详细设计阶段,用输入/输出的数据结构进行软件设计,用数据结构映射软件结构。Jackson 图的基本画法:Jackso
17、n 结构程序设计方法1)步骤:Step1 确定输入/输出的数据结构,并用 Jackson 图表示。Step2 分析确定输入/输出数据结构的数据元素之间的对应关系Step3 利用三条基本规则从数据结构的 Jackson 图导出程序结构的 Jackson 图。此处有习题:用 Jackson 方法设计一个打印表格程序第七章 程序编码(实现阶段)1、程序设计风格符号名即标识符,包括模块名、变量名、常量名、标号名、子程序名、数据区名以及缓冲区名等。注释分为序言性注释和功能性注释。2、程序效率程序的效率是指程序的执行速度及程序所需占用的内存的存储空间。在大中型计算机系统中,存储限制不再是主要问题。在这种环
18、境下,对内存采取基于操作系统的分页功能的虚拟存储管理。存储效率与操作系统的分页功能直接有关。在微型计算机系统中,存储器的容量对软件设计和编码的制约很大。因此要选择可生成较短目标代码且存储压缩性能优良的编译程序,有时需采用汇编程序。3、程序复杂性定性度量McCabe 度量法(McCabe 环行复杂度度量法)McCabe 度量法,又称环路复杂性度量,是一种基于程序控制流的复杂性度量方法。McCabe 方法的步骤:等于程序图中弧所封闭的区域数。Halstead 的软件科学n1 =用到的不同的运算符的个数, n2 =不同操作数的个数,N1 =总运算符的个数, N2 =总操作数的个数。 程序长度(预测的
19、 Halstead 长度):Halstead 度量可以用来预测程序中的错误。预测公式为:B 为该程序的错误数。它表明程序中可能存在的差错 B 应与程序量 V 成正比。第八章 软件测试1、软件测试的概念使用人工和自动手段来运行或测定某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的过程2、软件动态测试方法及其复杂性两种常用的测试方法:黑盒测试(黑盒法) 、白盒测试(白盒法)3、白盒测试技术(结构路径测试)逻辑覆盖是以程序内部的逻辑结构为基础的设计测试用例的技术。它属白盒测试。最少测试路径的计算:例:基本路径测试:例:4、黑盒测试技术(功能测试)等价类划分方法:把所
20、有可能的输入数据,即程序的输入域划分成若干部分,然后从每一部分中选取少数有代表性的数据做为测试用例。因果图的基本符号:通常在因果图中用 Ci 表示原因,用 Ei 表示结果,各结点表示状态,可取值“0”或“1” 。“0”表示某状态不出现, “1”表示某状态出现。主要的原因和结果之间的关系有:表示约束条件的符号:此处有习题:1、等价类划分方法,给出足够的测试用例(一个程序读入三个整数)2、自动饮料售货机软件进行黑盒测试5、综合测试策略(1)用黑盒测试方法设计基本测试用例,再用白盒法补充必要用例。 (黑主,白辅)(2)任何情况下均要使用边界值分析测试用例。(3)如果规格说明中含有输入条件的组合,一般
21、选用因果图法构造用例。(4)用错误推测法补充用例。(5)若未达到覆盖标准,应用逻辑覆盖法补充足够用例。6、软件测试过程测试过程按 4 个步骤进行,即单元测试、组装测试、确认测试和系统测试。7、软件调试软件调试:是在进行了成功的测试之后才开始的工作。它与软件测试不同,调试的任务:是进一步诊断和改正程序中潜在的错误。调试活动由两部分组成:确定程序中可疑错误的确切性质和位置(80%95%) ;对程序(设计,编码)进行修改,排除这个错误。几种主要的调试方法:强行排错、试探法(猜错法) 、回溯法调试、对分法、归纳法调试、演绎法调试。第11章 软件维护1、软件维护的概念维护的类型有四种:改正性维护、适应性维护、完善性维护、预防性维护软件维护的定义、影响维护工作量的因素、软件维护的策略、维护成本2、软件维护活动的特点结构化维护和非结构化维护的对比、软件维护的工作流程(事件流)第*章 软件可靠性MTTF-平均失效等待时间植入故障法:第九章面向对象技术1、面向对象的概念面向对象的定义:面向对象=对象+类+继承+通信(消息)3、对象模型例子一家公司有许多部门,每个部门由一名经理管理,也有经理并不管理任何一个部门;每个部门生产多种产品,而每种产品仅有一个部门生产。该公司有多名员工,员工分经理和工人两类。每个工人可参加多个工程项目,每个项目需要多个工人;每位经理可以主持多个项目,每个项目仅有一人主持。