现代软件工程计算机信息工程学院2004年9月授课教师:李德生答疑时间:周三下午答疑地点:计算机应用教研室E_mail:Lids_cs@126.comSoftware=Programming+DocumentsProgramming=DataStructure+algorithm第一章软件工程概述§1.1软件工程的基本概念、特点和分类1.1.1软件的概念、特征计算机软件是程序、数据及相关文档的集合。§1.1软件工程的基本概念、特点和分类软件的特征:P1。§1.1软件工程的基本概念、特点和分类1.1.2软件的分类:系统软件、支撑软件、应用软件。软件规模:类别参加人员数研制期限产品规模(源程序行数)微型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~10M1.2.1软件的发展1946年,第一台计算机诞生,通过编写机器码指令的方式来编写程序,满足了人们计算方面的需要。之后,计算机硬件以空前的速度飞速发展。由电子管计算机时代→晶体管计算机时代→集成电路计算机时代,按照摩尔法则(微处理器的性能每18个月翻番)使计算机的性能不断提高。同时硬件技术的突破,为软件技术的发展提供了空间,软件技术也得到了相应的发展,由最初的机器码编程→汇编语言→高级语言。关系数据库理论的发展也促进了数据库应用系统的发展。软件技术上的这一系列发展的结果使得计算机的应用领域由最初的科学计算发展到军事、经济、科学、文化等各个领域。计算机应用系统由简单到复杂,由小型到大型,到了60年代末期,从事软件开发的人员发现,他们使用过去一直使用的方法来开发大型复杂的应用系统遇到了问题。过去,编制程序完全是一种技巧,主要依赖于程序员的素质,程序是程序员智慧的结晶,每个程序员编程无章法,随意性大,开发模式完全是手工小作坊式的。由此,60年代末,对大型系统的开发呈现出“软件危机”。§1.2软件危机与软件工程例:Windows95有1000万行代码Windows2000有5000万行代码Exchange2000和Windows2000开发人员结构Exchange2000Windows2000项目经理25人约250人开发人员140人约1700人测试人员350人约3200人自20世纪40年代中出现了世界上第一台计算机以后,就有了程序的概念。其后经历了几十年的发展,计算机软件经历了四个发展阶段:·程序设计阶段,约为50至60年代·程序系统阶段,约为60至70年代·软件工程阶段,约为70年代以后面向对象软件工程阶段,约为80年代以后Evolutionofsoftware早期第二阶段第三阶段第四阶段面向批处理多用户分布式系统强大的桌面系统有限的分布实时嵌入“智能”面向对象技术自定义软件数据库低成本硬件专家系统软件产品消费者的影响人工神经网络并行计算网络计算机1950196019701980199020001.2.2软件危机的主要表现1.对软件开发成本和进度的估计常常很不准确。(下页图)软件开发很难按预定计划实现,投入了资金,能否出结果,出怎样的结果,事先难以预料。2.用户对“已完成”的软件系统不满意的现象经常发生。3.软件产品的质量往往不可靠。软件可靠性和质量保证的定量概念刚刚出现不久。1962年6月,美国飞向金星的第一个空间探测号(水手1号),因其飞舱中的计算机导航程序之一的一个语句的语义出错,总是偏离航线无法取得成功。1965年~1970年,美国范登堡基地因程序有错误造成发射火箭多次失败。§1.2软件危机与软件工程yet,SuccessHasntComeEasily31%53%16%SuccessfullyChallengedCanceled4.软件常常是不可维护的。通常软件维护的费用占总费用的55%-70%。错误具有累积和放大效应。在后期发现的错误改正的成本和难度将是巨大的(比早期进行修正所付出的代价高2-3个数量级),甚至是不可能改正的。改正一个问题需付出的代价需求分析结构设计详细设计编码集成测试系统测试现场改正一个问题的估计费用改正一个问题估计的工作量20200200010005.02.50.050.5(美元)(人天)5.软件通常没有适当的文档资料,给软件开发和维护带来极大困难。文档的作用:管理人员:评价软件开发进度。开发人员:通讯工具。维护人员:维护的依据。6.软件成本在计算机系统总成本中所占的比例逐年上升。(见下页图)7.软件开发生产率提高的速度远远跟不上计算机应用迅速普及深入的趋势。处在十字路口的中国软件产业主权大国必须建立基于自主技术的、完整的软件产业体系。软件本国提供率:中国1/3左右,美国97%“印度模式”还是“中国模式”软件人才结构不合理,缺乏中高级软件人才。软件人员缺乏软件工程化的概念。1.2.3软件工程1968年由NATO(北大西洋公约组织)在德国Garmish召开的学术会议上,FeitzBauer首先提出了“软件工程”概念。P.Wegner和B.Boehm认为软件工程可定义为:科学知识在设计和构造计算机程序,以及开发、运作和维护这些程序所要求的有关文档编制中的实际应用。软件工程的定义FritzBauer在NATO会议上给出的定义:“软件工程是为了经济地获得可靠的和能在实际机器上高效运行的软件而确立和使用的健全的工程原理(方法)。”软件工程的定义IEEE【IEE83】给出的软件工程定义:“软件工程是开发、运行、维护和修复软件的系统方法。”软件工程的定义IEEE【IEE93】给出了一个更加综合的定义:“将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。”软件工程的定义软件工程是指导软件开发和维护的工程类学科,它以计算机科学理论及其他相关学科的理论为指导,采用工程化的概念、原理、技术和方法进行软件的开发和维护,把经过时间证明正确的管理措施和当前能够得到的最好的技术方法结合起来,以较少的代价获取高质量的软件软件工程是应用计算机科学、数学及管理科学等原理,借鉴传统工程的原则、方法来创建软件,从而达到提高质量、降低成本的目的.其中计算机科学和数学用于构造模型、分析算法,工程科学用于制定规范、明确风范(paradigm)、评估成本、确定权衡,管理科学用于进度、资源、质量、成本等的管理.1.2.4软件工程的研究对象与基本原理研究对象:软件工程主要研究与软件开发和维护有关的四个方面的内容:过程与模型、方法和技术、工具和环境、标准和规范。软件工程管理则贯穿于这四个方面。1.所有软件开发和维护都是由一系列过程所构成,它将其他三个方面结合起来。以合理及时地进行软件开发和维护。软件生存周期模型则将软件工程过程有机的结合起来,提供一个结构框架,明确主要活动和任务,忽略次要的细节,以利于开发维护人员理解并适应不同的项目。过程强调的是具体的活动和任务等,模型则突出表现过程的有机结合。2.软件开发和维护方法体现了软件开发和维护人员看待系统的立场和观点,即方法论意义上的方法。例如,结构化方法认为系统是由一些结构化的功能相互联系、相互作用而构成,面向对象的方法则认为系统是由一些对象的相互联系、相互作用而构成。技术则是方法的具体实现,有若干步骤构成,突出“如何做”,有时也不加区别的称为技术方法。3.工具为软件开发和维护的方法、技术提供了自动或半自动的软件支持,以提高软件生产效率。将各种工具结合起来,连同有关的软硬件便形成软件开发和维护环境,其目的是使软件工具支持整个软件生存周期。如北大的青鸟系统等。4.作为工程而言,标准化、规范化可以使各种工作有章可循,进而提高生产效率和产品质量。软件工程标准主要有五个层次:国际标准、国家标准、行业标准、企业规范和项目规范。软件工程是一门交叉学科软件工程的主要研究内容软件开发技术:软件开发方法学软件开发过程软件工具和软件工程环境软件工程管理:软件管理学软件经济学软件心理学软件工程所包含的内容不是一成不变的,随着人们对软件系统的研制开发和生产的理解而不断变化。软件工程的层次结构:任何工程化方法都必须围绕高质量这一核心。软件工程的四个研究对象构成了以软件质量为核心的层次结构。软件工程—一种层次化技术工具和环境层方法和技术层过程和模型层质量核心层Softwareengineeringlayers标准和规范层软件工程三个要素:方法、工具、过程软件工程框架可用性性性确正合算选取适宜的开发模型采用合适的设计方法提供高质量的工程支持重视软件工程的管理基本过程原则目标过程支持过程组织过程软件工程知识结构2001年5月ISO/IECJTC1(ISO和IEC的第一联合技术委员会)发布了《SWEBOK指南V0.95(试用版)》(GuidetotheSoftwareEngineeringBodyofKnowledge,简称SWEBOK)SWEBOK把软件工程学科的主体知识分为10个知识领域。软件工程知识结构软件需求软件设计软件构造软件测试软件维护软件配置管理软件工程管理软件工程过程软件工程工具和方法软件质量软件工程的基本原理:著名软件工程专家Boehm于1983年提出了软件工程的七条基本原理:1.用分段的生存周期计划严格管理。2.坚持进行阶段评审。3.实施严格的产品控制。4.采用现代程序设计技术。5.结果应能清楚地审查。6.开发小组的成员应该少而精。7.承认不断改进工程实践的必要性。1.3.1结构化方法结构化方法基于软件工程生存周期的概念之上。目前,已经形成了完整的SA-SD-SP方法。总的指导思想:自顶向下、逐步求精、单入口、单出口。基本原则:抽象和功能分解。结构化方法围绕处理“功能”的实现过程来构造软件系统。适于需求可以预先确定的系统开发。§1.3软件开发方法1.3.2面向对象方法面向对象方法有如下要点:1.世界由Object构成。复杂对象由简单对象组成。2.把对象归为Class,每个类都定义了一组数据(属性)和方法。3.按照子类(派生类)和父类(基类)的关系,可以把若干个类组成一个层次结构的系统。在这个系统中,子类可以继承(Inheritance)父类的数据和方法。4.对象之间只能通过传递消息进行通信。Object-Oriented=Objects+Classes+Inheritance+CommunicationwithMessage面向对象的方法现已形成一整套的开发方法,由Object-OrientedAnalysis、Object-OrientedDesign、Object-OrientedProgramming组成。1.3.3形式化方法形式化方法生成的模型比结构化方法或面向对象方法得到的模型更完整、一致且无二义性。主要包括:形式化分析形式化设计翻译“软件工程”课程与其它软件专业课的区别(1)立足于系统的整体。(2)讲授系统分析、系统设计、测试及维护的理论和方法。(3)构筑一个软件系统,实践软件开发全过程。“软件工程”课程教学与实践的目标转变对软件的认识:上升程序系统转变思维定式:上升程序员系统工程师(系统分析员)工程化训练系统分析员的地位用户分析员程序员“一个好的工业,应有一套良好的标准来配套”软件的工业化生产过程应具备的特点:明确的工作步骤详细具体的规范化文档明确的质量评价标准软件产品的标准化软件开发过程的标准化软件工程技术的两个明显特点:强调规范化强调文档化§1.4软件生命周期1.4.1软件生命周期(SoftwareLifeCycle)软件产品或软件系统从项目需求定义开始,到开发成功后投入使用,在使用过程中不断增补修订,直到停止使用,这一期间的各种活动过程。通常分三个阶段:定义阶段、开发阶段、维护阶段。维护阶段又分为纠错、适应、增强、预防。1.4.2软件生存期的阶段划分(1)可行性研究与计划(2)需求分析(3)总体设计上游(4)详细设计(5)实现(6)集成测试(7)确认测试下游(8)使