软件工程

2.1 软件工程的基本概念

考点(1)软件与软件危机

  软件是由计算机程序演变而形成的一种概念,它是程序及相关文档的集合,由可执行部分和与程序和过程有关的文档资料两部分组成。
  软件危机是计算机在软件的开发和维护过程中遇到的一系列问题,它是随着计算机硬件的迅速发展和规模的不断扩大,以及软件本身复杂性的增加而产生的。
  软件危机产生的根本原因有两个方面:一是软件生产本身存在着复杂性;二是与软件开发方法和技术有关。软件工程是为克服软件危机而提出的一种概念及相关的方法和技术。

考点(2)软件生命周期

  20世纪70年代提出的软件生命周期的瀑布模型,典型地刻画了软件生命周期的阶段划分,它把软件生命周期划分为8个阶段,分别是问题定义、可行性研究、需求分析、总体设计、详细设计、程序编制、测试和运行与维护。

考点(3)软件开发技术与软件工程管理

  软件开发技术包括软件开发方法学、工具和环境,其主体内容是软件开发方法学。软件开发工具和环境是保证软件工程方法学得以实施的必要条件;软件开发环境是方法与工具的结合,以及配套的软件的有机组合。
  软件工程管理包括软件管理学和软件工程经济学。
  软件工程管理是软件按工程化生产时的重要环节,它要求按照预先制定的计划、进度和预算执行,以实现预期的经济效益和社会效益。
  软件工程经济学是研究软件开发中对成本的估算、成本效益分析的方法和技术。它应于经济学的基本原理来研究软件工程开发中的经济效益问题。

考点(4)软件开发方法、工具和环境

  软件开发方法大致可归纳为3种类型:基于瀑布模型的结构化生命周期方法,基于动态定义需求的原型化方法和基于结构的面向对象的软件开发方法。
  软件开发工具是从单项工具的开发逐步向集成工具的开发发展的,它促进了软件开发的高速度和高质量,同时软件开发方法的有效应用,也必须得到相应工具的支持,而工具的完善和发展将促进软件开发方法的进步和完善。
  软件工程环境是全面支持软件开发工程的软件工具集合,按一定的模式组合起来,支持软件开发生命周期的各阶段和任务的完成。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

考点(6)软件需求分析

  1.需求分析的任务
  确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。需求分析的出发点是可行性分析阶段产生的文档和数据流图;需求分析的具体任务是确定对系统的综合要求,分析系统的数据要求,导出系统的逻辑模型,修正系统开发计划,开发原型系统。
  2.需求分析常用的工具
  (1)数据字典是定义一个应用程序中使用的所有数据元素和结构的含义、类型、数据大小、格式、度量单位、精度以及允许取值范围的共享仓库。
  (2)数据流图。是结构化系统分析的基本工具。一个数据流图确定了系统的转化过程、系统所操纵的数据或物质的收集(存储),还有过程、存储、外部世界之间的数据流或物质流。
  (3)状态转换图。实时系统和过程控制应用程序可以在任何给定的时间内以有限的状 态存在。
  (4)对话图。对话图描绘了系统中的对话元素和它们之间的导航连接。
  (5)类图。类图是用图形方式叙述面向对象分析所确定的类及它们之间的关系。
  3.需求分析的方法和步骤
  需求分析的方法如下:
  (1)理解当前的现实环境。
  (2)将当前系统的具体模型抽象为当前的逻辑模型。
  (3)分析新系统与当前系统逻辑上的差别,建立新系统的逻辑模型。
  (4)确定新系统的人机界面和一些补充考虑的细节问题。
  需求分析的步骤如下:
  (1)沿数据流图回溯。
  (2)用户复查。
  (3)细化数据流图。
  (4)修正开发计划。
  (5)书写文档。
  (6)审查和复审。
  4.软件需求说明书
  软件需求说明书的内容包括概述、数据描述(包括数据流图、数据字典、系统接口说明和内部接口)、功能描述(包括功能、处理说明和设计的限制)、性能描述(包括性能参数、测二讼类、预期的软件响应和应考虑的特殊问题)、参考文献目录和附录等。

