1、软件工程,谢玉萍,学时安排:32(理论)+8(上机) 课程类型:考试课 成绩评定:平时成绩包含:作业和考勤。,教学安排,软件工程原理、方法与应用,史济民,顾春华、李昌武等,高等教育出版社 软件工程实践者的研究方法, 机械工业出版社,【美】RogerS.Pressman 著,梅宏译,参考书,学习目的:,软件工程是计算机专业一门重要的专业课。 目的在于培养学生用工程化的原理及方法开发软件系统,把专业知识同实际项目结合起来,为将来从事计算机软件的开发及应用维护工作打下坚实的基础。 对于培养学生的软件素质,提高学生的软件开发能力与软件项目管理能力具有重要的意义。,课程内容安排,第1章 软件工程学概述
2、第2章 可行性研究 第3章 需求分析 第4章 形式化说明技术 第5章 总体设计 第6章 详细设计 第7章 实现 第8章 维护,1.1 软件危机1.2 软件工程1.3 软件生命周期1.4 软件过程,第1章 软件工程学概述,(一)教学重点 1软件危机产生的原因和解决的方法 2软件生命周期 (二)教学难点 软件生命周期,第1章 软件工程学概述,1.1 软件危机,计算机系统:是指适当的组织在一起的一系列系统元素的集合,这些系统元素互相配合、相互协作,通过对信息的处理而完成预先定义的目标。,软件的概念:软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档的完整集合。,软件=程序,?
3、,软件的特点: 1、软件是一种逻辑实体,不是具体的物理实体。 2、软件的生产与硬件不同。 3、软件的开发和运行常常受到计算机系统的 限制,对系统有不同程度的依赖。 4、软件在运行与使用期间,没有硬件那样的机械磨损、老化问题。而是使用越多,错误越少,质量越好5、软件的开发至今没摆脱手工艺的开发方式。 6、软件是复杂的。 7、软件成本相当昂贵。,软件的发展 1、程序设计阶段(20世纪60年代中期以前)特点:一个人用汇编、机器码编写小规模软件、 硬件价格高、存储容量小。除了程序清单之外,没有其他文档资料保存下来。 2、程序系统阶段(从20世纪60年代中期到70年代中期)特点: “软件作坊”,基本仍个
4、体化开发方法。开发小组用高级语言编写中小型软件,硬件降价,容量速度明显提高。许多程序的个体化特性使得它们最终成为不可维护的。“软件危机”就这样开始出现了! 3、第三阶段:软件工程阶段(70年代中期到90年代)特点: 开发小组及大中型开发机构用软件语言、开发工具开发大中型软件。 硬件高速,大容量、开始网络化。 4、第四阶段:90年代中期至今特点: 软件工厂用软件语言、开发工具开发大中型软件。 硬件超高速,大容量、网络化。,按软件规模进行划分:类别 参加人员数 研制期限 产品规模(源程序行数) 微型 1 14周 0.5k 小型 1 16月 1k2k 中型 25 12年 5k50k 大型 520 2
5、3年 50k100k 甚大型 1001000 45年 1M(=1000k) 极大型 20005000 510年 1M10M,1.1.1 软件危机的介绍,软件危机:是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。实际上,几乎所有软件都不同程度地存在这些问题。软件危机包含下述两方面的问题: 如何开发软件,满足对软件日益增长的需求; 如何维护数量不断膨胀的已有软件。,软件危机的典型表现: (1)对软件开发成本和进度的估计常常很不准确; 实际成本比估计成本有可能高出一个数量级,实际进度比预期进度拖延几个月甚至几年的现象并不罕见。 (2)用户对“已完成的”软件系统不满意的现象经常发生; “闭门
6、造车”必然导致最终的产品不符合用户的实际需要。 (3)软件产品的质量往往靠不住; 软件质量保证技术(审查、复审和测试)还没有坚持不懈地应用到软件开发的全过程中。 实例:ARIANE 5 火箭1996 年6 月,耗资70 亿美元,发射37 秒后爆炸发射失败的原因在于软件的错误. 程序中试图将 64 位浮点数转换成 16 位整数时产生溢出,缺少错误处理程序对数据溢出进行管理 (4)软件常常是不可维护的; 错误是非常难改正的,不能适应新的硬件环境,也不能增加一些新的功能。,(5)软件通常没有适当的文档资料; (6)软件成本在计算机系统总成本中所占的比例逐年上升;(7)软件开发生产率提高的速度,远远跟
7、不上计算机应用迅速普及深入的趋势 。 软件产品“供不应求”的现象使人类不能充分利用现代计算机硬件提供的巨大潜力。,1967年苏联“联盟一号”载人宇宙飞船在返航时,由于软件忽略一个小数点,在进入大气层时因打不开降落伞而烧毁。,1962年美国飞往火星的火箭爆炸,造成几千万美元的损失。原因是FORTRAN程序:DO 5 I=1 , 3 误写为:DO 5 I=1 . 3, IBM公司每年花费大约2.5亿美元,用于修复1.3万个客户反馈缺陷和重新安装修复后的版本,每个缺陷大约花费2千美元。,20世纪90年代中期,美国软件工程实践现状是:软件开发仍然很难预测,大约只有10%的项目能够在预定的费用和进度下交
8、付使用。很多投入 巨大资金和人力的软件产品不能取得很好的成绩。,1.1.2 产生软件危机的原因,与软件本身的特点有关 软件是逻辑部件。 导致:进展难衡量、质量难评价 软件不会被“用坏”,如果发现了错误,很可能是开发时期引入。 导致:难维护 软件规模庞大,而且程序复杂性将随着程序规模的增加而呈指数上升。 导致:难以保证每个人完成的工作合在一起确实能构成一个高质量的大型软件系统,与软件开发与维护的方法不正确有关 忽视软件需求分析的重要性。 对用户要求没有完整准确的认识就匆忙着手编写程序。越早开始写程序,完成它所需要用的时间往往越长。 认为软件开发就是写程序并设法使之运行。 编写程序所需的工作量只占
9、软件开发全部工作量的10%20%。 轻视软件维护。 维护是极端艰巨复杂的工作,需要花费很大代价。软件维护的费用占软件总费用的55%70%。软件工程学的一个重要目标就是提高软件的可维护性,减少软件维护的代价。,1.1.3 消除软件危机的途径,对计算机软件有正确的认识。 认识到软件开发是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。 应该推广使用在实践中总结出来的开发软件的成功技术和方法,并继续研究探索。 应该开发和使用更好的软件工具。总之,为了解决软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。,1.2 软件工程,1.2.1 软件工程的介绍 1.2.2 软件工程
10、的基本原理 1.2.3 软件工程方法学,软件工程的代表性定义:1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,讨论软件危机问题,在这次会议上正式提出并使用了“软件工程”这个名词,一门新兴的工程学科就此诞生了。软件工程是为了经济地获得可靠的且能在实际机器上有效运行的软件,而建立和使用的完善的工程原理。 IEEE:软件工程是:把系统的、规范的、可度量的途径应用于软件的开发、运行和维护过程,也就是把工程应用于软件;研究中提到的途径。 注:IEEE:美国电气和电子工程师协会,软件工程的本质特性: 软件工程关注于大型程序的构造 软件工程的中心课题是控制复杂性 软件经常变化 开发软件的效率
11、非常重要 和谐地合作是开发软件的关键 软件必须有效地支持它的用户 在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品,软件工程采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,用于经济地开发出高质量的软件并有效地维护它,这就是软件工程。,1.2.2 软件工程的基本原理,1. 用分阶段的生命周期计划严格管理 计划不周是软件开发失败前提。50%的失败是因为此 有计划不遵守是失败的另一主要原因。因此,要严格管理,杜绝擅离计划。 2. 坚持进行阶段评审 第一 大部分错误是在编码之前造成的,据统计,设计错误占
12、63%,编码错误占37%; 第二 错误发现与改正得越晚,所需付出的代价也越高 3. 实行严格的产品控制 一切有关修改软件的建议必须按照严格的规程进行评审,获得批准以后才能实施修改。,4. 采用现代程序设计技术 采用先进的技术不仅可以提高软件开发和维护的效率,而且可以提高软件产品的质量。 5. 结果应能清楚地审查 6. 开发小组的人员应该少而精 即素质要好,人数要少。 当开发小组人员数为N时,可能的通信路径有N(N-1)/2条,可见随着人数N的增大,通信开销将急剧增加。 7. 承认不断改进软件工程实践的必要性 不断改进上述6条原理,使得软件工程能及时跟上时代前进的步伐,能跟上技术的不断进步。,软
13、件工程项目的基本目标,软件工程作为一门工程学科,其目的是采用各种技术和管理上的手段,组织实施软件项目,成功建造软件系统,项目成功 主要目标如下:以较低的成本,在规定 时限内,获得功能、性能满足用户需要的产品; 开发的软件有较好的可移植性; 易维护,且维护 成本低 ; 软件系统的可靠性较高。,1.2.3 软件工程方法学,软件工程包括技术和管理两方面的内容: 管理:通过计划、组织和控制等一系列活动,合理地配置和使用各种资源,以达到既定目标的过程。 技术(软件工程方法学):通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(methodology),也称为范型(paradigm)。,软
14、件工程方法学3要素: 方法:是完成软件开发的各项任务的技术方法,回答“怎样做”的问题; 工具:是为运用方法而提供的自动的或半自动的软件工程支撑环境;如,CASE(Computer-Aided Software Engineering,计算机辅助软件工程)工具 过程:需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。,1. 传统方法学(生命周期方法学或结构化范型)强调自顶向下 采用结构化技术来完成软件; 划分为若干个阶段,然后顺序地完成每个阶段的任务;每个阶段的任务相对独立,而且比较简单,降低了整个软件开发工程的困难程度; 前一个阶段是后一个阶段的前提和基础,而后一阶段提出的解法更具体
15、,细节更多; 每个阶段结束前必须从技术和管理两方面对这个阶段的开发成果进行严格的检查,通过之后这个阶段才算结束;保证质量,提高可维护性; 当软件规模庞大,用户的需求模糊或随时间而变化时,传统方法学往往不成功;维护起来仍然很困难。,目前,传统方法学仍然是人们在开发软件时使用得十分广泛的软件工程方法学。,2. 面向对象方法学强调主动地多次反复迭代 面向对象方法:把数据和行为看成同等重要,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。 面向对象方法学4个要点: 对象(object):融合了数据及在数据上的操作行为。 类(class):类是对具有相同数据和相同操作的一组相似对象的定义
16、。 继承:按照父类与子类的关系,把若干个相关类组成一个层次结构的系统。 消息:对象彼此间仅能通过发送消息互相联系。,1.3 软件生命周期,三个时期八个阶段:软件生命周期由软件定义、软件开发和运行维护(也称为软件维护)三个时期组成,每个时期又进一步划分成若干个阶段。,1. 问题定义 任务:问题是什么 通过对客户的访问调查,系统分析员扼要地写出关于问题性质、工程目标和工程规模的书面报告。 经过讨论和必要的修改之后这份报告应该得到客户的确认。 结果: 关于系统规模和目标的报告书,2. 可行性研究 任务:有可行的解吗 这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有
17、可行的解决办法。 结果: 系统的高层逻辑模型(数据流图、成本效益分析) 可行性论证报告(立即进行/推迟进行/不能或不值得进行),3. 需求分析 任务:必须做什么 确定目标系统必须具备哪些功能。 得出经过用户确认的系统逻辑模型。通常用用例图、数据流图、数据字典和简要的算法表示系统的逻辑模型。 用正式文档准确地记录对目标系统的需求,这份文档通常称为需求规格说明书。需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础。,4. 总体设计 任务:如何解决已提出的问题 第一步:应该设计出实现目标系统的几种可能的方案。通常至少应该设计出低成本、中等成本和高成本等3种方案。第二步:软件工程师应该用适当
18、的表达工具描述每种方案,分析每种方案的优缺点,并在充分权衡各种方案的利弊的基础上,推荐一个最佳方案。第三步:还应该制定出实现最佳方案的详细计划。如果客户接受所推荐的方案,则应该进一步完成下述的另一项主要任务。第四步:总体设计的另一项主要任务就是设计程序的体系结构,也就是确定程序由哪些模块组成以及模块间的关系。 结果: 可能的解法(系统流程图、成本效益分析) 推荐的系统体系结构(层次图或结构图),5. 详细设计 任务:怎样具体实现该系统 详细地设计每个模块,确定实现模块功能所需要的算法和数据结构。 结果: 每个模块的算法和数据结构(程序流程图、PAD图、N-S图等)。,6. 编码和单元测试 任务
19、:得到正确的程序模块 选取一种适当的高级程序设计语言(必要时用汇编语言),把详细设计的结果翻译成用选定的语言书写的程序; 并且仔细测试编写出的每一个模块。 结果: 代码和测试报告,7. 综合测试 任务:得到符合要求的软件 通过集成测试、验收测试、现场测试、平行运行等方法对目标系统进一步测试检验。 通过对软件测试结果的分析可以预测软件的可靠性;反之,根据对软件可靠性的要求,也可以决定测试和调试过程什么时候可以结束。 结果: 测试计划、详细测试方案以及实际测试结果 完整一致的软件配置,8. 软件维护 任务:使系统持久地满足用户的需要 通常有4类维护活动: 改正性维护,也就是诊断和改正在使用过程中发
20、现的软件错误; 适应性维护,即修改软件以适应环境的变化; 完善性维护,即根据用户的要求改进或扩充软件使它更完善; 预防性维护,即修改软件为将来的维护活动预先做准备。每一项维护活动都应该准确地记录下来,作为正式的文档资料加以保存。 结果: 完整准确的维护记录,各类维护工作量所占比例,维护工作量在软件生命周期所占比例,1.4 软件过程,软件过程是指开发软件产品的一组活动及其结果。 为什么要研究软件过程? 1、软件过程是1990年提出的新概念,是指为了获取高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。2、软件过程是无数软件系统成功开发的经验总结,是软件工作者的公共财富。3、
21、软件过程是规范,也是一种文化。通常包含四种基本的过程活动:,规格说明 定义软件功能以及对其使用的限制 软件开发 设计和实现满足规格说明的软件 软件确认 验证软件以保证能够满足客户的要求 软件演化 改进软件以适应不断变化的需求,什么是软件过程模型, 软件过程模型是从特定角度呈现的对软件过程的简化描述。, 常见的软件过程模型,瀑布模型,快速原型模型,螺旋模型,增量模型,传统的瀑布模型,实际的瀑布模型,1.4.1 瀑布模型,瀑布模型的特点: 1. 阶段间具有顺序性和依赖性 前一阶段的工作完成之后,才能开始后一阶段的工作; 前一阶段的输出文档就是后一阶段的输入文档。 2. 推迟实现的观点 对于规模较大
22、的软件项目来说,往往编码开始得越早最终完成开发工作所需要的时间反而越长。 3. 质量保证的观点 每个阶段都必须完成规定的文档,是“文档驱动”的模型; 每个阶段结束前都要对所完成的文档进行评审,尽早发现问题,改正错误。,瀑布模型的优点: 可强迫开发人员采用规范的方法; 严格地规定了每个阶段必须提交的文档; 要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证。 瀑布模型的缺点: 只能通过文档了解产品,不经过实践的需求是不切实际的。 瀑布模型适用于: 需求是预知的; 软件实现方法是成熟的; 项目周期较短。,快速原型模型,1.4.2 快速原型模型,快速原型:是快速建立起来的可以在计算机上运行的
23、程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。,原型模型(快速原型模型),建造/修改原型,用户测试 运行原型,听取用户意见,快速原型示例,缺点:原型系统的内部结构可能不好 开发人员需要掌握建立快速原型的开发技术和工具。适用:小型或中等规模的交互式系统 大型系统的某些部分,例如用户界面 - 生命周期较短的系统,增量模型也称为渐增模型,如图1.5所示。,1.4.3 增量模型,图1.5 增量模型,增量模型,定义,设计,框架需求,体系结构,增量 1,分析 设计 编码 测试 交付,(核心产品),增量 2,分析 设计 编码 测试 交付,增量n,分析 设计 编码 测试 交付,最终,软件系统,使
24、用增量模型时: 第一个增量构件往往实现软件的基本需求,提供最核心的功能。 第二个增量构件提供更完善的编辑和文档生成功能; 第三个增量构件完成高级的页面排版功能。,增量模型的优点: 人员分配灵活,刚开始不用投入大量人力资源。 能在较短时间内向用户提交可完成部分工作的产品。 逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品。 增量模型的缺点: 需要软件具备开放式的体系结构 需求难以在增量实现之前详细定义,因此增量与需求的准确映射以及所有增量的有效集成可能会比较困难 容易退化为边做边改方式,使软件过程的控制失去整体性,增量模型适用于:适用于需求经常改变的软件开发过程。 如果在项目既定的商业要
25、求期限之前不可能找到足够的开发人员,在这种情况下,增量模型显得特别有用。,1.4.4 螺旋模型,螺旋模型的基本思想:使用原型及其他方法来尽量降低风险。 理解这种模型的一个简便方法,是把它看作在每个阶段之前都增加了风险分析过程的快速原型模型,简化的螺旋模型,完整的螺旋模型,螺旋模型的优点: 主要优势在于它是风险驱动的。 对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标; 减少了过多测试或测试不足所带来的风险; 维护只是模型的另一个周期,维护和开发之间没有本质区别。,螺旋模型的缺点: 除非软件开发人员具有相当丰富的风险评估经验和专门知识,否则将出现真正的
26、风险。 过多的迭代次数会增加开发成本,延迟提交时间。 螺旋模型适用于: 特别适用于庞大、复杂并具有高风险的系统。 适用于内部开发的大规模软件项目。,1.4.5 喷泉模型,喷泉模型:是典型的面向对象生命周期模型。 “喷泉”这个词体现了面向对象软件开发过程迭代和无缝的特性。为避免使用喷泉模型开发软件时开发过程过分无序,应该把一个线性过程(例如,快速原型模型或图中的中心垂线)作为总目标。,喷泉模型的优点: 该模型的各个阶段没有明显的界限,开发人员可以同步进行开发。 多次反复地增加或明确目标系统,而不是本质性的改动,降低错误的可能性。 喷泉模型的缺点: 由于喷泉模型在各个开发阶段是重叠的,因此在开发过
27、程中需要大量的开发人员,不利于项目的管理。 要求严格管理文档,使得审核的难度加大,尤其是面对可能随时加入各种信息、需求与资料的情况。 喷泉模型适用于: 适用于面向对象的软件开发过程。,1.1 软件危机本章首先通过回顾计算机系统发展简史,说明开发软件的一些错误方法和观念是怎样形成的。然后列举了这些错误方法带来的严重弊病(软件危机),澄清了一些糊涂观念。 1.2 软件工程本章对软件工程的定义、七条基本原理有概括的本质的认识。介绍了软件工程使用最广泛的两种开发方法生命周期方法学把软件生命周期划分为若干个相对独立的阶段,每个阶段完成一些确定的 任务,每个阶段结束之前都进行严格的技术审查和管理复审。面向
28、对象方法学 有4个要点,可以用下列方程式概括:面向对象方法=对象+类+继承+用消息通信面向对象方法简化了软件的开发和维护,提高了软件的可重用性。,1.5 小结,1.3 软件生命周期在概念上可以把软件生命周期划分成可行性研究、需求分析、总体设计、详细设计、编码和单元测试、综合测试以及运行维护等7个阶段。1.4 软件过程通常使用软件过程模型简洁地描述软件过程,本章介绍了4种典型的软件过程模型。瀑布模型、快速原型模型、,增量模型、螺旋模型。瀑布模型历史悠久、广为人知,它的优势在于它是规范的、文档驱动的方法;这种模型的问题是,最终开发出的软件产品可能并不是用户真正需要的。,快速原型模型正是为了克服瀑布
29、模型的缺点而提出来的。它通过快速构建起一个可在计算机上运行的原型系统,让用户试用原型并收集用户反馈意见的办法,获取用户的真实需求。增量模型具有可在软件开发的早期阶段使投资获得明显回报和较易维护的优点,但是,要求软件具有开放的结构是使用这种模型时固有的困难。螺旋模型螺旋模型适用于内部开发的大型软件项目,但是,只有在开发人员具有风险分析和排除风险的经验及专门知识时,使用这种模型才会获得成功。,习题 1-1 什么是软件危机?它有哪些典型表现?为什么会出现软件危机? 1-3 什么是软件工程?它有哪些本质特性?怎样用软件工程消除软件危机? 1-4 简述结构化范型和面向对象范型的要点,并分析它们的优缺点。 1-6 什么是软件过程?它与软件工程方法学有何关系? 1-7 什么是软件生命周期模型?试比较瀑布模型、快速原型模型、增量模型和螺旋模型的优缺点,说明每种模型的适用范围。 预习内容:第二章 可行性分析,