软件工程与项目管理.pptx
软件工程与项目管理,We cant run the modern world without software.,第二部分 软件工程技术方法综述,本部分主要介绍软件工程中2类基本的实践方法结构化方法面向对象方法另外描述一些常见的技术:软件复用敏捷开发,软件工程方法比较,软件工程是计算机学科中一个年轻并充满活力的研究领域软件工程为建造软件提供了技术上的解决方法,覆盖了需求建模、设计建模、编码、测试和维护等方面总的来说,软件工程方法主要包含结构化方法和面向对象方法,软件工程方法比较,软件开发的任务是构建软件系统,并将其部署到现实世界中,通过软件系统与环境交互,解决现实问题,软件系统与外部世界的交互,问题域与解系统的关系,软件工程方法比较,课堂讨论背景:你要开发一段程序,输入班级所有人的成绩,按成绩由高到低的次序进行排序;你该如何去做?,软件工程方法比较,背景:你要开发一段程序,输入班级所有人的成绩,按成绩由高到低的次序进行排序;你该如何去做?,成绩排序系统,软件工程方法比较,任何软件系统开发的共同本质在于:从现实空间的需求到计算机空间的软件代码之间的映射与转换;,现实空间的需求,软件系统,实现途径:映射与转换,软件工程方法比较,任何软件系统开发的共同本质在于:从现实空间的需求到计算机空间的软件代码之间的映射与转换;,软件工程方法比较,软件工程方法比较,软件工程为建造软件提供了技术上的解决方法,这些方法在分析阶段提供了一些对问题域进行分析和认识的途径,从问题域逐步过渡到编程语言的描述手段,现实世界,编程实现,软件工程方法,软件工程方法比较,结构化软件工程方法,面向对象软件工程方法,结构化软件工程方法,最早、最传统的软件开发方法根据某种原理,使用一定的工具,按照特定步骤进行工作的一种软件开发方法结构指系统内部各个组成要素之间的相互联系、相互作用的框架提出了一套提高软件结构合理性的准则:分解与抽象、模块独立性、信息隐蔽针对软件生存周期各个阶段,分别有:结构化分析(SA)、结构化设计(SD)、结构化编程(SP),但各种方法存在不一致性,结构化软件工程方法需求分析,结构化需求分析发展成熟、简单实用、使用广泛,Edward Nash Yourdon,Tom Demarco,结构化软件工程需求分析,结构化需求分析主要解决的问题是:需要系统做什么常用的描述软件功能需求的工具有:数据流图和数据字典,结构化软件工程需求分析,结构化需求分析主要解决的问题是:需要系统做什么常用的描述软件功能需求的工具有:数据流图和数据字典 存在的弊端以数据或数据流进行分析,其结果不能直接映射问题域,容易隐蔽一些对问题域的理解偏差,给后续开发阶段衔接带来困难其分析方式采用的数据流图中可能存在细节不足和缺乏数据流控制方面的细节,结构化软件工程概要设计和详细设计,概要设计主要是将系统分解成模块,并表示模块之间的调用和接口关系详细设计是进一步描述模块内部结构化软件设计最重要的原则是模块独立结构化设计的基本方法是从数据流图导出软件的模块结构图,结构化软件工程概要设计和详细设计,原始数据,机内数据,正确数据,解,格式化解,输出解,逻辑输出,逻辑输入,(物理输入),(物理输出),数据流图,结构化软件工程概要设计和详细设计,正确数据,求解编辑数据,计算,获得正确数据,输出解,编排格式,打印解,编辑数据,读入数据,正确数据,原始数据,原始数据,解,格式化解,解,正确数据,格式化解,解,模块结构图,结构化软件工程概要设计和详细设计,转换,设计模型(物理模型),需求分析和设计之间的鸿沟:数据流图和模块结构图很难对应,结构化软件工程结构化编码,编码是软件设计的自然结果利用某种编程语言产生一个能被计算机理解并执行出结果的系统结构化编程技术相对比较成熟,结构化软件工程结构化测试,测试的目的在于识别出存在于软件产品中的缺陷测试提供了一种可以操作的方式来减少系统中的缺陷,并增加用户对一个已经开发的系统的信心,结构化软件工程结构化维护,维护最大的难点是人们对软件的理解过程中所遇到的障碍结构化方法中,各个阶段的文档表示不一致,给维护带来一定困难,结构化软件工程技术-总结,从功能的观点设计系统自顶向下,逐步分解和细化将大系统分解为若干模块,主程序调用这些模块实现完整的系统功能,结构化软件工程技术-总结,把软件视为处理数据的流,并定义成由一系列步骤构成的算法;每一步骤都是带有预定输入和特定输出的一个过程结构化方法以功能分解和数据流为核心,但是系统功能和数据表示 极有可能发生变化,面向对象软件工程方法,Jacobson于1994年提出面向对象软件工程方法包括OOA,OOD,OOP和OOT面向对象的方法将数据和对数据的操作紧密结合起来,其基本出发点是尽量模拟人类的思维习惯和方式,ivar jacobson,面向对象软件工程方法,喷泉模型:在OO开发过程中,各阶段之间形成频繁的迭代OO各阶段均采用统一的“对象”概念,各阶段之间的区分变得不明显,形成“无缝”连接,从而容易实现多次反复迭代,面向对象软件工程方法需求分析,强调直接针对问题域中客观存在的各种事物建立对象,用对象的属性和服务分别描述事物的静态特征和行为 保留问题越中事物之间的关系,将具有相同属性和相同服务的对象归为一类,用继承关系描述一般类与特殊类之间的关系分析过程不考虑与实现有关的问题分析过程的关键是识别出问题域内的对象,分析其相互之间的关系,面向对象软件工程方法需求分析,面向对象软件工程方法需求分析,面向对象软件工程方法面向对象设计,将分析所得到的结果不经过变换(仅仅做必要的修改和调整),直接转换为设计模型适当补充一些与实现相关的部分分析和设计过程采用相同的符号,没有明显的分界线,一般都是反复迭代进行分析的过程时考虑做什么,设计的过程则考虑怎么做,面向对象软件工程方法面向对象设计,将分析所得到的结果不经过变换(仅仅做必要的修改和调整),直接转换为设计模型适当补充一些与实现相关的部分分析和设计过程采用相同的符号,没有明显的分界线,一般都是反复迭代进行分析的过程时考虑做什么,设计的过程则考虑怎么做,面向对象软件工程方法面向对象编程,用面向对象语言,针对设计结果中的每个部分编写出代码编程的实质就是用具体的数据结构来定义对象的属性,用具体的语句来实现服务,面向对象软件工程方法面向对象测试,以对象为中心,进行软件测试查错范围主要是类定义之内的属性和服务,以及有限度的对外接口所涉及的部分,面向对象软件工程方法面向对象维护,采用面向对象技术开发的软件,维护的难度大大降低,面向对象软件工程方法-总结,系统被看作对象的集合每个对象包含一组描述自身特性的数据以及作用在数据上的操作(功能集合)在面向对象开发模式中优先考虑的是实体(问题论域的对象);,结构化与面向对象本质区别,面向过程的结构化系统=功能+数据 面向对象的系统=对象+消息,(软件=算法+数据结构)(对象=数据属性+操作),软件工程常见技术,复用敏捷开发,复用(Reuse),在一个新系统中,大部分的内容是成熟的,只有小部分内容是全新的构造新的软件系统可以不必每次从零做起;直接使用已有的软构件,即可组装成新的系统;复用已有的功能模块,既可以提高开发效率,也可以改善新开发过程中带来的质量问题;,Dont re-invent the wheel,基于构件的软件复用(Reuse),产品线体系结构,可复用资产库,产品1,产品2,产品 n,主要过程:,需求分析;,体系结构设计;,构件获取(购买、重新开发);构件修改与测试;构件组装;集成测试;,基于构件的软件复用(Reuse),构件库层次结构,按照分层构件的思想,由三个层次组成:1界面模型层:管理信息系统的界面视图,支持不同的访问模式。2业务模型层:管理信息系统的功能实现层,管理具体的业务逻辑。该层基于框架实现对业务逻辑对象的全生命周期管理,同时实现与第三方系统之间的集成。3数据模型层:管理信息系统的业务数据存储层,利用关系数据库对业务系统的数据进行存储和处理。,平台另一个重要设计理念是模块的可插拔,即构建可插拔的模块化应用系统。可插拔的模块化应用系统采用了组合模式,通常会包含一个 客户端应用程序骨架(Shell),该 Shell 提供了整个用户界面的框架及结构。模块可动态插拔,各模块通过 Shell展示相应的界面视图。结合统一应用层次化模型的指导思想及设计理念,通常情况下,一个应用系统就是由不同的层中的模块组合而成。,应用系统可以划分为不同的层次,例如技术架构层、技术领域层、业务架构层、业务领域层、行业解决方案层及项目实施层;不同层次的应用层次化模型元素(包括服务、组件、表等等)可以按顺序覆盖,即上层的模型元素可以覆盖下层的模型元素;每一层的应用层次化模型元素 可独立修改及更新,不会对其他层造成影响。,基于构件的软件复用(Reuse),系统在不同抽象层次上设计了各种解决方案,具有构件化的软件架构,形成了不同层次构件,如基础层构件、中间层构件、领域级构件、子系统级构件等各种不同粒度的构件。,基础数据交换EIBuffer,信息转换组件EITranslate,履历跟踪组件EDLog,数据分发配置,不同平台间通讯EDXcom,应用权限控制,合同处理,计划编制,发货管理,物料跟踪与实绩管理,订单管理,历史数据,仓库管理,生产管理,作业计划管理,质量管理,工器具与 轧辊管理,基础层构件,中间层构件,领域级构件,子系统级构件,基于构件的软件复用(Reuse),敏捷开发(AgileDevelopment),敏捷开发(AgileDevelopment),以过程为核心(而不是以人为核心)的软件组织为了少犯错误,保证项目成功,而从项目开发经验中总结和定义了许多过程,用于约束开发行为,避免重复相同的错误。由于项目的复杂性和多样性,这种过程定义会越来越多,最终形成一个庞大的、笨重的过程集合,这样的过程集合会降低开发效率和产品质量,增加开发成本。,敏捷开发(AgileDevelopment),上个世纪90年代,2001年,2004年以后,萌芽-产生敏捷方法,敏捷方法是从上个世纪90年代开始发展起来的一组方法学的总称,包括极限编程等等。这些方法学之间有一些差异,但是差异不是特别大,正规成立敏捷联盟,每种方法学的领导人共同起草了敏捷软件开发宣言,总结出方法之间的共同点,最终就是价值,并且用敏捷这个词给这种方法学一个统称,发展开始广为流行,500强公司中众多公司应用敏捷;如HP,Microsoft,IBM等,敏捷开发(AgileDevelopment),敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。,核心理念:适应和以人为本,客户合作胜过合同谈判,响应变化胜过遵循计划,可以工作的软件胜过面面俱到的文档,个体和交互胜过过程和工具,敏捷开发(AgileDevelopment),最高目标是能持续地、及早地向客户交付软件;拥抱变化;频繁地发布可运行的软件;客户和开发人员在一起工作;以人为本;最重要的衡量开发过程的手段,是可工作的软件;稳定的开发速度;敏捷高效的设计;简单有效;重视Teamwork;积极的调整。,敏捷开发(AgileDevelopment),知识和技能,文化和氛围,自组织团队,开放的心态,敏捷开发(AgileDevelopment),结对编程(Pair Programming)所有设计决策都牵涉到至少两个人。至少有两个人熟悉系统的每一部分。几乎不可能出现两个人同时疏忽测试或其它任务。改变各对的组合在可以在团队范围内传播知识。代码总是由至少一人复查。结对的编程比单独编程更有效。,敏捷开发(AgileDevelopment),不强调文档,转向强调可运行的软件片段;开发者与顾客之间的频繁沟通;快速开发,快速反馈,快速修改;连续不断的短周期迭代;,敏捷过程模型(agileprocessmodel),作业,查阅资料,了解一些软件工程的新技术,撰写汇报论文,不少于1K字,