考点(7)软件系统设计

  1.系统设计概述
  系统设计一般分为总体设计和详细设计两个阶段。
  2.总体设计
  总体设计的任务是确定软件的总体结构。
  总体设计的目标是用比较抽象概括的方式确定系统如何完成预定的任务,也就是说应该确定系统的物理配置方案,并且进而确定组成系统的每个程序的结构。总体设计可以分为系统设计和软件结构设计。
  总体设计的典型过程是设想供选择的方案,选取合理的方案,推荐最佳方案,功能分解,设计软件结构,数据库设计,制定测试计划,书写文档,审查和复查。
  3.软件的结构、过程和模块
  (1)软件结构。是软件模块间关系的表示。
  (2)软件结构的度量术语如下:
  深度:是表示软件结构中控制的层数。
  宽度:是软件结构内同一层次上的模块总和的最大值。
  扇出:是一个模块直接控制的模块数。
  扇入:是有多个上级模块直接调用一个模块。
  (3)软件过程。软件过程用于描述每个模块的操作细节,同时也包括一个模块对下一层模块控制的操作细节。
  (4)模块独立性。是设计的软件结构使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。模块独立性是用藕合与内聚来度量的。藕合:衡量不同模块彼此之间相互依赖的紧密程度;内聚:衡量一个模块内部各个元素彼此结合的紧密程度。
  4.面向数据流的设计方法
  面向数据流的设计方法是把信息映射成软件结构,信息流的类型决定映射的方法。
  (1)变换流是指信息沿输入通路进人系统,同时由外部形式变换成内部形式进人系统;信息通过变换中心,经加工处理后,经输出通路变换成外部形式输出。
  (2)事务流是指数据沿输入通路到达一个处理T,这个处理T根据输入数据的类型在若干个动作序列中选出一个来执行,这类数据流称为事务流。
  (3)面向数据流方法的设计过程是精化数据流图,区分是事务流还是变换流,根据设计准则精化软件结构,导出接口描述和全程数据结构,复查,进人详细设计。
  (4)变换分析指的是将变换流映射为变换结构。变换分析的目的是用一系列设计步骤,把具有变换流特点的数据流按预先确定的模式映射成软件结构。
  (5)事务分析。事务分析的设计步骤和变换分析设计步骤大致相似,差别仅在于从数据流图到软件结构的映射方法不同,它将事务中心映射成为软件结构中发送分支的调度模块,将接收通路映射成为软件结构的接收分支。
  (6)详细设计的任务是为软件结构图中的每一个模块确定所采用的算法和数据结构。

考点(8)程序设计

  1.程序设计阶段的任务
  编码阶段的任务是为每个模块编写程序,就是将详细设计的结果转换成某种程序语言的源程序,编译程序再将这些源程序转换成依赖于具体机器的目标代码。
  2.结构化设计的概述
  结构化设计的基本要求是在详细设计阶段,所有的模块都只使用顺序、选择和循环3种基本控制结构。结构化设计的缺点是目标程序所需要的存储容量和运行时间都有一些增加。
  3.程序设计语言的选择
  (l)程序设计语言。程序设计语言是编程者用于求解问题的工具。
  (2)程序高级语言通常分为基本语言、结构化程序语言和专用语言。
  (3)程序设计语言的选择。选择语言的方法是从所要解决的课题出发确定对语言的要求,并同时确定这些要求的相对重要性。
  4.程序设计的方法
  (1)模块化。是把一个较大的程序划分为若干个子程序,每一个子程序总是独立成为一个模块;每一个模块又可继续划分为更小的子模块。
  (2)自顶向下。是先设计第1层,即顶层,然后步步深入,逐层细分,逐步求精,直到整个问题可用程序设计语言明确地描述出来为止。
  (3)自底向上。是先设计底层,最后设计顶层。
  5.程序设计的步骤
  (1)分析问题。
  (2)建立数学模型。
  (3)选择算法。
  (4)编写程序。
  (5)调试运行
  (6)分析结果。
  (7)写出程序的文档。

