软件工程主讲:张红斌Email:zhbdog@tom.com使用教材:软件工程(江西高校出版社)参考教材:软件工程导论(第五版)清华大学出版社八十年代初科学家的预言Osborne1979将迎来”新的工业革命”Toffler1980微电子的发展是人类历史上的”第三次浪潮”80年代初美国商业周刊杂志在头版刊登大标题:“软件:新的驱动力”!当时人们还没有意识到他们的预见是多么的正确。八十年代初科学家的预言Naisbitt1982人类社会将“从工业社会向信息社会转变”Feigenbaum1983计算机控制的信息和知识将成为20世纪表现能力的焦点Stoll1989网络和软件产生的“电子社会”是实现全球知识交流的关键。二十年后的现实1.计算机的发展与普及2.计算机软件的发展与普及3.计算机网络的发展与普及观察与思考因为普及了计算机、软件和网络…迎来了信息化社会和知识经济。软件工程的重要性(为什么学?)历史角度社会角度个人角度[历史角度]发展的必然——软件危机六十年代以来,随着计算机应用需求的驱动,系统软件和应用软件有很大的发展,如操作系统,编译系统和大型应用软件等。由于软件生产的复杂性和高成本,使大型软件的生产出现了很大的困难,即出现软件危机。软件工程正是为克服软件危机而提出的一种概念,并在实践中不断地探索它的原理,技术和方法。在此过程中,人们研究和借鉴了工程学的某些原理和方法,并形成了一门新的学科─软件工程学。[社会角度]团队协作的时代——个人英雄主义时代的终结中国的软件英雄:吴晓军(2.13)、史玉柱(巨人汉卡)、鲍岳桥(UCDOS)、周志农(自然码)、朱崇君(CCED)、求伯君(WPS)、马化腾(QQ)、刘旭(瑞星)、王江民(KV)、王文京(用友)、张小龙(Foxmail)、丁磊(163邮局)、洪以容(netants)……越来越少,影响也越来越小。这些英雄如今不是销声匿迹,就是组成了自己的团队。我们需要英雄,但是,如果只有英雄,那么就只有软件、而没有软件业了。能够支撑起民族软件业的只能是靠工程化思想武装起来的团队、还要有几只超级规模的团队!在个人英雄主义时代,对一般软件从业者来讲,会两句SQL,能写个工资程序、打打报表就能生存,那个时代已经一去不复返了![社会角度]团队协作的时代——个人英雄主义时代的终结我国的软件开发水平,单从编码来看,我们拥有众多的高水平程序员,绝不逊色于任何国家,但软件开发管理水平与发达国家有很大差距,这也就是我们不能开发出像Office、操作系统之类软件的原因。我们从单个程序员来说,能够编写出一流的代码,漂亮的界面。但是却去不能协调众多程序员去开发一个项目(工程)软件。在这一方面说我们中国程序员一个人是一条龙,十个人是一条虫并不为过。例:首都机场。印度人写的一个模块200多行,我们程序员只用不到50行,但人家的模块同样正确、而且坚固、文档清晰易懂。技术技巧固然重要,但软件开发中最大的问题已不是技术问题,而是管理问题![个人角度]专业人员必备的个人素质1)基础理论:训练分析解决问题的能力,深层研究的工具。数学分析训练严密的逻辑思维。普通物理和西方哲学史等教会你很多思维方式,比如:假说——大胆假设、认真求证。(算法分析与设计)2)专业理论:数据库理论、网络基础、编译原理等。3)专业技术:程序设计语言等。(很多人热衷的)4)工程技术:软件工程,本、研教育中唯一涉及工程规范与管理的课程,它象粘合剂,技术经过它的粘合才能形成软件产品!(很多软件设计者忽略了)5)外语。多门语言多条路。(外包)6)表达与交流能力:团队内部、与客户通讯的基本素质。7)法律常识与职业道德:知识产权保护、行业特点的职业道德。[个人角度]专业人员必备的个人素质程序员是一个吃青春饭的行当,也是英雄出少年的行当,就象运动员一样。一个程序员,10年以后很少再只写代码。软件工程是你从程序员到高级程序员、系统分析员,或项目经理、部门经理、CTO一步步迈进必备的知识,积累起来的经验也是你超越年轻人坐在更高职位的资本。(有志向者自己创业)软件行业分工越来越细、一个团队内也有各种角色。软件工程的知识可以使你结合自己的特点准确定位自己的发展方向。课程学习的目标掌握基础理论树立工程化思想培养国际标准的意识锻炼团队合作精神加强交流与动手能力两个上升转变对软件的认识:上升程序系统转变思维定式:上升程序员系统工程师(系统分析员)本章要点背景知识什么是软件?什么是软件工程?软件工程研究什么?背景知识软件工程是学科软件工程知识结构软件工程与一般工程的差异开发软件不仅仅是编程本课程与其他课程的区别软件工程是学科软件工程是一门学科,它用科学的理论指导标准的软件系统开发。(二级学科)单纯的代码编写是软件工程的前身,它只占用软件工程中很少的一段空间和时间。比较争议的地方软件工程是一门交叉学科软件工程的主要研究内容软件开发技术:软件开发方法学软件开发过程软件工具和软件工程环境软件工程管理:软件管理学软件经济学软件心理软件工程所包含的内容不是一成不变的,随着人们对软件系统的研制开发和生产的理解。应用发展的眼光看待它。软件工程知识结构软件需求软件设计软件构造软件测试软件维护软件配置管理软件工程管理软件工程过程软件工程工具和方法软件质量软件工程与一般工程的差异软件是逻辑产品而不是实物产品软件的功能依赖于硬件和软件的运行环境以及人们对它的操作软件设计的复杂性智力密集及知识产权保护开发软件不仅仅是编程开发维护设计编写模块测试联合测试分析说明什么?“软件工程”课程与其它软件专业课的区别(尤其是语言类课)(1)立足于系统的整体。(2)讲授系统分析、系统设计、测试、管理、软件工具及维护理论和方法。(3)实践中了解软件过程中的各个重要阶段。(4)以结构化方法为主,面向对象方法做一个升华。什么是软件软件的发展史究竟什么是软件软件的特点软件的分类软件危机软件的发展1950---1965没有系统的软件开发方法和管理机制、自定义软件、批处理、有限分布。1965---1975产生人机交互的新概念、新技术软件产品、多用户、实时、数据库。软件的发展1973---1988微处理器的出现并广泛应用分布式系统、嵌入智能、低成本硬件、消费者的影响。1986---2000广域和局域网络迅速普及强大的桌面系统、面向对象技术、专家系统、人工智能、神经网络、并行计算、网络计算机。早期第二阶段第三阶段第四阶段面向批处理多用户分布式系统强大的桌面系统有限的分布实时嵌入“智能”面向对象技术自定义软件数据库低成本硬件专家系统软件产品消费者的影响人工神经网络并行计算网络计算机195019601970198019902000软件的发展史软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。程序是按事先设计的功能和性能要求执行的指令序列数据是使程序能正常操纵信息的数据结构(有教材不把它作为软件的一部分)文档是与程序开发,维护和使用有关的图文材料究竟什么是软件?PCSourceCodeDataResultDocument程序=算法+数据结构软件的详细描述程序设计语言面向机器:汇编语言、机器语言等面向过程:Fortran,Pascal,C等面向对象:C++,Java等面向问题:结构化查询语言SQL等软件的详细描述数据用程序设计语言要求的数据结构表示文档规范准确清晰简洁无歧义自然语言结构化英语图表可读流行的说法:计算机世界的软件软件是能够完成预定功能和性能,并对相应数据进行加工的程序和描述程序及其操作的文档。杨芙清院士的观点(数学的观点)软件是客观世界中问题空间与解空间的具体描述,是追求表达能力强、更符合人类思维模式、具有易构造性和易演化性的计算模型。软件的特点软件是一种逻辑实体,而不是具体的物理实体。因而它具有抽象性软件的生产与硬件不同,在它的开发过程中没有明显的制造过程在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题软件的开发和运行常受到计算机系统的限制,对计算机系统有着不同程度的依赖性软件的开发至今尚未完全摆脱手工艺的开发方式软件的特点软件特点目前,追求的终端用户编程、模型驱动开发、随需即取等技术的出现,其目的都是使软件开发从手工向工业化生产方式变革。构件技术是最重要的软件技术之一。软件本身是复杂的1.实际问题的复杂性2.程序逻辑结构的复杂性3.软件成本相当昂贵相当多的软件工作涉及到社会因素软件的特点Windows95有1000万行代码Windows2000有5000万行代码Exchange2000和Windows2000开发人员结构Exchange2000Windows2000项目经理25人约250人开发人员140人约1700人测试人员350人约3200人说明什么?软件的分类按软件的功能进行划分:系统软件操作系统数据库管理系统设备驱动程序通信处理程序等支撑软件文本编辑程序文件格式化程序磁盘向磁带向数据传输的程序程序库系统支持需求分析、设计、实现、测试和支持管理的软件软件的分类应用软件商业数据处理软件工程与科学计算软件计算机辅助设计/制造软件系统仿真软件智能产品嵌入软件医疗、制药软件事务管理、办公自动化软件计算机辅助教学软件软件的分类按软件规模进行划分:类别参加人员数研制期限源程序行数微型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~10M软件的分类按软件工作方式划分:实时处理软件分时处理软件交互式软件批处理软件按软件服务对象的范围划分:项目软件产品软件软件的分类按使用的频度进行划分:一次使用频繁使用按软件失效的影响进行划分:高可靠性软件一般可靠性软件软件的分类软件的应用典型的软件比如有电子邮件,嵌入式系统,人机界面,办公套件,操作系统,编译器,数据库,游戏等。各个行业几乎都有计算机软件的应用,比如工业,农业,银行,航空,政府部门等。软件危机软件开发无计划软件需求不充分软件开发过程不规范软件产品无评测手段软件开发周期大大超过预算软件开发成本严重超标软件质量难于保证软件不能满足社会发展的需求,成为社会、经济发展的制约因素软件危机代表IBMOS360:FredBrooks的《人月神话》,动用1000多名程序员,经历数十年,花费数百万美元;阿里亚娜火箭:火箭导航的电脑软件系统发生故障造成火箭爆炸;Therac-25:一种辐射治疗的机器。由于其软件设计时的瑕疵,致命地超过剂量设定导致在1985年六月到1987年一月之间,六件已知的医疗事故中,患者死亡或严重辐射灼伤。什么是软件工程软件工程的定义软件工程技术的发展的里程我国软件工程的发展历程我国软件产业存在的问题软件工程的本质特性软件工程的7条基本原理软件工程的定义Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料IEEE83:软件工程是开发、运行、维护和修复软件的系统方法68’NATO:为了经济地获得可靠的且能在实际机器上有效运行的软件,而建立和使用完善的工程原理。美国电气和电子工程师协会软件工程的定义IEEE93:“将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。”流行的定义:一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。杨芙清院士的观点软件工程是应用计算机科学理论与技术以及工程管理原则与方法,按照预算与进度,实现满足用户要求的软件产品的定义、开发、发布和维护的过程,或以之为研究对象的学科。软件工程技术的发