软件在我们的生活中越来越多,各种软件都不相同,那软件都有哪些类型呢,有什么特殊性,那就为大家介绍软件的特殊性。在谈软件工程之前,不妨先来看看软件。软件是可以运行在计算机及电子设备中的指令和数据的有序集合。软件有各种形式:
系统软件:操作系统、设备驱动程序、工具软件等
应用软件:用户使用它们来完成工作,从管理核电厂到写文章,或者是通信、游戏、浏览网页、播放视频等
恶意软件:软件病毒等
软件和人类制造出来的其他产品相比,有许多共性,也有一些特殊性。随着人类社会的发展,技术的进步,一些事情总是变得越来越容易,例如旅行,现在人们旅行的方便程度和速度是几百年前所不可想象的。另一些事情,像怀孕生小孩,几千年来的确变得比较容易了,但还是需要大约九个月的时间。我们知道许多计算机硬件的能力大致以每两年提高一倍的速度发展8,而软件开发的流程却没有这样的提速过程,为什么?软件开发过程有什么特别的难题?学者们总结了下面五点:
1.复杂性(Complexity)
软件可以说是人类创造的最复杂的系统类型。大型软件(操作系统、办公软件、搜索引擎)有超过百万行的源代码,上万个不同的文件。而软件工程师通常一次只能看到30—80行源代码(相当于显示器的一屏),他们的智力、记忆力和常人差不多。软件的各个模块之间有各种显性或隐性的依赖关系,随着系统的成长和模块的增多,这些关系的数量往往以几何级数的速度增长。
2.不可见性(Invisibility)
软件工程师能直接看见源代码,但是源代码不是软件本身。软件以机器码的形式高速运行,甚至还可能在几个CPU核上同时运行,工程师是“看”不到自己的源代码是如何具体地在用户的机器上被执行的。程序出现了错误,工程师可以看到一些程序在出错的一瞬间留下的痕迹(错误代号、大致的目标代码位置、错误信息),但是几乎无法完整重现到底程序出现了什么问题。
3.易变性(Changeability)
软件看上去很容易修改,修改软件比修改硬件容易多了。人们自然地期待软件能在下面两种情况下“改变”:a)让软件做新的事情;b)让软件适应新的硬件。但是与此同时,正确地修改软件是一件很困难的事情。
4.服从性(Conformity)
软件不能独立存在,它总是要运行在硬件上面,它要服从系统中其他组成部分的要求,它还要服从用户的要求、行业系统的要求(例如银行利率的变化)。
5.非连续性(Discontinuity)
人们能比较容易地理解连续的系统:增加输入,就能看到相应输出的增加。但是许多软件系统却没有这样的特性,有时输入上很小的变化,会引起输出上极大的变化。
这些特性的前四个是佛瑞德·布鲁克斯(FredBrooksJr.)在NoSilverBullet一文中提到的10,第五个特性是瓦茨拉夫·拉里奇(VaclavRajlich)提到的。这些特性是由软件的本质所决定的,软件还有其他特性:
有许多不同的程序设计语言、软件工具和软件开发平台
存在许多不同的软件开发流程
软件团队中存在许多不同的角色
软件通常既可以存储在磁带上,也可以存储在CD/DVD上
但是这些非本质、临时的特性并不能决定软件工程的本质问题。例如,有人发明了一种新的程序设计语言,或者又出现了一个新的软件开发流程,或者网上出现了又一个程序员技术社区……这些事并不能改变软件工程的根本难度,这也是著名的“没有银弹(NoSilverBullet)”论断所阐述的道理。软件的这些本质特性让“做一个好软件”变得很难,同时也让软件工程有它独特的挑战和魅力。
上一篇:NET类型底层开发技术
下一篇:协同软件实施特点与过程