2020/5/13软件工程第1页软件工程2020/5/13软件工程第2页软件危机软件工程第一章软件工程概述软件2020/5/13软件工程第3页1.1软件1、什么叫软件?(1)广义软件:相对于有形物理实体,把技术条件、管理法规以及人员素质等无形因素称为软件。(2)计算机软件:是与计算机硬件相对应的计算机组成部分,包括程序、数据及其相关文档的完整集合。Boehm:“软件是程序以及开发、使用和维护程序所需的所有文档。”程序:按事先设计的功能和性能要求执行的指令序列;数据:使程序能正常操纵信息的数据结构;文档:是与程序开发、维护和使用有关的图文资料。2020/5/13软件工程第4页2、软件的特点:(1)软件是一种逻辑实体;(2)软件开发成本很高,但却可以低成本地复制。(3)软件的使用不存在老化的问题;(软件因需求变化和故障需不断维护,并不断失去价值)(4)软件在使用的过程中的维护工作远比硬件复杂。(5)软件开发是高强度的脑力劳动,自动化程度不高,因而软件成本相当昂贵;(6)相当多的软件开发涉及到社会因素。2020/5/13软件工程第5页3、软件的分类:(1)按功能分类a、系统软件:支持计算机系统各个部件、相关的软件和数据协调、高效地工作的软件。如:OS、DBMS、DRIVER、COMMUNICATION-SYSTEM。b、支撑软件:协助用户开发软件的工具性软件,文本编辑软件。如:PSL/PSA(问题描述语言、问题描述分析器)、图形软件包、预编译程序、静态分析程序。c、应用软件:在特定的领域不特定的目的服务的一类软件。如:数值计算、CAD/CDM、人工智能、CAI、MIS。2020/5/13软件工程第6页(2)按软件规模分类:MICRO、SMALL、MIDDLE、LARGE、VERY-LARGE、UTRA-LARGE。(3)按软件工作方式分类:a、实时处理软件:事件或数据产生时,立即处理并反馈信息(控制软件);b、分时软件:允许多个联机用户同时使用计算机;c、交互式软件:能实现人机通信的软件(用于人机界面设计);d、批处理软件。2020/5/13软件工程第7页(4)按功能软件服务对象分类a、项目软件:受特定客户委托由一个或多个软件开发机构在合同的约束下开发出来的软件。b、产品软件:提供给市场的商品。(5)按使频度分类:(6)按软件失效的影响分类。4、软件的发展:(1)程序设计阶段:约50—60年代。软件产品:程序;语言:汇编语言及机器语言;主要工作:编写程序;组织:个人;质量因素:编程技术(技巧)。(2)程序系统阶段:约60—70年代。软件产品:程序及说明书;语言:高级程序设计语言;主要工作:设计程序及测试;组织:开发小组;开发技术:结构化程序设计方法。2020/5/13软件工程第8页2020/5/13软件工程第9页(3)软件工程阶段:70年代以后。软件产品:程序、数据、文档;语言:软件语言(需求定义语言、软件功能语言、软件设计语言、程序设计语言);主要工作:软件生存周期各个阶段;组织:大中型软件开发机构;需求者:面向市场,面向用户;开发技术和手段:工程化开发方法,开发工具及开发环境起重要作用;质量因素:管理水平。2020/5/13软件工程第10页1.2软件工程一、软件危机1、什么叫软件危机?软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。1968年北大西洋公约组织在联邦德国召开的国际会议上提出来的。2020/5/13软件工程第11页2、软件危机的表现(1)对软件开发的成本和进度的估计常常很不准确;(2)用户对“已完成的”软件系统不满意的现象经常发生;(3)软件质量往往靠不住:软件质量保证技术(审查、复审和测试)没有坚持不懈地应用到软件开发全过程中;(4)软件常常不可维护:错误难改,难适应新的硬件环境,难适应用户要求增加的新的功能需求,软件的复用性不高;2020/5/13软件工程第12页2、软件危机的表现(2)(5)软件通常没有适当的文档资料;文档资料的作用是:管理和评价软件开发过程的进展情况,开发者与用户和开发者之间通信的工具,维护工具。(6)软件成本在计算机系统总成本中所占的比例逐年上升;(1985年美国软件成本占计算机系统总成本的比例为90%)(7)软件开发生产率提高的速度赶不上计算机普及的速度。2020/5/13软件工程第13页3、产生软件危机的原因(1)软件是计算机的逻辑部件而不是物理部件。软件问题是在开发时期引入的而在测试阶段没能测出来的故障,修改软件故障要修改软件原来的设计。(2)软件不同于一般程序,它的特点是规模庞大,软件开发工作量随软件规模增大非线性增长;(3)与早期软件开发个体化特点有关:认为软件开发就是写程序并设法使之运行,轻视需求分析和软件维护。2020/5/13软件工程第14页4、解决软件危机的途径(1)借助各种工程项目开发所积累的经验(原理、概念、技术和方法);(2)总结软件开发成功的技术和方法;(3)应用软件开发辅助工具。2020/5/13软件工程第15页4、解决软件危机的途径(2)关键办法:(1)抓住两个环节:开发技术和方法;良好的组织管理措施。(2)澄清三个错误认识:a、软件就是程序;b、软件开发就是编程;(编程仅占工作量的10%-20%)c、将错误留到编程后的测试和维护时再改。(相同的错误在后期引入软件更改比早期引入软件更改所需的代价高出2-3个数量级。2020/5/13软件工程第16页二、软件工程1、什么叫软件工程?软件工程是指采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来开发高质量的软件。2020/5/13软件工程第17页2、软件工程的基本原理1、用分阶段的生命周期计划严格管理3、实行严格的产品控制2、坚持进行阶段性评审4、采用现代程序设计技术5、结果应能清楚地审查6、开发小组的人员应该少而精7、承认不断改进软件工程实践的必要性2020/5/13软件工程第18页(1)用分阶段的生命周期计划严格管理生命周期:问题定义、可行性研究、需求分析、总体设计、详细设计、编码和单元测试、综合测试、软件维护。在软件的整个生命周期中应该严格执行六类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。(Boehm)2020/5/13软件工程第19页(2)坚持进行阶段性评审软件的质量保证工作不能等到编码结束以后进行:(1)大部分错误是在编码之前造成的,占63%;(2)错误发现与改正得越晚,所需付出的代价也越高.2020/5/13软件工程第20页(3)实行严格的产品控制(1)产品控制:指在软件生产过程中保持软件各个配置(文档或程序代码)的一致性,即不能随意修改软件。(2)基线配置:是经过阶段评审后的软件配置成分。对基线配置的修改都要按照严格的规程进行评审。(4)采用现代程序设计技术采用先进的程序设计技术可以提高软件的生产效率。SA(structureanalyse):结构分析;SD(structuredesign):结构设计。SP(structureprograming):结构编程。2020/5/13软件工程第21页2020/5/13软件工程第22页(5)结果应能清楚地审查软件是看不到的逻辑产品。为了提高软件开发过程的可见性,更好地进行管理,应该根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,从而使所得到的结果能够清楚地审查。2020/5/13软件工程第23页(6)开发小组的人员应该少而精为了提高软件开发过程的可见性,更好地进行管理,应该根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,从而使所得到的结果能够清楚地审查。(7)承认不断改进软件工程实践的必要性2020/5/13软件工程第24页3、软件工程的三要素(1)软件开发技术:解决“如何做”的问题,如项目计划与估算、成本效益分析、风险控制、系统需求分析、软件结构设计、算法设计、程序设计方法、软件测试与维护等。(2)软件开发工具:目前软件开发工具正向软件开发工具箱、集成化软件开发环境发展,以支持软件开发的全过程。(3)软件工程管理:它包括软件生产的成本估算、进度安排、质量评估、管理与控制、人员组织和软件配置管理等,涉及管理学、经济学、社会学和心理学等多个方面。软件工程软件开发技术软件开发工具软件工程管理图1.2软件工程三要素2020/5/13软件工程第25页4、软件工程目标采用软件工程的方法开发软件的最终目标是保证项目的成功,即达到以下几个目标:低开发成本、高可靠性、高性能、易于移植,易于维护、按时完成开发工作。低开发成本高性能按时交付高可靠性易于维护互补关系互斥关系2020/5/13软件工程第26页1.3软件生命周期一、软件生命周期的概念与其他事物一样,软件也有一个孕育、诞生、成长、成熟和衰亡的过程,这个过程被称为软件生命周期。软件定义软件开发软件维护可行性研究需求分析总体设计详细设计编码与单元测试测试维护2020/5/13软件工程第27页1.3软件生命周期(2)二、软件生命周期各阶段的任务1、可行性研究可行性研究的任务是了解用户的要求及现实条件,从技术、经济、社会等几个方面研究论证软件系统的可行性。(1)回答的关键问题是:“对所确定的问题有行得通的解决办法吗?”;(2)参与人员:系统分析员;(3)工作过程:一个大简化了的系统分析和设计过程;(4)完成的任务:提出系统的高级逻辑模型,确定系统的目标和规模,系统的成本/效益分析。2020/5/13软件工程第28页2、需求分析需求分析的主要任务是确定待开发软件的功能要求、性能要求和运行环境约束。(1)回答的关键问题是:“为了解决这个问题,目标系统应该做什么?”;(2)参与人员:系统分析员和用户;(3)完成的任务:确定系统的逻辑模型,通常用ER图、数据流图、状态变迁图、数据字典和简要的算法表示,这个系统模型经过用户确认后才能进入下一阶段。需求分析阶段结束的标志是提交软件需求规格说明书(SRS,SoftwareRequirementsSpecification),验收测试设计2020/5/13软件工程第29页3、总体设计总体设计的基本任务有两个:一是根据需求规格说明,提出几种可供选择的系统解决方案,并确定一个用于实施的最佳方案;二是建立软件系统的总体结构。(1)回答的关键问题是:“概括地说,应该如何解决这个问题?”;(2)参与人员:系统分析员;(3)主要工作:提出几种可供选择的解决方案(是人工完成还是计算机完成,是批处理还是人机交互,信息存储是采用文件系统还是数据库?),方案的级别有:低、中、高等级,每种方案都用系统流程图或其它工具加以描述。推荐一种方案。最后确定一种方案。(4)完成的任务:可能的解法(每种解法的系统流程图和成本效益分析),推荐的系统结构(层次图或结构图)。总体设计结束的标志是提交总体设计说明书、数据库或数据结构说明书和集成测试计划等文件。4、详细设计详细设计又称为过程设计,其主要任务是用图形工具或伪码(如HIPO图、程序流程图、N-S图、PAD图、PDL语言)描述模块的实现过程。(1)回答的关键问题是:“应该如何具体地实现这个系统?”;(2)参与人员:系统分析员和程序员;(3)主要工作:设计程序详细的规格说明,用图形工具或伪码描述模块的实现。但还不是编程,它类似于其它工程上的图纸。(4)完成的任务:编码规格说明书,用HIPO图或PDL等工具描述的详细设计的结果。详细设计阶段结束的标志是提交详细设计说明书,包括模块开发卷宗和模块测试方案。2020/5/13软件工程第30页2020/5/13软件工程第31页5、编码编码的任务是选择适当的程序设计语言(高级程序设计语言或汇编语言),把详细设计的结果翻译成选定语言编写的程序,并对编写出的每一个模块程序进行测试(被称作单元测试)。(1)关键问题是:写出正确的容易理解、容易维护的程序模块;(2)参与人员:程序员;(3)主要工作:选取一个适当的程序设计语言(高级程序设计语言或汇编语言),把详细设计的