黑客与画家:硅谷创业之父Paul Graham文集

[美]格雷厄姆(Paul Graham) 著|阮一峰 译

非常精彩的一本书。作者是个编程、创业大牛,编程厉害不说,竟然还是个画家,真是神奇的组合。他的很多观点都鞭辟入里,而且行文十分紧凑、有条理,简直没有一句废话。经常把编程的历史与绘画的历史相比较,很有趣的两种视角进行结合,竟然毫不违和。翻译水平也十分高。对于编程语言Lisp的介绍十分详细,探讨了编程语言将来的演化方向,十分具有说服力。

前言

我们生活中的一切,都正在成为计算机。打字机被计算机取代了,电话也变成了计算机,照相机亦是如此。很快,电视机也将变成计算机。当今小轿车所具备的计算能力比1970年占满一间屋子的大型计算机还要强。信件、百科全书、报纸,甚至本地的小店,都正在被互联网取代。所以,如果你想理解我们目前的世界以及它的未来动向,那么多了解一些黑客的想法会对你有帮助。

有些读者可能不理解第3章的内容。这一章与计算机有什么关系?事实是黑客很在乎言论自由。Slashdot(它是黑客世界的《纽约时报》)有一个专栏讨论这个问题。我想Slashdot的大多数读者都认为重视言论自由是天经地义的事情。不过《飞机与飞行员》(Plane & Pilot)杂志就肯定不会有一个这样的栏目。

1. 为什么书呆子不受欢迎

所以,如果智力本身与“受欢迎”无关,为什么聪明的小孩一直不受同龄人的欢迎呢?我认为,答案就是他们真的不想让自己受欢迎。

如果当时有人告诉我这个答案,我一定会嘲笑他。在学校里不受欢迎,你的日子就很难过,有人甚至因此自杀。所以,要是你跟我说,是我本人不想受欢迎,那就好比你在说,我在沙漠里快渴死了,却又不想喝水。别搞错了,让自己更受欢迎,这才是我要的。

但是事实上,我并不是那么强烈地渴望这个。我更想追求的是另一件事情——聪明。这不仅仅意味着在学校得到好成绩(虽然某种程度上这也挺重要)。我真正想要的是,能够设计奇妙的火箭、写出漂亮的文章、理解编程原理。一句话,我想要做伟大的事情。

那时,我从没试过将梦想分门别类、一一排序。要是我真做了,就会一眼看出聪明是排在最前面的。如果有人许诺,使我一举成为全校最受瞩目的学生,代价是从此智力平庸(请允许我在这里自命不凡),我是绝不会答应的。

虽然“书呆子”饱尝不受欢迎之苦,但是为了解除痛苦而让他们放弃“聪明”,我想大多数人是不会愿意的。对他们来说,平庸的智力是不可忍受的。不过,要是换了别的孩子,情况就不一样了,大多数人会接受这笔交易。对于很多人来说,这反而是更上一层楼的机会。即使是那些智力排名在前20%的学生(我在这里假设智力可以测量,那时的人们似乎都相信这一点),谁不愿意用30分的成绩换来别人的友爱和钦佩?

我认为,这就是问题的根源。“书呆子”的目标具有两重性。他们毫无疑问想让自己受欢迎,但是他们更愿意让自己聪明。“受欢迎”并不是你在课后时间随便做一做就能实现的,尤其是在美国的中学中,在这里,所有人为了个人魅力都会进行激烈竞争。

我13岁的那一年,对世界的全部认识,就是身边看到的一切。我以为,我所经历的种种扭曲的事件就是世界的样子。看上去,这是一个残酷的世界,也是一个乏味的世界,我不太肯定哪一个更糟一些。

因为我在这个世界中过得并不好,我觉得一定是自己什么地方做错了。我没有意识到,作为书呆子,我不适应周围环境,某种程度上正说明我领先了一步。书呆子已经在思考的东西,正是真实世界看重的东西。他们与别人不一样,不把所有时间用来玩一种耗尽全力但又亳无意义的游戏。

如果能回到过去,我会向13岁的我提供一些建议,主要告诉他要昂起头看世界。我在那个年纪根本不知道这一点,而我身边的世界又虚假得像奶油夹心蛋糕一样。不仅是学校,整个小镇都很虚假,不像真实的世界。为什么人们要搬到郊区去住?为了养育下一代!难怪郊区生活是如此地乏味和贫瘠。整个镇子就像一个巨大的幼儿园,所有一切都是为了教育下一代而有意识地造出来的。

在我生长的这个地方,感觉整个世界就是这么大,你根本没有别的地方可去,没有别的事情可做。这一点都不令人意外。郊区就是故意这样设计的,与外部世界隔离,不让儿童沾染到外界有害的东西。

至于学校,不过是这个虚假环境中关住牲口的围栏。表面上,学校的使命是教育儿童。事实上,学校的真正目的是把儿童都关在同一个地方,以便大人们白天可以腾出手来把事情做完。我对这一点没有意见,在一个高度工业化的社会,对孩子不加管束,让他们四处乱跑,无疑是一场灾难。

让我困扰的,不是把孩子关在监狱里,而是(a)不告诉他们这一点,(b)把这监狱的大部分交给犯人来管理。孩子们被送进来,花6年时间,记住一些毫无意义的事实,还要身处在一个由四肢发达的小巨人管理的世界,那些巨人们只知道追逐一个椭圆形的、棕色的球,好像这是全世界最天经地义的事情。这简直就像一场超现实的鸡尾酒化妆晚会,如果孩子畏缩不前、瑟瑟发抖,他们就会被视为怪人。

对于书呆子来说,意识到学校并非全部的人生,也是很重要的事情。学校是一个很奇怪的、人为设计出来的体系,一半像是无菌室,一半像是野蛮洪荒之地。它就像人生一样,里面无所不包,但又不是事物的真实样子。它只是一个暂时的过程,只要你向前看,你就能超越它,哪怕现在你还是身处其中。

如果你觉得人生糟透了,那不是因为体内激素分泌失调(你父母相信这种说法),也不是因为人生真的糟透了(你本人相信这种说法)。那是因为你对成年人不再具有经济价值(与工业社会以前的时期相比),所以他们把你扔在学校里,一关就是好几年,根本没有真正的事情可做。任何这种类型的组织都是可怕的生存环境。你根本不需要寻找其他的原因就能解释为什么青少年是不快乐的。

我在这篇文章中发表了一些刺耳的意见,但是我对未来是乐观的。我们认定无法解决的难题,事实上完全可以解决。青少年并不是洪水猛兽,也并非天生就不快乐。这一点对于青少年和成年人,应该都是令人鼓舞的消息。

2. 黑客与画家

创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。这种类型的工作很难用研究性的论文表达。

那么,为什么大学和实验室还把论文数量作为考核黑客工作的指标呢?这种事情其实在日常生活中普遍存在,比如,我们使用简单的标准化测试考核学生的“学术能力倾向”(scholastic aptitude),再比如,我们使用代码的行数考核程序员的工作效率。这样的考核容易实施,而容易实施的考核总是首先被采用。

黑客真正想做的是设计优美的软件,考核这种工作是非常困难的。你本人需要有良好的设计感,才能去考核别人的设计是否良好。但是,你觉得你有“良好的设计感”,与你实际是否具有,不存在相关关系,甚至可能存在负相关。

唯一有效的外部考核就是时间。经过岁月的洗礼,优美的东西生存发展的机会更大,丑陋的东西往往会被淘汰。不幸的是,这种考核需要的时间可能比一个人的生命还要长。塞缪尔·约翰逊说过,人们对一个作家的评价,需要100年才能达成一致。你必须先等他的那些有影响力的朋友都死了,然后再等他的追随者都死了,才能对他有一个公正的评价。

我想,名望有很大的随机性,黑客对此只好听天由命了。在这一点上,他们与其他创作者并无不同。事实上,相比而言,他们还是幸运的。暂时性的、一窝蜂式的时代风潮对画家的影响要比对黑客的影响大得多。

人们无法考核你的工作,甚至误解你的工作,都不是最糟的事。更大的危险是你自己也会误解自己的工作。因为你总是从相关领域寻找新思想,如果你发现自己读的是计算机科学系,很自然地,你就会以为“计算机科学”与其他“理论科学”并无不同,你的工作属于“理论计算机科学”所涉及的那种理论的应用研究。读研究生期间,我潜意识里一直有一种很不舒服的感觉,觉得自己应该多学一点理论,不应该期末考试结束还不到三个星期,就把所有东西忘得一干二净,那样真是不可饶恕。现在,我意识到自己错了。黑客搞懂“计算理论”(theory of computation)的必要性,与画家搞懂颜料化学成分的必要性差不多大。一般来说,在理论上,你需要知道如何计算“时间复杂度”和“空间复杂度”(time and space complexity);如果你要写一个解析器,可能还需要知道状态机(state machine)的概念;除此以外,并不需要知道特别多的理论。这些可比画家必须记住的颜料成分少很多。

我发现,黑客新想法的最佳来源,并非那些名字里有“计算机”三个字的理论领域,而是来自于其他创作领域。与其到“计算理论”领域寻找创意,你还不如在绘画中寻找创意。

