O'Reilly发布过一张海报,标题为“TheHistory of Programming Languages”(编程语言的历史),看起来饶有趣味!
O'Reilly是一家具有深厚计算机专业背景的图书出版公司,出版了一系列Perl、Java、Python、C/C++、脚本语言、Web、数字媒体、系统管理、安全、数据库、Linux/Unix 、Macintosh/OSX 、Windows 、.NET 、开放源代码软件等不乏经典的技术类图书。——译者注
关于编程语言,如果追本溯源的话,你会发现其实我们已经走过了相当长的一段历程。
C语言大概与我的年龄相仿。Fortran有我父母那般年岁了。但在程序语言的世界里,不是还有其他小朋友吗?我们可以留意一下TIOBE公司提供的编程语言排行榜(2013年5月期):
TIOBE公司根据互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎以及Wikipedia、Amazon、YouTube等统计出了一个编程语言排行榜,以反映各种编程语言的热门程度。这个排行榜每月更新一次,对世界范围内编程语言的走势具有重要的参考意义。——译者注
我们很容易就能发现许多最新的、最时髦的、尚处于幼年时期的编程语言:
显而易见,Ruby已经20出头了!而JavaScript也才10几岁……
在现代编程语言诞生的年代里,有几本图书的出版值得大家的注意——它们代表着现代软件开发领域的最新思想:
在软件工程领域,四人帮(Gang of Four,简写为GoF)指被称为设计模式先驱的4个人:Erich Gamma、RichardHelm、Ralph Johnson和JohnVlissides。——译者注
“现代软件开发”这个概念是最近才提出来的。尽管我们在软件开发历程中已经积累了50多年的经验,软件开发这个职业仍然处于幼年期。
就拿源码控制(Source Control)来说吧。源码控制绝对是软件工程的基石。但它直到1999年的时候,才被广为接受。究其原因:
CVS(Concurrent Versions System)版本控制系统是一种GNU软件包,主要用于在多人开发环境下的源码维护。Concurrent有并发的、协作的、一致的等含义。实际上,CVS可以维护任意文档的开发和使用,例如共享文件的编辑或修改,而不仅仅局限于程序设计。——译者注
SourceForge.net是全球最大的开源软件开发平台和仓库。网站建立的宗旨是,为开源软件提供一个存储、协作和发布的平台。SourceForge上现已拥有大量非常优秀的开源软件。——译者注
很显然,源码控制系统在1999年之前早就存在了。作为一种软件工程的基础工具,为什么它要花这么长时间才能成为主流呢?这就要用“Redwine-Riddle成熟模型”来解释了(参见MaryShaw发表过的一篇文章,题为“What Makes Good Research inSoftware Engineering?”):
Redwine和Riddle两个人审视了若干项软件技术,研究了它们从诞生之初到四处传播的整个过程。他们发现,一项技术从概念形成阶段演变到广为流行的程度通常需要15~20年的时间。
他们指出了6个典型的阶段:
Redwine和Riddle把几项软件技术经历的发展阶段用时间线展示了出来,时间线一直延伸到1980年代中期。我对1990年代软件架构的成熟过程也做了类似的分析。
CVS其实在1986年就发布了。正如Redwine和Riddle预测的那样,CVS从诞生到成为主流整整用了15年的时间。
Redwine和Riddle在1980年提出的这个模型至今仍然有效。在“Design patterns of 1972”(1972年的设计模式)一文中,MarkDominus回顾了将近35年时间,以证明我们至今仍然在为编程语言的进化而苦苦挣扎着:
假设“设计模式”倡议在1960年就能流行起来,那时候的目标就会是教会程序员识别在什么情况下要使用“子程序”,并且在需要的时候习惯性地实现这个模式。跟完全不用子程序比起来,这当然是一次很大的进步。但那时候到底发生了什么呢?可喜的是,“子程序”模式被后来的编程语言直接吸收、内建为标准的一部分——这样比起来,独立使用设计模式的方法就逊色许多!模式的识别是促使编程语言进步的一个重要驱动力。在所有编程活动中,当我们发现同一种解决方案在多种不同情况下重复出现时,我们总是想提炼出共性。这种做法是很有价值的,也是应该鼓励的!“设计模式”倡议的问题在于对模式的后续使用上——程序员被训练如何识别问题、应用模式;然而,各种模式应该被看成是编程语言的“缺陷”。就像我们在编程过程中所做的那样,识别了共性之后,我们应该加以抽象,把公共的部分合并到单一的解决方案中去。
在程序世界里,同样的想法重复实现多次几乎总是错误的做法。对于一个反复出现的设计问题,如果有可能的话,用一种通用的方法来解决的最佳位置应该在编程语言本身。
“设计模式”倡议的立场是,程序员需要自己去实现Visitors(访问者)、Abstract Factories(抽象工厂)、Decorators(装饰)和Facades(外观)等模式。不知何故,这似乎是不可避免的!但是,把“子程序”调用或面向对象的类在源语言里实现的需求显然更为强烈,而且刻不容缓!这些模式应该被看作是Java和C++语言的缺陷或者缺少的特性。当设计模式被识别出来之后,最好的处理方法是质疑编程语言里有哪些缺陷才导致这些模式的形成,以及编程语言应该如何改进以更好地解决这些特定类型的问题。
我相信,在软件开发领域的变革步伐在加快,这得益于过去50年间通讯发展的突飞猛进——电视、卫星、蜂窝电话、当然还有互联网。作为软件开发者,我们已经习惯了计算机硬件能力每18个月翻一番。而我们留有遗憾的是,软件人追上硬件发展水平的速度实在是太慢了!