1.1 软件工程的发展历史
1.1.1 第一台计算机和第一位程序员
世界上公认的第一台电子计算机是ENIAC(埃尼亚克),它问世于1946年2月14日,全称是“电子数值积分计算机”,英文名为“Electronic Numerical Integrator and Computer”,它是由美国宾夕法尼亚大学莫尔电子工程学院的莫尔小组承担研制的(见图1-1)。
图1-1 世界上第一台电子计算机ENIAC
但是,世界上首位程序员的出现却远远早于第一台电子计算机,并且这个第一位程序员是位女士。她的名字叫Augusta Ada Love Lace,1815年生于伦敦(见图1-2)。Ada设计了巴贝奇分析机上求解伯努利方程的一个程序,并证明了巴贝奇的分析器可以求解许多问题。在1843年Ada发表的一篇论文里面提出机器可以用来创作音乐、制图以及进行科学研究。同时,Ada还提出了循环和子程序等计算机的重要概念,为计算设计了“算法”,并创作出了“程序设计流程图”。因此,Ada被广泛地认为是世界上第一位程序员。为了纪念她,1980年12月10日,一种新的计算机编程语言以她的名字命名,那就是Ada。Ada曾广泛用于美国军方尖端武器开发中。
图1-2 世界上第一位程序员 Augusta Ada Love Lace
1.1.2 软件的发展和软件危机
20世纪50年代,伴随着第一台电子计算机的问世,编程语言开始出现,相应地,计算机软件诞生了,以写软件为职业的人也逐渐开始出现,他们是真正意义上的程序员。最开始,这些程序员大多是一些有经验和经过训练的电子工程师甚至是数学家。
在计算机发展的初期(20世纪60年代中期以前),计算机主要用于军事领域,后来才慢慢普及到民用领域。那时候硬件作用十分单一,通常只能用来执行一个程序。当时的计算机硬件也非常昂贵,编程人员必须在有限的处理器性能和极小的储存空间限制下,编写出执行速度快、占用空间小的程序,因而程序的编写充满了各种技巧,又带有个人色彩。当时的软件开发主要依赖程序员的聪明才智,同时,软件除了源代码以外,几乎没有文档等附属产品。软件的开发没有什么系统的方法。
20世纪60年代到70年代,计算机领域进入了比较快速的发展时期,正是在这一时期,软件从军用扩展到了民用,并作为一种广泛存在的产品为人们所接受。这个时期的一个重要特征是出现了“软件作坊”。但是,“软件作坊”采用的仍然是早期的个体软件开发的方式,几乎没有团队的协调与沟通。随着软件需求量的急剧增长,软件的需求也日益复杂,个体化开发的方式越来越难以满足社会的需求。复杂的软件也带来了大量的维护问题,然而许多程序的个体化特征使得它们最终成为不可维护的。随着计算机应用的日益普及,软件数量急剧上升,失败的软件项目也开始层出不穷,这一现象引起了普遍的关注,因而出现了“软件危机”这一说法。1968年北大西洋公约组织的计算机科学家在联邦德国召开学术会议,正是在这次会议上,“软件危机”第一次正式提出。
下面介绍5起历史上著名的软件灾难:
1)水手号(Mariner)的致命BUG(1962年)
损失:1850万美元
携带空间探测器的水手1号(The Mariner1)火箭前往金星,在起飞后不久就偏离了预定航线。任务控制系统不得不在起飞293秒后摧毁了火箭。原因是一名程序员把一条手写的公式编写为错误的计算机代码,其中漏了一个横杠上标。少了横杠指明的平滑函数,软件就把速率的正规变分视为严重的错误,并对该错误进行了修正,从而将火箭引导偏离了航向。
2)哈特福德体育场倒塌事件(1978年)
损失:7000万美元,以及给当地经济造成的2000万美元损失
当成千上万的球迷离开哈特福德体育场几个小时后,钢结构的体育场屋顶就被湿雪压垮了。原因是CAD软件的程序员在设计体育场时错误地假设钢结构屋顶的支撑仅承受纯压力。但当其中的一个支撑意外地因大雪垮塌后,引发了连锁反应,导致屋顶的其余部分像多米诺骨牌一样相继倒掉。
3)苏联天然气管道爆炸(1982年)
损失:数百万美元,并严重破坏了苏联经济
控制软件出故障造成跨西伯利亚输气管道压力急剧上升,导致了历史上最大的人为非核爆炸。据说,CIA侦探在苏联购买的用于控制输气管道的系统内植入了一个BUG。
4)几乎引发第三次世界大战的导弹误报事件(1983年)
损失:将近全人类的毁灭
苏联预警系统误报美国发射了5枚弹道导弹。幸运的是,苏联的执勤官认为如果美国真的要攻击苏联的话,发射的导弹肯定不止5枚,因此他把这次攻击报告界定为一次误报。误报的原因是苏联预警系统中有一个BUG,该系统误将阳光反射云顶识别为导弹。
5)医疗器械致死案(1985年)
损失:死亡3人,严重受伤3人
加拿大的Therac-25放射治疗仪发生了故障,令病人受到了致命的辐射。原因是软件中一个称为竞态条件(race condition)的细小BUG,一名技术人员可能在病人尚未进行适当防护的情况下意外地将Therac-25配置为高能模式。
在http://www.devtopics.com/20famous-software-disasters/上可以找到更多这样的例子。软件危机的出现,让人们对软件的开发有了更深入的研究和更多的反思,并开始改变对软件的一些不正确看法。易懂、易用、易修改、易维护等软件工程提倡的理念逐渐被大众所接受。
1.1.3 软件工程的提出
在1968年北大西洋公约组织的计算机科学家的会议上集中讨论了如何应对“软件危机”,在这次会议上,第一次提出了“软件工程”。
“软件工程”是一门研究系统、规范、合理化软件开发的学科。软件工程运用工程学的原则和方法重新制订了软件开发的流程和方案。具体来说,软件工程涉及两大方面主要内容,首先是软件开发的技术,其次是软件开发的管理。这二者缺一不可。其中软件开发技术主要包括了软件开发方法、工具、环境等,软件开发管理则包括了软件开发周期管理、开发人员管理、进度管理等内容。
软件工程发展至今,大致可以分为结构化软件工程(也称为传统软件工程)和面向对象软件工程(也称为现代软件工程)。结构化软件工程围绕功能、数据和数据流展开分析和设计,以模块为中心,自顶向下、逐步求精完成软件设计,系统是实现模块功能的函数和过程的集合。而面向对象软件工程则以对象为核心,通过识别系统中的类,定义对象之间的交互,考虑类的代码实现从而完成系统分析和设计。
然而,软件工程目前依然不够成熟。不同的人对软件开发持有不同的观点,如以C.A.R.Hore为代表的数学观,以Bertrand Meyer为代表的工程观,以Ivar Jacobson为代表的建模观等。而在现实生活中,许多程序员还认为软件开发是个手工艺活,还有一些人甚至把软件开发看作是一门“艺术”——不同的人发挥自己的创造力写出迥然不同的代码。因而,要使得软件开发逐步成熟,要大力传播软件工程的思想,同时软件工程自身还需要不断发展完善。