软件工程第1章概述第一章软件工程学概述1.1软件危机1.2软件工程中的常见问题1.3职业和道德上的责任软件工程导论22019/11/151)软件的定义软件(Software)是计算机系统中与硬件相互依存的另一部分,它是包括程序(Program),数据(Data)及其相关文档(Document)的完整集合。Software=Program+Data+Document程序是按事先设计的功能和性能要求执行的指令序列数据是使程序能正常操纵信息的数据结构文档是与程序开发,维护和使用有关的图文材料1.1软件危机2019/11/153软件工程导论1.1软件危机复杂性软件是人类思维和智能的一种延伸和在异体上的再现,在规模上可能比任何由人类创造的其他实体都要复杂,复杂性是软件的本质特性。软件的复杂性是必要属性大量的组合状态;丰富的结构和相互依赖性;良好的接口用以封装内部的复杂性开发问题也会增加复杂性高效率的代码通常是复杂的;重用通用化的组件意味着复杂的状态连接;复杂的代码难以维护,导致设计上的更复杂软件工程导论42019/11/151.1软件危机一致性软件必须遵从人为的惯例并适应已有的技术和系统软件必须遵循各种接口、协议和标准;有些情况下,兼容性是软件开发的目标。软件需要随接口的不同而改变,随时间的推移而变化,而这些变化是不同的人设计的结果。许多复杂性来自保持与其他接口的一致,对软件的任何再设计,都无法简化这些复杂特性。软件工程导论52019/11/151.1软件危机可变性软件产品扎根于文化的母体中;各种应用、用户、自然及社会规律、计算机硬件等持续不断地变化着,这些变化强迫着软件随之变化。所有成功的软件都会发生变更。当人们发现软件很有用时,会在原有应用范围的边界,或者在超越边界的情况下使用软件;功能扩展的压力主要来自那些喜欢基本功能,又对软件提出了很多新用法的用户们。软件工程导论62019/11/151.1软件危机不可见性软件是不可见的和无法可视化的软件的客观存在不具有空间的形体特征,定义“需要做什么”成为软件开发的根本问题。人们一直试图使用不同的技术进行软件可视化如控制流程、数据流、依赖关系、UML等,但这些技术仍然无法给出准确的、完整的描述。软件仍然保持着无法可视化的固有特性从而剥夺了一些具有强大功能的概念工具的构造思路。这种缺憾不仅限制了个人的设计过程,也严重地阻碍了相互之间的交流。软件工程导论72019/11/151.1软件危机软件危机软件危机是指计算机软件的开发与维护过程中所遇到的一系列严重问题,几乎所有软件都不同程度地存在这些问题。软件危机主要包含两方面问题:如何开发软件以满足社会对软件日益增长的需求如何更有效地维护数量不断膨胀的已有软件。软件工程导论82019/11/151.1软件危机软件危机的典型表现:对软件开发成本和进度的估计常常很不准确;用户对“已完成的”软件系统不满意的现象经常发生;软件产品的质量往往靠不住。软件通常很难维护;软件往往没有适当的文档资料;软件成本在计算机系统总成本中所占的比例逐年上升;软件开发生产率提高的速度远远不能满足社会对软件产品日益增长的需求。软件工程导论92019/11/151962年6月,美国飞向金星的第一个空间探测号(水手1号),因其飞舱中的计算机导航程序之一的一个语句的语义出错,总是偏离航线无法取得成功。1965年~1970年,美国范登堡基地因程序有错误造成发射火箭多次失败。10软件工程导论2019/11/15按软件规模进行划分:类别参加人员数研制期限产品规模(源程序行数)微型11~4周0.5k小型11~6月1k~2k中型2~51~2年5k~50k大型5~202~3年50k~100k甚大型100~10004~5年1M(=1000k)极大型2000~50005~10年1M~10M11软件工程导论2019/11/15软件工程导论12例:Windows95有1000万行代码Windows2000有5000万行代码Exchange2000和Windows2000开发人员结构Exchange2000Windows2000项目经理25人约250人开发人员140人约1700人测试人员350人约3200人2019/11/15处在十字路口的中国软件产业主权大国必须建立基于自主技术的、完整的软件产业体系。软件本国提供率:中国1/3左右,美国97%“印度模式”还是“中国模式”软件人才结构不合理,缺乏中高级软件人才。软件人员缺乏软件工程化的概念。13软件工程导论2019/11/15软件需求与软件技术关系示意图14软件工程导论2019/11/151.1软件危机产生软件危机的原因客观原因:软件的不可见性在管理和控制软件开发过程相当困难;软件维护意味着改正或修改原有设计,从而使得软件较难维护;软件规模庞大,程序复杂性随软件规模指数增加,无法预见软件可能遇到的每一种情况。软件工程导论152019/11/151.1软件危机产生软件危机的原因主观原因:计算机系统发展早期开发软件的个体化特点使得许多软件工程师对软件开发和维护有不少糊涂认识,主要表现在:忽视软件需求分析的重要性;认为软件开发就是写程序;轻视软件维护。软件工程导论162019/11/15软件工程导论17引入同一变动付出的代价随时间变化的趋势2019/11/15改正一个问题需付出的代价需求分析结构设计详细设计编码集成测试系统测试现场改正一个问题的估计费用改正一个问题估计的工作量20200200010005.02.50.050.5(美元)(人天)18软件工程导论2019/11/151.1软件危机消除软件危机的途径树立对计算机软件的正确认识软件=程序+数据+文档软件开发应该是组织良好、管理严格、各类人员团结协作共同完成的工程项目;积极开发和使用计算机辅助软件工程(CASE)工具因此,消除软件危机既要有技术措施(方法和工具),又要有必要的组织管理措施。软件工程导论192019/11/15201.2软件工程中的常见问题(一)什么是软件?什么是软件工程?软件工程和计算机科学有何区别?软件工程和系统工程有何区别?什么是软件过程?什么是软件过程模型?软件工程导论2019/11/15211.2软件工程中的常见问题(二)什么是软件过程的成本?什么是软件工程方法?什么是CASE(计算机辅助软件工程)?什么是优良软件的特点?软件工程面临的主要挑战是什么?软件工程导论2019/11/1522什么是软件软件是程序和所有使用程序正确运行所需要的相关文档和配置信息。软件产品可能是为特定的顾客而开发的,也可能是为一般市场而开发的。软件成品可以分成以下两类:通用软件产品定制软件成品这两类产品的重要区别:软件描述的提供者不同。通用软件——由开发者给出定制软件——由客户给出软件工程导论2019/11/1523什么是软件工程软件工程是一门工程学科,涉及软件生产的各个方面,从最初的系统描述一直到使用后期的系统维护,都属于其学科范畴。工程学科软件生产的各个方面软件工程人员应当运用系统的、有组织的工作方法来开发高质量的软件。软件工程导论2019/11/151.2软件工程工程的概念工程是将理论和所学的知识应用于实践的科学,以便经济有效地解决实际问题。手工(Craft):小规模的设计与建造--简单问题与单一目标个人控制与个人技能工程(Engineering):大规模的设计与建造复杂问题与目标分解多人参与,需要考虑运营、管理、成本、质量控制、安全等软件工程导论242019/11/15软件工程导论251.2软件工程软件工程简介危机工程的概念工程是将理论和所学的知识应用于实践的科学,以便经济有效地解决实际问题。手工(Craft):小规模的设计与建造--简单问题与单一目标--个人控制与个人技能工程(Engineering):大规模的设计与建造--复杂问题与目标分解--多人参与,需要考虑运营、管理、成本、质量控制、安全等2019/11/15软件工程25只有编码的开发过程编码实现162019/11/15软件工程导论261.1软件危机软件危机消除软件危机的途径•树立对计算机软件的正确认识软件=程序+数据+文档•软件开发应该是组织良好、管理严格、各类人员团结协作共同完成的工程项目;•积极开发和使用计算机辅助软件工程(CASE)工具因此,消除软件危机既要有技术措施(方法和工具),又要有必要的组织管理措施。2019/11/15软件工程26工程化的软件开发概念形成?需求规格说明?设计?实现172019/11/151.2软件工程定义(1)Theestablishmentanduseofsoundengineeringprinciples(methods)inordertoobtaineconomicallysoftwarethatisreliableandworksonrealmachines.(1968-FritzBauer)软件工程就是建立和使用一套合理的工程原理,从而经济地获得可靠的、可以在实际机器上高效运行的软件。2019/11/1527软件工程导论1.2软件工程定义(2)Softwareengineering.(1)Theapplicationofasystematic,disciplined,quantifiableapproachtothedevelopment,operation,andmaintenanceofsoftware;thatis,theapplicationofengineeringtosoftware.(2)Thestudyofapproachesasin(1).(IEEE(TheInstituteforElectricalandElectronicengineers)Std610-1990.)软件工程是:(1)把系统的、规范的、可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;(2)研究(1)中提到的途径。2019/11/1528软件工程导论1.2软件工程软件工程的概念[Bauer,1972]软件工程是为了经济地获得能够在实际机器上高效运行的可靠软件而建立和使用的一系列好的工程化原则。[CMU,1990]软件工程是以工程的形式应用计算机科学和数学原理,从而经济有效地解决软件问题。[IEEE,1993]软件工程是①将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即工程化应用到软件上;②对①中所述方法的研究。软件工程导论292019/11/151.2软件工程定义总之:软件工程是应用计算机科学、数学及管理科学等原理开发软件的工程。它借鉴传统工程的原则、方法,以提高质量,降低成本为目的。2019/11/1530软件工程导论软件工程的特性1.软件工程关注于大型程序的构造2.软件工程的中心课题是控制复杂性3.软件经常变化4.开发软件的效率非常重要5.和谐地合作是开发软件的关键6.软件必须有效地支持它的用户7.在软件工程领域中是由具有一种文化背景的人替具有另一种文化背景的人2019/11/1531软件工程导论1.2软件工程软件工程的本质特征软件工程关注于大型程序的构造;“大”与“小”的分界线并不十分清晰。通常把一个人在较短时间内写出的程序称为小型程序,而把多人合作用时半年以上才写出的程序称为大型程序。传统的程序设计技术和工具是支持小型程序设计的,不能简单地把这些技术和工具用于开发大型程序。事实上,在此处使用术语“程序”并不十分恰当,现在的软件开发项目通常构造出包含若干个相关程序的“系统”。软件工程导论322019/11/151.2软件工程中心课题是控制复杂性通常,软件所解决的问题十分复杂,以致不能把问题作为一个整体通盘考虑。人们不得不把问题分解,使得分解出的每个部分是可理解的,而且各部分之间保持简单的通信关系。用这种方法并不能降低问题的整体复杂性,但是却可使