举例来说,我在大学受到的教育是,在上机编程之前,应该先在纸上把程序搞清楚。可我自己一直不是这样编程的,我喜欢直接坐在计算机前编程,而不是在纸上编程。更糟的是,我不是耐心地一步步写出整个程序,确保大体上是正确的,而是一股脑不管对错,先把代码堆上去,再慢慢修改。书上说,调试(debugging)是最后的步骤,用来纠正打字的错误和疏忽。可是我的工作方法看上去却像编程就是在调试。

很长一段时间内我都为此事沮丧,就像小学里老师教我怎么拿铅笔,我却总是学不会的那种感觉。如果我那时看到其他创作领域,比如绘画或者建筑,我就会想到,自己的方法其实有一个正式的名称:打草稿。我现在认为,大学里教给我的编程方法都是错的。你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前,这与作家、画家和建筑师的做法完全一样。

明白这一点对软件设计有重大影响。它意味着,编程语言首要的特性应该是允许动态扩展(malleable)。编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。它应该是一支铅笔,而不是一支钢笔。如果大家都像学校教的那样编程,那么静态类型(static typing)是一个不错的槪念。但是,我认识的黑客,没有一个人喜欢用静态类型语言编程。我们需要的是一种可以随意涂抹、擦擦改改的语言,我们不想正襟危坐,把一个盛满各种变量类型的茶杯,小心翼翼放在自己的膝盖上,为了与一丝不苟的编译器大婶交谈,努力地挑选词语,确保变量类型匹配,好让自己显得礼貌又周到。

创作者不同于科学家,明白这一点有很多好处。除了不用为静态类型烦恼以外,还可以免去另一个折磨科学家的难题,那就是“对数学家的妒忌”。科学界的每一个人,暗地里都相信数学家比自己聪明。我觉得,数学家自己也相信这一点。最后的结果就是科学家往往会把自己的工作尽可能弄得看上去像数学。对于物理学这样的领域,这可能不会有太大不良影响。但是,你越往自然科学的方向发展,它就越成为一个严重的问题。

一页写满了数学公式的纸真是令人印象深刻啊。(小窍门:用希腊字母表示变量名会令人印象更深刻。)因此,你就受到巨大的诱惑,去解决那些能够用数学公式处理的问题,而不是去解决真正重要的问题。

如果黑客认识到自己与其他创作者——比如作家和画家——是一类人,这种诱惑对他就不起作用。作家和画家没有“对数学家的妒忌”,他们认为自己在从事与数学完全不相关的事情。我认为,黑客也是如此。

如果大学和实验室不允许黑客做他们想做的事情,那么适合黑客的地方可能就是企业。不幸的是,大多数企业也不允许黑客做他们想做的事情。大学和实验室强迫黑客成为科学家,企业强迫黑客成为工程师。

直到最近我才发现这一点。雅虎收购Viaweb的时候,他们问我想做什么。我对商业活动从来都没有太大兴趣,就回答说我想继续做黑客。等我来到雅虎以后,发现在他们看来,“黑客”的工作就是用软件实现某个功能,而不是设计软件。在那里,程序员被当作技工,职责就是将产品经理的“构想”(如果这个词是这么用的话)翻译成代码。

这似乎是大公司的普遍情况。大公司这样安排的原因是为了减少结果的标准差。因为实际上只有很少一部分黑客懂得如何正确设计软件,公司的管理层很难正确识别到底应该把设计软件的任务交给谁。所以,大部分公司不把设计软件的职责交给一个优秀的黑客,而是交给一个委员会,黑客的作用仅仅是实现那个委员会的设计。

如果某一天你想要去赚大钱,那么记住上面这一点,因为这是创业公司能够成功的原因之一。大公司为了避免设计上的灾难,选择了减少设计结果的标准差。但是当你排斥差异的时候,你不仅将失败的可能性排除在外,也将获得高利润的可能性排除在外。这对大公司来说不是问题,因为生产特别优秀的产品不是它们的获胜手段。大公司只要做到不太烂,就能赢。

所以,如果你的竞争优势是在软件设计方面,并且你的对手是一家大公司,它大到由一群产品经理来设计软件,那么你的对手将永远无法赶上你。不过说实话,这样的机会不容易找到。你很难单单依靠软件设计就与大公司展开竞争。这就好比你很难攻入城堡与对手面对面地徒手搏斗。比如,就算写一个比微软的Word更好的文字处理软件不是难事,但是微软公司有自己的城堡,它的操作系统是垄断的,你根本无法对它构成威胁,它甚至都不会注意到你的存在。

真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。微软公司自己一开始就是这样走向成功的,苹果公司和惠普公司也是如此。我觉得几乎所有的创业公司都是这样取得成功的。

所以,开发优秀软件的方法之一就是自己创业。但是,这样做会遇到两个问题。一个是自己开公司的话,必须处理许许多多与开发软件完全无关的事情。我创立Viaweb的时候,如果有四分之一时间可以用于开发,就感到很幸运了。我在其他四分之三时间所做的事情,从单调乏味到惊悚恐怖,无所不包。我来说一个比较,有一次董事会开到一半,我不得不离开去补牙。我记得坐在牙医诊所的椅子上,等着医生开动牙钻的那段时间,与刚才待在公司的时间相比,简直感觉像是在度假一样。

创业的另一个问题是赚钱的软件往往不是好玩的软件,两者的重叠度不髙。设计编程语言是很好玩的事情,事实上,微软的第一个产品就是一种编程语言。但是,如今没有人会出钱买编程语言。如果你想赚钱,你可能不得不去干那些很麻烦很讨厌的事情,因为这些事情没人愿意义务来干。

所有创作者都面临这个问题。价格是由供给和需求共同决定的。好玩的软件的需求量,比不上解决客户麻烦问题的软件的需求量。在小剧场里演出的酬劳,比不上穿着卡通大猩猩服装、在展览会上为厂商站台的酬劳。写小说的回报比不上写广告文案的回报。开发编程语言的收入,比不上把某些公司老掉牙的数据库连上服务器的收入。

黑客如何才能做自己喜欢的事情?我认为这个问题的解决方法是一个几乎所有创作者都知道的方法:找一份养家糊口的“白天工作”(day job)。这个词是从音乐家身上来的,他们晚上表演音乐,所以白天可以找一份其他工作。更一般地说,“白天工作”的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。

几乎所有的创作者在职业生涯的早期都有一份“白天工作”。画家和作家尤其显著。如果幸运的话,你能找到一份与你的“真正工作”非常相关的“白天工作”。音乐家似乎常常是在唱片行工作。同样地,钻研某种编程语言或操作系统的黑客,很可能会得到一份使用这些工具的“白天工作”。

当我说,黑客解决生计问题的方法是找一份“白天工作”,然后在其余时间开发优美的软件,我并没有说这是一个新方法。开源软件界的黑客早就这样做了。我想说的其实是,幵源软件的这种工作模式可能就是正确的模式,因为它已经被其他领域的创作者都验证过了。

令我惊讶的是,雇主都很犹豫,不愿意手下的黑客为开源软件项目工作。但是,在Viaweb,要是你不愿意这样干,我们会很犹豫要不要雇用你。我们面试程序员的时候,主要关注的事情就是业余时间他们写了什么软件。因为如果你不爱一件事,你不可能把它做得真正优秀,要是你很热爱编程,你就不可避免地会开发你自己的项目。

因为黑客更像创作者,而不是科学家,所以要了解黑客,不应该在科学家身上寻找启示,而是应该观察其他类型的创作者。那么,从画家身上,我们还能借鉴到什么对黑客的启示呢?

有一件事情是可以借鉴的(至少可以确认),那就是应该如何学习编程。画家学习绘画的方法主要是动手去画,黑客学习编程的方法也理应如此。大多数黑客不是通过大学课程学会编程的,他们从实践中学习,13岁时就自己动手写程序了。即使上了大学,黑客学习编程依然主要通过自己写程序。

画家的作品都会保留下来,你观察这些作品,就能看出他们是怎么一步步通过实践学习绘画的。如果你把一个画家的作品按照时间顺序排列,就会发现每幅画所用的技巧,都是建立在上一幅作品学到的东西之上。某幅作品如果有特别出色之处,你往往能够在更早的作品上发现一个小规模的初期版本。

我想大多数创作者都是这样学习和工作的,作家和建筑师似乎都是如此。也许对于黑客来说,采取像画家这样的做法很有好处:应该定期地从头开始,而不要长年累月地在一个项目上不断工作,并且试图把所有的最新想法都以修订版的形式包括进去。

黑客通过实践学习编程,这又是一个标志,说明黑客与科学家的区别有多大。科学家就不会通过干活来学习科学,而是通过做实验和解题来学习。科学家研究的基础都是现有的很完美的成果,在这个意义上,他们的第一步只是在复制别人已经做过的工作。最后,他们才会从某一个点开始,进行自己的原创性工作。但是,黑客就不一样,从一幵始做的就是原创性工作,根本没有他人完美的成果可以依靠。所以,黑客的出发点是原创,最终得到一个优美的结果;而科学家的出发点是别人优美的结果,最终得到原创性。

