软件工程概述
第一章:软件工程基本概念
1、软件的概念与特点
1.什么是软件?
软件=程序+数据+文档
程序:按照事先设计的功能和性能需求执行的指令序列
数据:是程序能正常操纵信息的数据结构
文档:与程序开发、维护和使用有关的图文材料。
程序是可执行部分,数据则是不可执行部分。
2.软件的特点:
2.1 软件是开发的或者是工程化的,并不是制造的。
2.2 软件生产是简单的拷贝。
2.3 软件会多次修改。
2.4 软件开发环境对产品影响较大
2.5 软件开发时间和工作量难以估计
2.6 软件的开发进度几乎没有客观衡量标准
2.7 软件测试非常困难
2.8 软件不会磨损和老化
2.9 软件维护易产生新的问题
3.软件的双重作用:
一方面是一种产品:可以提供计算能力,产生、管理、获取、修改、显示或者传输信息
另一方面是开发其他软件产品的工具:支持或者提供系统所需的功能,控制其他程序,改善通信,帮助开发其他软件等等。
4.软件的分类:
4.1 按功能分类:大概可以分为三大类:系统软件,支撑软件,应用软件。
系统软件:操作系统,数据库管理系统,设备驱动程序,通信处理程序等。
支撑软件:文本编辑工具,文件格式化程序,磁盘或磁带间数据传输的程序,程序库系统,支持需求分析、设计、实现、测试和支持管理的软件。
应用软件:商业数据处理软件,工程与科学计算软件,计算机辅助软件,系统仿真软件,只能产品嵌入软件,医疗、制药软件等等。
4.2 按服务分类:项目软件和产品软件
5.为什么软件发展会这么快?
计算需求:软件必须适应新的计算环境或者技术
业务需求:软件必须改善,以实现新的业务需求
嵌入需求:软件必须扩展,以满足和新一代系统和数据库之间的相互操作
架构需求:软件必须重新设计,使其在新的网络环境中是可用的
2、软件危机的产生
1.什么是软件危机?
软件危机就是在计算机软件的开发和维护过程中所遇到的一系列严重问题。(主要是效率和质量下降)
1968年NATO会议提出“软件危机”。
2.常见的危机:项目超出预算、项目超过计划完成时间、软件运行效率很低、软件质量差、软件通常不符合要求、项目难以观察并且代码难以维护、软件不能交付等等。
3.产生危机的原因:
客观:软件本身的特点 具有逻辑部件且规模庞大
主观:不正确的开发方法 忽视需求分析,轻视软件维护
4.解决危机的方法:
首先,对计算机软件有一个正确的认识,即软件不等于程序。
其次,必须充分认识到软件开发不是某种个体劳动的神秘绩效,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程任务。
最后,推广使用在实践中总结出来的开发软件的成功技术和方法,开发和使用更好的软件工具。
3、软件工程的概念与发展
1.软件工程的定义:
IEEE计算机协会将软件工程定义为应用系统化的、学科化的、定量的方法,来开发、运行和维护软件,即将工程运用到软件
2.软件工程的目标:
软件工程的目标是在给定的时间和预算内,按照用户的需求,开发易修改、高效、可高、可维护、适应力强、可移动、可重用的软件
3.软件工程的三要素:
3.1 工具:它为软件工程的过程和方法提供自动化或半自动化的工具支持。将若干工具集成起来,与软件工程数据库和计算机系统构成一个支持软件开发的洗三天称“计算机辅助软件工程”,系统中某一工具的信息加工结果可以作为另一工具的输入。集成的软件工程工具再加上人的因素构成了软件工程环境。
3.2 方法:软件工程方法时完成软件工程项目的技术手段。它支持项目计划和估算、系统和软件需求分析、设计、编程、测试和维护。软件工程方法依赖一组原则,它贯穿软件工程的各个环节。软件工程方法分两类:结构化方法和面向对象方法。
3.3 过程:过程贯穿软件开发的更饿环节,在各环节之间建立里程碑;管理者在软件工程过程中对软件开发的质量、进度、成本进行评估、管理和控制;技术人员采用相应的方法和工具生成软件工程产品(模型、文档、数据、报告、表格)等。
4.软件工程的四个重要阶段:
第一代软件工程-传统的软件工程:60年代到70年代,为了克服软件危机,提出软件工程,将软件开发纳入工程化的轨道,基本形成软件工程的概念框架技术和方法,称为传统的软件工程。
第二代软件工程-对象工程:80到90年代,面向对象的方法与研究得到方法,研究的重点转移到面向对象的分析与设计,演化为一种完整的软件开发方法和系统的技术体系,称为对象工程。
第三代软件工程-过程工程:80年代中开始,人们在软件开发的时间过程中认识到:提高软件生产率,保证软件质量的关键是软件过程,是软件开发和维护中的管理和支持能力,逐步形成软件过程工程。
第四代软件工程-构件工程:90年代起,基于构件的开发方法取得重要进展,软件传统的开发可通过使用线程的可重用构件组装完成,而无需从头开始构件,以此达到提高效率和质量,降低成本的目的,称为构件工程。
5.软件工程的七个原则:
使用阶段性生命周期计划的管理。
进行连续的验证。
保证严格的产品控制。
使用现代编程工具/工程实践。
保持清晰的责任分配。
用更好更少的人。
保持过程改进。
4、软件工程知识体系

