2020/2/101Chapter1软件工程学概述1.1软件危机1.2软件工程1.3软件生命周期1.4软件开发模型2020/2/1021.1软件危机(SoftwareCrisis)2020/2/103•程序(一组计算机指令)•数据(操作对象)•文档(设计报告、规格说明、使用维护手册)软件=程序+数据+文档1、软件是什么软件:计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。2020/2/104FrederickP.Brooks,Jr.一本在软件领域绝无仅有,20余年畅销不衰的必读经典2020/2/105拉布雷阿的焦油坑(MuralofLaBreaTarPits)过去几十年的大型系统开发就犹如这样一个焦油坑,很多大型和强壮的动物在其中剧烈地挣扎。2020/2/106“焦油坑”式的软件开发模式他们中大多数开发出了可运行的系统——不过,其中只有非常少数的项目满足了目标、时间进度和预算的要求。各种团队:大型的和小型的、庞杂的和精干的,一个接一个淹没在了焦油坑中。表面上看起来好像没有任何一个单独的问题会导致困难,每个都能被解决,但是当它们相互纠缠和累积在一起的时候,团队的行动就会变得越来越慢。对问题的麻烦程度,每个人似乎都会感到惊讶,并且很难看清问题的本质。不过,如果我们想解决问题,就必须试图先去理解它。2020/2/107在未来的十年内,无论是在技术还是管理方法上,都看不出有任何突破性的进步,能够独自保证在十年内大幅度地提高软件的生产率、可靠性和简洁性。Thereisnosingledevelopment,ineithertechnologyormanagementtechnique,whichbyitselfpromisesevenoneorder-of-magnitudeimprovementwithinadecadeinproductivity,inreliability,insimplicity.NoSilverBullet?软件项目vs.人狼2020/2/108“NoSilverBullet”Refired《ThereIsaSilverBullet》“重用和交互的构件开发是解决软件根本困难的一种方法。”—BroadCox“复杂性是我们行业的属性,而且复杂性是我们的主要限制。软件开发式意见棘手的事情,前方并不会有魔术般的解决方案。现在是从业者研究和分析革命性进展的时候,而不是等待或希望他的出现“—FrederickBrooks2020/2/109IBM360机的操作系统•开发时间:1963-1966年•投入人力:5000人年•代码量:100万行•结果:每次发行的新版本都是从上一个版本找出1000个错误而修正的结果2、软件危机的典型事例“……正像一只逃亡的野兽落到泥潭中作垂死挣扎,越是挣扎,陷得越深,最后无法逃脱灭顶的灾难,……程序设计工作正像这样一个泥潭……一批批程序员被迫在泥潭中拼命挣扎,……,谁也没有料到问题竟会陷入这样的困境……。”1963年美国飞往火星的火箭爆炸,造成1000万美元的损失。原因是FORTRAN程序:DO5I=1,3误写为:DO5I=1.32020/2/1010软件危机:在计算机软件的开发和维护过程中所遇到的一系列严重问题。1968年,北大西洋公约组织的计算机科学家在联邦德国召开的国际学术会议上第一次提出了“软件危机”(softwarecrisis)这个名词。软件危机包含两方面问题:•如何开发软件,以满足不断增长,日趋复杂的需求;•如何维护数量不断膨胀的软件产品。3、什么是软件危机2020/2/10114、软件危机的主要表现对软件开发成本和进度的估计常常不准确。开发成本超出预算,实际进度比预定计划一再拖延的现象并不罕见。用户对“已完成”系统不满意的现象经常发生。软件产品的质量往往靠不住。Bug一大堆,Patch一个接一个。软件的可维护程度非常之低。软件通常没有适当的文档资料。软件的成本不断提高。软件开发生产率的提高赶不上硬件的发展和人们需求的增长。2020/2/10125、软件危机仍在继续——影响软件质量的糊涂认识(1/2)在项目的初始阶段对系统若明若暗就开始写程序;认为软件是灵活的容易修改,对软件需求的改变不以为然;程序调试成功标志着工作的结束;程序运行前无法评价程序的质量;一个软件项目给客户提交的主要是程序,而软件文档则认为可有可无、可多可少等等;2020/2/1013虽然发布了软件标准和规范,但在实践中执行需要额外的开销,划不来;虽然开发了许多软件工具,但很多开发者对使用这些工具兴趣不大;为了开发软件人们不惜用重金购买最新型号的主机和工作站而不愿意购买软件工具;在软件开发过程中,进度迟后就增派更多的程序员突击,赶进度;………软件危机仍在继续——影响软件质量的糊涂认识(2/2)2020/2/1014引入同一变化付出的代价随时间变化的趋势2020/2/10156、产生软件危机的原因及解决途径原因:•软件生产本身存在着复杂性;•与软件开发所使用的方法和技术有关。解决途径——•管理措施•技术措施软件工程2020/2/10161.2软件工程(SoftwareEngineering)2020/2/10171、软件工程定义(1/3)Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。IEEE:将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。Bauer:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。2020/2/1018软件工程定义(2/3)软件工程是一类求解软件的工程,它•应用计算机科学、数学(用于构造模型和算法)和管理科学(用于计划、资源、质量和成本等的管理)等原理,•借鉴传统工程(用于制定规范、设计范型、评估成本、权衡结果)的原则和方法,•创建软件以达到提高质量、降低成本的目的。2020/2/1019软件工程定义(3/3)软件工程是一门交叉学科软件开发技术•软件开发方法学•软件开发过程•软件工具和软件工程环境软件工程管理•软件管理学•软件经济学•软件心理学2020/2/1020软件工程的历史(略)起源于20世纪50年代是一门年轻的学科2020/2/1021软件工程的历史(略)1、60年代末~80年代初•状况:软件系统的规模、复杂性以及在关键领域的广泛应用促进了软件开发过程采纳工程化的方法进行管理。•研究:开发模型、支持工具、开发方法。•成果:瀑布模型、结构化语言(Pascal等)、结构化方法、各种管理方法(如费用估算、文档复审)。•事件:前期主要研究系统实现技术;后期则开始强调管理和软件质量。•焦点:软件项目2020/2/10222、80年代初~现在•状况:“软件工厂”的概念已经提出。•研究:软件生产技术,特别是软件复用技术和软件生产管理的研究和实践。•成果:提出了具有广泛应用前景的面向对象方法和相关的编程语言。•事件:软件过程改进(SPI)。在工业实践中建立起一种量化的评估程序,判定软件组织成熟的程度。•焦点:软件过程软件工程的历史(略)2020/2/1023近几年:•研究从过程管理转向产品开发,更加注重新的程序开发范型和软件生产。•范围:面向agent语言、复用技术、需求分析规格说明的形式化研究、高智能高自动化的CASE成为热点。软件工程的历史(略)2020/2/1024软件工程之2009软件工程方法•IBMRational工具与方法论、CMMI认证•敏捷软件开发方法(以Scrum为代表):TechExcel•测试、调试已经被部分地从软件开发中分离出来软件工程工具•传统的Project、CVS、SVN•最新复杂工具:Git、Teamcity、VSTS2010软件开发•云计算、APPEngine架构•Android平台、Objective-C•Twitter•NoSQL•C++0x、GO、Erlang•……2020/2/1025软件工程专业文献20世纪60年代晚期,刊物上开始出现软件工程的专业文章出现专业杂志•ACMTransactionsonSoftwareEngineeringandMethodologies•SoftwareEngineeringNotes•IEEE’sTransactionsonSoftwareEngineering•Software2020/2/1026我国软件业的现状(略)我国软件业的规模•具有自主软件研发能力的软件企业约5700家。•从事软件销售、维护和服务的企业5000多家。•营业规模超过一亿元的软件企业达到100家以上市场销售额占世界市场不到2%国内的软件市场国外软件厂商占主导2020/2/1027与印度的比较(略)2001年我国软件销售总额96.3亿美元,软件企业约5000家,从业人员29万。2001年印度软件销售总额102.3亿美元,软件企业约6000家,从业人员40万。2001年我国软件的出口额仅为7.2亿美元,2000年与1999年分别为4亿美元及2.5亿美元。印度在软件出口方面,则一直保持高速的增长。1990年印度软件出口只有5000万美元1999年就达到了39亿美元2000年达到了62亿美元2007-2008年达到520亿美元从2006年到2009年,年增长率77%,占其出口额的46%2020/2/1028我国软件业发展不理想的原因(略)政策盗版我国绝大多数软件企业对其软件开发工作过程缺乏有效的管理和控制。2020/2/1029它山之石(略)印度软件业能够这么迅速地发展起来,最重要的原因是从标准化与产品流程入手,重视管理。印度的软件开发管理的特点是流程重于项目。项目经理一般都是从编码人员升上来的,至少有四年以上的经验公司所有的东西(包括草稿)都有文档注重标准化,注重开发的流程管理,以与国际接口。目前印度软件公司中有170家公司获得ISO9000质量标准认证,是世界上获得质量认证软件企业最多的国家。在得到卡内基-梅隆大学软件工程学会最高级别的全球23家计算机软件公司中,有15家是印度公司。2020/2/10302、软件工程的本质特征1、软件工程关注大型程序的构造2、软件工程的中心课题:控制复杂性3、软件经常变化4、开发软件的效率非常重要5、和谐地合作是开发软件的关键6、软件必须有效地支持它的用户7、在软件工程领域中是由一种文化背景的人替具有另一种文化背景的人创造产品2020/2/10313、软件工程的基本原理1、用分阶段的生命周期计划严格管理2、坚持进行阶段评审3、实行严格的产品控制4、采用现代程序设计技术5、结果能清楚地审查6、开发小组的成员应该少而精7、承认不断改进软件工程实践的必要性2020/2/10324、软件工程的方法学传统方法学:SA—SD—SP•生命周期方法学或结构化范型;•采用结构化技术(结构化分析、结构化设计和结构化实现)来完成软件开发的各项任务;•使用适当的软件工具或软件工程环境来支持结构化技术的运用;•把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成每个阶段的任务。•采用这种方法学开发软件的时候,从对问题的抽象逻辑分析开始,一个阶段一个阶段地进行开发。2020/2/10334、软件工程的方法学传统方法学(续)•前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础,而后一阶段任务的完成通常是使前一阶段提出的解法更进一步具体化,加进了更多的实现细节。•每一个阶段的开始和结束都有严格标准,对于任何两个相邻的阶段而言,前一阶段的结束标准就是后一阶段的开始标准。•在每一个阶段结束之前都必须进行正式严格的技术审查和管理复审,从技术和管理两方面对这个阶段的开发成果进行检查,通过之后这个阶段才算结束;如果没通过检查,则必须进行必要的返工,而且返工后还要再经过审查。2020/2/10344、软件