软件工程导论江苏科技大学软件工程系王卫东●为什么需要软件工程?●什么是软件工程?软件工程导论(第5版)普通高校本科计算机专业特色教材精选张海藩编著第一章软件工程学概论1.1软件危机1.软件Software=Program+Data+Document软件(software)是计算机系统中与硬件(hardware)相互依存的另一部分,它包括程序(program)、相关数据(data)及其说明文档(document)。软件特指大型复杂的程序软件的发展早期•面向批处理•有限的分布•自定义软件第二阶段•多用户•实时•数据库•软件产品第三阶段•分布式系统•嵌入“智能”•低成本硬件•消费者的影响第四阶段•强大的桌面系统•面向对象技术•专家系统•人工神经网络•并行计算•网路计算机195019601970198019902000软件特征软件是一种逻辑实体,而不是具体的物理实体软件的生产与硬件不同在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题磨合调整磨损用坏硬件失效率曲线时间失效率修改点实际曲线理想曲线时间失效率软件失效率曲线软件的成本相当昂贵软件技术的发展落后于需求时间软件复杂性软件需求差距软件技术硬、软件成本比例的变化年份成本%软件1950197019851995硬件软件特征•软件是一种逻辑实体,具有抽象性•软件没有明显的制造过程•软件在使用过程中,没有磨损、老化的问题•软件对硬件和环境有着不同程度的依赖性•软件的开发至今尚未完全摆脱手工作坊式的开发方式,生产效率低•软件是复杂的,而且以后会更加复杂•软件的成本相当昂贵•大多数软件是自定的,而不是通过已有的构件组装而来的•软件工作牵涉到很多社会因素2、软件危机过去几十年的大型软件系统的开发就犹如这样一个焦油坑,很多大型和强壮的动物在其中剧烈地挣扎。拉布雷阿的焦油坑(MuralofLaBreaTarPits)软件危机包含两方面问题:–-如何开发软件,以满足不断增长,日趋复杂的需求;–-如何维护数量不断膨胀的软件产品。鉴于软件危机的长期性和症状不明显的特点,近年来有人建议将软件危机更名为:Softwaredepression(软件萧条)Softwareaffliction(软件困扰)“慢性的苦恼”软件危机主要有以下表现:•对软件开发成本和进度的估计常常不准确。开发成本超出预算,实际进度比预定计划一再拖延的现象并不罕见。•用户对“已完成”系统不满意的现象经常发生。•软件产品的质量往往靠不住。Bug一大堆,•Patch一个接一个。•软件的可维护程度非常之低。•软件通常没有适当的文档资料。•软件的成本不断提高。•软件开发生产率的提高赶不上硬件的发展和人们需求的增长。软件危机的原因●一方面是与软件本身的特点有关●另一方面是由软件开发和维护的方法不正确有关软件开发工作量分配比例测试程序其它40%~50%10%~20%引入同一变化付出的代价随时间变化的趋势费用分配比例其它软件维护55%~70%例:•Windows95有1000万行代码•Windows2000有5000万行代码,3000多个工程师,几百个小团队。Exchange2000和Windows2000开发人员结构Exchange2000Windows2000项目经理25人约250人开发人员140人约1700人测试人员350人约3200人3、消除软件危机的途径•对计算机软件有一个正确的认识(软件≠程序)•必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目。•推广使用在实践中总结出来的开发软件的成功技术和方法。•开发和使用更好的软件工具。1.2软件工程1.工程工程是对技术(或社会)实体的分析、设计、建造、验证和管理。水利工程建筑工程机械工程……软件工程传统工程新兴工程气象工程生物工程软件工程----SoftwareEngineering于1968年NATO组织在德国召开的一次会议上提出是把软件当作一种工业产品,要求“采用工程化的原理与方法对软件进行计划、开发和维护”。围棋与软件工程的感想围棋围棋棋谱拿过来的时候,大师问“后面应该走哪里?”十个初级爱好者选择的落点散布在棋盘各处……十个职业棋手说的落子点都差不多,甚至包括后面的几步……这就是高手和低手的差别……软件工程当一个小程序拿过来的时候,项目经理让大家编写……十个中国软件工程师写出来的程序各有“特色”、千差万别,十个印度软件工程师写出来的程序差不多,以至于怀疑是“抄袭”。项目经理也不清楚中国软件业和印度软件业的差距是多少年只是觉得差了好远好远……2、软件工程定义(1)•Theestablishmentanduseofsoundengineeringprinciples(methods)inordertoobtaineconomicallysoftwarethatisreliableandworksonrealmachines.(1968-FritzBauer)软件工程就是为了经济地获得可靠的且能在实际机器上高效运行的软件,而建立和使用完善的工程原理。软件工程定义(2)•Softwareengineering.(1)Theapplicationofasystematic,disciplined,quantifiableapproachtothedevelopment,operation,andmaintenanceofsoftware;thatis,theapplicationofengineeringtosoftware.(2)Thestudyofapproachesasin(1).(IEEEStd610-1990.)软件工程是:(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;(2)研究(1)中提到的途径。Softwareengineering(3)•SEIsoftwareengineeringdefinitionfrom1990SEIReportonUndergraduateSoftwareEngineeringEducation(CMU/SEI-90-TR-003):Engineeringisthesystematicapplicationofscientificknowledgeincreatingandbuildingcost-effectivesolutionstopracticalproblemsintheserviceofmankind.Softwareengineeringisthatformofengineeringthatappliestheprinciplesofcomputerscienceandmathematicstoachievingcost-effectivesolutionstosoftwareproblems.总之:软件工程是应用计算机科学、数学及管理科学等原理开发软件的工程。它借鉴传统工程的原则、方法,以提高质量,降低成本为目的。软件工程是一门交叉学科软件工程的主要研究内容软件开发技术:软件开发方法学软件开发过程软件工具和软件工程环境软件工程管理:软件管理学软件经济学软件心理学软件工程:一种层次化技术质量焦点过程方法工具软件工程层次图软件工程三个要素:方法、工具、过程Softwareengineeringlayers•软件工程是一种层次化的技术,以有组织的质量保证为基础。•全面的质量管理和类似的理念刺激了不断的过程改进,正是这种改进导致了更加成熟的软件工程方法的不断出现。支持软件工程的根基就在于对质量的关注。•软件工程的基层是过程层。•软件工程过程是将技术层结合在一起的凝聚力,使得计算机软件能够被合理地和及时地开发出来。•过程定义了一组关键过程区域框架,构成了软件项目的管理控制的基础,并且确立了上下各区域之间的关系。•规定了技术方法的采用、工程产品(模型、文档、数据、报告、表格等)的产生、成本的建立、质量的保证及变化的适当管理。•软件工程的方法层提供建造软件在技术上需要“如何做?”。方法涵盖了一系列的任务:需求分析、设计、编程、测试和维护。软件工程方法依赖于一组基本原则,这些原则控制了每一技术区域,且包含建模活动和其他描述技术。•软件工程的工具层对过程和方法提供了自动的或半自动的支持。当这些工具被集成起来使得一个工具产生的信息可被另外一个工具使用时,一个支持软件开发的系统就建立了,称为计算机辅助软件工程(CASE)。CASE集成了软件、硬件和一个软件工程数据库(一个仓库,其中包含了分析、设计、编程和测试的重要信息)。软件工程框架可用性性性确正合算选取适宜的开发模型采用合适的设计方法提供高质量的工程支持重视软件工程的管理基本过程原则目标过程支持过程组织过程软件工程与一般工程的差异•软件是逻辑产品而不是实物产品•软件的功能依赖于硬件和软件的运行环境以及人们对它的操作•软件设计的复杂性•软件特征:功能的多样性实现的多样性能见度低软件结构合理性差•智力密集及知识产权保护软件工程知识体系指南(2004版)GuidetotheSoftwareEngineeringBodyofKnowledge2004VersionIEEE计算机学会(IEEEComputerSociety)SWEBOK的10个知识域(KnowledgeAreas,KA),•软件需求SoftwareRequirements•软件设计SoftwareDesign•软件构造SoftwareConstruction•软件测试SoftwareTesting•软件维护SoftwareMaintenance•软件配置管理SoftwareConfigurationManagement•软件工程管理SoftwareEngineeringManagement•软件工程过程SoftwareEngineeringProcess•软件工程工具和方法SoftwareEngineeringToolsandMethods•软件质量SoftwareQuality2004软件工程知识体系指南软件工程相关学科•计算机工程ComputerEngineering•计算机科学ComputerScience•管理Management•数学Mathematics•项目管理ProjectManagement•质量管理QualityManagement•软件人类工程学SoftwareErgonomics•系统工程SystemsEngineering软件工程—本质特征•软件工程关注于大型程序的构造•软件工程的中心课题是控制复杂性•软件经常变化•开发软件的效率非常重要•和谐地合作是开发软件的关键•软件必须有效地支持它的用户•在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人创造产品软件工程的基本原理•用分阶段的生命周期计划严格管理•坚持进行阶段评审•实行严格的产品控制•采用现代程序设计技术•结果应能清楚地审查•开发小组的人员应该少而精•承认不断改进软件工程实践的必要性软件工程技术的两个明显特点:•强调规范化•强调文档化软件产品的标准化软件开发过程的标准化“软件工程”课程与其它软件专业课的区别(1)立足于系统的整体。(2)讲授系统分析、系统设计、测试及维护的理论和方法。(3)构筑一个软件系统,实践软件开发全过程。“软件工程”课程教学与实践的目标•转变对软件开发的认识:上升程序系统•转变思维定式:上升程序员系统工程师(系统分析员)•工程化训练系统分析员的地位用户分析员程序员职业素质ProfessionalPractice•Communicationskills•Honesty/Integrity•Teamworkskills•Interpersonalskills•Motivation/Initiative•Strongworkethic3、软件工程方法学•把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学。(MethodologyorParadigm)软件工程方法学包含3个要素:方法、工具和过程