SE Part3

160 阅读13分钟

image.png

概念

  1. 软件

软件是多种术语和对象的集合,并将这些术语和对象有效的配置起来。一般包括程序,数据和文档。

  1. 软件工程

软件工程是指应用计算机理论和技术,以及工程管理的原则和方法,按照预算和进度实现满足用户需求产品的工程,或者以此为研究对象的学科。

  1. 软件过程

生产一个满足需求且达到工程目标的软件产品的步骤。

  1. 敏捷开发

核心是迭代开发,也就是将一个大任务分解成多次连续的开发,逐步改善。通过增量开发划分每次迭代,也即是按照每次增加的新功能来划分迭代。

  1. 极限编程

是敏捷开发的一种方式,主要是面向对象的开发方法。一般包括四部分,计划,设计,重构,测试。

  1. 配置管理

记录软件产品的演化过程。确保开发者在软件在生命周期的各个阶段都能准确得到产品的配置信息。

  1. 软件项目管理

为了使软件项目能够按照预定的成本,进度,质量进行,而对成本,进度,质量,人员,风险等方面进行分析和管理的活动。

  1. 基线

指一个或一组配置项在不同生命周期的时间点上,通过正式评审之后进入正式受控的一种状态。可以说重要的且需要确认的里程碑就是基线。

  1. 里程碑

在进度表上设置一些重要的检查点,在项目执行的过程中可以通过这些检查点对项目进行检查和控制,我们称这些重要的检查点就是里程碑。

  1. 耦合

衡量模块间连接的紧密程度。

  1. 内聚

衡量模块内部各个元素连接的紧密程度。

  1. 数据字典/数据流图

数据流图是一种图形化技术,它描述信息流和数据从输入移动到输出所经受的变换。
数据字典是关于数据信息的集合,也就是包含了数据流图中所有元素的集合。

  1. 软件的生存周期

从形成软件概念时开始,所开发的软件使用之后直到失去使用价值不再使用,消失为止的整个过程。
由三个阶段组成:软件定义阶段,开发阶段,维护阶段。
定义阶段分为:问题定义,可行性研究,需求分析
开发阶段分为:总体设计,详细设计,编码和单元测试,综合测试

  1. 等价类划分

等价类划分是黑盒设计测试方案的一种技术。把所有可能的输入数据按有效与无效分为若干个等价类(即类中每一个值在测试中的作用与这一类中所有其它值的作用相同)。等价划分法先要划分输入数据的等价类,再分别设计测试方案覆盖有效等价类和无效等价类。

简答

  1. 从多方面比较面向对象方法和结构化方法

| | 面向对象方法|结构化方法 | | --- | --- || --- | | 计算机处理实体对象 | 这里的对象是指数据以及可以施加在这些数据之上的操作所构成的统一体。类(数据+行为) |是各种预定义类型的变量、数组、记录和文件等数据描述。模块(数据+部分行为)| |计算机处理对象的操作|通过消息驱动对象主动的执行起自身的数据处理行为|通过对象(参数)传送,并调用外部的处理功能来处理对象| |处理观点上的不同|把程序看成是相互协作而又彼此独立的对象的集合。每个对象就是一个微型的程序,有自己的数据、操作、功能和目的|看作是工作在数据之上的一系列过程或函数的集合| |通讯机制|消息传递|模块调用和参数传递| |思维特点|重点针对需要处理的问题进行分析|与计算机处理问题的方法是相一致的| |软件开发过程特点|强调反映现实需求的对象业务模型的建立,相对而言设计和编码部分的工作则较为次要|重点在软件处理过程的设计和实现上| |适用范围|比较大型的应用|对于要求涉及底层处理的应用或需要较高处理效率直接对硬件系统进行操作的系统比较适用。另外对一些小的需要复杂处理流程(强调算法设计)的软件系统也比较适用| |一般特点比较|稳定、可重用、易维护;但执行效率比较低 |执行效率高;但难维护 |

