西南交通大学软件工程《第一章》第1页1.1软件产品的概念与特征1.2软件危机1.3软件工程的产生及其发展第1章软件工程引论西南交通大学软件工程《第一章》第2页任何计算机系统都包含硬件和软件两大部分。程序是为实现设计的功能和性能要求而编写的指令序列;数据是使指令能够正常操纵信息的数据结构;文档是与程序开发、维护和使用有关的图文资料。软件产品的概念软件是包括程序、数据及相关文档的完整集合。注意:程序并不是软件,程序只是软件的组成部分。西南交通大学软件工程《第一章》第3页软件的分类没有一个严格统一的标准,可从以下角度对软件进行分类:用途规模服务对象使用频度失效影响软件产品的分类西南交通大学软件工程《第一章》第4页(1)系统软件按用途分类(2)实时软件一般而言,系统软件是为其他软件服务的软件。系统软件与计算机硬件交互频繁,处理大量复杂数据,往往需要多项功能。管理、分析、控制现实世界中所发生的事件的软件;一般具有数据采集、分析、输出控制三方面的功能;需要保持一个现实任务可以接受的响应时间。西南交通大学软件工程《第一章》第5页(3)商业管理软件按用途分类(4)工程与科学计算软件商业信息处理是最大的软件应用领域,包括常规的数据处理软件和一些交互式的计算处理软件。基本功能是重构已有的数据,变换成可以辅助商业操作和管理决策的形式。实现特定的“数值分析”算法。例如离散傅立叶变换、有限元分析、演化计算等等。西南交通大学软件工程《第一章》第6页(5)嵌入式软件按用途分类(6)人工智能软件(7)个人计算机软件驻留在专用智能产品的内存中,用于控制这些产品正常工作,完成很有限、很专业的功能的软件。利用非数值算法解决复杂问题的软件。文字处理系统、电子表格、游戏娱乐软件等等。西南交通大学软件工程《第一章》第7页软件规模类别参加人员数开发期限产品规模(源代码行数)微型11~4周0.5k小型11~6月1~2k中型2~51~2年5~50k大型5~202~3年50~100k甚大型100~10004~5年1M极大型2000~50005~10年1~10M按规模分类西南交通大学软件工程《第一章》第8页(1)项目软件按服务对象分类(2)产品软件即定制软件,是受某个特定客户的委托,由一个或多个软件开发机构在合同的约束下开发出来的软件。由软件开发机构开发出来直接提供给市场,或是为多个用户服务的软件。西南交通大学软件工程《第一章》第9页按使用频度分类(1)有些软件开发出来仅供一次使用(2)按既定的统计周期运行(3)频繁使用由于这些软件若干年可能才使用一次,导致前面开发的软件在若干年后很难适用。有些统计或试验数据须按年度或者月度等进行统计分析,相应的软件按其统计周期运行。有些软件需要每天运行,对信息进行及时处理。西南交通大学软件工程《第一章》第10页工作在不同领域的软件,适应其不同的需要,在运行中对可靠性的要求也不同。按失效影响分类(1)一般可靠性软件(2)高可靠性软件西南交通大学软件工程《第一章》第11页(1)软件是一种逻辑实体,具有抽象性。软件产品的特征软件是逻辑的不是物理的,具有与硬件完全不同的特征。(2)软件的生产与硬件不同。硬件在批量制造过程中仍然可能引入质量问题,但软件几乎不存在此种情况;软件的批量制造过程只是简单的拷贝复制;软件的成本集中在开发过程中,而硬件生成的成本更多地表现在原材料消耗上。西南交通大学软件工程《第一章》第12页(3)软件产品不会“磨损”。软件产品的特征硬件产品的故障多来自外在条件导致的“磨损”或“老化”,软件产品如果发生故障,无一例外的是在设计开发过程中留有隐患。硬件的故障可以通过简单的更换部件解决,软件的故障必须通过全面的软件维护活动才有望克服。软件故障的修复要比硬件故障的修复复杂得多。衡量软件产品质量的一个重要指标就是其“可维护性”。西南交通大学软件工程《第一章》第13页图1.1硬件/软件产品失效率曲线软件产品的特征西南交通大学软件工程《第一章》第14页自从20世纪40年代第一台计算机问世以来,就有了“程序”的概念,可以认为它是软件的前身。软件的发展软件发展经历了三个发展阶段:20世纪50~60年代:程序设计阶段;20世纪60~70年代:程序系统阶段;20世纪70年代之后:软件工程阶段。西南交通大学软件工程《第一章》第15页表1.2计算机软件发展的三个阶段及其特点阶段特点程序设计程序系统软件工程软件所指程序程序及说明书程序、文档、数据主要程序设计语言汇编及机器语言高级语言软件语言*软件工作范围程序编写设计和测试整个软件生命周期需求者程序设计者本人少数用户市场用户开发软件的组织个人开发小组开发小组及大、中型开发机构软件规模小型中、小型大、中、小型软件的发展西南交通大学软件工程《第一章》第16页阶段特点程序设计程序系统软件工程决定质量的因素个人技术小组技术水平技术与管理水平开发技术和手段子程序、程序库结构化程序设计数据库、开发工具、集成开发环境、工程化开发方法、标准和规范、网络及分布式开发、面向对象技术、计算机辅助软件工程维护责任者程序设计者开发小组专职维护人员硬件的特征高价、存储量小、可靠性差降价,速度、容量和可靠性明显提高向超高速、大容量、网络化、微型化方向发展软件的特征完全不受重视软件的技术发展不能满足需求,出现软件危机开发技术有进步,但仍未完全摆脱软件危机软件的发展西南交通大学软件工程《第一章》第17页1968年,北大西洋公约组织的计算机科学家们在联邦德国召开的国际会议上讨论了软件危机问题。在这个会议上提出了“软件工程”这个名词,导致了一门新的工程学科的正式诞生。软件危机简单地说,所谓软件危机,就是指在软件开发和软件维护过程中所存在的一系列严重问题。软件工程概念的提出,正是为了克服软件危机。西南交通大学软件工程《第一章》第18页软件项目失败的实例阿丽亚娜(ARIANE5)火箭–1996年6月,欧洲航天局耗资70亿美元,发射37秒后爆炸–2名法国士兵当场死亡–发射失败的原因在于:64位浮点数转换成16位整数时产生溢出NASA的火星气象卫星–1999年10月,耗资1.25亿美元的NASA的火星气象卫星失踪–由于简单的数据转换错误所导致的。卫星软件中,有些数据使用英制,它们应被转换成公制。……西南交通大学软件工程《第一章》第19页一些数据:大约70%的软件开发项目超出了估算的时间,大型项目平均超出计划交付时间20%到50%,90%以上的软件项目开发费用超出预算,并且项目越大,超出项目计划的程度越高。美国政府审计局:只有不到2%的合同定购软件在发布时具有可用性——98%以上的项目都失败了。软件项目失败的实例西南交通大学软件工程《第一章》第20页(1)软件开发没有真正的计划性,对软件开发进度和软件开发成本的估计常常很不准确。软件危机的表现(2)对于软件需求信息的获取常常不充分,软件产品往往不能真正地满足用户的实际需求。(3)缺乏良好的软件质量评测手段,从而导致软件产品的质量常常得不到保证。(4)对于软件的可理解性、可维护性认识不够;软件的可复用性、可维护性不如人意。(5)软件开发过程没有实现“规范化”,缺乏必要的文档资料或者文档资料不合格,不准确。西南交通大学软件工程《第一章》第21页(6)软件开发的人力成本持续上升,如美国在1995年的软件开发成本已经占到了计算机系统成本的90%。图1.2计算机系统硬件、软件成本比例变化年份软件硬件成本/%100806040201950197019851995软件危机的表现西南交通大学软件工程《第一章》第22页(7)缺乏自动化的软件开发技术,软件开发的生产率依然低下,远远满足不了急剧增长的软件需求。图1.3软件技术的发展落后于需求时间差距软件需求软件技术软件危机的表现西南交通大学软件工程《第一章》第23页产生软件危机的原因—客观原因(1)软件的生产过程和产品都具有明显的“不可视”特征。(2)软件维护相对困难结果:软件开发过程的进展情况较难衡量,软件产品的质量也较难进行先期评价。解决:在软件工程早期制定详细的开发计划并全程跟踪调控,对所有阶段产品和阶段工作进展进行技术审查和管理复审,可在一定程度上克服“不可视”造成的消极影响。原因:由于软件产品的不可视特征,维护过程不像硬件产品维护时只要简单的更换损坏部件那样容易。解决:利用足够的文档资料使不可视的产品可视化,有助于提升软件产品的可理解性和可维护性。西南交通大学软件工程《第一章》第24页产生软件危机的原因—主观原因在计算机系统发展的早期,软件开发主要基于软件开发人员的“个人能力”。软件开发的“个体化”特点,主要表现为忽视软件需求分析的重要性、忽视软件的可理解性、文档不完备、轻视软件的可维护性、过分强调编码技巧等等方面。在对用户的需求没有清楚的认识时就仓促进行程序编写,最终必然会导致开发工作的失败。西南交通大学软件工程《第一章》第25页推广和使用实践中总结出来的开发软件的成功技术和方法,探索更好更有效的技术方法,积累软件开发过程中的经验数据财富,逐步消除一些错误概念和做法。•建立适合于本组织的软件工程规范;•制定软件开发中各个工作环节的流程文件、工作指南和阶段工作产品模板;•实施针对软件开发全过程的计划跟踪和品质管理活动;•为每一项工程开发活动建立配置管理库;•实施严格的产品基线管理并建立组织的软件过程数据库和软件财富库;•为各类员工及时提供必要的培训。解决软件危机的途径—管理层面西南交通大学软件工程《第一章》第26页应当开发和使用更好的软件开发工具,提高软件开发效率和开发工作过程的规范化程度。常用的软件开发辅助工具:•统一建模语言(UML)•各种配置管理工具•缺陷管理工具•自动测试工具•计算机辅助软件工程(CASE)解决软件危机的途径—技术角度西南交通大学软件工程《第一章》第27页一般来说,软件产品从策划、定义、开发、使用与维护直到最后废弃所经历的整个时期称为软件的生命周期。软件生命周期软件生命周期分为三个阶段:(1)软件定义阶段•主要进行软件目标的策划、可行性研究和软件的需求分析工作,在所要开发的软件必须“作什么”方面和用户达成一致。•本阶段是提高软件质量、降低软件成本、保证开发进度的关键环节。西南交通大学软件工程《第一章》第28页(2)软件开发阶段•主要对软件的体系架构、数据结构和主要算法进行设计和编码实现。•对于编码结果,还要按照规范进行测试后,才能最终交付使用。•统计数据表明,在典型的软件工程过程中,编码工作量大约只占软件开发全部工作量的15%~20%。软件生命周期西南交通大学软件工程《第一章》第29页(3)软件运行与维护阶段在软件生命周期中占据的比例最大。针对不同需求,维护工作一般可以分为纠错性维护、适应性维护、扩充性维护和预防性维护等不同类型。•在软件运行过程中,分析和设计阶段的一些遗留缺陷可能会逐步暴露;•运行环境的演变也会对运行中的软件提出变更要求;•用户新需求的提出则常常要求扩充现有软件的功能或者改进其性能。本阶段产生的原因:软件生命周期西南交通大学软件工程《第一章》第30页图1.4软件生存周期阶段的划分软件生命周期西南交通大学软件工程《第一章》第31页作为软件,应当有一个完整的配置。软件产品除包括程序之外,应当包括完整、准确、翔实的文档资料。值得注意的严重问题是,在软件开发的不同阶段进行修改所付出的代价是极其不同的。主要的文档应包括“需求规格说明书”、“体系结构设计说明书”、“详细设计说明书”、“安装手册”、“操作手册”、“系统管理员手册”等。软件开发后期引入一个变动比在早期引入相同变动所需付出的代价高2~3个数量级。软件生命周期西南交通大学软件工程《第一章》第32页图1.5变更代价随时间变化的趋势示意低中高代价早期中期晚期变更出现的时间2020010002000需求分析结构设计详细设计编码集成测试系统测试现场0.050.52.55改正一个问题的估算费用/美元改正一个问题的估算工作量/人日图1.6改正一个问题需要付出的代价软件生命周期