1第二章软件工程基础软件的发展大体经历了如下三个阶段:①程序设计阶段,约为50至60年代②程序系统阶段,约为60至70年代③软件工程阶段,约为70年代以后软件的发展时间特点程序设计程序系统软件工程软件所指程序程序及说明书程序、文档、数据主要程序设计语言汇编及机器语言高级语言软件语言软件工作范围程序编写包括设计和测试软件生存期需求者程序设计本人少数用户市场用户开发软件的组织个人开发小组开发小组及大中型开发机构软件规模小型中小型大中小型决定质量的因素个人程序技术小组技术水平管理水平软件的概念软件是计算机系统中与硬件相互依存的另一部分,它包括程序、数据、相关文档的完整集合以及完善的售后服务。软件=程序+数据+文档+服务software=program+data+document+service软件的特点软件是一种逻辑实体,而不是具体的物理实体。软件的生产方式与硬件不同。在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题。软件的开发和运行常常受到计算机系统的限制,对计算机系统有着不同程度的依赖。软件的开发至今尚未完全摆脱手工业的开发方法。软件是复杂的,人类能够创造的最复杂的产物是计算机软件。软件成本相当昂贵。软件的分类按软件的功能划分⑴系统软件⑵支撑软件⑶应用软件按软件服务对象的范围划分⑴项目软件(定制软件)⑵产品软件软件危机(softwarecrisis)定义:软件危机是指在计算机软件的开发、使用和维护过程中所遇到的一系列严重问题。主要包含两方面的问题:⑴如何开发新的软件,怎样满足对软件日益增长的需求;⑵如何维护数量不断膨胀的已有软件。软件危机的表现对软件开发成本和进度的估计常常不够准确。用户对“已完成的”软件系统不满意的现象经常发生。软件产品的质量往往靠不住。软件常常是不可维护的。软件通常没有适当的文档资料。软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。软件危机的原因客观:软件本身特点软件的规模庞大、复杂性高。主观:不正确的开发方法,错误的认识忽视需求分析软件开发=程序编写轻视软件维护软件危机的解决途径组织管理工程项目管理方法技术措施软件开发技术与方法软件工具从而出现了“软件工程”的概念。软件工程的定义“软件工程”一词是1968年北大西洋公约组织(NATO)在联邦德国召开的一次会议上首次提出的,这个会议专门讨论了软件危机问题。这次会议被看作是软件发展史上一个重要的里程碑。软件工程的定义1993年,权威组织IEEE对软件工程定义为:软件工程是将系统化的、严格约束的、可量化的方法,应用于软件开发、运行和维护中去。2001年,RogerS.Pressman对软件工程的定义是:软件工程是一个过程、一组方法和一系列工具。现在的定义,软件工程是研究软件开发和软件管理的一门工程科学。12软件工程的定义是与时俱进的软件工程的定义具体地说:采用工程的概念、原理、技术和方法来计划、开发与维护软件,把经过时间考验且证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以较经济的手段获得能在实际机器上运行的可靠软件的一系列方法。简言之:工程方法+管理技术+技术方法软件工程研究的内容14研究方面具体内容软件开发模型瀑布模型、增量模型、敏捷模型、原型模型…软件开发方法结构化的方法、面向对象的方法、UML的方法…软件支持工具建模工具、开发工具、测试工具、文档工具、配置工具、安装工具…软件管理过程ISO9000、CMM/CMMI、微软企业文化(MSF)、IBM企业文化、敏捷文化现象(XP)...软件工程三要素:方法、工具、过程软件工程的8个基本原理用分阶段的生命周期计划,严格管理软件开发。坚持进行阶段评审。实行严格的产品版本控制。采用现代程序设计技术。结果应能清楚地审查,文档要有严格要求。开发小组的成员要少而精。要不断地改进软件工程实践的经验和技术。牢记二八定律15软件工程中的二八定律对软件项目进度和工作量的估计:一般人主观上认为已经完成了80%,但实际上只完成了20%对程序中存在问题的估计:80%的问题存在于20%的程序之中对模块功能的估计:20%的模块,实现了80%的功能对人力资源的估计:20%的人,解决了软件中80%的问题对投入资金的估计:企业信息系统中80%的问题,可以用20%的资金来解决。16软件工程的作用从软件项目团队来讲,在规定的时间内,按照规定的成本,完成预期目标(软件的功能、性能和接口达到需求报告标准)的软件。从软件企业本身来讲,持续地规范软件开发过程和软件管理过程,不断地优化软件组织的个人素质和集体素质,从而逐渐增强软件企业的市场竞争实力。从软件发展进程来讲,克服软件危机,控制软件进度,节约开发成本,提高软件质量。从院校来讲,以前它只是作为一门课或一本书。现在它成为一门学科和一个体系。17软件工程中的文档可行性研究报告项目开发计划软件需求分析说明书数据要求说明书概要设计说明书详细设计说明书软件测试说明书测试分析报告用户手册操作手册程序维护手册开发进度月报项目开发总结软件工程中的三个开发方法结构化的方法面向对象的方法UML的方法19结构化开发方法简介1978年,E.Yourdon和L.L.Constantine提出了结构化开发方法SASD(StructureAnalysisStructureDesign)属于自顶向下的设计,在设计阶段就得考虑如何实现系统的功能,因为分解的过程其实就是实现功能的过程。基本思想是软件功能的分解和抽象,原理是将一个软件分为多个过程(函数)进行开发,用结构体(struct)管理数据。也称面向数据流或面向过程的软件开发方法结构化编程SP(StructureProgramming)程序的主体是方法方法是最小的功能模块一组相关的方法组合成一个大的功能模块早期的程序开发,如C语言,都是用结构化开发方法。结构化开发方法举例一个画板系统Panel包括4个功能选择形状画长方形画圆画直线自顶向下结构化分析设计工具:数据流图DFD选择形状模块数据流图结构化编程定义形状标示常量drawCircle()drawLine()drawRectangle()selectShape()接收用户输入的形状switchvoidselectShape(){intshape;scanf(%d,&shape);switch(shape){caseCircle;drawCircle();break;caseLine;drawLine();break;caseRectangle;drawRectangle();break;default;printf(输入的形状不存在);break;}}假定需求发生变化要求增加一个画三角形的功能需要对系统做多处改动增加一个形状常量定义增加一个画三角形的功能方法在selectShape中增加一个分支逻辑优缺点缺点:制约了软件的可维护性和可扩展性模块之间的松耦合性不高修改或增加一个模块会影响到其他模块根本原因:自顶向下地按照功能来划分,但是软件的功能不是一成不变的方法和一部分与之相关的数据分离,全局变量和常量数据分散在系统的各个角落,削弱了各个系统之间的相对独立性。面向对象的方法发展历程其根源可追溯到60年代的挪威,当时挪威计算中心的KristenNygaard和Ole-JohanDahl开发了一种称作Simula67的语言。Simula67首次引入了类、协同程序和子类的概念。70年代中期,XeroxPaloAlto研究中心的研究人员设计了Smalltalk语言,该语言的每个元素都被当作一个对象来实现。80年代早期,AT&T贝尔实验室的BjarneStroustrup把C语言扩展为支持面向对象程序设计的C++。内容面向对象需求分析面向对象设计面向对象编程面向对象测试面向对象维护面向对象管理。在分析、设计、实现中用到“对象、类、继承、消息通信”这四个基本概念,就是面向对象的方法。29特点及优缺点特点:以数据为中心,把数据和对数据的操作紧密地结合起来,用对象分解代替传统的功能分解。分析设计时面向类,编程时面向对象。优点:用无穷的方法来描述无穷的(随机的)信息世界,所以能完全描述信息世界;易于维护。缺点:较难掌握。30把对象作为融合数据和操作的统一的构件把所有对象都划分成类子类自动拥有父类中定义的数据和操作对象间仅能通过发送消息互相联系Return面向对象方法学的4个要点思考用面向对象的方法实现画板?UML的方法没有五线谱,作曲家如何能精确表达自己的灵感?UML定义UML——UML是一种绘制软件蓝图的标准语言,可以使用UML对软件系统的进行以下工作:可视化(visualizing)详述(specifying)构造(constructing)文档化(documenting)公众反馈97.10.11UML1.1被OMG接纳为标准97.9公布UML1.197.1公布UML1.096.6和96.10UML0.9&0.91OOPSLA95UnifiedMethod0.8合作伙伴意见其它方法Booch93Booch91OMT-1OOSE工业化标准化统一化分散的各部分OMT-2UML的发展历程优点:P17软件工具一般是指为了支持软件人员开发和维护活动而使用的软件。软件工具发展的三个阶段工具箱软件开发环境SDE计算机辅助软件工程CASE(ComputerAidedSoftwareEngineering)工具应该支持软件生命周期的各个阶段RequirementsManagement-VisualModeling-ProgrammingTool-QualityAssurance软件工具软件工程常用支持工具系统分析设计与建模工具IBMRationalRoseMicrosoftVisualStudioTeamSystem数据库设计与建模工具SybasePowerDesignerCAERWinMicrosoftOfficeVisio开发工具MicrosoftVisualStudio(.NET平台)开源Eclipse(JAVA平台)单元测试工具开源NUnit(.NET平台)开源JUnit(JAVA平台)38软件生存周期概论任何有生命的动物、植物和人,都有一个生存周期(LifeCycle),例如人的生存周期为胎儿、婴儿、幼儿、儿童、少年、青年、中年、老年、死亡。没有生命的事物或实体,例如PC机、路由器、家具、房子、汽车,它们也有一个生存周期,这个生存周期就是使用寿命,即生产周期加上使用周期。39软件生命周期(softwarelifecycle)定义:软件生命周期是指软件产品从功能确定、设计,到开发成功投入使用,并在使用中不断修改、增补、完善,直到该软件产品停止使用为止的整个时期。软件生命周期可分为三个阶段:即定义阶段、开发阶段和运行维护阶段,每个阶段需完成几个任务。各阶段任务阶段关键问题结束标准系统定义问题是什么?关于规模和目标的报告书可行性研究有可行的解吗?系统的高级逻辑模型;数据流图成本/效益分析需求分析系统必须做什么?系统的逻辑模型;数据流图;数据字典;算法描述总体设计概括地说,应该如何解决这个问题?可能的解法:系统流程图;成本/效益分析;推荐的系统结构;层次图详细设计怎样具体地实现这个系统?编码规格说明:HIPO图或PDL编码和单元测试正确的程序模块源程序清单;单元测试方案和结果综合测试符号要求的软件综合测试方案和结果维护持久地满足用户需求的软件完整准确的维护记录软件开发模型在软件开发过程中,为了从宏观上管理软件的开发和维护,要对软件过程建模。常见的有:编码-修正模型、瀑布模型、快速原型模型、螺旋模型,RUP模型。编码-修正模型在软件开发早期,开发只有两个阶段:编写程序