1、 什么是软件工程?
在《计算机科学技术百科全书》中软件工程是应用计算机科学、数学及管理科学等原理,开发软件的工程。
2、软件生存周期分哪几个阶段?分别简述各个阶段的任务。
答:软件生存周期有计算机系统工程、需求分析、设计、编码、测试、运行和维护6个阶段。 A计算机系统工程的任务是确定待开发软件的总体要求和范围,以及该软件与其他计算机系统元素之间的关系,进行成本估算,做出进度安排,并进行可行性分析,即从经济、技术、法律等方面分析待开发的软件是否有可行的解决方案,并在若干个可行的解决方案中做出选择。
B需求分析主要解决待开发软件要“做什么”的问题,确定软件的功能、性能、数据、界面等要求,生成软件需求规约。
C软件设计只要解决待开发软件“怎么做”的问题。软件设计通常可分为系统设计和详细设计。系统设计的任务是设计软件系统的体系结构,包括软件系统的组成成分、各成分的功能和接口、成分间的连接和通信,同时设计全局数据结构。详细设计的任务是设计各个组成成分的实现细节,包括局部数据结构和算法等。
D编码阶段的任务是用某种程序设计语言,将设计的结果转换为可执行的程序代码。 E测试阶段的任务是发现并纠正软件中的错误和缺陷。测试主要包括单元测试、集成测试、确认测试和系统测试。
F软件完成各种测试后就可交付使用,在软件运行期间,需对投入运行的软件进行维护,即可发现了软件中潜藏的错误或需要增加新的功能或使软件适应外界环境的变化等情况出现时,对软件进行修改。 3、简述各类软件过程模型的特点。
答:典型的软件过程模型有:瀑布模型、演化模型(增量模型、原型模型、螺旋模型)、喷泉模型、基于构件的开发模型和形式方法模型等。
A瀑布模型中,上一阶段的活动完成并经过评审后才能开始下一阶段的活动,其特征是: 接受上一阶段活动的结果作为本阶段活动的输入; 依据上一阶段活动的结果实施本阶段应完成的活动; 对本阶段的活动进行评审; 将本阶段活动的结果作为输出。
B增量模型将软件的开发过程分成若干个日程时间交错的线性序列,每个线性序列产生软件的一个可发布的增量版本,后一个版本是对前一个版本的修改和补充,重复增量发布的过程,直至产生最终的完善产品。
C原型方法从软件工程师与客户的交流开始,其目的是定义软件的总体目标,标识需求。然后快速制定原型开发的计划,确定原型的目标和范围,采用快速设计的方式对其建模,并构
建模型。被开发的原型应交付给客户使用,并收集客户的反馈意见,这些反馈意见可在下一轮迭代中对原型进行改进。在前一个原型需要改进,或者需要扩展其范围的时候,进入下一轮原型的迭代开发。
D螺旋模型将原型模型实现的迭代特征与瀑布模型中控制的和系统化的方面结合起来,不仅体现了这两种模型的优点而且还增加了风险分析。
E喷泉模型是一种支持面向对象开发的过程模型。类及对象是面向对象方法中的基本成分。在分析阶段,标识类及对象,定义类之间的关系,建立对象-关系模型和对象-行为模型。在设计阶段,从实现的角度对分析模型进行调整和扩充。在编码阶段,用面向对象语言实现类及对象,通过消息机制实现对象之间的通信,完成软件的功能。在面向对象方法中,分析模型和设计模型采用相同的符号表示体系,开发的各个活动没有明显的边界,各个活动经常重复,迭代地交替进行。
F基于构件的开发模型,基于构件的开发是指利用预先包装的构建来构造应用系统。构件可以是组织内部开发的构建,也可以是商业化的、现存的软件构件。
G形式化方法是建立在严格数学基础上的一种软件开发方法。软件开发的全过程中,从需求分析、规约、设计、编程、系统集成、测试、文档生成,直至维护等各个阶段,凡是采用严格的数学语言,具有精确的数学语义的方法,都称为形式化方法。形式化方法用严格的数学语言和语义描述功能和设计规约,通过数学的分析和推导,易于发现需求的歧义性、不完整性和不一致性,易于对分析模型、设计模型和程序进行验证。通过数学的演算,使得从形式化功能规约到形式化设计规约,以及从形式化设计规约到程序代码转换成为可能。
CMM是指“能力成熟度模型”,其英文全称为Capability Maturity Model for Software,英文缩写为SW-CMM,简称CMM。
CMMI全称是Capability Maturity Model Integration,即能力成熟度模型集成(也有称为:软件能力成熟度集成模型)
CASE:计算机辅助软件工程。用户的需求进化为核心,采用迭代、循序渐进的方法进行
软件开发。
CASE工具主要包括:画图工具,报告生成工具,数据词典、数据库管理系统和规格说明检查工具,代码生成工具和文档资料生成工具等。 Case环境
可行性分析
经济可行性:主要进行成本效益分析,从经济角度,确定系统是否值得开发。 成本、效益、货币的时间价值、投资回收期、纯收入 技术可行性:风险分析、资源分析、技术分析 法律可行性: 需求工程六个阶段:
需求获取、需求分析与协商、系统建模、需求规约、需求验证、需求管理
简述模块、模块化及模块化设计的概念。
在软件工程中模块是数据说明、可执行语句等程序对象的集合,具有名字、参数、功能等外部特征以及完成模块功能的程序代码和模块内部数据等内部特征。
模块化,即把软件按照规定原则,划分为一个个较小的,相互独立的但又相互关联的部件,实际上是系统分解和抽象的过程。
模块化设计,简单地说就是程序的编写不是开始就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系。逐步求精的结果是得到一系列以功能块为单位的算法描述。以功能块为单位进行程序设计,实现其求解算法的方法称为模块化。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。
模块的独立性是模块化、信息隐藏和局部化等概念的直接结果。
用内聚度与耦合度来度量独立性。内聚度度量同一个模块内部各个元素彼此结合的紧密程度,耦合度度量不同模块彼此间相互以来的紧密程度。 软件设计的任务:
数据/类设计、体系结构设计、接口设计、部件级设计 软件设计原则:
1、 抽象与逐步求精 2、模块化 3、信息隐藏 4、功能独立
模块耦合度和模块内聚度
如何判读数据流图的一致性和完整性?
一致性:检查(1)父图与子图平衡(2)数据守恒(3)局部文件(4)一个加工的输出数据流不能与该加工的输入数据流同名
完整性:检查(1)每个加工至少有一个输入数据流和一个输出数据流(2)在整套分层数据流图中,每个文件应至少有一个加工读该文件,有另一个加工写该文件(3)分层数据流图中的每个数据流和文件都必须命名(除了流入或流出文件的数据流),并保持与数据字典一致(4)分层DFD的每个基本加工都应有一个加工公约 为了实现有效的模块化,给出以下启发式设计策略: 1、 改造程序结构图、降低耦合度、提高内聚度 2、 避免高扇出,并随着深度的加入,力求高扇入 3、 模块的影响范围应限制在该模块的控制范围内 4、 降低模块接口的复杂程度和冗余程度,提高一致性 5、 模块的功能应该是可预测的,避免对模块施加过多的限制 6、 尽可能设计单入口和单出口的模块 DFD图、数据字典、判定数、判定表的应用
面向对象的基本概念、用况图、类图、状态机图的应用
软件测试的目的是什么?
答:软件测试的目的是发现软件中的错误和缺陷,并加以纠正。 什么是白盒测试?什么是黑盒测试?
答:白盒测试又称结构测试,这种方法把测试对象看作一个透明的盒子,测试人员根据程序内部的逻辑结构及有关信息设计测试用例,检查程序中所有逻辑路径是否都按预定的要求正确地工作。白盒测试主要用于对程序模块的测试。包括: ??程序模块中的所有独立路径至少执行一次。
??对所有逻辑判定的取值(?真?与?假?)都至少测试一次。 ??在上下边界及可操作范围内运行所有循环。 ??测试内部数据结构的有效性等。
黑盒测试又称行为测试,这种方法把测试对象看作一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符号它的功能需求。黑盒测试可用于各种测试,它试图发现以下类型的错误: ??不正确或遗漏的功能
??接口错误,如输入输出参数的个数、类型等。
??数据结构错误或外部信息(如外部数据库)访问错误。 ??性能错误。
??初始化和终止错误。
分别简述单元测试、集成测试、确认测试和系统测试的任务。 单元测试:
又称模块测试,着重对软件设计的最小单元——软件构件或模块进行验证。
单元测试根据设计描述,对重要的控制路径进行测试,已发现构建或模块内部的错误,通常采用白盒测试,并且多个构件或模块可以并行测试。
单元测试的主要内容:接口、局部数据结构、边界条件、独立路径和错误处理路径。 集成测试:
集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根据结构图)组装成为子系统或系统,进行集成测试。实践表明,一些模块虽然能够单独地工作,但并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出来,影响功能的实现。
目的:是确保各单元组合在一起后能够按既定意图协作运行,并确保增量的行为正确。它所测试的内容包括单元间的接口以及集成后的功能。使用黑盒测试方法测试集成的功能。并且对以前的集成进行回归测试。 确认测试:
确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是确认测试的任务,即软件的功能和性能如同用户所合理期待的那样。 系统测试:
将已经确认的软件、计算机硬件、外设、网络等其他元素结合在一起,进行信息系统的各种组装测试和确认测试,系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方,从而提出更加完善的方案。系统测试发现问题之后要经过调试找出错误原因和位置,然后进行改正。是基于系统整体需求说明书的黑盒类测试,应覆盖系统所有联合的部件。对象不仅仅包括需测试的软件,还要包含软件所依赖的硬件、外设甚至包括某些数据、某些支持软件及其接口等。 什么是α测试?什么是β测试? α测试:
α测试是由一个用户在开发者的场所进行的测试,软件在开发者对用户的“指导下”进行测试。经过α测试后的软件称为β测试。 β测试:
β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见,然后软件开发公司再对β版本进行改错和完善。β测试也是黑盒测试。黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。 13.7什么是回归测试?
回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归
压力测试:又称强度测试,是在一种需要非正常数量、频率或容量的方式下执行系统,其目的是检查系统对非正常情况的承受程度。
性能测试用来测试软件在集成的系统中的运行性能。对实时系统和嵌入式系统尤为重要。 设计软件测试样例
可维护性是指,理解、改正、调整和改进软件的难易程度。
逆向工程是指,在软件生存周期中,将软件的某种形式描述转换成更抽象形式的活动。 再工程是指在逆向工程所获的信息的基础上修改或重构已有的系统,产生系统的一个新版本。 再工程过程:
1、 库存目录分析 2、文档重构 3、逆向工程 4、代码重构 5、数据重构 6、正向工程 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发
敏捷开发方法的共同特征:
1、 短迭代的生命周期模型 2、开发中可运行的软件 3、短线沟通和快速反馈 4、变化的需
求和架构 价值观:沟通、简单、反馈、勇气、尊重/人和交互重于过程和工具。可以工作的软件重于求全责备的文档。客户协作重于合同谈判。随时应对变化重于循规蹈矩。其中位于右边的内容虽然也有其价值,但是左边的内容最为重要。 原则: