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