一本软件工程的新书展示了一条旧术语——“软件危机(software crisis)”。作者充分表明,我们的程序员不能创造出我们需要的软件。他认为,我们的软件开发能力的进展落后于硬件。因此,软件成为过去十年中制约硬件发展潜力的瓶颈1。
但是,如果我们仔细思考软件危机的说法,很快就会发现,软件产业从一开始就遭遇困境。我们再次看到有人提出我们正处在危机状态的事实,不仅说明我们必须做更多的工作来改进软件开发,也说明我们实际上并没有正确理解这个产业。
软件危机的说法可以追溯到计算时代的开始。计算时代的最初几年(大致上是1952~1958年),很少有人明白程序员的性质,更鲜有人能预料到软件在计算产业的作用。德国计算机科学家鲍尔(F. L. Bauer)曾指出:“如果得知软件最终将占计算系统成本的一半,大多数人都将会感到十分惊讶。”没有人预见到软件会成为计算领域的主宰技术2。
中国的情况和美国与欧洲的如出一辙。中国科学院在编制第一个计算发展规划——《1956-1967年国家科学技术发展规划》时,非常注重制造计算机器,而不是这些机器上的编程。该规划提出的目标是,中国应该每年培养500~600名计算机制造方面的学生,以及10~25名程序设计和计算机技术方面的专业人才3。然而,与西方的计算机制造业一样,中国后来也意识到需要大量培养程序员和软件开发人员。
过去的软件危机
我们通常会把软件危机的说法和1965~1975年这一时期联系起来。在此期间,计算机的数量迅速增长,迫使有关公司重新审视如何开发软件。1965年以前,软件由用户负责。一家公司购买的计算机只配备最基本的软件,可能有极其简单的操作系统、汇编语言,也许还有编译程序,用来编译Cobol、Fortran或者当时问世不久的其他计算机语言。用户将使用这些工具开发他们自己的软件。
当时,商业领域很容易接受这种思想:每一位客户的需求都是与众不同的,每家公司都有自己独特的商业模式,而且这些模式都体现在软件上。此外,当时的计算环境也比今天更加错综复杂。在那时,每种计算机型号都是独一无二的,无法运行为其他机器编写的程序。无论哪种型号的计算机,都很少能卖到上千台。那个时期最受欢迎的计算机是IBM 1401,也只卖出了12000台。
1964年,随着所谓第三代计算机的推出,计算环境发生了翻天覆地的变化。这时的计算机配备了成熟的操作系统,与之前的那些计算机相比,操作更加简便。其中,IBM360系列影响最大。该系列计算机有5种型号,都可以运行相同的代码。其中最小的型号适用于微小企业,最大的型号适用于大型政府机构或者大公司。
第三代计算机导致了一场编程危机, 因为它们让计算机市场迅速膨胀,并且促使对程序员的需求激增。历史学家内森·恩斯门格(Nathan Ensmenger)曾写道:“20世纪50年代出现的‘程序设计支持缺口’,到50年代末被称为‘全面爆发的软件危机’。”当时的问题是,软件不能运行,不能按期完成,且其花费远远超出预算。
那时计算领域的文章疾呼要拯救这次危机,主张我们需要提升程序员的数量和质量,建议给程序员更好的培训,承认他们的重要性,并支付他们更高的薪水。工业化国家的确尝试了其中的某些想法。软件工程的基础实际上就直接产生于这个时期。然而,要真正解决软件危机,并不在于更好的培训或者更多的技术知识,尽管这两方面都有助于问题的解决,而在于一个没有人真正预想到的途径:创建软件产业。
软件产业把软件的研发成本分散到很多用户身上,这就意味着单个软件能够产生多个收入渠道,也意味着有充足的利润来聘请优秀的程序员,并对系统进行优良的设计。虽然这样做并没有解决软件危机的全部问题,但是基本解决了大部分问题,即使有些很小的不便利,用户也是可以接受的。到1980年,大多数人已经认可软件是一种产品,并且认为商业软件比他们自己开发的软件更好。
现在的软件危机
如果我们认同目前我们也正处于一场软件危机中,那么这次的危机或多或少与20世纪60年代的那次危机有所差异。与那时不同的是,我们有成熟的软件产业,强大的培养程序员的教育体系,以及成熟的软件工程领域。不过,我们的用户群大不相同了,或许这就是一个重要区别。根据一位评论员的说法,这个用户群是“数字原生代(digital natives)”,他们渴求“充分利用计算处理能力和不断增长的可用数据所带来的机遇”。他们诞生在技术世界中,对技术世界的需求也很多。
这个用户群不仅需求很多,他们也能做出很多贡献。他们易于接受技术,天生就了解数据、编程和编程逻辑等基本概念。他们具有前几代人所没有的大无畏精神。在我的学生中就有这样一些人。他们处理有难度的项目时,丝毫不担心对所需要的工具一无所知。尤其是我记得有一个学生,她解决的问题是,从一个很大的数据集合中抽取出具有数百万个观测值的数据集。她在互联网上发帖提问,查找代码资源库,循序渐进地学习需要做哪些事情。不到一个星期,她就获得了所需要的数据。她的能力出乎我们的意料,因为她就是一位“数字原生代”。
大多数有关目前软件危机的讨论都不免落入俗套。然而,切实可行的解决方案可能来自从新的视角看待软件,以及更好地认识到数字原生代这一软件用户群和是软件产业的一部分。
当今时代,我们常被问及如何不仅吸引那些乐于协助软件工作的人,还吸引那些不喜欢软件工作的人。我们认识到,软件不仅是来自核心供应商并提供给用户群的产品,实际上也是一个组织社区的工具,一个可以用来开发和维护软件的社区。正如我们所看到的,40年前在解决早期软件危机的过程中创建了软件产业,我们现在也正在寻求一种改变软件环境性质的简单思路。其解决方案很可能是一种我们已经尝试过但还未深入理解的简单想法。危机的本质就是如此。危机教给我们去思考自以为已经了解的世界的新的一面。
脚注:
1 最初发表于Fitzgerald,Brian, Software Crisis 2.0, Computer, 2012, 45(4):89-91, DOI: 10.1109/MC.2012.147。
2 Bauer, F. L., “Software and Software Engineering”, SIAM Review, Part 2, 1973, 15(2), 469-480。
3 中国科学院计算技术考察团工作总结, 见中国科学院联络局(1956年12月), “中科院出席苏联磁现象物理会议和组团考察计算技术”, 顺序号2, 中国科学院档案, 5624217。