1.软件工程
1.1 基本概述
1)基本概述
软件由程序、数据和文档组成
:
- 程序:计算机中能执行的指令或代码,能实现一定的功能。
- 数据:辅助程序运行的一些数据。
- 文档:编制程序或者数据的说明书。
软件工程是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护上的过程。软件工程包括软件需求分析、软件设计、软件构建、软件测试和软件维护等领域,与计算机科学、计算机工程、管理学、数学、项目管理学、质量管理、软件人体工学、系统工程、工业设计和用户体验设计等学科相关。
软件工程三个要素
:
- 方法:是指完成软件开发的各项任务的技术方法;
- 工具:是指为运用方法而提供的软件工程支撑环境。
- 过程:是指为获得高质量的软件所需要完成的一系列任务的框架。
软件工程的知识领域和理论基础:
- 生存周期:软件需求、软件设计、软件构建、软件测试、软件维护。
- 专门领域:软件配置管理、软件工程管理、软件工程过程、软件工程模型和方法。
- 理论基础:计算基础、数学基础、工程基础。
2)软件生命周期
软件定义阶段:
- 可行性分析与项目开发计划:要解决的问题是什么?对这些问题是否值得去解,是否有可行的解决方法?主要给出问题定义、可行性分析和项目开发计划。
- 需求分析:确定软件系统必须做什么,确定软件系统的功能、性能、数据和界面等要求,进而确定系统的逻辑模型。主要输出需求分析文档,使用
逻辑模型
。
软件开发阶段:
- 总体概要设计:系统应该如何解决问题?主要是设计软件的结构,明确有哪些模块组成,模块的层次以及功能。
- 详细设计:提出解决问题的办法。主要对每个模块完成的功能进行具体描述,设计出程序的详细规格说明。
- 编码和单元测试:程序代码。主要把每个模块的控制结构转换成计算机可接受的程序代码,实际运行的系统。
- 综合测试:通过各种类型的测试或调试使软件达到预定的要求。最基本的测试是集成测试和验收测试。
软件维护阶段:
- 维护:软件交付正式投入运行后便进入软件维护阶段。
1.2 开发模型
1)原型模型
原型模型就是创建一个快速原型,能够满足项目干系人与未来的用户可以与原型进行交互,再通过与相关干系人进行充分的讨论和分析,最终弄清楚当前系统的需求
,进行了充分的了解之后,在原型的基础上开发出用户满意的产品。
★ 适用于需求不明确,动态变化的项目,如界面的开发。
2)演化模型(变换模型)
演化模型主要针对事先不能完整定义需求的软件开发,是在快速开发一个原型的基础上,根据用户在使用原型的过程中提出的意见和建议对原型进行改进,获得原型的新版本。重复这 一过程,最终可得到令用户满意的软件产品。
主要优点是,任何功能一经开发就能进入测试,以便验证是否符合产品需求,可以帮助引导出高质量的产品要求。其主要缺点是,如果不加控制地让用户接触开发中尚未稳定的功能,可能对开发人员及用户都会产生负面影响。
★ 主要解决需求不明确的项目
。
3)瀑布模型
瀑布模型是将各个活动规定为线性顺序连接的若干阶段的模型。
瀑布模型的特点:
- 从上一项开发活动接受其成果作为本次活动的输入。
利用这一输入,实施本次活动应完成的工作内容。
给出本次活动的工作成果,作为输出传给下一项开发活动。
对本次活动的实施工作成果进行评审。若其工作成果得到确认,则继续进行下一项开发活动;否则返回前一项目,甚至更前项的活动。尽量减少多个阶段间的反复。
优点是有利于项目管理,缺点是发行问题晚成本高。
★ 适用于需求明确、解决方案明确的项目
。
4)螺旋模型
螺旋模型是一个演化软件过程模型,将原型实现的迭代特征与线性顺序(瀑布)模型中控制的和系统化的方面结合起来。
开发过程具有周期性重复的螺旋线状。4个象限分别标志每个周期所划分的四个阶段:
制定计划。确定软件的目标,选定实施方案,明确项目开发的限制条件。
风险分析。分析所选的方案,识别风险,消除风险。
实施工程。实施软件开发,验证阶段性产品。
用户评估。评价开发工作,提出修正建议,建立下一个周期的开发计划。
★ \bigstar★ 适用于庞大、复杂并具有高风险的项目。
5)增量模型
增量模型融合了瀑布模型的基本成分和原型实现的迭代特征,它假设可以将需求分段为一系列增量产品,每一增量可以分别地开发。该模型采用随着日程时间的进展而交错的线性序列,每一个线性序列产生软件的一个可发布的“增量”。
★ 需求大部分明确,系统较为复杂,有一定技术风险
。
6)V模型
V模型,整体看是V字型的结构,如下:
V模型的特点如下:
- 单元测试的主要目的是针对编码过程中可能存在的各种错误。(单编)
- 集成测试的主要目的是针对详细设计中可能存在的问题。(集详)
- 系统测试主要针对概要设计,检查系统作为一个整体是否有效地运行。(系概)
验收测试通常由业务专家或者用户进行,以确认产品能真正符合用户业务上的需求。(验需)
★ \bigstar★ V模型用于需求明确和需求变更不频繁的情形。
7)其他模型
喷泉模型是一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发方法。它克服了瀑布模型不支持软件重用和多项开发活动集成的局限性。喷泉模型使开发过程具有迭代性和无间隙性
。迭代意味着模型中的开发活动常常需要重复多次,在迭代过程中不断地完善软件系统。
1.3 开发方法
1)结构化开发方法
结构化开发方法由结构化分析、结构化设计、结构化程序设计构成,它是一种面向数据流的开发方法。
- 结构化分析是根据分解与抽象的原则,按照系统中数据处理的流程,用数据流图来建立系统的功能模型,从而完成需求分析工作。
- 结构化设计是根据模块独立性准则、软件结构优化准则将数据流图转换为软件的体系结构,用软件结构图来建立系统的物理模型,实现系统的概要设计。
- 结构化程序设计是根据结构程序设计原理,将每个模块的功能用相应的标准控制结构表示出来,从而实现详细设计。
★ 结构化方法总的指导思想是自顶向下、逐层分解
,它的基本原则是功能的分解与抽象。适用于数据处理领域,不适用于解决大规模的、特别复杂的项目,且难以适应需求的变化
。
2)原型化开发方法
并非所有的需求都能够预先定义,而且反复修改是不可避免的,原型化方法可以迅速地开发出一个可以让用户看得见、摸得着的系统框架。
开发原型化系统首先确定用户需求,开发原始模型,然后征求用户对初始原型的改进意见,并根据意见修改原型。
★适用于用户需求不清、业务理论不确定、需求经常变化的情况。当系统规模不是很大也不太复杂时,采用该方法是比较好的。
3)面向对象开发方法
面向对象开发方法的基本出发点是尽可能按照人类认识世界的方法和思维方法来分析和解决问题。客观世界是由许多具体的事物、事件、概念和规则组成的,这些均可被看成对象,面向对象方法正是以对象作最基本的元素,它也是分析问题、解决问题的核心。
面向对象开发方法包括面向对象分析、面向对象设计和面向对象实现。
UML:统一建模语言(Unified Modeling Language),是面向对象的标准建模语言,通过统一的语义和符号表示,使各种方法的建模过程和表示统一起来,已成为面向对象建模的工业标准。
★ \bigstar★主要是分析、设计、实现三个阶段,适用于界限不明确的情况。
4)敏捷方法
敏捷方法也称适应型生命周期、或者变更驱动方法,是以人为核心、迭代、循序渐进的开发方法,适用于一开始没有或不能完整地确定出需求和范围的项目,或者需要应对快速变化的环境,或者需求和范围难以事先确定,或者能够有利于干系人的方式定义较小的增量改进。
1.4 软件项目管理
1)项目基本概念
项目是有一定的资源约束(时间资源、经费资源、人力资源)、一定的目标和一次性任务组成
,即为达到特定目的,使用一定资源,在确定的期间内,为特定发起人提供独特的产品、服务或成果而进行的一系列相互关联的活动的集合。项目有完整的生命周期,有开始,有结束,具有一次性、临时性的特点。
项目是为创造独特的产品、服务或成果而进行的临时性工作。
里程碑是项目中的重要时点或事件;持续时间为零,其代表的是一个时间点。
项目涉及的管理有范围管理、时间管理、成本管理、质量管理、配置管理和风险管理
。
2)时间管理(进度管理)
时间管理:也称进度管理,就是采用科学的方法,确定进度目标,编制进度计划和资源供应计划,进行进度控制,在与质量、成本和目标协调的基础上,实现工期目标。
时间管理的大致进程如下:
Gantt图,又称甘特图,是一种简单的水平条形图,它以日历为基准描述项目任务。水平轴表示日历时间线 (如时、天、周、月和年等),每个条形表示一个任务,任务名称垂直地列在左边的列中,图中水平条的起点和终点对应水平轴上的时间,分别表示该任务的开始时间和结束时间,水平条的长度表示完成该任务所持续的时间。当日历中同一时段存在多个水平条时,表示任务之间的并发。
优点:甘特图能清晰地描述每个任务从何时开始,到何时结束,任务的进展情况以及各个任务之间的并行性。
缺点:不能清晰地反映出各任务之间的依赖关系,难以确定整个项目的关键所在,也不能反映计划中有潜力的部分。
PERT图,项目计划评审技术(Program Evaluation & Technique),是一个有向图,图中的箭头表示任务,它可以标上完成该任务所需的时间。一个事件有一个事件号和出现该事件的最早时刻和最迟时刻。最早时刻表示在此时刻之前从该事件出发的任务不可能开始;最迟时刻表示从该事件出发的任务必须在此时刻之前开始,否则整个工程就不能如期完成。每个任务还可以有一个松弛时间(slack time),表示在不影响整个工期的前提下,完成该任务有多少机动余地。
总时差(松弛时间):在不延误总工期的前提下,该活动的机动时间。活动的总时差等于该活动最迟完成时间与最早完成时间之差,或该活动最迟开始时间与最早开始时间之差。
优点:
PERT图不仅给出了每个任务的开始时间、结束时间和完成该任务所需的时间。
还给出了任务之间的关系,哪些任务完成后才能开始另外一些任务。
以及如期完成整个工程的关键路径。
松弛时间则反映了完成某些任务时可以推迟其开始时间或延长其所需完成的时间。
缺点:不能反映任务之间的并行关系。
关键路径法是制定进度计划时使用的一种进度网络分析技术。沿着项目进度网络路线进行正向与反向分析,从而计算出所有计划活动理论上的最早开始与完成日期、最迟开始与完成日期,不考虑任何资源限制。
在关键路径上的任务是不能延误的,耗时最长的是关键路径
。
3)人员管理
主程序组。一名主程序员,一名后备程序员,一名资料员,若干名程序员。便于集中领导,步调统一,容易按规范办事,但不利于发挥积极性。人员数n-1。
无主程序员组。无主程序员组中的成员之间相互平等,有利于发挥每个人的积极性。但这种组中交流量大,往往职责不明确,出了问题谁也不负责,而且不利于与外界的联系。人员数n(n-1)/2。
层次式程序员组。一位组长,若干名高级程序员,若干名程序员。适用于具有层次结构特点的大型软件项目。
4)风险管理
风险是带有不确定性、损失和机会的事项。
风险分析有一系列活动如下:
风险识别。试图系统化地确定对项目计划(估算、进度、资源分配)的威胁。方法有建立风险条目检查表。
风险条目检查表,又称通用风险分析表,包括风险问题、发送的可能性、影响的严重性、风险预测值、风险优先级。
风险预测。又称风险估算,从风险发生的可能性或概率评估一个风险。
风险评估。定义风险参照水准。
风险控制。方法有降低风险、避免风险、转嫁风险和接受风险。
常用的风险分析有定量分析和定性分析。
系统开发和运行知识(下):https://developer.aliyun.com/article/1529327