第五章:软件工程基础知识
软件工程基础知识
考点分析(上午题:占比14.67%,11分)
开发模型、设计原则、测试方法、质量特性、CMM、Pert图、风险管理
软件工程概述
软件工程是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程,其目的是提高软件生产率、提高软件质量、降低软件成本。软件工程涉及软件开发、维护、管理等多方面的原理、方法、工具与环境。
软件开发方法:结构化方法(面向数据流,自顶向下逐层分解),jackson方法(面向数据结构),原型化方法(开发一个对用户透明的框架,然后根据用户需求壮大),面向对象开发方法。
程序设计方法:结构化方法(模块内部程序各部分要自顶向下地结构化划分、各程序部分应按功能组合、各程序部分的联系尽量使用调用子程序方式而不是 GOTO 方式),原型方法(将带有普遍性的功能模块集中、开发完成通用模块、生成程序模块原型),面向对象的方法(一个简单直接的映射过程)。
计算机软件
计算机软件是指计算机系统中的程序及其文档。程序是计算任务的处理对象和处理规则的描述。任何以计算机为处理工具的任务都是计算任务。处理对象是数据(如数字、文字、图形、图像、声音等,它们只是表示,而无含义)或信息(数据及有关的含义)。处理规则一般指处理的动作和步骤。文档是为了便于了解程序所需的阐述性资料。按照应用领域,计算机软件可以分为:系统软件、应用软件、工程/科学软件、嵌入式软件、产品线软件、Web应用、人工智能软件、开放计算、网络资源、开源软件。
软件工程的基本原理
这7条原理是确保软件产品质量和开发效率的原理的最小集合:用分阶段的生命周期计划严格管理、坚持进行阶段评审、实现严格的产品控制、采用现代程序设计技术、结果应能清楚的审查、开发小组的人员应少而精、承认不断改进软件工程实践的必要性。
软件生存周期
软件生存周期:可行性分析与项目开发计划、需求分析、概要设计、详细设计、编码、测试、维护
软件过程
软件过程评估的意义:改进软件过程,降低软件风险。
CMM(能力成熟度模型)是对软件组织进化阶段的描述,随着软件组织定义、实施、测量、控制和改进其软件过程,软件组织的能力经过这些阶段逐步提高。该能力成熟度模型使软件组织能够较容易地确定其当前过程的成熟度并识别其软件过程执行中的薄弱环节,确定对软件质量和过程改进最为关键的几个问题,从而形成对其过程的改进策略。软件组织只要关注并认真实施一组有限的关键实践活动,就能稳步地改善其全组织的软件过程,使全组织的软件过程能力持续增长。CMMI(能力成熟度模型集成)是若干过程模型的综合和改进,是支持多个工程学科和领域的、系统的、一致的过程改进框架,能适应现代工程的特点和需要,能提高过程的质量和工作效率。
CMM软件能力过程成熟度等级划分:
1)初始级:软件过程的特点是杂乱无章,有时甚至很混乱,几乎没有明确定义的步骤,项目的成功完全依赖个人的努力和英雄式核心人物的作用。
2)可重复级:建立了基本的项目管理过程和实践来跟踪项目费用、进度和功能特性,有必要的过程准则来重复以前在同类项目中的成功。
3)已定义级:管理和工程两方面的软件过程已经文档化、标准化,并综合成整个软件开发组织的标准软件过程。所有项目都采用根据实际情况修改后得到的标准软件过程来开发和维护软件。
4)已管理级:制定了软件过程和产品质量的详细度量标准。软件过程的产品质量都被开发组织的成员所理解和控制。
5)优化级:加强了定量分析,通过来自过程质量反馈和来自新观念、新技术的反馈使过程能不断持续地改进。
软件过程模型
软件过程模型习惯上也称为软件开发模型,它是软件开发全部过程、活动和任务的结构框架。典型的软件过程模型有瀑布模型(按顺序阶段性开发)、增量模型、演化模型(细分为原型模型、螺旋模型,先构造一个初始版本再不断改进,其中螺旋模型需要制定计划、风险分析、实施工程、用户评估)、喷泉模型(重视用户需求,允许各步骤交叉进行)、基于构件的开发模型和形式化方法模型等。
瀑布模型(Waterfall Model)
瀑布模型说明
瀑布模型是将软件生存周期中的各个活动规定为依线性顺序连接的若干阶段的模型,包括需求分析、设计、编码、测试、运行与维护。它规定了由前至后、相互衔接的固定次序,如同瀑布流水逐级下落,按顺序阶段性开发。在瀑布模型中,需求或设计中的错误往往只有到了项目后期才能够被发现,对于项目风险的控制能力较弱,从而导致项目常常延期完成,幵发费用超出预算。
增量模型(inscremental Mode)
增量模型说明
增量模型融合了瀑布模型的基本成分和原型实现的迭代特征,它假设可以将需求分段为一系列增量产品,每一增量可以分别开发。如果没有对用户的变更要求进行规划,那么产生的初始增量可能会造成后来增量的不稳定;如果需求不像早期思考的那样稳定和完整,那么一些增量就可能需要重新开发,重新发布;管理发生的成本、进度和配置的复杂性可能会超出组织的能力。
演化模型(Evolutionary Model)
原型模型(Prototype Model)
原型模型说明
原型是预期系统的一个可执行版本,反映了系统性质的一个选定的子集。一个原型不必满足目标软件的所有约束,其目的是能快速、低成本地构建原型。即先构造一个初始版本再不断改进。原型方法比较适合于用户需求不清、需求经常变化的情况。当系统规模不是很大也不太复杂时,采用该方法比较好。
螺旋模型(Spiral Model)
螺旋模型说明
螺旋模型将瀑布模型和演化模型结合起来,加入了两种模型均忽略的风险分析,弥补了这两种模型的不足。螺旋模型强调风险分析,使得开发人员和用户对每个演化层出现的风险有所了解,从而做出应有的反应。因此,该模型特别适用于庞大、复杂并且具有高风险的系统。每个螺旋周期分为如下4个工作步骤:
1)制订计划:确定软件的目标,选定实施方案,明确项目开发的限制条件。
2)风险分析:分析所选的方案,识别风险,消除风险。
3)实施工程:实施软件开发,验证阶段性产品。
4)用户评估:评价开发工作,提出修正建议,建立下一个周期的开发计划。
喷泉模型(Water Fountain Model)
喷泉模型说明
喷泉模型的各个阶段没有明显的界线,开发人员可以同步进行。重视用户需求,允许各步骤交叉进行。其优点是可以提高软件项目的开发效率,节省开发时间。由于喷泉模型在各个开发阶段是重叠的,在开发过程中需要大量的开发人员,不利于项目的管理。此外,这种模型要求严格管理文档,使得审核的难度加大。
基于构件的开发模型(Component-based Development Model)
基于构件的开发是指利用预先包装的构件来构造应用系统。
形式化方法模型(Formal Methods Model)
形式化方法用严格的数学语言和语义描述功能规约和设计规约,通过数学的分析和推导,易于发现需求的歧义性、不完整性和不一致性,易于对分析模型、设计模型和程序进行验证。通过数学的演算,使得从形式化功能规约到形式化设计规约,以及从形式化设计规约到程序代码的转换成为可能。这种方法的一个变形是净室软件工程。
统一过程(UP)模型
统一过程:起始阶段,精化阶段,构建阶段,移交阶段,产生阶段
敏捷方法(Agile Development)
敏捷开发:极限编程(计划游戏、小型发布、隐喻、简单设计、测试先行、重构、结对编程、持续集成),水晶法(不同的项目需要不同的策略、约定和方法论),并列征求法(多个小组并行递增实现产品),自适应软件开发。
需求分析
需求分析:确定软件系统的综合要求,分析软件系统的数据要求,导出系统的逻辑模型,修正项目开发计划,可开发一个原型系统。
软件需求
软件需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。通常,这些需求包括功能需求、性能需求、用户或人的因素、环境需求、界面需求、文档需求、数据需求、资源使用需求、安全保密需求、可靠性需求、软件成本消耗与开发进度需求等,并预先估计以后系统可能达到的目标。
需求分析原则
1)必须能够表示和理解问题的信息域。
2)必须能够定义软件将完成的任务。
3)必须能够表示软件的行为(作为外部事件的结束)。
4)必须划分描述数据、功能和行为的模型,从而可以分层次地揭示细节。
5)分析过程应该从要素信息移向细节信息。
需求工程
需求工程:需求开发(需求捕获、需求分析、编写规格说明书、需求验证),需求管理(定义需求基线、处理需求变更、需求跟踪)。
系统设计
概要设计
概要设计:设计软件系统总体结构、数据结构及数据库设计、编写概要设计文档、评审。
详细设计
详细设计:分模块进行详细的算法设计、对模块内的数据结构进行设计、对数据库进行物理设计、其他设计、编写详细设计说明书、评审。
系统详细设计:代码设计(唯一性、合理性、可扩充性、简单性、适用性、规范性、系统性),输入设计(确定输入数据内容、输入方式设计、输入格式设计、校对方式设计),输出设计(确定输出内容、选择输出设备与介质、确定输出格式),处理过程设计(程序流程图、盒图:NS 图、形式语言、决策树、决策表),用户界面设计(菜单方式、会话管理方式、提示方式与权限管理),安全控制设计(环境性因素、数据处理因素)。
系统测试
系统测试与调试
测试的目的就是希望能以最少的人力和时间发现潜在的各种错误和缺陷。用户应根据开发各阶段的需求、设计等文档或程序的内部结构精心设计测试实例,并利用这些实例来运行程序,以便发现错误的过程。测试是开发过程中的一个独立且非常重要的阶段,测试过程基本上与开发过程平行进行,一个规范化的测试过程通常包括以下基本的测试活动:
1)制定测试计划
测试计划的内容主要有测试的内容、进度安排、测试所需的环境和条件、测试培训安排等。
2)编制测试大纲
测试大纲是测试的依据,它明确、详尽地规定了在测试中针对系统的每一项功能或特性所必须完成的基本测试项目和测试完成的标准。
3)设计生成测试用例
根据测试大纲设计和生成测试用例,产生测试设计说明文档。其内容主要有被测项目、输入数据、测试过程和预期输出结果等。
4)实施测试
测试的实施阶段是由一系列的测试周期组成的。在每个测试周期中,测试人员和开发人员将依据预先编制好的测试大纲和准备好的测试用例对被测软件或设备进行完整的测试。
5)生成测试报告
测试完成后要形成相应的测试报告,主要对测试进行概要说明,列出测试的结论,指出缺陷和错误。另外,给出一些建议,如可采用的修改方法,各项修改预计的工作量及修改的负责人员。
传统软件的测试策略
单元测试:模块接口、局部数据结构、重要的执行路径、出错处理、边界条件
集成测试:把模块按系统设计说明书的要求组合起来进行测试。方法:自顶向下继承测试、自底向上集成测试、回归测试(重新执行已测试过的某些子集,以确保变更没有传播不期望的副作用)、冒烟测试
确认测试:有效性测试、软件配置审查、验收测试
系统测试:恢复测试、安全性测试、压力测试、性能测试、可靠性及可用性和可维护性测试、安装(部署)测试
测试面向对象软件
测试Web应用
测试方法
静态测试:人工检测、计算机辅助静态分析
动态测试:
黑盒测试:等价类划分、边值分析、错误猜测、因果图。黑盒测试也称为功能测试,在完全不考虑软件的内部结构和特性的情况下,测试软件的外部特性。
白盒测试:逻辑覆盖、循环覆盖、基本路径测试。白盒测试也称为结构测试,根据程序的内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的需要。
调试
调试方法(改正测试时发现的错误)
1)试探法
调试人员分析错误的症状,猜测问题所在的位置,利用在程序中设置输出语句,分析寄存器、存储器的内容等手段获得错误的线索,一步步地试探和分析出错误所在。这种方法效率很低,适合于结构比较简单的程序。
2)回溯法
调试人员从发现错误症状的位置开始,人工沿着程序的控制流程往回跟踪代码,直到找出错误根源为止。这种方法适合于小型程序,对于大规模程序,由于其需要回溯的路径太多而变得不可操作。
3)对分查找法
这种方法主要用来缩小错误的范围,如果已经知道程序中的变量在若干位置的正确取值,可以在这些位置上给这些变量以正确值,观察程序运行的输出结果,如果没有发现问题,则说明从赋予变量一个正确值开始到输出结果之间的程序没有错误,问题可能在除此之外的程序中。否则错误就在所考察的这部分程序中,对含有错误的程序段再使用这种方法,直到把故障范围缩小到比较容易诊断为止。
4)归纳法
归纳法就是从测试所暴露的问题出发,收集所有正确或不正确的数据,分析它们之间的关系,提出假想的错误原因,用这些数据来证明或反驳,从而查出错误所在。
5)演绎法
演绎法根据测试结果,列出所有可能的错误原因;分析已有的数据,排除不可能和彼此矛盾的原因;对其余的原因,选择可能性最大的,利用已有的数据完善该假设,使假设更具体;用假设来解释所有的原始测试结果,如果能解释这一切,则假设得以证实,也就找出错误,否则,要么是假设不完备或不成立,要么有多个错误同时存在,需要重新分析,提出新的假设,直到发现错误为止。
运行和维护知识
系统转换
系统转换(新系统试运行成功后与旧系统相互转换):直接转换,并行转换,分段转换
系统实施的任务:按总体设计方案购置和安装计算机网络系统,软件准备,培训,数据准备,投入转换和试运行。
系统实施的步骤:按总体设计方案购置和安装计算机网络系统,建立数据库系统,程序设计,收集有关数据并进行录入工作和系统测试,人员培训、系统转换和试运行。
系统维护概述
1)文档是软件可维护性的决定因素。由于长期使用的大型软件系统在使用过程中必然会经受多次修改,所以文档显得非常重要。软件系统的文档可以分为用户文档和系统文档两类。用户文档主要描述系统功能和使用方法,并不关心这些功能是怎样实现的;系统文档描述系统设计、实现和测试等各方面的内容。系统文档是指软件开发过程中的文档,硬件采购和网络设计中的文档,系统建设过程中的各种来往文件、会议纪要、会议单据等,程序资料和培训教程等。
2)系统可维护性的评价指标:可理解性,可测试性,可修改性。
3)系统维护主要包括:硬件维护,软件维护(正确性维护、适应性维护、完善性维护、预防性维护),数据维护。
4)系统维护的步骤:提出维护或修改要求,领导审查并做出答复,领导分配任务、维护人员执行修改,验收维护成果并登记修改信息。
系统评价
系统评价:立项评价,中期评价,结项评价。
软件项目管理
软件项目管理涉及的范围
1)人员:项目管理人员、高级管理人员、开发人员、客户、最终用户
2)产品:解答项目环境、信息目标、功能和性能等问题
3)过程:一旦确定了初步计划,过程分解就开始了,也就是说,必须制订一个完整的计划来反映框架活动中所需完成的工作任务
4)项目:明确目标及过程、保持动力、跟踪进展、做出明智的决策、进行事后分析
软件项目估算
成本估算方法:自顶向下估算方法、自底向上估算方法、差别估算方法
进度管理
软件开发项目的进度安排有如下两种方式:系统最终交付日期已经确定,软件开发部门必须在规定期限内完成;系统最终交付日期只确定了大致的年限,最后交付日期由软件开发部门确定。进度安排的常用图形描述方法有Gantt图(甘特图)和项自计划评审技术(Program Evaluation & Review Technique,PERT)图。
Gantt图是一种简单的水平条形图,它以日历为基准描述项目任务。水平轴表示日历时间线(如时、天、周、月和年等),每个条形表示一个任务,任务名称垂直地列在左边的列中,图中水平条的起点和终点对应水平轴上的时间,分别表示该任务的开始时间和结束时间,水平条的长度表示完成该任务所持续的时间。当日历中同一时段存在多个水平条时,表示任务之间的并发。
PERT图是一个有向图,图中的箭头表示任务,它可以标上完成该任务所需的时间。图中的结点表示流入结点的任务的结束,并开始流出结点的任务,这里把结点称为事件。只有当流入该结点的所有任务都结束时,结点所表示的事件才出现,流出结点的任务才可以开始。事件本身不消耗时间和资源,它仅表示某个时间点。一个事件有一个事件号和出现该事件的最早时刻和最迟时刻。最早时刻表在此时刻之前从该事件出发的任务不可能开始;最迟时刻表示从该事件出发的任务必须在此时刻之前开始,否则整个工程就不能如期完成。每个任务还可以有一个松弛时间(SlackTime),表示在不影响整个工期的前提下完成该任务有多少机动余地。为了表示任务间的关系,在图中还可以加入一些空任务(用虚线箭头表示),完成空任务的时间为0。
Gantt图
PERT图
软件项目的组织
1)主程序员制小组:主程序员制小组由一名主程序员、若干名程序员、一名后援工程师和一名资料员组成。
2)民主制小组(无主程序员组):民主制小组成员之间地位平等,虽然形式上有一位组长,但小组的工作目标和决策都是由全体成员决定的,互相合作,形成一个良好的工作氛围。
3)层次式小组:层次式小组的组织形式是一名组长领导若干名高级程序员,每名高级程序员领导若干名程序员。
软件配置管理
软件配置管理的目标:标识变更,控制变更,确保变更正确地实现,报告有关变更。
基线:软件生存期中各开发阶段的一个特定点,相当于断点,便于检查和肯定阶段成果。
风险管理
风险识别:风险识别试图系统化地指出对项目计划(估算、进度、资源分配等)的威胁。识别出已知风险和可预测风险后,项目管理者首先要做的是在可能时回避这些风险,在必要时控制这些风险。
风险预测:风险预测又称风险估计,它试图从两个方面评估一个风险:风险发生的可能性或概率;如果风险发生了所产生的后果。
风险评估:一种对风险评估很有用的技术就是定义风险参照水准。对于大多数软件项目来说,成本、进度和性能就是3种典型的风险参照水准。也就是说,对于成本超支、进度延期、性能降低或它们的某种组合,有一个表明导致项目终止的水准。
风险控制:风险控制的目的是辅助项目组建立处理风险的策略。一个有效的策略必须考虑以下3个问题:风险避免、风险监控、RMMM计划。
软件质量
软件质量特性
软件质量特性:功能性、可靠性、易使用性、效率、可维护性、可移植性。
软件质量保证
软件质量保证:应用技术方法、进行正式的技术评审、测试软件、标准的实施、控制变更、度量、记录保存和报告。
软件评审
1)软件质量:设计质量(设计的规格说明书符合用户的要求),程序质量(程序按照设计规格说明所规定的情况正确执行)。
2)设计质量评审内容:是否合乎用户要求,可靠性,保密措施实现情况,操作特性实施情况,性能实现情况,是否具有可修改性可扩充性、可互换性、可移植性、可测试性、复用性。
3)程序质量评审内容:功能结构,功能的通用性,模块的层次,模块结构,处理过程的结构。
软件容错技术
软件实现容错的主要手段就是冗余。冗余方法分为结构冗余,信息冗余,时间冗余,冗余附加调用。
软件度量
软件度量方法
软件度量有两种分类方法,第一种分类是将软件度量分为面向规模的度量、面向功能的度量和面向人的度量;第二种分类是将软件度量分为生产率度量、质量度量和技术度量。
软件复杂性度量
软件复杂性:规模,难度,结构,智能度。
软件工具与软件开发环境
软件工具
软件开发工具:需求分析工具,设计工具,编码与排错工具,测试工具。
软件维护工具:版本控制工具,文档分析工具,开发信息库工具,逆向工程工具,再工程工具。
软件管理和软件支持工具:项目管理工具,配置管理工具,软件评价工具。
软件开发环境
软件开发环境的特征
1)环境的服务是集成的。软件开发环境应支持多种集成机制,如平台集成、数据集成、界面集成、控制集成和过程集成等。
2)环境应支持小组工作方式,并为其提供配置管理。
3)环境的服务可用于支持各种软件开发活动,包括分析、设计、编程、测试、调试和文档等。