5.1 软件工程概述
软件工程:应用计算机科学、数学及管理科学等原理,一工程化的原则和方法解决软件问题的工程,其目的在于提高软件生产率、提高软件质量、降低软件成本。
5.1.1 计算机软件
计算机软件:计算机系统中的程序及其文档
程序:计算任务的处理对象和处理规则的描述
计算机软件分类:系统软件、应用软件、工程/科学软件、嵌入式软件、产品线软件、Web应用、人工智能软件、开放软件、网络资源和开源软件
5.1.2 软件工程基本原理
软件工程基本原理:用分阶段的生命周期计划严格管理、坚持进行阶段评审、实行严格的产品控制、采用现代程序设计技术、结果应能清楚的审查、开发小组的人员应该少而精、承认不断改进软件工程实践的必要性
5.1.3 软件生存周期
软件生命周期:可行性分析与项目开发计划(用户、项目负责人和系统分析师,可行性分析报告和项目开发计划)、需求分析(用户、项目负责人和系统分析师,需求说明书)、概要设计(系统分析师和软件设计师,概要设计说明书)、详细设计(软件设计师和程序员,详细设计文档)、编码(程序员、代码)、测试(另外部门的软件设计师或系统分析师,测试计划、测试用例和软件测试报告)、维护
5.1.4 软件过程
软件过程:软件开发总所遵循的路线图,过程是活动的集合,活动是任务的集合
能力成熟度模型(CMM)划分的软件过程改进成熟度级别:初始级、可重复级、可定义级、已管理级和优化级
能力成熟度模型继承(CMMI)阶段式模型:初始的、已管理的、已定义的、定量管理的和优化的
能力成熟度模型继承(CMMI)连续式模型:未完成的、已执行的、已管理的、已定义的、已定量管理的、优化的
5.2 软件过程模型
软件过程模型:软件开发全部过程、活动和任务的结构框架
5.2.1 瀑布模型(Waterfall Model)
瀑布模型:将软件生存周期中的各个活动规定为依线性顺序连续的若干阶段的模型,包括需求分析、设计、编码、测试、运行与维护
V模型:沿左侧执行、沿右侧测试
5.2.2 增量模型(Incremental Model)
增量模型:融合了瀑布模型的基本成分和原型实现的迭代热点,假设可以将需求分段成为一些列增量产品,每一增量可以分别开发
5.2.3 演化模型(Evolutionary Model)
演化模型:迭代的过程模型,使得软件开发人员能够逐步开发更完整的软件版本
原型模型:适合于用户需求不清、需求经常变化的情况,系统规模不大时
螺旋模型:制定计划、风险分析、实施工程和用户评估
5.2.4 喷泉模型(Water Fountain Model)
喷泉模型:一种以用户需求为动力,以对象作为驱动的模型,适合面向对象
5.2.5 基于构件的开发模型(Component-based Model)
基于构建的开发:利用预先包装的构件来构造应用系统,构件可以是组织内部开发的也可以是商品化的产品构件
5.2.6 形式化方法模型(Formal Methods Model)
形式化方法模型:建立在严格数学基础上的软件开发方法
5.2.7 统一过程模型
统一过程模型:一种用例和风险驱动,以架构为中心,迭代并且增量的开发过程,由UML方法和工具支持
5.2.8 敏捷方法(Agile Development)
敏捷方法:通过尽可能早的,持续性的对有价值的软件的交付使客户满意,通过对软件开发过程中加入灵活性,使用户能够在开发周期后期增加或改变需求
极限编程:一种轻量级、高效、低风险、柔性、可依赖的、科学的软件开发方式,由价值观(沟通、简单性、反馈和勇气)、原则(快速反馈、简单性假设、逐步修改、提倡更改和优质工作)、实践(计划游戏、小型发布、隐喻、简单设计、测试先行、重构、结对编程、集体代码所有制、持续集成、每周工作40小时、现场客户和编码标准)和行为组成
水晶法:不同项目需要不同的策略、预定和方法论,人对软件质量有很重要影响
并列争求法:迭代,把30天一次的迭代称为冲刺,并按照需求的优先级别来实现产品
自适应软件开发:有一个使命作为指导;特征被视为客户价值的关键点;过程中的等待是很重要的;变化不是改正是调整;确定的交付时间迫使开发人员考虑生产的版本的关键需求;包含风险
敏捷统一过程:采用在大型上连续,在小型上迭代的原理构建软件系统
5.3 需求分析
5.3.1 软件需求
软件需求:指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望,通常包含功能需求、性能需求、用户或人的因素、环境需求、界面需求、文档需求、数据需求、资源使用需求、安全保密需求、可靠性需求、软件成本消耗需求和开发进度需求,并预估软件可能达到得目标以及其他的非功能性需求
需求的来源:用户、用户的规约、应用领域的专家、相关的技术标准和法规、原有的系统、原有系统的用户、新系统的潜在用户、竞争对手的产品
5.3.2 需求分析原则
需求分析原则:表示和理解问题的信息域;定义软件将完成的任务;表示软件的行为;划分描述数据、功能和行为的模型,分层次的揭示细节;分析过程从要素信息移向细节信息
5.3.3 需求工程
需求工程:不断反复的需求定义、文档记录、需求演进的过程,并最终再验证的基础上冻结需求,细分为需求获取、需求分析与协商、系统建模、需求规约、需求验证及需求管理
5.4 系统设计
系统设计:为系统指定蓝图,在各种技术和实施方法中权衡利弊,精心设计,合理的利用使用各种资源,最终勾画出新系统的详细设计方案
主要内容:总体结构设计、代码设计、输出设计、输入设计、处理过程设计、数据存储设计、用户界面设计和安全控制设计等
设计方法:面向数据流的结构化设计方法、面向对象的分析方法
5.4.1 概要设计
设计软件系统总体结构:将复杂的系统按功能划分成模块;确定每个模块的功能;确定模块之间的调用关系;确定模块之间的接口,即传递的信息;评价模块结构的质量
数据结构设计:细化需求分析阶段形成的数据字典关于数据的组成、操作约束和数据之间的关系的描述和结构特征,采用抽象的数据类型
数据库设计:概念设计(在数据分析的基础上,采用自底向上的方法从用户角度进行视图设计,一般用E-R模型)、逻辑设计(结合具体的数据库管理软件监理数据库的逻辑结构)和物理设计(因不同的数据库管理软件和物理环境不同,提供的存储结构和存取方法不同,需要设计数据模式的一些物理细节)
概要设计文档:概要设计说明书、数据库设计说明书、用户手册以及修订测试计划
评审:对设计部分是否完整的实现了需求中规定的功能、性能等要求,设计方法的可行性,关键处的处理及内外部接口定义的正确性、有效性、各部分之间的一致性等都需要进行评审
5.4.2 详细设计
对每个模块进行详细的算法设计;对模块中的数据结构进行设计;对数据库进行屋里设计;其他设计(代码设计、输入输出格式设计,用户界面设计)、编写详细设计说明书、评审
5.5 系统测试
5.5.1 软件测试与调试
系统测试:为了发现错误而知新程序的过程,希望以最少的人力和时间发现潜在的各种错误和缺陷,包括软件测试、硬件测试和网络测试
遵循原则:应尽早并不断的进行测试;测试工作应避免由原开发软件的人或小组承担;在设计测试方案时,不仅要确定输入数据,而且要根据系统功能确定预期的输出结果;在设计测试用例时,不仅要设计有效、合理的输入条件,也要包含不合理、失效的输入条件;在测试程序时,不仅要检验程序是否做了该做的事,同时也要检验是否做了不该做的事;严格按照测试计划进行,避免测试的随意性;妥善保存测试计划、测试用例;测试例子都是精心设计出来的,可以重新测试或追加测试提供方便
测试过程:执行测试计划---编制测试大纲---依据大纲设计和生成测试用例,产生测试设计说明文档---实施测试---生成测试报告
5.5.2 传统软件的测试策略
测试策略包含:描述将要进行的测试步骤,这些步骤计划和执行的时机,需要多少工作量、时间和资源,必须包含测试计划、测试用例设计、测试执行以及结果数据的收集和评估
有效的测试步骤:单元测试、集成测试、确认测试和系统测试
单元测试:侧重于模块中的内部处理逻辑和数据结构,一般测试模块接口、局部数据结构、重要的执行路径、出错处理和边界条件
集成测试:把模块按照系统设计说明书的要求组合起来进行测试,一般采用非增量集成和增量集成记性测试(自顶向下集成测试、自底向上集成测试、回归测试、冒烟测试)
确认测试:开始于集成测试结束,测试集中于用户课件的动作和用户可识别的系统输出,进行配置评审,主要检查软件、文档和数据是否齐全以及分类是否有序,确保文档、资料的正确和完善,以便维护阶段使用;α测试(用户在开发现场测试)和β测试(用户在应用现场测试)
系统测试:将已经确认的软件、计算机硬件、外设和网络等其他因素结合在一起,进行信息系统的各种集成测试和确认测试,目的在于通过与系统的需求相比较,发现所开发系统与用户需求不符或矛盾的地方,包括恢复测试、安全性测试、压力测试、性能测试、部署测试
5.5.3 测试面向对象软件
单元测试:测试类中包含的操作
集成测试:基于线程的测试、基于使用的测试
5.5.4 测试WEB应用
web测试考虑质量维度:(内容、功能、结构、可用性、导航性、性能、兼容性、安全性)
webapp测试策略:对内容模型进行评审,已发现错误;对接口模型进行评审,保证适用所有的用例;评审设计模型,发现导航错误;测试用户界面,发现表现机制和导航机制中的错误;对功能构件进行单元测试;对贯穿体系结构的导航进行测试;在各种不同的环境配置下测试兼容性;进行安全性测试;进行性能测试;通过可监控的最终用户群对其进行测试
5.5.5 测试方法
黑盒测试:功能测试,完全不考虑软件的内部节后和特性的情况下测试软件的外部特性,常用技术有:等价类划分、边界值分析、错误推测和因果图等
白盒测试:结构测试,根据程序的内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的需要,常用技术有:逻辑覆盖、循环覆盖和基本路径测试
5.5.6 调试
调试:发生在测试之后,根据测试时发现的错误找出原因和具体位置,进行改正,主要由开发人员进行
调试方法:试探法、回溯法、对分查找法、归纳法、演绎法
5.6 运行和维护知识
5.6.1 系统转换
系统试运行的主要工作:对系统进行初始化、输入各种原始数据记录;记录系统运行的数据和状况;核对新系统输出和旧系统输出的结果;对实际系统的输入方式进行考察;对系统运行、响应速度进行实际测试
新旧系统转换方式:直接转换、并行转换和分段转换
5.6.2 系统维护概述
系统可维护性:维护人员理解、改正、改动和改进系统的难易程度,由可理解性、可测试性、可修改性来评价
系统维护的内容:硬件维护(定期保养、突发故障维护)、软件维护(正确性、适应性、完善性、预防性)和数据维护(数据库的安全性和完整性以及进行并发控制、更新数据文档、维护数据库数据、恢复数据、代码维护)
系统维护步骤:提出维护和修改要求、领导审查并作出答复、领导分配任务,维护人员执行修改、验收维护成果并修改维修信息
5.6.3 系统评价
评价分类:立项评价、中期评价和结项评价
系统评价指标体系:按组成,运行效果和用户需求,系统质量和技术条件来构造指标;按对象,开发方关心系统质量和技术水平,用户关心需求和运行质量,外部环境通过社会效益来反应;从经济,系统成本效益和财务建立指标
5.7 软件项目管理
软件项目管理:软件生存周期中软件管理者所进行的一些列活动,其目的是在一定的时间和预设范围内有效的利用人力、资源、技术和工具,是软件系统或软件产品按照原定计划和质量要求如期完成
5.7.1 软件项目管理涉及的范围
项目管理对象:人员、产品、过程和项目
人员:项目管理人员、高级管理人员、开发人员、客户和最终用户
产品:定义项目范围(由项目环境、信息目标及功能和性能)
过程:制定计划来完成任务
项目:明确目标和过程、保持动力、跟踪进度、作出明智的决策、进行事后分析
5.7.2 软件项目估算
估算内容:成本、持续时间和工作量
估算方法:基于已经完成的类似项目、基于分解技术、基于经验模型
成本估算方法:自顶向下估算、自底向上估算、差别估算、专家估算法、类推估算法和算式估算法
COCOMO模型、COCOMO2模型、Putnam模型
5.7.3 进度管理
基本原则:划分、相互依赖性、时间分配、工作量确认、确定责任、明确输出结果、确定里程碑
进度安排:Gantt图、PERT图、
5.7.4 软件项目的组织
软件项目组织原则:尽早落实责任、减少交流接口、权责均衡
5.7.5 软件配置管理
软件配置管理的目标是标识变更、控制变更,确保变更正确的实现,报告有关变更
基线:软件生存周期中个开发阶段的特定点
软件配置项:软件工程中产生的信息项
版本控制:每一个版本都是软件配置项的一个汇集,各个版本都有可能由不同的变种组成
变更控制:利用配置数据库(开发库、受控库和产品库)和基线,辅助变更控制
5.7.6 风险管理
风险特征:不确定性和损失
项目风险:指预算、进度、人员、资源、利益相关者、需求等方便的潜在问题以及他们对软件项目的影响
技术风险:指设计、实现、接口、验证和维护等方面的潜在问题
商业风险:威胁到软件的生存能力,包括市场风险、策略风险、销售风险、管理风险和预算风险
风险识别:系统化的指出对项目计划的威胁
风险识别途径:产品规模、商业影响、客户特征、过程定义、开发环境、开发技术、人员才干及经验
风险因素:性能风险、成本风险、支持风险和进度风险
风险预测:从两个方面评估风险,发生的可能性或概率、发生的后果
风险预测活动:项目计划人员、管理人员和技术人员一起来对风险进行预测,主要活动有,建立尺度,反应风险发生的可能性,描述风险发生的后果,估算风险对项目和产品的影响,标注风险预测的整体准确度,一般采用风险表来管理风险(风险名称、种类、发生的概率以及影响)
评估风险后果的因素:风险本质、范围和时间
风险评估:采用三元组进行风险评估(r、l、x),定义项目的风险参考水平值;建立一组三元组与每一个参考水平值之间的关系;预测一组临界点以定义项目终止区域;预测什么样的风险组合会影响参考水平值
风险控制:风险规避、风险监控、RMMM计划
5.8 软件质量
软件质量:反应软件或系统产品满足规定或隐含需求的能力的特征和特征全体
软件质量管理:软件开发过程中进行独立的检查活动,由质量保证、质量规划和质量控制构成
5.8.1 软件质量特性
软件质量模型:ISO/IEC 9126、Mc Call
5.8.2 软件质量保证
软件质量保证:为保证软件系统或软件产品充分满足用户要求的质量而进行的有计划、有组织的活动,其目的是生产高质量的软件
软件必须满足用户规定的需求;软件应遵循规定所定义的一系列开发准则;软件还应该满足某些隐含的需求
质量保证活动:应用技术方法、正式的技术评审、测试软件、标准的实施、控制变更、度量、记录保存和报告
5.8.3 软件评审
设计质量的评审内容:软件的规格说明是都合乎用户的要求;可靠性;保密措施实现情况;操作特性实施情况;性能实现情况;软件是否具有可修改性、可扩充性、可互换性和可移植性;软件是否具有可测试性;软件是否具有复用性
程序质量的评审内容:功能结构;功能的通用性;模块的层次;模块结构;处理过程的结构;
与运行环境的接口评审:与硬件的接口;与用户的接口
5.8.4 软件容错技术
容错软件的能力:对自身错误的作用具有屏蔽能力、能从错误状态自动恢复、错误发生时也可以完成与其的功能、具有一定的容错能力
容错的方法:冗余,结构冗余、信息冗余、时间冗余、冗余附加技术
5.9 软件度量
软件度量:用于对产品及开发产品的过程进行度量,对软件产品、软件过程、资源的属性度量
5.9.1 软件度量分类
面向规模的度量、面向功能的度量和面向人的度量;
生产率度量、质量度量和技术度量
5.9.2 软件复杂性度量
复杂性度量的参数:规模、难度、结构和智能度
5.10 软件工具与软件开发环境
计算机辅助软件工程:使用计算机及相关的软件工具辅助软件开发、维护、管理等过程中各项活动的实施,以确保这些活动能高效率、高质量的进行
5.10.1 软件工具
软件工具:用来辅助软件开发、运行、维护、管理结合支持等过程中的活动的软件
软件开发工具:需求分析工具、设计工具、编码及排错工具和测试工具等
软件维护工具:版本控制工具、文档分析工具、开发库信息工具、逆向工程工具和再工程工具
软件管理和软件支持工具: 项目管理工具、配置管理工具、软件评价工具
5.10.2 软件开发环境
软件开发环境:支持软件产品开发的软件系统,由软件工具集和环境集成机制构成
特征:环境的服务是集成的;环境应支持小组工作方式,并为其提供配置管理;环境的服务可用于支持各种团建开发活动