5、软件工程体系关联

第二章:软件过程模型
1、软件过程概念
1.软件生命周期:
就是指软件产品或软件系统从设计到投入使用到被淘汰的全过程。
问题定义-----可行性研究------需求分析-------总体设计------详细设计---编码-----测试------维护
=========================================================================================
项目计划报告 可行性研究报告 需求规格说明书 总体设计说明书 详细设计说明书 源程序 软件测试报告 软件维护说明
2.什么是软件工程:
软件工程就是在工作产品构建过程中,所需完成的工作活动、动作和任务的集合。
活动:驻村实现宽泛的目标,与应用领域项目大小结果复杂性或者实施软件工程的重要程度没有直接关系。
动作:包含了主要工作产品生产过程中的一系列任务。
任务:关注小而明确的目标,能够产生实际产品。
3.软件过程模型:也叫软件开发模型,软件生存周期模型,软件工程范型
是软件开发全部过程、活动和任务的结构框架,它能直观表达软件开发全过程,明确规定要完成的主要活动,任务和开发策略。
4.软件过程评估方式:
CMM 能力成熟度模型
ISO9000 质量标准体系
SPICE 信息技术软件过程评估

2、相关模型
2.1 瀑布模型

瀑布模型的缺点;
增加工作量,开发风险大,早期错误发现晚代价大,不适应需求变化。
适用场合:
适用于系统需求明确且稳定技术成熟、工程管理严格的场合,如军工,航天,医疗等。
2.2 V-model:瀑布模型的变种

2.3 原型模型
Prototype model 又被称之为原型化模型、快速原型模型
一个部分开发的产品,是客户和开发人员能对计划开发的系统相关方面进行检查。
优点:减少需求不明确带来的风险
缺点:构造模型采用的技术的工具不一定主流,快速建立起来和连续修改可能导致原型质量低下,客户意识不到一些质量问题。

2.4 增量模型
Incremental Model:满足用户需求的一个子集,能够完成一定功能,小而可用的软件。
特点:
优点:
能在较短的时间内向用户提交可完成部分工作的产品
将待开发的软件系统模块化,可以分批次地提交软件产品,使用户可以及时了解软件项目的进展
以组件为单位进行开发降低了软件开发的风险。一个开发周期内的错误不会影响到整个软件系统
开发顺序灵活。开发人员可以对组件的实现顺序进行优先级排序,先完成需求稳定的核心组件。当组件的优先级发生变化时,还能及时地对实现顺序进行调整
缺点:
由于各个构件是逐渐并入已有的软件体系结构中的,所以加入构件必须不破坏已构造好的系统部分,这需要软件具备开放式的体系结构
在开发过程中,需求的变化是不可避免的。增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而是软件过程的控制失去整体性
如果增量包之间存在相交的情况且未很好处理,则必须做全盘系统分析,这种模型将功能细化后分别开发的方法较适应于需求经常改变的软件开发过程
增量模型的作用
1、开发初期的需求定义只是用来确定软件的基本结构,使得开发初期用户只需要对软件需求进行大概的描述;而对于需求的细节性描述,则可以延迟到增量构件开发时进行,以增量构件为单位逐个地进行需求补充。这种方式能够有效适应用户需求的变更
2、软件系统可以按照增量构件的功能安排开发的优先顺序,并逐个实现和交付使用。不仅有利于用户尽早用上系统,能够更好地适应新的软件环境,而且在以增量方式使用系统的过程中,还能获得对软件系统后续构件的需求经验
3、软件系统是逐渐扩展的,因此开发者可以通过对诸多构件的开发,逐步积累开发经验。实际上,增量式开发还有利于技术复用,前面构件中设计的算法、采用的技术策略、编写的源码等,都可以应用到后面将要创建的增量构件中去
4、增量式开发有利于从总体上降低软件项目的技术风险。个别的构件或许不能使用,但一般不会影响到整个系统的正常工作
5、实际上,在采用增量模型时,具有最高优先权的核心增量构件将会被最先交付,而随着后续构件不断被集成进系统,这个核心构件将会受到最多次数的测试。这意味着软件系统最重要的心脏部分将具有最高的可靠性,这将使得整个软件系统更具健壮性

