第一章
1、软件的概念: 软件是计算机中与硬件相互依存的另一部分,它是包括程序、数据及其
相关文档的完整集合。
2、软件具有下列特点:
1.软件是一种逻辑产品,它具有抽象性和无形性。 2.软件的生产与硬件不同。 3.软件在运行和使用中,不会磨损和老化,但它存在退化问题。
4.软件的开发和运行对计算机系统有一定的依赖性。
5.软件开发至今仍未完全摆脱手工开发方式,大多数软件是“定做”的。 6.软件开发成本高、风险高。
7.相对于计算机硬件技术的发展,计算机软件技术的发展十分缓慢。 3、计算机软件技术的发展经历了三个阶段:
程序设计时期(20世纪40年代中期至60年代中期),软件质量取决于个人编程水平。 程序系统时期(20世纪60年代中期至70年代中期),软件质量取决于开发小组的技术水平
软件工程时期(20世纪70年代以后)。 软件质量取决于软件工程管理水平。 软件技术的发展主线是由个体简单的开发方式向着复杂、大规模、标准化、工程化的方向发展,在最高阶段,把软件开发界定为两方面的内容:软件开发和软件维护。 4、软件开发引发的问题 : 1.社会对软件需求的不断发展
2.软件开发理念和手段与客观实际存在的差异
① 对软件本身的认识存在差异 ② 对软件的服务对象认识不足
③ 对软件开发缺乏科学管理 ④ 软件开发手段落后
5、软件危机 (1)发生时间:软件发展第二阶段(程序系统阶段)的末期
(2)软件危机是指在计算机软件开发和维护过程中遇到的一系列严重问题。
问题主要体现在两方面:①如何开发软件满足用户的需求,②如何维护已有的软件
(3)软件危机的主要表现有以下几方面:
1.软件开发经费超支、进度拖延 2.软件不能符合用户的要求
3.软件难以维护 4.软件可靠性差 5.软件开发生产率低
(4)主要原因:
1 社会对软件的需求急剧增加 2 软件本身的特点:软件本身存在着复杂性 3软件开发理念和手段与客观实际存在的差异
① 对软件本身的认识存在差异 ② 对软件的服务对象认识不足
③ 对软件开发缺乏科学管理 ④ 软件开发手段落后
寻找解决软件危机途径的过程就是软件工程形成的过程
6、软件工程
核心:以工程化的原理和方法对软件进行规划、定义、开发和维护; 宗旨:以较少的投入,最快的时间生产出高质量的软件。
定义:“软件工程是软件开发、运行、维护和引退的系统方法”。
软件工程的主要思想是强调软件开发过程中应用工程化原则的重要性。
软件工程的三要素是方法、工具和过程。
软件工程的基本目标:实现软件的优质高产,即在给定成本、进度的前提下,达到要求的软件功能,取得较好的软件性能,开发出具有可修改性、有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性,并满足用户需求的软件产品。
软件工程的内容:软件开发技术和软件工程管理。
7、软件生命周期:
一个软件从定义到开发、使用和维护,直到最终被废弃,要经历一个漫长的时期,这
个时期称软件生命周期(或软件生存周期)。
生命周期的划分原则 :
各阶段的任务应尽可能相对独立; 同一阶段各项任务的性质尽可能相同
软件生命周期通常划分为3个时期、6个阶段。即: 软件定义、软件开发、软件维护 问题的定义和可行性研究;需求分析;软件设计;程序编码;软件测试;运行与维护 8、软件开发模型
软件开发模型是在软件生命周期基础上构造出的由软件开发全过程中的活动和任务组成的结构框架。它反映了软件开发中各种活动的组织衔接方式。它是软件项目开发工作的基础。 常见的软件开发模型:
1.瀑布模型2.渐增式模型 3.快速原型模型4.软件重用模型5.喷泉模型 6.螺旋模型
瀑布模型是一种理想化的、文档驱动的模型,通过文档连接软件开发过程的各个阶段(阶段间具有顺序性和依赖性),但它缺乏灵活性, 特别是无法解决软件需求不明确或不准确的问题。
螺旋模型将瀑布模型与增量模型结合起来,加入了两种模型均忽略了的风险分析。按照“制定计划,风险分析,实施工程,客户评价”四个步骤循环实施。在实施过程中加入了风险分析,提高了风险识别和规避的能力。
9、软件开发应遵守的方法和原则:(软件工程的原则) 抽象、局部化与信息隐蔽、模块化、一致性、完整性和可验证性。
10.软件开发方法:结构化方法 Jackson方法 面向对象(Object Oriented)方法
结构化方法可使用瀑布模型、增量模型和螺旋模型进行开发; Jackson方法可使用瀑布模型、增量模型进行开发;
面向对象的开发方法一般是采用喷泉模型,也可用瀑布模型、 增量模型进行开发。 第二章 软件的定义及可行性研究(软件定义时期)
1、主要任务:就是在对用户要求充分了解的前提下,分析未来新系统(即目标系统)的主要目标,分析开发系统的可行性。
2、可行性研究的任务(或目标系统的可行性研究有那几个方面?)
对已提出的任何一种解决方案,都从经济、技术、运行和法律诸方面来研究其可行性,做出明确的结论供用户参考。
可行性研究的目的是明确“问题是否能够解决”和“是否值得解决” 可行性研究的实质:在高层次上做一次大大简化了的需求分析和设计 3、名词解释: 系统成本 = 开发成本+运行操作费用 + 维护费用
纯收入 = 累计经济效益(折合成现在值)- 投资额 3、系统流程图的符号及应用 P20
4、投资回收期是累计的经济效益等于最初投资所需要的时间,也就是达到估计开发总成本加上运行维护费用所需要的时间。 5、简述可行性研究的步骤。
(1)审核系统的规模和目标。 (2)研究现行系统。 (3)导出新系统的高层逻辑模型。 (4)重新定义问题。 (5)提出和评价供选择的方案。 (6)推荐可行的方案。
(7)草拟项目开发计划 (8)书写文档,提交审查 6、经济可行性分析
从经济上衡量一个项目是否有开发价值,主要研究两个方面的内容:一是新系统成本的估计;
二是新系统可能产生的效益。又称为成本/效益分析。
第三章 需求分析 :是软件生存周期的重要的一步,也是最关键的一步。
1、需求分析的基本任务:准确定义新系统的目标,为了满足用户需要,回答“回答系统必须做什么”的问题( 细化“系统必须做什么”,准确地回答“系统必须做什么”) 2、需求分析的具体任务: 1、确定系统的综合要求 2、分析系统的数据要求
3、导出新系统的逻辑模型 4、修正系统的开发计划 5、开发原型系统 6、整理完成需求规格说明书
需求获取的基本原则:1、点面结合,把握重点2、以流程为主线。
需求获取的途径和方法:1、用户访谈和会议2、把握用户的工作流程3.开发人员和委托人的交流和合作。 3、需求分析的基本过程
1、问题识别
2、分析与综合 3、编写文档 4、分析评审
需求分析常用的方法: 面向数据流的结构化分析方法(SA)
面向数据结构的Jackson方法(JSD)
面向数据结构的结构化数据系统开发方法(DSSD) 面向对象的分析方法(OOA)
结构化分析方法(SA)的基本思想是“分解”和“抽象”,
核心思想是:采用“自顶向下,逐步求精”的技术,对系统进行划分。
结构化分析常用的工具有:数据流图(DFD)、数据词典(DD)、实体-联系图(E-R图) 4、数据流图
数据流图的画法及细化原则P39。 数据流图的四种基本图形符号:
数据流
数据流
箭 头
加 工 加工名
圆或椭圆
数据存储
单或双杠
文件名
数据源点或终点
实体名
矩形框
5、数据词典:
定义:对数据流图中包含的所有元素的定义和说明的数据集合。是数据流的补充工具 数据词典和数据流图共同构成系统的逻辑模型,二者缺一不可。
数据词典共六类条目:数据流、数据项、数据结构、数据存储、加工逻辑与外部实体 数据词典的常用符号。
6、数据词典中对基本加工逻辑说明有三种描述方式: 结构化语言,判定表,判定树。 三种描述方式的具体使用。P42-P44
数据词典的功能:数据词典最重要的功能就是它是分析阶段的工具 数据词典中对加工逻辑的描述很有价值
数据词典也是下一步设计的依据
数据词典的实现方法 三种途径:人工方法,自动方法,混合方法
7、快速原型法:软件原型的分类:废弃(throw away)型 追加(add on)型 原型是软件开发过程中,软件的一个早期可运行的版本,它反映了最终系统的部分重要特性。 原型化方法的基本思想是花费少量代价建立一个可运行的系统,使用户及早获得学习和了解目标系统的机会,强调软件开发人员与用户的不断交互,通过原型的演进不断深入了解、适应用户的需求,减少失误,从而使软件产品更加适用。
原型化开发过程:1、快速分析 2、构造原型 3、运行和评价原型4、修改和改进
5、判定原型完成 6、判断原型细部是否需要说明
7、原型细部的说明 8、判定原型效果 9、整理原型和提供文档 第四章 软件设计 :是将需求分析所得出的软件“要做什么”变换为“怎么做”
软件设计的基本目标是用比较抽象概括的方式确定目标系统如何完成任务,即确定系统的物理模型,解决软件“怎么做”的问题。 软件设计的重要性:(1)软件设计是软件开发阶段的关键步骤,通过“软件设计说明书”反映设计的结果。做出的决策将直接影响软件实现的成败。
(2)软件设计是软件开发中形成质量的关键环节,是软件维护的基础。
软件设计一般遵循以下原则:模块化、抽象、信息隐蔽与局部化、一致性、完整性、可验证性。
总体设计过程中应完成以下工作:确定最佳方案、功能分解、体系结构设计、模块设计
数据结构与数据库设计、用户界面设计、整理完成设计文档、评审
1、软件设计的划分:
从工程管理角度,软件设计分两步完成:总体设计(概要设计)、详细设计(过程设计) 从技术角度有任务:软件结构设计、数据设计、界面设计和过程设计
2、模块: 是能够单独命名并独立地完成一定功能的程序语句的集合。模块化就是将系统划分为若干个较小的、功能独立的模块来完成目标任务。
3、名词解释: 抽象是抽出事物的本质特性而暂时不考虑它们的细节。
4、在设计阶段应达到的目标是: 可靠性;可维护性;可理解性;高效率。 5、常见的体系结构有两大类:层次结构和客户机/服务器结构。
6、模块化:模块设计的主要任务就是设计具有独立功能而且和其他模块间没有过多的相互
作用的模块。
7、模块化的主要优点:① 降低了软件系统的复杂性,使得系统容易修改,成本降低 ② 使系统各个部分可以并行开发,提高了软件的生产率
提高模块质量在于提高模块独立性。模块独立是模块化、抽象、信息隐蔽和局部化概念的直接结果。具有独立模块的软件较容易开发,独立的模块较容易测试和维护。
8、耦合和内聚: 评价模块独立性的标准是内聚和耦合,通常一个软件系统要获得高的模块独立性,就必须做到高内聚和低耦合。
耦合性 度量模块之间的相对独立性(互相联系的紧密程度) 内聚性 度量模块功能强度(模块内部各元素结合的紧密程度) 模块独立性比较高的模块应该是高内聚和低耦合的模块。
模块的独立性:指软件系统中每个模块只涉及软件要求的具体的子功能,与软件系统中其他模块的接口是简单的,功能单一,且与其他模块之间没有过多的联系,我们则称此模块具有模块独立性。
耦合的类型:内容耦合、公共耦合、外部耦合、控制耦合、标记耦合、数据耦合、非直接耦合(耦合性由高到低)
内聚性:偶然型、逻辑型、时间型、通信型、顺序型、功能型(内聚性由低到高) 9、一般将DFD图分为两种典型的类型:变换型、事务型
分析系统的DFD图类型的目的,是为了采用不同的技术将其转换为初始的模块结构图。 通过变换分析技术,将中心变换型的DFD图转换而得的SC图,称为变换型系统结构图。相应于取得数据、变换数据、给出数据,系统的结构图由输入、中心变换和输出等三部分组成。 10、软件的层次结构 有关指标:
⑴深度:表示软件结构中从顶层模块到最底层模块的层数。
⑵宽度:表示控制的总分布。 ⑶扇出数:指一个模块直接控制下属的模块个数。 ⑷扇入数:指一个模块的直接上属模块个数。
软件结构:由模块连接而得到的软件结构最普通的形式就是树状结构和网状结构。 11、启发式设计规则
1、消除重复功能,改进软件结构,提高模块独立性,降低耦合,提高内聚。
2、模块的规模应该适中,一般不超过60行语句。
3、深度、宽度、扇入、扇出都应适当。 4、模块的作用范围应该在控制范围之内。 控制范围:指模块本身以及其下所有下属模块(直接或间接从属于它的模块)的集合,是从结构特点考虑的。
作用范围:指受该模块内一个判定影响的所有模块的集合,是从功能特点考虑的。 一个模块的作用范围应在其控制范围之内,且判定所在的模块应与受其影响的模块在层次上尽量靠近
好的软件结构的形态准则:顶部宽度小,中部宽度大,底部宽度次之;在结构顶部有较高的扇出数,中间层扇出数较低,在底部有较高的扇入数。
5、力争降低模块接口的复杂程度 6、设计单入口、单出口的模块
7、模块功能应该可以预测
12、详细设计 又称为过程设计,主要确定每个模块的具体实现过程——可以直接转换为程序的软件表示,即对系统中每个模块的内部过程进行设计和描述。 13、详细设计的基本原则
1、采用自顶向下、逐步求精的设计方法 2、使用三种基本控制结构完成详细设计 3、设计人员组织采用“外科医生——助手”模式(主程序员制) 4、追求清晰
14、详细设计的表达 1、程序流程图 2、盒图 (N-S图) 3、PAD图 (4、PDL)
三种表达方式的应用及其相互间的转换。
详细设计的基本任务:
1、算法设计2、数据结构设计3、存储结构设计4、其他设计:①完整性控制和输入输出设计 ② 人机对话设计 ③ 数据代码设计 5、完成详细设计文档6、详细设计评审 第五、六章 面向对象技术
1、对象:是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组服务组成。
2、 类:是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。
3、 封装:是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节。 4、 继承:是指子类可以自动拥有父类的全部属性和服务。
5、 消息:是对象发出的服务请求,一般包含提供服务的对象标识、服务标识、输入信息和应答信息等信息。
6、 多态性:是指在父类中定义的属性或服务被子类继承后,可以具有不同的数据类型或表现出不同的行为。
软件复用是指通过使用已有软件的各种有关知识来设计新的软件,这些知识包括:领域知识、开发经验、设计经验、设计决定、体系结构、需求、设计、编码、测试和文档等。 软件复用包括软件产品复用和软件过程复用两部分的内容 7、UML由视图(Views)、图(Diagrams)、模型元素(Model Elements)和公共机制(General Mechanisms)等部分组成。
8、UML采用五个互连的视图来描述软件系统的体系结构,即用例视图(Use-case View)、设计视图(Design View)、进程视图(Process View)、实现视图(Implementation View)和展开视图(Deployment View)。
9、系统模型中每一个视图的内容是由一些图来描述的,UML中包含用例图、类图、对象图、状态图、时序图、协作图、活动图、组件图、分布图等九种图。对整个系统而言,其功能由用例图描述,静态结构由类图和对象图描述,动态行为由状态图、时序图、协作图和活动图描述,而物理架构则是由组件图和分布图描述。
第七章 软件编码
1、程序设计语言的特性 三个方面: 工程特性:(1)可移植性、(2)开发工具的可利用性、(3)软件的可重用性、(4)可维护性 技术特性、 心理特性:歧义性、简洁性、记忆特性(局部性、顺序性)、传统性(习惯性) 语言选择的影响因素:(1)项目的应用领域、(2)软件开发方法、(3)软件开发、运行环境 (4)算法和数据结构的复杂性、(5)软件开发人员的知识水平以及心理因素
2、源程序中的注释
注释是程序员之间通信的工具,说明了程序的功能、变量的实际意义等。 注释可分为序言性注释和解释性注释:
序言性注释是对本程序段的模块功能等做必要的说明;
解释性注释是说明语句段和程序段功能的注释行。
3、程序设计原则:五条原则:可维护性、可靠性、可理解性、高效率、健壮性 第八章 软件测试
1、三点测试目标: 1.测试是为了发现程序中的错误而执行程序的过程。
2.好的测试方案是尽可能发现迄今为止尚未被发现的错误的测试方案。 3.成功的测试是发现了至今为止尚未被发现的错误的测试。
2、测试的正确含义:“为了发现程序中的错误而执行程序的过程”。
测试阶段的根本目标是:以最少的人力、物力和时间,尽可能多地发现并排除软件中的错误,最终把一个高质量的软件系统交给用户使用。 3、软件测试的原则:1、所有测试都应追溯到需求2、坚持“尽早地和不断地进行软件测试” 3、测试用例应该由测试输入数据和与之对应的预期输出结果两部分组成 4、程序员应避免测试自己的程序
5、在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。
6、充分注意测试中的群集现象、 7、严格执行测试计划,排除测试的随意性
8、应当对每个测试结果做全面检查
9、在测试程序时,不仅要检验程序是否作了该做的事,还要检验程序是否作了不该做的事 10、妥善保存测试计划、测试用例、出错统计和最终分析报告,为维护提供方便 4、软件测试过程需要3类测试信息流
(1)软件配置:包括需求规格说明、设计规格说明、源代码等。 (2)测试配置:包括测试计划、测试用例、测试驱动程序等。 (3)测试工具:测试工具为测试的实施提供某种服务。
5、错误被发现的越晚,纠错的代价越高
6、测试的过程分为四个步骤:单元测试、组装测试、确认测试和系统测试
7、测试用例 = 测试数据 + 预期测试结果(+测试环境) 8、黑盒测试法(功能测试)
把程序看成一个不透明的“黑盒子”,测试时完全不考虑程序的内部结构和处理过程,只按照规格说明书所规定的功能来设计测试用例,也就是检查程序是否符合它的功能要求。 常用的测试技术: 等价类划分法、边界值法、 错误推断法、因果图法
9、白盒测试: 是把程序看成一个透明的盒子,测试人员完全了解程序的内部结构和处理过程,测试时根据程序的内部逻辑来设计测试用例,即检验程序中的每条路径是否都能按预定的要求正确工作。
白盒测试是在程序结构上进行的测试,所以也称为结构测试。 常用的逻辑覆盖技术有六种:
语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。 10、测试环境:考虑到被测模块与其它模块的联系,因此测试时需要使用两类辅助模块来模拟其他模块。
驱动模块 — 模拟被测模块的主程序功能,用于向被测模块传递数据,接收、打印从被测模块返回的数据。
桩模块 — 又称为假模块,用于代替被测模块所调用的子模块功能。 被测模块、相关的驱动模块和桩模块共同构成了一个“测试环境”。 11、组装测试具体实施策略:
非渐增式组装测试方式—— 先组装再测试;
渐增式组装测试方式—— 先测试再组装,边组装边测试
渐增式组装测试两种具体方案:自顶向下的增殖组装方式、由底向上的增殖方式 12、调试与测试的不同:
软件测试的目的是尽可能多地发现程序中的错误,而调试则是在进行了成功的测试后才开始的工作。调试的目的是根据测试时发现的错误,找出错误的原因和具体位置,并改正错误,因此,调试也称为纠错或排错。
13、常用的调试技术:1.强行排错、2.回溯法排错、3.演绎法排错、4.归纳法、5.强行纠错 (又称为蛮力法)(教材 对分法)
因篇幅问题不能全部显示,请点此查看更多更全内容