软件工程原理
内容和目的
为什么要实施软件工程?\r\n实施软件工程的益处?\r\n软件工程的基本内容?\r\n软件开发模型
计算机系统工程
计算机软件
计算机软件定义(GB):\r\n a. 与计算机系统的操作有关的计算机程序、规程、规则,以及可能有的文件、文档及数据。\r\n b. 与计算机系统的操作有关的程序、规程、规则及任何与之有关的文档。
什么是软件?
软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。\r\n程序是按事先设计的功能和性能要求执行的指令序列\r\n数据是使程序能正常操纵信息的数据结构\r\n文档是与程序开发,维护和使用有关的图文材料
软件的特点
软件是一种逻辑实体,而不是具体的物理实体。因而具有抽象性\r\n软件的生产与硬件不同,在它的开发过程中没有明显的制造过程\r\n在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题\r\n软件的开发和运行常受到计算机系统的限制,对计算机系统有着不同程度的依赖性\r\n软件的开发至今尚未完全摆脱手工艺的开发方式\r\n软件本身是复杂的\r\n实际问题的复杂性\r\n程序逻辑结构的复杂性 \r\n软件成本相当昂贵\r\n相当多的软件工作涉及到社会因素
软件的分类—按功能进行划分
系统软件\r\n 操作系统\r\n 数据库管理系统\r\n 设备驱动程序\r\n 通信处理程序等\r\n支撑软件\r\n文本编辑程序\r\n文件格式化程序\r\n磁盘向磁带向数据传输的程序\r\n程序库系统\r\n支持需求分析、设计、实现、测试和管理的软件
应用软件\r\n商业数据处理软件\r\n 工程与科学计算软件\r\n 计算机辅助设计/制造软件\r\n 系统仿真软件\r\n 智能产品嵌入软件\r\n 医疗、制药软件\r\n 事务管理、办公自动化软件\r\n 计算机辅助教学软件
软件的分类—按规模进行划分
类别 参加人员数 研制期限 源程序行数 \r\n微型 1 1~4周 0.5k \r\n小型 1 1~6月 1k~2k\r\n中型 2~5 1~2年 5k~50k\r\n大型 5~20 2~3年 50k~100k\r\n甚大型 100~1000 4~5年 1M(=1000k)\r\n极大型 2000~5000 5~10年 1M~10M
软件的分类
按工作方式划分:\r\n 实时处理软件\r\n 分时软件\r\n 交互式软件\r\n 批处理软件\r\n按服务对象的范围划分:\r\n 项目软件\r\n 产品软件
按使用的频度进行划分:\r\n 一次使用\r\n 频繁使用\r\n按软件失效的影响进行划分:\r\n 高可靠性软件\r\n 一般可靠性软件
软件发展阶段
程序设计阶段 — 50至60年代\r\n程序系统阶段 — 60至70年代\r\n软件工程阶段 — 70年代以后
软件危机...
计算机硬件性能/价格比和质量稳步提高\r\n软件成本逐年上升,质量没有可靠的保证\r\n软件已成为限制计算机系统发展的关健因素\r\n将软件开发和维护过程中遇到的一系列严重问题统称为“软件危机”\r\n在60年代后期开始认真研究解决软件危机的方法,逐步形成了新兴的计算机软件工程学
...软件危机
什么是软件危机?\r\n软件危机是指在计算机软件的开发和维护中所遇到的一系列严重问题。\r\n几乎所有软件都不同程度地存在这些问题\r\n概括地说软件危机包含两方面问题:\r\n如何开发软件,怎样满足对软件的日益增长的需求\r\n如何维护数量不断膨胀的已有软件
软件危机主要表现
1.对软件开发成本和进度的估计很不准确\r\n2.用户对“已完成的”软件不满意的现象经常发生\r\n3.软件产品的质量靠不住\r\n4.软件不可维护\r\n5.软件没有适当的文档资料\r\n6.软件成本占计算机系统总成本的比例逐年上 升\r\n7.软件开发生产率提高的速度远远跟不上计算机应用迅速普及深入的趋势
产生软件危机的原因
一方面与软件本身的特点有关\r\n在软件运行前,软件开发过程的进展难衡量,质量难 评价,因此管理和控制软件开发过程相当困难;\r\n在软件运行中,软件维护意味着改正或修改原来的设计,较难维 护;\r\n软件的显著特点是规模庞大,复杂度超线性增长。要保证高质量 大型软件的开发,极端复杂困难,不仅涉及技术问题(如分析方 法、设计方法、版本控制),更重要的是必须有严格而科学的管理。\r\n另一方面与软件开发和维护方法不正确有关,这是主要原因。\r\n特别是忽视软件需求分析的重要性
忽视软件需求分析的重要性
对用户要求没有完整准确的认识就匆忙着手编写程序\r\n软件开发与编程等同\r\n忽略文档\r\n软件定义不明\r\n轻视维护
对软件开发的错误认识(1)
已经有了关于建造软件的标准和规程\r\n使用了吗?\r\n开发者知道吗?\r\n适用吗?\r\n完整吗?\r\n已经有了很好的软件开发工具\r\n还需要计算机辅助软件工程(CASE)工具
对软件开发的错误认识(2)
如果计划落后,可以增加人员赶回来\r\n给一个已经延迟的软件项目增加人手只会使其更加延迟\r\n原有人员需要抽实践训练新手\r\n有了目标的一般描述就可以开始写程序\r\n不完善的系统定义是项目失败的主要原因
对软件开发的错误认识(3)
项目需求不断变化,但软件很灵活,变化能够很容易地得到满足\r\n软件需求的变化确实是经常的,但其产生的影响随着引入的时间不同而不同\r\n写出程序并使其正常运行,工作就结束了\r\n越早开始写程序,就要花越长时间才能够完成
对软件开发的错误认识(4)
在程序真正开始运行前,无法评估其质量\r\n正式的技术评审\r\n质量过滤器\r\n成功项目唯一应该提交的就是运行程序\r\n软件=程序 文档 数据\r\n文档是成功开发的基础\r\n文档为维护提供指导
解决办法...
全 面解决软件危机需要一 系列综合措施:\r\n在软件研制的各个阶段采用好的工具;\r\n对软件的实现提供有效的构件块;\r\n为保证软件质量提供自动设计技术;\r\n以及为协调、控制、管理提供基本理论和技术——软件工程。
...解决办法
软件工程这一要素将驾驭前面的工具、构件决和技术\r\n软件工程把管理、控制、评审等方法与分析、设计、编码、测试、维护等技术结合起来\r\n没有坚实的软件开发方法学,即使最先进的工具和技术也不能使软件危机有所减轻
软件工程—工程化方法
用于解决任何产品开发的一种工程化方法是:\r\n要求在定义、开发和维护阶段的每一步中都采用经过验证的方法\r\n要求一系列的复查,以便在产品开发中保证质量\r\n规定在每一步中要产生的特定的文档\r\n鼓励能够加速开发的各种工具和方法的使用与研制\r\n提供从原始产品概念到最后产品制造的一个可追溯的途径\r\n软件工程是使计算机软件走向工程科学的途径
软件工程—软件工程定义
软件工程是为了经济地获得可靠的和能在实际机器上高效运行的软件而建立和使用的好的工程原则。(Fritz Bauer 1969)\r\n软件工程是应用于计算机软件的定义、开发和维护的 一整套方法、工具、文档、实践标准和工序。(GB)\r\n软件工程:(1)将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。(2)(1)中所述方法的研究。(IEEE93)\r\n软件工程是模仿在硬件研制中行之有效的一套计划、管理、技术、方法,基于软件的生存期概念而建立起来的。
软件工程的定义
Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料\r\nFritz Bauer:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法
软件工程三要素:方法、工具和过程
软件工程方法为软件开发提供了 “如何做” 的技术\r\n软件工具为软件工程方法提供了自动的或半自动的软件支撑环境
软件工程—视图1...
质量焦点
过程
方法
工具
...软件工程—视图1
质量焦点:任何工程方法必须以有组织的质量保证为基础。质量的理念刺激不断过程改进,导致出现更加成熟的软件工程方法。它是软件工程的根基。\r\n过程:软件工程的基础是过程。软件工程过程是将技术层结合在一起的凝聚力,使得软件能够合理地和及时地开发出来。\r\n方法:软件工程方法层提供了建造软件在技术上需要“怎么做”。\r\n工具:在工具层对过程和方法提供了自动和半自动的支持。
软件工程—生存期概念
计算机软件生存期中有三个阶段:定义阶段、开发阶段 、维护阶段。\r\n定义阶段:为软件项目做出计划、预算资金和进度,分析并规定详细的需求——做什么\r\n开发阶段:用经过验证的各种设计、编码和测试方法把软件需求转变为一个可执行的程序——怎么做\r\n维护阶段:纠正所遇到的各种问题,修正软件使之适合于不同的工作环境,增强功能要求——改变\r\n每一个阶段都有一系列的工程步骤,每一步都以能加以 复查并可移交才作为结束
软件工程知识结构
2001年5月ISO/IEC JTC 1(ISO和IEC的第一联合技术委员会)发布了《 SWEBOK指南V0.95(试用版)》\r\n(Guide to the Software Engineering Body of Knowledge,简称SWEBOK)\r\nSWEBOK把软件工程学科的主体知识分为10个知识领域。
软件工程知识结构
软件需求\r\n 软件设计\r\n 软件构造\r\n 软件测试\r\n 软件维护\r\n 软件配置管理\r\n 软件工程管理\r\n 软件工程过程\r\n 软件工程工具和方法\r\n 软件质量
软件工程的基本原理
B.W.Boehm(1983)\r\n 1) 用分阶段的生命周期计划严格管理;\r\n 2) 坚持进行阶段评审;\r\n 3) 实行严格的产品控制;\r\n 4) 采用现代程序设计技术;\r\n 5) 结果应能清楚地审查;\r\n 6) 开发小组的人员应该少而精;\r\n 7) 承认不断改进软件工程实践的必要性。
计划管理
缺乏科学而周密的计划是软件开发普遍现象\r\n不成功软件项目一半以上由于计划不周造成\r\n应把软件生存期划分为若干阶段,制定科学周密、切实可行的计划,并严格按计划进行管理,这是软件项目取得成功的先决条件\r\n计划所做的和按计划去做\r\n计划一般包括:项目开发计划、软件配置管理计划、软件质量保证计划、软件测试计划等
评审
在每个阶段都进行严格的评审,以便尽早发现在软件开发过程中所犯的错误,是一条必须遵循的重要原则\r\n质量保证工作不能等到程序编制完成后才进行:\r\n1. 程序中的大部分错误是在编码之前造成的\r\n2. 错误的检测与改正时间越晚,所付出的代价也就越高。\r\n3. 错误还会被“放大”
配置管理...
软件研制各阶段产生的文档、报告、程序清单和数据等,构成软件配置\r\n全部软件配置是一个软件产品的真正代表,必须使其保持精确和一致\r\n为了保持软件配置的一致性,必须实行严格的产品控制,对变更进行严格的控制和管理
...配置管理
配置管理是标识和确定系统中配置项的过程,在系统整个生存周期内控制这些项的投放和变更,记录并报告配置的状态和变更要求,验证配置项的完整性和正确性。它包括对软件配置的标识、控制、审计、记录等一系列的活动\r\n在软件研制过程中,由业已经过正式审核与同意,可用作下一步开发的基础,并且只有通过正式的修改管理步骤方能加以修改的规格说明或产品形成了配置管理的基线
软件开发方法和工具
软件工程鼓励研制和采用各种先进的软件开发方法和工具\r\n各种软件开发方法的出现和采用大大改善了软件的开发效率和维护效率\r\n软件工程辅助工具、计算机辅助软件工程(CASE)环境\r\n工具和环境的使用进一步提高了软件的开发效率、维护效率和软件质量
文档...
软件研制是脑力劳动,具有不可见性\r\n\r\n为了实现对软件研制过程的管理,在软件研制的每个阶段,都应按规定的格式编写出完整准确的文档\r\n\r\n文档是软件中不可缺少的组成部分
...文档的作用
1)作为阶段工作成果和结束标志;\r\n2)向管理人员提供软件开发过程中的进展和情况,把软件开发过程中的一些“不可见的”事物转换成“可见的”文字资料;\r\n3)记录开发过程中的技术信息,便于协调以后的软件开发、使用和修改;\r\n4)提供对软件的有关运行、维护和培训的信息,便于各类人员之间相互了解彼此的工作;\r\n5)向潜在用户报告软件的功能和性能,使他们能判定该软件能否服务于自己的需要。
开发小组
软件开发小组的组成人员的素质应该好,而人数则不宜过多\r\n开发小组人员的素质和数量是影响软件产品质量和开发效率的重要因素\r\n随着开发人员数目的增加,因为交流情况讨论问题造成的通信开销也急剧增加\r\n组成少而精的开发小组是一条基本原理
不断改进
仅有前面六条基本原理并不能保证软件开发和维护的过程能赶上时代前进的步伐、跟上技术的不断进步\r\nBoehm 提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条基本原理\r\n不仅要积极地采纳新的软件技术,而且要注意不断总结经验
软件工程基本原则-1
抽象 采用分层次抽象,自顶向下、逐层细化的办法控制软件开发过程的复杂性。\r\n信息隐蔽 将模块设计成“黑箱”,实现的细节隐藏在模块内部,不让模块的使用者直接访问。这就是信息封装,使用与实现分离的原则。\r\n模块化 如 C 语言程序中的函数过程,C 语言程序中的类。模块化有助于信息隐蔽和抽象,有助于表示复杂的系统。\r\n局部化 要求在一个物理模块内集中逻辑上相互关联的计算机资源,保证模块之间具有松散的耦合,模块内部具有较强的内聚。这有助于控制解的复杂性。
软件工程基本原则-2
确定性 软件开发过程中所有概念的表达应是确定的、无歧义性的、规范的。\r\n一致性 整个软件系统的各个模块应使用一致的概念、符号和术语。程序内部接口应保持一致。软件和硬件、操作系统的接口应保持一致。系统规格说明与系统行为应保持一致。用于形式化规格说明的公理系统应保持一致。\r\n完备性 软件系统不丢失任何重要成分,可以完全实现系统所要求功能的程度。为了保证系统的完备性,在软件开发和运行过程中需要严格的技术评审。\r\n可验证性 开发大型的软件系统需要对系统自顶向下、逐层分解。系统分解应遵循系统易于检查、测试、评审的原则,以确保系统的正确性。
软件研制过程模型
软件生存周期从产品的设想到不再使用,包含软件开发、运行、维护全过程\r\n软件开发包含一系列阶段、活动和里程碑,如需求分析、设计、编码、测试\r\n软件研制过程模型给出了将这些基本阶段进行有机组合的结构性模型
瀑布模型
1970年由W.Royce提出
瀑布模型描述
从60年代开始,为解决软件危机逐渐发展起软件工程。瀑布模型\r\n则是传统软件工程的基础。瀑布模型的基本思想是将软件生命周期划\r\n分为若干明确定义的阶段。需求捕获是软件生命周期的第一个阶段;\r\n上一个阶段生成规定的软件中间产品(软件文档,伪码等),传到下\r\n一阶段作进一步加工,最后得到目标产品。\r\n 瀑布模型是一个理想化过程,
瀑布模型特点
(1) 阶段间具有顺序性和依赖性\r\n(2) 推迟实现的观点\r\n(3) 质量保证的观点
瀑布模型的使用风险和适用情况
使用风险\r\n需求未被充分理解\r\n系统太大而不能一次实现\r\n事先打算采用的技术迅速发生变化\r\n需求迅速发生变化\r\n有限的资源\r\n无法利用某一中间产品
适用情况\r\n所有的系统功能一次交付时\r\n必须同时淘汰全部老系统时瀑布模型
V模型
J.McDermid于1994年在“软件工程师参考手册”中提出
增量模型
增量模型描述
预先计划的产品改进\r\n从一套给定的需求开始,通过一系列的造型实施开发,第一个造型纳入一部分需求,下一个造型纳入更多的需求,以此类推,直到系统完成\r\n在每个造型中实行必要的过程、活动和任务
增量模型特点
在开发每个造型时,开发过程中的活动和任务顺序地或部分平行重叠地使用\r\n当相继的造型在部分并发地被开发时,开发过程中的活动和任务可以在造型间平行地被采用
增量模型的使用风险和适用情况
风险\r\n需求未被很好地理解\r\n突然提出一些功能\r\n事先打算采用的技术迅速发生变化\r\n需求迅速发身变化\r\n长时期内有限的资源投入
适用情况\r\n需要早期获得功能\r\n中间产品可以提供使用\r\n系统被自然地划分成增量\r\n工作人员和(或)资金可以逐步增加
渐进模型
渐进模型描述和特点
通过造型开发系统\r\n需求不能被完全理解,且不能在初始时就确定\r\n需求一部分被预先定义,然后在每个相继的造型中逐步完善\r\n每个造型被开发时,开发过程中的活动和任务顺序地或部分重叠并行地被采用\r\n对所有造型,开发过程中的活动和任务通常按同意顺序被重复使用
采用渐进模型的一些原因
1)需要某些用户经验来改进和完善需求;\r\n2)某些部分的实现可能取决于未来技术的可用性;\r\n3)某些新的用户需求被预料到,但目前还不清楚;\r\n4)某些需求可能比遇到的那些还难以满足,并且确定不允许因这些需求推迟可用的交付。
渐进模型的使用风险和适用情况
风险\r\n突然提出一些功能\r\n长时期内有限的资源投入
适用情况\r\n需要早期获得功能\r\n中间产品可以提供使用\r\n系统被自然地划分成增量\r\n工作人员和(或)资金可以逐步增加\r\n需要用户反馈来理解全部需求\r\n便于对技术变化的监督
原型开发模型
原型分类
抛弃式原型开发\r\n样品式原型开发\r\n渐增式原型开发
螺旋模型
B.Boehm于1988年提出
螺旋模型描述
瀑布模型和渐进模型相结合,增加风险分析\r\n用来指导大型软件项目的开发\r\n将开发划分为制定计划、风险分析、实施工程、客户评估四类活动\r\n沿螺旋线每转一圈,表示开发出一个更完善的新的软件版本
喷泉模型
喷泉模型描述
1990年B.H.Sollers和J.M.Edwards提出\r\n主要用于采用面向对象技术的项目\r\n喷泉体现迭代和无间隙的特征\r\n软件的某些部分常常被重复工作多次,相关对象在每次迭代中随之加入渐进的软件成分\r\n在分析、设计、实现等各项活动之间无明显边界
RUP模型
软件过程模型的选择
1)模型应符合软件本身的性质(规模、复杂性)\r\n2)模型应满足软件应用系统整体开发进度要求\r\n3)模型应有可能控制并消除软件开发风险\r\n4)模型应有可用的计算机辅助工具(如快速原型工具)的支持\r\n5)模型应与用户和软件开发人员的知识和技能相匹配\r\n6)模型应有利于软件开发的管理与控制
航天型号软件研制过程模型
航天型号研制经历方案阶段、模样、初样、试样(正样)、定型\r\n型号软件研制通常也经历模样、初样、试样(正样)\r\n模样、初样、正样软件是针对同一个软件开展的循环研制,侧重面不同。\r\n结合原型、渐进模型,以原型-基本型-更新型来形成航天型号软件研制过程模型
原型、基本型、更新型
基本思想是:首先在需求尚不明确的情况下,对已知的需求和尚不能确定的需求进行分析整理,在此基础上简单地设计、编制软件,产生一个软件的原型,并对原型进行多方面的研究、分析和讨论,以便确定所采取的技术实现方案是否可行,需求还要做哪些补充、修改和完善,从而获得一个内容较完整、接口较明确的软件需求和一个切实可行的软件实现技术途径;其次在软件原型研制的基础上,进行一次完整、严格的软件研制工作,获得一个高质量的软件基本型;最后在软件基本型的基础上,针对更新的软件需求,采用软件更新与更改的的方法,对软件进行更新,获得软件的更新型
模样、初样、试样-正样
原型
软件原型研制的目的是明确接口、确定需求、试验系统方案\r\n需求分析:根据系统的任务分解和技术要求,对已知需求、应有需求、未确认需求等进行综合分析,形成粗略的原型软件需求规格说明。\r\n设计:对软件的总体结构和接口进行设计,形成软件设计说明。\r\n编码调试:编制程序并调试通过。\r\n分析总结:运行软件,并与系统总体、相应接口单位进行详细的分析讨论,对软件需求进行补充、修改和完善,并确定技术途径的可行性。\r\n对高质量要求的软件研制,软件原型研制所获的程序应废弃,不带入以后的研制阶段。
基本型
基本型研制的任务是根据基本确定的软件需求,全面开展软件的研制工作,形成一个基本满足系统对软件各项要求的基本型软件,以直接应用于型号或作为下一步更新的基础。\r\n基本型软件的研制,必须采用瀑布式开发过程,严格执行。\r\n研制阶段包括:系统需求、软件需求分析、概要设计、详细设计、软件实现、软件组装测试、软件确认测试、系统联试
更新型
在获得软件基本型之后,可根据系统对软件需求的补充、修改、完善的需要,在软件基本型的基础上对软件进行一次直至多次的更新。\r\n更新型软件的研制按照软件更新与更改方法进行。它也遍历软件研制的全过程,但是所有工作都是以基本型为基础进行的。更新后获得的更新型软件又可作为后续更新工作的基本型。\r\n更新型软件研制包括:更新系统需求、修改补充软件需求、修改软件设计、修改补充软件程序、测试和回归测试、系统联试