2.3 软件测试

考点(9)软件测试的基本概念

  测试是为了发现程序中的错误而执行程序的过程。好的测试方案是尽可能地发现至今沿未发现的错误,成功的测试则是发现了至今尚未发现的错误。
  1.软件测试的任务
  软件测试的任务主要是预防软件发生错误、发现并改正程序错误和提供错误诊断信息。
  2软件测试的步骤
  (l)模块测试(单元测试)。
  (2)子系统测试。
  (3)系统测试(集成测试)。
  (4)验收测试。
  (5)平行运行。
  3.软件测试的方法
  软件测试的方法有动态测试、静态测试和正确性证明3种。
  动态测试通常指的是上机测试,这种方法是使程序有控制地进行,并从多种角度观察程序运得时的行为,以发现其中的错误;静态测试一般是指人工评审软件文档或程序,借以发现其中的错误,这是一个相当有效的检验手段,但由于评审人的能力有限,静态测试显然不
可能发现所有的错误。

考点(10)软件测试技术

  1.基本概念
  单元:是程序中最小的和最有意义的部分,由数据输入、加工和输出3部分组成,单元是可以正式说明的程序段。
  程序/子程序:是由单元组成,内部各单元之间联系最为紧密,程序由子程序组成。
  拼程序/系统:是由程序/子程序组成,每个程序完成独立的加工,子系统之间相对独立,有独立的数据确认机构。
  2.黑箱和白箱测试的实施
  (l)黑箱测试法(功能测试)。是把程序看成是一个黑箱子,完全不考虑程序的内部结构和处理过程。也就是说,黑箱测试是在程序接日进行的测试,它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能适当接收输入数据,产生正确的输出信息,并且保持外部信息的完整性。
  (2)白箱测试法(结构测试)。是把程序看成装在一个透明的白箱子里,也就是完全了解程序的结构和处理过程,按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定的要求正确工作。

  3.程序排错方法
  程序排错是程序测试后开始的工作,它确定测试中发现错误的性质和位置,并修改错误,排错有很多种方法,主要有简单排错法、归纳排错法、演绎排错法和反向搜索排错法等。
  4.测试与排错
  测试与排错是互相联系但又是性质不同的两类活动,它们之间的关系是一个好的测试设计有利于排错,从而保证程序的正确性。
  5.路径测试
  路径测试是结构测试之一,路径可定义为从程序元素的人口开始,到它的出口终止的可执行指令程序。路径测试的目标是通过检验足够多的程序元素的路径来证实程序元素的实际结构同所期望的程序元素的结构是一致的。

考点(11)软件测试的组成

  软件系统的开发过程是一个自顶向下逐步细化的过程,而测试过程是以相反顺序进行的集成过程,软件测试的组成包括单元测试、集成测试、有效性测试、系统测试和验收测试等。
  (1)单元测试。是检查模块单元的子程序或过程的实际功能与该模块的功能和接口的描述是否相符,以及是否有编码错误的存在。
  (2)集成测试。集成测试是指在组装软件模块的同时进行测试,以查找与接口有关的错误。
  (3)有效性测试。是指当软件的运行达到了用户的期望时,则认为软件是有效的。
  (4)系统测试。是将软件系统与硬件,外设与其他系统元素结合在一起,对整个软件系统进行测试,其内容包括功能测试、吞吐量测试、可用性测试、保密性测试、安装测试、可恢复性测试、资料测试和程序测试。
  (5)验收测试。是系统测试通过后,由用户进行验收测试,确定系统功能的可接受性。
  (6)软件测试的实施。软件测试是一个极为复杂的过程。一个规范化的软件测试过程通常包括以下基本的测试活动:拟定软件测试计划,编制软件测试大纲,设计和生成测试用例,实施测试,生成软件问题报告。

