1.1 软件及其特性
世界上第一个写软件的人是阿达(Augusta Ada Lovelace)。他在19世纪60年代尝试为巴贝奇(Charles Babbage)的机械式计算机编写软件。尽管限于当时的制造条件,巴贝奇最终没有造成理想中的计算机,但巴贝奇和阿达对后来计算机技术的诞生和发展同样产生了深远的影响,他们的名字永远载入了计算机发展的史册。
在20世纪中叶,软件伴随着第一台电子计算机的问世而诞生。以编写软件为职业的人也开始出现,他们多是经过训练的数学家和电子工程师。20世纪60年代,美国大学里开始出现授予计算机专业的学位,教学生如何编写软件。软件产业从零开始起步,在短短的50多年的时间里迅速发展成为推动人类社会发展的龙头产业,并造就了一批百万、亿万富翁。随着信息产业的发展,软件对人类社会越来越重要。
现在的世界正在进入一个“软件无处不在”的时代,我们每天的生活,时刻都离不开这样或那样的软件。软件(software)是计算机系统中与硬件(hardware)相互依存的另一部分,它包括程序(program)、相关数据(data)及其说明文档(document)。其中,程序是按照事先设计的功能和性能要求执行的指令序列,数据是程序能正常操纵信息的数据结构,文档是与程序开发维护和使用有关的各种图文资料。
Fred Brooks教授,是软件工程领域非常有影响力的人物。他曾经担任IBM OS360系统的项目经理,在计算机体系结构、操作系统以及软件工程方面做出了杰出的贡献,并因此于1999年获得了图灵奖。
Brooks教授在1987年发表了一篇题为“没有银弹(No Silver Bullet)”的文章。在这篇文章中他指出:“软件具有复杂性、一致性、可变性和不可见性等固有的内在特性,这是造成软件开发困难的根本原因。”
(1)软件的复杂性。软件是复杂的,是人类思维和智能的一种延伸,它比任何以往人类的创造物都要复杂得多。今天,我们已经进入云计算时代。在互联网的集群环境下,系统规模更大更复杂,可以说,软件是人类有史以来生产的复杂度最高的工业产品。这种复杂性,对软件工程师提出了很高的要求,给软件开发管理和质量保证带来了很多困难。
(2)软件的一致性。软件不能独立存在,需要依附于一定的环境(如硬件、网络以及其他软件)。因此,软件必须遵从人为的惯例并适应已有的技术和系统,随着接口的不同而改变。
(3)软件的可变性。软件经常会遭受到持续的变更压力。相对于建筑和飞机等工程制品来说,软件的变更似乎更加频繁,这也许是由于建筑和飞机修改成本太高所致。人们总是以为软件很容易修改,但是却忽视了修改带来的副作用。软件不断变化,每一次的修改都会造成故障率的升高,同时也可能给软件的结构带来破坏。尽管如此,成功的软件都是会发生演化的。软件的可变性,给开发带来了很多难题,但同时也给软件本身带来了生命力。
(4)软件的不可见性。软件是一种逻辑产品,看不见摸不着,它的客观存在不具有空间的形体特征,因此缺少合适的几何表达方式。这种不可见性,不仅限制了软件的设计过程,同时严重地阻碍了人与人之间的相互交流,从而对开发过程的管理造成很大困难。
综上所述,复杂性、一致性、可变性和不可见性,是软件的本质特性。这些特性,使得软件开发的过程变得难以控制,开发团队如同在焦油坑里挣扎的巨兽,挣扎得越猛烈,焦油纠缠得越紧,最后有可能沉没到坑底。因此,我们需要寻找解决问题的有效方法,以保证软件开发过程的高效、有序和可控。