概括地说,软件工程是指导计算机软件开发和维护的工程学科。采用工程的概念、原理、技术、和方法来开发与维护软件,把经过时间考验而证明正确地管理技术和当前能够得到的最好和技术方法结合起来,经济地开发出高质量的软件并有效的维护它,这就是软件工程
把系统化的,规范的,可度量的途径应用于软件开发,运行和维护的过程,也就是把工程化应用于软件中。
经费超出预算,项目一再拖延。
不重视需求,开发的软件不能满足用户的要求,项目成功率低。
没有规范的软件工程方法,软件可维护性差、软件质最差、可靠性差。
开发工具落后,手工方式,开发效率低。
所有导致软件危机的原因,都与软件本身的产品特点相关。
软件是一个复杂的逻辑产品。如果没有解决复杂问题的有效方法,以及软件产品的结构、质量、可维护性得不到保障,开发与维护费用就会持续升高。
软件产品不能实现大规模复用,这导致了软硬件生产效率的不同。
软件生产是脑力劳动,它看不见、摸不着,开发成本、开发周期等都无法做到准确估算,生产过程不易控制。
软件成本主要是由研发成本构成;而硬件的生产成本主要是材料和制造成本,分摊的研发成本很少,即软件研发过程与硬件制造过程相比要复杂得多。
1.技术措施
使用更好的软件开发技术、开发工具。
2.组织管理措施
(1)创造良好的组织、严密的管理与协调工作的机制软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。
(2)摆脱软件危机的主要出路是,按工程化的原则和方法组织软件的开发工作。
(3)强调文档的重要性。 “口说无凭,立字为据! !”是解决软件危机的格言。
软件工程的3要素:1)方法 2)工具 3)过程
与计算机硬件相比,计算机软件有哪些特点?
无法直接观察计算机软件的物理形态,只能通过观察它的实际运行清况来了解它的功能、特性和质量等。
人们在分析、设计、开发、测试软件产品,以及在软件开发项目的管理过程中,渗透了大量的脑力劳动。
不存在像硬件一样的磨损和老化现象,但存在着缺陷维护和技术更新的问题。
软件的开发和运行必须依赖于特定的计算机系统环境。
具有可复用性。
软件就是程序吗? 如何定义软件?
人们经过长期的实践已经逐步认识到,软件不等于程序,程序只是软件的关键要素。普遍能被接受的观点是:软件=程序+数据+文档。
什么是软件工程?软件工程7个基本原理是什么?
① 软件工程是指导计算机软件开发和维护的工程学科
② 用分阶段的生命周期计划严格管理、坚持进行阶段评审、实行严格的产品控制、采用现代程序设计技术、结果应能清楚地审查、开发小组的人员应该少而精、承认不断改进软件工程实践的必要性
问题的定义
要解决的问题是什么
可行性研究
上一个阶段所确定的问题是否有行得通得解决方法
需求分析
目标系统必须做什么,对目标系统提出完整、准确、清晰和具体的要求
概要设计
怎样实现目标系统 ,概要设计 —— 初步设计 逻辑设计 高层设计或者总体设计
详细设计
怎么具体实现这个系统,不是编写程序,而是设计程序的详细规格说明
详细设计每个模块,确定实现模块功能所需的算法和数据结构
编码和单元测试
综合测试
集成测试 验收测试 按照规格说明书的规定(需求分析阶段的确认),由用户对目标系统进行验收
软件维护
改正性维护 适用性维护 完善性维护 预防性维护
特点
优点
缺点
瀑布模型有哪些特点,每个特点有什么意义
① 阶段间具有顺序性和依赖性
i. 必须等前一阶段的工作完成之后,才能开始后一阶段的工作
ii. 前一阶段的输出文档就是后一阶段的输入文档
iii. 只有前一阶段的输出文档正确,后一阶段的工作才能获得正确的结果
② 推迟实现的观点
i. 对于规模较大的软件项目来说,往往编码开始得越早最终完成开发工作所需要的时间反而越长
ii. 过早地考虑进行程序实现,往往导致大量返工,有时甚至发生无法弥补的问题,带来灾难性后果
iii. 清除地区分逻辑设计和物理设计,尽可能推迟程序的物理实现
③ 质量保证的观点
i. 软件工程的基本目标是优质、高产
ii. 及时审查,保证软件质量,降低软件成本
快速原型(rapid prototype)是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。
主要优点
本质是“快速”
与瀑布模型和快速原型模型的不同:
采用瀑布模型或快速原型模型开发软件时,目标都是一次就把一个满足用户需求的产品提交给用户。增量模型则与之相反,它分批地逐步向用户提交产品,每次提交一个满足用户需求子集的可运行的产品。
优点
缺点:
增量模型本身是自相矛盾的。它一方面要求开发人员把软件看做一个整体,另一方面又要求开发人员把软件看做构件序列,每个构件本质上都独立于另一个构件。除非开发人员有足够的技术能力协调好这一明显的矛盾,否则用增量模型开发出的产品可能并不令人满意。
困难
螺旋模型的基本思想是,使用原型及其他方法来尽量降低风险。
优点
它是风险驱动的,是主要优势也可能是弱点。
缺点:因为它是风险驱动的,除非软件开发人员具有丰富的风险评估经验和这方面的专门知识,否则将出现真正的风险。
喷泉模型是典型的面向对象生命周期模型。"喷泉”这个词体现了面向对象软件开发过程迭代和无缝的特性。
个体和交互胜过过程和工具
可以使用的软件胜过面面俱到的文档
客户合作胜过合同谈判
响应变化胜过遵循计划
能力成熟模型的结构
初始级
软件过程的特征是无序的,有时甚至是混乱的。
可重复级
建立了基本的项目管理过程,以追踪成本、进度和功能性。
必要的过程规范已经建立起来了,使得可以重复以前类似项目所取得的成功。
已定义级
用于管理和工程活动的软件工程已经文档化和标准化,并且已经集成到整个组织的软件过程中。所有的项目都使用文档化的、组织批准的过程来开发和维护软件,这一级包含了第2级的所有特性。
已管理级
已手机了软件过程和产品质量的详细度量数据,使用这些详细的度量数据,能够定量地理解和控制软件过程和产品。这一级包含了第3级地所有地特性
优化级
通过定量地反馈能够实现持续的过程改进,这些反馈是从过程及对新想法和技术的测试中获得的。这一级包含了第4级的所有特征。
关键过程域是达到一个成熟度等级的必要条件。
除第1 级成熟度之外, 每个成熟度等级都包含几个关键过程域。关键过程域指明了为改进其
软件过程,软件开发组织应该重视的区域,同时也指明了为达到某个成熟度等级所必须解决的问
题。下面列出的关键过程域是累加的。
成熟度第2 级
软件配置管理。软件质量保证。软件子合同管理。软件项目跟踪和监督软件。项目计划。需求管理。
成熟度第3 级
同事复审。组间协作。软件产品工程。集成的软件管理。培训计划。组织过程定义。组织过程焦点。
成熟度第4 级
软件质量管理。定量的过程管理。
成熟度第5 级
过程变化管理。技术变化管理。错误预防。
对比瀑布模型、原型模型、增量模型和螺旋模型。
瀑布模型:主要体现了分阶段、有控制的思想。活动间强调按顺序、文档化;存在的问题
是过于理想化,每一步的工作必须完整准确,否则无法进行下一步工作。
原型模型:需求分析入手快速、表达直观、容易交流。重点解决瀑布模型的需求分析入手难的问题。
增量模型:对于需求复杂的系统,采用分块开发、逐步集成的开发策略。增量体现了演进、
迭代思想,每一块就是一个增量。每个增量是一次迭代。增量模型的新版本叫做“极限编程(XP)” 。
螺旋模型: 融合了上述3 种模型,融进了循环往复、强化了演进迭代的思想,增加了风险
控制环节。但是,风险分析的正确性是左右软件演进的关键因素。
简述CMM 软件过程成熟度的5 个级别,以及每个级别对应的标准。
初始级的软件过程是无秩序的,它几乎处于无步骤可循的状态。管理是随机的,软件产品
的成功往往取决于个人。
在可重复级,已建立了基本的项目管理过程,对成本、进度和功能特性进行跟踪,并且在
借鉴以往经验的基础上制定了必要的规范。
在已定义级,用于管理和工程两个方面的过程均已文档化、标准化,并形成了整个软件组
织的标准软件过程。所有项目均使用经过批准、栽剪的标准软件过程来开发和维护软件。
己管理级的软件过程和产品质量有详细的度量标准并且得到了定量的认证和控制。
优化级的软件过程可以通过量化反馈和先进的新思想、新技术来不断地、持续性地改进。
尽管目前存在许多不同的结构化分析方法,但是,所有这些分析方法都遵守下述准则。
必须理解和表示问题的信息域,根据这条准则应该建立数据模型。
必须定义软件应完成的功能,这条准则要求建立功能模型。
必须表示作为外部事件结果的软件行为,这条准则要求建立行为模型。
必须对描述信息、功能和行为的模型进行分解,用层次的方式展示细节。
分析过程应该从要素信息移向实现细节。
看书
数据流图既提供了功能建模机制也提供了信息流建模机制。
数据流图有4 种基本符号: 正方形(或立方体)表示数据的源点或终点;圆角矩形(或圆形)代表变换数据的处理;开口矩形(或两条平行横线) 代表数据存储;箭头表示数据流,即特定数据的流动方向。千万不要试图在数据流图中表现分支条件或循环,这样做会造成混乱,画不出正确的数据流图。在数据流图中应该描绘所有可能的数据流向,而不应该描绘出现某个数据流的条件。虽然数据存储和数据流都是数据,但它们所处的状态不同。数据存储是处于静止状态的数据,数据流是处于运动中的数据。在数据流图中通常忽略出错处理,也不包括诸如打开或关闭文件之类的内务处理,数据流图的基本要点是描绘“做什么”而不考虑“怎样做“ 。
状态转换图(简称状态图)通过描绘系统的状态及引起系统状态转换的事件来表示系统的行为。此外,状态图还指出了作为特定事件的结果系统将做哪些动作(如处理数据)。状态状态是任何可以被观察到的系统行为模式, 一个状态代表系统的一种行为模式。状态规定了系统对事件的响应方式。
在状态图中定义的状态主要有:初态(即初始状态)、终态(即最终状态)和中间状态。在一张状态图中只能有一个初态,而终态则可以有0 至多个。事件
事件是在某个特定时刻发生的事情,它是对引起系统做动作或(和)从一个状态转换到另一个状态的外界事件的抽象。符号
在状态图中,初态用实心圆表示,终态用一对同心圆(内圆为实心圆)表示。中间状态用圆角矩形表示,可以用两条水平横线把它分成上、中、下3 个部分。上面部分为状态的名称,这部分是必须
有的;中间部分为状态变鼠的名字和值,这部分是可选的;下面部分是活动表,这部分也是可选的。
状态图中两个状态之间带箭头的连线称为状态转换,箭头指明了转换方向。状态变迁通常是由事件触发的,在这种情况下应在表示状态转换的箭头线上标出触发转换的事件表达式。
定义 描述数据的信息的集合,是对系统中使用的所有数据元素的定义集合
分析模型中包含了数据对象,功能和控制的表示.在每一种表示中,数据对象和控制项都扮演了一定的角色.为表示每个数据对象和控制项的特性,建立了数据字典.数据字典是所有与系统相关的数据元素的有组织的列表,并且包含了对这些数据元素的精确,严格定义,从而使得用户和系统分析员双方对输入,输出,存储的成分甚至中间计算结果由共同的理解。
数据字典中的定义,就是对数据自顶向下的分解。当分解到不需要进一步定义,每个和工程
有关的人也都清楚其含义的元素时,这种分解过程就完成了。
在数据字典中,通常采用下列符号。
=意思是等价于(或定义为)。
+意思是和( 即连接两个分量)。
[]意思是或(即从方括弧内列出的若干个分量中选择一个),通常用“ | ”号分开供选择的分量。
{}意思是重复(即重复花括弧内的分量)。
()意思是可选(即圆括弧里的分量可有可无)。
常常使用上限和下限进一步注释表示重复的花括弧。一种注释方法是在开括弧的左边用上角
标和下角标分别表明重复的上限和下限;另一种注释方法是在开括弧左侧标明重复的下限,在闭括弧的右侧标明重复的上限。
某旅馆的电话服务如下:可以拨分机号和外线号码。分机号是7201 "'7299; 外线号码先拨9, 然后是市话号码或长话号码;长话号码是由区号和市话号码组成;区号是100 - 300 中任意的数字串;市话号码是以局号和分局号组成;局号可以是455, 466, 888 , 552 中任意一个号码;分局号是任意长度为4 的数字串。请写出在数据字典中,电话号码的数据条目的组成。
电话号码的数据字典如下。
电话号码=分机号|外线号码
分机号= 7201…7299
外线号码= 9+ [ 市话号码 | 长话号码]
长话号码=区号+市话号码
区号= 100…300
市话号码= 局号+分局号
局号= [ 455 I 466 I 888 I 552 J
分局号= 4 {数字} 4
请简述数据流图的作用
请简述数据字典的作用。
数据流图的作用:数据流图可以用来抽象地表示系统或软件。从信息传递和加工的角度,
它以图形的方式刻画数据流从输入到输出的移动变换过程,同时可以按自顶向下、逐步分解的方
法表示内容不断增加的数据流和功能细节。因此,数据流图既提供了功能建模的机制,也提供了
信息流建模的机制,从而可以建立起系统或软件的功能模型。
数据词典的作用: 分析模型中包含了对数据对象、功能和控制的表示。在每一种表示中,
数据对象和控制项都扮演一定的角色。为表示每个数据对象和控制项的特性,建立了数据词典。
数据词典精确地、严格地定义了每一个与系统相关的数据元素,并以字典式顺序将它们组织起来,
使得用户和分析员对所有的输入、输出、存储成分和中间计算有共同的理解。
定义 模块化就是把程序划分成可独立命名且独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。
什么是模块、模块化?软件设计为什么要模块化?
模块:是完成特定功能的程序实体。模块是构成程序的基本构件。
模块化: 是指解决一个复杂问题时自顶向下逐层分解成若于模块的过程。每个模块完成一
个特定的子功能,所有模块按系统结构组合起来,完成整个系统所要求的功能。
模块化设计
耦合是对一个软件结构内不同模块之间互连程度的度量
耦合的强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据
在软件设计中应该追求尽可能松散耦合的系统。模块间的耦合程度强烈影响系统的可理解性
可测试性、可靠性和可维护性。
模块之间典型的耦合有数据耦合、特征耦合和公共环境耦合等。
耦合是影响软件复杂程度的一个重要因素。应该采取下述设计原则:
尽量使用数据耦合,少用控制耦合和特征耦合`限制公共环境耦合的范围,完全不用内容耦合。
标志一个模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。简单地说,理想内聚的模块只做一件事情。设计时应该力求做到高内聚,通常中等程度的内聚也是可以采用的`而且效果和高内聚相差不多。
内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。内聚和耦合都是进行模块化设计的有力工具,但是实践表明内聚更重要,应该把更多注意力集中到提高模块的内聚程度
重要的是设计时力争做到高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度,同时降低模块间的耦合程度,从而获得较高的模块独立性。
什么是内聚,什么是过程内聚,顺序内聚。指出它们之间的不同点,并举例说明
内聚:标志一个模块内各个元素彼此结合的紧密程度,是信息隐藏和局部化概念的自然扩展
过程内聚:一个模块内的处理元素是相关的,而且必须以特定次序执行,属于中内聚
顺序内聚:一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行,属于高内聚
不同点:过程内聚属于中内聚,顺序内聚属于高内聚
深度 软件结构中控制的层数
宽度 软件结构内同一层次上的模块总数的最大数
扇入 有多少个上级模块直接调用
扇出 一个模块直接控制(调用)的模块
模块的作用域应该在控制域之内
模块的控制域是这个模块本身以及所有直接或间接从属于它的模块的集合
层次图和HIPO图
通常使用层次图描绘软件的层次结构。在层次图中一个矩形框代表一个模块,框间的连线表示调用关系(位于上方的矩形框所代表的模块调用位于下方的矩形框所代表的模块)。在自顶向下逐步求精设计软件的过程中,使用层次图很方便。
HIPO 图是"层次图加输入/处理/输出图”的英文缩写。和H 图中的每个方框相对应,应该有一张IPO 图描绘这个方框代表的模块的处理过程。
结构图和层次图类似,也是描绘软件结构的图形工具。图中一个方框代表一个模块,框内注明模块的名字或主要功能,方框之间的箭头(或直线)表示模块的调用关系。
在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息。
数据流图 、层次图
变换分析
面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。信息流
有下述两种类型。
1 、变换流
信息沿输入通路进入系统,同时由外部形式变换成内部形式。进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。当数据流图具有这些特征时,这种信息流就叫做变换流。
2、事务流
原则上所有信息流都可以归结为这一类。数据沿输入通路到达一个处理T, 这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。这类数据流应该划为一类特殊的数据流,称为事务流。
程序流程图
程序流程图又称为程序框图,它是历史悠久、使用广泛的描述过程设计的方法,然而它也是用得非常混乱的一种方法。
盒图(N/S图)
出于要有一种不允许违背结构程序设计精神的图形工具的考虑, Nassi 和Shneiderman 提出了盒图,又称为N-S 图。由于盒图没有箭头,因此不允许随意转移控制。坚持使用盒图作为详细设计的工具,可以使程序员逐步养成用结构化的方式思考问题和解决问题的习惯。
PAD图
PAD 是问题分析图( Problem Analysis Diagram ) 的英文缩写。它用二维树形结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易。
判定表
当算法中包含多重嵌套的条件选择时,用程序流程图、盒图、PAD 图或后面即将介绍的过程设计语言( PDL ) 都不易清楚地描述。但是,判定表却能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。
一张判定表由4 部分组成:左上部列出所有条件, 左下部是所有可能做的动作,右上部是表示各种条件组合的一个矩阵,右下部是和每种条件组合相对应的动作。判定表右半部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。
判定树
判定表虽然能清晰地表示复杂的条件组合与应做的动作之间的对应关系,但其含义却不是一眼就能看出来的。初次接触这种工具的人要理解它需要有一个简短的学习过程。判定树是判定表的变种,能清晰地表示复杂的条件组合与应做的动作之间的对应关系。判定树的优点在于,它的形式简单到不需任何说明,使人一眼就可以看出其含义,因此易于掌握和使用。多年来判定树一直受到人们的重视,是一种比较常用的系统分析和设计的工具。
为什么说“高内聚、低耦合” 的设计有利于提高系统的独立性?
请简述结构化设计的优点。
减少设计复杂性。将大化小,使复杂问题简单化。结构独立。将程序划分成多个相对独立的模块。模块功能单一化,可使软件设计获得最大的益处。易于进行软件修改。
易于开发和维护。加强了代码的可重用性。
测试是为了发现程序中的错误而执行的过程
好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案
成功的测试是发现至今为止尚未发现的错误的测试。
对于软件测试而言,黑盒测试法是把程序看成一个黑盒子,完全不考虑程序的内部结构和处
理过程。也就是说,黑盒测试是在程序接口进行的测试,它只检查程序功能是否能按照规格说明
书的规定正常使用,程序是否能适当地接收输入数据产生正确的输出信息,并且保持外部信息(如
数据库或文件)的完整性。黑盒测试又称为功能测试。白盒测试法的前提是可以把程序看成装在
一个透明的白盒子里,也就是完全了解程序的结构和处理过程。这种方法按照程序内部的逻辑测
试程序,检验程序中的每条通路是否都能按预定要求正确工作。白盒测试又称为结构测试。
所有的测试都应该能追溯到用户需求。
应该在测试开始之前的相当长时间,就制定出测试计划。
把Pareto 原理应用于软件测试。Pareto 原理告诉我们,测试发现的错误中的80%很可能是
由程序中20%的模块造成的。
测试应该从“小规模“开始, 并逐步进行“大规模"测试。
穷举测试是不可能的。
为了达到最佳的测试效果,应该由独立的第三方来从事测试工作。
逻辑覆盖是设计白盒测试方案的一种技术。
所谓逻辑覆盖是对一系列测试过程的总称,这组测试过程逐渐进行越来越完整的通路测试。
从覆盖源程序语句的详尽程度分析,大致有以下一些不同的覆盖标准。
为了暴露程序中的错误,至少每个语句应该执行一次
含义是:选择足够多的测试数据,使被测程序中每个语句至少执行一次
含义:不仅每个语句必须至少执行一次,而且每个判定的每种可能的结果都应该至少执行一次,
也就是每个判定的每个分支都至少执行一次
含义:不仅每个语句至少执行一次,而且是判定表达式中的每个条件都取到各种可能的结果。
选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果
选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次
黑盒测试着重测试软件的功能需求,也就是说,黑盒测试让软件工程师设计出能充分检查程
序所有功能需求的输入条件集。黑盒测试并不能取代白盒测试技术,它是与白盒测试互补的方法
它很可能发现白盒测试不易发现的其他不同类型的错误。
黑盒测试力图发现下述类型的错误
自盒测试在测试过程的早期阶段进行,而黑盒测试主要用于测试过程的后期。
等价划分是一种黑盒测试方法,这种方法把程序的输入域划分成数据类,据此可以导出测试用例。一个理想测试用例能独立发现一类错误(如对所有字符数据的处理都不正确)。
划分等价类需要经验,下述几条启发式规则可能有助于等价类的划分。
划分出等价类以后,根据等价类设计测试方案时主要使用下面两个步骤。
第1 步,设计一个新的测试方案以尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步骤
直到所有的有效等价类都被覆盖为止。
第2 步,设计一个新的测试方案,使它覆盖一个而且只覆盖一个尚未被覆盖的无效等价类,
重复这一步骤直到所有无效等价类都被覆盖为止。
注意,通常程序发现一类错误后就不再检查是否还有其他错误。因此,应该使每个测试方案
只覆盖一个无效的等价类。
经验表明,处理边界情况时程序最容易发生错误。例如,许多程序错误出现在下标、纯量、
数据结构、循环等的边界附近。因此,设计使程序运行在边界情况附近的测试方案,暴露出程序
错误的可能性更大一些。
使用边界值分析方法设计测试方案首先应该确定边界情况,这需要经验和创造性。通常输入
等价类和输出等价类的边界,就是应该着重测试的程序边界情况。选取的测试数据应该刚好等于、
刚刚小于和刚刚大于边界值。也就是说,按照边界值分析法,应该选取刚好等于、稍小于和稍大
于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。
通常,设计测试方案时总是联合使用等价划分和边界值分析两种技术。
什么是测试,测试的目标是什么
测试是为了发现程序中的错误而执行程序的过程
测试的目标是尽可能多地发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用
[1] 张海藩,吕云翔. 软件工程(第4版)[M]. 北京:人民邮电出版社,2013 软件工程
[2] 张海藩,吕云翔. 软件工程(第4版)学习辅导与习题解析[M]. 北京: 人民邮电出版社,2013