2.5 螺旋模型
定义:
螺旋模型(Spiral Model)采用一种周期性的方法来进行系统开发。这会导致开发出众多的中间版本。使用它,项目经理在早期就能够为客户实证某些概念。该模型是快速原型法,以进化的开发方式为中心,在每个项目阶段使用瀑布模型法。这种模型的每一个周期都包括需求定义、风险分析、工程实现和评审4个阶段,由这4个阶段进行迭代。
特点:
最大的特点在于引入了其他模型不具备的风险分析,使软件在无法排除重大风险时有机会停止。
螺旋模型更适合大型的昂贵的系统级的软件应用
优:
设计上的灵活性,可以在项目的各个阶段进行变更
以小的分段来构建大型系统,使成本计算变得简单容易
客户始终参与每个阶段的开发,保证了项目不偏离正确方向以及项目的可控性
缺:
很难让用户确信这种演化方法的结果是可以控制的
建设周期长,而软件技术发展比较快,所以经常出现软件开发完毕后,和当前的技术水平有了较大的差距,无法满足当前用户需求

2.6 喷泉模型
该模型认为软件开发过程自下而上周期的各阶段是相互重叠和多次反复的,就像水喷上去又可以落下来,类似一个喷泉。
特点:
1、面向对象生命周期模型。
2、具有较好的可移植性。
3、容易适应各种运行环境。
4、迭代,无间隙。
5、各阶段是相互重叠和多次反复的
优:
1.各个阶段没有明显的界限,开发人员可以同时进行多步骤,故软件项目开发效率高,节省开发时间。
2.软件的某个部分通常被重复多次。
缺:
1.该模型的各个阶段没有明显的界限,开发人员可以同步进行开发,则开发过程中需要大量开发人员。
2.需严格管理文档,从而又使得审核的难度加大,因为随时面对加入的各种信息、需求与资料等

3、统一过程开发
(1)迭代式开发
在软件开发的初期就想完全、准确地获得用户的需求基本是不可能的。实际上,设计者常常碰到的问题是需求在整个软件开发过程中经常会发生变化。而迭代式开发允许每次迭代开发过程中需求发生变化,它正是通过不断迭代来细化对问题的理解。这样,迭代式开发大大降低了项目开发的风险,提高了软件开发的效率
(2)需求管理
准确地确定系统的需求是一个连续渐进的过程,开发人员不可能在系统开发之前就完全详细地理解系统的全部需求。而RUP正是提供了如何获得、组织系统的功能和约束条件并将其文档化的方法
(3)便于复用的软件体系结构
组件是可复用的单位,为了达到软件复用的目的,可以由组件来组成系统。基于独立的、可替换的、模块化组件的体系结构的优点是它方便管理,并能有效地提高软件的重用性。RUP展示了如何设计一个灵活的、有很强适应性的、有利于理解和便于复用的软件体系结构
(4)有利于可视化建模
RUP常常和UML相互联系,这就有利于建立软件系统的可视化模型。RUP提供了对软件系统进行可视化建模的方法
(5)对软件质量进行验证
在RUP中,软件质量的评估不再是事后进行或单独小组进行的分离活动,而是贯穿于软件开发的过程中,这样就有利于及早发现软件中存在的不足
开发过程
RUP中的软件生命周期在时间上被分解为四个顺序的阶段,分别是:初始阶段、细化阶段、构造阶段和交付阶段。每个阶段结束于一个主要的里程碑。每个阶段本质上是两个里程碑之间的时间