1、软件工程,主讲:张红斌,Email: Tel: 13767005548 使用教材:软件工程(江西高校出版社) 参考教材:软件工程导论(第五版) 清华大学出版社,八十年代初科学家的预言,Osborne 1979 将迎来” 新的工业革命” Toffler 1980 微电子的发展是人类历史上的”第三次浪潮” 80年代初 美国商业周刊杂志在头版刊登大标题:“软件:新的驱动力”! 当时人们还没有意识到他们的预见是多么的正确。,八十年代初科学家的预言,Naisbitt 1982 人类社会将“从工业社会向信息社会转变” Feigenbaum 1983 计算机控制的信息和知识将成为20世纪表现能力的焦点 S
2、toll 1989 网络和软件产生的“电子社会”是实现全球知识交流的关键。,二十年后的现实,1. 计算机的发展与普及2. 计算机软件的发展与普及3. 计算机网络的发展与普及,观察与思考,因为普及了计算机、软件和网络迎来了信息化社会和知识经济。,软件工程的重要性(为什么学? ),历史角度 社会角度 个人角度,历史角度发展的必然软件危机,六十年代以来,随着计算机应用需求的驱动,系统软件和应用软件有很大的发展,如操作系统,编译系统和大型应用软件等。由于软件生产的复杂性和高成本,使大型软件的生产出现了很大的困难,即出现软件危机。 软件工程正是为克服软件危机而提出的一种概念,并在实践中不断地探索它的原理
3、,技术和方法。在此过程中,人们研究和借鉴了工程学的某些原理和方法,并形成了一门新的学科软件工程学。,社会角度团队协作的时代个人英雄主义时代的终结,中国的软件英雄:吴晓军(2.13)、史玉柱(巨人汉卡)、鲍岳桥(UCDOS)、周志农(自然码)、朱崇君(CCED)、求伯君(WPS)、马化腾(QQ)、刘旭(瑞星)、王江民(KV)、王文京(用友)、张小龙(Foxmail)、丁磊(163邮局)、洪以容(netants) 越来越少,影响也越来越小。这些英雄如今不是销声匿迹,就是组成了自己的团队。我们需要英雄,但是,如果只有英雄,那么就只有软件、而没有软件业了。能够支撑起民族软件业的只能是靠工程化思想武装起
4、来的团队、还要有几只超级规模的团队! 在个人英雄主义时代,对一般软件从业者来讲,会两句SQL,能写个工资程序、打打报表就能生存,那个时代已经一去不复返了!,社会角度团队协作的时代个人英雄主义时代的终结,我国的软件开发水平,单从编码来看,我们拥有众多的高水平程序员,绝不逊色于任何国家,但软件开发管理水平与发达国家有很大差距,这也就是我们不能开发出像Office、操作系统之类软件的原因。我们从单个程序员来说,能够编写出一流的代码,漂亮的界面。但是却去不能协调众多程序员去开发一个项目(工程)软件。在这一方面说我们中国程序员一个人是一条龙,十个人是一条虫并不为过。例:首都机场。印度人写的一个模块200
5、多行,我们程序员只用不到50行,但人家的模块同样正确、而且坚固、文档清晰易懂。技术技巧固然重要,但软件开发中最大的问题已不是技术问题,而是管理问题!,个人角度专业人员必备的个人素质,1) 基础理论:训练分析解决问题的能力,深层研究的工具。数学分析训练严密的逻辑思维。普通物理和西方哲学史等教会你很多思维方式,比如:假说大胆假设、认真求证。(算法分析与设计) 2) 专业理论:数据库理论、网络基础、编译原理等。 3) 专业技术:程序设计语言等。(很多人热衷的) 4) 工程技术:软件工程,本、研教育中唯一涉及工程规范与管理的课程,它象粘合剂,技术经过它的粘合才能形成软件产品!(很多软件设计者忽略了)
6、5) 外语。多门语言多条路。(外包) 6) 表达与交流能力:团队内部、与客户通讯的基本素质。 7) 法律常识与职业道德:知识产权保护、行业特点的职业道德。,个人角度专业人员必备的个人素质,程序员是一个吃青春饭的行当,也是英雄出少年的行当,就象运动员一样。一个程序员,10年以后很少再只写代码。软件工程是你从程序员到高级程序员、系统分析员,或项目经理、部门经理、CTO一步步迈进必备的知识,积累起来的经验也是你超越年轻人坐在更高职位的资本。(有志向者自己创业) 软件行业分工越来越细、一个团队内也有各种角色。软件工程的知识可以使你结合自己的特点准确定位自己的发展方向。,课程学习的目标,掌握基础理论 树
7、立工程化思想 培养国际标准的意识 锻炼团队合作精神 加强交流与动手能力,两个上升,转变对软件的认识:上升程序 系统转变思维定式:上升程序员 系统工程师(系统分析员),本章要点,背景知识 什么是软件? 什么是软件工程? 软件工程研究什么?,背景知识,软件工程是学科 软件工程知识结构 软件工程与一般工程的差异 开发软件不仅仅是编程 本课程与其他课程的区别,软件工程是学科,软件工程是一门学科,它用科学的理论指导标准的软件系统开发。(一级学科) 单纯的代码编写是软件工程的前身,它只占用软件工程中很少的一段空间和时间。,比较争议的地方,软件工程是一门交叉学科,软件工程的主要研究内容 软件开发技术:软件开
8、发方法学软件开发过程软件工具和软件工程环境 软件工程管理:软件管理学软件经济学软件心理 软件工程所包含的内容不是一成不变的,随着人们对软件系统的研制开发和生产的理解。应用发展的眼光看待它。,软件工程知识结构,软件需求软件设计软件构造软件测试软件维护软件配置管理软件工程管理软件工程过程软件工程工具和方法软件质量,软件工程与一般工程的差异,软件是逻辑产品而不是实物产品 软件的功能依赖于硬件和软件的运行环境以及人们对它的操作 软件设计的复杂性 智力密集及知识产权保护,开发软件不仅仅是编程,说明什么?,“软件工程”课程 与其它软件专业课的区别(尤其是语言类课),(1) 立足于系统的整体。 (2) 讲授
9、系统分析、系统设计、测试、管理、软件工具及维护理论和方法。 (3) 实践中了解软件过程中的各个重要阶段。 (4) 以结构化方法为主,面向对象方法做一个升华。,什么是软件,软件的发展史 究竟什么是软件 软件的特点 软件的分类 软 件 危 机,软件的发展,1950-1965 没有系统的软件开发方法和管理机制、自定义软件、批处理、有限分布。1965-1975 产生人机交互的新概念、新技术软件产品、多用户、实时、数据库。,软件的发展,1973-1988 微处理器的出现并广泛应用分布式系统、嵌入智能、低成本硬件、消费者的影响。 1986-2000 广域和局域网络迅速普及强大的桌面系统、面向对象技术、专家
10、系统、人工智能、神经网络、并行计算、网络计算机。,早期 第二阶段 第三阶段 第四阶段 面向批处理 多用户 分布式系统 强大的桌面系统 有限的分布 实时 嵌入“智能” 面向对象技术 自定义软件 数据库 低成本硬件 专家系统软件产品 消费者的影响 人工神经网络 并行计算 网络计算机,1950,1960,1970,1980,1990,2000,软件的发展史,软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。 程序是按事先设计的功能和性能要求执行的指令序列 数据是使程序能正常操纵信息的数据结构(有教材不把它作为软件的一部分) 文档是与程序开发,维护和使用有关的图文材
11、料,究竟什么是软件?,Source Code,Data,Result,Document,程序 = 算法+数据结构,软件的详细描述,程序设计语言面向机器 :汇编语言、机器语言等面向过程 :Fortran, Pascal, C等面向对象 :C+, Java等面向问题 :结构化查询语言SQL等,软件的详细描述,数据用程序设计语言要求的数据结构表示文档 规范 准确 清晰 简洁 无歧义自然语言 结构化英语 图表,可读,流行的说法:,计算机世界的软件软件是能够完成预定功能和性能,并对相应数据进行加工的程序和描述程序及其操作的文档。,杨芙清院士的观点(数学的观点),软件是客观世界中问题空间与解空间的具体描述
12、,是追求表达能力强、更符合人类思维模式、具有易构造性和易演化性的计算模型。,软件的特点,软件是一种逻辑实体,而不是具体的物理实体。因而它具有抽象性 软件的生产与硬件不同,在它的开发过程中没有明显的制造过程 在软件的运行和使用期间,没有硬件那样的机械磨损,老化问题,软件的开发和运行常受到计算机系统的限制,对计算机系统有着不同程度的依赖性 软件的开发至今尚未完全摆脱手工艺的开发方式,软件的特点,软件特点,目前,追求的终端用户编程、模型驱动开发、随需即取等技术的出现,其目的都是使软件开发从手工向工业化生产方式变革。 构件技术是最重要的软件技术之一。,软件本身是复杂的 实际问题的复杂性 程序逻辑结构的
13、复杂性 软件成本相当昂贵 相当多的软件工作涉及到社会因素,软件的特点,Windows95有1000万行代码Windows2000有5000万行代码,Exchange2000和 Windows2000开发人员结构,说明什么?,软件的分类,按软件的功能进行划分:系统软件操作系统数据库管理系统设备驱动程序通信处理程序等,支撑软件 文本编辑程序 文件格式化程序 磁盘向磁带向数据传输的程序 程序库系统 支持需求分析、设计、实现、测试和支持管理的软件,软件的分类,应用软件商业数据处理软件工程与科学计算软件计算机辅助设计制造软件系统仿真软件智能产品嵌入软件医疗、制药软件事务管理、办公自动化软件计算机辅助教学
14、软件,软件的分类,按软件规模进行划分:类别 参加人员数 研制期限 源程序行数 微型 1 14周 0.5k 小型 1 16月 1k2k 中型 25 12年 5k50k 大型 520 23年 50k100k 甚大型 1001000 45年 1M(=1000k) 极大型 20005000 510年 1M10M,软件的分类,按软件工作方式划分:实时处理软件分时处理软件交互式软件批处理软件 按软件服务对象的范围划分:项目软件产品软件,软件的分类,按使用的频度进行划分:一次使用频繁使用 按软件失效的影响进行划分:高可靠性软件一般可靠性软件,软件的分类,软件的应用,典型的软件比如有电子邮件,嵌入式系统,人机
15、界面,办公套件,操作系统,编译器,数据库,游戏等。 各个行业几乎都有计算机软件的应用,比如工业,农业,银行,航空,政府部门等。,软 件 危 机,软件开发无计划 软件需求不充分 软件开发过程不规范 软件产品无评测手段 软件开发周期大大超过预算 软件开发成本严重超标 软件质量难于保证,软件不能满足社会发展的需求,成为社会、经济发展的制约因素,软件危机代表,IBM OS 360:Fred Brooks的人月神话,动用1000多名程序员,经历数十年,花费数百万美元; 阿里亚娜火箭 :火箭导航的电脑软件系统发生故障造成火箭爆炸; Therac-25:一种辐射治疗的机器。由于其软件设计时的瑕疵, 致命地超
16、过剂量设定导致在1985年六月到1987年一月之间, 六件已知的医疗事故中, 患者死亡或严重辐射灼伤 。,什么是软件工程,软件工程的定义 软件工程技术的发展的里程 我国软件工程的发展历程 我国软件产业存在的问题 软件工程的本质特性 软件工程的7条基本原理,软件工程的定义,Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料 IEEE83:软件工程是开发、运行、维护和修复软件的系统方法 68NATO:为了经济地获得可靠的且能在实际机器上有效运行的软件,而建立和使用完善的工程原理。,美国电气和电子工程师协会,软件工程的定义,IEEE93:“将系统化
17、的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中。”,流行的定义:,一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设计模式等方面。,杨芙清院士的观点,软件工程是应用计算机科学理论与技术以及工程管理原则与方法,按照预算与进度,实现满足用户要求的软件产品的定义、开发、发布和维护的过程,或以之为研究对象的学科。,软件工程技术的发展的里程,软件工程技术的发展的里程,60年代,手工作坊方式是主流; 70年代,结构化分析与设计方法; 80年代,开始研制CASE(Computer-Aided S
18、oftware Engineering)工具与环境,面向对象方法开始流行; 90年代,软件复用技术与构件技术受到关注。,我国软件工程的发展历程,我国软件产业存在的问题,基础软件所占分额小,在产业中的基石作用未能凸显; 缺乏具有国际竟争力的跨国软件企业; 软件人才结构性矛盾突出; 美国软件业占全球40%,人才240万; 日本软件业占全球10%,人才120万; 中国软件业占全球5.9%,人才50万;,软件工程的本质特性,软件工程关注大型程序的构造; 软件工程的中心课题是控制复杂性; 软件经常变化; 开发软件的效率非常重要; 和谐地合作是开发软件的关键; 软件必须有效地支持它的用户; 软件工程中由一
19、种文化背景的人替另一种文化背景的人创造产品。,软件工程的7条基本原理,用分阶段的生命周期计划严格管理; 坚持进行阶段评审; 实行严格的产品控制; 采用现代程序设计技术; 结果应能清楚审查; 开发小组的人员应该少而精; 承认不断改进软件工程实践的必要性;,软件工程研究什么?,软件工程方法学 软件工程过程 软件工程工具和环境 软件工程管理,软件开发技术,软件工程经济学和软件管理学,软件工程方法学,传统方法学 面向对象方法学 目前流行的方法: 重量级:ISO9000,CMM和RUP 轻量级:极限编程(Extreme Programming XP)和敏捷流程(Agile Process),强调以过程为
20、中心,强调以人为中心,软件工程过程-软件生命期,软件有一个孕育、诞生、成长、成熟、衰亡的生存过程。这个过程即为计算机软件的生存期 软件生存期的六个步骤,即可行性研究与计划、需求分析、总体设计、详细设计、实现、测试及使用维护,可行性研究与计划,确定要开发软件系统的总目标 给出功能、性能、可靠性以及接口等方面的要求 完成该软件任务的可行性研究,估计可利用的资源 (硬件,软件,人力等)、成本、效益、开发进度 制定出完成开发任务的实施计划,连同可行性研究报告,提交管理部门审查,可行性研究与计划,需求分析,对用户提出的要求进行分析并给出详细的定义 编写软件需求说明书或系统功能说明书及初步的系统用户手册
21、提交管理机构评审,软件设计,总体设计 把各项需求转换成软件的体系结构。结构中每一组成部分都是意义明确的模块,每个模块都和某些需求相对应 详细设计 对每个模块要完成的工作进行具体的描述,为源程序编写打下基础 编写设计说明书,提交评审。,实 现,把软件设计转换成计算机可以接受的程序代码,即写成以某一种特定程序设计语言表示的“源程序清单” 写出的程序应当是结构良好、清晰易读的,且与设计相一致的 并对单元模块进行测试,测 试,集成测试,将已测试过的模块按一定顺序组装起来 按规定的各项需求,逐项进行确认测试,决定已开发的软件是否合格,能否交付用户使用,运行维护,改正性维护 运行中发现了软件中的错误需要修
22、正 适应性维护 为了适应变化了的软件工作环境,需做适当变更 完善性维护 为了增强软件的功能需做变更,软件生存期模型(核心内容),软件生存期模型是跨越整个生存期的系统开发、运作和维护所实施的全部过程、活动和任务的结构框架瀑布模型演化模型原型模型螺旋模型增量模型喷泉模型,缺乏灵活性,可行性研究与计划,需求分析,设计,编码,运行维护,测试,定义 阶段,开 发 阶 段,维护阶段,瀑布模型(Waterfall Model),温斯顿罗伊斯上个世纪70年代提出,瀑布模型开发软件的特点,1.阶段间具有顺序性和依赖性。 2.推迟实现的观点。 3.每个阶段必须完成规定的文档;每个阶段结束前完成文档审查,及早改正错
23、误。,瀑布模型的优点,软件生命周期模型,使软件开发过程可以在分析、设计、编码、测试和维护的框架下进行; 软件开发过程具有系统性、可控性,克服了软件开发的随意性 。,瀑布模型的缺点,项目开始阶段用户很难精确的提出产品需求,由于技术进步,用户对系统深入的理解,修改需求十分普遍。项目开发晚期才能得到程序的运行版本,这时修改软件需求和开发中的错误代价很大。采用线性模型组织项目开发经常发生开发小组人员“堵塞状态”,特别是项目的开始和结束。,演化模型,在项目开发的初始阶段人们对软件的需求认识常常不够清晰,使得开发项目难于做到一次开发成功,出现返工再开发在所难免 第一次只是试验开发,其目标只是在于探索可行性
24、,弄清软件需求 第二次则在此基础上获得较为满意的软件产品,通过原型克服瀑布模型的缺点,原型模型(快速原型模型),原型范型,用户测试 运行原型,建造/修改原型,听取用户意见,原型模型(快速原型模型),原型模型的优点,原型模型支持软件需求开发,帮助用户和开发人员理解需求,是软件需求工程的关键。它产生的正式需求文挡,是软件开发的基础。如果开发的原型是可运行的,它的若干高质量的程序片段和开发工具可用于工作程序的开发。原型的开发和评审是系统分析员和用户/客户共同参予的迭代过程,每个迭代循环都是线性过程。,可复用,原型模型的缺点,对于大型软件项目,原型模型需要足够的人力资源以建立足够的原型组。 原型模型要
25、求开发者和客户在一段时间内共同完成原型系统的开发,如果任何一方没有实现承诺,会导致原型开发的失败。 如果系统难以模块化,建造原型所需构件就有问题;如果高性能是一个指标,原型模型也可能不奏效。 原型模型不适合采用很多新技术的项目,WHY?,螺旋模型(Boehm模型),螺旋模型沿着螺线旋转,在四个象限上分别表达四个方面的活动. 制定计划确定软件目标,选定实施方案,弄清项目开发的限制 风险分析分析所选方案,考虑如何识别和消除风险 实施工程实施软件开发 客户评估评价开发工作,提出修正建议,螺旋模型,螺旋模型的使用,软件工程项目从螺旋中心开始启动,沿顺时针方向前进。第一圈 产生产品规格说明;第二圈 产生
26、一个用于开发的原型;第三圈 产生软件产品的初始版本;第四圈 产生软件产品比较完善的新版本。,螺旋模型的优点,符合人们认识现实世界和软件开发的客覌规律; 支持软件整个生命周期; 保持瀑布模型的系统性、阶段性; 利用原型评估降低开发风险; 开发者和用户共同参予软件开发,尽早发现软件中的错误; 不断推出和完善软件版本,有助于需求变化,获取用户需求,加强对需求的理解。,增量模型,增量模型即渐增模型,使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试。 每个构件由多个相互作用的模块构成,并且能够完成特定的功能。 第1个增量构件实现软件的基本需求,提供最核心的功能。 第2个增量
27、构件提供更完善的编辑和文档生成功能; 第3个增量构件实现拼写和语法检查功能; 第4个增量构件完成高级的页面排版功能。,增量模型,增量模型,把软件产品分解成增量构件时,应该使构件的规模适中。 分解时必须遵守的约束条件是:当把新构件集成到现有软件中时,所形成的产品必须是可测试的。 瀑布模型或快速原型模型的目标是一次就把一个满足需求的产品提交给用户。 增量模型分批地向用户提交产品,开发人员逐个构件地向用户提交产品。,增量模型,增量模型的另一个优点是,逐步增加产品功能可以使用户有较充裕的时间学习和适应新产品。 使用增量模型的困难是系统的软件结构必须是开放式的。 从长远观点看,具有开放结构的软件拥有真正
28、的优势,这样的软件的可维护性明显好于封闭结构的软件。,增量模型,尽管采用增量模型比采用瀑布模型和快速原型模型需要更精心的设计,但在设计阶段多付出的劳动将在维护阶段获得回报。 如果一个设计非常灵活而且足够开放,足以支持增量模型,那么,这样的设计将允许在不破坏产品的情况下进行维护。,增量模型,使用这种方法将冒构件无法集成到一起的风险,除非密切地监控整个开发过程,否则整个工程可能毁于一旦。,喷泉模型,迭代重复演进 无间隙各阶段间无明显界限,喷泉模型,软件生存期模型选择的原则,需求明确,选择瀑布模型; 需求理解较差,需开发一个原型,选择演进模型; 软件开发有很大风险,选择螺旋模型; 软件开发各过程间相
29、互集成,选择喷泉模型。,软件工程工具及环境,项目管理工具:Project; 需求建模工具:Visio,PowerDesigner,Rational Rose; 程序开发工具:VC+,JAVA; 软件测试工具:Junit,WinRunner; 配置管理工具:VSS(Visual SourceSafe);,软件工程项目的基本目标,付出较低的开发成本 达到要求的软件功能 取得较好的软件性能 开发的软件易于移植 需要较低的维护费用 能按时完成开发工作,及时交付使用,软件工程的发展方向,敏捷开发:软件开发应当是能够对未来可能出现的变化和不确定性作出全面反应的。 CMM/TSP:提供了一系列的标准和策略来指导软件组织如何提升软件开发过程的质量、软件组织的能力。 AOP:面向方面的编程,方面指的是完成一个功能的对象和函数的集合。,什么是软件工程师?,创造软件的人们的总称,一种泛指。可以分为系统分析员、软件设计师、系统架构师、程序员、软件测试师。,非常短缺,几个网站,http:/ http:/ http:/ http:/ http:/ http:/ http:/,几个网站,http:/ http:/ http:/ http:/ http:/ http:/