一、备考指南
软件工程基础知识主要考查的是软件工程基础、软件开发方法、系统分析、设计、测试及运行和维护等相关知识,同时也是重点考点,在系统架构设计师的考试中选择题12~15分,案例分析和论文中也会考到相关内容,属于重点章节之一。
二、重点考点
1、软件开发生命周期
2、能力成熟度模型CMM和能力成熟度模型集成CMMI
3、软件过程模型
4、敏捷模型
5、统一过程模型
6、逆向工程
7、模块内聚和模块耦合
8、测试基础知识
9、系统运行与维护
三、软件开发生命周期
1、软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。
2、软件开发时期:就是软件的设计与实现,可分成概要设计、详细设计、编码、测试等。
3、软件运行和维护:就是把软件产品移交给用户使用。
4、软件系统的文档可以分为用户文档和系统文档两类,用户文档主要描述系统功能和使用方法,并不关心这些功能是怎样实现的;系统文档描述系统设计、实现和测试等各方面的内容。
5、软件工程过程是指为获得软件产品,在软件工具的支持下由软件工程师完成的一系列软件工程活动,包括以下四个方面:
(1)P(Plan)--软件规格说明。规定软件的功能及其运行时的限制。
(2)D (Do)--软件开发。开发出满足规格说明的软件。
(3)C(Check)--软件确认。确认开发的软件能够满足用户的需求。
(4)A(Action)--软件演进。软件在运行过程中不断改进以满足客户新的需求。
6、软件系统工具通常可以按软件过程活动分为软件开发工具、软件维护工具、软件管理和软件支持工具。
(1)软件开发工具:需求分析工具、设计工具、编码与排错工具、测试工具等。
(2)软件维护工具:版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工程工具。
(3)软件管理和软件支持工具:项目管理工具、配置管理工具、软件评价工具、软件开发工具的评价和选择。
软件设计包括四个既独立又相互联系的活动,即数据设计、架构(体系结构)设计、人机界面(接口)设计和过程设计,这四个活动完成以后就得到了全面的软件设计模型。
四、能力成熟度模型CMM和能力成熟度模型集成CMMI
1、能力成熟度模型
能力成熟度模型(Capability Maturity Model,CMM)是对软件组织化阶段的描述,随着软件组织定义、实施、测量、控制和改进其软件过程,软件组织的能力经过这些阶段逐步提高,针对软件研制和测试阶段。
2、能力成熟度模型集成
能力成熟度模型集成(Capability Maturity Model Integration, CMMI)是若干过程模型的综合和改进,不仅仅支持软件,而且支持多个工程学科和领域的、系统的、一致的过程改进框架,能话应现代工程的特点和需要,能提高过程的质量和工作效率。CMM有阶段式模型和连续式模型两种表示法。
(1)阶段式模型:类似于CMM,它关注组织的成熟度,五个成熟度模型级别见表。
(2)连续式模型:关注每个过程域的能力,一个组织对不同的过程域可以达到不同的过程域能力等级。
五、软件过程模型
1、瀑布模型(SDLC): 结构化方法中的模型,是结构化的开发,开发流程如同瀑布一般,一步一步走下去,直到最后完成项目开发,只适用于需求明确或者二次开发(需求稳定),当需求不明确时,最终开发的项目会有错误,有很大的缺陷。
2、原型模型: 与瀑布模型相反,原型针对的就是需求不明确的情况,首先快速构造一个功能模型,演示给用户看,并按用户要求及时修改,中间再通过不断地演示与用户沟通,最终设计出项目,就不会出现与用户要求不符合的情况,采用的是迭代的思想。不适合超大项目开发。
3、增量模型: 首先开发核心模块功能,而后与用户确认,之后再开发次核心模块的功能,即每次开发一部分功能,并与用户需求确认,最终完成项目开发,优先级最高的服务最先交付,但由于并不是从系统整体角度规划各个模块,因此不利于模块划分。难点在于如何将客户需求划分为多个增量。与原型不同的是增量模型的每一次增量版本都可作为独立可操作的作品,而原型的构造一般是为了演示。
4、螺旋模型:是多种模型的混合,针对需求不明确的项目,与原型类似,但是增加了风险分析这也是其最大的特点。适合大型项目开发。
5、V模型: 特点是增加了很多轮测试,并且这些测试贯穿于软件开发的各个阶段,不像其他模型都是软件开发完再测试,很大程度上保证了项目的准确性。V模型的开发和测试级别对应如图。
6、喷泉模型: 特点是面向对象的模型,而上述其他的模型都是结构化的模型,使用了迭代思想和无间隙开发。
7、基于构件的开发模型(CBSD ):特点是增强了可复用性,在系统开发过程中,会构建一个构件库,供其他系统复用,因此可以提高可靠性,节省时间和成本。
8、形式化方法模型:建立在严格的数学基础上的一种软件开发方法,主要活动是生成计算机软件形式化的数学规格说明。
六、敏捷模型 (以人为本)
开发宣言:“个体和交互”胜过“过程和工具”、“可以工作的软件”胜过“面面俱到的文档”、“客户合作”胜过“合同谈判”、“响应变化”胜过“遵循计划”。
1、敏捷方法区别于其他方法的两个特点:
(1)是“适应性”而非“预设性”。
(2)是“面向人的”而非“面向过程的”。
2、敏捷方法的核心思想:
(1)敏捷方法是适应型,而非可预测型。拥抱变化,适应变化。
(2)敏捷方法是以人为本,而非以过程为本。发挥人的特性。
(3)迭代增量式的开发过程。以原型开发思想为基础,采用迭代增量式开发,发行版本小型化。
3、主要敏捷方法:
(1)极限编程(XP)。基础和价值观是交流、朴素、反馈和勇气,即任何一个软件项目都可以从加强交流、从简单做起、寻求反馈、勇于实事求是四个方面入手进行改善。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期: 通过积极的交流、反馈以及其他一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困因难等,并根据实际情况及时地调整开发过程。XP提倡测试先行,为了将以后出现bug 的概率降到最低。
(2)水晶系列方法。与XP方法一样,都有以人为中心的理念,但在实践上有所不同。其目的是发展一种提倡“机动性的”方法,包含具有共性的核心元素,每个都含有独特的角色、过程模式、工作产品和实践。
(3)并列争球法(Scrum)。是一种迭代的增量化过程,把每段时间(如30天)一次的迭代称为一个“冲刺”(Sprint),并按需求的优先级别来实现产品,多个自组织和自治的小组并行地递增实现产品。
(4)特性驱动开发方法(FDD)。是一个迭代的开发模型。认为有效的软件开发需要三个要素: 人、过程和技术。有五个核心过程:开发整体对象模型、构造特征列表、计划特征开发、特征设计和特征构建。其中,计划特征开发根据构造出的特征列表、特征间的依赖关系进行计划,设计出包含特征设计和特征构建过程组成的多次迭代。
七、统一过程模型(RUP)
RUP描述了如何有效地利用商业的、可靠的方法开发和部署软件,是一种重量级过程。RUP 类似一个在线的指导者,它可以为所有方面和层次的程序开发提供指导方针、模板以及事例支持。
1、RUP软件开发生命周期是一个二维的软件开发模型,RUP 中有九个核心工作流,这九个核心工作流如下。
①业务建模:理解待开发系统所在的机构及其商业运作,确保所有参与人员对待开发系统所在的机构有共同的认识,评估待开发系统对所在机构的影响。
②需求:定义系统功能及用户界面,使客户知道系统的功能,使开发人员理解系统的需求为项目预算及计划提供基础。
③分析与设计:把需求分析的结果转化为分析与设计模型。
④实现:把设计模型转换为实现结果,对开发的代码做单元测试,将不同实现人员开发的模块集成为可执行系统。
⑤测试:检查各子系统之间的交互、集成,验证所有需求是否均被正确实现,对发现的软件质量上的缺陷进行归档,对软件质量提出改进建议。
⑥部署:打包、分发、安装软件,升级旧系统;培训用户及销售人员,并提供技术支持。
⑦配置与变更管理:跟踪并维护系统开发过程中产生的所有制品的完整性和一致性。
⑧项目管理:为软件开发项目提供计划、人员分配、执行、监控等方面的指导,为风险管理提供框架。
⑨环境:为软件开发机构提供软件开发环境,即提供过程管理和工具的支持。
2、RUP把软件开发生命周期划分为多个循环,每个循环生成产品的一个新的版本,每个循环依次由以下四个连续的阶段组成,每个阶段完成确定的任务。
①初始阶段:定义最终产品视图和业务模型,并确定系统范围。
②细化阶段:设计及确定系统的体系结构,制订工作计划及资源要求。
③构造阶段:构造产品并继续演进需求、体系结构、计划直至产品提交。
④移交阶段:把产品提交给用户使用。
3、RUP中定义了如下一些核心概念,理解这些概念对于理解RUP很有帮助。
①角色:Who的问题。角色描述某个人或一个小组的行为与职责。RUP预先定义了很多角色,如体系结构师、设计人员、实现人员、测试员和配置管理人员等,并对每一个角色的工作和职责都做了详尽的说明。
②活动:How的问题。活动是一个有明确目的的独立工作单元。
③制品:What 的问题。制品是活动生成、创建或修改的一段信息。
④工作流:When的问题。工作流描述了一个有意义的连续的活动序列,每个工作流产生一些有价值的产品,并显示了角色之间的关系。
4、RUP的特点:
(1)用例驱动:需求分析、设计、实现和测试等活动都是用例驱动的。
(2)以体系结构为中心:包括系统的总体组织和全局控制、通信协议、同步、数据存取、给设计元素分配功能、设计元素的组织、物理分布、系统的伸缩性和性能等。软件的体系结构是一个多维的结构,会采用多个视图来描述。
在典型的4+1视图模型(图)中,分析人员和测试人员关心的是系统的行为,会侧重于用例视图;最终用户关心的是系统的功能,会侧重于逻辑视图;程序员关心的是系统的配置、装配等问题,会侧重于实现视图;系统集成人员关心的是系统的性能、可伸缩性、吞吐率等问题,会侧重于进程视图;系统工程师关心的是系统的发布、安装、拓扑结构等问题,会侧重于部署视图。
(3)迭代与增量。把整个项目开发分为多个迭代过程。在每次迭代中,只考虑系统的一部分需求,进行分析、设计、实现、测试和部署等过程;每次迭代是在已完成部分的基础上进行的,每次增加一些新的功能实现,以此进行下去,直至最后项目完成。
八、逆向工程
1、软件复用是将已有软件的各种有关知识用于建立新的软件,以缩减软件开发和维护的时间。软件复用是提高软件生产力和质量的一种重要技术。早期的软件复用主要是代码级复用,被复用的知识专指程序,后来扩大到包括领域知识、开发经验、设计决定、体系结构、需求、设计、代码和文档等一切有关方面。
2、软件的逆向工程是分析程序,力图在比源代码更高抽象层次上建立程序的表示过程,逆向工程是设计的恢复过程,其四个级别如下:
①实现级:包括程序的抽象语法树、符号表、过程的设计表示。
②结构级:包括反映程序分量之间相互依赖关系的信息,如调用图、结构图、程序和数据结构。
③功能级:包括反映程序段功能及程序段之间关系的信息,如数据和控制流模型。
④领域级:包括反映程序分量或程序诸实体与应用领域概念之间对应关系的信息,如E-R模型。其中,领域级抽象级别最高、完备性最低,实现级抽象级别最低、完备性最高。
3、与逆向工程相关的概念有重构、设计恢复、再工程和正向工程。
(1)重构是指在同一抽象级别上转换系统描述形式。
(2)设计恢复是指借助工具从已有程序中抽象出有关数据设计、总体结构设计和过程设计等方面的信息。
(3)再工程是指在逆向工程所获得信息的基础上,修改或重构已有的系统,产生系统的一个新版本。再工程是对现有系统的重新开发过程,包括逆向工程、新需求的考虑过程和正向工程三个步骤。它不仅能从已存在的程序中重新获得设计信息,而且还能使用这些信息来重构现有系统,以改进它的综合质量。在利用再工程重构现有系统的同时,一般会增加新的需求,包括增加新的功能和改善系统的性能。
(4)正向工程是指不仅从现有系统中恢复设计信息,而且使用该信息去改变或重构现有系统,以改善其整体质量。
九、模块内聚和模块耦合
1、系统设计相关知识
①系统设计的主要目的:为系统制订蓝图,在各种技术和实施方法中权衡利弊,精心设计,合理地使用各种资源,最终勾画出新系统的详细设计方法。
②系统设计的方法:结构化设计方法,面向对象设计方法。
③系统设计包括概要设计和详细设计。
④概要设计的基本任务:又称为系统总体结构设计,是将系统的功能需求分配给软件模块,确定每个模块的功能和调用关系,形成软件的模块结构图,即系统结构图。
⑤详细设计的基本任务:模块内详细算法设计、模块内数据结构设计、数据库的物理设计、其他设计(代码、输入/输出格式、用户界面)、编写详细设计说明书、评审。
⑥系统设计的基本原理:
1)抽象化。2)自顶而下,逐步求精。3)信息隐蔽。4)模块独立(高内聚,低耦合)。5)系统设计原则。6)保持模块的大小适中。7)尽可能减少调用的深度。8)多扇入,少扇出。9)单入口,单出口。10)模块的作用域应该在模块之内。11)功能应该是可预测的。
2、模块内聚
模块内聚程度从低到高分别为偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚和功能内聚。
3、模块耦合
模块耦合程度从低到高分别为无直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公耦合和内容耦合。
十、测试基础知识
1、测试类型
测试类型按照是否在计算机上运行程序,可以分为两大类:
(1)动态测试:程序运行时测试,分为以下三种方法。
①黑盒测试法:功能性测试,不了解软件代码结构,根据功能设计用例,测试软件功能。
②白盒测试法:结构性测试,明确代码流程,根据代码逻辑设计用例,进行用例覆盖。
③灰盒测试法:即既有黑盒,也有白盒。
(2)静态测试:程序静止时即对代码进行人工审查,分为以下三种方法。
①桌前检查:程序员检查自己编写的程序,在程序编译后,单元测试前。
②代码审查:由若干个程序员和测试人员组成评审小组,通过召开程序评审会来进行审查。
③代码走查:也是采用开会的形式来对代码进行审查,但并非简单的检查代码,而是由测试人员提供测试用例,让程序员扮演计算机的角色,手动运行测试用例,检查代码逻辑。
2、测试用例设计
(1)黑盒测试用例:将程序看做一个黑盒子,只知道输入、输出,不知道内部代码,由此设计出测试用例,分为以下几类:
①等价类划分:把所有的数据按照某种特性进行归类,而后在每类的数据里选取一个即可。等价类测试用例的设计原则是设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。
②边界值划分:将每类的边界值作为测试用例,边界值一般为范围的两端值以及在此范围之外的与此范围间隔最小的两个值,如年龄范围为0~150,边界值为0、150、-1、151。
③错误推测:没有固定的方法,凭经验而言,来推测有可能产生问题的地方,作为测试用例进行测试。
④因果图:由一个结果来反推原因的方法,具体结果具体分析,没有固定方法。
(2)白盒测试用例:知道程序的代码逻辑,按照程序的代码语句来设计覆盖代码分支的测试用例,覆盖级别从低至高分为以下几种:
①语句覆盖(SC):逻辑代码中的所有语句都要被执行一遍,覆盖层级最低,因为执行了所有的语句,不代表执行了所有的条件判断。
②判定覆盖(DC):逻辑代码中的所有判断语句的条件的真假分支都要覆盖一次。
③条件覆盖:程序流程图里每一个判定里的每一个子条件都要取真和假。
④条件判定覆盖(CC):针对每一个判断条件内的每一个独立条件都要执行一遍真和假。
⑤条件判定组合覆盖(CDC):同时满足判定覆盖和条件覆盖。
⑥路径覆盖:逻辑代码中的所有可行路径都覆盖了,覆盖层级最高。
3、调试
(1)测试与调试的区别。
①测试是发现错误,调试是找出错误的代码和原因。
②调试需要确定错误的准确位置;确定问题的原因并设法改正;改正后要进行回归测试。
(2)调试的方法。
①蛮力法:又称为穷举法或枚举法,穷举出所有可能的方法一一尝试。
②回溯法:又称为试探法,按选优条件向前搜索,以达到目标,当发现原先选择并不优或达不到目标时,就退回一步重新选择。
③演绎法:是由一般到特殊的推理方法,与“归纳法”相反,一般性的前提出发,得出具体陈述或个别结论的过程。
④归纳法:是由特殊到一般的推理方法,从测试所暴露的问题出发,收集所有正确的或不正确的数据,分析它们之间的关系,提出假想的错误原因,用这些数据来证明或反驳,从而查出错误所在。
4、软件度量
(1)软件的两种属性。外部属性指面向管理者和用户的属性,可直接测量,一般为性能指标。内部属性指软件产品本身的属性,如可靠性等,只能间接测量。
(2)McCabe度量法,又称环路复杂度。假设有向图中有向边数为m,节点数为n,则此有向图的环路复杂度为m-n+2.
注意m和n代表的含义不能混淆,可以用一个最简单的环路来做特殊值记忆此公式,另外,针对一个程序流程图,每一个分支边(连线)就是一条有向边,每一条语句(语句框)就是一个顶点。
此外,推荐使用另一种更简单的计算公式:环路复杂度=判定节点个数+1。
十一、系统运行与维护
1、系统转换
2、系统维护概述
系统的可维护性可以定义为维护人员理解、改正、改动和改进这个软件的难易程度,其评价指标如下:
(1)易分析性。软件产品诊断软件中的缺陷或失效原因或识别待修改部分的能力。
(2)易改变性。软件产品使指定的修改可以被实现的能力,实现包括编码、设计和文档的更改。
(3)稳定性。软件产品避免由于软件修改而造成意外结果的能力。
(4)易测试性。软件产品使已修改软件能被确认的能力。
(5)维护性的依从性。软件产品遵循与维护性相关的标准或约定的能力。
系统维护包括硬件维护、软件维护和数据维护,其中软件维护类型如下:
(1)正确性维护:发现了bug 而进行的修改。
(2)适应性维护:由于外部环境发生了改变,被动进行的对软件的修改和升级。
(3)完善性维护:基于用户主动对软件提出更多的需求,修改软件,增加更多的功能,使比之前的软件功能、性能更高,更加完善。
(4)预防性维护:对未来可能发生的bug进行预防性修改。