创作者另一个学习的途径是通过范例。对画家来说,博物馆就是美术技巧的图书馆。几百年来,临蓽大师的作品一直是传统美术教育的一部分,因为临摹迫使你仔细观察一幅画是如何完成的。

作家也是这样学习写作的。富兰克林(Benjamin Franklin)通过总结和模仿艾迪生和斯梯尔的文章,学会了写作。雷蒙·钱德勒(Raymond Chandler)也是如此学会了写作侦探小说。

同样地,黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。开源运动最鲜为人知的优点之一,就是使得学习编程变得更容易了。我学编程的时候,不得不主要依靠教材上的范例。那时可以搞到的源码,主要来自于Unix,但是就连Unix也不是开源的。大部分阅读Unix源码的人都是通过约翰·莱昂斯那本书的非法影印本。该书虽然是1977年写的,但是在1996年之前都不被允许公开出版。

还有一个可以借鉴绘画的地方:一幅画是逐步完成的。通常一开始是一张草图,然后再逐步填入细节。但是,它又不单纯是一个填入细节的过程。有时,原先的构想看来是错的,你就必须动手修改。无数古代油画放在X光下检视,就能看出修改痕迹,四肢的位置被移动过,或者脸部的表情经过了调整。

绘画的这个创作过程就值得学习。我认为黑客也应该这样工作。你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。如果你预先承认规格设计是不完美的,在编程的时候,就可以根据需要当场修改规格,最终会有一个更好的结果。

(大公司的内部结构,使得它们很难这样做。这是又一个创业公司占优之处。)

眼下想必每个人都知道,过早优化(premature optimization)是一件危险的事情。我认为,我们应该对“过早设计”(premature design)也抱有同样的担忧,不要太早决定一个程序应该怎么做。

合适的工具能够帮助我们避免这种危险。一种好的编程语言,应该像油画颜料一样,能够使得我们很从容地改变想法。动态类型语言在这一点上就是蠃家,因为你不必提前就设置好各种变量的数据类型。不过我认为,编程语言灵活性的关键还不在这里,而在于这种语言应该非常抽象。最容易修改的语言就是简短的语言。

