软件工程概述
说到软件工程,想必大家不是很熟悉,那么软件我想大家一定很熟悉的。想要了解什么是软件工程,我们就先要了解什么是软件。
软件可以说在我们的生活中无处不在,我们的生活现在也离不开软件。计算机软件的概念随着计算机技术的发展而发展。计算机发展初期,软件就是程序,也就是计算机可以识别的源代码或机器可直接执行的代码。随着计算机的发展,人们也渐渐认识的高质量的软件会使计算机系统的功能和效率大大提高,软件日益复杂,规模日益增大,人们开始认识到软件并不等于程序。全面地讲,软件由三部分组成,分别是:计算机程序、数据和软件文档。
那么下面我们来详细看一下这三大部分。
1.计算机程序,就是人们为了完成特定的功能而变质的一组指令集,由程序设计语言所描述的、能为计算机所识别、理解和处理的语句序列。目前程序设计语言主要有几种类型。面向机器:如汇编语言、机器语言等;面向过程:如Fortran,Pascal,C等等;面向对象:如Java等等;面向问题:如结构化查询语言SQL 等等。
2.数据,就是程序能处理的具有一定数据结构的信息。
3.软件文档,是与程序的开发、维护和使用有关的图文资料,记录软件开发活动和阶段性成果、理解软件所必须的阐述性资料需求分析文档、软件设计文档、用户文档等。编写文档有什么作用呢?第一可以促进对软件的开发,管理和维护;第二便于各种人员(用户,开发人员)的交流。
既然我们知道了什么是软件,那我们经常使用的软件有什么特点呢?与硬件相比,计算机软件具有以下一些特点。
1.软件是抽象的。计算机硬件是实物产品,具有明显的可见性。但是我们无法直接观察软件的物理形态,只能通过运行它来了解它的功能和特性。
2.软件无明显的制造过程。计算机硬件是实物产品,我们可以亲眼目睹它的整个生产过程,而软件却没有明显的制造过程,软件注重的是开发过程。
3.软件无磨损性。计算机硬件存在着磨损和老化现象,就像我们的课桌,我们的板凳都存在着磨损现象。但对于软件而言,它不存在磨损和老化,它会出现老化的状态,所以软件需要不定时的更新和维护。
4.软件对计算机硬件有依懒性。软件的开发和运行依赖于特定的计算机系统环境,一般产品是不会有的,为了减少这种依赖性,软件开发过程中提出了软件的可移植性。
5.软件还处于手工开发方式。人们在分析、设计、开发、测试软件产品的过程中,运用了大量的脑力劳动。
6.软件本身的复杂性,软件本身自带的一大特点,软件是需要更新和服务的。
7.软件的高成本。在开发一个软件的过程当中,在编写、测试、运行和广告推销方面,开发成本相当昂贵。
我们该如何给软件分类呢?
按功能分:
1.系統软件。操作系统就是最典型的系统软件,它负责管理系统的资源,并为上层软件的运行提供了必备的接口和条件。
2.支撑软件。我们常用的文本编辑器、绘图软件、数据库管理系统和CASE工具系统等都属于支撑软件。
3.应用软件。比如,地理信息系统软件、航空售票软件、教务管理系统软件和信息管理系统等。
计算机软件的组成按服务对象分:
1.通用软件。由特定的软件开发机构开发,面向市场公开销售的独立运行的软件系统,如操作系统、文档处理系统和图片处理系统等
2.定制软件。是面向特定的用户需求,由软件开发机构在合同的约束下开发的软件,如为企业定制的办公系统、交通管理系统和飞机导航系统等。
按工作方式分:计算机软件还可以划分为实时软件、分时软件、交互式软件和批处理软件。
按软件产品规模分:计算机软件还可以划分为小型软件、中
型软件和大型软件。
这么多的软件横空出世,那么他们都成功了吗?我们以怎样一个标准来衡量软件是否成功呢?
软件成功的标准应当是用户在用,满足用户的需求,服务于社会。软件失败了也就意味着并没有满足用户的需求,在软件开发过程中出现了一系列的问题,我们把软件开发中出现的问题统称为软件危机,软件危机爆发于20世纪60年代中期。这里我们叙述两个经典案例。
案例一:美国IBM公司在1963年至1966年开大的IBM360机的操作系统。公约100万条指令,花费了5000个人,经费达数亿美元,错误多达2000个以上,系统根本无法正常运行。
这个项目的负责人F.D.Brooks事后总结了他在组织开发过程中的沉痛教训时说:“...正像一只逃亡的野兽落到泥潭中做垂死挣扎,越是挣扎,陷得越深。最后无法逃脱灭顶的灾难,......程序设计工作正像这样一个泥潭,......一批批程序员被迫在泥潭中拼命挣扎,......谁也没有料到竟会陷入这样的困境...”
案例二:美国银行1982年进入信托商业领域,并规划发展信托软件系统。项目原定预算2千万美元,开发时程9个月,预计1984年12月31日以前完成,后来至1987年3月都未能完成该系统,期间已投入6千万美元。美国银行最终因为此系统不稳定而不得不放弃,并将340亿美元的信托账户转移出去,并失
去了6亿美元的信托生意商机。
可见软件危机的存在是极其重要的。那么软件危机有两个方面:第一如何开发软件,以满足不断增长,日趋复杂的需求。第二如何维护数量不断膨胀的软件产品。那么我们如何解决软件危机呢?人们逐渐认识到了软件的特性和软件产品开发的内在规律,并尝试用工程化的思想去指导软件开发,于是软件工程诞生了。
软件工程一直以来都缺乏一个统一的定义。1968年首次提出软件工程的概念,并将其定义为“为了经济地获得可靠的和能在实际机器上高效运行的软件,而建立和使用的健全的工程规则”。这个定义肯定了工程化思想在软件工程中的重要性,但是并没有提到软件产品的特殊性。
IEEE在软件工程术语汇编中的定义:软件工程是1.将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即工程化应用到软件上;2.对1中所述方法的研究。
比较认可的一种定义为:软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件。以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
软件工程的提出是为了解决软件危机所带来的各种弊端。那么软件工程是如何发展起来的呢?
软件开发经历了程序设计阶段、软件设计阶段和软件工程阶