2.4 软件维护

考点(12) 软件维护的基本概念

  维护是软件生命周期的最后一个阶段,也是持续时间最长和代价最大的一个阶段。软件工程学的主要目的就是提高软件的可维护性,降低维护的花费。
  软件维护通常包括为了纠正在使用过程中暴露出来的错误而进行的改进性维护,为了适应外部环境的变化而进行的适应性维护,为了改进原有的软件而进行的完善性维护,以及为了改进将来的可维护性和可靠性而进行的预防性维护。
  1.软件维护的基本任务
   软件维护是指系统交付使用以后对它所做的改变,也是软件生存周期中最后一个阶段。
  改变的原因是改正程序的错误和缺陷,改进设计和适用新的软、硬件环境,增加新的应用范围。

  2.软件维护的分类
  软件维护主要划分为纠错性维护、适应性维护和完善性维护。
  (1)纠错性维护。由于前期的测试不可能揭露软件系统中所有潜在的错误,用户在使用软件时仍将会遇到错误,诊断和改正这些错误的过程称为纠错性维护。
  (2)适应性维护。由于新的硬件设备不断推出,操作系统和编译系统也不断地升级,为了使软件能适应新的环境而引起的程序修改和扩充活动称为适应性维护。
  (3)完善性维护。在软件的正常使用过程中,用户还会不断地提出新的需求。为了满足用户新的需求而增加软件功能的活动称为完善性维护。

考点(13)影响维护的因素

  影响软件维护的因素包括人员因素、技术因素、管理因素和程序自身的因素。

考点(14)软件可维护性度量

  可维护性度量表示软件系统维护工作的强度或维护工作量的大小。实践中把可维护性试题问题分为对可测试性、可理解性、可修改性、可移植性、可靠性、有效性和可用性的度量。

 

瀑布模型给出了软件生存周期中制定开发计划、需求分析、软件设计、编码、测试和维护等阶段以及各阶段的固定顺序,上一阶段完成后才能进入到下一阶段,整个过程如同瀑布流水。该模型为软件的开发和维护提供了一种有效的管理模式,但在大量的实践中暴露出其缺点,其中最为突出的是缺乏灵活性,特别是无法解决软件需求不明确或不准确的问题。这些问题有可能造成开发出的软件并不是用户真正需要的,并且这一点只有在开发过程完成后才能发现。所以瀑布模型适用于需求明确,且很少发生较大变化的项目。

为了克服瀑布模型的上述缺点,演化模型允许在获取了一组基本需求后,通过快速分析构造出软件的一个初始可运行版本(称作原型),然后根据用户在适用原型的过程中提出的意见对原型进行改进,从而获得原型的新版本。这一过程重复进行,直到得到    令用户满意的软件。该模型和螺旋模型、喷泉模型等适用于对软件需求缺乏明确认识的项目。

螺旋模型将瀑布模型和演化模型进行结合,在保持二者优点的同时,增加了风险分析,从而弥补了二者的不足。该模型沿着螺线旋转,并通过笛卡儿坐标的四个象限分别表示四个方面的活动:制定计划、风险分析、实施工程和客户评估。螺旋模型为项目管理人员及时调整管理决策提供了方便,进而可降低开发风险。

喷泉模型是以面向对象的软件开发方法为基础,以用户需求为动力,以对象来驱动的模型。该模型主要用于描述面向对象的开发过程,体现了面向对象开发过程的迭代和无间隙特性。迭代指模型中的活动通常需要重复多次,相关功能在每次迭代中被加入新的系统。无间隙是指在各开发活动(如分析、设计、编码)之间没有明显边界。