软件工程概述软件危机与软件工程软件体系结构什么是软件?是一系列按照特定顺序组织的电脑数据和指令的集合——维基百科计算机硬件的摩尔定律摩尔定律是指IC上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍。软件危机OS360操作系统使用了1000人左右的程序员。FredBrooks在随后他的大作《人月神话》(TheMythicalMan-Month)中曾经承认,在他管理这个项目的时候,他犯了一个价值数百万美元的错误。财产的损失:软件的错误可能导致巨大的财产损失。欧洲阿里亚娜火箭的爆炸就是一个最为惨痛的教训。人员伤亡:由于计算机软件被广泛应用于包括医院等与生命息息相关的行业。因此软件的错误也有可能会导致人员伤亡。Therac-25的意外.在1985年六月到1987年一月之间,六个已知的医疗事故来自于Therac-25错误地超过剂量,导致患者死亡或严重辐射灼伤在工业上,某些嵌入式系统导致机器的不正常运转,从而将一些人推入了险境。源于20世纪60,70和80年代,个人英雄主义的软件开发模式面临无法容忍的问题。有超过半数的软件开发以失败而终,最终可用和可接受的仅占15%。软件设计——科学?工程?甚至艺术?这是一个被争论了很久的问题。实际上,软件开发兼有三者的特点。但是这并不意味着它们可以被互相混淆。很多人认为软件工程基于计算机科学和信息科学就如传统意义上的工程学之于物理和化学一样。在美国,大约40%的软件工程师具有计算机科学的学位。在世界其他地方,这个比例也差不多。他们并不一定会每天使用计算机科学方面的知识,但是他们每天都会使用软件工程方面的知识。软件工程的定义涉及到:程序设计语言数据库软件开发工具系统平台标准计模式是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。——维基百科软件工程与计算机科学的区别软件的生命周期需求分析描述与定义设计实现测试维护产品淘汰方法学重量级:ISO9000CMM统一软件开发过程(RUP)轻量级(个体软件工程):极限编程(XP)敏捷过程(AgileProcesses)其它软件工程技术面向方面的程序设计(AspectOrientedProgramming,简称AOP)面向代理(agent)的软件工程泛型编程(GenericProgramming)模板(Template)计算机辅助(CASE)工具计划管理类,Project2000设计分析类,Rose、Visio版本控制类,CVS、SVN程序设计类,Visualstudio、PB原型建造类集成化平台,Eclipse软件测试类,JUnit论银弹——世界上没有万能妙药凡是需要发挥人的主观能动性、创造性、判断力,特别是人的协作性的工作,断无一劳永逸的解决之法。只能利用靠自身经验以及前人总结的经验少走弯路罢了。软件重用的层次代码级基于源代码基于构件设计级(设计模式)软件体系结构级不要重复发明轮子!构件与软件重用(复用)软件构件软件系统中具有相对独立功能,可以明确辨识,接口由规约指定,与语境有明显依赖关系,可独立部署,且多由第三方提供的可组装软件实体。是语义描述、通讯接口和实现代码的复合体构件模型业界主流构件模型标准:CORBA(CommonObjectRequestBrokerArchitecture,通用对象请求结构,OMG)EJB(Enterprisejavabean,SUN)DCOM(DistributedComponentObjectModel,Microsoft)构件模型(Model)是对构件本质特征的抽象描述基于构件的软件重用构件获取构件管理构件描述构件分类与库组织人员及权限管理构件重用检索与提取构件理解与评价构件修改构件构件组装青鸟构件模型(北京大学)由外部接口(interface)与内部结构两部分组成参数化属性构件名称功能描述虚拟成员所需的构件具体成员成员关系提供的功能课堂作业:自学青鸟工程的相关知识。软件体系结构历史发展定义架构描述语言视图历史发展无“体系结构”设计以汇编语言进行小规模应用程序开发为特征。萌芽阶段出现了程序结构设计主题,以控制流图和数据流图构成软件结构为特征初期阶段出现了从不同侧面描述系统的结构模型,以UML为典型代表。高级阶段以描述系统的高层抽象结构为中心,不关心具体的建模细节,划分了体系结构模型与传统软件结构的界限,该阶段以Kruchten提出的“4+1”模型为标志定义DewaynePerry和A1exWo1f软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组组合连接起来。MaryShaw和DavidGarlan是软件设计过程中的一个层次,这一层次超越计算过程中的算法设计和数据结构设计。Kruchten概念角度,描述系统的主要构件及它们之间的关系;模块角度,包含功能分解与层次结构;运行角度,描述了一个系统的动态结构;代码角度描述了各种代码和库函数在开发环境中的组织。HayesRoth是一个抽象的系统规范,主要包括用其行为来描述的功能构件和构件之间的相互连接、接口和关系。软件架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。架构描述语言(ADL)Wright(由卡内基梅隆大学开发),Acme(由卡内基梅隆大学开发),C2(由UCI开发),Darwin(由伦敦帝国学院开发)。ADL的基本构成包括组件、连接器和配置。有许多为描述软件架构的语言被开发出来,但是关于应该采用什么样的符号集和视图系统还没有达成共识。视图功能/逻辑视图代码视图开发/结构视图并行/过程/线程视图物理/部署视图用户动作/反馈视图软件架构一般来说组织成视图,如同在建筑学中的不同种类的蓝图。当前业界尚未统一的图形标准,UML也许最有可能成为软件架构视图的标准。体系结构示例客户端服务器分布式计算对等系统黑板隐式调用插件单层系统三层结构结构化(基于模块,但在模块内部是一体的)基于软件构件(基于模块,在模块内部,通常采用面向对象程序设计方法,slightlylessmonolithic)面向服务的体系架构作业阐述“黑板系统”与通常的“数据库系统”有何异同点。作业概述“建筑工程”比较“建筑工程与软件工程”的异同不少于2000字