image.png 2. 软件生命周期可以划分为几个阶段?每个阶段任务是什么?

(1)问题定义阶段
用户提出一个软件开发需求以后,分析师首先要明确软件的实现目标、规模及类型。而后形成书面报告,并且需要得到客户对这份报告的确认。

(2)可行性研究
对需求做初步分析,确定完成需求的可能性,对比多种解决方法的优劣,给出建议。最后需要提交可行性研究报告。

(3)需求分析
这个阶段是回答“系统做什么”这个问题。在确定软件开发可行的情况下,对软件需要实现的各个功能进行详细分析。这一阶段的结果是软件需求规格说明书。

(4)概要设计
这个阶段的基本任务是,概括地回答“如何实现系统?”。概要设计也被称为“总体设计”,用于获得目标系统的宏观蓝图,设计师根据软件需求规格说明书,构造目标系统的软件结构,如:将一个系统划分为若干模块,确定模块与模块间的关系。

(5)详细设计
详细设计阶段的任务是把解法具体化,也就是回答“应该怎样具体地实现这个系统”。该阶段是把概要设计的结果,细化为可以用某种编程语言实现的设计方案。例如,结构化方法中,详细设计的任务主要是程序流程设计和数据结构设计;面向对象的方法中,是对前期得到的类或对象模型进行细节设计,使之可以直接支持编程。

(6)编程 编程又称为编码,就是编写程序源代码。最终得到的“源程序清单”就是源代码清单。程序源代码要经过编译或解释以后,才能被执行。 编码追求的是程序代码编写风格,要求所编写的程序要规范、友好,便于阅读和调试,这是提高程序质量和软件可维护性的关键活动之一。

(7)软件测试
测试是软件质量保证活动的最后一道防线。整个测试过程主要分为单元测试、集成测试、系统测试和验收测试。通常单元测试与编程活动同时进行,由程序员自己完成。而集成测试、系统测试和验收测试是在独立的测试阶段完成。测试的方法主要有白盒测试和黑盒测试两种。

(8)软件维护
软件运行和维护是软件生命周期中最长的一个阶段。软件交付使用后,便进入漫长的运行和维护期,期间可能要进行多次维护或修改。

注:维护活动按性质分为纠错性维护、完善性维护、适应性维护和预防性维护。在软件的开发与测试阶段,有一些缺陷没有被发现,而在使用过程中暴露出来,由维护人员诊断和改正错误的过程,称为改正性维护。使用过程中,用户会提出新功能或性能的要求,或者是提出一般性的改进意见,为了满足这类要求,需要对软件进行增加功能、改善功能、增强软件性能的修改,此类活动称为完善性维护。硬件换代、操作系统升级速度非常快,而应用软件的使用寿命却可能很长,远长于最初开发这个软件时的运行环境的寿命,为了使软件与变化了的环境相适应而进行的修改,称为适应性维护。为了改善软件的可维护性或可靠性,或为了给未来的改进奠定更好的基础而对软件所做的修改工作,称为预防性维护。

  1. 什么是软件维护?有哪些类型?什么是软件的可维护性?(所关注的几个主要的因素:测试能力/友好程度)
  • 软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需求而修改软件的过程。
  • 可以分为:改正性维护;适应性维护;完善性维护;预防性维护;或者非结构化维护(没有完善的文档); 结构化维护(有完善的文档的维护)
  • 软件可维护性是指软件产品被修改的能力,修改包括纠正、改进或软件对环境、需求和功能规格说明变化的适应
  1. 基本的软件过程模型特点

瀑布模型:阶段间具有顺序性和依赖性;推迟实现的观点;质量保证的观点。
快速原型模型:软件产品的开发基本上是线性顺序进行的。
增量模型:能在较短时间内向用户提交可完成部分工作的产品;逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品。
螺旋模型:减少过多测试或测试不足所带来的风险;在维护和开发之间没有本质区别
喷泉模型:典型的面向对象的软件过程模型之一

  1. 可行性研究和需求分析阶段任务分别是什么?

