1软件工程(SoftwareEngineering)软件工程2信息随手可得比尔·盖茨,1994未来的社会——信息社会软件工程380年代初期,BusinessWeekly杂志在头版给出了这样一个大标题:“软件:新的驱动力”,编辑们当时根本没有意识到他们的预见是多么的正确。那时,大多数人对软件还一无所知,大软件公司如微软公司还不存在;出售包装好的软件的计算机超市闻所未闻;在电视上为操作系统作60秒的商业广告的想法是可笑的;互联网仅为个别研究这和部分高校所知……30年的时间里,这些甚至更多已经成为现实。软件工程430年后……健康软件……带翼的软件公路上的代码软件工程5计算机软件已经成为一种驱动力应用于:交通、医药、通讯、军事、娱乐、办公……软件工程6什么是软件?软件的定义——软件由三部分组成:程序:在运行时,能提供所希望的功能和性能的指令集。数据结构:使程序能够正确运行的数据结构。文档:描述程序研制过程、方法及使用的文档。软件是计算机系统中与硬件相互依存的另一部分,它是包括程序、数据及其相关文档的完整集合。软件工程7软件的特点Logicalratherthanphysical(软件是一种逻辑实体,而非具体的物理实体)DevelopedorEngineered,notmanufacturedintheclassicalsense(在研制、开发活动中被创造出来,但不能按传统的生产含义加以理解)Doesn'twearout(在软件的运行和使用期间,没有磨损、老化问题)软件工程8时间t失效率(failurerate)磨合调试好老化淘汰a.硬件失效率曲线时间t失效率(failurerate)理想实际b.软件失效率曲线软件工程9第1章:软件工程学概述1.1软件危机60年代中期以前:通用硬件相当普遍,软件却是为某个具体的应用而编写的。60年代中到70年代中:软件作坊。软件工程10软件危机:计算机软件的开发和维护过程中所遇到的一系列严重问题。(正常、不正常运行软件都具有这种问题)1.1.1软件危机的介绍软件工程111)对软件开发成本和进度的估计常常很不准确;2)用户对完成的软件系统不满意的现象经常发生;3)软件产品的质量往往靠不住;软件危机的典型表现:软件工程124)软件常常是不可维护的;5)软件通常没有适当的文档资料;6)软件成本在计算机系统总成本中所占的比例逐年上升;7)软件开发生产率提高的速度跟不上计算机应用的发展趋势。软件工程131.1.2产生软件危机的原因1)软件本身特点造成;2)软件开发与维护的方法不正确。主要表现:(a)忽视软件需求分析;(b)认为软件开发就是写程序并使之运行;(c)轻视软件维护;软件工程14在软件开发的不同阶段进行修改需要付出的代价很不相同:高中低早期中期后期软件开发时期代价引入同一修改的代价随时间变化的趋势软件工程151)推广使用在实践中总结出来的开发软件的成功技术和方法,并研究探索更有效的技术和方法;2)开发和使用更好的软件工具;3)良好的组织管理措施。1.1.3解决软件危机的途径软件工程16为了解决软件危机产生的问题,软件工程与方法学逐渐形成,然后出现了两个相互相承又各有侧重的学科:1)软件工程学:主要应用工程的方法和技术研究软件开发与维护的方法、工具和管理的一门交叉学科。2)程序设计方法学:主要应用数学的方法研究程序的性质以及程序设计的理论和方法的学科。软件工程171.2软件工程1.2.1软件工程的介绍1968年NATO会议:软件工程就是为了经济地获得可靠的且能在实际机器上有效地运行的软件,而建立和使用完善的工程原理。1993年IEEE:软件工程是(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程;(2)研究(1)中提到的途径。软件工程181.软件工程关注于大型程序的构造;2.软件工程的中心课题是控制复杂性;3.软件经常变化;4.开发软件的效率非常重要;5.和谐地合作是软件开发的关键;6.软件必须有效地支持它的用户;7.在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品。软件工程的本质特性:软件工程191.2.2软件工程的基本原理1.用分阶段的生命周期计划严格管理;2.坚持进行阶段评审;3.实行严格的产品控制;4.采用现代程序设计技术;5.结果能清楚地审查;6.开发小组的人员应该少而精;7.承认不断改进软件工程实践的必要性。软件工程201.2.3软件工程方法学通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学(Methodology),也称为范型(Paradigm)。软件工程方法学的3要素:方法、工具和过程软件工程211.传统方法学也称为生命周期方法学或结构化范型。结构化方法(StructureMethod)有:1)结构化设计方法(SD);2)结构化分析方法(SA);3)结构化分析与设计技术(SADT)4)JACKSON方法5)WARNIER方法软件工程222.面向对象方法学把数据和对数据的操作紧密结合起来的方法,模拟人类认识世界解决问题的方法和过程。面向对象的方法=对象(属性与服务的封装)+分类+继承+通过消息的通讯软件工程231)适用于实时事物处理系统的有限状态机方法(FSM);2)适用于并发软件系统的PETRI网方法;3)以数学概念和理论为基础的形式化方法,如SDC公司的形式化开发方法FDM:(FormalDevelopmentMethodology)IBM公司的维也纳开发方法VDM:(ViennaDevelopmentMethod)3.其他开发方法软件工程241.3软件生命周期软件生命周期:指软件从提出到最终被淘汰的这个存在期。软件工程25软件生命周期组成:1)软件定义;A.问题定义B.可行性研究C.需求分析2)软件开发;D.总体设计E.详细设计F.编码和单元测试G.综合测试3)运行维护。软件工程261.问题定义;2.可行性研究;3.需求分析;4.总体设计(概要设计);5.详细设计;6.编码与单元测试;7.综合测试;8.维护。软件生命周期各个阶段:软件工程27问题定义可行性研究需求分析总体设计详细设计编码与单元测试综合测试软件维护要解决的问题是什么?问题性质、工程目标和规模的报告分析员:实际用户+负责人是否有解决办法?分析员高层逻辑模型,准确和具体的工程规模和目标,成本/效益分析等可行性报告为了解决的问题,目标系统必须做什么?准确确定系统的功能系统的逻辑模型(数据流图+数据字典+简要算法)如何解决这些问题模块划分软件结构如何具体地实现系统:每个模块的流程图(程序的详细规格说明)通过各种类型的测试,使软件达到预定的要求写出正确的容易理解和容易维护的程序模块通过各种必要的维护活动使系统持久地满足用户的需要软件工程281.4软件过程软件过程:为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。软件过程(ISO9000):使用资源将输入转化为输出的活动所构成的系统。输入:如软件需求输出:如软件产品软件工程291.4.1瀑布模型1.阶段间具有顺序性和依赖性2.推迟实现的观点3.质量保证的观点软件工程30优点:采用规范的方法;严格规定每个阶段提交的文档;要求每个阶段交出的产品必须经过验证。软件工程311.4.2快速原型模型优点:不带反馈环,基本上是线性顺序进行。软件工程321.4.3增量模型优点:能较短时间内提交可完成部分工作的产品;可以使用户有充裕的时间学习和适应新产品。软件工程33一种风险更大的增量模型:软件工程341.4.4螺旋模型可把它看作在每个阶段之前都增加风险分析的快速原型模型。软件工程35软件工程361.4.5喷泉模型典型的面向对象软件开发过程模型之一。软件工程371.4.6Rational统一过程1.RUP软件开发经验(1)迭代式开发(2)管理需求(3)使用基于构件的体系结构(4)可视化建模(5)贯穿于开发过程的软件质量验证(6)控制软件变更软件工程381.4.7敏捷过程与极限编程1.敏捷过程具有高效、快速响应变化的开发过程。(1)个体和交互胜过过程和工具;(2)可以工作的软件胜过面面俱到的文档;(3)客户合作胜过合同谈判;(4)响应变化胜过遵循计划。2.极限编程敏捷过程中最著名的一种,指把好的开发实践运用到极致,多应用于软件需求模糊的场合。软件工程391.4.8微软过程1.微软过程准则2.微软软件生命周期(1)规划阶段(2)设计阶段(3)开发阶段(4)稳定阶段(5)发布阶段3.微软过程模型软件工程40问题定义就是要确定为用户建立什么样的软件系统,软件叫什么样的名称等等。“问题”是指软件最基本的问题,如:软件的总体目标什么?有什么用途?为那些用户设计?1.5问题定义阶段软件工程42问题定义是软件生命周期中时间最短的阶段,一般都比较简单,因此在实际开发中它是最容易被忽视的一个阶段。这一阶段工作主要由系统分析员来完成,系统分析员要尽可能从较高的角度概括软件所要做的工作,而不用写明问题的实现细节。软件工程43习题1-5根据历史数据可以做出如下的假设:对计算机存储容量的需求大致按下面公式描述的趋势逐年增加:M=4080e0.28(Y-1960)存储器的价格按下面公式描述的趋势逐年下降:P1=0.3×0.72Y-1974(美分/位)如果计算机字长为16位,则存储器价格下降的趋势为:P2=0.048×0.72Y-1974(美元/字)在上列公式中Y代表年份,M是存储容量(字数),P1和P2代表价格。基于上述假设可以比较计算机硬件和软件成本的变化趋势。要求计算:软件工程44(1)在1985年对计算机存储容量的需求估计是多少?如果字长为16位,这个存储器的价格是多少?(2)假设在1985年一名程序员每天可开发出10条指令,程序员的平均工资是每月4000美元。如果一条指令为一个字长,计算使存储器装满程序所需用的成本。(3)假设在1995年存储器字长为32位,一名程序员每天可开发出30条指令,程序员的月平均工资为6000美元,重复(1)、(2)题。软件工程45(1)在1985年对计算机存储容量的需求,估计是如果字长为16位,则这个存储器的价格是(2)如果一条指令的长度为一个字,则使存储器装满程序共需4474263条指令。在1985年一名程序员每天可开发出10条指令,如果每月有20个工作日,则每人每月可开发出10×20条指令。为了开发出4474263条指令以装满存储器,需要的工作量是:)19601985(28.04080eM74080e)(263,474,4字447426372.0048.019741985P)(7895美元,)(371222004474263人月,软件工程46程序员的月平均工资是4000美元,开发出4474263条指令的成本是(3)在1995年对存储容量的需求估计为:如果字长为32位,则这个存储器的价格是:)(00048489400022371美元,,)19601995(28.04080eM8.94080e)(679,577,73字7357767972.032003.019741995P)(127,7美元软件工程47如果一条指令为一个字长,则为使存储器装满程序共需73,577,679条指令。在1995年一名程序员每天可开发出30条指令,每月可开发出600条指令,为了开发出可装满整个存储器的程序,需要的工作量为开发上述程序的成本为:)(790,776,7356000122629美元)(62912260073577679人月,