我接下来要说的是,一幅优秀的绘画作品必须比它应该有的样子更好,这可能听起来有点矛盾。举例来说,图2-1所示达·芬奇的作品《女性肖像》(Ginevra de' Benci)现在保存在美国国家美术馆。你可以看到,达·芬奇在少女的头后面摆了一片树枝。他很仔细地画出了树枝上的每一片叶子。许多画家也许会觉得,那不过是放在背景里的衬托物,没有人会仔细看的,不妨简单处理一下就可以了。

但是达·芬奇不这样想。他对作品每一部分的认真程度完全不取决于预料中会不会有人仔细看这个部分。他就像篮球巨星迈克尔·乔丹(Michael Jordan),每一球都一丝不苟,绝不降低对自己的要求。

坚持一丝不苟,就能取得优秀的成果。因为那些看不见的细节累加起来,就变得可见了。当人们从达·芬奇的《女性肖像》前面走过的时候,他们的注意力往往立刻就被它吸引住了,那时他们甚至还没有看到说明的标签牌,没有意识到这是达·芬奇的作品。所有那些看不见的细节合并在一起,就使得这样东西产生了惊人的效果,仿佛上千个细微的声音都以同一个音调在歌唱。

同样地,优秀的软件也要求对美的狂热追求。如果你查看优秀软件的内部,就会发现那些预料中没有人会看见的部分也是优美的。我对待代码的认真程度远远超过我对待其他事情,如果我以这种态度对待日常生活的每件事,那么我就够资格找心理医生开处方药了。看到代码前面的缩进乱七八糟,或者看到丑陋的变量名,都会把我逼疯的。

如果黑客只是一个负责实现领导意志的技术工人,职责就是根据规格说明书写出代码,那么他其实与一个挖水沟的工人是一样的,从这头挖到那头,仅此而已。但是,如果黑客是一个创作者,他从事的就不是机械性的工作,他必须具备灵感。

黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。

为了做出优秀的工作,你必须把这种心理周期考虑在内。只有这样,你才能根据不同的事情找出不同的应对方法。你有一辆手动变速的汽车,你把它开上山,有时不得不松开离合器,防止汽车熄火。同样,暂时放手有时也能防止热情熄火。对于画家和黑客这样的创作者,有些工作需要投入巨大的热情,另一些工作则是不需要很操心的日常琐事。在你厌倦的时候再去做那些比较容易的工作,这是个不错的主意。

对于编程,这实际上意味着你可以把bug留到以后解决。消灭bug对我来说属于轻松的工作,只有在这个时候,编程才变得直接和机械,接近社会大众想象中的编程的样子。消灭bug的过程就像解一道数学题,已知许许多多的约束条件,你只要根据条件对方程求解就可以了。你的程序应该能产生x结果,但是却产生了y结果。哪里出错了?你知道自己最后肯定能解决这个问题,所以做起来就很轻松,就好像刷墙一样,接近于休闲了。

用绘画的例子作为参考,不仅能教会我们如何管理自己的工作,还能教会我们如何与他人一起工作。历史上许多伟大的艺术品都是多人一起合作的结果,尽管最后在博物馆展出的时候,墙上可能只会写出一个人的名字。达·芬奇曾经在韦罗基奥(Verrocchio)的画室当学徒,后者当时正在画《基督的洗礼》(Baptism of Christ),达·芬奇的工作是完成整幅画之中的一个天使。多人一起完成一幅作品是当时的普遍做法,并不罕见。后来,米开朗基罗坚持要一个人画完罗马的西斯廷大教堂(Sistine Chapel)天顶壁画中的所有人物,他还因此被认为特别死心眼。

就我所知,当多个画家共同创作一幅作品时,每个人画的部分都是不一样的。通常来说,大师负责画主要人物,助手们负责画次要人物和背景。但是,你肯定找不到某个部分是两个人一起画的。

我认为,这也是多人共同开发一个软件的正确模式。需要合作,但是不要“合”得过头。如果一个代码块由三四个人共同开发,就没有人真正“拥有”这块代码。最终,它就会变得像一个公用杂物间,没人管理,又脏又乱,到处堆满了冗余代码。正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。

就像绘画作品一样,大多数软件是为人类用户准备的。所以,黑客必须像画家一样,时刻考虑到用户的人性需要,这样才能做出伟大的产品。你必须能够站在用户的角度思考问题,也就是说你必须学会“换位思考”。

很小的时候,我就被不断告知,要设身处地为他人着想。现实中,这必然意味着你要做其他人需要的事情,而不是你自己想做的事情。这样看上去好像对我很不利,所以我暗下决心不让自己变成这样的人。

但是,我完全错了。事实表明,从他人的角度思考问题正是成功的奥秘所在。“换位思考”并不就意味着你要做自我牺牲。实际上,这是完全不同的两回事。了解别人对于事情的看法,并不代表你为他的利益服务。某些情况下,比如打仗的时候,了解对手正是为了打击对手。

大多数创作者都是为人类用户而创作。为了吸引用户,你必须理解用户需要什么。举例来说,几乎所有最伟大的绘画作品都是画人的,因为人类总是对自身感兴趣的。

普通黑客与优秀黑客的所有区别之中,会不会“换位思考”可能是最重要的单个因素。有些黑客很聪明,但是完全以自我为中心,根本不会设身处地为用户考虑。这样的人很难设计出优秀软件,因为他们不从用户的角度看待问题。

判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。我们大概都认识这样一些人,他们在其他方面非常聪明,但是把问题解释清楚的能力却惊人低下。如果聚会上,外行人问他们“什么是编程语言”,他们会这样回答:“哦,高级语言就是编译器的输入代码,用来产生目标码。”高级语言?编译器?目标码?……如果对方不知道什么是编程语言,那么他显然也不会知道这些概念。

软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知。你要明白,用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。在这方面,我见过的最佳系统是1984年原始的Macintosh电脑。它做到了那时别的软件都做不到的事情:它真的能用。

源代码也应该可以自己解释自己。如果我只能让别人记住一句关于编程的名言,那么这句名言就是《计算机程序的结构与解释》一书的卷首语:程序写出来是给人看的,附带能在机器上运行。

“换位思考”不仅是为了你的用户,也是为了你的读者。这对你是有利的,因为你也会读自己写的东西。许多黑客六个月后再读自己的程序,却发现根本看不懂它是怎么运行的。我认识好几个人,因为这种经历而发誓不再使用Perl语言。

在某些地方,自行其道、完全不替读者着想,被看成是高水平、高智商的表现,甚至都发展成了一种风尚。但是,我不觉得“换位思考”与智商之间存在任何联系。在数学和自然科学领域,你不用学习怎么向别人表达自己,也能取得很好的成就。而那些领域的人普遍很聪明,所以人们很自然地就把“聪明”与“不懂得换位思考”联系了起来。但是,世界上还有许许多多很笨的人,也同样不懂得“换位思考”。

最后,如果编程是与绘画和写作同一类的工作,黑客是否有机会像伟大艺术家一样备受推崇、流芳后世呢?毕竟生命只有一次,你可能想用它来做一些伟大的事情。

很遗憾,这个问题很难回答。声望这个东西,总是经过漫长的时滞以后才会确立,它就像遥远星系发出的光,经过了许多光年才能被我们看到。那些如今声名显赫的绘画作品,来自于五百年前的画家的卓越工作。在那些画家生前,没人像我们今天那样看重这些作品。1465年的人们也许会感到非常奇怪,后世的人们提起乌尔比诺城(Urbino)不可一世的费德里科公爵,最主要的原因居然是弗朗切斯卡把他的鼻子画得非常独特(见图2-2)。

所以,虽然我必须承认,眼下看来艺术家比黑客更酷,但是我们不应忘记,古时候绘画蓬勃发展的那些黄金年代,画家也不是像今天这样酷的。

我们能够有把握说的就是,现在正是编程的黄金年代。大多数领域的伟大作品都诞生于很早以前。1430年到1500年之间的绘画杰作,至今仍然是不可超越的。莎士比亚出现的时候,戏剧这种文艺体裁才刚发展起来,专门表演戏剧的场所“戏院”才刚刚诞生。他把戏剧这种艺术形式提升到一个难以触及的高度,让后世的每一个剧作家都不得不生活在他的阴影之中。德国雕塑大师丢勒(Albrecht Dürer)、英国小说家简·奥斯丁(Jane Austen)都是这样的大师。

我们看到这种模式一再反复出现。一种新的媒介刚刚诞生的时候,人们热情髙涨、兴奋不已,短短几代人就探索清楚了这种媒介的大部分可能性,把它的能量发挥到极致。编程目前好像就处在这个阶段。

在达·芬奇的年代,绘画并不是一件很酷的事情,达·芬奇用自己的工作推动绘画成为一种伟大的表达方式。同样,编程到底能够有多酷,取决于我们能够用这种新媒介做出怎样的工作。

3. 不能说的话

一想到现在我们言之凿凿的东西,在未来人们的眼里却是荒诞不经,怎能不令人感叹呢!如果未来有人坐着时间机器来到我们这个时代,哪些话是他小心翼翼避免说出口的?我的这篇文章就想探讨这件事。我不仅要展示一些当前的“异端邪说”,让每个人都大吃一惊,还要找出适用于所有年代的通用法则,判断哪些话是不能说的。

你是一个随大流的人吗

如果别人告诉你应该相信什么,你就真的相信了,那么你就会和别人一样犯下同样的错误。如果你是南北战争前的南方庄园主,你会与北方开战;如果你是20世纪30年代的德国人,你会相信希特勒。

有时候,别人会对你说:“要根据社会需要,改造自己的思想(well-adjusted)。”这种说法隐含的意思似乎是,如果你不认同社会,那么肯定是你自己的问题。你同意这种说法吗?事实上,它不仅不对,而且会让历史倒退。如果你真的相信了它,凡是不认同社会之处,你连想都不敢想,马上就放弃自己的观点,那才会真正出问题。

真话

到底什么话是我们不能说的?为了找到答案,首先,我们可以看看,周围的人因为说了什么而陷入麻烦。

当然,这里要注意,并不是所有不能说出口的话都是我们要找的答案。实际上,只有同时满足两个条件才行。第一个条件是,这些话不能说出口;第二个条件是,它们是正确的,或者看起来很可能正确,值得进一步讨论。如果达不到第二个条件,大部分情况下你都不会有麻烦。你说2+2等于5,或者匹兹堡的市民身高三米,都不会有事的。这些明显错误的言论也许会被当成笑话,或者更糟一点,被当成你发疯的证据,但是肯定不会惹恼任何人。触怒他人的言论是那些可能会有人相信的言论。我猜想,最令人暴跳如雷的言论,就是被认为说出了真相的言论。

如果伽利略说帕多瓦城(Padua)的人身高三米,他只会被当作一个古怪的疯狂科学家。但是,他说地球围绕太阳运转,性质就完全不一样了。教廷知道,这种话会让人们开始思考。

回顾历史,我们会发现很多这样的例子。人们因为说真话而给自己惹来麻烦。许多的言论,今天的人们看来再平常不过,但是放在过去都是不能说的。以此推断,未来的人们很可能会发现,他们觉得很平常的话,在我们今天这个时代都是不能说的。现在有没有伽利略这样的人和事?很可能是有的。

为了找出那些“不能说的话”,让我们问自己,它们会不会是真的?OK,当你发现某些言论很可疑时,你可以这样想,那些话听上去真是大逆不道(或者其他类似的形容词),但是有没有可能是真的?这就是找出“不能说的话”的第一种方法:判断言论的真伪。

异端邪说

除了真话以外,“不能说的话”还有一种可能。有些想法,纯粹因为非常特别,而不能说出口。比如,某个话题极其富有争议,不管是对是错,没有人敢在公开场合谈论它。我们怎样才能发现这种情况呢?

我们把这种不一定正确、但是极富争议的言论称为“异端邪说”。关注“异端邪说”,是找出“不能说的话”的第二种方法。历史上的每一个年代,都会给“异端邪说”贴一些标签,目的是在人们开始思考它们是否为真之前就把它们封杀。“亵渎神明”、“冒犯圣灵”、“异端”都是西方历史上常见的标签,当代的标签则是“有伤风化”、“不得体”、“破坏国家利益”等。以前时代的标签在今天已经不可避免地失去了杀伤力,最多只能用于讽刺。但是在以前,它们真的有巨大的威力。

举例来说,“失败主义者”(defeatist)这个词,今天看来并没有特别的政治含义,只是指某个人比较悲观,不相信自己会成功。但是在1917年的德国,这个词却是一件锐利的武器,鲁登道夫将军(Erich Luderdorff)将所有政治对手都称为“失败主义者”,指责他们奉行投降主义,赞成签订第一次世界大战停战协议,从而用这个借口把他们清除出政府。第二次世界大战初期,英国首相丘吉尔及其支持者也广泛使用这个词压制反对声音。1940年那一年,任何反对丘吉尔对攻作战策略的人一律被称为“失败主义者”。这个标签贴得对不对?根本没人考虑这个问题。被贴上标签、受到打压后,人们都噤若寒蝉了。这真是很理想的压制反对声音的方法。

如今,当然也有这样的标签,从万金油式的“不适当”(inappropriate)到可怕的“制造分裂”(divisive),不胜枚举。好在不管是哪个年代,分辨这样的标签应该是比较容易的。你只要看看人们怎么称呼那些自己不赞成、但是又不算错的观点就行了。当一个政治家说自己的对手是错的,这是直截了当的批评。但是,如果他不谈论对错,却使用“制造分裂”或者“对种族问题不敏感”这样的标签攻击对手,那么我们就应该多加注意了。所以,如何找出那些我们自以为正确却会被未来人们耻笑的话?方法就是关注这些标签!比如,有一个标签叫做“性别歧视”,你问自己哪些想法属于“性别歧视”。然后,把头脑中跳出来的那些想法按照先后顺序列出来,再逐个追问,它们真的属于“性别歧视”吗?

这样的自问自答是不是太主观了?表面上确实很主观,但是实际上不是。因为最先从你头脑中跳出来的想法,往往就是最困扰你、很可能为真的想法。你已经注意到它们,但还没有认真思考过。

1989年,一些聪明的研究人员设计了一个实验,给放射科医生看胸部X光片,请他们判断病人有没有肺癌迹象。研究人员记录了医生检査X光片时的眼球运动。研究发现,即使那些医生漏掉了一个癌症病灶,他们的目光通常也会在那个地方停留一会。这说明他们的头脑深处已经意识到那里有问题,但是这种深层的反应没有上升为自觉的意识。我认为,类似的思维机制存在于每个人的头脑中,很多看似叛逆的“异端邪说”,早就“潜伏”在我们的思维深处。如果我们暂时关闭自我审查意识,它们就会第一个浮现出来。

时空差异

如果我们可以通晓未来,那么找出当代的那些表面上正确、实际上可笑的想法是一件很容易的事。伹是,不可能做到这一点。幸运的是,我们可以找到一种几乎有同样效果的替代方法:回顾过去。我们可以去找那些过去被认为理所当然,如今却被认为不可思议的事情,这是用来找出我们自己正在犯下的错误的第三种方法。

过去和现在之间的变化有时候代表了一种进步。在物理学领域,如果我们与前人看法不一样,那是因为我们是对的,他们是错的。但是,物理学是一门硬科学(hardscience),换了其他学科,我们很快就无法确定谁对谁错了。如果你遇到的是社会问题,请问过去的看法与现在的看法哪一个更正确?很多时候你无法回答,因为过去与现在之间的变化往往不是因为对错,而是因为社会观念变了。比如,法定结婚年龄的变化。

我们可以自以为是地相信,当代人比古人更聪明、更高尚。但是,了解的历史越多,就越明白事实并非如此。古人与我们是一样的人,他们既不是更勇敢,也不是更野蛮,而是像我们一样通情达理的普通人。不管他们产生怎样的想法,都是正常人产生的想法。

所以,我们就有了找出“不能说的话”的第三种方法:将当代观念与不同时期的古代观念diff[5]一下。diff得到的结果,有一些用当代标准衡量是很令人震惊的。古人认为可以说的话,我们认为是不可以说的。但是,你有把握断言你比古人更正确吗?

甚至也不用参照历史,当代世界是多种文化并存的世界。东方文化与西方文化存在巨大的差异,各种文化的价值观念和禁忌之处都不一样。所以,你也可以将我们的观念与其他文化的观念diff—下。(做到这一点的最好方法,就是亲自去看一看。)

你可能会因此发现互相冲突的观点。一种文化认为,认同x观点是骇人听闻的,而另一种文化认为,不认同x观点才是骇人听闻的。不过通常来说,禁忌是单方面的。x观点在一种文化中不允许说出口,而在其他文化中说不说都可以。我的判断是,认为x观点骇人听闻的一方更可能是错误的一方

有一些行为或观点,比如谋杀,在所有年代、所有地方都受到禁止或基本禁止。我认为,只有它们才是真正错误的行为或观点。如果某个观点在大部分时空都是不受禁止的,只有我们这个社会才把它当作禁忌,那么很可能是我们出错了。

举例来说,20世纪90年代早期,“政治正确”的潮流一度登峰造极。在这股潮流的推动下,哈佛大学向教职员工发了一本小册子,上面说除了其他规定以外,请尽量避免赞扬同事或学生的衣着,那样做是不合适的。“你的衬衫很不错”(nice shirt)这一类的话都不能说。我想,这种规定在全世界古往今来的各种文化之中是很罕见的。在别的地方,赞美他人的衣着更可能被看作是有礼貌的表现,而不是一种非礼。这个事件也许是一个较为温和的例子,说明了1992年马萨诸塞州的坎布里奇[7]存在着一种古怪的禁忌。要是未来的人们坐着时间机器碰巧在那个时间来到那里,这就是他们“不能说的话”。

道貌岸然

那些“不能说的话”就是这样被阻止进入我们头脑的。你可以想象一下,假定有一个康拉德[10]式的当代人物,他在非洲当雇佣兵,然后去了尼泊尔当医生,后来又到迈阿密经营夜总会。具体干什么并不重要,反正他就是一个见多识广的人。现在,我们把这个人的头脑,与一个在美国郊区长大的、乖巧守规矩的16岁女生的头脑,做一个比较。前者的所思所想会不会令后者惊骇不已?他知道真实世界是什么样,而她知道的,或者至少体现在她言行上的,不过是父母精心灌输的一个假想世界。两者减一下,我们就可以知道不能说的到底是哪些话了。

机制

我还想到了第五种方法,可以找出“不能说的话”,那就是去观察禁忌是如何产生的。某种道德观念到底是怎么出现的,又是怎么被其他人接受的?如果我们能够理解它的产生机制,可能就可以应用于我们自己的时代。

流行的道德观念与其他普通的流行时尚的产生方式似乎是不一样的。一般来说,流行的时尚产生于某个有影响力的人物,他突发奇想,接着其他人纷纷模仿。15世纪晚期,欧洲流行一种宽头鞋(broad-toed shoe),原因是当时的法国皇帝査理八世长了六根脚趾。20世纪20年代,著名电影明星Frank Cooper决定改名,他把Frank改成一个印第安纳州工业小镇的名字Gary,以便突出自己粗犷硬朗的铁汉形象,结果导致这个名字风靡一时,很多父母都为儿子取名为Gary。但是,流行的道德观念不是这样,它们往往不是偶然产生的,而是被刻意创造出来的。如果有些观点我们不能说出口,原因很可能是某些团体不允许我们说。

那些团体神经越紧张,它们所产生的禁止力量就越大。伽利略因为宣传日心说而遭到教廷的审判,这件事讽刺的地方在于,他只是在宣传哥白尼的观点,而后者却安然无恙。事实上,哥白尼不仅不反对教廷,还是一个虔诚的天主教教士,他把自己的著作献给教皇。不幸的是,伽利略正赶上教廷内部反对派上台,宗教改革被压制,任何非正统的思想遭受到前所未有的严厉控制和禁止。

为了在全社会制造出一个禁忌,负责实施的团体必定既不是特别强大也不是特别弱小。如果一个团体强大到无比自信,它根本不会在乎别人的抨击。美国人或者英国人对外国媒体的诋毁就毫不在意。但是,如果一个团体太弱小,就会无力推行禁忌。有一种行为怪癖叫做“嗜粪症”(coprophila),它的患者人数以及影响势力眼下似乎就不太强大,无法把自己的观点推广给其他人。

我猜想,道德禁忌的最大制造者是那些权力斗争中略占上风的一方。你会发现,这一方有实力推行禁忌,同时又软弱到需要禁忌保护自己的利益。

大多数的斗争,不管它们实际上争的是什么,都会以思想斗争的形式表现出来。16世纪的英国宗教改革(English Reformation)本质上是为了争夺权力和财富,但是却表现为英国人要求自主的精神与罗马教廷腐化的控制之间的斗争。思想斗争更容易争取支持者。不管哪一方获胜,他们所代表的思想也就被认为获得了胜利,仿佛上帝通过选择胜利的一方表示了自己的倾向。

我并不是说斗争从来就与思想无关,而是要强调,不管实际上是否有思想斗争,斗争总是会以思想斗争的形式表现出来。正如刚刚过气的时尚并非一点儿也不时尚,失败一方的思想其实也并非一无是处。比如希特勒就很推崇写实派艺术(representational art),但是希特勒是失败者,所以写实派一直得不到认同,直到近年才开始复兴。

虽然,流行的思想观点与流行的服饰产生方式不尽相同,但是,它们的传播途径却很相似。第一批的接受者总是带有很强的抱负心,他们有自觉的精英意识,想把自己与普通人区分开来。当流行趋势确立以后,第二批接受者就加入进来了,人数比上一批庞大得多,恐惧心在背后驱使着他们[12]。他们接受流行,不是因为想要与众不同,而是因为害怕与众不同。

所以,如果你要寻找“不能说的话”,可以观察流行的产生方式,试着预测它会禁止哪些话。哪一个团体势力强大,却又精神高度紧张?这种团体喜欢压制什么样的思想观点?近来有没有什么社会斗争,失败的一方是哪一方,受到他们牵连的是什么样的思想观点?如果一个先锋人物想要挣脱当前的流行(比如上一代人的观点)脱颖而出,他会支持什么样的思想观点?随大流的人对什么样的思想观点抱有恐惧心?

这个方法的缺点是不全面,无法找出所有“不能说的话”。因为,我知道有些禁忌不是由于社会斗争而产生的,它们深深植根于过去的历史之中。但是,这个方法与前面四个方法结合在一起,会找出大量我们难以想象的“不能说的话”。

为什么这样做

有人可能会问,为什么要去找出“不能说的话”?为什么要故意打探那些龌龊的、见不得人的思想观点?你明知那里有挡住去路的石头,为什么还要把它们翻过来看个究竟呢?

首先,我这样做与小孩子翻石头是出于同样的原因:纯粹的好奇心。我对任何被禁止的东西都有特别强烈的好奇心。我要亲眼看一下,然后自己做决定。

其次,我这样做是因为我不喜欢犯错。如果像其他时代一样,那些我们自以为正确的事情将来会被证明是荒谬可笑的,我希望自己能够知道是哪些事情,这样可以使我不会上当。

再次,我这样做,是因为这是很好的脑力训练。想要做出优秀作品,你需要一个什么问题都能思考的大脑。尤其是那些似乎不应该思考的问题,你的大脑也要养成思考它们的习惯。

优秀作品往往来自于其他人忽视的想法,而最被忽视的想法就是那些被禁止的思想观点。举例来说,自然选择学说(natural selection)是一种伟大的理论。它的观点非常简单,你会奇怪为什么以前没有人想到。这是因为它与传统观点的差异实在太明显了,可能引发轩然大波,所以其他人不敢去想。达尔文也因此不得不非常小心,他只想当一个生物学家,不想陷入宗教争论。

在科学领域,质疑他人的结论和公认的假设是尤其重要的一件事,会提供巨大的科学创造的优势。科学家(或者至少是优秀科学家)做事的方式,准确地说,就是寻找传统观点无法自圆其说的地方,然后试着拆开那里,看个究竟,瞧瞧里面到底出了什么问题。新的理论就是这样产生的。换言之,一个好的科学家,并不仅仅是避开传统观点,还要努力打破传统观点。科学家就是要自找麻烦。这应该是任何学者的研究方式,但是科学家似乎特别愿意一探究竟。

为什么?可能仅仅是因为科学家比其他领域的学者更聪明。如果有必要的话,大多数物理学家有能力拿到法国文学的博士学位,但是反过来就不行,很少存在法国文学的教授有能力拿到物理学的博士学位[13]。或者,另一种原因是,在科学中,命题的真伪更显而易见,所以这使得科学家能够更勇敢地质疑传统观点。(这句话也可以这样说,因为科学命题的真伪更显而易见,所以你想在科学界谋职,就不得不训练自己的智力,去发现解决那些真正的问题,而不能仅仅当一个政治家,通过搞人事关系和派系斗争立足。)

不管是哪一个原因,看来存在一个很清晰的关联关系:智力越高的人,越愿意去思考那些惊世骇俗的思想观点。这不仅仅因为聪明人本身很积极地寻找传统观念的漏洞,还因为传统观念对他们的束缚力很小,很容易摆脱。从他们的衣着上你就可以看出这一点:不受传统观念束缚的人,往往也不会穿流行的衣服。

做一个异端是有回报的,不仅是在科学领域,在任何有竞争的地方,只要你能看到别人看不到或不敢看的东西,你就有很大的优势。眼下的美国汽车工业对于市场份额下降怨天尤人。但是,这件事再明显不过了,任何人只要略做观察,就能迅速说出美国汽车公司走下坡路的原因:它们生产烂车。更糟的是,长期以来,它们一直这样做,所以现在美国车完全是在吃品牌的老本,也就是说,消费者购买凯迪拉克汽车,不是因为汽车本身,而是因为它的品牌。实际上,现在的凯迪拉克早已不是1970年时的凯迪拉克了。但是,我想没人敢这么说[14]。否则,这些汽车公司早就把问题解决了。

训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。这就像田径比赛之前要傲一些伸展运动,把肢体活动开。你要把身体伸展到极限,远超过跑步所需要的那种程度,这样一来,比赛的时候才能跑得更快。同样,如果你能“远远地”跳出传统思维,提出让别人一听就脑袋轰一声炸开的惊人观点,那么你就在“小小地”跳出传统思维方面不会有任何困难。要知道,人们把后面的这种情况称为“创新”。

守口如瓶

一旦发现了“不能说的话”,下一步怎么办?我的建议就是别说,至少也要挑选合适的场合再说,只打那些值得打的仗。

假设未来的某一天,世界上爆发了一场运动,黄颜色被禁止了。任何东西都不得涂成黄色,违者就是“黄色分子”(yellowist),以破坏社会稳定罪论处。橙色可以容忍,但也很可疑。有一天,你终于觉醒了,意识到错的不是黄颜色,而是这个社会。如果公开这样说,就会被打成“黄色分子”,无数正义人士义愤填膺,对你口诛笔伐。如果你以此作为人生目的,一定要为黄颜色平反昭雪,现在的局面可能正中你下怀。但是,如果你的兴趣主要是别的事情,变成他人眼里的“黄色分子”对你是极大的干扰。与笨蛋辩论,你也会变成笨蛋。

这时你要明白,自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明自,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。我认为这样傲不可取,更好的方法是在思想和言论之间划一条明确的界线。在心里无所不想,但是不一定要说出来。我就鼓励自己在心里默默思考那些最无法无天的想法。你的思想是一个地下组织,绝不要把那里发生的事情一股脑说给外人听。“格斗俱乐部”的第一条规则,就是不要提到格斗俱乐部[15]。

1638年,英国诗人弥尔顿(John Milton)准备第一次访问意大利。曾经担任英国驻威尼斯大使的沃顿爵士(Hemy Wootton)告诉弥尔顿要记住一句座右铭“i pensieri stretti & il viso sciolto”。字面意思是“守口如瓶,笑脸相迎”,也就是说,你要对每一个人微笑,但是不要说出自己的真实想法。这是很明智的建议。因为弥尔顿是一个喜欢争论、好打嘴仗的人,而当时罗马教廷的宗教裁判所非常强势,所以沃顿爵士才会这样建议他。需要记住的是,弥尔顿的时代与我们的时代并没有本质不同。每个时代都有自己的忌讳,如果你触犯它们,就算没有坐牢,至少也会为自己惹来麻烦,干扰了正常生活。

我承认,“守口如瓶”看上去是一种怯儒的行为。每当我读到山达基教会(Scientology)的信徒对批评者骚扰不断[16],或者抗议以色列侵犯人权的人士被贴上“反犹太人”的标签[17],或者研究人员受到DMCA[18]诉讼威胁[19],我内心就有一个声音在高喊:“好吧,你们这些混蛋,让我们来说清楚。”可是问题在于,“不能说的话”太多了,如果口无遮栏,你就没时间做正事了。为了与他人论战,你不得不变成一个语言学家,比如诺姆·乔姆斯基[20]。

“守口如瓶”的真正缺点在于,你从此无法享受讨论带来的好处了。讨论一个观点会产生更多的观点,不讨论就什么观点也没有。所以,如果可能的话,你最好找一些信得过的知己,只与他们畅所欲言、无所不谈。这样不仅可以获得新观点,还可以用来选择朋友。能够一起谈论“异端邪说”并且不会因此气急败坏的人,就是你最应该认识的朋友。

笑脸相迎?

你的策略,简单说,就是不赞同这个时代的任何一种歇斯底里,但是又不明确告诉别人到底不赞同哪一种歇斯底里。狂热分子试图引诱你说出来真心话,但是你可以不回答。如杲他们不放手,一定要你回答“到底是赞成还是反对我们”,你不妨以不变应万变:“我既不反对也不赞成。”

不过,更好的回答是“我还没想好”。哈佛大学校长拉里·撒墨尔斯(Larry Summers)被逼表态时,就是这样说的[21]。他后来解释说:“别想在我身上做石蕊试验[22]。”人们喜欢讨论的许多问题实际上都是很复杂的,马上说出你的想法对你并没有什么好处。

假设社会上充斥着反对“黄色分子”的人,他们只要看谁不顺眼,就大肆攻击。你看不下去,准备出手反击。这时,有几种方法可以使你免于被贴上“黄色分子”的标签。你可以参考战争史上的局部战争案例,避免正面对抗敌人的大部队,只打一些小规模的局部战争。比如,从远处用弓箭骚扰他们就是很好的方法。

具体来说,一种方法就是逐步把辩论提升到一个抽象的层次。假定总的来说,你反对言论审查制度。公开质疑的时候,你一定要小心,不要提到具体的被审査的电影或者书籍。否则,对手就会一把抓住那部电影或那本书籍,声称你支持的其实不是言论自由,而是那些被审查的内容。你不要直接攻击某个标签,而要攻击它的“元标签”(meta-label)。所谓“元标签”,就是对某个标签的抽象描述。如果人们开始讨论元标签,那么原来的标签反而不会受到注意了。举例来说,“政治正确”(political correctness)就是一个“元标签”,是许多特定现象的总称。这个词现在被广泛使用,其实这恰恰意味着“政治正确”的时代正在开始消亡,因为它使得你可以从总体上攻击这个现象,而不会受到指控,不会被说成支持某一种特定的“政治不正确”现象。

另一种反击的方法就是使用隐喻(metaphor)。20世纪50年代,美国众议院的“非美委员会”(Un-American Activities Committee)以遏制共产主义为名,大肆迫害文艺界和政治界的进步人士。剧作家阿瑟·米勒创作了戏剧《萨勒姆的女巫》(The Crucible)[23]进行反击。虽然在戏中他一句也没有提到“非美委员会”,但是观众一眼就可以看出,他在讽刺现实,将搜捕共产党间谍比喻为莫须有的捉女巫。“非美委员会”根本无法做出回应,你总不能为审判女巫辩护吧?阿瑟·米勒的隐喻太贴切了,直到今天,“非美委员会”的行为还经常被描述为“搜捕女巫”(witch-hunt)。

所有反击方法之中,最好的一种可能就是幽默。狂热分子都有一个共同点:缺乏幽默感。他们无法平静地对待笑话。在幽默王国中,他们闷闷不乐,就像满身笨重盔甲的骑士走进了溜冰场,无所适从。一个现实的例子就是,维多利亚女王时代的英国人讲究宫廷礼仪,迂腐守旧,人们把这当作笑话看待,结果它好像就真的被笑话击垮了。它在当代的化身“政治正确”也将得到同样的命运。“我很高兴自己写了《萨勒姆的女巫》,”阿瑟·米勒写道,“但是回想起来,我常常希望自己有那种气质,写一出反映当时情况的荒诞喜剧。”[24]

永远质疑

一个荷兰朋友建议我,把荷兰作为具有宽容精神的社会的例子。没错,历史上,荷兰人确实长期具有相对开放的思想。几个世纪以来,这个地势低洼的欧洲国家一直是言论相对自由的地方。在那里,你可以放心说出其他地方不能说的话。这帮助它成为学术和工业的中心。(言论自由与这两者紧密结合的历史,比大多数人意识到的还要长。)哲学家笛卡儿虽然被认为是法国人,但是他的思想大部分是在荷兰境内形成的。

但是,我还是怀疑。荷兰这个国家到处都是法规和管制,有许许多多的事情都是明确禁止的。在这种情况下,你真的可以畅所欲言吗?

荷兰人认为自己思想开放,但是这种想法本身却什么也证明不了。有谁认为自己的思想不开放?美国郊区的中产阶级白人家庭普遍家教严格,限制孩子与外界多接触,可是在那里长大的女孩子也认为自己思想开放呢。不管问谁,人们都会说同样的话:“我们心态很开放,愿意接受新思想。”但是实际上,人们脑子里有一根界线,早就认准了什么是对的,什么是错的[25]。换言之,在他们看来,所有观点都是可以讨论的,除了那些错的观点。如果你的数学不好,那么你自己会知道,因为考试的时候你得不出正确答案。但是,如果你的思想很保守,你自己不会知道,而且你很可能还会持有相反的看法。请记住,所谓“流行”(传统观念也是一种流行),本质上就是自己看不见自己的样子。否则就不会有流行了。对于那些被流行抓住的人,流行就不再是流行,而是应该要做的正确事情。只有保持一定的距离才能观察到人们观念的变化,发现流行(也就是人们自以为正确的事情)到底是什么。

时间就是一种产生距离的简单方法。实际上,新的流行让旧的流行更容易被观察到,因为对比之下,旧的流行会显得很荒唐。从钟摆波动的一端望去,上一个周期的端点就显得特别遥远。

不过,想要摆脱你自己的时代的流行,需要一点自觉。没有了时间所产生的距离,你不得不自已创造距离。你不要让自己成为人群的一分子,而要尽可能地远离人群,观察正在发生的事情,特别注意那些被压制的思想观点。比如,有些软件提供“互联网过滤”功能(Web filter),防止孩子和雇员看到色情的、暴力的、宣扬仇恨的网站。什么才算是色情和暴力?什么叫做“宣扬仇恨”?这种功能听上去很像出自小说《1984》[26]。

各种各样的标签可能是外部线索的最大来源,帮助你发现这个时代流行的是什么。如果一个命题是错的,这就是它所能得到的最坏评价,足够批判它了,根本不用再加上任何其他标签。伹是,如果一个命题不是错的,却被加上各种标签,进行压制和批判,那就有问题。因为只要不是错的观点,就不应该被压制讨论。所以每当你看到有些话被攻击为出自XX分子或XX主义,这就是一个明确的信号,表明背后有问题。不管在1630年还是在2030年,都是如此。当你听到有人在用这样的标签,就要问为什么。

如果你发现自己也在用这些标签,那就更要问为什么。你不仅要远距离观察人群,更要远距离观察你自己。顺便提一句,这可不是激进的想法,儿童和成年人的主要差别就在这里。儿童精疲力竭时,可能会大发脾气,因为他不知道为了什么;成年人则会了解是个人的身体状况问题,与外界无关,说一句“没关系,我只是累了”。我想,通过类似的机制,一个人完全可以识别和抵制外界流行的道德观念,把它们与内心世界相分离。

如果你想要清晰地思考,就必须远离人群。但是走得越远,你的处境就会越困难,受到的阻力也会越大,因为你没有迎合社会习俗,而是一步步地与它背道而驰。小时候,每个人都会鼓励你不断成长,变成一个心智成熟、不再耍小孩子脾气的人。但是,很少有人鼓励你继续成长,变成一个怀疑和抵制社会错误潮流的人。

如果自己就是潮水的一部分,怎么能看见潮流的方向呢?你只能永远保持质疑。问自己,什么话是我不能说的?为什么?

4. 良好的坏习惯

但是,即使考虑到黑客令人恼火的种种怪癖,他们不服从管教的性格依然是利大于弊。我希望人们能理解,能更多地看到这种性格的长处。举例来说,好莱坞的电影人一直大惑不解,为什么黑客不喜欢版权法。在黑客网站Slashdot上面,版权是永恒的讨论热点。为什么程序员那么关心版权,而不是其他事情?

部分原因是,有些公司为了防盗版而使用了禁止复制的技术。这等于交给黑客一把锁,他的第一反应肯定是如何才能打开它。但是,这里面还有更深层次的原因,对于版权和专利这样的制度,黑客深感担忧。他们感到,保护“知识产权”的力度不断增大,已经威胁到了他们完成工作所必需的“思想自由”[4]。在这一点上面,他们的看法是正确的。

只有深入了解当前的技术,黑客才能构想下一代技术。知识产权的拥有者也许会说,不,谢谢,我们不需要你的帮助,我们自己就能开发下一代技术。他们错了,在计算机工业的历史上,新技术往往是由外部人员开发的,而且所占的比例可能要高于内部人员。1977年,IBM公司内部肯定有一些部门正在开发下一代电脑。他们没有料到的是,真正的下一代电脑不是诞生于IBM实验室,而是由两个与他们完全不相干的长头发年轻人在旧金山的一间车库里开发出来的。这两个年轻人,一个是史蒂夫·乔布斯,另一个是史蒂夫·沃兹尼亚克[5](图4-1)。差不多同一时间,计算机工业的几大巨头聚在一起,合作研发官方版的下一代操作系统Multics。但是,另外两个年轻人——26岁的肯·汤普森和28岁的丹尼斯·里奇——觉得Multics过分复杂,就另起炉灶,写出了一个自己的操作系统。他们参照Multics,为它取了一个搞笑式的名字Unix[6]。

最新的版权法设置了前所未有的障碍,禁止外部人员了解专有技术的内部细节,从而也就禁止了外部人员从这个途径产生新构想。过去,厂商使用专利,防止你出售他们产品的复制品,但是他们无法阻止你把产品拆开,了解内部的工作原理。最新的版权法将后面的这种行为定义为一种犯罪。如果我们不可以研究当前的技术,不能思考如何改进它,那么我们怎样才能开发出新技术呢?

具有讽刺意味的是,这种局面正是黑客自己造成的。计算机是《版权法》修改的根本原因。历史上,机器内部的控制系统一直是物理装置:齿轮、杠杆和连接器等。但是,计算机的出现使得机器的控制系统逐渐变成了软件,产品的价值也由软件来决定[7]。我这里所说的软件是一个统称,包括数据(data)在内。胶木唱片上的歌曲属于数据,是用物理方法压制在塑料盘片上的;iPod里的歌曲也属于数据,它储存在硬盘里面。

数据在本质上就是容易复制的。互联网的出现使得复制品更容易流通。难怪那些公司感到害怕了。但是,如同往常一样,恐惧影响了他们的判断。他们推动政府通过了严厉的法律,保护知识产权,作为对新技术的回应。立法者的原意可能是好的。但是,他们也许没有意识到,这样的法律弊大于利。

为什么程序员如此激烈地反对这样的法律?如果我是立法者,肯定对这种神秘现象有兴趣。这就好比如果我是一个农夫,半夜突然听到鸡舍有动静,肯定会去看个究竟。黑客都是聪明人,很少出现所有人意见一致的情况。如果他们都说有问题,那么也许真的就是什么地方出了问题。

那些法律有没有可能是错的?虽然它们原意是维护美国的利益,但是实际上却适得其反?想一想吧,理查德·费曼喜欢破解保险箱,真的很符合美国人性格。很难想象,当时的德国政府会有同样的幽默感。也许这不是巧合。

黑客是不服从管教的,这就是他们的本性。这也是美国人的本性。硅谷出现在美国,而不是出现在法国、德国、英国、日本,这绝非偶然。后面那些国家的人们总是按部就班地行事。

让我以政府官员听得懂的语言来解释这件事情。公民自由并不仅仅是社会制度的装饰品,或者一种很古老的传统。公民自由使得国家富强。如果将人均国民生产总值与公民自由的关系画成图,你会发现它们是很清楚的正相关关系。公民自由真的是国家富强的原因,而不是结果吗?我认为是的。在我看来,一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。专制国家会变成腐败国家,腐败国家会变成贫穷国家,贫穷国家会变成弱小国家。经济学里有一条拉弗曲线(Laffer curve),认为随着税率的上升,税收收入会先增加后减少。我认为政府的力量也是如此,随着对公民自由的限制不断上升,政府的力量会先增加后减小[11]。至少现在看来,我们的政府很可能蠢到会真的把这个实验付诸实施,亲自验证一下这个观点。但是,税率提高了还能再降下来,而一旦这个实验铸成大错,就悔之晚矣,因为极权主义制度只要形成了,就很难废除。

这就是为什么黑客感到担忧。政府侵犯公民自由,表面上看,并不会让程序员的代码质量下降。它只是逐渐地导致一个错误观点占上风的世界。黑客对于公民自由是非常敏感的,因为这对他们至关重要。他们远远地就能感到极权主义的威胁,好比动物能够感知即将来临的暴风雨。

如果正如黑客所担忧的,近来那些旨在保护国家安全和知识产权的措施最终却成为一枚导弹,不偏不倚瞄准了美国的优势所在,那可真是太讽剌了。不过,这种事情早有先例:人们惊慌失措时采取的措施到头来产生了适得其反的效果。

5. 另一条路

1995年的夏天,我和我的朋友罗伯特·莫里斯[1]决定创业。那时,正赶上网景公司的股票即将上市[2],各种公关活动如火如荼,媒体都在谈论网络商务。当时大约有30家左右的网上商店,全部是手工制作网页。如果网络商务真要大规模发展,必须用专门的软件制作网上商店,所以我们决定动手写这样的软件。

第一周,我们打算写一个传统的桌面软件。没过几天,我们就想了另外一个方法:可以让软件在服务器上运行,浏览器作为操作界面。我们试着重写,让所有操作都通过网络完成。那时已经很清楚了,这就是我们的方向。如果软件运行在服务器上,一切都会简单得多,无论对于用户,还是对于我们。

事实证明我们是正确的。我们的公司后来被雅虎收购,现在的名字是Yahoo Store。我们的软件是最受欢迎的网上商店生成器,用户超过2万人。

创立Viaweb的时候,我们对别人说软件运行在服务器上,几乎没人懂这是什么意思。直到一年后,Hotmail[3]开始运作,人们才有点儿明白这个概念。现在,大家都知道了这是一个可行的方法,而且我们还有了专门的名字:应用服务供应商(Application Service Provider),简称ASP。我认为,大量的下一代软件都将采用这个模式。甚至最大的输家——微软公司,看来也明白了,部分软件从桌面消失将是不可避免的。如果软件从桌面移到服务器上,对于开发者来说,一切将发生根本性的变化。本文将站在先行者的角度,描述我们正在经历的种种令人惊叹的变化。由于软件转移到服务器的趋势才刚刚开始,所以我下面所写的是对未来的憧憬。

下一个潮流?

回顾桌面软件时代,我想我们会为人们忍受的种种不便惊叹不已。这就好像汽车刚诞生的时候,车主忍受的不便会令现在的人们惊叹不已一样。汽车诞生的头二三十年,你想当车主,非得成为汽车专家不可。但是汽车用处太大了,很多不是专家的人也想拥有它们。

计算机现在就处在这个阶段。一旦拥有了桌面电脑,你就被迫不情愿地学习很多东西,了解它的内部运作机制。超过一半的美国家庭拥有电脑,我妈妈就有一台,用来收发邮件和记账。几年前,她收到苹果公司的一封来信,上面说她可以优惠购买新版的操作系统。老太太被这些术语吓坏了。一个65岁的妇女,只用电脑收发邮件和记账,却被迫要和操作系统打交道,搞清楚要不要安装一个新版本,这真是太过分了。普通用户根本没必要知道“操作系统”这个词,更不要说“驱动程序”和“补丁”了。

现在,可以有另一种方法发布软件,用户再也不会被迫当上系统管理员了。互联网软件运行在服务器上,用户界面就是网页。对于普通用户来说,使用这种新型软件将更容易、更便宜、更机动、更可靠,通常也比桌面软件更强大。

使用互联网软件,除了软件本身,大多数用户不需要知道别的事情。所有那些乱七八糟、经常变动的东西,都放在服务器端,由精通此道的专业人员维护。所以,大多数时候,你不需要一台全功能的电脑(即本身可以运行软件的电脑)。你所需要的设备只要有键盘、屏幕、浏览器就够了,可能还有无线网卡。这样的设备没准就是指手机。不管它是什么,它肯定是一种消费类电子产品,价格大概在200美元左右,所以人们主要根据外观选择购买。你支付的上网费会超过硬件费用,就好像现在你的电话费超过电话机的价格一样[4]。

数据在客户端与服务器之间走一个来回大概耗时0.1秒,所以与用户密集互动的软件(比如Photoshop)仍然会把数据处理的部分放在桌面端。但是看看大多数人使用计算机的目的,你会发现0.1秒的时滞根本不成问题。我妈妈其实真的不需要一台桌面电脑,完全可以用互联网软件替代。像她这样的电脑用户有很多。

用户的胜利

我家附近,一辆汽车的保险杠贴着一张粘纸,上面写着“太麻烦,不如死”(death before inconvenience)。大多数人,在大多数时候,总是选择最省事的做法。如果互联网软件能够击败桌面软件,一定是赢在更方便这一优势上。无论从用户的角度还是从开发者的角度来看都是如此。

使用那些纯粹的互联网软件,你只需要一个能够上网的浏览器即可。所以,它不受地域限制,在任何地方都可以使用。但是,如果你使用安装在计算机上的桌面软件,那么就只能在这台计算机上使用。更糟的是,你的文件也存在这台计算机上。随着互联网越来越深入人心,桌面模式的弊端也就越来越明显。

最典型的例子就是网络界面的Email。大家现在都认定,随时随地都应该可以收发Email。如果Email是这样,为什么日程表不能这样呢?如果你能看到同事的文档,为什么不能编辑它呢?为什么你的数据非得禁锢在一台遥远写字桌上的电脑里呢?

“你的电脑”这个概念正慢慢成为过去时,取而代之的是“你的数据”。你应该可以从任何电脑上获取你的数据。或者更准确地说,在任何终端设备上获取你的数据,终端设备不一定是电脑。

终端设备不应该存储数据,它们应该像电话那样。事实上,终端设备最后可能就会变成电话,或者反过来,电话变成终端设备。终端越做越小后,你可以每天把它带在身上,就更没理由把数据存储在上面了,万一遗失或者被窃就很麻烦。把PDA遗忘在出租车上无异于损失一块硬盘,唯一的区别是你的数据现在掌握在别人手里,而不是被擦掉了。

有了互联网软件,你的数据和软件本身都不保存在终端设备上,不用安装就能使用。既然不用安装,也就不用担心安装出错了,再也不会有应用软件与操作系统不兼容的问题了,因为软件与你使用的操作系统彻底无关。

由于没有安装这一步,所以在“购买”之前试用互联网软件将变得非常普遍、非常容易。只要联上网站,应该就能免费试用该网站提供的服务。Viaweb的整个网站处处都是鼓励用户试用的提示。

试用demo之后,就可以登记成为正式用户了,只需要填一个很简单的表单。这应该是用户需要做的最后一点“多余的事情”了。使用互联网软件,你不需要为新版本付出额外的费用,或者做额外的准备工作,甚至可能你都不知道软件已经升级了。

现在,升级不再对用户形成大的冲击。久而久之,软件变得更强大了。这需要开发者付出一定的努力。他们必须正确地设计软件,使得它能够平滑升级,不让使用者感到困惑。这就是互联网软件面临的新问题,不过解决办法是有的。

所有用户都使用同样版本的互联网软件,bug一发现就会立刻得到纠正。所以,它的bug应该比桌面软件少得多。在Viaweb,我记得未解决的bug最多一次也总共只有十个,大部分问题都是一发现就得到了解决,不会遗留下来。这要比桌面软件小一个或几个数量级。

互联网应用程序能够同时被多人使用,所以非常适合团队协作性的工作。大多数用户现在还不了解软件协同办公,否则估计他们会强烈要求大部分应用程序都具备这个功能。举例来说,允许两个用户同时编辑一个文档是一项很有用的功能。Viaweb允许多个用户同时制作一个站点,主要原因倒不是因为用户要求,而是考虑到这是开发软件的正确方式,但是最后发现大多数用户都希望这样。

如果使用互联网软件,数据会更安全。即使硬盘损坏的风险依然存在,但是与用户没有关系,他们可以从此不关心这件事。风险发生在机房。互联网软件的运营方会备份数据,不仅因为它们的系统管理员很关心这一类事情,还因为一且数据丢失,公司将面临极大的麻烦。如果用户自己的硬盘坏了,他们不会发狂,因为不能去责怪别人;如果一家公司丢失了他们的数据,他们会怀着超乎寻常的怒火,冲着这家公司发飙。最后,互联网软件不太容易感染病毒。如果客户端只运行一个浏览器,病毒运行的概率就比较小,本机的数据不会遭到破坏。而专门攻击服务器端的病毒比较容易防御[5]。

对于用户来说,使用互联网软件不会有太大的压力。我觉得,大多数Windows用户使用桌面软件的时候都感到紧张,会有相当大的心理压力。释放这种压力,对你的产品将是一种巨大的推动。

代码之城

对于开发者来说,互联网软件与桌面软件最显著的区别就是,前者不是一个单独的代码块。它是许多不同种类程序的集合,而不是一个单独的巨大的二进制文件。设计桌面软件就像设计一幢大楼,而设计互联网软件就像设计一座城市:你不仅需要设计建筑物,还要设计道路、路标、公用设施、警察局、消防队,并且制定城市发展规划和紧急事件的应对方案。

软件的发布

软件bug

客户支持

全身心投入

逆向的《人月神话》

关注用户

金钱问题

目标客户

桌面电脑

微软公司

创业公司

勉强够用的网页

为什么不尝试一下?

6. 如何创造财富

一个命题

运气的成分

金钱不等于财富

大饼谬论

手工艺人

工作是什么

更努力地工作

可测量性和可放大性

小团体=可测量性

高科技=可放大性

潜规则

用户数量

财富和权力

7. 关注贫富分化

财富的老爹模式

偷窃

技术的杠杆效应

公理的不同意见

8. 防止垃圾邮件的一种方法

9. 设计者的品味

10. 编程语言解析

机器语言

高级语言

开放源码

语言的战争

抽象性

安全带还是手铐?

面向对象编程

文艺复兴

11. 百年后的编程语言

12. 拒绝平庸

秘密武器

Blub困境

创业公司的合气道

13. 书呆子的复仇

朝着数学的方法发展

为什么Lisp语言很特别

语言优势真正体现的地方

向心力

随大流的代价

一个诀窍

附录:编程能力

14. 梦寐以求的编程语言

流行的秘诀

外部因素

简洁

可编程性(Hackability)

一次性程序

函数库

效率

时间

再设计

梦寐以求的编程语言

15. 设计与研究

制作信息