,实用软件工程,
计算机科学与工程系
沈 洁
绪 言
在 1946年美国研制成功第一台高速电子数
字计算机 ENIAC问世之前,计算机器的发展经历
了一个漫长的阶段。根据计算机器的特点可以
将其划分为 3个时代算盘时代机械时代和机电时
代 。
?算盘时代
?机械时代
?机电时代
计算机硬件的历史
计算机史前史 1946年以前的世界 。现代计算机的历史
可以追溯到 1943年英国研制的巨人计算机和同年美国哈佛大
学研制的 Mark I今天计算机已经历了四代并得到了迅猛地发
展 。
? 第一代计算机( 1946年~ 1957年)(真空管)
? 第二代计算机( 1958年~ 1964年)(晶体管)
? 第三代计算机( 1965年~ 1971年)(硅半导体)
? 第四代计算机( 1972年至今 )(大规模 LSI和超大规
模 VLSI集成电路)
新一代计算机
随着第四代计算机向智能化方向发展,最终将导致新一
代计算机的出现。新一代计算机的研制是各国计算机界研
究的热点,如知识信息处理系统 (KIPS)、神经网络计算机、
生物计算机等,知识信息处理系统是从外部功能方面模拟
人脑的思维方式,使计算机具有人的某些智能,如学习和
推理的能力,神经网络计算机则从内部结构上模拟人脑神
经系统,其特点是具有大规模的分布并行处理自适应和高
度容错的能力,生物计算机是使用以人工合成的蛋白质分
子为主要材料制成的生物芯片的计算机,生物计算机具有
生物体的某些机能,如自我调节和再生能力等。
计算机软件的历史
软件是由计算机程序和程序设计的概念发展演化而来的。
是程序和程序设计发展到规模化和商品化后,所逐渐形成的
概念。软件是程序以及程序实现和维护程序时所必须的文档
的总称。
?第一位程序员
?布尔逻辑与程序设
?计算机软件产业的发展
19世纪初在法国人约瑟夫雅各 Joseph Marie Jaquard设
计的织布机里已经具有了初步的程序设计的思想,他设计的
织机能够通过读取穿孔卡上的信息完成预先确定的任务,可
以用于复杂图案的编织。早期利用计算机器解决问题的一般
过程是
? 针对特定的问题制造解决该问题的机器
? 设计所需的指令并把完成该指令的代码序列传送到卡片
或机械辅助部件上
? 使计算机器运转执行预定的操作
英国著名诗人拜伦 Byron的女儿、数学家爱达奥古斯塔
拉夫拉斯伯爵夫人 Ada Augusta Lovelace,在帮助巴贝奇研
究分析机时指出分析机可以像织布机一样进行编程,并发现
进行程序设计和编程的基本要素,被认为是有史以来的第一
位程序员。而著名的计算机语言 Ada就是以她的名字命名的。
在计算机的发展史上,二值逻辑和布尔代数的使用,是一
个重要的突破。其理论基础是由英国数学家布尔奠定的,1847
年布尔在逻辑的数学分析 The Mathematical Analysis of
Logic中分析了数学和逻辑之间的关系并阐述了逻辑归于数学
的思想。这在数学发展史上是一个了不起的成就,也是思维的
一大进步并为现代计算机提供了重要的理论准备,遗憾的是布
尔的理论直到 100年之后才被用于计算。
在此期间,程序设计随硬件的发展,其形式也不断发展。
在基于继电器的计算机器时代所谓, 程序设计,,实际上就是
设臵继电器开关以及根据要求使用电线,把所需的逻辑单元相
连重新设计程序,就意味着重新连线,所以通常的情况是, 设
臵程序, 花了许多天时间,而计算本身则几分钟就可以完成。
此后,随着真空管计算机和晶体管计算机的出现,程序设
计的形式有不同程度的改变,但革命性的变革则是 1948年,香
农重新发现了二值演算之后,发生的二值逻辑代数,被引入程
序设计过程。程序的表现形式就是存储在不同信息载体上的 0
和 1的序列。
这些载体包括纸带穿孔卡氢延迟线以及后来的磁鼓磁盘和
光盘。此后,计算机程序设计进入了一个崭新的发展阶段,就
程序设计语言来讲,经历了机器语言、汇编语言、高级语言、
非过程语言等 4个阶段,第 5代自然语言的研究也已经成为学术
研究的热点。
计算机软件的发展与计算机软件产业化的进程息息相关,
在电子计算机诞生之初,计算机程序是作为解决特定问题的工
具和信息分析工具而存在的,并不是一个独立的产业。计算机
软件产业化是在 20世纪 50年代,随着计算机在商业应用中的迅
猛增长而发生的,这种增长直接导致了社会对程序设计人员需
求的增长,于是一部分具有计算机程序设计经验的人,分离出
来专门从事程序设计工作,并创建了他们自己的程序设计服务
公司,根据用户的订单提供相应的程序设计服务。这样就产生
了第一批软件公司。
如 1955年由 Elmer Kubie和 John W,Sheldon创建的计算机
使用公司( CUC)和 1959年创建的应用数据研究( ADR)公司等。
进入 20世纪 60和 70年代,计算机的应用范围持续快速增长,使
计算机软件产业无论是软件公司的数量还是产业的规模都有了
更大的发展。
同时与软件业相关的各种制度也逐步建立 1968年
Martin Goetz 获得了世界上第一个软件专利 1969年春
ADR公司就 IBM垄断软件产业提出了诉讼促使 IBM在 1969年
6月 30日宣布结束一些软件和硬件的捆绑销售为软件产品
单独定价这一时期成立的软件公司有美国计算机公司
CCAInformation Builder公司和 Oracle 公司等
关于计算机科学的讨论
我们通常说的计算机科学与技术,可以分为两类:
一类是计算机科学,研究计算机理论的学科;另一类
是计算机技术,属应用类、工程类的。
今天,人们将计算机学科分为类:
计算机科学
计算机工程
软件工程
信息技术
信息系统
… 末来学科的教程
什么是计算机科学呢?这个问题计算机界
一直在讨论、论证,从 1991年到 2001年,直至
今天仍然在讨论。
虽然计算学科源于欧美诞生于 20世纪 40年
代初,计算学科的理论基础可以说在第一台现
代电子计算机出现以前就已经建立起来了,20
世纪 40年代数字计算机产生后,促进了计算机
设计、程序设计以及计算机理论等领域的发展。
但要成为一门学科,必须满足一定的条件。
中科院工程院士李国杰教授曾经说过,与其称, 计算机科学,,不如说
,信息科学, 比较好。计算机只能作为工具,他以钢琴为例,100年前的钢琴
与现在相比,结构上并没有进步,但其生命力还是如此的强,主要是由于作曲
家和表演家赋予了它生命力。计算机作为一个处理信息的工具,是网络和软件
赋予它生命力。
正由于有了网络的出现,在上世纪末,
把计算机的普及和应用,掀起了一个高潮。
网络为计算机的生存提供了一个环境。他预
测互联网的第三次高潮将会在 2004年出现。
也由于有处理信息的软件,才显得计算
机有用。而软件是什么?它要靠思想、靠智
慧去设计,用计算机语言来实现。软件为计
算机的生存赋予了活力。
软件工程是什么?
软件工程涉及到为高效率地构建满足客户需求
的软件系统所需的理论、知识和实践的应用。是
指导开发软件的工程性的课程。
软件工程适合用于各类软件系统的开发,它包
含需求分析的规约、设计、构建、测试、运行和
维护等软件系统生存周期的所有阶段。
软件工程使用工程方法、技术和度量,
它使用管理软件开发的工具、软件制品的分
析和建模工具、质量评估与控制工具、确保
有条不紊且有控制地实施软件深化和复用的
工具。
软件工程课程的特点:
1、计算机学科知识的一个整合(画龙点晴),
充分体现了学科知识之间的相互协调、相互支撑、
相互促进;
2、是计算机学科中的一个方法论课程,软件
开发的思维能力(抽象思维与逻辑思维);
3、工程,是计算机科学与计算机工程的桥梁;
4、创造性;
5、软件工程管理的载体是文档,文档在软件
工程中占相当重要的地位。
本课程的学习特点:
1、课听得轻松;
2、课讲得艰难;
3、考试考得痛苦。
学习本课程的要求:
1、多看参考书;
2、考试以课堂讲的内容为主;
3、做好每次作业。
第一章 软件与软件危机
1946年,人类第一台电子计算机的问世,标志
着人类开始从工业社会向信息社会迈进,因此,
人类认识自身生存空间的能力逐步提高,同时计
算机系统的发展更是日新月异。虽然, 计算机不
是科学,信息才是科学, 这个结论不太容易让人
接受,但是信息产业的快速发展就在于信息逐渐
成为人类的主要消费资源,信息作为科学势在必
行,计算机仅仅是作为处理信息的工具而存在,
赋于计算机生命力的是软件,而软件是处理信息
的算法、思想。
第一节 软件的发展历程
第二节 软件的概念和特点
第三节 软件危机
第一章 软件与软件危机
第一节 软件的发展历程
? 程序设计的原始时代( 50年代)
? 基本软件时代( 50年代末~ 60年代末)
? 程序设计方法时代( 60年代末~ 70年代中)
? 软件工程时代( 70年代中~今) 。
是软件发展的早期时代,这个时代的软件是为
某个具体应用而专门编写的。
软件特征是只有程序、程序设计概念,不重视程
序设计方法。
程序设计的原始时代( 50年代)
特点:
? 使用的工具是机器语言和汇编语言,它们是面
向机器的;
? 开发方法追求编程技巧、追求程序运行效率,
使得程序难读、难懂、难修改;
? 生产方式是个体劳动式的,大多数人认为软件
开发是无需计划的事情,编程者和使用者往往
是同一个人(同一组人),程序的规模小,程
序编写较容易。
? 对软件开发工作没有管理,这种个体化的软件
开发环境,使得软件开发只是某些人头脑中隐
含进行的一个模糊过程,除了程序清单以外没
有任何文档资料,是一个不可视的过程。
特点:不再直接用机器码编程了,使用各种符号
语言来编程,如高级语言( BASIC,FORTRAN,ALGOL、
COBOL),高级语言程序设计比较接近人的习惯,人
们不必考虑计算机内部的构造和不同机器的特点,只
要考虑解题步骤,写出的程序经过编译,翻译成机器
能执行的机器指令,计算机就能执行。
这个阶段,计算机应用范围大大扩大,计算机大
规模进入工商业、银行业等领域。有了操作系统
( IBM公司用了 6000人 ·年开发了操作系统 OS360,费
用高达 1亿美元。),有了编译技术。
这时编程的目的不是关心计算机硬件的动作,而
是要确定程序人员定义的动作序列,程序员控制的动
作粒度可大大增加。
基本软件时代( 50年代末~ 60年代末)
这个时代的开发方法可以用, 功能性程序设计, 来表
达其开发技术的特点。针对特定的问题,根据所需的功能,
制定特定的方法,甚至要考虑是否需要特定的机器去解决
该问题。
其编程毫无章法,类似于智力游戏,主要依赖于编程
人员的才智与技巧,缺乏软件开发技术方法与理论。因此,
编程的随意性很大,一个人写的程序另一个人很难看懂或
理解。
这种完全靠个人想象力构造的系统,其中所产生的问
题就很难解决,在这个时代产生了, 软件危机, 。
基本软件时代( 50年代末~ 60年代末)
程序设计方法时代( 60年代末~ 70年代中)
为了解决, 软件危机,,不少软件工作者要求
提高程序的可读性、可理解性,而不再强调编程技
巧。
著名荷兰计算机科学家图灵奖获得者戴克斯特
拉( E,W.Dijkstra)教授提出:不应简单地只考
虑编写程序,就期望产生一个正确的结果,而应考
虑如何把软件进行划分及构造。他在编写操作系统
时提出了分层次结构、取消 GOTO语句以及结构化程
序设计方法。
Jacopini等人证明了一个重要的, 程序
结构定理,,只要, 顺序,,, 选择, 与
,循环, 三种基本控制结构就可以实现任
何单入口、单出口程序。这就产生了结构
化程序设计的方法,即只要用三种控制结
构的高级程序设计语言以及只有一个入口
和一个出口的程序设计原则的新的程序设
计思想、方法和风格,使程序变得清晰、
易读、易修改。
“程序设计=数据结构+算法, 总结了这个时代程
序设计的特征与成就。在这个时代软件开发技术主要
有两大发展:
第一是从程序中分离出数据结构与算法;
第二是把结构化程序设计方法发展成结构化开发
方法(包括结构化分析与结构化设计方法)。
在这个时代发展了各种程序设计语言,如 Pascal
(不用 GOTO语句),Smalltalk(面向对象语言 )、
Prolog(逻辑语言 )。。
形成了系统软件与应用软件的区别,形成了完整
的软件系统(不仅是可执行系统,还有独立的数据状
态和程序系统的规格说明书)
软件工程时代( 70年代中~今)
面对复杂的、大型的软件开发,不再仅仅是程序
设计的事,出现了, 软件工程, 的思想。
如 B.W.Boehm在 1976年对软件工程定义时所说
,在软件(包括程序和文档)设计、实现、测试、运
行、维护的各个过程中,建立在科学基础上的一套实
用方法。, C.A.Hoare则认为软件工程是, 一种导致
电子数字计算机具有强大功能的艺术,这种功能表现
为人可以方便地使用计算机, 。
这个时代软件的生产方式是工程化的生产,使用
数据库、开发工具、开发环境、网络、分布式、面向
对象技术来开发软件。其中最重要的理论成就是关系
数据库的理论。
在这个时代虽然软件开发技术有很大进
步,但是未能获得突破性进展,软件价
格不断上升,没有完全摆脱软件危机。
软件不是自然规律的物质,是人类思
维的创造物,有待理论的创新和不断实践。
第二节 软件的概念和特点
?,程序, 是指当运行时能够提供所要求功能和性能的
指令的集合;
?, 文档, 是描述有关计算机程序功能、设计、编制、
使用的文字或图形资料。
? 数据是指使程序能较好地处理信息的数据结构。
一、软件定义
计算机软件可定义为计算机程序、文档和数据的完
整集合。
二、软件的特点
软件是一种特殊的产品,它与硬件及人一起构成完
整的计算机系统,它们是相互依存的,缺一不可的。
它具有下列一些特点:
1.软件是一种逻辑产品。
2.软件生产方式不同于硬件。
3.软件产品不会用坏,不存在磨损、消耗等问题。
4.软件产品的生产主要是脑力劳动。
5.要求不同于硬件,硬件允许误差,软件不允许。
6.维护不同于硬件。
三、软件的分类
软件的分类方法很多,如按其功能进行划分,可分
为如下几类:
1,系统软件 能与计算机硬件紧密配合,使计算机系
统的各个部件和相关的软件协调、高效地工作的软件。
如操作系统、数据库管理系统等。
2,支撑软件 协助用户开发软件的工具性软件,包括
帮助程序人员开发软件产品的工具和帮助管理人员控
制开发进程的工具。
3,应用软件 在特定领域内开发,为特定目的服务的
软件。
? 按软件的规模进行划分,可分为:
微型、小型、中型、大型、超大型、极大型软件。
? 按软件的工作方式进行划分,可分为:
实时处理软件、分时处理软件、交互式软件、批
处理软件等。
? 按软件的服务对象的范围进行划分,可分为:
项目软件、产品软件等。
四、软件的生命周期
软件生命周期定义为软件的生产、使用和消亡过
程称为软件的生命周期。
即是从软件问题的提出,直到软件的停止使用这
样整个过程。
软件生命周期是由软件定义、软件开发和软件运
行三个阶段组成。把整个生存周期划分为若干阶段,
使得每个阶段有明确的任务,把规模大、结构复杂和
管理复杂的软件开发变得容易控制和管理。
每个阶段根据开发模式的不同又有其不同形式的
内容。
1988年发布的 GB8566,计算机软件开发规
范, 中软件生存周期阶段的划分是基于, 瀑布
模型, 给出的。它把软件生存期划分为三阶段 8
个步骤。
软件定义
问题提出
可行性分析
需求分析
软件开发
总体设计
详细设计
编 码
测 试
软件运行,维护
在这个过程中,维护是一个很长的阶段,要
提高软件的使用价值,就得考虑如何延长软件的
使用期。因此,软件的可维护性是提高软件价值
的最重要指标。从软件的需求分析开始,就得研
究如何提高软件的可维护性。
软件生存周期是借用工程中产品生存周期的
概念而得来的。引入软件生存周期概念,对于软
件生产的管理、进度控制有着非常重要的意义,
可使软件生产有相应的模式、相应的流程,相应
的工序和步骤。
第三节 软件危机
由于计算机硬件技术的进步,计算机的运行
速度、容量和可靠性有了显著的提高,生产成本
有了显著下降,为计算机的广泛应用创造了条
件。 因而出现了一些复杂的、大型的软件开发
项目,虽然软件开发技术一直在发展,但始终不
能满足软件发展的要求。
一、软件危机
软件危机是指在计算机软件的开发和维护过程中
所出现的一系列严重的问题。这些问题因找不到解决
的办法,使之长期积累,形成了尖锐的矛盾,产生了
软件危机。
二、软件危机的表现
软件危机表现在很多方面,以下几个方面是比较
主要的、明显的表现。
? 软件需求增长得不到满足
? 软件生产高成本、价格昂贵
? 软件生产进度无法控制
? 软件需求定义不准确
? 软件质量不易保证
? 软件可维护性差
三、软件危机产生的原因
在软件开发和维护过程中出现的软件危机,
主要原因有两个方面:
一是与软件本身的特点有关,
二是与软件开发和维护的方法不正确有关。
不正确的方法,具体地有以下几点:
? 软件是逻辑部件,不是物理部件。
? 软件的规模越来越大,结构越来越复杂。
? 软件开发、维护管理困难。
? 软件开发技术落后。
? 生产方式落后。
? 开发工具落后,生产率提高缓慢。
四、缓解软件危机的途径
软件危机只有缓解,不可能解决,特别是在目
前这种硬件结构体系下开发的软件,其危机永远存
在,即使未来的新一代计算机系统问世后,那也会
产生新形式的软件危机。辩证的看,正是由于软件
危机的存在,才使得软件技术日益发展。所以人类
不可能彻底解决软件危机,只有想办法去缓解软件
危机,通过缓解软件危机的过程,来推动软件的发
展。
怎么来缓解软件危机?只有通过从事软件研究
的科技人员,不断的勤奋探索,推动软件的发展,
改进软件的开发方法、完善软件的开发工具,提高
软件的生产率。
针对软件的现状,采取什么措施来缓解软件危机
呢?从下列几方面来考虑缓解的途径:
1,更新观念。
2,应该不断地去发现、完善、推广使用在实践中总结
出来的开发软件的成功的技术和方法。
3,要开发更好的软件开发工具,提高软件的生产率。
综上所述,要缓解软件危机,既要有先进
的技术和方法,又需要高水平的组织管理措施。
而软件工程正是综合了管理和技术两方面,研
究如何更好地开发软件的一门新兴学科。所以,
就目前而言,软件工程是缓解软件危机的最好
途径。
习 题
1,计算机软件的特征是什么?与硬件相比有什么
区别?
2,软件危机产生的背景是什么?为什么会产生软
件危机?为什么软件危机只能缓解而不能消除?
3,什么是软件的生命周期?生命周期是如何划分
的?