自从Bruce Eckel的《Thinking in C++》和《Thinking in Java》两本书被国内引入翻译成为《C++编程思想》和《Java编程思想》之后,“编程思想”这个词也越来越多地被很多人所引用。但凡在一个比较激烈的讨论之中(尤其是和具体语言相关的讨论之中),总会有些人跳出来,说道:“用什么语言并不重要,关键是编程思想”。而这些人在说这话时,往往扮演着两种角色中的一种:和稀泥者;或自以为高人一等者。以和稀泥态度出现的人,我们姑且不去评论,但对于那种自以为掌握了软件开发之“道”——“编程思想”的人来说,我总觉得有些话是如“骨鲠在喉”,不吐不快。 首先,让我们来看看程序到底是用来干什么的。 一般来说,计算机程序总是为了解决某类问题而被开发出来的。相对于那种比较“形而上”的“思想”来说,计算机程序总是比较具体的东西,除了我们不能触摸它们之外,我们绝对是可以感受到它的存在,它的运行,以至于它的内部结构……总之,计算机程序是一种十分具体的事物。而“思想”不用我说,大家都知道它的抽象性了。因此两者之间应该不会存在着什么必然的联系。 当然,你可以说,程序是在某种为人所知(或不知)的“编程思想”的指导之下被开发出来的,而那种可以替代一切的“道”也就存在于程序的内部,也只有那种领悟了“道”的人才可以从错综复杂的程序代码中发现出这种“思想”。 我们可以先撇开是否真的有这种“道”的存在不谈——那样太容易陷入求道者最擅长的空洞辩论中去,还是先来谈一些具体的东西吧。 有人说,不同行业的软件,其差异不会比两个行业之间的差异小。如果真的存在有一种大一统的“道”来指导着我们的软件开发,那么试问这种差异又怎么解释呢?既然你可以认为掌握了“编程思想”就等于掌握了软件开发的一把钥匙,那么为什么这把钥匙为什么又不能打开消除不同软件之间差异的那把锁呢?Frederick Brooks在其经典著作The Mythical Man-Month中写过:“No Silver Bullet”,并且把软件开发中的根本困难给我们指出来了:“我认为软件开发中困难的部分是规格说明、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证”。在现代软件系统中存在着一些不可规避的内在特性:复杂度、一致性、可变性和不可见性。(F. Brooks 1995)从中可见,所谓的“编程思想”其实也就是我们所臆想出来的一类Silver Bullet而已。 当然,你也可能会反驳说:我们所说的“编程思想”其实不如你所想象的那样,是一种大一统的“道”,而只是在开发过程中所存在着的一种局部的、可以用来指导程序编写的方法论,它是独立于具体的编程语言而存在于所有的程序编写活动中。嗯,在此我们姑且还是暂时接受你的这种说法,然后再继续对此进行剖析…… 作为存在于所有程序编写过程中的“思想”,其最终还是会反应在我们所得到的程序编写结果——软件——中去。让我们还是回到先前提出的那个有关差异的问题中去,既然“编程思想”是固定的(或相对固定的),为什么还会造成如此大的差距呢? 我想对于上面那个问题,仅仅使用“编程思想”来解释是绝对解释不清楚吧。 下面,我想提出一些自己的观点: 一个软件的开发实际上和软件所处的领域关系非常紧密,不同行业的软件,其联系程度倒不是那么大了。正如ERP系统关注在工作流层次之上,操作系统关注的则是如何利用好硬件能够提供的功能。所以,在软件开发中,领域内的知识是非常重要的,几乎所有的软件都是针对某个领域内的某些问题来提供解决方案,脱离一个固定的领域而存在的软件,只能算是一个玩偶而已。另外,在目前我们所能够得到的认知下,还无法得到一个可以覆盖所有领域的、无所不能的“思想”。 选择不同的语言,对于软件开发,其产生的影响也是不可忽视的。对于这方面的讨论,我们可以从经济、技术、以及软件目的等各方面来进行…… 在程序的编写过程中,还是存在着一些“放之四海皆准”的准则,如Decoupling,Cohesion,Modularize等,但这都只是编写程序所要求的一般准则,每个合格的程序员都要求掌握并应用它们(当然,在特殊的场合下面,可能并不要求实施它们)。 “工欲善其事,必先利其器”这种做法,是我一直所认同的。既然不存在一个无所不在的“编程思想”,既然所有的软件必须还是用程序来实现,程序员要是不能够掌握一种工具的话,又如何可以做到合格的呢。只是作为不同的工具,大部分流行的编程语言之间其实都是大同小异,所以会给某些人造成“语言并不重要,重要的是思想”这种观念,然后就对于一些容易做到的技巧提高的工作不感兴趣,反倒是追寻了虚无飘渺的“思想”,颇有点“缘木求鱼”的感觉。尤其是在现在这个分工比较明确的社会,“一专多通”的人才远比“多通不专”的人要更容易得到承认。 |