可行性研究阶段:对需求做初步分析,确定完成需求的可能性,对比多种解决方法的优劣,给出建议。本质上是粗略的系统分析和设计,一般由客户完成。
需求分析阶段:确定软件设计的约束、软件同其它系统元素的接口细节和逆向需求;定义软件的其它有效性需求,如出错处理等
基本要求:

  1. 需求分析研究的对象是软件项目的用户要求
  2. 准确地表达被接受的用户要求
  3. 确定被开发软件系统的系统元素
  4. 将功能和信息结构分配到这些系统元素中
  5. 建立四类模型(数据模型、功能模型、行为模型和层次模型)
  1. 模块的作用域和控制域分别是什么?

模块的作用范围应在控制范围之内。
模块的控制范围包括它本身及其所有的从属模块。
模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围。
如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的。

  1. 测试与调试的概念?区别?

测试:检测和评价软件以确定其质量的过程和方法,即评价软件或程序的属性和能力,以确定它是否满足所需结果的过程和方法。
调试:发现所编写软件中的错误,确定错误的位置并加以排除,使之能由计算机或相关软件正确理解与执行的方法与过程。
区别:
(1) 测试从一个侧面证明程序员的失败;调试证明程序员的正确;
(2) 测试从已知条件开始,使用预先定义的程序,且有预知的结果,不可预见的仅是程序是否通过测试; 调试从不可知内部条件开始,除统计性调试外,结果是不可预见的;
(3) 测试有计划并且要进行测试设计;调试不受时间约束;
(4) 测试是发现错误、改正错误、重新测试的过程;调试是一个推理的过程;
(5) 测试执行是有规程的;调试执行要求程序员进行必要的推理;
(6) 测试由独立的测试组在不了解软件设计的件下完成;调试由了解详细设计的程序员完成;
(7) 大多数测试的执行和设计可由工具支持;调试用的工具主要是调试器。

  1. 测试的分类以及不同阶段的方法的分类?

单元测试:在模块接口、局部数据结构、重要的执行通路、出错处理通路、边界条件5个方面来对模块进行测试。
集成测试:是测试和组装软件的系统化技术可分为自顶向下和自底向上两种集成策略
确认测试:验证软件的有效性。
白盒测试:也称结构测试,检验程序中的每条通路是否都能按预定要求正确工作。
黑盒测试:也称功能测试,检测是否每个功能都能正常使用。

  1. 程序复杂的测量方法

程序复杂度度量的目的:采用一种定量的方法来大致的估算完成程序所需要的工作量。

  • McCabe方法:
    三种计算方法:
    1.流图中的区域数等于环形复杂度
    2.V(G)=E-N+2 ; E为边数,N为结点数;
    3.V(G)=P+1; P为流图中的判定结点数;
  • Halstead方法:根据程序中操作数和运算符的总数来估算程序的复杂度
    计算公式:N=N1+N2;N1为操作数的个数,N2为运算符的个数;
  1. 软件度量

概念:
用来量化软件产品软件开发资源和/或软件开发过程的度量。包括可直接测量的对象如代码行也包括通过测量计算得到的对象如软件质量。

测试的度量:
语句和分支覆盖度量(设计测试用例,来测试程序的覆盖率)
相关问题的度量(重点对程序中的错误进行度量)
测试有效性的度量(分析针对软件进行的测试的有效性进行度量)
过程度量

  1. 软件工程三要素

过程:规定完成开发的各个过程
方法:完成软件开发各项任务的技术方法
工具:软件工程的支撑环境

  1. 软件的设计原理

软件结构;
程序结构;
模块化;
信息隐蔽;
模块的独立性;
自顶向下,逐步细化;
抽象化;

  1. 面向对象的设计准则?

1.模块化;
2.抽象;
3.信息隐藏;
4.弱偶合;
5.强内聚;
6.可重用;

  1. 比较二者

image.png