软件工程概述清华大学软件学院2引言•软件在当今社会中发挥着重要的作用–社会经济的发展依赖于软件–更多的系统需要软件控制,软件质量和成本成为关键因素•软件工程关注于开发成本和软件质量问题–软件工程的概念开始于1968年的NATO会议–至今尚未解决大型复杂软件开发的问题•软件工程是一个正在兴起的年轻学科–工业界形成了CMM和ISO9000系列标准–IEEE提出了软件工程知识体系–IEEE提出了软件工程本科教程,成为独立学科3一些基本问题•什么是软件?•如何理解软件的质量特性?•什么是软件工程?•什么是软件过程?•什么是软件过程模型?•什么是软件工程方法?•什么是CASE?•当前软件工程面临什么挑战?•软件工程学科与哪些学科相关?4内容提纲•软件–软件的定义与软件危机–软件的本质特性•软件工程–定义与发展历史–理解软件质量–过程、方法和工具•软件工程学科–软件工程知识体系(SWEBOK)–软件工程职业道德规范Youarehere!你在这儿!5什么是软件•软件=程序•软件的定义软件是计算机程序、规程以及运行计算机系统可能需要的相关文档和数据。•从软件的内容来说,软件更像是一种嵌入式的数字化知识,其形成是一个通过交互对话和抽象理解而不断演化的过程。?6软件的分类•通用软件(GenericSoftware)–通用软件是由软件开发组织开发,面向市场用户公开销售的独立运行系统,有时也被称为套装软件。–举例:操作系统、数据库系统、字处理软件等•定制软件(CustomizedSoftware)–定制软件是由某个特定客户委托,软件开发组织在合同的约束下开发的软件。–举例:企业ERP系统、卫星控制系统、空中交通指挥系统等7软件的应用•举例实时系统:空中交通控制系统嵌入式系统:数码相机,GPS数据处理系统:电话帐单,退休金信息系统:网站,数字图书传感系统:气象数据系统软件:操作系统,编译器通信软件:路由器,移动电话办公系统:文字处理,视频会议科学计算软件:仿真模拟,天气预报图形软件:电影制作,CAD设计8软件危机•软件危机出现于20世纪60年代末•软件危机是指在计算机软件的开发和维护过程中遇到的一系列严重问题。–软件开发的成本和进度难以准确估计,延迟交付甚至取消项目的现象屡见不鲜–软件存在着错误多、性能低、不可靠、不安全等质量问题–软件维护极其困难,而且很难适应不断变化的用户需求和使用环境Softwaresystemsarelikecathedrals;firstwebuildthemandthenwepray.9软件错误的实例•ARIANE5火箭–1996年6月,耗资70亿美元,发射37秒后爆炸–发射失败的原因在于软件的错误•软件错误–程序中试图将64位浮点数转换成16位整数时产生溢出–缺少错误处理程序对数据溢出进行管理–备份软件复制而成•严格地遵守软件确认过程可以避免这种错误10软件错误的实例•爱国者导弹–曾在海湾战争期间对抗伊拉克飞毛腿导弹–1991年2月,一次对抗失利中28名美国士兵丧生–问题的症结在于导弹软件包含一个累加计时误差•软件错误–target=f(velocity,time)–计时采用系统时钟(即1/10秒)并使用整数表达–(1/10)2=0.0001100110011001100110011001100…,24位寄存器存储导致误差(0.000000095)10–0.000000095×100hours×60×60×10=0.34seconds11软件错误的实例•Therac25放射医疗仪事故–1986年由于软件错误导致放射过量,2人死亡–溢出错误是导致问题的主要原因之一•千年虫问题–迫于计算机存储空间的限制,程序员将日期缩减为2位数–世界各地更换或升级2000年问题软件的花费超过数亿美元•其他–电子邮件的病毒–拒绝访问等的网络攻击–网络事务的安全问题12软件的本质特性•Nosilverbullet:essenceandaccidentsofsoftwareengineering–FredBrooks,IBMOS360项目经理–1999年图灵奖获得者“没有任何技术或管理上的进展,能够独立地许诺十年内使生产率、可靠性或简洁性获得数量上的进步。”•软件的本质特性–复杂性(Complexity)–一致性(Conformity)–可变性(Changeability)–不可见性(Invisibility)13软件的本质特性•复杂性–软件在规模上可能比任何由人类创造的其他实体都要复杂,复杂性是软件的本质特性。–软件的复杂性是必要属性•大量的组合状态•丰富的结构和相互依赖性•良好的接口用以封装内部的复杂性–开发问题也会增加复杂性•高效率的代码通常是复杂的•重用通用化的组件意味着复杂的状态连接•复杂的代码难以维护,导致设计上的更复杂14软件的本质特性•一致性–软件必须遵从人为的惯例并适应已有的技术和系统•软件必须遵循各种接口、协议和标准•有些情况下,兼容性是软件开发的目标–软件需要随接口的不同而改变,随时间的推移而变化,而这些变化是不同的人设计的结果。–许多复杂性来自保持与其他接口的一致,对软件的任何再设计,都无法简化这些复杂特性。15软件的本质特性•可变性–软件产品扎根于文化的母体中,如各种应用、用户、自然及社会规律、计算机硬件等,后者持续不断地变化着,这些变化无情地强迫着软件随之变化。–所有成功的软件都会发生变更!•当人们发现软件很有用时,会在原有应用范围的边界,或者在超越边界的情况下使用软件;•功能扩展的压力主要来自那些喜欢基本功能,又对软件提出了很多新用法的用户们。16软件的本质特性•可变性(续)–人们总是认为软件是容易修改的,但忽视了修改所带来的副作用,不断的修改最终导致软件的退化。理想曲线修改实际曲线失效率时间由于修改造成失效率的提高软件的失效率曲线17软件的本质特性•不可见性–软件是不可见的和无法可视化的•软件的客观存在不具有空间的形体特征•定义“需要做什么”成为软件开发的根本问题–人们一直试图使用不同的技术进行软件可视化•控制流程、数据流、依赖关系、UML、……•这些技术仍然无法给出准确的、完整的描述–软件仍然保持着无法可视化的固有特性,从而剥夺了一些具有强大功能的概念工具的构造思路。这种缺憾不仅限制了个人的设计过程,也严重地阻碍了相互之间的交流。18内容提纲•软件–软件的定义与软件危机–软件的本质特性•软件工程–定义与发展历史–理解软件质量–过程、方法和工具•软件工程学科–软件工程知识体系(SWEBOK)–软件工程职业道德规范Youarehere!你在这儿!19工程的含义•工程是将理论和所学的知识应用于实践的科学,以便经济有效地解决实际问题。20工程的含义•规模上的差异–花园小道vs.汽车高速公路–树上小屋vs.摩天大楼–加法程序vs.医院档案系统•手工(Craft):小规模的设计与建造–简单问题与单一目标–个人控制与个人技能•工程(Engineering):大规模的设计与建造–复杂问题与目标分解–多人参与,需要考虑运营、管理、成本、质量控制、安全等21工程的特征•平衡与决策–需要进行一系列决策和认真评价,并在每一个决策点做出适当选择,适当与否可以通过平衡成本和利益的分析来判断。•度量与验证–应该度量事物,在适当的时候定量工作;需要校正并验证度量,并在经验和实验数据的基础上进行近似。•运用工具–工程师需要将工具系统地应用在过程中,因此选用适当的工具是工程的关键。22工程的特征•团队协同工作–注重训练有素,并以团队的形式进行有效的工作。•角色分工–多重角色:研究、开发、设计、生产、测试、构造、实施、管理以及其他诸如销售、咨询和教学等。•最佳实践–通过专业团体不断地开发和确认工程原则、标准和实践。•强调重用–工程师应该重用设计和设计制品。23只有编码的开发过程编码实现24工程化的软件开发概念形成需求规格说明设计实现???25什么是软件工程•软件工程的定义[Bauer,1972]软件工程是为了经济地获得能够在实际机器上高效运行的可靠软件而建立和使用的一系列好的工程化原则。[CMU,1990]软件工程是以工程的形式应用计算机科学和数学原理,从而经济有效地解决软件问题。[IEEE,1993]软件工程是①将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即工程化应用到软件上;②对①中所述方法的研究。26什么是软件工程27软件工程的关注焦点•软件质量(SoftwareQuality)–软件质量是软件产品与明确的和隐含的需求相一致的程度–软件质量通常采用一系列质量特性来描述•软件成本(SoftwareCost)–软件开发成本是指软件开发过程中所花费的费用–软件维护成本是指软件投入运行后软件变更所需的费用28理解软件质量•你同意以下说法吗?为什么?“运行正确的软件就是高质量的软件。”•软件除了提供用户所需的功能以外,还应该具有一系列反映质量的属性,包括可维护性、可依赖性、有效性和可用性等。–可维护性:软件必须能够不断进化以满足客户的需求变化–可依赖性:软件必须是可靠的、保密的、安全的–有效性:软件不应该浪费内存和处理器等系统资源–可用性:软件必须是可用的,用户可以很方便地使用29理解软件质量良好的文档可读的代码良好的设计可重用性可靠性正确性有效性降低成本可移植性增强产品性功能性易使用易学习维护人员最终用户客户30软件工程的三要素•软件工程以关注软件质量为目标,包括过程、方法和工具三个要素。•过程–支持软件生命周期的所有活动•方法–为软件开发过程提供“如何做”的技术•工具–为软件开发方法提供自动的或半自动的软件支撑环境质量方法工具过程31什么是软件过程•软件过程是指开发软件产品的一组活动及其结果。•软件过程的四个基本活动–规格说明(Specification)定义软件功能以及对其使用的限制–软件开发(Development)设计和实现满足规格说明的软件–软件确认(Validation)验证软件以保证能够满足客户的要求–软件演化(Evolution)改进软件以适应不断变化的需求32软件过程框架•软件过程框架–框架活动•涉及软件开发的基本活动•每个任务集合由工作任务、工作产品、质量保证点、项目里程碑组成–辅助活动•包括软件质量保证、软件配置管理、软件项目管理、文档生成与管理、软件度量、风险管理等过程框架过程框架辅助活动……辅助活动……框架活动#1工作任务工作产品质量保证点项目里程碑框架活动#1工作任务工作产品质量保证点项目里程碑框架活动#n工作任务工作产品质量保证点项目里程碑框架活动#n工作任务工作产品质量保证点项目里程碑33什么是软件过程模型•软件过程模型是从特定角度呈现的对软件过程的简化描述。–软件过程模型是对实际过程的抽象描述–包括软件过程的活动、软件产品以及参与人员的不同角色•常见的软件过程模型–瀑布模型–进化式开发模型–形式化模型–组件式开发模型34什么是软件工程方法•软件工程方法是软件开发的结构化方法,包括模型描述、规则、设计建议和过程指南等–模型描述•对所开发的系统建立图形化的模型描述•例如:对象模型、数据流模型、状态机模型–规则•应用于系统模型的约束–设计建议•有关良好设计实践的建议–过程指南•软件开发所遵循的活动以及这些活动的组织结构35结构化方法vs.面向对象方法传统的编程语言问题域计算机总体设计详细设计测试需求分析编程自然语言分析与设计的鸿沟问题域计算机面向对象设计面向对象测试面向对象分析面向对象编程自然语言面向对象的编程语言36什么是CASE•CASE(ComputerAidedSoftwareEngineering)–计算机辅助软件工程是一组工具和方法的集合,用于辅助软件开发、维护、管理过程中的各项活动,促进软件过程的工程化和自动化。–所有的软件工程方法都需要CASE的相应技术来支持•用于系统模型的图形编辑器•管理设计实体的数据字典•生成用户界面的GUI软件•辅助生成系统文档的报告生成器•支持程序纠错的调试器•代码生成器•……37CASE的层次软件开发过程与管理总体设计详细设计软件测试需求分析编程