概述
英文名:Hackers and Painters: Big Ideas from the Computer Age
作者:Paul Graham
译者:阮一峰
本书先讲了hacker和cracker的区别,再详细介绍如何创业和创造财富,最后介绍Lisp编程语言和如何设计黑客喜爱的编程语言。中间部分最有参考价值。
Paul Graham其人其事
运营创业公司,每天都像在战斗;而为大公司工作,就像在窒息中挣扎。
创业公式:搭建原型——>上线运营(别管Bug)——>收集反馈—->调整产品——.成长壮大,很自然的,和做产品的思路是一致的。
创始人的素质比创意更重要,小团队更容易成功,创始成员总数最好不要超过三个人。
创业是最有效的创造财富的方法,创业越来越简单了。
黑客:好玩、高智商、探索精神。
黑客不服从管教,具有叛逆精神。优秀的黑客养成了一种质疑一切的习惯。
行为怪异的人和愤世嫉俗的人比普通人更可能成为黑客。
译者序
想要把握这个时代,就必须理解计算机。理解计算机的关键,则是要理解计算机背后的人。表面上这是一个机器的时代,但是实际上机器的设计者决定了我们的时代。程序员的审美决定了你看到的软件界面,程序员的爱好决定了你有什么样的软件可以使用。
我们的时代是程序员主导的时代,而伟大的程序员就是黑客。
本书就是帮助你了解黑客、从而理解这个时代的一把钥匙。
在媒体和普通人的眼里,“黑客”(hacker)就是入侵计算机的人,就是“计算机犯罪”的同义词。但是,这并不是它的真正含义(至少不是原意),更不是本书所使用的含义。
要想读懂这本书,首先就必须正确理解什么是“黑客”。
为了把这个问题说清楚,有必要从源头上讲起。1946年,第一台电子计算机ENIAC在美国诞生,从此世界上一些最聪明、最有创造力的人开始进入这个行业,在他们身上逐渐地形成了一种独特的技术文化。在这种文化的发展过程中,涌现了很多“行话”(jargon)。20世纪60年代初,麻省理工学院有一个学生团体叫做“铁路模型技术俱乐部”(Tech Model Railroad Club,简称TMRC),他们把难题的解决方法称为hack。
在这里,hack作为名词有两个意思,既可以指很巧妙或很便捷的解决方法,也可以指比较笨拙、不那么优雅的解决方法。两者都能称为hack,不同的是,前者是漂亮的解决方法(cool hack或neat hack),后者是丑陋的解决方法(ugly hack或quick hack)。hack的字典解释是砍(木头),在这些学生看来,解决一个计算机难题就好像砍倒一棵大树。那么相应地,完成这种hack的过程就被称为hacking,而从事hacking的人就是hacker,也就是黑客。
从这个意思出发,hack还有一个引申义,指对某个程序或设备进行修改,使其完成原来不可用的功能(或者禁止外部使用者接触到的功能)。在这种意义上,hacking可以与盗窃信息、信用卡欺诈或其他计算机犯罪联系在一起,这也是后来“黑客”被当作计算机入侵者的称呼的原因。
但是,在20世纪60年代这个词被发明的时候,“黑客”完全是正面意义上的称呼。TMRC使用这个词是带有敬意的,因为在他们看来,如果要完成一个hack,就必然包含着高度的革新、独树一帜的风格、精湛的技艺。最能干的人会自豪地称自己为黑客。
这时,“黑客”这个词不仅是第一流能力的象征,还包含着求解问题过程中产生的精神愉悦或享受。也就是说,从一开始,黑客就是有精神追求的。自由软件基金会创始人理查德·斯托尔曼说:“出于兴趣而解决某个难题,不管它有没有用,这就是黑客。”
根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。只有其行为同时满足这三个标准,才能被称为“黑客”。另一方面,它们也构成了黑客的价值观,黑客追求的就是这三种价值,而不是实用性或金钱。
1984年,《新闻周刊》的记者史蒂文·利维出版了历史上第一本介绍黑客的著作——《黑客:计算机革命的英雄》(Hackers: Heroes of the Computer Revolution)。在该书中,他进一步将黑客的价值观总结为六条“黑客伦理”(hacker ethic),直到今天这几条伦理都被视为这方面的最佳论述。
(1) 使用计算机以及所有有助于了解这个世界本质的事物都不应受到任何限制。任何事情都应该亲手尝试。
(Access to computers—and anything that might teach you something about the way the world works—should be unlimited and total. Always yield to the Hands-On Imperative!)
(2) 信息应该全部免费。
(All information should be free.)
(3) 不信任权威,提倡去中心化。
(Mistrust Authority—Promote Decentralization.)
(4) 判断一名黑客的水平应该看他的技术能力,而不是看他的学历、年龄或地位等其他标准。
(Hackers should be judged by their hacking, not bogus criteria such as degrees, age, race, or position.)
(5) 你可以用计算机创造美和艺术。
(You can create art and beauty on a computer.)
(6) 计算机使生活更美好。
(Computers can change your life for the better.)
根据这六条“黑客伦理”,黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步。
所以,“黑客”这个词的原始含义就是指那些信奉“黑客伦理”而且能力高超的程序员。历史上一些最优秀的程序员都是“黑客”。除了上文提到的理查德·斯托尔曼,还包括Unix操作系统创始人丹尼斯·里奇和肯·汤普森,经典巨著《计算机程序设计艺术》的作者、斯坦福大学计算机教授高德纳,Linux操作系统创始人莱纳斯·托沃兹,“开源运动”创始人埃里克·雷蒙德,微软公司创始人比尔·盖茨等。正是黑客把计算机工业推向了更高的高度。
“黑客伦理”的一个必然推论就是,黑客不服从管教,具有叛逆精神。
黑客通常对管理者强加的、限制他们行为的愚蠢规定不屑一顾,会找出规避的方法。一部分原因是为了自由使用计算机,另一部分原因是为了显现自己的聪明。比如,计算机设备的各种安全措施就是最常被黑客破解的东西。史蒂文·利维对这一点有过一段生动的描述:
“对于黑客来说,关着的门就是一种挑衅,而锁着的门则是一种侮辱。……黑客相信,只要有助于改进现状、探索未知,人们就应该被允许自由地使用各种工具和信息。当一个黑客需要一样东西来帮助自己创造、探索或者改正某种设备时,他不会自找麻烦,不会接受那些财产专有权的荒谬概念。”
这就是黑客有时会入侵计算机系统的原因,他们的主要目的并不是侵犯别人的利益,这与那些计算机罪犯是不同的。
但是,20世纪80年代初,事情发生了变化。
1983年,一帮密尔沃基市的青少年黑客入侵了美国和加拿大的一些计算机系统,这件事被广泛报道,同年9月5日的《新闻周刊》封面报道的标题就是“小心:黑客在行动”,这是历史上主流媒体第一次使用“黑客”这个词。在报道的时候,媒体只注意和强调黑客行为一个很窄的方面:入侵系统。(可能因为这种行为容易引起公众的注意,提升报道的关注度。)他们把黑客简单定义为入侵系统、破坏安全设施的人。从此,大多数人对于黑客有了错误的看法。同时,那些入侵计算机的程序员也自称“黑客”,使得这个问题进一步复杂化。
杂志、电视剧、电影、小说都对黑客的这种形象大肆渲染。黑客成了反社会的技术高手的代名词,仿佛只要他坐在键盘前,就有一种从事犯罪活动的魔力,可以操纵任何与网络相连的机器,从核弹到车库大门,都在黑客敲打键盘的操作之中被控制。根据这种观点,黑客在最好的情况下是一个没有认识到自己能力的清白的人,在最坏的情况下则是一个恐怖分子。在过去几年中,随着计算机病毒的泛滥,黑客在大众心目中已经成了一个有害的人群。
那些传统意义上的黑客不认同这样使用“黑客”这个词。他们认为,历史上确实有一些正直的黑客,为了亲自了解系统,做过违反法规的入侵举动。但是,那些人并没有恶意,而且从一开始恶作剧就是黑客文化的一部分,仅仅由此推断入侵和破坏系统就是黑客文化的实质完全是错误的。真正的黑客致力于改变世界,让世界运转得美好。媒体对黑客的定义未免过于片面。
为了澄清“黑客”这个概念,他们提出只有传统意义上的黑客才能被称为hacker,而那些恶意入侵计算机系统的人应该被称为cracker(入侵者)。这个观点已经在程序员社区中得到普通认同。
本书正是在这个意义上使用“黑客”这个词。在本书中,“黑客”就是指最优秀的程序员,而不是入侵计算机系统的人。
为了帮助读者理解黑客,全书15章可以大致分成三个部分。
第一部分从第1章到第4章,解释了黑客是如何成长的以及他们看待世界的一些观点。
第二部分从第5章到第9章,解释了黑客怎样做出自己的成果,这些成果又是怎样对全世界产生了影响。
第三部分从第10章到第15章,解释了黑客的工具(编程语言)和工作方法,这是黑客文化的基础和核心。
作者想让公众了解,黑客并不神秘,更不是技术怪人。Hackers and Painters这个书名就是在提示应该把黑客与画家当作同一种人看待。和画家一样,黑客只是怀有一门特殊手艺、有创造天赋的普通人。这个书名还有另一层含义,即编程是一种艺术创作,黑客就是艺术家,开发软件与画家作画、雕塑家雕刻、建筑师设计房屋并没有本质不同。
总之,这是一本帮助你理解这个时代的书。作者想教给你的其实是新思想。读完以后,你看待世界的眼光很可能会完全不同了。如果你想在21世纪立足,理解这一次新的技术革命,做一个掌握自己命运的成功者,我建议你读这本书。
前言
本书尝试解释计算机世界里发生了什么事,所以,它不仅仅是写给程序员看的,也适合所有人。比如,第6章讲如何致富,我相信这是所有读者普遍感兴趣的内容。
你可能注意到了,过去三十年中,很多赚到大钱的人都是程序员,比如比尔·盖茨、史蒂夫·乔布斯、拉里·埃里森。为什么?为什么是程序员,而不是土木工程师,或者摄影师,或者精算师?第6章将告诉你答案。
软件带来财富,仅仅代表了大趋势的一面而已。这种大趋势就是本书的主题。我们的时代是计算机时代。以前,人们曾经认定这个时代应该是太空时代或者原子时代。但是事实证明,它们只是公关公司发明的概念。计算机对人类生活的影响远远超过了太空航行或者原子技术的影响。
我们生活中的一切,都正在成为计算机。打字机被计算机取代了,电话也变成了计算机,照相机亦是如此。很快,电视机也将变成计算机。当今小轿车所具备的计算能力比1970年占满一间屋子的大型计算机还要强。信件、百科全书、报纸,甚至本地的小店,都正在被互联网取代。所以,如果你想理解我们目前的世界以及它的未来动向,那么多了解一些黑客的想法会对你有帮助。
黑客?那不是侵入他人计算机的人吗?在外行人看来,这个词的意思就是这样。但是在计算机世界中,黑客指的是专家级程序员。因为本书的目的是解释真实的计算机世界是怎么一回事,所以我决定冒着被误解的风险,按照行业内的定义使用这个词。
本书的前几章回答了一些大家可能都想过的问题。怎样创业才会成功?技术是否造成了技术人员与普通人之间的隔阂?程序员到底在做些什么?为什么那些读高中时普普通通的学生,最终却摇身一变成为世界上最有影响力的人士?微软公司会控制互联网吗?怎样才能对付垃圾邮件?
本书后面几章谈的是大多数非计算机行业的人士没有想过的问题——编程语言。为什么普通人要去关心编程语言?因为如果你想了解黑客,就必须懂一点编程语言。这就好比回到1880年,如果你想理解技术发展,就必须懂一点蒸汽机。
计算机程序只是文本而已。你选择什么语言,决定了你能说什么话。编程语言就是程序员的思维方式。
因此很自然,编程语言对程序员的思想有巨大的影响。你从他们写的软件中就可以看出来。旅游网站Orbitz成功打入了竞争激烈的网络订房订票市场。该市场原先被两大巨头主宰,一个是微软公司,另一个是拥有数十年电子预定服务经验的Sabre。Orbitz是怎么从它们手中抢到市场的?最主要的原因就是它使用了一种更好的编程语言。
根据使用的语言不同,程序员往往会被分成不同的派别。人们区分程序员甚至不是看他们写了什么程序,而是看他们使用什么语言。所以,声称一种语言优于另一种语言被认为是不礼貌的行为。但是,没有一个编程语言的设计者会相信“不同的语言各有千秋”这种文绉绉的客套话。我将直言不讳地说出自己对于编程语言的看法,这也许会令很多人不快,但是如果想要理解黑客,我真的觉得没有其他更好的方法。
有些读者可能不理解第3章的内容。这一章与计算机有什么关系?事实是黑客很在乎言论自由。Slashdot(它是黑客世界的《纽约时报》)有一个专栏讨论这个问题。我想Slashdot的大多数读者都认为重视言论自由是天经地义的事情。不过《飞机与飞行员》(Plane & Pilot)杂志就肯定不会有一个这样的栏目。
为什么黑客那么在乎言论自由?我认为,部分原因在于,革新对于软件行业实在是太重要了,而革新和异端实际上是同一件事。优秀的黑客养成了一种质疑一切的习惯。这是肯定的,因为如果你不得不同一台机器打交道,而这台机器全部由文字组成,像机械式手表一样复杂,并且规模大出1000倍,那么你也会养成这种习惯的。
此外,我还认为,行为怪异的人和愤世嫉俗的人比普通人更可能成为黑客。计算机世界就像是智力世界的大西部,在那里没有你不敢想的事情,只要你愿意承担冒险后果。
如果我成功实现了自己对这本书的设想,那么它也将是一片智力的大西部。我不希望你带着某种压迫感来阅读此书,心里想着:“没办法,这些书呆子看上去正在接管世界。我最好能懂一点他们正在干的事情,这样就不会被他们整出来的下一个东西唬到了。”如果你喜欢思考,阅读此书应该会带给你很多乐趣。虽然黑客从外表看上去一般都是呆呆的,但是他们的大脑内部却是一个有趣得让你吃惊的地方。
写于马萨诸塞州坎布里奇
2004年4月
1 为什么书呆子不受欢迎:他们的心思在别的地方。
原文
我认为,这就是问题的根源。“书呆子”的目标具有两重性。他们毫无疑问想让自己受欢迎,但是他们更愿意让自己聪明。“受欢迎”并不是你在课后时间随便做一做就能实现的,尤其是在美国的中学中,在这里,所有人为了个人魅力都会进行激烈竞争。
……
书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。他们的注意力都放在读书或者观察世界上面,而不是放在穿衣打扮、开晚会上面。他们就像头顶一杯水来踢足球,一边踢球,一边拼命保持不让水洒出来。其他人都在一门心思玩足球,遇到这样的对手,自然能够毫不费力地击败,并且心里还奇怪,对方怎么如此无能。
就算书呆子心里想着变得与其他小孩一样受欢迎,做起来却是难上加难。因为那些受欢迎的小孩从小就在琢磨如何受欢迎,打心底里追求这个。但是,书呆子从小琢磨的却是如何更聪明,心底里也是这样追求的。这都是受父母的影响,书呆子被教导追求正确答案,而受欢迎的小孩被教导讨人喜欢。
到目前为止,我一直把“聪明的学生”和“书呆子”当作同义词,好像它们完全可以换着用。事实上,只有在我上面谈到的这种环境中才能这样使用。所谓“书呆子”,其实只是指这个人的社交技能不够强。但是,你到底需要多“强”的社交技能,取决于你所处的环境。在普通的美国学校中,成为“强人”的标准高得吓人(或者至少是十分特别),即使你不是很“呆”的人,相比之下,也只能算是呆子了。
仅有很少的聪明小孩,能够分配出足够的心思,去关心如何让自己受欢迎。他们往往碰巧还具有俊俏的外表、运动员的体格,或者受人瞩目的兄弟姐妹。不然的话,你就别无选择,只能成为书呆子了。这就是为什么聪明的小孩在青少年时期,比如11岁到17岁,有着一生中最糟的人生经历。人生的这个时期比其他任何时期更多地受到你的受欢迎程度的影响。
11岁以前,小孩的生活由家长主导,其他孩子的影响有限。孩子们不是不关心小学里其他同学的想法,但是后者不具有决定性影响。小学毕业以后,这种情形开始发生变化。
到了11岁左右,孩子们逐渐把家庭生活当作寻常事了。他们在同伴中开辟了一个新的世界,并认为那个世界才是重要的,比家里的世界更重要。实际上,如果他们在家里与父母发生冲突,反而能在那个新的世界中挣得面子,而他们也确实更在乎那个世界。
但是,问题在于,孩子们自己创造出来的世界是一个非常原始的世界。如果你听任一群11岁的孩子自行其是,最后就会发生小说《蝇王》中的情景。我同许多美国孩子一样,在学校里就被要求阅读此书。这可能不是巧合,有人可能希望借此向我们指出,我们这些孩子就是“野蛮人”,我们自己创造的世界是一个残酷和愚蠢的世界。对当时的我来说,领会这些意思有点太难了。虽然这本书读起来让人觉得完全可信,但是我一点儿没有读出文字背后的意思。当年,他们还不如直截了当告诉我们,我们这些孩子就是“野蛮人”,我们的世界愚不可及。
要是不受欢迎仅仅意味着不受到关注,书呆子们可能觉得还能忍受。不幸的是,在学校里不受欢迎等同于被歧视和被欺负。
为什么会被歧视和欺负?所有现在还在学校里读书的人可能会又一次觉得,怎么会有人问出这么蠢的问题。怎么可能会有其他结果呢?当然会有其他结果。一般来说,成年人就不会去欺负书呆子。为什么小孩子会这样做呢?
一部分原因是,青少年在心理上还没有摆脱儿童状态,许多人都会残忍地对待他人。他们折磨书呆子的原因就像拔掉一条蜘蛛腿一样,觉得很好玩。在一个人产生良知之前,折磨就是一种娱乐。
孩子们欺负书呆子的另一个原因是为了让自己感到好受一些。当你踩水的时候,你把水踩下去,你的身体就会被托起来。同样,在任何社会等级制度中,那些对自己没自信的人就会通过虐待他们眼中的下等人来突显自己的身份。我已经意识到,正是因为这个原因,在美国社会中底层白人是对待黑人最残酷的群体。
但是我认为,孩子们欺负书呆子的主要原因也与追求“受欢迎”的心理有关。怎样才能让自己更受欢迎?个人魅力只是很小的一方面,你应该更多地考虑如何结盟。秘诀就是不停地设法使自己与其他受欢迎的人变得关系更密切。没有什么比一个共同的敌人更能使得人们团结起来了。
这就好比一个政客,他想让选民忘记糟糕的国内局势,方法就是为国家找出一个敌人,哪怕敌人并不真的存在,他也可以创造一个出来。一群人在一起,挑出一个书呆子,居高临下地欺负他,就会把彼此联系起来。一起攻击一个外人,所有人因此就都成了自己人。这就是为什么最恶劣的以强凌弱的事件都与团体有关的原因。随便找一个书呆子,他都会告诉你,一群人的虐待比一个人的虐待残酷得多。
如果说其中还有一丝安慰,那就是书呆子不妨记住,这种虐待不是针对个人的。一群孩子成群结伙地欺负你,那并不是因为你做错了什么,而是因为这一伙人需要找一件事情一起干,这就好像一群人成群结伙地去打猎一样。他们实际上并不恨你,他们只是需要一个共同的目标。
因为书呆子是不受欢迎的,处在学校的底层,所以全校学生都把书呆子当作一个可供欺负的安全目标。如果我没记错的话,最受欢迎的孩子并不欺负书呆子,他们不需要靠踩在书呆子身上来垫髙自己。大部分的欺负来自处于下一等级的学生,那些焦虑的中间层。
麻烦的是,这样的人数量庞大。受欢迎的学生的分布并不是金字塔形的,而是像一个倒放的梨子,底部逐渐收窄。最不受欢迎的人数相当少。(我相信,在我们画的餐桌分布图中,称得上D桌的,只有我所在的那一桌。)所以,想要欺负书呆子的人比被欺负的书呆子多得多。
与不受欢迎的小孩保持距离,可以为你加分;那么与他们关系密切,就会为你减分。我认识的一位女性说,她在髙中时对书呆子有好感,但是害怕被人看到她与书呆子说话,因为其他女孩会因此取笑她。不受欢迎是一种传染病,虽然善良的孩子不会去欺负书呆子,但是为了保护自己,也依然会与书呆子保持距离。
难怪聪明的小孩读中学时往往是不快乐的。他们有其他的兴趣,没有多余的精力用来使自己更受欢迎。你在其他地方有所得,就会在这个地方有所失。不受欢迎使得书呆子成为全校攻击的目标。令人惊奇的是,这种噩梦般的情景并非出自任何有预谋的恶意,而仅仅因为这个特殊的环境。
对我而言,最糟糕的日子是初中。孩子们内部的世界刚刚形成,一切都很严酷,聪明的孩子与普通的孩子,人与人之间的差异慢慢开始显露。几乎每一个和我讨论过的人都同意,人生的最糟糕时期是在11岁到14岁。
在我读的学校,八年级的时候(也就是我12~13岁的那一年)曾经发生过一件引起轰动的事情。有一个老师在等校车的时候,偶然听到一群女生在议论某个书呆子如何被欺负,她深感震惊,第二天就向全班发表了言词恳切的呼吁,请大家不要如此残忍地对待同学。
她的呼吁并没有产生实际效果。那时,最触动我的是,她居然对这件事感到震惊。这是不是意味着她以前对此一无所闻?她觉得这一切是不正常的?
没错,成年人不知道孩子们内部发生的事。认识到这一点很重要。在抽象意义上,成年人知道孩子的行为有时是极端残酷的,这正如我们在抽象意义上知道贫穷国家的人民生活极端艰难。但是,像所有人一样,成年人不喜欢揪住不放这种令人不快的事实。你不去埋头探寻,就不会发现具体的证据,就会永远以为这件事是抽象的。
公立学校的老师很像监狱的狱卒。看管监狱的人主要关心的是犯人都待在自己应该待的位置。然后,让犯人有东西吃,尽可能不要发生斗殴和伤害事件,这就可以了。除此以外,他们一件事也不愿多管,没必要自找麻烦。所以,他们就听任犯人内部形成各种各样的小集团。根据我读到的材料,犯人内部的关系是扭曲、野蛮、无孔不入的。处在这种人际关系的最底层可不是好玩的事。
总体上看,我就读的学校与上面说的监狱差不多。校方最重视的事情,就是让学生待在自己应该待的位置。与此同时,让学生有东西吃,避免公然的暴力行为,接下来才是尝试教给学生一些东西。除此以外,校方并不愿意在学生身上多费心思。就像监狱的狱卒,老师们很大程度上对学生是放任自流的。结果,学生就像犯人一样,发展出了野蛮的内部文化。
可是,为什么离开学校以后,真实的世界却能友好地对待书呆子呢?答案似乎很简单,因为那是成年人的世界,他们都成熟了,不会把书呆子挑出来欺负。不过,我觉得这不是主要答案。监狱里的成年人不也照样以强凌弱吗?而且很显然,上层社会的阔太太之间也是如此,在曼哈顿的某些地方,女性之间的交往听来就像高中时代的延续,同样充满了各种算计和勾心斗角。
我认为,真实世界的关键并非在于它是由成年人组成的,而在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。学校、监狱、上流社会的女士午餐会,都做不到这一点。这些场合的成员都好像关在封闭的泡沫之中,所作所为只对泡沫内部有影响,对外部没有影响。那么很自然地,这些场合就会产生野蛮的做法。因为它们不具备实际功能,所以也就无所谓采用的形式。
当你所做的事情能产生真实的效果,那就不仅仅是好玩而已了,发现正确的答案就开始变得重要了,这正是书呆子的优势所在。你马上就能联想到比尔·盖茨。他不善于社交是出了名的,但是他发现了正确的答案,至少从收入上看是如此。
真实世界的特点是,它极其庞大。如果总体足够大,即使是人数最少的少数派,只要聚集在一起,也能产生可观的力量。在真实世界中,书呆子在某些地方聚集起来,形成自己的社区,智力因素成为那里最被看重的东西。有时,这种因素甚至会以相反的形式表现出来,特别是在大学的数理学系,书呆子甚至会夸大笨拙,以显示自己的聪明。约翰·纳什非常钦佩诺伯特·维纳就学维纳的样子,经过走廊的时候都用手扶着墙走路。
我13岁的那一年,对世界的全部认识,就是身边看到的一切。我以为,我所经历的种种扭曲的事件就是世界的样子。看上去,这是一个残酷的世界,也是一个乏味的世界,我不太肯定哪一个更糟一些。
因为我在这个世界中过得并不好,我觉得一定是自己什么地方做错了。我没有意识到,作为书呆子,我不适应周围环境,某种程度上正说明我领先了一步。书呆子已经在思考的东西,正是真实世界看重的东西。他们与别人不一样,不把所有时间用来玩一种耗尽全力但又亳无意义的游戏。
我们的感受,有点像一个被重新塞进中学的成年人。他不知道穿什么衣服,听什么音乐,用什么暗语。在别的孩子眼里,他就像一个彻头彻尾的外星人。不过,成年人很清楚不用在乎别人怎么想,我们就没有这种自信了。
许多人似乎认为,聪明的小孩在人生的这个阶段应该与“正常的”小孩待在一起。也许吧。但是,至少在某些情况中,书呆子感到不适应的真正原因是其他人都是疯子。我记得读髙中的时候,有一次在体育馆观看校运动队的出征大会,啦啦队把对手的模拟像扔到看台上,观众一哄而起,把它撕成碎片。我感到自己仿佛是一个探险家,正在目睹某种奇特的部落仪式。
如果能回到过去,我会向13岁的我提供一些建议,主要告诉他要昂起头看世界。我在那个年纪根本不知道这一点,而我身边的世界又虚假得像奶油夹心蛋糕一样。不仅是学校,整个小镇都很虚假,不像真实的世界。为什么人们要搬到郊区去住?为了养育下一代!难怪郊区生活是如此地乏味和贫瘠。整个镇子就像一个巨大的幼儿园,所有一切都是为了教育下一代而有意识地造出来的。
在我生长的这个地方,感觉整个世界就是这么大,你根本没有别的地方可去,没有别的事情可做。这一点都不令人意外。郊区就是故意这样设计的,与外部世界隔离,不让儿童沾染到外界有害的东西。
至于学校,不过是这个虚假环境中关住牲口的围栏。表面上,学校的使命是教育儿童。事实上,学校的真正目的是把儿童都关在同一个地方,以便大人们白天可以腾出手来把事情做完。我对这一点没有意见,在一个高度工业化的社会,对孩子不加管束,让他们四处乱跑,无疑是一场灾难。
让我困扰的,不是把孩子关在监狱里,而是(a)不告诉他们这一点,(b)把这监狱的大部分交给犯人来管理。孩子们被送进来,花6年时间,记住一些毫无意义的事实,还要身处在一个由四肢发达的小巨人管理的世界,那些巨人们只知道追逐一个椭圆形的、棕色的球,好像这是全世界最天经地义的事情。这简直就像一场超现实的鸡尾酒化妆晚会,如果孩子畏缩不前、瑟瑟发抖,他们就会被视为怪人。
生活在这个扭曲的世界,不仅仅对书呆子,对所有孩子来说,都是充满压力的。就像任何一场战争,胜利方也是要付出代价的。
成年人肯定不可避免地看到了孩子们在受苦受难。他们为什么不做点什么呢?因为他们认为那是青春期在作祟。成年人对自己说,孩子们不快乐的原因是因为他们身体内部新出现了大量的化学物质——激素。激素在血液中奔流,把所有事情都搞得一团糟。整个社会系统一点问题也没有,孩子们到了这个年纪,不可避免地会感觉很糟糕。
这种看法无所不在,甚至孩子们自己都相信了。但是相信这种话可能一点帮助也没有。你告诉一个人,他的脚天生就是坏的,并不能阻止他去怀疑他可能穿错了鞋子。
我就不太相信这种理论,凭什么说13岁的小孩自己有问题。如果这是激素过多的生理问题,那就应该普遍存在。可是,蒙古的游牧民族在13岁时难道也是这么空虚吗?我读过许多历史资料,找不到任何一条20世纪之前的历史事实支持这个理论上应该普遍存在的现象。文艺复兴时期的很多青少年学徒看上去过得很开心很投入。当然,他们彼此之间也有争斗和阴谋诡计(米开朗基罗小时候就曾经被其他小孩打断过鼻子),但是他们并不疯狂。
就我所知,青少年因为激素而行为失常的理论与美国中产阶级迁至郊区的进程是同步出现的。我认为这不是巧合,青少年是被迫去过这种生活的,他们是被逼疯的。文艺复兴时期的学徒是整天劳碌的牧羊狗,而今天的青少年则是神经兮兮、供人玩耍的哈巴狗。他们的疯狂源于到处都是一片可怕的无聊。
我读中学的时候,自杀是聪明学生中永恒的话题。虽然在我认识的人当中没有人真的自杀,但是不少人有这样的设想,其中一些人可能还真的尝试过。对于大多数人来说,自杀只是一个姿态。就像其他青少年一样,我们都喜欢有戏剧效果,而自杀看上去就非常富有戏剧性。但是也有部分原因是因为我们的生活有时真的是非常悲惨。
被其他小孩欺负只是问题的一部分。还有别的问题存在,甚至可能是更糟糕的问题。那就是我们没有得到真正的工作,没能发挥我们的才能。人类喜欢工作,在世界上大多数地方,你的工作就是你的身份证明。但是,我们那时做的所有事情根本就是无意义的,至少那时看来是这样。
最好的情况下,那些事情也不过是遥远的将来我们可能从事的实际工作的练习。它所面向的目标是如此遥远,以至于当时我们都不知道自己练习这些到底是为了干什么。更常见的情况是,那些事情不过是一系列随意设置的绳圈,你被要求一个个跳过去。你在学习中遇到的文字都是专为考试而设计的,目的就是为了出题,而不是为了讲清楚问题。(南北战争的三个主要原因是……等到考试的时候,就会有一道题:请列出南北战争的三个主要原因。)
而且,没有办法回避那些事情。成年人已经达成共识,认定通往大学的途径就是这样的。逃离这种空虚生活的唯一方法,就是向它屈服。
过去的社会中,青少年扮演着一个更积极的角色。工业化时代到来前,青少年都是某种形式的学徒,不是在某个作坊,就是在某个农庄,甚至在某艘军舰上。他们不会被扔到一旁,创造自己的小社会。他们是成年人社会的低级成员。
以前的青少年似乎也更尊敬成年人,因为成年人都是看得见的专家,会传授他们所要学习的技能。如今的大多数青少年,对他们的家长在遥远的办公室所从事的工作几乎一无所知。他们看不到学校作业与未来走上社会后从事的工作有何联系(实际上,还是有那么一点点联系)。
如果青少年更尊重成年人,那么成年人也会更接受青少年。经过几年的训练,学徒就能担当重要的职责。即使是那些刚招收进来的学徒,也能用来送信或打扫场地。
如今的成年人根本不接受青少年。一般来说,他们都是在办公室工作,所以就在上班的路上,顺路把孩子送到学校去关着,这有点像他们周末外出度假时,把狗送到寄养的地方。
与此同时,社会发生了什么变化?我们被迫面对一个更严峻的问题。它与当前的其他许多难题有着共同的起因,那就是“专业化”(specialization)。当工作的专业程度越来越高时,我们就必须接受更长时间的训练。工业化时代来临之前,儿童最晚大约在14岁就要参加工作,如果是在农庄(那个时代大多数人生活在农村),参加工作的时间就更早。如今,只要一个青少年读大学,他就要等到21岁或22岁才开始全职工作。如果再读更髙的学位,比如医学博士或哲学博士,可能要拖到30岁才能完成学业。
当今的青少年在生产活动中,根本就是毫无用处的。他们只能在诸如快餐店这样的地方充当廉价劳动力,而快餐店也看出来了,充分利用了这个事实。对于除此以外的几乎所有行业,青少年都会带来净损失。但是,他们又太年轻,不能放任不管,必须有人看着他们。最有效的解决方案,就是把他们集中在一个地方,用几个成年人看守所有小孩。
如果事情只发展到这一步,那么我们就是在描述一个监狱,唯一的区别就是这个监狱不是全日制的。问题在于,许多学校实际上真的停留在这一步。学校的使命据称是教育儿童,佴是并没有外在的压力监督他们把这件事做好。所以,大多数学校的教学质量都很糟糕,孩子们根本不把学习当回事,就连认真读书的孩子也是如此。许多时候,我们所有人——包括学生和老师——都只是做做样子,走过场而已。
我在髙中上法语课的时候,课程内容包括阅读雨果的长篇小说《悲惨世界》。我觉得,学生中不可能有人的法语水平高到可以自己读懂这本巨著。所以,像班上的其他人一样,我参考了Cliff’s Notes的导读本。后来,学校有一次专门针对《悲惨世界》的测验,我发现里面的问题都很奇怪,到处都是很长的单词,老师上课时从没有用过这些词。这些题目是从哪里来的?原来也是出自Cliff’s Notes。老师们也在使用这个导读本,我们双方都是在敷衍了事。
公立学校肯定也有很优秀的老师。我读四年级时遇到的Mihalko老师就是一个精力充沛、充满想象力的老师。他使得那个学年如此令人难忘,以至于三十年后,他的学生依然在谈论这段往事。但是,像他这样的老师只是个别现象,无法改变整个体系。
几乎在任何团体中都存在等级关系。成年人在真实世界中形成的团体,一般来说,都存在某个共同目标,团体的领导者往往由最善于实现目标的人担任。学校就不一样,大多数情况下,学生内部形成的团体没有一个共同目标。但是,等级关系却不会缺席,所以孩子们的等级是凭空创造出来的。
我们有一个专门的短语描述这种情况,即在没有任何严肃标准的前提下,产生排名的情况。我们会说情况“倒退至人缘比赛”(degenerates into a popularity contest)。这正是大多数美国学校中发生的事情。某个人的排名不是根据他的真正能力,而主要根据他专攻排名的能力。这就像路易十四的宫廷。没有外在的对手,孩子们就互相把对方当作对手。
如果存在对于真正能力的外部测试,待在等级关系的底层也不会那么痛苦。球队的新人并不会怨恨老队员的球技,他希望有一天自己也能如此,所以很髙兴有机会向老队员求教。老队员可能也会因此产生一种传帮带的光荣感(noblesse oblige)。最重要的是,老队员的地位是通过他们本身出色的能力获得的,而不是通过排挤他人获得的。
宫廷中的等级关系就完全是另一回事了。这种类型的团体贬低了每一个成员的人格。底层成员对上层成员毫无敬意,而上层成员也没有传帮带的光荣感。这里的一切就是杀与被杀的关系。
美国中学的学生内部,就是这种关系的社会。因为除了每天把小孩聚集在某个地方,关上几个小时以外,学校并没有其他的真实目的,所以学生内部形成这种关系也就很自然了。我当时并没有意识到,直到不久以前才恍然大悟,校园生活的两大恐怖之处——残忍和无聊——也是出于同样的原因。
美国公立学校的平庸并不仅仅是让学生度过了不快乐的六年,还带来了严重后果。这种平庸直接导致学生的叛逆心理,使他们远离那些原本应该要学习的东西。
许多书呆子可能都与我一样,直到高中毕业多年后,才去读中学里的指定读物。但是,我错过的绝不仅仅只是几本书而已。我对许多美好的字眼都嗤之以鼻,比如“人格”、“正直”,因为成年人贬低了这些词。在他们嘴里,这些词似乎都是同一个意思——“听话”。一些孩子因为具备所谓的“人格”和“正直”,而受到夸奖,可是他们不是呆得像一头大笨牛,就是轻浮得像一个不动脑筋的吹牛者。如果人格”和“正直”就是这种样子,我宁愿不要它们。
我误解最深的一个词是“老成”(tact)。成年人使用这个词,含义似乎就是“闭上嘴巴,不要说话”。我以为它与“缄默”(tacit)和“不苟言笑”(taciturn)有着相同的词根,字面意思就是安静。我就对自己发誓,我绝不要变成“老成”的人,没有人能够让我闭上嘴巴。可是事实上,这个词的词根与“触觉”(tactile)相同,它真正的意思是熟练的碰触。“老成”的反义词是“笨拙”(clumsy)。进入大学以后,我才搞明白了这个词。
在这场激烈的人缘争斗中,书呆子并不是唯一输家。他们不受欢迎,只是因为他们分心去干别的事了。还有一些孩子则是主动放弃,因为他们对这个过程感到厌恶。
青少年都不喜欢孤独一人,即使具有叛逆心理的青少年也是如此。所以,当他们选择退出这个系统时,他们往往会一群人一起退出。在我读过的学校,叛逆心理的主要焦点在于毒品的使用,尤其是大麻。这帮孩子穿着黑色的演唱会T恤,被称为“怪人”(freak)。
怪人和书呆子属于同一个联盟,他们之间有很多相同之处。虽然在怪人的群体中,绝不学习是一个很重要的价值观(至少看上去如此),但是从整体上看,怪人还是比其他孩子聪明。我本人更多地属于书呆子阵营,但是我有很多怪人朋友。
怪人使用毒品,是为了建立他们之间的社交纽带,至少一开始如此。因为毒品是非法的,所以一起使用的话,就创造出了一种共同反叛的标志。
我在这里并不是说糟糕的学校教育是孩子使用毒品的唯一原因。只要你碰过毒品,一段时间以后,毒品就会自行推动你的行为。而且毫无疑问,有些怪人使用毒品的根本原因是为了逃避其他问题,比如家庭问题。但是,至少在我的学校,大部分孩子使用毒品的主要原因是出于叛逆心理。14岁的孩子开始抽大麻,并不是因为他们听说这样有助于忘记烦恼,而是因为他们想要加入一个不同的团体。
不当的管制导致叛逆,这并不是新鲜事。即使毒品本身就是麻烦的来源,学校本身依然无法推卸主要责任。
校园生活的真正问题是空虚。除非成年人意识到这一点,否则无法解决这个问题。可能意识到这个问题的成年人,是那些读书时就是书呆子的人。你想让你的孩子读八年级的时候和你一样不快乐吗?我可不想。那好,有什么事是我们可以做的?肯定有的。现行体系中没有什么事是必然的。它是现在这个样子,大部分是因为没人去改变它。你也许会说,成年人很忙。观看孩子在学校的文艺表演是一回事,着手改革教育制度又是另一回事。可能只有少数人有精力从事改革工作。那么我要说,我觉得最难的部分,其实是能否意识到你该做什么。
还在学校里读书的书呆子不应该屏息凝神,等着全副武装的成年人某一天乘直升飞机从天而降来拯救你。也许会有这么一天,但是肯定不会很快到来。任何对生活立竿见影的改变,可能还是来自于书呆子自己。
哪怕你什么也改变不了,但是仅仅是理解自己的处境,也能使得痛苦减轻一些。书呆子并不是失败者。他们只是在玩一个不同的游戏,一个更接近于真实世界状况的游戏。成年人明白这一点。成功的成年人,几乎都声称自己在高中属于书呆子。
对于书呆子来说,意识到学校并非全部的人生,也是很重要的事情。学校是一个很奇怪的、人为设计出来的体系,一半像是无菌室,一半像是野蛮洪荒之地。它就像人生一样,里面无所不包,但又不是事物的真实样子。它只是一个暂时的过程,只要你向前看,你就能超越它,哪怕现在你还是身处其中。
如果你觉得人生糟透了,那不是因为体内激素分泌失调(你父母相信这种说法),也不是因为人生真的糟透了(你本人相信这种说法)。那是因为你对成年人不再具有经济价值(与工业社会以前的时期相比),所以他们把你扔在学校里,一关就是好几年,根本没有真正的事情可做。任何这种类型的组织都是可怕的生存环境。你根本不需要寻找其他的原因就能解释为什么青少年是不快乐的。
我在这篇文章中发表了一些刺耳的意见,但是我对未来是乐观的。我们认定无法解决的难题,事实上完全可以解决。青少年并不是洪水猛兽,也并非天生就不快乐。这一点对于青少年和成年人,应该都是令人鼓舞的消息。
概述
为什么书呆子(特别是中学时代)不受欢迎?书呆子毫无疑问想让自己受欢迎,但是他们更愿意让自己聪明,时间资源是有限的。他们不适应环境,是因为提前开始思考真实世界更看重的东西,不愿把时间用来玩一种毫无意义的游戏。
“书呆子”和“高智商”有强烈的正相关关系。
对于书呆子而言,最糟糕的日子是11岁到17岁期间。
为什么欺负书呆子?一个人在产生良知之前,折磨别人可作为一种娱乐。在任何社会等级制度中,那些对自己没有自信的人就会通过虐待他们眼中的下等人来突显自己的身份。中间层需要找一件事情一起干,他们其实并不恨书呆子,他们只是需要一个共同的目标把自己团结起来,而书呆子是一个可供欺负的安全目标。在封闭的环境中更容易出现这种现象。
真实世界的关键在于它的庞大规模使得你做的每件事都能产生真正意义上的效果。学校、监狱、上流社会的女士午餐会,都做不到这一点。
几乎在任何团体中都存在等级关系。成年人在真实世界中的团体,一般来说,都存在某个共同目标。那么领导者通常可以由最善于实现此目标的人承担,而学校里的学生并没有共同目标,但等级关系却不会消失,所以学生们的等级是凭空创造出来的。
校园生活的真正问题是空虚。你根本不需要寻找其他的原因就能解释为什么青少年是不快乐的。
美国中学教育特别是公立学校的教育确实有很多问题,也值得我们参照来设计中国未来的中学教育。
2 黑客与画家:黑客也是创造者,与画家、建筑师、作家一样。
原文
当然,“做什么”和“怎么做”不应该分得太开。如果你决定做一件事,却不知道怎么做,你就是在自找麻烦。但是,只是单纯地决定如何实现某种规格,那肯定不是黑客。黑客的最髙境界是创造规格。虽然看起来,做到这一点的最好方法就是先做出一个样品把规格实现了。
……
创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。这种类型的工作很难用研究性的论文表达。
那么,为什么大学和实验室还把论文数量作为考核黑客工作的指标呢?这种事情其实在日常生活中普遍存在,比如,我们使用简单的标准化测试考核学生的“学术能力倾向”(scholastic aptitude),再比如,我们使用代码的行数考核程序员的工作效率。这样的考核容易实施,而容易实施的考核总是首先被采用。
黑客真正想做的是设计优美的软件,考核这种工作是非常困难的。你本人需要有良好的设计感,才能去考核别人的设计是否良好。但是,你觉得你有“良好的设计感”,与你实际是否具有,不存在相关关系,甚至可能存在负相关。
唯一有效的外部考核就是时间。经过岁月的洗礼,优美的东西生存发展的机会更大,丑陋的东西往往会被淘汰。不幸的是,这种考核需要的时间可能比一个人的生命还要长。塞缪尔·约翰逊说过,人们对一个作家的评价,需要100年才能达成一致。你必须先等他的那些有影响力的朋友都死了,然后再等他的追随者都死了,才能对他有一个公正的评价。
……
人们无法考核你的工作,甚至误解你的工作,都不是最糟的事。更大的危险是你自己也会误解自己的工作。因为你总是从相关领域寻找新思想,如果你发现自己读的是计算机科学系,很自然地,你就会以为“计算机科学”与其他“理论科学”并无不同,你的工作属于“理论计算机科学”所涉及的那种理论的应用研究。读研究生期间,我潜意识里一直有一种很不舒服的感觉,觉得自己应该多学一点理论,不应该期末考试结束还不到三个星期,就把所有东西忘得一干二净,那样真是不可饶恕。现在,我意识到自己错了。黑客搞懂“计算理论”(theory of computation)的必要性,与画家搞懂颜料化学成分的必要性差不多大。一般来说,在理论上,你需要知道如何计算“时间复杂度”和“空间复杂度”(time and space complexity);如果你要写一个解析器,可能还需要知道状态机(state machine)的概念;除此以外,并不需要知道特别多的理论。这些可比画家必须记住的颜料成分少很多。
我发现,黑客新想法的最佳来源,并非那些名字里有“计算机”三个字的理论领域,而是来自于其他创作领域。与其到“计算理论”领域寻找创意,你还不如在绘画中寻找创意。
举例来说,我在大学受到的教育是,在上机编程之前,应该先在纸上把程序搞清楚。可我自己一直不是这样编程的,我喜欢直接坐在计算机前编程,而不是在纸上编程。更糟的是,我不是耐心地一步步写出整个程序,确保大体上是正确的,而是一股脑不管对错,先把代码堆上去,再慢慢修改。书上说,调试(debugging)是最后的步骤,用来纠正打字的错误和疏忽。可是我的工作方法看上去却像编程就是在调试。
很长一段时间内我都为此事沮丧,就像小学里老师教我怎么拿铅笔,我却总是学不会的那种感觉。如果我那时看到其他创作领域,比如绘画或者建筑,我就会想到,自己的方法其实有一个正式的名称:打草稿。我现在认为,大学里教给我的编程方法都是错的。你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前,这与作家、画家和建筑师的做法完全一样。
明白这一点对软件设计有重大影响。它意味着,编程语言首要的特性应该是允许动态扩展(malleable)。编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。它应该是一支铅笔,而不是一支钢笔。如果大家都像学校教的那样编程,那么静态类型(static typing)^是一个不错的槪念。但是,我认识的黑客,没有一个人喜欢用静态类型语言编程。我们需要的是一种可以随意涂抹、擦擦改改的语言,我们不想正襟危坐,把一个盛满各种变量类型的茶杯,小心翼翼放在自己的膝盖上,为了与一丝不苟的编译器大婶交谈,努力地挑选词语,确保变量类型匹配,好让自己显得礼貌又周到。
^「静态类型是某些计算机语言的一个特性,指编译时对变量类型进行严格检査,典型代表是C、C++和Java。在这一类语言中,声明变量的时候,必须指定类型,而且以后不能再改变。这必然意味着,只有在你对整个程序流程和细节思考成熟以后,才能编写代码。与之对应的则是动态类型(dynamic typing)语言,变量包含的数据类型可以随时改变。——译者注」
……
这似乎是大公司的普遍情况。大公司这样安排的原因是为了减少结果的标准差。因为实际上只有很少一部分黑客懂得如何正确设计软件,公司的管理层很难正确识别到底应该把设计软件的任务交给谁。所以,大部分公司不把设计软件的职责交给一个优秀的黑客,而是交给一个委员会,黑客的作用仅仅是实现那个委员会的设计。
如果某一天你想要去赚大钱,那么记住上面这一点,因为这是创业公司能够成功的原因之一。大公司为了避免设计上的灾难,选择了减少设计结果的标准差。但是当你排斥差异的时候,你不仅将失败的可能性排除在外,也将获得高利润的可能性排除在外。这对大公司来说不是问题,因为生产特别优秀的产品不是它们的获胜手段。大公司只要做到不太烂,就能赢。
所以,如果你的竞争优势是在软件设计方面,并且你的对手是一家大公司,它大到由一群产品经理来设计软件,那么你的对手将永远无法赶上你。不过说实话,这样的机会不容易找到。你很难单单依靠软件设计就与大公司展开竞争。这就好比你很难攻入城堡与对手面对面地徒手搏斗。比如,就算写一个比微软的Word更好的文字处理软件不是难事,但是微软公司有自己的城堡,它的操作系统是垄断的,你根本无法对它构成威胁,它甚至都不会注意到你的存在。
真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。微软公司自己一开始就是这样走向成功的,苹果公司和惠普公司也是如此。我觉得几乎所有的创业公司都是这样取得成功的。
所以,开发优秀软件的方法之一就是自己创业。但是,这样做会遇到两个问题。一个是自己开公司的话,必须处理许许多多与开发软件完全无关的事情。我创立Viaweb的时候,如果有四分之一时间可以用于开发,就感到很幸运了。我在其他四分之三时间所做的事情,从单调乏味到惊悚恐怖,无所不包。我来说一个比较,有一次董事会开到一半,我不得不离开去补牙。我记得坐在牙医诊所的椅子上,等着医生开动牙钻的那段时间,与刚才待在公司的时间相比,简直感觉像是在度假一样。
创业的另一个问题是赚钱的软件往往不是好玩的软件,两者的重叠度不髙。设计编程语言是很好玩的事情,事实上,微软的第一个产品就是一种编程语言^。但是,如今没有人会出钱买编程语言。如果你想赚钱,你可能不得不去干那些很麻烦很讨厌的事情,因为这些事情没人愿意义务来干。
^「1975年,MITS公司发布了Altair 8800型计算机,比尔·盖茨意识到为它开发软件是有利可图的,他写了一个BASIC语言解释器,卖给了MITS。这就是微软公司的第一个产品,当时比尔·盖茨还是哈佛大学二年级在校生。——译者注」
所有创作者都面临这个问题。价格是由供给和需求共同决定的。好玩的软件的需求量,比不上解决客户麻烦问题的软件的需求量。在小剧场里演出的酬劳,比不上穿着卡通大猩猩服装、在展览会上为厂商站台的酬劳。写小说的回报比不上写广告文案的回报。开发编程语言的收入,比不上把某些公司老掉牙的数据库连上服务器的收入。
黑客如何才能做自己喜欢的事情?我认为这个问题的解决方法是一个几乎所有创作者都知道的方法:找一份养家糊口的“白天工作”(day job)。这个词是从音乐家身上来的,他们晚上表演音乐,所以白天可以找一份其他工作。更一般地说,“白天工作”的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。
几乎所有的创作者在职业生涯的早期都有一份“白天工作”。画家和作家尤其显著。如果幸运的话,你能找到一份与你的“真正工作”非常相关的“白天工作”。音乐家似乎常常是在唱片行工作。同样地,钻研某种编程语言或操作系统的黑客,很可能会得到一份使用这些工具的“白天工作”。^
^「摄影技术对绘画造成的最大伤害,也许就是消灭了画家最好的“白天工作”。历史上,大多数伟大画家都靠画肖像谋生。摄影术发明不久,画肖像的工作机会就大大减少,从事摄影的黑客抢走了这些机会。(对于被画的人来说,坐在镜头前也更轻松一些。)肖像画家一这种要求高度技巧的工作——就这样或多或少地消失了。画家为了得到收入,就将肖像技巧用在为商业公司画品牌商品的广告图片。(可是,这样的工作也是极大地依赖于摄影术,或者更准确地说,极大地依赖于复制在书籍和杂志上的照片。)」
当我说,黑客解决生计问题的方法是找一份“白天工作”,然后在其余时间开发优美的软件,我并没有说这是一个新方法。开源软件界的黑客早就这样做了。我想说的其实是,幵源软件的这种工作模式可能就是正确的模式,因为它已经被其他领域的创作者都验证过了。
令我惊讶的是,雇主都很犹豫,不愿意手下的黑客为开源软件项目工作。但是,在Viaweb,要是你不愿意这样干,我们会很犹豫要不要雇用你。我们面试程序员的时候,主要关注的事情就是业余时间他们写了什么软件。因为如果你不爱一件事,你不可能把它做得真正优秀,要是你很热爱编程,你就不可避免地会开发你自己的项目。^
^「微软不鼓励雇员为开源项目做贡献,甚至业余时间也不行。但是,如此之多的一流黑客都在从事开源项目,所以这个政策主要的效果,可能就是使得微软公司很难雇到一流的程序员。」
因为黑客更像创作者,而不是科学家,所以要了解黑客,不应该在科学家身上寻找启示,而是应该观察其他类型的创作者。那么,从画家身上,我们还能借鉴到什么对黑客的启示呢?
有一件事情是可以借鉴的(至少可以确认),那就是应该如何学习编程。画家学习绘画的方法主要是动手去画,黑客学习编程的方法也理应如此。大多数黑客不是通过大学课程学会编程的,他们从实践中学习,13岁时就自己动手写程序了。即使上了大学,黑客学习编程依然主要通过自己写程序。^
^「大学里学习编程,就像读书和挑选衣服一样,你会发现自己髙中时的品味是多么糟糕。」
画家的作品都会保留下来,你观察这些作品,就能看出他们是怎么一步步通过实践学习绘画的。如果你把一个画家的作品按照时间顺序排列,就会发现每幅画所用的技巧,都是建立在上一幅作品学到的东西之上。某幅作品如果有特别出色之处,你往往能够在更早的作品上发现一个小规模的初期版本。
我想大多数创作者都是这样学习和工作的,作家和建筑师似乎都是如此。也许对于黑客来说,采取像画家这样的做法很有好处:应该定期地从头开始,而不要长年累月地在一个项目上不断工作,并且试图把所有的最新想法都以修订版的形式包括进去。
黑客通过实践学习编程,这又是一个标志,说明黑客与科学家的区别有多大。科学家就不会通过干活来学习科学,而是通过做实验和解题来学习。科学家研究的基础都是现有的很完美的成果,在这个意义上,他们的第一步只是在复制别人已经做过的工作。最后,他们才会从某一个点开始,进行自己的原创性工作。但是,黑客就不一样,从一幵始做的就是原创性工作,根本没有他人完美的成果可以依靠。所以,黑客的出发点是原创,最终得到一个优美的结果;而科学家的出发点是别人优美的结果,最终得到原创性。
创作者另一个学习的途径是通过范例。对画家来说,博物馆就是美术技巧的图书馆。几百年来,临蓽大师的作品一直是传统美术教育的一部分,因为临摹迫使你仔细观察一幅画是如何完成的。
作家也是这样学习写作的。富兰克林(Benjamin Franklin)通过总结和模仿艾迪生和斯梯尔的文章^,学会了写作。雷蒙·钱德勒(Raymond Chandler)^^也是如此学会了写作侦探小说。
^「此处的艾迪生指Joseph Addison(1672—1719),斯梯尔指Richard Steele(1672—1729),两人都是18世纪初的英国作家,于1711年共同创办了政论讽刺杂志《旁观者》》(The Spectator),产生了巨大的影响。——译者注」
^^「雷蒙·钱德勒(1888—1959),美国推理小说作家,他的私人侦探菲力普·马罗(Philip Marlowe)系列小说有很大的读者群。——译者注」
同样地,黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。开源运动最鲜为人知的优点之一,就是使得学习编程变得更容易了。我学编程的时候,不得不主要依靠教材上的范例。那时可以搞到的源码,主要来自于Unix,但是就连Unix也不是开源的。大部分阅读Unix源码的人都是通过约翰·莱昂斯^那本书的非法影印本。该书虽然是1977年写的,但是在1996年之前都不被允许公开出版。
^「John Lions(1937—1998),澳大利亚计算机科学家。1976~1977年为了授课需要,他写了《UNIX第6版源码注释》(Lions’ Commentary on UNIX 6th Edition, with Source Code)一书。很长一段时间中,该书是贝尔实验室之外唯一的UNIX内核源码文档。由于UNIX第6版源码只允许用于教学,所以该书直到1996年才公开出版,此前一直都是私下传播。人们普遍相信它是计算机科学领域被复印次数最多的书。——译者注」
还有一个可以借鉴绘画的地方:一幅画是逐步完成的。通常一开始是一张草图,然后再逐步填入细节。但是,它又不单纯是一个填入细节的过程。有时,原先的构想看来是错的,你就必须动手修改。无数古代油画放在X光下检视,就能看出修改痕迹,四肢的位置被移动过,或者脸部的表情经过了调整。
绘画的这个创作过程就值得学习。我认为黑客也应该这样工作。你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。如果你预先承认规格设计是不完美的,在编程的时候,就可以根据需要当场修改规格,最终会有一个更好的结果。
(大公司的内部结构,使得它们很难这样做。这是又一个创业公司占优之处。)
眼下想必每个人都知道,过早优化(premature optimization)是一件危险的事情。我认为,我们应该对“过早设计”(premature design)也抱有同样的担忧,不要太早决定一个程序应该怎么做。
合适的工具能够帮助我们避免这种危险。一种好的编程语言,应该像油画颜料一样,能够使得我们很从容地改变想法。动态类型语言在这一点上就是蠃家,因为你不必提前就设置好各种变量的数据类型。不过我认为,编程语言灵活性的关键还不在这里,而在于这种语言应该非常抽象。最容易修改的语言就是简短的语言。
……
同样地,优秀的软件也要求对美的狂热追求。如果你查看优秀软件的内部,就会发现那些预料中没有人会看见的部分也是优美的。我对待代码的认真程度远远超过我对待其他事情,如果我以这种态度对待日常生活的每件事,那么我就够资格找心理医生开处方药了。看到代码前面的缩进乱七八糟,或者看到丑陋的变量名,都会把我逼疯的。
如果黑客只是一个负责实现领导意志的技术工人,职责就是根据规格说明书写出代码,那么他其实与一个挖水沟的工人是一样的,从这头挖到那头,仅此而已。但是,如果黑客是一个创作者,他从事的就不是机械性的工作,他必须具备灵感。
黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。
为了做出优秀的工作,你必须把这种心理周期考虑在内。只有这样,你才能根据不同的事情找出不同的应对方法。你有一辆手动变速的汽车,你把它开上山,有时不得不松开离合器,防止汽车熄火。同样,暂时放手有时也能防止热情熄火。对于画家和黑客这样的创作者,有些工作需要投入巨大的热情,另一些工作则是不需要很操心的日常琐事。在你厌倦的时候再去做那些比较容易的工作,这是个不错的主意。
对于编程,这实际上意味着你可以把bug留到以后解决。消灭bug对我来说属于轻松的工作,只有在这个时候,编程才变得直接和机械,接近社会大众想象中的编程的样子。消灭bug的过程就像解一道数学题,已知许许多多的约束条件,你只要根据条件对方程求解就可以了。你的程序应该能产生x结果,但是却产生了y结果。哪里出错了?你知道自己最后肯定能解决这个问题,所以做起来就很轻松,就好像刷墙一样,接近于休闲了。
……
我认为,这也是多人共同开发一个软件的正确模式。需要合作,但是不要“合”得过头。如果一个代码块由三四个人共同开发,就没有人真正“拥有”这块代码。最终,它就会变得像一个公用杂物间,没人管理,又脏又乱,到处堆满了冗余代码。正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。
就像绘画作品一样,大多数软件是为人类用户准备的。所以,黑客必须像画家一样,时刻考虑到用户的人性需要,这样才能做出伟大的产品。你必须能够站在用户的角度思考问题,也就是说你必须学会“换位思考”。
很小的时候,我就被不断告知,要设身处地为他人着想。现实中,这必然意味着你要做其他人需要的事情,而不是你自己想做的事情。这样看上去好像对我很不利,所以我暗下决心不让自己变成这样的人。
但是,我完全错了。事实表明,从他人的角度思考问题正是成功的奥秘所在。“换位思考”并不就意味着你要做自我牺牲。实际上,这是完全不同的两回事。了解别人对于事情的看法,并不代表你为他的利益服务。某些情况下,比如打仗的时候,了解对手正是为了打击对手。^
^「下面我举一个站在用户角度考虑问题的实例。在Viaweb,每当遇到两个选项无法决策时,我们就会问自己,我们的竞争对手最恨哪一个选项?有时,对手新开发了一个基本无用的功能,但是因为他们有这个功能,而我们没有,所以他们就会在业内媒体上大肆宣传。我们当然可以解释,告诉大家这个功能是没用的,但是要是我们也开发了这个功能,就会让对手感到很恼火,所以当天下午我们就一鼓作气把自己的版本弄出来了。」
大多数创作者都是为人类用户而创作。为了吸引用户,你必须理解用户需要什么。举例来说,几乎所有最伟大的绘画作品都是画人的,因为人类总是对自身感兴趣的。
普通黑客与优秀黑客的所有区别之中,会不会“换位思考”可能是最重要的单个因素。有些黑客很聪明,但是完全以自我为中心,根本不会设身处地为用户考虑。这样的人很难设计出优秀软件,因为他们不从用户的角度看待问题。^
^「文本编辑器和编译器不在此列。黑客开发这些软件时,不需要站在别人的立场上考虑问题,因为他自己就是典型用户。」
判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。我们大概都认识这样一些人,他们在其他方面非常聪明,但是把问题解释清楚的能力却惊人低下。如果聚会上,外行人问他们“什么是编程语言”,他们会这样回答:“哦,高级语言就是编译器的输入代码,用来产生目标码。”高级语言?编译器?目标码?……如果对方不知道什么是编程语言,那么他显然也不会知道这些概念。
软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知。你要明白,用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。在这方面,我见过的最佳系统是1984年原始的Macintosh电脑。它做到了那时别的软件都做不到的事情:它真的能用。^
^「好吧,是几乎真的能用。Macintosh电脑有时会过量使用内存,导致大量对磁盘交换空间的读写(disk swapping),但是再买一个磁盘驱动器就能解决交换空间不足的问题。」
源代码也应该可以自己解释自己。如果我只能让别人记住一句关于编程的名言,那么这句名言就是《计算机程序的结构与解释》^一书的卷首语:
程序写出来是给人看的,附带能在机器上运行。
^「Harold Abelson与Sussman Gerald合著的Structure and Interpretation of Computer Programs,麻省理工学院出版社1985年出版。」
“换位思考”不仅是为了你的用户,也是为了你的读者。这对你是有利的,因为你也会读自己写的东西。许多黑客六个月后再读自己的程序,却发现根本看不懂它是怎么运行的。我认识好几个人,因为这种经历而发誓不再使用Perl语言。^
^「把代码写得便于阅读,并不是让你塞进去很多注释。我想引申一下Abelson和Sussman的那句话:“程序写出来是为了让人看懂它的算法,附带告诉计算机如何执行。”一种好的编程语言应该比英语更容易解释软件。只有在那些不太成熟、容易出现问题的地方,你才应该加上注释,提醒读者注意那里,就好像公路上只有在急转弯处才会出现警示标志一样。」
在某些地方,自行其道、完全不替读者着想,被看成是高水平、高智商的表现,甚至都发展成了一种风尚。但是,我不觉得“换位思考”与智商之间存在任何联系。在数学和自然科学领域,你不用学习怎么向别人表达自己,也能取得很好的成就。而那些领域的人普遍很聪明,所以人们很自然地就把“聪明”与“不懂得换位思考”联系了起来。但是,世界上还有许许多多很笨的人,也同样不懂得“换位思考”。
概述
与其说优秀的软件设计师是工程师,还不如说是建筑师。建筑师决定做什么,工程师想出怎么做。
创造优美事物的方式往往不是从头做起,而是在现有成果的基础上,做一些小小的调整,或者将已有的观点用比较新的方式组合起来。
黑客搞懂计算理论的必要性,与画家搞懂颜料化学成分的必要性差不多大。
把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前,这与作家、画家和建筑师的做法完全一样。
在大公司,黑客的工作就是用软件实现某个功能,而不是设计软件,在那里,程序员被当作技工,职责就是将产品经理的构想翻译成代码。
大公司这么做的原因是为了避免设计上的灾难,而选择了减少设计结果的标准差。这对大公司来说不是问题,因为生产特别优秀的产品不是它们的获胜手段。大公司只要做到不太烂,就能赢。
生产特别优秀的产品不是大公司的获胜手段,如果一家公司达到需要由一群产品经理来设计软件,而不是程序员,那么他就已经做不出最优秀的产品了,所谓知行合一,天下无敌。
黑客的出发点是原创,最终得到一个优美的结果;科学家的出发点是别人优美的结果,最终得到原创性。
黑客如何才能做自己喜欢的事情?我认为这个问题的解决办法是一个几乎所有创作者都知道的方法:找一份养家糊口的“白天工作”。这个词是从音乐家身上来的,他们晚上表演音乐,所以白天可以找一份其他工作。更一般地说,“白天工作”的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。几乎所有的创作者在职业生涯的早期都有一份“白天工作”。画家和作家尤其显著。
科研与实战的区别,科研要新,实战要“有用”,写过博士论文的人都知道,确保自己正在开垦新领地的方法,就是去找那些没人要的土地。推论,所以基本没用。
面试程序员的时候,主要关注的事情就是业余时间他们写了什么软件。因为如果你不爱一件事,就不可能把它做得真正优秀,要是你狠热爱编程,你就不可避免地会开发自己的项目。
大多数黑客不是通过大学课程学会编程的,他们从实践中学习,13岁时就自己动手写程序了。
那些看不见的细节累加起来,就变得可见了,它们合并在一起,就使得这样东西产生了惊人的效果,仿佛上千个细微的声音都以一个音调在歌唱。
“换位思考”并不就意味着你要做自我牺牲,了解别人对事情的看法,并不代表你为他的利益服务。
判断一个人是否具备“换位思考”的能力有一个好办法,那就是看他怎样向没有技术背景的人解释技术问题。
程序是写出来给人看的,附带能在机器上运行。
3 不能说的话:如果你的想法是社会无法容忍的,你怎么办?
原文
书呆子就是那样惹上麻烦的。他们穿着不流行的衣服,讲着不合适的话。他们觉得自己说出了正确的观点,实际上却惹来了麻烦。习俗的力量不足以束缚他们。
历史的常态似乎就是,任何一个年代的人们,都会对一些荒谬的东西深信不疑。他们的信念还很坚定,只要有人稍微表示一点怀疑,就会惹来大麻烦。
我们这个时代是否有所不同?只要读过一点历史,你就知道答案几乎确定无疑,就是“没有不同”。即使有那么一丝微小的可能,有史以来第一次,我们这个时代的所有信念都是正确的,那也是出于惊人的巧合,而不是因为我们真找到了正确的方向。
一想到现在我们言之凿凿的东西,在未来人们的眼里却是荒诞不经,怎能不令人感叹呢!如果未来有人坐着时间机器来到我们这个时代,哪些话是他小心翼翼避免说出口的?我的这篇文章就想探讨这件事。我不仅要展示一些当前的“异端邪说”,让每个人都大吃一惊,还要找出适用于所有年代的通用法则,判断哪些话是不能说的。
……
如今,当然也有这样的标签,从万金油式的“不适当”(inappropriate)到可怕的“制造分裂”(divisive),不胜枚举。好在不管是哪个年代,分辨这样的标签应该是比较容易的。你只要看看人们怎么称呼那些自己不赞成、但是又不算错的观点就行了。当一个政治家说自己的对手是错的,这是直截了当的批评。但是,如果他不谈论对错,却使用“制造分裂”或者“对种族问题不敏感”这样的标签攻击对手,那么我们就应该多加注意了。所以,如何找出那些我们自以为正确却会被未来人们耻笑的话?方法就是关注这些标签!比如,有一个标签叫做“性别歧视”,你问自己哪些想法属于“性别歧视”。然后,把头脑中跳出来的那些想法按照先后顺序列出来,再逐个追问,它们真的属于“性别歧视”吗?
这样的自问自答是不是太主观了?表面上确实很主观,但是实际上不是。因为最先从你头脑中跳出来的想法,往往就是最困扰你、很可能为真的想法。你已经注意到它们,但还没有认真思考过。
……
举例来说,20世纪90年代早期,“政治正确”的潮流一度登峰造极。在这股潮流的推动下,哈佛大学向教职员工发了一本小册子,上面说除了其他规定以外,请尽量避免赞扬同事或学生的衣着,那样做是不合适的。“你的衬衫很不错”(nice shirt)这一类的话都不能说。我想,这种规定在全世界古往今来的各种文化之中是很罕见的。在别的地方,赞美他人的衣着更可能被看作是有礼貌的表现,而不是一种非礼。这个事件也许是一个较为温和的例子,说明了1992年马萨诸塞州的坎布里奇存在着一种古怪的禁忌。要是未来的人们坐着时间机器碰巧在那个时间来到那里,这就是他们“不能说的话”。
……
虽然,流行的思想观点与流行的服饰产生方式不尽相同,但是,它们的传播途径却很相似。第一批的接受者总是带有很强的抱负心,他们有自觉的精英意识,想把自己与普通人区分开来。当流行趋势确立以后,第二批接受者就加入进来了,人数比上一批庞大得多,恐惧心在背后驱使着他们^。他们接受流行,不是因为想要与众不同,而是因为害怕与众不同。
^「带动流行的两种力量之中,恐惧心比抱负心有力得多。好几次,我听到别人在用gyp(诈骗)这个词,我就一本正经地告诉他们,以后不能再用了,因为它是对吉普赛人(gypsy)的侮辱。但是事实上,词典写得很清楚,这两个词之间不存在词源关系,我只是在开玩笑而已。不过,别人几乎总是很诚惶诚恐地对待这个玩笑,立刻表现出一种怀着畏惧的服从。这就是流行的本质,衣着也好,思想也好,它使得人们没有自信。在新事物面前,人们会感到自己错了:这是我早就应该知道的事情啊。」
所以,如果你要寻找“不能说的话”,可以观察流行的产生方式,试着预测它会禁止哪些话。哪一个团体势力强大,却又精神高度紧张?这种团体喜欢压制什么样的思想观点?近来有没有什么社会斗争,失败的一方是哪一方,受到他们牵连的是什么样的思想观点?如果一个先锋人物想要挣脱当前的流行(比如上一代人的观点)脱颖而出,他会支持什么样的思想观点?随大流的人对什么样的思想观点抱有恐惧心?
这个方法的缺点是不全面,无法找出所有“不能说的话”。因为,我知道有些禁忌不是由于社会斗争而产生的,它们深深植根于过去的历史之中。但是,这个方法与前面四个方法结合在一起,会找出大量我们难以想象的“不能说的话”。
……
不管是哪一个原因,看来存在一个很清晰的关联关系:智力越高的人,越愿意去思考那些惊世骇俗的思想观点。这不仅仅因为聪明人本身很积极地寻找传统观念的漏洞,还因为传统观念对他们的束缚力很小,很容易摆脱。从他们的衣着上你就可以看出这一点:不受传统观念束缚的人,往往也不会穿流行的衣服。
做一个异端是有回报的,不仅是在科学领域,在任何有竞争的地方,只要你能看到别人看不到或不敢看的东西,你就有很大的优势。眼下的美国汽车工业对于市场份额下降怨天尤人。但是,这件事再明显不过了,任何人只要略做观察,就能迅速说出美国汽车公司走下坡路的原因:它们生产烂车。更糟的是,长期以来,它们一直这样做,所以现在美国车完全是在吃品牌的老本,也就是说,消费者购买凯迪拉克汽车,不是因为汽车本身,而是因为它的品牌。实际上,现在的凯迪拉克早已不是1970年时的凯迪拉克了。但是,我想没人敢这么说^。否则,这些汽车公司早就把问题解决了。
^「在这些公司内部,类似的想法很可能被贴上“悲观消极”、“失败分子”这样的标签。优秀的决策者根本不应该在乎这些标签,而是直接问自己、它们到底对不对?其实,一个公司是否健康运作,可以用一个指标衡量,那就是对负面评价的容忍程度。做出伟大产品的公司,自我评价往往以“批评”和“自嘲”为主,而不是以“肯定”和“表扬”为主。我认识的杰出成就人士都认为自己做得不好,之所以能成功只是因为其他人做得更差。」
训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。这就像田径比赛之前要傲一些伸展运动,把肢体活动开。你要把身体伸展到极限,远超过跑步所需要的那种程度,这样一来,比赛的时候才能跑得更快。同样,如果你能“远远地”跳出传统思维,提出让别人一听就脑袋轰一声炸开的惊人观点,那么你就在“小小地”跳出传统思维方面不会有任何困难。要知道,人们把后面的这种情况称为“创新”。
……
一旦发现了“不能说的话”,下一步怎么办?我的建议就是别说,至少也要挑选合适的场合再说,只打那些值得打的仗。
假设未来的某一天,世界上爆发了一场运动,黄颜色被禁止了。任何东西都不得涂成黄色,违者就是“黄色分子”(yellowist),以破坏社会稳定罪论处。橙色可以容忍,但也很可疑。有一天,你终于觉醒了,意识到错的不是黄颜色,而是这个社会。如果公开这样说,就会被打成“黄色分子”,无数正义人士义愤填膺,对你口诛笔伐。如果你以此作为人生目的,一定要为黄颜色平反昭雪,现在的局面可能正中你下怀。但是,如果你的兴趣主要是别的事情,变成他人眼里的“黄色分子”对你是极大的干扰。与笨蛋辩论,你也会变成笨蛋。
这时你要明白,自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明自,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。我认为这样傲不可取,更好的方法是在思想和言论之间划一条明确的界线。在心里无所不想,但是不一定要说出来。我就鼓励自己在心里默默思考那些最无法无天的想法。你的思想是一个地下组织,绝不要把那里发生的事情一股脑说给外人听。“格斗俱乐部”的第一条规则,就是不要提到格斗俱乐部^。
^「《格斗俱乐部》(Fight Club)是1999年的美国电影,讲述了一个地下组织发起人的故亊。在电影中,加入“格斗俱乐部”的第一条规则就是不得谈论格斗俱乐部。——译者注」
1638年,英国诗人弥尔顿(John Milton)准备第一次访问意大利。曾经担任英国驻威尼斯大使的沃顿爵士(Hemy Wootton)告诉弥尔顿要记住一句座右铭“i pensieri stretti & il viso sciolto”。字面意思是“守口如瓶,笑脸相迎”,也就是说,你要对每一个人微笑,但是不要说出自己的真实想法。这是很明智的建议。因为弥尔顿是一个喜欢争论、好打嘴仗的人,而当时罗马教廷的宗教裁判所非常强势,所以沃顿爵士才会这样建议他。需要记住的是,弥尔顿的时代与我们的时代并没有本质不同。每个时代都有自己的忌讳,如果你触犯它们,就算没有坐牢,至少也会为自己惹来麻烦,干扰了正常生活。
我承认,“守口如瓶”看上去是一种怯儒的行为。每当我读到山达基教会(Scientology)的信徒对批评者骚扰不断^,或者抗议以色列侵犯人权的人士被贴上“反犹太人”的标签^^,或者研究人员受到DMCA^^^诉讼威胁^^^^,我内心就有一个声音在高喊:“好吧,你们这些混蛋,让我们来说清楚。”可是问题在于,“不能说的话”太多了,如果口无遮栏,你就没时间做正事了。为了与他人论战,你不得不变成一个语言学家,比如诺姆·乔姆斯基^^^^^。
^「Richard Behar, “The Thriving Cult of Greed and Power”, Time, 1991年5月6日。」
^^「Patrick Healy, “Summers hits ‘anti-Semitic’ actions”, Boston Globe, 2002年9月20日。」
^^^「DMCA指美国的《数字千禧年版权法》(Digital MillenniumCopyrightAct),该法律主要保护版权作品的互联网传播权。DMCA规定,如果某个网站侵犯了你的版权,你可以向网站所有者或者主机服务商发出通知,要求撤下侵权内容,这个通知就叫做“DMCA通知”。如果对方没有及时采取行动,你就可以把它告上法庭。——译者注」
^^^^「“Tinkerers champion”, The Economist, 2002年6月20日。」
^^^^^「我这里不是指你一定要持有诺姆·乔姆斯基的观点,而是指你不得不变成一个专业的辩论者(controversialist)。如果说了“不能说的话”,你就同时得罪了保守派和自由派,两派都会与你辩论。好比回到维多利亚女王时代的英国,你同时得罪了辉格党和托利党,那么你的一张嘴怎么能是两大党派的对手呢?(编者注:诺姆·乔姆斯基是著名的语言学家,麻省理工学院的语言学和哲学教授。)」
“守口如瓶”的真正缺点在于,你从此无法享受讨论带来的好处了。讨论一个观点会产生更多的观点,不讨论就什么观点也没有。所以,如果可能的话,你最好找一些信得过的知己,只与他们畅所欲言、无所不谈。这样不仅可以获得新观点,还可以用来选择朋友。能够一起谈论“异端邪说”并且不会因此气急败坏的人,就是你最应该认识的朋友。
……
你的策略,简单说,就是不赞同这个时代的任何一种歇斯底里,但是又不明确告诉别人到底不赞同哪一种歇斯底里。狂热分子试图引诱你说出来真心话,但是你可以不回答。如杲他们不放手,一定要你回答“到底是赞成还是反对我们”,你不妨以不变应万变:“我既不反对也不赞成。”
不过,更好的回答是“我还没想好”。哈佛大学校长拉里·撒墨尔斯(Larry Summers)被逼表态时,就是这样说的^。他后来解释说:“别想在我身上做石蕊试验^^。”人们喜欢讨论的许多问题实际上都是很复杂的,马上说出你的想法对你并没有什么好处。
^「James Traub, “HarvardRadical”, New York Times Magazine, 2003年8月24日。」
^^「石蕊是一种化学液体,遇到酸性物质时变红,遇到碱性物质时变蓝。所以,石蕊试验通常用来判断某种物质的酸碱性。——译者注」
假设社会上充斥着反对“黄色分子”的人,他们只要看谁不顺眼,就大肆攻击。你看不下去,准备出手反击。这时,有几种方法可以使你免于被贴上“黄色分子”的标签。你可以参考战争史上的局部战争案例,避免正面对抗敌人的大部队,只打一些小规模的局部战争。比如,从远处用弓箭骚扰他们就是很好的方法。
具体来说,一种方法就是逐步把辩论提升到一个抽象的层次。假定总的来说,你反对言论审查制度。公开质疑的时候,你一定要小心,不要提到具体的被审査的电影或者书籍。否则,对手就会一把抓住那部电影或那本书籍,声称你支持的其实不是言论自由,而是那些被审查的内容。你不要直接攻击某个标签,而要攻击它的“元标签”(meta-label)。所谓“元标签”,就是对某个标签的抽象描述。如果人们开始讨论元标签,那么原来的标签反而不会受到注意了。举例来说,“政治正确”(political correctness)就是一个“元标签”,是许多特定现象的总称。这个词现在被广泛使用,其实这恰恰意味着“政治正确”的时代正在开始消亡,因为它使得你可以从总体上攻击这个现象,而不会受到指控,不会被说成支持某一种特定的“政治不正确”现象。
另一种反击的方法就是使用隐喻(metaphor)。20世纪50年代,美国众议院的“非美委员会”(Un-American Activities Committee)以遏制共产主义为名,大肆迫害文艺界和政治界的进步人士。剧作家阿瑟·米勒创作了戏剧《萨勒姆的女巫》(The Crucible)^进行反击。虽然在戏中他一句也没有提到“非美委员会”,但是观众一眼就可以看出,他在讽刺现实,将搜捕共产党间谍比喻为莫须有的捉女巫。“非美委员会”根本无法做出回应,你总不能为审判女巫辩护吧?阿瑟·米勒的隐喻太贴切了,直到今天,“非美委员会”的行为还经常被描述为“搜捕女巫”(witch-hunt)。
^「《萨勒姆的女巫》是阿瑟·米勒1953年的作品,讲述了1692年的北美马萨诸塞州萨勒姆小镇,出现了对于女巫的恐慌,从而进行了一场荒诞残醅的审判。许多善良的人由于他人的陷害和莫须有的罪名被诬陷入狱,在法庭上无法承受巨大的压力和威胁,不得不违心地承认自己有罪。阿瑟·米勒通过这部作品,影射当时美国国内“麦卡锡主义者”对进步人士的迫害,就像历史上对女巫的审判一样荒唐。——译者注」
所有反击方法之中,最好的一种可能就是幽默。狂热分子都有一个共同点:缺乏幽默感。他们无法平静地对待笑话。在幽默王国中,他们闷闷不乐,就像满身笨重盔甲的骑士走进了溜冰场,无所适从。一个现实的例子就是,维多利亚女王时代的英国人讲究宫廷礼仪,迂腐守旧,人们把这当作笑话看待,结果它好像就真的被笑话击垮了。它在当代的化身“政治正确”也将得到同样的命运。“我很高兴自己写了《萨勒姆的女巫》,”阿瑟·米勒写道,“但是回想起来,我常常希望自己有那种气质,写一出反映当时情况的荒诞喜剧。”^
^「Arthur Miller, The Cruciblein History and Other Essays, Methuen, 2000年。」
……
荷兰人认为自己思想开放,但是这种想法本身却什么也证明不了。有谁认为自己的思想不开放?美国郊区的中产阶级白人家庭普遍家教严格,限制孩子与外界多接触,可是在那里长大的女孩子也认为自己思想开放呢。不管问谁,人们都会说同样的话:“我们心态很开放,愿意接受新思想。”但是实际上,人们脑子里有一根界线,早就认准了什么是对的,什么是错的^。换言之,在他们看来,所有观点都是可以讨论的,除了那些错的观点。如果你的数学不好,那么你自己会知道,因为考试的时候你得不出正确答案。但是,如果你的思想很保守,你自己不会知道,而且你很可能还会持有相反的看法。请记住,所谓“流行”(传统观念也是一种流行),本质上就是自己看不见自己的样子。否则就不会有流行了。对于那些被流行抓住的人,流行就不再是流行,而是应该要做的正确事情。只有保持一定的距离才能观察到人们观念的变化,发现流行(也就是人们自以为正确的事情)到底是什么。
^「有些地方的人表面上不说你的观点是错的,而是使用更婉转的中性词来表达自己的判断,比如“负面的(观点)”或者“有破坏作用的(现点)”。」
概述
不受传统观念束缚的人,往往也不会穿流行的衣服。自由思考比畅所欲言更重要,不一定要跟别人辩个明白,更好的方法是在思想和言论之间划一条明确的界线,在心里无所不想,但是不一定要说出来。如果口无遮拦,你就没时间做正事了。如果你的数学不好,那么你自己会知道,因为考试的时候你得不出正确答案。但是,如果你的思想很保守,你自己不会知道,而且你很可能还会持有相反的看法。所谓“流行”(传统观念也是一种流行),本质上就是自己看不见自己的样子。
我们这个时代是否有所不同?只要读过一点历史,你就知道答案是“没有不同”。即使有那么一丝微小的可能,有史以来第一次,我们这个时代的所有信念都是正确的,那也是出于惊人的巧合,而不是因为我们真找到了正确的方向。
自问一个问题:大庭广众之下,你有没有什么观点不愿说出口?如果回答是没有,那么你也许应该停下来想一想了。你的每一个观点都能毫不犹豫地说出口,你自己深深赞同这些观点,并且你也确信肯定会获得别人的赞同,这是否太过于巧合了?一种可能是,也许事情并没有这么巧合,你的观点就是从别人那里听来的,别人告诉你什么,你就相信了什么,你把别人灌输的观点当作了自己的观点。
到底什么话是不能说的?我们可以假设周围人因为说什么而陷入了麻烦。你会发现需要满足两个条件:第一,这些话不能说出口;第二,这句话看起来可能是正确的,值得进一步讨论。第二个条件很关键,因为你说2+2=5是不会有麻烦的。触怒他人的言论是那些可能会有人相信的言论。
智力越高的人,越愿意去思考那些惊世骇俗的思想观点。
与笨蛋辩论,你也会变成笨蛋。
自由思考比畅所欲言更重要,在心里无所不想,但是不一定要说出来。或者找几个知己,与他们无所不谈,能够一起谈论“异端邪说”并且不会因此气急败坏的人,是最应该认识的朋友。
狂热分子都有一个共同点——缺乏幽默感。
4 良好的坏习惯:与其他美国人一样,黑客的成功秘诀就是打破常规。
原文
在大众眼里,“黑客”(hacker)就是入侵计算机的人。可是,在程序员眼里,“黑客”指的是优秀程序员。这两个含义其实是相关的。对于程序员来说,“黑客”这个词的字面意思主要就是“精通”,也就是他可以随心所欲地支配计算机。
更麻烦的是,“黑”(hack)这个词也有两个意思,既可以用作赞美,也可以用作羞辱。如果你解决问题的方式非常丑陋笨拙,这叫做你很“黑”。如果你解决问题的方式非常聪明高超,将整个系统操纵在股掌之间,这也叫做你很“黑”^。日常生活中,前一种意思更多见,可能因为丑陋的做法总是多于聪明的做法。
^「中文的“黑”很难体现这两个意思,而在英文中,hack prose意思是平庸陈腐的文章,而hack the problem意思是很漂亮地解决了一道难题。——译者注」
……
早在计算机出现之前,黑客就存在了。费曼^为曼哈顿计划工作时,喜欢破解存放机密文件的保险箱,觉得这样很有趣。这种传统持续至今。读研究生时,我有一个黑客朋友,他费尽心力配齐了一整套的开锁工具(现在,他在管理一个对冲基金,那个行业与开锁并非毫无关系。)^^。有时,你很难向当局解释为什么有人喜欢做这种事。我的另一个朋友,曾经因为入侵计算机,受到了政府的调查。最近,这种行为已经被认定为一种犯罪,但是联邦调查局发现,通行的调査方法不适用于黑客。警方总是从犯罪动机开始调查。常见的犯罪动机不外乎毒品、金钱、性、仇恨等。满足智力上的好奇心并不在FBI的犯罪动机清单之上。说实话,这个概念对他们来说完全陌生。
^「费曼(Richard Feynman,1918—1988),美国著名物理学家,诺贝尔奖得主,以性格顽皮,特立独行著称。——译者注」
……
但是,即使考虑到黑客令人恼火的种种怪癖,他们不服从管教的性格依然是利大于弊。我希望人们能理解,能更多地看到这种性格的长处。举例来说,好莱坞的电影人一直大惑不解,为什么黑客不喜欢版权法。在黑客网站Slashdot上面,版权是永恒的讨论热点。为什么程序员那么关心版权,而不是其他事情?
部分原因是,有些公司为了防盗版而使用了禁止复制的技术。这等于交给黑客一把锁,他的第一反应肯定是如何才能打开它。但是,这里面还有更深层次的原因,对于版权和专利这样的制度,黑客深感担忧。他们感到,保护“知识产权”的力度不断增大,已经威胁到了他们完成工作所必需的“思想自由”^。在这一点上面,他们的看法是正确的。
^「思想自由(intellectual freedom),指的是自由思考以及表达这种思考的权利。它是《世界人权宣言》(Universal Declaration of Humrn Rights)第19条规定的一种人权。参见http://en.wikipedia.oig/wiki/Intellectual_freedom。——译者注」
只有深入了解当前的技术,黑客才能构想下一代技术。知识产权的拥有者也许会说,不,谢谢,我们不需要你的帮助,我们自己就能开发下一代技术。他们错了,在计算机工业的历史上,新技术往往是由外部人员开发的,而且所占的比例可能要高于内部人员。1977年,IBM公司内部肯定有一些部门正在开发下一代电脑。他们没有料到的是,真正的下一代电脑不是诞生于IBM实验室,而是由两个与他们完全不相干的长头发年轻人在旧金山的一间车库里开发出来的。这两个年轻人,一个是史蒂夫·乔布斯,另一个是史蒂夫·沃兹尼亚克^(图4-1)。差不多同一时间,计算机工业的几大巨头聚在一起,合作研发官方版的下一代操作系统Multics。但是,另外两个年轻人——26岁的肯·汤普森和28岁的丹尼斯·里奇——觉得Multics过分复杂,就另起炉灶,写出了一个自己的操作系统。他们参照Multics,为它取了一个搞笑式的名字Unix^^。
^「苹果电脑公司的两个创始人。1977年,苹果公司推出的APPLE II计算机是世界上第一台个人电脑。——译者注」
^^「在英语中,前缀Multi-惫思是“多个”,而前缀Uni-意思是“单个”——译者注」
最新的版权法设置了前所未有的障碍,禁止外部人员了解专有技术的内部细节,从而也就禁止了外部人员从这个途径产生新构想。过去,厂商使用专利,防止你出售他们产品的复制品,但是他们无法阻止你把产品拆开,了解内部的工作原理。最新的版权法将后面的这种行为定义为一种犯罪。如果我们不可以研究当前的技术,不能思考如何改进它,那么我们怎样才能开发出新技术呢?
……
数据在本质上就是容易复制的。互联网的出现使得复制品更容易流通。难怪那些公司感到害怕了。但是,如同往常一样,恐惧影响了他们的判断。他们推动政府通过了严厉的法律,保护知识产权,作为对新技术的回应。立法者的原意可能是好的。但是,他们也许没有意识到,这样的法律弊大于利。
为什么程序员如此激烈地反对这样的法律?如果我是立法者,肯定对这种神秘现象有兴趣。这就好比如果我是一个农夫,半夜突然听到鸡舍有动静,肯定会去看个究竟。黑客都是聪明人,很少出现所有人意见一致的情况。如果他们都说有问题,那么也许真的就是什么地方出了问题。
……
对于适当的不服从管教,保持宽容不会有太大的坏处,反而很有利于美国的国家优势,它使得美国不仅能吸引聪明人,还能吸引那些很自负的人。黑客永远是自负的。如果黑客有自己的节日,那就是4月1日愚人节,你可以放心地作弄其他人。黑客的这种自行其是的特点,很大程度上说明了,为什么不管是出色的工作还是糟透了的工作,黑客都用同一个词形容^。如果他们做出了一个东西,他们自己总是无法百分百确定那到底是什么东西。有可能完全没用,但是只要那些出错的地方还算正常,那么就是一个信号,表明这个东西还有希望。在人们心目中,编程是非常精确、有条不紊的,这真是非常奇怪的想法。计算机确实是非常精确、有条不紊的,但是黑客的所作所为完全出于兴趣,想到哪里就做到哪里,没有明确的计划,只求开心。
^「这里应该是指terrific。在英语中,这个词同时有“可怕的”和“非常棒的”两种意思,a terrific hotel是一家很棒的旅馆,a terrific scene则是一幅可怕的景象。——译者注」
……
很自负的人必须培养出敏锐的感觉,及时发现周围情势的变化,知道怎样才能脱身。最近,黑客就感觉不太对,大气候变了。对于不服从管教,政治气氛变得严厉了。^
^「2001年9·11事件以后,美国通过了“爱国者法案”,以防止恐怖主义为目的大大扩张了警察机关的权限。那些不遵守法规的可疑分子将受到比以前严厉得多的审查和惩罚。——译者注」
近来一系列的政策变化,使得这个国家的公民自由范围不断收缩减小。对于黑客来说,这是非常不好的兆头。普通人肯定会感到大惑不解,为什么黑客如此在乎公民自由?为什么程序员会比牙医、销售员、园艺师更在乎呢?
让我以政府官员听得懂的语言来解释这件事情。公民自由并不仅仅是社会制度的装饰品,或者一种很古老的传统。公民自由使得国家富强。如果将人均国民生产总值与公民自由的关系画成图,你会发现它们是很清楚的正相关关系。公民自由真的是国家富强的原因,而不是结果吗?我认为是的。在我看来,一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。专制国家会变成腐败国家,腐败国家会变成贫穷国家,贫穷国家会变成弱小国家。经济学里有一条拉弗曲线(Laffer curve),认为随着税率的上升,税收收入会先增加后减少。我认为政府的力量也是如此,随着对公民自由的限制不断上升,政府的力量会先增加后减小^。至少现在看来,我们的政府很可能蠢到会真的把这个实验付诸实施,亲自验证一下这个观点。但是,税率提高了还能再降下来,而一旦这个实验铸成大错,就悔之晚矣,因为极权主义制度只要形成了,就很难废除。
^「我很乐意将我的名字用来命名这条曲线,命名后更容易记住这个观点。」
这就是为什么黑客感到担忧。政府侵犯公民自由,表面上看,并不会让程序员的代码质量下降。它只是逐渐地导致一个错误观点占上风的世界。黑客对于公民自由是非常敏感的,因为这对他们至关重要。他们远远地就能感到极权主义的威胁,好比动物能够感知即将来临的暴风雨。
如果正如黑客所担忧的,近来那些旨在保护国家安全和知识产权的措施最终却成为一枚导弹,不偏不倚瞄准了美国的优势所在,那可真是太讽剌了。不过,这种事情早有先例:人们惊慌失措时采取的措施到头来产生了适得其反的效果。
……
如果读美国开国元勋的自述,你会发现他们听起来很像黑客。“反抗政府的精神,”杰弗逊写道,“在某些场合是如此珍贵,我希望它永远保持活跃”。
你能想象今天的美国总统也这么说吗?这些开国元勋就像直率的老祖母,用自己的言辞让他们的那些不自信的继承者感到了惭愧。他们提醒我们不要忘记自己从何而来,提醒我们,正是那些不服从管教的人们,才是美国财富与力量的源泉。
那些占据高位、本能地想要约束黑客、强迫黑客服从的人们,请小心你们的要求,因为你们真有可能成为千古罪人。
概述
公民自由是国家富强的原因,而不是结果。随着对公民自由的限制不断上升,政府的力量会先增加后减小。
那些不服从管教的人们,才是美国财富与力量的源泉。
那些占据高位、本能地想要约束黑客、强迫黑客服从的人们,请小心你们的要求,因为你们真有可能成为千古罪人。
5 另一条路:互联网软件是微机诞生后的最大机会。
原文
下一个潮流?
用户的胜利
代码之城
对于互联网软件,没人规定只能使用某些语言开发,因为所有的硬件都控制在你手里,你想要用什么语言,就能用什么语言。不同的语言适合不同的任务,你应该根据不同场合,挑选最合适的工具。尤其是在竞争者存在的情况下,“可以这样做”就变成了“必须这样做”(详见后文),因为如果你不利用语言的优势,那就会听任对手超过你。
我们的大多数竞争者使用C和C++,这使得他们的软件明显不如我们,因为(不考虑其他原因)他们无法解决CGI脚本不能识别用户状态的问题。如果用户想要修改表单的部分内容,你不得不把表单的所有内容都放在同一个页面上,然后在最下面放一个“更新”按钮。正如我将在第12章中解释的,通过使用Lisp这种许多人眼中的教学语言,我们使得Viaweb编辑器更接近桌面软件带给用户的体验。
软件的发布
软件bug
互联网软件的另一个技术优势在于,你能再现大部分的bug。用户的数据都在你的硬盘上。如果某个用户使用软件时出错了,你就不必像开发桌面软件那样苦苦猜测到底发生了什么事情。一般来说,只要用户通过电话向你描述一番,你就能把问题再现出来。如果你的程序中有自动侦测错误的代码,那么不用等到用户找上门,你可能已经知道哪里出错了。
互联网软件每时每刻都在被使用。你的代码一上线,就会经历严酷考验。bug很快就会浮出水面。
软件公司有时会受到指责,因为他们竟然把发现bug的任务交给用户去完成。说实话,我其实提倡这种做法。对于互联网软件,这样做的好处很多,因为它的bug相对比较少,而且处理周期比较短。我们连续不断地发布新版本,所以bug就比较少。我们能够再现用户遇到的问题,又能在修复后立刻发布,使得用户不用等很长时间,所以大部分bug的处理周期都比较短。我们的bug数量一直不多,以至于没有必要使用一个正式的bug追踪系统。
当然,在发布之前,你应该对修改之处进行测试,避免出现重大的bug。难免会有一些bug成为漏网之鱼,不过它们纯属罕见情况下才会发生的个案,在真正接到用户投诉之前,几乎不会影响到什么人。只要你能立刻解决bug,对于普通用户来说,他们就会觉得你的软件几乎是亳无问题的。我觉得,普通的Viaweb用户可能一个bug都没遇到过。
解决新代码的bug要比解决历史遗留代码的bug容易。在自己刚刚写好的代码中,找出bug往往会比较快。有时,你只要看到出错提示,就知道问题出在哪里,甚至都不用看源码,因为潜意识中你已经在担心那个地方可能会出错。如果你要解决的bug出自于6个月前写好的代码(假定你一年发布一个新版本,那么6个月就是发现bug的平均时间),那么就麻烦了,就要大费周章了。那时,你对代码也已经不熟悉了,就更可能采用危险的方式解决问题,甚至引入更多的bug^。
^「这个观点引申自特雷弗·布莱克韦尔(Trevor Blackwell)的话,他说:“随着软件规模的增大,开发成本指数式上升。这可能是因为修正旧bug的原因。如果bug都能被快速发现,成本的上升形态就能基本保持线性。”」
早一点发现bug就不容易形成复合式bug,也就是互相影响的两个bug。举例来说,一个bug是楼梯很滑,另一个bug是扶手松了,那么只有当这两个bug互相作用时,才会导致你从楼梯上摔下来。在软件中,复合式bug是最难发现的bug,往往也会导致最大的损失^。传统的方法是:“把软件彻底拆开,将所有bug统统清理干净。”这样做难免产生一大堆的复合式bug。如果软件是经常性发布,每次只有小幅度的变化,那么就不容易产生复合式bug。这就好比做扫除:你一直在打扫大厅,掉落在地板上的东西会被立刻清理,省得它们时间一长与其他东西粘在一起。
^「复合式bug有一个子类型:两个bug是互相弥补的,好比“负负得正”,软件反而能正常运行。这种bug可能才是最难发现的bug。当你修正了其中的一个bug,另一个bug才会暴露出来。这时对你来说,你会觉得刚才修正错了,因为那是你最后修改的地方,你就怀疑自己在那里做错了,但是你其实是对的。」
有一种编程方法叫做“函数式编程”(functional programming),它对你会有帮助,可以避免一些副作用。函数式编程在学术文献中研究得比较多,在商业软件中用得比较少。但是,对于互联网软件,它却很有用。很难用纯粹的“函数式编程”完成整个程序,但是它可以用来编写一些重要的部分,使得这些部分易于调试,因为它们不包含“状态”(state),非常便于不断进行小幅的修改和测试。我大量使用这种方法开发Viaweb的编辑器,我们自己的脚本语言RTML就是一种纯粹的函数式编程语目。
桌面软件行业的人可能很难相信,找出Viaweb的bug几乎成了一种游戏。因为软件发布以后,大多数bug都是罕见情况下才会发生的个案,受到影响的用户往往都是高级使用者,他们喜欢试验那些不常用的、难度大的操作。高级使用者对bug的容忍度比较高,尤其如果这些bug是在开发新功能的过程中引入的,而这些新功能又正是他们所需要的,他们就更能理解了。事实上,因为bug不多,你只有经过一些复杂的过程以后才会遇到它们,所以高级使用者往往因为发现了bug感到很得意。他们打电话给客服时,多半是一副胜利者的口吻,而不是怒气冲冲的样子,好像他们击败我们得分了一样。
客户支持
当你可以再现错误时,你开展客服支持的方式就变了。大多数软件公司将客户支持看作提高客户满意度的一种方式。在这些公司看来,要么是客户打电话来,报告一个已知的bug,要么是客户执行了错误的操作,你必须判断出他到底什么地方做错了。这两种情况对公司的知识积累都没有太大益处。所以,你开始觉得客户支持是一件令人头痛的事情,决定将客服人员与开发人员尽可能分离。
Viaweb不是这样。我们的客户支持是免费的,因为我们希望知道用户的反应。如果他们使用时遇到困难,我们希望立刻知道,这样就能再现错误、解决问题、发布新版本。
所以,Viaweb的开发人员总是与客服人员保持密切联系。客服人员坐在距离程序员只有9米的地方,知道自己可以随时打断程序员的工作,提交新证实的bug的报告。遇到重大bug,我们就算在开董事会,也会马上回来修改程序。
我们的这种方法让所有人都感到满意。客户很高兴,拨打厂商服务热线是免费的,而且还被当作通风报信的人,受到郑重对待。客服人员也喜欢这样,因为这使得他们可以帮助用户,而不是对着用户读操作手册;程序员喜欢这样,因为他们能够再现bug,而不是通过模糊不清的二手报吿了解bug。
我们的政策是当场修复bug,这改变了客服人员与黑客之间的关系。在大多数软件公司,客服人员是低工资的边缘人,黑客则是呼风唤雨的主宰者。这些公司有各种各样的bug报告流程,伹是几乎都是单向式的:使用者打电话给客服人员报告bug,客服人员填写某种形式的表格,传递给程序员(可能会经质量监控部门之手),程序员把bug写入待解决问题的清单。Viaweb不是这样,在收到使用者的bug报告之后一分钟内,程序员就会对站在身边的客服人员说:“没错,你是对的,这是一个bug。”客服人员从黑客嘴里听到“你是对的”,会感到欢欣鼓舞。客服人员告诉我们发现bug的时候,他们心里怀着期待,就好像小猫想让别人知道自己抓住了一只老鼠一样。这也使得客服人员在判断bug严重性时格外小心,因为这关系到他们的声誉。
我们被雅虎收购后,客服人员被移到离程序员很远的地方。直到那时,我们才意识到客户支持实际上就是质量监控,也是某种程度的市场营销。除了记录bug,客服人员还必须大概了解相关知识,回答与bug相关的一些问题、解释令使用者迷惑不解的功能等^。有时,他们也扮演了使用者的代理人,我们会问他们哪个新功能是用户更想要的,他们总是能做出正确的回答。
^「我们在Viaweb举办过一个比赛,看谁能说出我们软件中最差劲的地方。两位客服人员并列第一,我至今想起他们的叙述都不寒而栗。比赛一结束,我们立刻修复了那两个问题。」
全身心投入
能够即时发布软件,对开发者是一个巨大的激励。步行上班途中,我经常会想哪些地方还需要变动,然后当天就予以实现。一些重大功能也是这样来的。即使某个功能要花两个星期(或者更长时间)开发,我也很确定,一旦写完就可以立刻看到效果。
如果软件的新版本要等到一年后才能发布,我就会把大部分新构思束之高阁,至少过上一段时间再来考虑。但是,构思这种东西有一个特点,那就是它会导致更多的构思。你有没有注意过,坐下来写东西的时候,一半的构思是写作时产生的?软件也是这样。实现某个构思,会带来更多的构思。所以,将一个构思束之高阁,不仅意味着延迟它的实现,还意味着延迟所有在实现过程中激发的构思。事实上,将一个构思束之高阁,甚至会限制新构思的产生。因为你看一眼堆放在一边、还没有实现的构思,就会想“我已经为下一个版本准备了很多新东西要实现了”,你就懒得再思考更多的新功能了。
大公司的做法不是立刻实现新功能,而是先对新功能做一个计划。我们在Viaweb就是因为这个原因而遇到了麻烦。投资者和分析家会问,你们对未来有何计划。真实的回答是,我们没有任何计划。我们有改进的想法,但是如果我们想到应该怎么改进,就已经把它实现了。接下来六个月我们要做什么?所有能想到的最佳改进。我不知道自己是否有胆量公开这么说,但这是实话。计划这个词,只是将构思束之高阁的另一种表达方式。只要想到好的构思,我们就立刻着手实现。
Viaweb和其他许多软件公司一样,大部分代码都有明确的负责人,而且只有一个。如果你负责某件事,那就真的是你负责。除了你以外,没有人能批准(他们甚至都不知道)这部分代码的发布。如果你出错了,没有人会提醒你,唯一的代码保护机制就是你的羞耻心,你不想被同事当成傻瓜,这就足矣。我这么说或许会让人误以为Viaweb的代码是漫不经心地编写出来的。实际上我们的开发进度很快,但是把代码放到服务器上发布之前,我们会深思熟虑。提高软件可靠性的关键在于开发时全神贯注,而不是降低开发速度。正是因为飞行员全神贯注,他才能在夜间让一架18吨重的飞机以225公里的时速平安降落在航空母舰的甲板上,做得比小孩子切面包还要安全。
当然,这样写软件也有局限。它适用于小型的、由优秀可靠程序员组成的开发团队,不适用于大型的、充斥大量平庸之辈的软件公司,在那里不是程序员想出好的构思,而是一个委员会集体批准坏的构思。
逆向的《人月神话》
开发软件需要的程序员人数减少,不仅意味着省下更多的钱。正如《人月神话》一书中所指出的,向一个项目增加人手,往往会拖慢项目进程。随着参与人数的增加,人与人之间需要的沟通呈现指数式增长^。人数越来越多,开会讨论各个部分如何协同工作所需的时间越来越长,无法预见的互相影响越多越大,产生的bug也越多越多。幸运的是,这个过程的逆向也成立:人数越来越少,软件开发的效率将指数式增长。我不记得我们在Viaweb开过讨论如何编程的会议。步行去吃午饭的路上,我们就能把该说的话说完,从来没有例外。
关注用户
互联网软件不仅把开发者与他的代码更紧密地联系在了一起,而且把开发者与他的用户也更紧密联系在了一起。财务软件公司Intuit的销售方式很出名,他们的销售员会在软件零售店里向顾客做自我介绍,然后请求顾客跟他们回公司,以便进一步了解软件。如果你亲眼见到某人第一次使用你的软件,你就会知道软件的哪个地方最打动他。
软件应该做到用户认为它可以做到的事情。但是,你不知道用户到底怎么想,除非你亲眼看到他们如何使用你的软件,相信我,看到和看不到大不相同。互联网软件能够让你前所未有地了解用户行为。你不必再人为挑选一个小型的用户样本,进行重点观察。每个用户的每一次点击你都可以看到。所以,你不得不仔细斟酌到底要看哪些行为,因为你不应该侵犯用户的隐私。但是,即使是最常见的统计项目,也能提供大量信息。
因为你能得到用户数据,所以就不用依赖基准测试^了。基准测试不过是在模拟用户,而你现在能看到真实的用户。你想知道应该优化什么地方,那就登录到服务器,看看什么程序最消耗CPU。你也会知道什么时候应该停止优化,当我们后来发现Viaweb编辑器的瓶颈是内存而不是CPU时,就知道可能应该停止优化了,因为我们没办法压缩用户数据的大小。(唉,其实是有办法的,但是做起来很不容易。)
^「基准测试(benchmark test)指的是先设置一个基本的数据环境,测试应用程序的表现,然后把这个表现当作“基准”(benchmark),用来比较其他情况下应用程序的表现。——译者注」
最后,通过关注用户,你可以知道他们在使用软件的过程中什么时候遇到了麻烦。因为顾客总是对的,所以这表明你需要修正软件。推广Viaweb的关键,就是允许访问者在线试用。这可不是仅仅展示几张图片,而是真的让你使用我们的产品。只需要五分钟,你就能自己搭建起一个真实可用的网上商店。
几乎所有我们的新客户都是通过在线试用发展起来的。我想大多数互联网软件都是如此。如果用户坚持从头到尾成功地完成在线试用,那么表明他们喜欢这个产品。如果他们感到很困惑或者很乏味,就不会坚持试用到底。所以,只要我们能让更多的访问者坚持完成在线试用,我们的用户增长率就会提升。
我研究了用户点击行为,发现在某一个地方,在线试用的用户会停止前进,改为点击浏览器的“后退”按钮。(如果你写过互联网软件,你会发现“后退”按钮是设计中最费脑筋的问题之一,很有意思。)所以,我就在那个地方加了一条提示,告诉用户已经接近终点了,提醒他们不要点击“后退”按钮。这时,互联网软件的另一个好处就体现出来了,你做了修改,马上就可以得到反馈。完成在线试用的用户比例从60%立刻上升到了90%。由于新增付费用户的数量是完成在线试用的用户数量的一个函数,所以与修改前相比,我们的收入增长了将近50%。
金钱问题
20世纪90年代早期,我读过一篇文章,它称应该让用户像订报纸那样按照使用时间长短订购软件的使用权。第一眼看上去,这种说话好像很滑稽。但是后来,我意识到这个观点是对的,因为它反映了软件开发的现实:软件开发不是静态的,而是一个持续不断的动态过程。按照传统的软件销售模式,厂商每推出一个新版本,就会强迫现有用户重新出钱购买,然后安装升级,只有这样厂商才能持续不断获得收入。我认为,如果公开收取软件的订阅费,而不是让用户购买软件的所有权,操作起来会更自然、更简便。“订报纸模式”正是互联网软件天然的收费模式。互联网软件不可能用自由软件的模式经营,只能由商业性公司来经营。因为经营互联网软件要承担很大的风险,会产生大量支出,没有人会免费做这件事情的。
对于软件公司来说,互联网软件是一个很理想的收入来源。你每个季度的销售额不是从零开始,而是拥有一个持续的现金流。因为互联网软件每时每刻都可以升级,所以你不用担心做错什么事。事实上,你不可能真的做错什么事,因为如果用户痛恨你对软件的修改,你马上就会知道。你也不会有坏账的烦恼,如果谁不付钱,你就停止对他的服务。此外,你也不可能遇到盗版问题。
没有盗版是一种“优势”,但也是一个问题。一定数量的盗版对软件公司是有好处的。不管你的软件定价多少,有些用户永远都不会购买。如果这样的用户使用盗版,你并没有任何损失。事实上,你反而赚到了,因为你的软件现在多了一个用户,市场影响力就更大了一些,而这个用户可能毕业以后就会出钱购买你的软件。
只要有可能,商业性公司就会采用一种叫做“价格歧视”(price discrimination)的定价方法,也就是针对不同的客户给出不同的报价,使得利润最大化^。软件的定价特别适合采用价格歧视,因为软件的边际成本^^接近于零。这就是为什么很多软件的Sun服务器版本比Intel服务器版本更贵的原因,因为如果一个公司购买Sun服务器,就表明它很有钱,不在乎对设备的投资,那么为什么不向它开个高价呢?盗版实质上是一种价格歧视,只不过针对的是最底层的消费者。我觉得,软件公司明白这个道理,所以故意对某些盗版行为睁一只眼闭一只眼^^^。由于互联网软件无法盗版,所以软件公司必须想出其他策略推广软件。
^「价格歧视无所不在,所以当我发现1936年的《鲁宾逊—帕特曼法案》规定价格歧视在美国属于非法行为时,不免感到震惊。这个法案看来并没有得到严格执行。」
^^「“边际成本”是一个经济学概念,指下一个单位产品的生产成本。软件的边际成本就是复制代码的成本,所以接近零。这意味着,对软件公司来说,增加一个用户几乎没有增加生产成本。它与价格歧视的关系在于,边际成本越低,厂商的定价空间就越大,它可以针对特定消费者定出很低的价格,从而达到扩大销售、利润最大化的目的。——译者注」
^^^「Naomi Klein在No Logo一书中说,有些服装品牌的目标客户是“都市青少年”这些品牌的专卖店对店内偷窃行为就睁一只眼闭一只眼,因为在它们的目标市场中,那些在店内行窃的“顾客”也是流行风尚的带头人,可能会带动本品牌的销售。」
相比桌面软件,互联网软件卖得更好,因为它易于销售。你可能认为,购买商品时,人们是先做出决定,然后再购买,好像这个行为分成两个独立的步骤。创立Viaweb之前,我也是这样想的,不过我从未对这个问题进行过深入思考。事实上,第二步对第一步有反作用,如果某样商品购买起来很困难,人们就会改变主意,放弃购买。反过来也成立,如果某样东西易于购买,你就会多买一点。自从有了亚马逊网上书店,我买的新书比什么时候都多。互联网软件提供的服务可能是世界上购买起来最方便的东西,如果你试用完demo再买,那就更是如此了。购买时,除了输入信用卡号码以外,用户不应该再被要求做其他事。(要求用户做得越多,你担的风险就越大。)
软件公司有时会采用分销模式,让ISP分销互联网软件。这样做很不好。服务器必须在你自己的控制之中,因为你需要不断改进硬件和软件。如果你放弃对服务器的直接控制,你就放弃了互联网软件的大部分优势。我们的几个竞争对手就采用分销模式,那是作茧自缚。我常常想,这可能因为他们受到某些西装革履、衣冠楚楚的家伙的压制。后者只看到分销管道的销售潜力是多么令人兴奋,却没有意识到这将毁了他们正在销售的产品。通过ISP分销互联网软件,就好比让自动售货机出售寿司。
目标客户
谁是互联网软件的目标客户?Viaweb一开始就把个人和小企业当作目标客户。我认为这是互联网软件的通行规则。这些客户决策比较灵活,又需要低成本的新技术,所以他们更愿意尝试新事物。
互联网软件往往也是大公司的最佳选择。(虽然大公司反应迟钝,不一定能意识到这一点。)最好的内部网(intranet)就是互联网(Internet)。如果一家公司采用互联网软件,那么这家公司的软件系统将表现得更出色,服务器将得到更好的管理,员工可以不受地域限制使用这个系统。反对者往往声称互联网软件不安全。如果员工可以很容易地登录,那么坏人也可以很容易地登录。一些大型批发商就不太愿意使用Viaweb,觉得不能把客户的信用卡资料交给我们,而是放在自己的服务器上更安全。可能没法很婉转地向他们表达我们的观点,但是事实上,他们的服务器就是没我们的安全,我们对数据的保护几乎肯定比他们好。想想看,谁能雇到更高水平的网络安全专家,是一个所有业务就是管理服务器的技术型创业公司,还是一家服装零售商?不仅因为我们有技术水平更出色的员工,还因为我们比他们更关心数据的安全。如果一家服装零售商的服务器被入侵,最多只影响到这家公司本身,这件事也很可能在公司内部被掩盖起来,最严重的情况下可能还会有一个员工被解雇。但是,如果我们的服务器被入侵,就有成千上万家公司可能受到影响,这件事也许还会被当作新闻发表在业内新闻网站CNet上面,使得我们的生意做不下去,不得不关门歇业。
如果你想把钱藏在安全的地方,请问你是选择放在家中床垫下面,还是放在银行?这个比喻对服务器管理的方方面面都适用,不仅是安全性,还包括正常运行时间、带宽、负载管理、备份等,都是我们占优。只有把这些事情都做对,我们才能保证自己生存下去。服务器管理对我们是生死攸关的大事,玩具制造商如何看待对人体不安全的玩具,或者食品制造商如何看待感染了沙门氏菌的食品,我们就如何看待有缺陷的服务器管理。
某种程度上,使用互联网软件的大公司就好像把它的IT部门外包出去了。虽然听起来很激进,但是我认为这样做很好。比起自己雇用系统管理员,外包可以让这些公司得到更好的服务。非IT公司的内部系统管理员没有行业竞争压力,日久天长就会变得工作效率低下、不负责任。要让员工表现优秀,必须有竞争压力。销售员必须面对消费者,程序员必须面对竞争对手的软件,但是内部系统管理员就像老年单身汉,能够激励他的外部压力几乎没有^。我们在Viaweb就有足够的外部压力,使得我们努力前进,不会被别人甩在后面。我们直接接到客户的电话,而不只是同事的电话。如果服务器被入侵,我们会急得跳起来。即使过了这么多年,我现在想起当时的情景,肾上腺素还是会迅速上升。
^「不少公司都很想知道,什么事情可以外包,什么事情不可以外包。一个可能的答案是,公司内部所有不直接感受到竞争压力的部门都应该外包出去,让它们暴露在竞争压力之下。(我这里所说的“外包”,指的是聘请另一个公司来执行,而不是指把业务部门转移到海外。)」
所以,互联网软件通常也是大公司的正确选择。可是,大公司太迟钝,不到最后一刻想不通这一点,就像以前他们迟迟没有发现桌面电脑才是计算机发展的方向一样。这也是大公司往往会购买很贵商品的原因之一,所以你高额投入,向大公司推销你的商品,也就变得值得了。
有钱的客户倾向于更贵的选择,即使便宜的选择更符合他们的需要,他们也不会买。这种现象普遍存在。原因就是,那些索要高价的人将更多的钱投入推销。Viaweb不采用这种做法。互联网咨询公司从我们手里抢走了几个高端商家。他们说服这些商家,让他们相信更好的选择就是,花50万美元,将网上商店开在自己的服务器上。结果是意料之中的,当圣诞节购物高峰来临时,服务器的负载陡然上升,这些商家一个接一个地发现,他们的选择并不是那么正确。Viaweb的系统远比大多数商家自己搭建的系统更高级更先进,但是我们付不起高额的宣传费,无法让他们明白这一点。我们的宣传费每月只有300美元,无法派遣一个衣冠楚楚、言之凿凿的团队到客户公司做演示。
有一段时间,我们构思了一种新类型的服务,名叫“Viaweb黄金版”。它比我们普通类型的服务贵十倍,但是功能一模一样,唯一的区别就是有专人穿着西装面对面把它卖给你。我们从未把这个构思付诸实践,但是我很肯定,要是真推出的话,一定会有商家购买。
大公司付出的高价之中,很大一部分是商家为了让大公司买下这个商品而付出的费用。(如果国防部花1000美元买一个马桶座圏,部分原因是要让国防部买下它本身就需要花很多钱。)这就是为什么公司内部的局域网软件明明不可取、但是还会继续存在并且不断发展的一个原因。这样的软件更昂贵,但是你对这个难题就是无能为力。所以,最好的安排就是把个人和小企业客户放在第一位。其他的客户该来的时候就会来。
桌面电脑
微软公司
回想桌面电脑刚刚出现的时候,人人都对巨无霸IBM心存敬畏。现在很难想象那种感觉,但是我对此记忆犹新。现在,令人敬畏的巨无霸是微软公司,我想它面对新技术的威胁不会像IBM那样疏忽大意,自以为高枕无忧,毕竟微软的成功就是利用了IBM的疏忽。
「一个优秀的开源浏览器会帮到互联网软件,防止它们被微软扼杀。体积小、反应快的浏览器,本身就是好东西,会鼓励厂商开发小型的互联网设备。优秀的开源浏览器最大的优点则是,会推动HTTP和HTML继续向前发展(就像Perl起到的作用一样)。你还记得当年网景公司每推出一个浏览器的新版本,就会为HTML语言加上一些新功能吗?这样的好事为什么要停下来呢?
举例来说,如果互联网软件能够区分某一个链接是用户主动点击还是被动跟随前往,那将极有帮助。要做到这一点,只需要对HTTP协议做一点小小的加强就可以了,允许在一个请求中包括多个URL地址就能解决问题。此外,HTML语言如果能支持级联式菜单(cascading menu),也将很有帮助。
只要谁能写出一个新的Mosaic浏览器,他就能改变世界。现在这样做会不会太晚了?1998年,许多人认为再推出一个新的搜索引擎已经太晚了,互联网世界已经定型了。谷歌证明了这种看法是错误的。如果新事物真的有重大改迸,那么它总是可以找到生存空间的。」
创业公司
典型的创业公司行动快速,看上去不是那么正式,只有很少几个人,资金也有限。这几个人勤奋工作,技术放大了他们的决策。如果他们赌赢了,那就是一场大胜利。
开发互联网软件的创业公司会把与创业有关的每一件事做到极致。只用更少的人、更少的钱,就可以把软件写出来,并且开始运作。你必须打破常规、快速行动,循规蹈矩不可能成功。你完全能够在只有三个人的情况下让产品开始运营,你们唯一的办公场所就是一间公寓,里面放着一台连着ISP的服务器。我们就是这样做的。
创业公司的压力很大,不幸的是,这一点在互联网软件业也发挥到了极致。许多软件公司的开发者都有一段睡在桌子底下(或者类似经历)的日子,尤其是在初创期。令人惊恐的是,对于互联网软件来说,这样的日子没有尽头,什么都不足以阻止这种事情成为常态。对于桌面软件来说,睡桌子底下的经历经常可以告一段落,等到软件发布了,我们就都回家睡上一个星期。互联网软件永远没有收工的那一天,如果你愿意,可以一直干下去,每天忙上16个小时。而且,你能够做到这一点,意味着竞争者也能做到这一点,所以长时间工作变成了一种必需,不得不如此。因为你能做到,所以你必须做到。这简直就是逆向的帕金森定律^。
^「帕金森定律(Parkinson’s Law)是英国作家诺斯科特·帕金森(Cyril Northcote Parkinson,1909—1993)在1955~1958年的一组系列文章的总称。在这些文章中,帕金森讽刺了英国的官僚主义,总结了许多常见的官僚主义的表现形式。“帕金森定律”后来成为这些表现形式的代名词,它包括很多内容,其中有一条就是“因为你必须做到,所以你能够做到”。因此,本文作者称“因为你能够做到,所以你必须做到”是逆向的帕金森定律。——译者注」
除了长期加班,更可怕的事情是沉重的压力。传统上,程序员和系统管理员有不同的工作职责。程序员关注bug,系统管理员关注系统的基础设施。程序员可能一整天都在伏案编写代码,然后到了某个时间,就下班回家,不再去想代码了。系统管理员则是永远都无法把工作抛到脑后,可能凌晨4点就会被叫到机房,不过好在大多数时候他们的工作都不是很复杂。互联网软件的出现使得这两种工作结合在一起,因此把它们各自不同的工作压力也合在一起。程序员变成了系统管理员,但是工作职责的范围却没有明确界定,使得工作压力陡然增加。
勉强够用的网页
有一件事可能会打消你通过互联网软件创业的念头,那就是网页作为用户界面,功能实在是太弱了。我承认,这确实是一个问题。我们真的想改造HTML语言和HTTP协议,对许多地方进行加强。不过必须指出,目前阶段的网页刚好能满足需要。
一切最终会变成什么样子?我不知道。如果你把赌注押在互联网软件上,你也不必担心这个问题。只要人们继续上网,互联网软件就输不了。互联网也许不是唯一的提供软件的途径,但是它现在就能发挥作用,并还将持续很长一段日子。互联网软件的开发成本低,即使是最小型的公司,也可以很容易地制作和发布。互联网软件做起来很辛苦,还有许多特别大的压力,但是这样只会使得创业公司成功的机会变大。
为什么不尝试一下?
如果你是一个黑客,并且梦想自己创业,可能会有两件事情令你望而却步,不敢真正开始采取行动。一件是你不懂得管理企业,另一件是你害怕竞争。可是实际上,这两件事都是没有通电的电篱笆。
首先,管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。随着事业的发展,你自己就能琢磨出来其他的诀窍。
刚开始的时候,你可能入不敷出,但是只要亏损不持续太久,你就不会有事。如果初期阶段缺少资金,这至少有助于你养成勤俭节约的习惯。开支越小,就越不会超支。幸运的是,编写一个互联网软件是非常便宜的。我们的总支出就不超过1万美元,现在应该更便宜了。其中,我们不得不花了几千美元买了一台服务器,又花了更多钱购买SSL。(那时唯一出售SSL软件的公司就是网景。)现在,你可以租到一台强大得多的服务器,上面已经安装好了SSL,而费用比我们当时的带宽费还要少。如今,开发一个互联网软件的费用比购买一把高级办公椅还要便宜。至于如何做出用户喜欢的产品,下面是一些通用规则。从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出1.0版,并且不断以改进,整个过程中密切倾听用户的反馈。用户总是对的,但是不同的用户要求不一样。低端的用户要求简化操作和清晰易懂,高端的用户要求你增加新功能。软件最大的好处就是让一切变得简单。但是,做到这一点的方法是正确设置默认值,而不是限制用户的选择。如果竞争对手的产品很糟糕,你也不要自鸣得意。比较软件的标准应该是看对手的软件将来会有什么功能,而不是现在有什么功能。无论何时,你都要使用自己的软件。Viaweb的主要功能是建立网上商店,但是我们也使用它建立自己的网站。不要只因为对方的头衔是市场专家、设计师或产品经理,就盲目听从他们的话。如果他们的观点真的很好,那就听从他们,关键是你要自己判断,不要盲从。只有懂得设计的黑客,才能设计软件,不能交给对软件一知半解的设计师。如果你不打算自己动手设计和开发,那就不要创业。
其次,让我们来看看竞争。你所害怕的大概不是与你一样的黑客,而是那些像模像样,有着办公室、商业计划、销售员的公司,对不对?可是实际上,他们害怕你胜过你害怕他们,而且这一点上,他们并没有错。几个黑客搞懂如何租用办公室,或者如何雇用销售人员,要比那些公司(不管大公司还是小公司)搞懂如何正确写出软件容易得多。我在这两种地方都待过,所以知道这些。Viaweb被雅虎收购后,我突然发现自己在为一家大公司工作,那感觉就好像在齐腰深的水中艰难行走。我无意贬低雅虎。它拥有一些很好的黑客和顶尖的管理人才。对于一家大公司来说,它可谓是出类拔萃了。但是,它的生产效率仅仅相当于小型创业公司的十分之一。没有任何一家大公司能做得更好。微软公司的恐怖之处在于,它大到可以开发任何软件,就像一座能够行走的大山。
不要被微软吓到。你能做到它做不到的事情,正如它能做到你做不到的事情一样。开发互联网软件不需要得到任何人的许可,没有人能够阻止你。你不需要去申请许可证,不需要在零售店的货架上谋得一席之地,也不需要卑躬屈膝地求人家,将你的软件与操作系统捆绑在一起。你能够通过浏览器发布软件,没有人能在你和浏览网站的用户之间插上一脚。
你也许不会相佶,但是我向你保证,微软公司害怕你。它的那些目中无人的中层管理人员也许不是这样想的,但是比尔·盖茨肯定是,因为1975年,上一次发布软件的新方式出现时,他也曾经跟你一样白手起家。
概述
解决新代码的bug要比解决历史遗留代码的bug容易。
要求用户做得越多,你担的风险就越大。
公司内部所有不直接感受到竞争压力的部门和人,都应该外包出去。
要让员工表现优秀,必须有竞争压力。
如果你不打算自己动手设计和开发,那就不要创业。
6 如何创造财富:致富的最好方法就是为社会创造财富。创造财富的最好方法就是创业。
原文
如果你想致富,应该怎么做?我认为最好的办法就是自己创业,或者加入创业公司。几百年来,这一直是致富的可靠途径。“创业公司”(startup)这个词诞生于20世纪60年代,但是它与中世纪集资进行的航海冒险活动其实也相差无几。
创业公司往往与技术有关,所以“高技术创业公司”这个短语几乎就是同义重复。创业公司其实就是解决了某个技术难题的小公司。
许多人对此一无所知,但也发了财。这就好像你不用学习物理学也能成为一个出色的棒球投球手。但是,我认为理解这些原理,有助于你取得成功。为什么创业公司必须是小公司?当创业公司不断变大时,它是否不可避免地失去创新能力?为什么创业公司往往选择在新技术领域创业?为什么如此之多的创业公司在开发新药或计算机软件,而不是在卖玉米油或者洗衣粉?
一个命题
从经济学观点看,你可以把创业想象成一个压缩过程,你的所有工作年份被压缩成了短短几年。你不再是低强度地工作四十年,而是以极限强度工作四年。在高技术领域,这种压缩的回报尤其丰厚,工作效率越高,额外报酬就越高。
仅仅因为工作经常受到干扰,黑客就会无法应对高难度的项目。这就是为什么黑客往往在深夜工作的原因,也是黑客无法在小隔间里写出优秀软件的原因(除非在半夜)。创业公司的一个巨大优势就是不会有任何人来打扰你。没有人事部,也没有表格,自然也就不会有人打电话要求你填表格。」
^^「那些大公司的执行官看到创业公司员工的生产率是本公司员工的20或30倍时,自然很想知道怎样才能让自己的手下也这样拼命工作。答案很简单,付钱就行了。
许多大公司的内部,平均主义泛滥。如果采用自由市场制度那样的机制,你的公司就可以变成一个很有效率的地方。
这里的假设是,如果每个员工按照他创造的财富获得报酬,那么整个公司的利润将将最大化。」
运气的成分
每年300万美元在大多数人眼里是一笔大钱,但是在另一些人眼里却不值一提。300万美元算什么?我的目标是成为比尔·盖茨那样的亿万富翁。
现在先不考虑比尔·盖茨,因为名人不适合用来举例子,媒体只报道那些最有钱的人,而他们往往属于特例。比尔·盖茨很聪明,有决断力,工作也很勤奋,但是单单这样还不足以让你成为他。你还需要非同一般的好运气。
任何公司的成功历程中,运气都是一个很大的随机因素。那些你在报纸上读到的成功人士固然很聪明,很努力,但是他们的运气也不坏。比尔·盖茨肯定既聪明又努力,但是微软公司碰巧是历史上最大商业错误之一——DOS操作系统的授权协议——的受益者。毫无疑问,比尔·盖茨肯定竭尽全力才诱导IBM犯下这个大错,他也淋漓尽致地利用了对手的错误,但是只要IBM方面有一个人稍微有一点脑子,微软公司的历史就将完全不同。当时,与IBM相比,微软只是一家不起眼的小公司,一家小小的零件供应商罢了。如果IBM按照常理要求独家购买微软的产品,不许微软向第三方提供,微软也只能乖乖地签字。这对微软来说是一笔丢不得的大买卖,而IBM能够很容易地从其他公司搞到一个操作系统。
结果却是,IBM尽全力帮助微软控制了个人电脑的标准。从那时起,微软只要不停地做出产品就可以了,它从来不用做出有商业风险的决策。微软只要抱着授权协议不放,快速地复制新产品就行了。
如果IBM没有犯下这个错误,微软依然会是一家成功的公司,但是不会膨胀得这么大这么快。比尔·盖茨依然将成为富翁,但是只会排在《福布斯400富豪榜》接近末尾的地方,与其他年纪相仿的人位置差不多。
致富的方法有许多种,本文只谈论其中的一种,也就是通过创造有价值的东西在市场上得到回报,从而致富。其他许多种的致富方法包括赌博、投机、婚姻、继承、偷窃、敲诈、诈骗、垄断、行贿、游说、造假、开矿等。获得最可观的财富往往会涉及其中的几种方法。
通过创造有价值的东西而致富,这种方法的优势不仅仅在于它是合法的(许多其他方法如今都是不合法的),还在于它更简单。你只需要做出别人需要的东西就可以了。
金钱不等于财富
创造有价值的东西就是创造财富。你最好先搞清楚什么是财富。财富与金钱并不是同义词^。财富存在的时间与人类历史一样长久,甚至更长久,事实上蚂蚁也拥有财富。金钱是一种历史相对较短的发明。
^「近代历史上,政府有时都搞不清楚金钱和财富的区别。亚当·斯密在《国富论》中提到,许多国家政府为了保住“财富”,禁止出口白银或者黄金。但是,黄金和白银实际上只是一种交换媒介,留住它们并不会让一个国家变得更富有。如果物质财富保持不变,金钱越多,导致的唯一结果就是物价越高。」
财富是最基本的东西。我们需要的东西就是财富,食品、服装、住房、汽车、生活用品、外出旅行等都是财富。即使你没有钱,你也能拥有财富。如果有一台魔法机器,能够按照你的命令变出汽车,为你洗衣做饭,提供其他你想要的东西,那么你就不需要钱了。要是你身处南极洲内陆,再多的钱对你也是无用的,因为没有东西可买,你真正需要的是财富。
财富才是你的目标,金钱不是。但是,如果财富真的这么重要,为什么大家都把挣钱挂在嘴边呢?部分原因是,金钱是财富的一种简便的表达方式:金钱有点像流动的财富,两者往往可以互相转化。但是,它们确实不是同样的东西,除非你打算伪造货币,否则使用“挣钱”这个词会不利于理解如何才能挣钱^。
^「“挣钱”的英语是make money,字面意思就是制作金钱。在本文中,make money指的是财富,money指的是金钱,两者并不一样。所以,作者才会说,使用make money这个词,会不利于你理解如何才能make money。——译者注」
金钱是专业化的副产品。在一个高度分工的社会,你需要的大部分产品无法自己制造。你需要土豆、铅笔、住房以及别的东西,你不得不让别人来提供。
那么,你怎样才能让别人去种土豆并把它提供给你呢?方法就是给出对方需要的东西作为回报。但是直接与他人进行物物交换,你能得到的东西有限。如果你本人制作小提琴,而附近的农民对它都不感兴趣,那么你怎样交换食品呢?
当社会分工越来越精细后,人们发现解决方法就是把贸易过程分为两步。不是直接用小提琴交换土豆,而是先用小提琴交换金钱(比如银子),然后再用金钱交换你需要的东西。金钱就是交换中介,它必须数量稀少,并且便于携带。历史上,充当金钱的最常见交换媒介就是贵金属,但是现在我们使用另一种东西充当交换媒介,那就是美元。只要政府保证美元能够流通,那么它不需要物理形式的存在,就能充当交换媒介。
交换媒介的优点是,它使得交易可以进行下去。缺点是,它往往模糊了交易的实质。人们觉得做生意就是为了挣钱,但是金钱其实只是一种中介,让大家可以更方便地获得自己想要的东西。大多数生意的目的是为了创造财富,做出人们真正需要的东西^。
^「“财富”这个词有很多意思,有些并不是指物质财富。我不想做深入讨论,研究到底什么才是真正的财富。我这里指的只是一种特定的技术层面上的“财富”——人们用金钱向你交换的东西。这是一种很有趣、很值得研究的财富,因为它使得你免于饥饿,而且人们是否用金钱交换这种财富取决于他们,不取决于你。
当你开始做生意时,很容易陷入一种迷思,认为只要把东西做出来就会有人要。在互联网泡沫的那段日子、我遇到一位女士,她喜欢户外运动,所以开办了一个户外运动门户网站。如果你真的喜欢户外运动,你知道自己应该做什么生意吗?其中一种就是从出错的硬盘挽救数据。
两者有何关联?没有关联啦。我只是借此表达我的观点,就是说如果你想要创造财富(这里指的是狭义的财富,也就是使你免于饥饿的东西),那么你应该抱着特别怀疑的态度,去思考那些着眼于你自己感兴趣的东西的商业计划。对于自己感兴趣的东西,你会觉得它们很有价值,伹是它们恰恰最不可能与他人眼中有价值的东西发生重合。」
大饼谬论
许多人从小就认定世界上的财富总额是固定不变的,这样想的人数量多得惊人。任何一个正常的家庭,在某个时刻所拥有的财富总是一个固定的值。但是,家庭的财富总额与世界的财富总额不是一回事。
谈到财富总额的时候,财富经常被形容为一个大饼。政客说:“你无法把饼做得更大。”如果指的是某个家庭银行账户上的金钱数量或者政府某年的税收,这样说是对的。确实无法把饼做得更大,你分到的越多,别人分到的就越少。
小时候我就对这一点深信不疑:如果富人拿走了所有的钱,那么其他人就变得更穷了。许多成年人至今都是类似看法的信徒。每当有人提到x%的人口占有了y%的财富,他的言下之意往往就包含了这种错误的观点。如果你打算创业,那么不管你是否意识到了,你都是在着手推翻这种大饼谬论。
这里令人混淆的地方就是金钱有其抽象含义的一面。金钱不是财富,而只是我们用来转移财富所有权的东西。所以,虽然在某些特定的情况下(比如某个家庭当月的收入),你能用来与他人交换的金钱数量是固定不变的,但是大多数情况下,世界上可供交换的财富不是一个恒定不变的量。人类历史上的财富一直在不停地增长和毁灭(总体上看是净增长)。假设你拥有一辆老爷车,你可以不去管它,在家中悠闲度日,也可以自己动手把它修葺一新。这样做的话,你就创造了财富。世界上因为多了一辆修葺一新的车,财富就变得更多了一点,对你尤其是如此。这可不是隐喻的用法,如果你把车卖了,你得到的卖车款就比以前更多。
通过修理一辆老爷车,你使得自己更富有。与此同时,你也并没有使得任何人更贫穷。所以,这里明显不是一个面积不变的大饼。事实上,当这样观察的时候,你会很好奇,为什么有人会觉得大饼的面积无法增大^。
^「如果在修理旧车的过程中,你对环境造成了一些微小的破坏,那么你可能使得每个人都变得更贫穷了一点。但是即使把环境的成本考虑在内,这依然不是一个零和游戏,依然存在财富的净增长。我们可以举出这样的例子,比如一台坏机器里有一个零件松了,你把零件拧紧,机器可以重新运作,那么你就没对环境造成任何破坏,并且创造了财富。」
孩子在不知不觉中就懂得了这个道理。如果一个小孩想赠送另一个小孩一件礼物,但是又没有钱,他就会自己动手做。只不过一般情况下小孩子的动手能力不足,相比店里买来的礼物,他们自己做出来的东西从外观上就显得比较粗链。说实话,我们自己为父母做的松松垮垮的烟灰缸恐怕就很难在市场上卖出去。
手工艺人
最可能明白财富能被创造出来的人就是那些善于制作东西的人,也就是手工艺人。他们做出来的东西直接放在商店里卖。但是,随着工业化时代的来临,手工艺人越来越少。目前还存在的最大的手工艺人群体就是程序员。
程序员坐在电脑前就能创造财富。优秀软件本身就是一件有价值的东西。这里不存在大规模的流水线制造业,所以不用担心问题被混淆。你输入的文字符号就是一件完整的制成品。如果某人坐在电脑前,写出了一个不那么糟糕的浏览器(顺便说一句,这是一件很值得做的事),世界就会变得富有得多。
公司就是许多人聚在一起创造财富的地方,能够制造更多人们需要的东西。当然,有些雇员(比如收发室和人事部的员工)并不直接参与制造过程,但是程序员不然。他们真正地面对产品,一行行地写代码把产品做出来。所以,在程序员看来,事情再明显不过,财富就是被做出来的,而不是某个想象出来的神秘人物分发的大饼。
另一件程序员看来显而易见的事情就是创造财富的速率存在巨大的差异。Viaweb的一个程序员有着惊人的生产力,我记得看着他工作了整整一天,拿出来的产品估计使得公司的市场价值增加了几十万美元。一个优秀程序员连续工作几个星期可能可以创造价值100万美元的财富。同样的时间内,一个平庸的程序员不仅无法创造财富,甚至还可能减少财富(比如引入了bug)。
这就是为什么如此之多的最优秀程序员都是自由主义者的原因。我们这个世界,你向下沉沦或者向上奋进都取决于你自己,不能把原因推给外界。许许多多不创造任何财富的人——比如本科生、记者和政客——一听到最富有的5%人口占有全社会一半以上的财富,往往会认定这是不公平的。一个有经验的程序员很可能也认为这是不公平的。因为最顶尖的5%的程序员写出了全世界99%的优秀软件。
创造出来的财富不一定非要通过出售实现价值。至少直到最近,科学家一直在把他们创造的财富真正地捐献给社会。青霉素的发现使得我们所有人都变得更富有,因为从此我们死于细菌感染的可能性变小了。人们需要的东西就是财富,治愈疾病肯定就是人们需要的东西。黑客经常开发开源软件让所有人免费使用,以此把自己的工作捐献给社会。FreeBSD操作系统使我变得更富有。我自己的电脑就在使用FreeBSD,雅虎公司所有的服务器都是如此。
工作是什么
公司一切行为的目的都是盈利,从而生存下去。创造财富是大多数公司盈利的手段。公司的业务高度专业化,掩盖了它们都是在创造财富的这种相似性,你不要觉得只有制造业公司在创造财富。财富的一个重要元素就是地理位置。还记得前文假设的那台魔法机器吗?它会变出汽车,为你洗衣做饭,等等。但是,如果这台机器在美国,而你在中亚的某个地方,那么它对你也没多大用处。我们说,财富就意味着人们需要的东西,那么把商品送到顾客手中也是人们需要的。许许多多不生产物质商品的公司都是在如此创造财富。几乎所有情况下,公司的存在目的就是满足人们的某种需要。
当你为一家公司工作时,这也是你所做的事情。但是,公司内部的各种层级使得这一点有时不容易觉察到。你在公司内部所做的工作是与许多人一起合作完成的,你只是其中的一分子。你觉得自己是为公司的需要而工作,可能不会觉察到你其实是为了满足顾客的某种需求而工作。你的贡献也许不是直接性的,但是公司作为一个整体必须提供某种人们需要的东西,否则不可能盈利。如果公司一年付给你的薪水是x美元,那么总的来说,你为公司提供的劳动必须至少价值一年x美元,否则公司的支出就会大于收入,最后只好关门歇业。
一个大学毕业生总是想“我需要一份工作”,别人也是这么对他说的,好像变成某个组织的成员是一件多么重要的事情。更直接的表达方式应该是“你需要去做一些人们需要的东西”。即使不加入公司,你也能做到。公司不过是一群人在一起工作,共同做出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司^。
^「许多人20岁出头时惑到非常困惑和压抑。大学生活很有趣,可是已经过去了,上班的日子为什么会差别这么大?不要搞糊涂了,你现在已经从顾客变成了仆人。在这种新生活中获得乐趣是可能的。不过,你首先需要入门,门口的牌子写着“闲人勿进”。这种转变是一种冲击,如果你不赶快意识到这一点,事情将变得更糟。」
对于大多数人来说,最好的选择可能是为某个现存的公司打工。但是,理解这种行为的真正含义对你没有什么坏处。工作就是在一个组织中,与许多人共同合作,做出某种人们需要的东西。
更努力地工作
大公司会使得每个员工的贡献平均化,这是一个问题。我觉得,大公司最大的困扰就是无法准确测量每个员工的贡献。大多数时候它只是在瞎猜。在大公司中,你只要一般性地努力工作,就能得到意料之中的薪水。你不能明显无能或懒惰,但是谁也没觉得你会把全部精力投入工作。
但是,现实是你在工作上投入的精力越多,就越能产生规模效应。在某些行业,那些真正拼命工作的员工能够创造出比普通员工多十倍甚至百倍的财富。比如,程序员全力开发一个崭新的软件,要比让他常规地维护和更新一个现有的软件能创造更多价值,这等于开辟了一个新的收入来源。
成立公司的目的不是奖励那些全部精力投入工作的员工。你不能对老板说,我打算十倍努力地工作,请你把我的薪水也增加十倍吧!因为公司已经假定你在全力工作了。但是,真正的问题实际上在于公司无法测量你的贡献。
销售员是一个例外。他们产生的收入很容易测量,他们的薪水往往是销售额的一个百分比。如果一个销售员想更努力地工作,他马上就可以这样做,并且自动按比例得到更多的报酬。
除了销售员以外,还有一个职位,大公司可以雇到顶级人才,那就是高级的管理职位。原因也是一样的,因为这个职位的贡献能够被测量,高级经理对整家公司的表现负责。普通员工的表现往往很难测量,所以也没人要求他们做出突出表现。高级经理就不一样了,他们像销售员一样,不得不用数字证明自己。一个表现糟糕的CEO是不能推托说自己已经尽了全力的。如果公司的表现不好,就是他的表现不好。
如果一家公司真正能够按照贡献付薪,它将取得巨大成功。许多雇员会更努力地工作。更重要的是,这样一家公司将吸引那些工作特别努力的人,从而超越竞争对手。
但公司不可能对每个人都像销售员那样付薪。销售员是单独工作的,大多数雇员则是集体工作。假设有一家公司制造某种消费品,工程师为它实现各种功能,设计师为它设计一个漂亮的外壳,营销人员让顾客相信这是值得拥有的商品。请问如何评价每个人对这个商品销售额的贡献?还有,上一代产品的工作人员为这个公司树立了质量可靠的形象,请问最新产品的销售额有多少应该归功于他们?根本没有办法把所有人的贡献一一分解清楚。如果你能读懂消费者心理,你会发现消费者把所有上面这些因素放在一起看待。
你想更努力地工作,但是你的工作与其他许多人的工作混杂在一起,这样就产生了问题。在大公司中,个人的表现无法单独测量,公司里其他人会拖累你。
可测量性和可放大性
要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。
单单具备可测量性是不够的。比如,血汗工厂的工人报酬是按照计件制计算的,这是一个只有可测量性、没有可放大性的例子。你的表现可以被测量,并且据此得到回报,但是你没有决策的权力。你能做的唯一决策就是以多快的速度完成工作。即使你做到最快,回报可能也只增加一到二倍。
在电影中扮演主角就是一种同时具备可测量性和可放大性的工作。你的表现可以用电影的总收入测量,同时也决定了电影的成败,所以也就具备了可放大性。
CEO也是一种同时具备可测量性和可放大性的工作。公司的表现就是CEO的表现,所以它具备可测量性。CEO的决策决定了整个公司的方向,所以它具备可放大性。
我认为,任何一个通过自身努力而致富的个人,在他们身上应该都能同时发现可测量性和可放大性。我能想到的例子就有CEO、电影明星、基金经理、专业运动员。有一个办法可以发现是否存在可放大性,那就是看失败的可能性。因为收入和风险是对称的,所以如果有巨大的获利可能,就必然存在巨大的失败可能。CEO、电影明星、基金经理、运动员的头顶都悬着一把宝剑,随时可能掉下来。一旦他们搞砸了,他们就完了。如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。
但是,如果你想同时具备可测量性和可放大性,不一定非当上CEO或电影明星不可。你只需要成为某个攻克难题的小团体的一部分就可以了。
小团体=可测量性
就算你无法测量每个员工的贡献,但是你可以得到近似值,那就是测量小团队的贡献。
整家公司产生的收入是可以测量的,如果公司只有一个员工,那么就可以准确知道他的贡献了。所以,公司越小,你就越能准确估计每个人的贡献。一家健康的创业公司可能只有10个员工,那么影响收入的人员因子最多也只有10。
因此,创业或加入一家创业公司最可能实现前文的情况,那就是你对老板说,我打算十倍努力地工作,请你把我的薪水也增加十倍吧!但是,有两个区别。第一个区别是你的要求并非向老板提出,而是直接向顾客提出(毕竟老板只是顾客的代理人)。第二个区别是你并非一个人完成这个任务,而是在一个小团体中与其他几个有同样抱负的人一起合作完成。
一般情况下,小型团队都由多人组成。只有表演或写作这样的特殊工作,你才会一个人单干。你最好找出色的人合作,因为他们的工作和你的一起平均计算。
大公司就像巨型的古罗马战舰,一千个划船手共同划桨,推动它前进。但是,两个因素使得它快不起来。一个因素是,每个划船手看不到自己更努力划桨有何不同;另一个因素是,一千人的团队使得任何个人的努力都被大大地平均化了。
如果你从一千人中随便挑出10个人,把他们放在一条小船上,他们很可能会划得更快。胡萝卜和大棒同时形成对他们的激励。身强力壮的划船手看到他个人对船的前进速度有显著影响,就会受到激励。如果有人偷懒,其他人很容易发现,并会对他提出抱怨。
如果你从大船上挑选出10个最优秀的划船手,把他们组成一个团队,这时,十人小船的优势才会真正显示出来。小团队带来的各种额外激励会在他们身上发挥得淋漓尽致。这里最重要的是你挑选出了最优秀的划船手,每个人都是一千人中排在最前面的顶尖高手。对他们来说,将自己的工作与其他高手的工作平均化要比与平庸之辈的工作平均化让人满意多了。
这就是创业公司的真正意义。理想情况下,你与其他愿意更努力工作的人一起组成一个团队,共同谋取更高的回报(相比他们为大公司工作的情况)。因为创业公司的团队往往是自发形成的,许多有抱负的创始人彼此之间早就相识(至少听说过对方),所以他们对彼此贡献的评估要比一般的小团体更准确。创业公司不仅仅是十个人的团队,而且是十个同类人的团队。
乔布斯曾经说过,创业的成败取决于最早加入公司的那十个人。我基本同意这个观点,虽然我觉得真正决定成败的其实只是前五人。小团队的优势不在于它本身的小,而在于你可以选择成员。我们不需要小村庄的那种“小”,而需要全明星第一阵容的那种“小”。
团队越大,每个人的贡献就越接近于整体的平均值。所以,在不考虑其他因素的情况下,一个非常能干的人待在大公司里可能对他本人是一件很糟的事情,因为他的表现被其他不能干的人拖累了。当然,许多因素都会产生影响,比如这个人可能不太在乎回报,或者他更喜欢大公司的稳定。但是,一个非常能干而且在乎回报的人,通常在同类人组成的小团队中会有更出色的表现,自己也会感到更满意。
高科技=可放大性
创业公司为每个人提供了一条途径,同时获得可测量性和可放大性。因为创业公司是小团队,所以具备可测量性。因为创业公司通过发明新技术盈利,所以具备可放大性。
什么是技术?技术就是某种手段,就是我们做事的方式。如果你发现了一种做事的新方式,它的经济价值就取决于有多少人使用这种新方式。技术就是钓鱼的鱼竿,而不是那条鱼。这就是创业公司与餐馆或理发店的区别。餐馆煎鸡蛋,理发店剪头发,每次只能为一个顾客提供服务,但是如果你解决了一个热门的技术难题,别人都会使用你的解决方案。这就是可放大性。
回顾历史,大多数因为创造财富而发财的人都是通过开发新技术而实现的。
小团队天生就适合解决技术难题。技术的发展是非常快的,今天很有价值的技术,几年后可能就会丧失价值。小团队在如今这个时代可谓如鱼得水,因为他们不受官僚主义和繁琐管理制度的拖累。而且,技术的突破往往来自非常规的方法,小团队就较少受到常规方法的约束。
大公司也能开发出新技术,就是开发得比较慢而已。大公司的规模决定了它们无法快速行动,也无法测量并奖励表现优异的员工。所以在现实中,大公司开发出来的新技术只出现在那些需要大规模资本投入的领域,比如微处理器、电厂、大型民用飞机等,因为在这些领域内创业公司没有能力与之竞争。不过,即使在这些领域,大公司还是依仗创业公司提供零部件和构思。
生物科技类和软件类的创业公司很显然都是解决高难度技术问题的。我认为,就算看上去与技术无关的商业类公司,其实也是解决技术问题的。比如,麦当劳是快餐连锁集团,它的发展依靠的就是设计出了一个快餐服务体系,可以复制到全世界每一个角落。每一家麦当劳连锁店都必须严格遵守操作规定,这使得它就像软件一样运作。所以,麦当劳其实也符合“一次开发,普遍适用”的模式。沃尔玛也是如此,它的创始人Sam Walton并不是因为经营零售业而致富,而是因为设计出了一种新型商店。
选择公司要解决什么问题应该以问题的难度作为指引,而且此后的各种决策都应该以此为原则。Viaweb的一个经验法则就是“更上一层楼”。假定你是一个手脚敏捷的小男孩,身后有一条壮硕的大狗正在追你。你跑到楼梯口,这时应该上楼还是下楼?我觉得应该上楼。如果下楼的话,大狗可能跑得跟你一样快。上楼的话,大狗的庞大身躯就将成为劣势。不错,跑上楼你会比较吃力,但是大狗会感到更吃力。
在实际操作中,这就意味着我们故意选择那些很困难的技术问题。假定软件有两个候选的新功能,它们创造的商业价值完全相同,那么我们总是选择较困难的那个功能。不是因为这个功能能带来更多的收入,
而是因为它比较难。我们很乐于迫使那些又大又慢的竞争对手跟着我们一起走进沼泽地。创业公司就像游击队一样,喜欢选择不易生存的深山老林作为根据地,政府的正规军无法追到那种地方。我还记得创业初期我们是多么筋疲力尽,整天都为一些可怕的技术难题绞尽脑汁。但是,我还是感到相当高兴,因为那些问题连我们都觉得这么困难,那么竞争对手就更会认为是不可能解决的。
这不仅是创业公司运作的好方法,更是创业公司的本质。风险投资商(VC)知道这个道理,为它起了一个名字——进入壁垒(bairiers to entry)。如果你有一个新点子去找VC,问他是否投资,他首先就会问你几个问题,其中之一就是其他人复制你的模式是否很困难。也就是说,你为竞争对手设置的壁垒有多高^。你最好做出令人信服的解释,阐明你的技术难以复制的原因。否则一旦大公司看到了,它们就会做出自己的版本,再加上它们的品牌、资本、经销能力,一夜之间就把你的市场全部抢走。那时你就像来到开阔地带的游击队,会被正规军一举歼灭。
^「VC问我们,如果另一家创业公司开发与我们同样的软件,需要多少时间。我们当时的回答就是,可能没人能做到。我觉得,这样说使得我们听上去很幼稚,或者很像骗子。」
设置“进入壁垒”的方法之一就是申请专利。但是专利的保护程度可能不高。竞争对手通常能找到绕过专利的方法。如果找不到,它们可能就不找了,直接侵犯你的专利,等着你去起诉它们。大公司不害怕打官司,这对它们是家常便饭。它们很清楚,打官司的成本高昂又很费时。你听说过Philo Famsworth这个人吗?他是电视机的发明者,可是没有人知道他,因为他的公司没有从电视机上面赚到钱^。赚到钱的公司是RCA,发明电视机给Philo Farnsworth带来的后果就是一场长达10年的专利诉讼。
^「技术的发明人往往很难确定,可以明确无误地确认只有一个发明人很难。所以根据这条规则,如果你知道某种东西的“发明人”(比如电话、流水线、飞机、电灯、晶体管),那是因为他的公司用这种发明賺到了钱,并且公司的公关人员尽力散布发明人的故事。如果你不知道谁发明了某种东西(汽车、电视、计算机、飞机引擎、激光),那是因为其他人的公司从这种发明中赚到了钱。」
俗话说得好,最好的防御就是进攻。如果你开发出来的技术是竞争对手难于复制的,那就够了,你不需要依靠其他防御手段了。一开始就选择较难的问题,此后的各种决策都选择较难的那个选项^。
^「总的来说,这也是很好的处事原则。如果你有两个选择,就选较难的那个。如果你要选择是坐在家里看电视,还是外出跑步,那就出去跑步吧。这个方法有效的原因可能是遇到两个一难一易的选择时,往往出于懒惰的缘故,你会选择较易的那个选项。在意识深处,你其实知道不懒惰的做法会带来更好的结果,这个方法只是迫使你接受这一点。」
潜规则
如果创业就是比别人工作得更勤奋、赚到更多的钱,那么很显然人人都想去创业。而且一定程度上,创业也比较有趣。我觉得许多人都不喜欢大公司处事按部就班、会议没完没了、人际关系冰冷、管理层瞎指挥……
但创业是有一些潜规则的,其中一条就是很多事情由不得你。比如,你无法决定到底付出多少。你只想更勤奋工作2到3倍,从而得到相应的回报。但是,真正创业以后,你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。
另一条潜规则是,创业的付出与回报虽然总体上是成比例的,但是在个体上是不成比例的。我在前面说过,对于个人来说,付出与回报之间存在一个很随机的放大因子。你努力30倍,最后得到的回报在现实中并不是30倍,而是0到1000倍之间的一个随机数。假定所有创业者都努力30倍,最后他们得到的总体平均回报是30倍,伹中位数却是0^。大多数创业公司都以失败告终,其中并不都是很烂的项目(互联网泡沫时期曾经出现过专门介绍狗粮的门户网站)。一种很普遍的情况是,某个创业公司确实在开发一个很好的产品,但是开发时间太长了一点,结果资金都用完了,只好关门散伙。
^「平均数(mean)是算数平均值,会受到个别极端值的影响,中位数(median)是最中间的那个值,不受个别极端值的影响。所以,这句话的意思就是,由于存在个别极其成功的创业者,所以回报的平均值被拉到了30倍,但是大多数创业者其实都以失败告终,所以中位数是0。——译者注」
创业公司不像能经受打击的黑熊,也不像有盔甲保护的螃蟹,而是像蚊子一样,不带有任何防御,就是为了达到一个目的而活着。蚊子唯一的防御就是,作为一个物种,它们的数量极多,但是作为个体,却极难生存。
创业公司如同蚊子,往往只有两种结局,要么赢得一切,要么彻底消失。你通常不知道自己会是哪一个结局,只有等到最后一刻才会明了。有好几次Viaweb都接近失败了,我们的发展轨迹就像正弦函数的波形。幸运的是,我们在波形的最高点被收购了,但是真是差一点就倒闭了。在我们去加州拜访雅虎总部讨论公司出售事宜的同时,我们还不得不借了一间会议室专门安慰一位投资人,防止他撤出新一轮融资,因为没那笔钱我们就完蛋了。
创业公司这种大起大落的特点不是我们想要的。Viaweb的黑客都是极度厌恶风险的人。如果有别的方式可以让努力与回报成正比,又不存在风险的因素,我们将很乐于尝试。我们宁愿以百分之百的把握去赚100万美元,也不愿以20%的把握去赚1000万美元,尽管后者理论上的期望值比前者高出一倍。很不幸的是,如今的商界不存在百分之百把握赚到100万美元的可能。
保险的做法就是在早期卖掉自己的创业公司,放弃未来发展壮大(但风险也随之增大)的机会,只求数量较少但是更有把握的回报。我们曾经遇到过一个这样的机会,但是自以为是地将它放过了,事后才觉得自己很愚蠢。此后,我们就急不可耐地盼着把公司卖掉。在第二年里,只要有任何人对Viaweb流露出稍微一点点的兴趣,我们就试着努力把公司卖给他。但是,始终没有买家,所以我们不得不继续把公司开下去。
早期收购Viaweb是一桩很合算的交易,但是收购方对便宜货没有兴趣。一家大到有能力收购其他公司的公司必然也是一家大到变得很保守的公司,而这些公司内部负责收购的人又比其他人更保守,因为他们多半是从商学院毕业的,没有经历过公司的创业期。他们宁愿花大钱做更安全的选择,所以向他们出售一家已经成功的创业公司要比出售还处在早期阶段的创业公司更容易,即使会让他们付出多得多的价码。
用户数量
我认为,如果你的公司有机会被收购,那将是不错的选择。管理一家公司与创立一家公司是不同的两件事。当情况基本稳定下来以后,不妨让大公司来接手。这在财务上也是明智的选择,卖掉公司你的风险就分散了,这就好像有一个理财师建议你用所有钱投资一支波动性很高的股票,你会怎么想?
那么,怎样才能把公司卖掉呢?基本上,不管是否想出售公司,你要做的事情都是一样的(比如多赚钱)。但是,被收购本身就是一门学问,我们在Viaweb花了很多时间研究它。
潜在的买家会尽可能地拖延收购。收购这件事最难的地方就是让买方真正拿出钱。大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得CEO们连夜行动。次强的动机则是让他们担心如果现在不买你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成一个他们的竞争对手。
在这两种收购动机中,归根结底的因素都是用户数量。你以为买家在收购前会做很多研究,搞清楚你的公司到底值多少钱,其实根本不是这么回事。他们真正在意的只是你拥有的用户数量。
事实上,买家假定用户知道谁有最好的技术。虽然这听上去很蠢,但是用户是你证明自己创造了财富的唯一证据。财富就是人们需要的东西,如果没人使用你的软件,可能不是因为你的推广活动很失败,而是因为你没有做出人们需要的东西。
风险投资商有一张清单,上面写满了各种表示不应该收购的危险信号。排在榜首的信号中有一个就是公司由技术顽童掌控,只想解决有趣的技术问题,不考虑用户的需要。你开办创业公司不是单纯地为了解决问题,而是为了解决那些用户关心的问题。
所以,我认为你应该和买家一样,也把用户数量当作一个测试指标。像优化软件一样优化公司,用户数量就是判断公司表现好坏的指标。做过软件优化的人都知道,优化难点就是如何测出系统的表现。如果凭空猜测软件最慢的是哪一部分以及怎样让它快起来,那估计百分百会猜错。用户数量也许不是最好的测量指标,但应该也相差不远了。买家关心它,收入依赖它,竞争对手恐惧它,记者和潜在用户则是被它打动。无论你的技术水平有多高,用户数量都比你自己的判断更能准确反映哪些问题应该优先解决。
此外,将公司管理视同软件优化还能帮助你避免VC担心的另一个陷阱——开发某种产品的时间过长。现在,黑客都已经熟知这一点,并总结出一个术语“过早优化”(premature optimization)。尽快拿出1.0版,然后根据用户的反映而不是自己的猜测进行软件优化。
你必须时刻牢记的最基本的原则就是,创造人们需要的东西,也就是创造财富。如果你想通过创造财富使得自己致富,那么你必须知道人们需要什么。很少有公司真的关注如何使顾客更满意。有多少次,你走进一家商店,或者打电话给某个公司,你的心中怀着担忧和恐惧?当你听到“你的意见对我们很重要,请不要挂断”,你真的觉得事情会得到圆满解决吗?
餐馆有一道菜烧糊了,它还赔得起,因为只影响到一桌顾客。但是在科技行业中,你开发的新技术是供所有人使用的,一旦你的技术与使用者的需要有差距,影响就会被成倍放大。你要么令大量顾客满意,要么令大量顾客不满。你越能满足他们的需要,你创造的财富也就越多。
财富和权力
创造财富不是致富的唯一方法。在人类的历史长河中,它甚至不是最常见的方法。就在几个世纪前,财富的主要来源还是矿石、奴隶、农奴、土地、牲畜,而快速获得财富的方法只有继承、婚姻、征服、没收。所以,很自然地,财富的名声不好。
从那时到现在,两件事情出现了变化。第一个变化是法律。在相当长的历史时期内,你的财富得不到保护,统治者和他的手下可以设法将它占为己有。伹是,变化出现在中世纪的欧洲。新兴的商人和制造业者开始在城市中崛起^,他们团结起来对抗当地的封建领主。人类历史上第一次出现强盗无法夺走平民血汗钱的情况。这对第二个变化起到了巨大的推动作用,甚至可能是第二个变化发生的主要原因。这第二个变化就是工业化的来临。
^「资产阶级在历史上首先出现在意大利北部和荷兰,这可能不是偶然,因为那里没有强大的中央政府。这两个地区是那时最富裕的地方,后来变成了文艺复兴向外扩散的两大中心。它们后来没能继续扮演这样的角色,那是因为其他地区(比如美国)将它们开创的摸式发扬光大了。」
关于工业革命的起因,已经有大量的文献论述过。但是,创造财富的人能够心安理得地享用自己的财富,这确实是工业革命的一个必要条件(可能不是充分条件)^。—个反面证据就是,试图违背这个条件的国家经济都出现了倒退,比如20世纪六七十年代的英国工党政府(它的后果相对不太严重)。没有财富的激励,技术革新就会逐渐停顿。
^「充分条件在这里可能也成立。但是如果成立的话,为什么工业革命没有早一点发生呢?两个可能的(但是互相排斥的)解释是:(a)变化其实早发生了,工业革命只是一系列革命中的一环,(b)中世纪的城镇存在垄断经营和行会制度,延缓了新生产方式的诞生。」
还记得从经济学观点看什么是创业公司吗?简单说,就是可以让人更快速工作的地方。你不再是慢慢地积累50年的普通工资,而是要尽快地将这笔钱赚到手。所以,政府禁止个人积累财富实际上就是命令人民减慢工作的速度。他们同意让你在50年里赚到300万美元,但是不同意让你在2年里赚到这些钱,即使前提是你拼命努力工作。这样的政府就像一家大公司的老板,你无法对他说,我打算十倍努力地工作,请你把我的薪水也增加十倍吧!更严重的是,他永远是你的老板,即使你自己创业也避不开他。
缓慢工作的后果并不仅仅是延迟了技术革新,而且很可能会扼杀技术革新。只有在快速获得巨大利益的激励下,你才会去挑战那些困难的问题,否则你根本不愿意去碰它们。开发新技术是非常痛苦的经历,正如爱迪生所说,百分之一的灵感加上百分之九十九的汗水。没有财富的激励,就不会有人愿意去做技术革新。工程师愿意接受普通薪水去做一些诱人的项目(比如战斗机和登月火箭),而与日常生活关系更密切的技术革新(比如电灯泡和半导体)只能由创业者来发明。
创业公司并不只是过去二十年发生在硅谷的事情。如今,通过创造财富而致富已经成为了普遍的模式。每一个这样做的人差不多都应用了同样的诀窍:可测量性和可放大性。前者来自小团队的合作,后者来自开发新技术。无论是13世纪的佛罗伦萨,还是今天的加州,它们都是一样的。
理解这些有助于回答一个重要的问题:为什么欧洲在历史上变得如此强大?是因为欧洲优越的地理位置,还是因为欧洲人天生就比较优秀,或者是宗教原因?答案(或者至少是近因)可能就是欧洲人接受了一个威力巨大的新观点:允许赚到大钱的人保住自己的财富。
一旦自己的财产有了保证,那些想致富的人就会愿意去创造财富,而不是去偷窃。由此导致的新技术不仅被转化成财富,还被转化成军事力量。隐形飞机的理论是由前苏联数学家提出的,但是因为前苏联没有计算机工业,它就只能是一个理论,无法变成产品。前苏联没有足够快的硬件来完成设计飞机所需要的大量计算。
冷战、第二次世界大战、近代的大多数战争都说明了这个道理。要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。
概述
仅仅因为工作经常受到干扰,黑客就无法应对高难度的项目。
承担较大的压力通常会为你带来额外的报酬。
金钱与财富不同,财富是目的,金钱是手段,是财富的一种简便的表达方式。社会的财富总值是个变量,目前看起来是逐步增加的。贫富差距的扩大是好是坏,要看是什么造成了差距,如果是通过财富的转移,那么是坏事,如果是通过创造新财富,那么是好事。
如果一家公司能够按照贡献付薪,它将取得巨大成功,小公司更适合。
要更好的创造财富,你做的事情需要两点保证:可测量性,可放大性。硅谷的诀窍,可测量性来自小团队,可放大性来自开发新技术。
我们应该让自己的贡献更直接,如果你觉得自己是为公司的需要而工作,而感受不到你是为了满足顾客的某种需求而工作,就不是一个好信号。
政府禁止个人积累财富,本质上就是在命令人民减慢工作速度。强大起来的社会,都允许创造财富(注意不是通过转移获得财富)的人保住自己的财富。
财富创业公司其实就是解决了某个技术难题的小公司。
从经济学观点看,你可以把创业想象成一个压缩过程,你的所有工作年份被压缩成了短短几年。你不再是低强度地工作四十年,而是以极限强度工作四年。在高技术领域,这种压缩的回报尤其丰厚,工作效率越高,额外报酬就越高。
财富存在的时间与人类历史一样长久,甚至更长久,事实上蚂蚁也拥有财富。金钱是一种历史相对较短的发明。
交换媒介的优点是,它使得交易可以进行下去。缺点是,它往往模糊了交易的实质。人们觉得做生意就是为了挣钱,但是金钱其实只是一种中介,让大家可以更方便地获得自己想要的东西。大多数生意的目的是为了创造财富,做出人们真正需要的东西。我们有一个误解,以为富人拿走了多数的钱,其他人就变得更穷了。每当有人提到x%的人口占有了y%的财富,他的言下之意往往就包含了这种错误的观点。新的致富的模式是通过创造财富而致富。
一个大学毕业生总是想“我需要一份工作”,别人也是这么对他说的,好像变成某个组织的成员是一件多么重要的事情。更直接的表达方式应该是“你需要去做一些人们需要的东西”。即使不加入公司,你也能做到。公司不过是一群人在一起工作,共同做出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司。
大公司会使得每个员工的贡献平均化,这是一个问题。我觉得,大公司最大的困扰就是无法准确测量每个员工的贡献。大多数时候它只是在瞎猜。在大公司中,你只要一般性地努力工作,就能得到意料之中的薪水。你不能对老板说,我打算十倍努力地工作,请你把我的薪水也增加十倍吧!因为公司无法测量你的贡献。
销售员是一个例外,他们产生的收入很容易测量,他们的薪水往往是销售额的一个百分比。再有一个职位,就是高级的管理职位,原因也是一样的,因为这个职位的贡献量能够被测量。
如果一家公司真正能够按照贡献付薪,它将取得巨大的成功。许多雇员会更努力地工作。更重要的是,这样一家公司将吸引那些工作特别努力的人,从而超越竞争对手。在大公司中,个人的表现无法单独测量,公司里其他人会拖累你。
要致富,你需要两样东西,可测量性和可放大性。CEO、电影明星、基金经理、运动员都是这样的职业。有一个办法可以发现是否存在可放大性,那就是看失败的可能性。因为收入和风险是对称的,所以如果有巨大的获利可能,就必然存在巨大的失败可能。如果你有一个令人感到安全的工作,你是不会致富的,因为没有危险,就几乎没有可放大性。技术就是某种手段,就是我们做事的方式,如果你发现了一种做事情的新方式,它的经济价值就取决于有多少人使用这种新方式。如果你解决了一个热门的技术难题,别人都会使用你的解决方案,这就是可放大性。
选择公司要解决什么问题应该以该问题的难度作为指引,而且此后的各种决策都应该以此为原则。假定软件有两个候选的新功能,它们创造的商业价值完全相同,那么我们总是选择较困难的那个功能。最好的防御就是进攻,如果你开发出来的技术是竞争对手难于复制的,那就够了,你不需要依靠其他防御手段了。你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。
创造人们需要的东西,也就是创造财富。
没有财富的激励,技术革新就会逐渐停顿。
要鼓励大家去创业。只有懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。
7 关注贫富分化:“收入分配不平等”的危害,会不会没有我们想的那样严重?
原文
当人们非常想把某件事做好的时候,有些人会做得比其他人好得多。达·芬奇的作品就比博格宁等同时代二流画家的作品优秀很多。同样的差距也存在于侦探小说家身上,雷蒙德·钱德勒的作品就比普通作家的作品好得多。顶级的国际象棋大师与普通的象棋俱乐部成员下一万盘棋,一盘都不会输。
与下棋、画画、写小说一样,赚钱也是一种专门的技能。但是,出于某种原因,我们以完全不同的态度对待这种技能。如果某些人善于下棋或写小说,没有人会有意见;伹是,如果某些人善与赚钱,报纸上就会有社论出来说这是不对的。
为什么?赚钱看上去与其他技能没有本质不同,为什么人们的反应如此强烈?
我认为有三个原因使得我们对赚钱另眼相看。第一,我们从小被误导的对财富的看法;第二,历史上积累财富的方式大多名声不好;第三,担心收入差距拉大将对社会产生不利影响。就我所知,第一点是错的,第二点已经过时了,第三点通不过现实的检验。有没有可能,在现代社会中,收入差距拉大实际上是一种健康的信号?
财富的老爹模式
五岁时,我不知道电力是电厂生产的,以为插座就是发电的地方。同样,很多孩子以为财富是直接从父母口袋里流出来的,不知道财富是创造出来的。
由于孩子们接触到钱的方式就是这样的,他们往往会误解财富,把财富与钱混为一谈。他们认为财富的总量是不变的,某个权威负责分配财富(所以理应平均分配),没有意识到财富是创造出来(而且创造得不太均等)。
事实上,财富与金钱是两个概念。金钱只是用来交易财富的一种手段,财富才是有价值的东西,我们购买的商品和服务都属于财富。你到海外旅行时,不用看当地人的银行账户就会知道你来到的是富国还是穷国。你只要看看他们的财富就行了:建筑、街道、服装、健康状况等。
财富从何而来?人类创造出来的。回到农业时代,这个概念就更容易理解。那时大多数人都务农,许多东西都需要自己生产出来。房屋、牲畜、谷仓等都是每个家庭自己生产出来的。这就很明显地说明,财富总量不是固定不变的,不像大饼那样会被分光。如果你想要更多的财富,自己生产就可以了。
这在今天的社会也成立,虽然已经很少有人直接创造财富供自己使用了(少量的家务活除外)。我们大多数人都在为其他人创造财富,然后用创造出来的财富交换金钱,再用金钱交换我们需要的另一种财富^。
^「为什么财富的分配问题引起这么多争论?部分原因是反对声最大的人当中,很多人都少有创造财富的经验:大学生、继承人、教授、政客、新闻记者。(如果你在酒吧里听过大家议论体育赛事,你一定很熟悉这种现象。)
大学生往往依靠父母的资助,还没有想过父母的钱是从哪里来的;继承人靠着他人遗产过活;教授与政客距离创造财富最远,不管是否努力工作,得到的报酬都差不多,新闻记者部分由于他们的专业守则,必须与本行业产生收入的那部分——广告销售部——保持隔离。所有这些人中,有许多人从来没有直面过这个事实,那就是他们拿到手的金钱,都来自别人先前创造出来的财富(新闻记者除外,他们的工作是创造财富的,但是不直接用财富交换金钱)。在这些人的世界中,收入是由某个外部权威根据某种看似公平的抽象原则(对于继承人来说则是随机原则)进行分配,不是来自与他人交换别人需要的东西。所以,在这些人看来,真实世界的其他部分不采用同样的分配方式就是不公平的事情。
(某些教授确实为社会创造了大量财富,但是他们拿到的工资却不是对此的回报,更像是对他们的投资。)」
孩子没有能力创造财富,他们享有的一切都来自别人无偿的给予。既然得到财富不要求对应的付出,那么它当然应该平均分配^。大多数家庭都是这样,如果兄弟姐姝中有人多得到了一份,其他孩子就会喊:“不公平!”
^「如果你了解英国社会主义团体“费边社”(Fabian Society)的起源,你会觉得他们的想法好像是英王爱德华时代(1901~1910)的儿童读物《淘气鬼行善记》(The Wouldbegoods,作者Edith Nesbit)的小主人公想出来的,虽然看上去很无私高尚,但实际上非常天真幼稚。」
进入社会以后,你不能总是靠父母养活。如果你需要什么东西,要么你自己做出来,要么做其他东西与需要的人交换金钱,再用金钱去买你想要的东西。在真实世界中,财富是你必须自己创造出来的东西(小偷和投机者除外),而不是等着老爹买给你。由于每个人创造财富的能力和欲望强烈程度都不一样,所以每个人创造财富的数量很不平等。
你做别人需要的东西或事情,然后得到报酬。有些人报酬较高,原因很简单,因为他们做得更好。大明星要比普通演员多赚许多钱,普通演员可能也有大明星的实力,但是人们在电影院选择看什么电影时总是被大明星吸引过去。
当然,做出人们需要的东西并不是赚钱的唯一方法。抢银行、索贿、垄断市场也能搞到钱,并且是某些富豪最大的财富来源,但是这些手段不能代表财富的全部,更不是贫富分化的主要原因。每个人的技能不同,导致收入不同,这才是贫富分化的主要原因,正如逻辑学的“奥卡姆剃刀”原则所说,简单的解释就是最好的解释。
在美国,一些大型上市公司的CEO的收入大概是普通人的100倍^。职业棒球选手的年收入是普通人的72倍,职业篮球选手的年收入则是普通人的128倍。报纸的社论用恐怖的语调引用这样的统计数据。但是我觉得,想象一个人的产出是另一个人的100倍是一件毫无困难的事情。在古罗马时代,根据奴隶的技能不同,他们的价格会相差50倍^^。上述收入差距还没有考虑激励因素或者现代科技带给你的生产力放大效应。
^「根据Corporate Library的一项研究,2002年标准普尔500公司中,CEO总收入的中位数是365万美元(包括薪水、奖金、奖励的股票、执行后的股票期权)。根据《体育画报》的统计,2002至2003赛季NBA篮球选手的平均薪水是454万美元,2003赛季大联盟棒球选手的平均薪水是256万美元。根据劳工统计局的数据,2002年美国人的平均工资是35560美元。」
^^「在古罗马帝国的早期,一个普通成年男性奴隶的价格大约是2000赛斯特斯银币(参见Horace,Sat.ii.7.43),一个女仆的价格是600银币(参见Martial vi.66),而一个熟练园丁的价格是8000银币(参见Columella iii.3.8〉。一位医生(P.Decimus Eros Merula)为了换取他的自由,付出了5万银币(参见Dessau,Inscriptiones 7812)。一位诗人(Calvisius Sabinus)出了10万银币购买懂得希腊文学的奴隶(参见Seneca,Ep.xxvii.7)。普林尼报告,在他的时代,奴隶的最高价格是70万银币,这位奴隶是语言学家(可能也是教师)Daphnis(参见Pliny,Hist.Nat.vii.39),但是这个价格后来被赎买自由的演员奴隶超越了。古希腊也出现了类似的价格分化。一个普通劳工的价格大约是125到150德拉克马银币,但是价格波动范围从50到6000银币(能够管理银矿的劳工)不等(参见Xeaophon Mern.ii.5)。更多关于古代奴隶制的经济学研究参见Jones A.H.M.所著的“Slavery in the Ancient World”一文,发表于1956年的杂志的第185~199页。」
确实有一些CEO的收入太高,不合理,但是有没有CEO的收入不足以体现他所创造的财富的呢?乔布斯就是这样的例子。他拯救了濒临崩溃的苹果公司,扭转了危机,削减了成本,成功决策了下一代产品,很少有人能做到这些事情。他的收入就低于他的工作所创造的价值。如果我们不考虑CEO的例子,只说职业篮球运动员的收入,那么应该不会有太大争论,大家都会同意,篮球运动员的身价反映了市场供需状况,并没有不合理的地方。
第一眼看上去,你可能会觉得难以接受,人与人之间创造财富能力的差别真的会这么巨大吗?理解这一点的关键就在于重新思考我们上面提过的那个问题,他一个人的价值真的等于我们100个人的价值吗?你想一想,一个篮球队会同意用一个运动员交换100个普通人吗?如果苹果公司不是由乔布斯掌管,而是由一个100人组成的委员会掌管,那么这家公司的下一代产品会是什么样^?人与人之间的差别并不是那么稳定的线性关系。也许CEO和运动员的技能和决心只比普通人高出10倍(倍数不重要),但是人与人之间就是存在着重大差别。
^「我来告诉你这两个问题的答案。篮球队不会同意用运动员交换普通人,而苹果公司推出的产品就是Windows那个样。」
当我们说一些工作报酬过高,另一些工作报酬过低,我们的真实想法到底是什么?在自由竞争的市场经济中,价格由买家的需求决定。如果人们喜欢棒球甚于喜欢诗歌,那么棒球运动员的收入就是要比诗人的收入高。如果说某种工作的报酬过低,那就相当于说人们的需求不正确。当然,人们确实会需求不正确的东西。这有什么好奇怪的呢?你不觉得声称某种工作报酬过低的说法更奇怪吗^?如果你觉得由于人们的需求不正确,导致某些工作的报酬过低而且不公平,那么这个世界一定会让你感到非常遗憾,人们就是喜欢看电视真人秀,而不是莎士比亚作品,人们就是喜欢吃玉米热狗,而不是水煮蔬菜,这是不是很不公平呀?要是你觉得不公平的话,那你就同把蓝颜色说成最漂亮的颜色、把方的说成圆的那样蛮不讲理。
^「我们把由父母供给收入的模式称为“老爹模式”。这个模式与真实世界的最大区别之一就是对勤奋工作的评价不同。在老爹模式中,勤奋工作本身就是值得的,老爹会感到很高兴。但是在现实中,财富是用工作成果衡量的,而不是用它花费的成本衡量的。如果我用牙刷油漆房屋,屋主也不会付给我额外工资的。
所以,对于那些仍然处于“老爹模式”的人来说,看到有人勤奋工作却没有得到很多报酬就会感到不公平。为了破除这种迷思,让我们假设有一个工人,他单独一人在荒岛上打猎和采集水果。如果他的能力不足,就常勤奋地工作,最后也不会得到很多食物。这是不公平吗?又是谁对他不公平呢?」
“不公平”这三个字就是“老爹模式”的独门标志。为什么别的情况下人们不会想到这三个字?因为要是你现在还处于“老爹模式”,认为财富就是从某个口子流出来、被大家分享的东西,而不是来源于满足他人的需求的创造活动,那么当你注意到有些人赚钱比其他人多得多时,你就会不偏不倚地得出“不公平”这个结论。
当我们讨论“收入分配不公平”时,我们还要问问收入从何而来,收入背后的财富到底是谁生产出来的^。如果收入完全根据个人创造的财富数量而分配,那么结果可能是不平均的,但是很难说是不公平的。
^「有那么多人相信“老爹模式”,部分原因是“分配”(distribution)这个词有双重含义。经济学家谈论“收入分配”(distribution of income)时,他们实际上指的是统计学上的收入分布。但是,如果你经常使用这个词,你会情不自禁将它与另一个意思联系起来(比如救济金的分配),因此下意识地就把财富看作从某个大水源流出来的东西。税收上,有一种税叫做“递减税”(regressive tax),其中“递减”(regressive)这个词也有类似的效果,至少我就是这样认为,一件东西是“递减”的,那么它怎么可能是好的呢?」
偷窃
很多人对贫富分化不满意的第二个原因就是,在大部分的人类历史中,积累财富最常见的方法其实是偷窃。游牧社会是偷别人的牲口,农业社会是征税(和平时期)和直接掠夺(战争时期)。
在战争中,胜利的一方将失败的一方的财产全部占为己有。1060年,征服者威廉占领英格兰,将当地贵族的财产全部分给他的随从,这是战争导致财富分配变化的一个例子。1530年,亨利八世将修道院的财产分给大臣^,这是政治斗争导致财富分配变化的一个例子。不管是战争还是政治斗争,本质上都属于偷窃。
一且通过创造财富而使致富成为可能,社会从整体上就会快速地变得更富有。中世纪人们所需要的一切东西几乎都是由中产阶级生产出来的。工业革命后,其他两个阶级实际上消失了,他们的名称被用来指中产阶级的两端。(根据原始定义,比尔·盖茨不是富豪阶层,而是中产阶级。)
但是,创造财富真正取代掠夺和贪污成为致富的最佳方式,并不是发生在中世纪,而是发生在工业革命时代。至少在英国,当更快的致富方式出现后,贪污才逐渐不流行了(事实上,贪污从那时开始才被叫做“堕落”^)。
^「“贪污”和“堕落”在英语中是同一个词:corruption。——译者注」
17世纪的英国很像今天的第三世界,当官是公认的发财职业。那个年代要赚大钱仍然主要通过贪污,而不是经商^。到了19世纪,情况就变了,虽然存在大量贪污受贿(今天依然如此),但是政府遂渐被一些将良心和名誉看得比金钱更重要的人所控制。技术的发展使得通过创造而积累财富的速度第一次有可能超过通过偷窃而积累财富的速度。19世纪典型的富人不是宫廷朝臣,而是实业家。
^「16世纪的英国,权力最大的大臣分别是William Cecil和他儿子Robert Cecil。两人都利用职权获取了大财富,成为当时最富有的人。Robert Cecil收受贿赂都到了叛国的地步。“身为国务卿和詹姆斯一世主要的外交政策顾问,他收受了很多好处。荷兰人向他大量行贿,要求英国不要与西班牙媾和,而西班牙人也向他大量行賄,要求英国与其签订和约。”」
中产阶级的出现使得财富总量不再是一个固定不变的值,财富的分配也不再是一种零和游戏。苹果公司的两个创始人乔布斯和沃兹尼亚克没有使得他人变得更贫穷就赚到了钱。事实上,他们创造出来的东西使得人类的物质生活变得更富有。他们只能这样做,否则不会有人付钱给他们的。
即使情况已经发生变化,但是由于人类历史上主要的致富方式长期以来都是偷窃,所以我们依然对有钱人抱有一种怀疑态度。理想主义的大学生从小受到历史上知名作家的影响,长大后不知不觉保留了孩提时对财富的看法。这是一个双重误解的例子,就是对一个已经过时的情况持有错误的看法。
技术的杠杆效应
技术的发展是否加剧了贫富分化?首先,技术肯定加剧了有技术者与无技术者之间的生产效率差异,毕竟这就是技术进步的目的。一个勤劳的农民使用拖拉机比使用马可以多耕六倍的田。但是,前提条件是他必须掌握如何使用新技术。
技术无法使其变得更便宜的唯一东西,就是品牌。这正是为什么我们现在越来越多地听到品牌的原因。富人与穷人之间生活差异的鸿沟正在缩小,品牌是这种差距的遗留物。但是,品牌只是商品的标签,即使买不起名牌,至少你还可以买普通牌子,这总比根本无法消费这一种商品要好得多。1900年,只要你有一辆马车,你就是富人,根本没人问你马车的牌子。没有马车的人就是穷人,只能挤公共交通或者步行。今天,即使最穷的美国人也有自己的汽车,那么厂商只好通过广告训练我们识别品牌,以便我们能够识别哪些汽车特别昂贵^。
^「产于1989年、保存状况良好的林肯牌加长型礼车,现价大约是5000美元。产于2004年的奔驰S600轿车的价格是12.2万美元。如果要一个生活在20世纪初的普通人分辨哪一辆车价格更贵,他大概会猜错。」
这种变化模式不断在一个又一个的行业重现。只要存在对某种商品的需求,技术就会发挥作用,将这种商品的价格变得很低,从而可以大量销售^。一旦产品能够流水线生产,即使质量没有改进,至少也会更便于使用。富人最喜欢的就是那些方便易用的产品。我认识的富人朋友,与其他朋友相比,开着同样的车,穿着同样的衣服,使用同样的家具,吃着同样的食品。虽然他们的房子是在不一样的地方,或者即使与普通人在同一个社区,面积也要大得多,但是他们的生活确实与普通人是一样的。房子的建造方法也是一样,屋里的东西也基本接近。拥有定制的昂贵商品反而不方便。
^「如果想要真正地对收入加以考察,你必须使用“真实收入”的概念(以购买力衡量的收入),而不是使用“名义收入”的概念(以货币衡量的收入)。但是,计算“真实收入”的常用方法忽略了大部分随着时间增长的财富,因为“真实收入”要用消费者物价指数才能算出来,但是消费者物价指数是根据一系列祥本商品的价格计算的,本身就不具有全面的精确性,而且新发明产品的价格没有计算在内。(只有当新发明产品成为价格稳定的常用物品后,才会计算在内。)
所以,就算我们认定有了抗生素、飞机旅行、电力系统以后,人类的生活大大改善,真实收入的计算方法却说我们的生活只有轻微的改善。
衡量收入变化的另一种方法就是,问如果你乘坐时间机器回到过去,你需要花多少钱购买同样的东西。举例来说,假定你回到1970年,你会发现今天价格不到500美元的CPU处理能力在那时至少价值1.5亿美元。这种价格的衰变随着时间流逝很快就会接近于零,因为一百年后,你今天需要的所有东西后人都不会想要。相反,如果你把今天可乐饮料的宝特瓶拿回到1800年,它会被认为是精美的工艺品。」
富人日常做的事情也和普通人差不多。无所事事的闲适生活早就成为罕见情况了。如今,确实有很多人非常有钱,完全不必再去工作,他们之所以还在工作,不是因为感到社会压力,而是因为无所事事使人感到孤独和消沉。
今天的社会身份(social distinction)差异也要比100年前来得小。
那时的小说和讲解礼仪的手册在今天读起来好像是在说陌生的部落社会。Beeton夫人出版于1880年的《家务手册》(Book of Household Management)这样写道:“至于说到朋友之间的友谊……在某些情况下,为了承担家庭生活的责任,女主人可能必须放弃一些她早年认识的朋友。”一个女人嫁给了有钱人,就被认为应该放弃那些没钱的朋友。要是你今天这样做的话,别人会觉得你的行为很野蛮,而且你也会让自己过上一种乏味无趣的生活。今天的人们多多少少还是有一些互相隔离的趋势,但主要是因为教育层次的差别,而不是财富的差别^。
^「有人会说,教育程度的差别与财富的差别是一回事,因为富人得到高等教育的机会更大。这个论点是成立的、某种程度上可以做到用钱把孩子送进顶尖的大学。你只要把孩子送进昂贵的私立学校,就等于敲开了大学的门。
根据2002年美国国家教育统计中心的一份报告,大约1.7%的美国儿童就读于私立的非教会学校,而普林斯顿大学2007级新生中,大约有36%的人来自于这样的学校。(有趣的是,哈佛大学的这个比例要低不少,只有大约28%。)很显然,这是教育制度的一个大漏洞,但是它正在缩小,而不是扩大。
也许,大学入学申请制度的设计者应该参考计算机安全行业的做法,不要假设你的系统毫无漏洞,而是搞清楚多大程度上漏洞无法被利用。」
无论在物质上,还是在社会地位上,技术好像都缩小了富人与穷人之间的差距,而不是让这种差距扩大了。如果参观雅虎、英特尔、思科的办公室,会看到每个人都穿着差不多的衣服,有着同样的办公室(或者小隔间)、同样的家具,彼此直呼对方的名字,不加任何头衔或敬语。表面看大家没什么差距,但如果看到每个人银行户头上的余额差别如此之大,一定会感到震惊不已。
技术的发展加大了贫富差距,这是不是一个社会问题?好像没有那么严重。技术在加大收入差距的同时,缩小了大部分的其他差距。
公理的不同意见
你经常可以听到有人批评某种政策会加剧贫富分化。隐藏的意思就是,贫富分化的加剧一定是坏事,这好像已经成了公理。收入差距的扩大可能确实不好,可是我不觉得这可以被看成公理。
我想提出一种相反的观点:现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大,如果这种扩大没有反映在收入上面,只有三种可能的解释:(a)技术革新停顿了;(b)那些创造大部分财富的人停止工作了;(c)创造财富的人没有获得报酬。
如果你想让社会保持繁荣,同时收入差距不扩大,那么就只剩下(c)这一种可能了,即创造大量财富的人不获取报酬。举例来说,苹果公司的两位创始人将欢欣鼓舞地每天工作20个小时,为社会提供苹果电脑,然后只领取一份相当于大公司里朝九晚五的上班族领取的税后工资。
如果得不到报酬,人们是否愿意创造财富?唯一的可能就是,工作必须能提供乐趣。会有人愿意免费写一个操作系统,但是他们不愿意免费为你安装、提供电话支持、进行客户培训等。即使是最先进的高科技公司,也有至少90%的工作没有乐趣、令人生厌。
在一个剥夺个人财产的社会,财富创造活动中所有那些没有乐趣的事情都会急剧地放慢,乃至停顿。对历史进行实证检验,我们就可以得出这个结论。
社会的变化涉及很多因素,并不仅仅是由于创造财富的原因。有很多因素发挥作用。如果研究对象只是一台电扇,那么不用考虑太多别的因素就能断定噪音是由电扇发出的,但是研究财富问题就没有这么简单了,必须要考虑很多别的因素。
但是,只要你压制收入差距的扩大,不管是用偷窃私人财产的做法(封建社会),还是用高额税收的做法(某些现代政府),最终结果看来都是一样的,那就是社会作为一个整体变得更贫穷了。
如果我可以做选择,到底是生活在一个整体上非常富裕但是我个人相对贫穷的社会,还是生活在一个我个人相对非常富裕但是整体上非常贫穷的社会呢?我会选择第一个选项。如果我有小孩的话,可能哪一个选项更好还值得争论。但是,总的来说,你要避免的是绝对贫穷,而不是相对贫穷。如果必须在这两种社会之间做选择,根据目前的证据,我选择个人相对贫穷、但是整体上更富裕的社会。
一个社会需要有富人,这主要不是因为你需要富人的支出创造就业机会,而是因为他们在致富过程做出的事情。我在这里谈的不是财富从富人流向穷人的那种扩散效应(trickle-down effect),也不是说如果你让亨利·福特致富,他就会在下一场宴会雇用你当服务员,而是说如果你让他致富,他就会造出一台拖拉机,使你不再需要使用马匹耕田了。
概述
与下棋、画画、写小说一样,赚钱也是一种专门的技能。
收入差距拉大实际上是一种健康的信号。
人们误解财富,把财富与钱混为一谈。他们认为财富的总量是不变的,某个权威负责分配财富(所以理应平均分配),没有意识到财富是创造出来的(而且创造得不太均等)。
如果你想要更多的财富,自己生产就可以了。
为什么财富的分配问题引起这么多争论?部分原因是反对声最大的人当中,很多人都少有创造财富的经验:大学生、继承人、教授、政客、新闻记者。由于每个人创造财富的能力和欲望强烈程度都不一样,所以每个人创造财富的数量很不平等。
一些大型上市公司的 CEO 的收入大概是普通人的100倍。在古罗马时代,根据奴隶的技能不同,他们的价格会相差50倍。收入完全根据个人创造的财富数量而分配,那么结果可能是不平均的,但是很难说是不公平的。
富人最喜欢的就是那些方便易用的产品。他们与其他人相比,开着同样的车,穿着同样的衣服,使用同样的家具,吃着同样的食品。技术在加大收入差距的同时,缩小了大部分的其他差距。表面上看大家没什么差距,差距是在所住的房子、社区和银行户头上的余额。
8 防止垃圾邮件的一种方法:不久前,许多专家还认为无法有效地过滤垃圾邮件。本文改变了他们的想法。
原文
在所有对抗垃圾邮件的方法之中(从软件方法到法律方法),我认为单独来看,“贝叶斯过滤”是最有效的工具。但是,我也认为,我们使用的不同方法越多,综合效果就越好,因为任何对发送人构成限制的方法往往都会使得过滤器工作起来更顺利。即使同样是基于内容的过滤器,我也认为,如果有多种不同的软件可以同时使用会比较好。过滤器的差异越大,垃圾邮件想要逃过拦截就越不可能。
概述
贝叶斯过滤
9 设计者的品味:如何做出优秀的东西?
原文
最近,我与一个在MIT教书的朋友交谈。他的研究领域很热门,每年申请他的研究生的人多得让他应付不过来。“很多人看上去很聪明,”他说,“但是我不知道他们的品味如何。”
品味。如今很少听到这个词了,人们往往使用别的叫法,伹它却的的确确是我们离不开的基本槪念。我的朋友的意思是,他想要的学生不仅应该技术过硬,还应当能够使用技术做出优美的产品。
数学家会把出色的工作称赞为“优美的”。无论古今,科学家、工程师、音乐家、建筑师、设计师、作家、画家都是这样做的,他们都使用同一个词。这仅仅是巧合吗,还是他们之间有共识?如果真的有共识,那么我们能不能将某一个领域发现的“美”的规律运用于另一个领域呢?
对于我们设计师来说,美就不仅仅是一个理论问题了。如果世界上真有“美”存在,我们需要能够认出它。设计产品时,我们需要良好的品味。与其把“美”说成一个虚无缥缈的抽象概念,还不如让我们考虑一个实际的问题(这样就能避免喋喋不休的空谈):如何才能做出优美的产品?
……
把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。但是问题是,这种说法是不正确的。只要你自己开始动手设计东西,就能明白这一点。
不管每个人的工作是什么,他们内心里都有一种愿望——把自己的工作做好。足球运动员想羸得比赛,CEO想增加利润。做好自己的工作会真正令人感到自豪和偷快。但是,如果你是一个设计师,并且你不承认有一种人们共同认可的东西叫做“美”,那么你就没有办法做好工作。如果品味只是一种个人偏好,那么每个人都是完美无缺的:你喜欢自己看上的东西,那就足够了。
就像别的工作一样,只要你不断地从事设计工作,你就会做得越来越好。你的品味会出现变化,你会像别人一样有所提高。如果这样的话,那么你以前的品味就不只是与现在不同,而是不如现在的好。因此,所谓的“品味没有好坏之分”的公理也就顿时见鬼去了。
现在流行“相对主义”,即认为真理是相对的。即使你已经从小孩变成了成年人,这种观点依然可能妨碍你思考“品味”。但是,只要你走出狭隘的自我,至少在心里对自己说,确实存在比其他设计更好的杰出设计,那么你就能开始仔细研究了。你的品味是如何变化的?什么原因使你做出不好的设计?其他人对设计是什么观点?
只要你开始思考这些问题,你就会发现,众多不同学科对“美”的认识有着惊人的相似度。优秀设计的原则是许多学科的共同原则,一再反复地出现。
好设计是简单的设计。 从数学领域到绘画领域,你都可以听到这种说法。在数学中,它表示简短的证明往往是更好的证明。特别是对于数学公理来说,少即是多。在编程中,这种说法也基本适用。对于建筑师和设计者,它意味着美依赖于一些精心选择的结构性元素,而不依赖于表面装饰品的堆砌。(装饰品本身并不是坏事,只有当它被用来掩盖结构的苍白时,才变成了一件坏事。)绘画也是类似的,认真观察的、非常有代表性的静物作品往往要比表面极尽华美、但是实质上只是无意义重复的“巨作”(比如再现非常复杂的花边的绘画作品)更有价值。在写作上,这种说法意味着只说必须要说的话,并且说得简短。
这样强调简单似乎有点奇怪。有人会说,简单就是事物本来的样子,装饰反而意味着更多的工作。但是,当人们自己从事创造性工作的时候,好像就会忘了保持简单这个原则。刚开始写作的人喜欢用浮夸的语调,根本不像他们平时说话的样子。设计师喜欢用波浪式卷曲表现他们的艺术感。画家发现自己都是表现主义者(expressionist)。这些装饰都是花架子,在作家的长句、画家“表现主义”的画笔之下,根本就是空洞无物,表面的装饰掩盖了内部的空虚,太可怕了。
当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。
好设计是永不过时的设计。 只要没有错误,每一个数学证明都是永不过时的。所以,数学家哈代才会说:“丑陋的数学在世界上无法生存。”他的意思与飞机设计师凯利·约翰逊的观点是一样的:如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现而已。
以永不过时作为目标是一种帮助自己找到最佳答案的方法:如果你不愿别人的答案取代你的答案,你就只好自己做出最佳答案。
好设计是解决主要问题的设计。
好设计是启发性的设计。
好设计通常是有点趣味性的设计。
好的设计并非一定要有趣,但是很难想象完全无趣的设计会是好的设计。
好设计是艰苦的设计。 如果观察那些做出伟大作品的人,你会发现他们的共同点就是工作得非常艰苦。如果你工作得不艰苦,你可能正在浪费时间。
困难的问题需要艰巨的付出才能解决,高难度的数学证明需要结构非常精细的解决方法(它们往往做起来很有趣),工程学也是如此。
好设计是看似容易的设计。 优秀运动员比赛时,让人觉得他轻轻松松就获胜了,优秀设计师也是如此,他们的工作看上去很容易。大多数时候,这是一种错觉。作家的文章读起来流畅自如,但是背后其实经过了反复修改。
科学和工程学的一些最重大的发现在形式上往往很简单,会使得你觉得自己也想到过。可是,如果它真的那么简单,为什么发现人不是你呢?
在大多数领域,看上去容易的事情,背后都需要大量的练习。练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为。有时,我们的训练只是为了让身体养成下意识的反应。优秀钢琴家弹奏名曲可以不经过大脑直接完成,艺术家也是这样,熟练以后,脑海中的艺术形象会自动从手上流淌出来,仿佛有人在一旁为他打节奏一样。
人们有时会说自己有了“状态”,我的理解是,他们这时可以控制自己的脊髓。脊髓是更本能的反应,面对难题时,它能释放你的直觉。
好设计是对称的设计。 对称也许只是简洁性的一种表现,但是它十分重要,值得单独列为一点。自然界的对称大量存在,这就说明了对称的重要性。
对称有两种:重复性对称和递归性对称。递归性对称就是指子元素的重复,比如树叶上叶脉的纹路。
对称的危险在于它可以用来取代思考,在大量使用重复的时候这种危险性更大。
好设计是模仿大自然的设计。 我不是说模仿大自然这种行为本身有多么好,而是说大自然在长期的演化中已经解决了很多设计问题。所以,如果你的设计与大自然很接近,那么它基本上不会很差。
模仿与剽窃并不相同。如果一部小说写得好像真实生活的再现,没人会提出异议。虽然写实的价值常常被误解,但它也是绘画的一个重要工具。写实的目的不是为了给生活留下一模一样的记录,而是为你的思想提供一个咀嚼点:你的眼睛看着某样东西,你的手就代表你的思想, 画出一些比较有意思的内容。
模仿大自然也是工程学的有效方法。
好设计是一种再设计。 很少有人一次就把事情做对。专家的做法是先完成一个早期原型,然后提出修改计划,最后把早期原型扔掉。
扔掉早期原型是需要信心的,你必须有本事看出什么地方还可以改进。举例来说,刚刚开始学画的人往往不愿意重画画错的地方。他们觉得能画成现在这样已经很不错了,如果重画某些部分,结果可能还不如现在。所以,他们就说服自己,我的画已经过得去了,没准别人也会这么看。
好设计是能够复制的设计。 我们对待复制的态度经常是一个否定之否定的过程。刚入门的新手不知不觉地模仿他人,遂渐熟练之后才开始创作原创性作品。最后他会意识到,把事情做对比原创更重要。
我在前文提到的好设计的大多数特点都是可以培育出来的,但是我觉得“奇特”这个特点是无法培育的。你最多就是在它开始显现时不要把它扼杀掉。爱因斯坦并不想让相对论变得很奇特,他只想找出真理,是真理本身显得很奇特。
好设计是成批出现的。
推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达·芬奇之所以成为达·芬奇,主要原因不仅仅是他的天赋,更重要的是他生活在当时的佛罗伦萨,而不是米兰。今天,人类生活的流动性高得多,但是伟大的项目依然不成比例地集中在少数几个热点上:德国包豪斯建筑学院、曼哈顿计划、《纽约人》杂志、洛克希德公司的臭鼬工作室、施乐公司的帕洛阿尔托研究中心。
在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果。某种程度上,你个人最多可以对趋势产生一定的影响,但是你不可能决定趋势,实际上是趋势决定了你。(或许有人办得到,但是米兰的达·芬奇显然没有办到。)
好设计常常是大胆的设计。 在任何一段历史中,人们都会把某些荒谬的东西当作正确的,并且深信不疑,以至于一旦你出言质疑,就有被排挤或者被暴力伤害的危险。
我们自己的这个时代要是不同以往,当然令人欢欣鼓舞。伹是就我所知,它并没有任何不同。
单单是无法容忍丑陋的东西还不够,只有对这个领域非常熟悉,你才可能发现哪些地方可以动手改进。你必须锻炼自己。只有在成为某个领域的专家之后,你才会听到心里有一个细微的声音说:“这样解决太糟糕了!一定有更好的选择。”不要忽视这种声音,要培育它们。优秀作品的秘块就是:非常严格的品味,再加上实现这种品味的能力。
概述
推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要。
单单是无法容忍丑陋的东西还不够,只有对这么领域非常熟悉,你才能发现哪些地方可以动手改进。你必须锻炼自己。只有在成为某个领域的专家之后,你才能听到心里又一个细微的声音说:“这样解决太糟糕了!一定有更好的选择。”不要忽视这种声音,要培育它们。优秀作品的秘诀就是:非常严格的品位,再加上实现这种品位的能力。
10 编程语言解析:什么是编程语言?为什么它们现在很热门?
原文
开放源码的拥护者常常被看作反对知识产权的怪人。其中有些人确实如此,但是我本人肯定不反对知识产权。只是如果你要我安装没有源码的软件,我会非常犹豫。普通的消费者也许不需要看到他们使用的文字处理器的源码,但是在非常强调软件可靠的情况下,出于强烈的工程需求的考虑,会要求开放源码。
一些黑客只喜欢自己用的语言,反感其他所有的语言。另一些黑客则说所有的语言都一样。事实介于这两个极端之间。语言之间确实有差别,但是很难确定地说明哪—种语言是最好的。这个领域依然还在快速发展。
语言设计者之间的最大分歧也许就在于,有些人认为编程语言应该防止程序员干蠢事,另一些人则认为程序员应该可以用编程语言干一切他们想干的事。Java语言是前一个阵营的代表,perl语言则是后一个阵营的代表。(美国国防部很看中Java也就不足为奇了。)
自由语言派的信徒嘲笑另一方是“B&D”(奴役和戒律,Bondage and Discipline)语言,很无礼地暗示用那些语言编程的人是下等人。我不知道对方如何反击这些喜欢Perl的自由派,也许他们不喜欢给别人起绰号,因此我就无从知道。
由于防止程序员做蠢事有好几种方法,所以上面的争论逐渐分化成几个较小的议题。目前最活跃的议题之一就是静态类型语言与动态类型语言之争。在静态类型语言中,写代码时必须知道每个变量的类型。而在动态类型语言中,随便什么时候,你都可以把变量设为任意类型的值。
静态类型语言的拥护者认为这样可以防止bug,并且帮助编译器生成更快的代码(这两点理由都成立)。动态类型语言的拥护者认为静态类型对程序构成了限制(这点理由也成立)。我本人更喜欢动态类型,痛恨那些限制我的自由的语言。但是,确实有一些很聪明的人看来喜欢用静态类型语言。所以,这个问题依然值得讨论,并没有固定答案。
关于面向对象编程优劣的争论并不像静态类型与动态类型之争那样壁垒分明,因为编程的时候你只能在静态类型和动态类型之中选一种。但是,面向对象编程只是程度不同的问题。事实上有两种程度的面向对象编程:某些语言允许你以这种风格编程,另一些语言则强迫你一定要这样编程。
我觉得后一类语言不可取。允许你做某事的语言肯定不差于强迫你做某事的语言。所以,至少在这方面我们可以得到明确的结论:你应该使用允许你面向对象编程的语言。至于你最后到底用不用则是另外一个问题了。
概述
浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计。
编程所有东西都在变成软件。印刷机诞生后,人类写过多少个字,未来就有多少家软件公司。
未来人类生活不仅是人与人的互动,更多的将是人与计算机的互动。要把握这个时代,就必须理解计算机。理解计算机的关键,则是要理解计算机背后的人。表面上这是一个机器的时代,但是实际上机器的设计者决定了我们的时代。
我们的时代是程序员主导的时代。编程是一种艺术创作,黑客就是艺术家,开发软件和画家作画、雕塑家雕刻、建筑师设计房屋并没有本质不同。
如果你想了解当今的技术发展,就必须懂一点编程语言。这就好比回到1880年,如果你想理解技术发展,就必须懂一点蒸汽机。计算机程序只是文本而已。你选择什么语言,决定了你能说什么话。编程语言就是程序员的思维方式。
11 一百年后的编程语言:一百年后,人类怎样编程?为什么不从现在开始就这样编程呢?
原文
对于语言设计者来说,认清编程语言的进化路径特别有用,因为这样就可以照着样子设计语言了。这时,认清进化的主干就不仅有助于识别现存的优秀语言,还可以把它当作设计语言的指南。
任何一种编程语言都可以分成两大组成部分:基本运算符的集合(扮演公理的角色)以及除运算符以外的其他部分(原则上,这个部分可以用基本运算符表达出来)。
我认为,基本运算符是一种语言能否长期存在的最重要因素。其他因素都不是决定性的。这有点像买房子的时候你应该先考虑地理位置。别的地方将来出问题都有办法弥补,但是地理位置是没法变的。
慎重选择公理还不够,还必须控制它的规模。数学家总是觉得公理越少越好,我觉得他们说到了点子上。
你仔细审视一种语言的内核,考虑哪些部分可以被摒弃,这至少也是一种很有用的训练。在长期的职业生涯中,我发现冗余的代码会导致更多冗余的代码,不仅软件如此,而且像我这样性格懒散的人,我发现在床底下和房间的角落里这个命题也成立,一件垃圾会产生更多的垃圾。
我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。
当然,猜测一百年后人们使用什么编程语言,这本身就是一个很大的假设。也许一百年后人类已经不编程了,或者直接告诉计算机想做什么,计算机就会自动完成。
不过,到目前为止,计算机智能并没有取得太大进展。我猜测一百年后,人们还是使用与现在差不多的程序指挥计算机。可能有一些我们今天需要编程解决的问题,那时已经不需要编程了,但是我想,那时还会存在大量与今天一样的编程任务。
你可能认为只有那些自以为是的人才会去预言一百年后的技术。但是,请不要忘记,软件发展的历史已经走过了50年。在这50年中,编程语言的进化其实是非常缓慢的,因此展望一百年后的语言并不是虚无缥缈的想法。
编程语言进化缓慢的原因在于它们并不是真正的技术。语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。所以,编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。数学符号的进化是缓慢的渐变式变化,而不是真正技术的那种跳跃式发展。
浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计。所以,问题就变成了如何才能充分利用新硬件更强大的性能最有利地“浪费”它们?
对速度的追求是人类内心深处根深蒂固的欲望。当你看着计算机这个小玩意,就会不由自主地希望程序运行得越快越好,真的要下一番功夫才能把这种欲望克制住。设计编程语言的时候,我们应该有意识地问自己,什么时候可以放弃一些性能,换来一点点便利性的提高。
很多数据结构存在的原因都与计算机的速度有关。比如,今天的许多语言都同时有字符串和列表。从语义上看,字符串或多或少可以理解成列表的一个子集,其中的每一个元素都是字符。那么,为什么还需要把字符串单列为一种数据类型呢?完全可以不这么做。只是为了提高效率,所以字符串才会存在。伹是,这种以加快运行速度为目的、却使得编程语言的语义大大复杂的行为,很不可取。编程语言设置字符串似乎就是一个过早优化的例子。
如果我们把一种语言的内核设想为一些基本公理的集合,那么仅仅为了提高效率就往内核添加多余的公理,却没有带来表达能力的提升,这肯定是一件很糟的事。没错,效率是很重要,但是我认为修改语言设计并不是提高效率的正确方法。
正确做法应该是将语言的语义与语言的实现予以分离。在语义上不需要同时存在列表和字符串,单单列表就够了。而在实现上做好编译器优化,使它在必要时把字符串作为连续字节的形式处理^。
^「我相信,Lisp Machine Lisp(Lisp语言的一种方言)是第一个具体表达这样一种观点的语言:变量的声明(除了动态类型变量之外)只是优化的建议,对一个正确程序本身的含义不构成影响。Common Lisp(Lisp语言的另一种方言)则好像第一个明确提出了这一点。」
对于大多数程序,速度不是最关键的因素,所以你通常不需要费心考虑这种硬件层面上的微观管理。随着计算机速度越来越快,这一点已经越发明显了。
语言设计时,对实现方式少作限制还会使得程序具备更大的灵活性。语言的规格发生变化不仅是无法避免的,也是合理的。通过编译器的处理,按照以前规格开发的软件就会照常运行,这就提供了灵活性。
essay(论文)这个词来自法语的动词essayer,意思是“试试看”。从这个原始意义来说,论文就是你写一篇文章,试着搞清楚某件事。软件也是如此。我觉得一些最好的软件就像论文一样,也就是说,当作者真正开始动手写这些软件的时候,他们其实不知道最后会写出什么结果。Lisp语言的黑客早就明白数据结构灵活性的价值。我们写程序的第一版时,往往会把所有事情都用列表的形式处理。所以,这些最初版本可能效率低下得惊人,你必须努力克制自己才能忍住不动手优化它们,这就好像吃牛排的时候必须努力克制自己才能不去想牛排是从哪里来的一样,至少对我来说是这样的。
一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率低下得惊人(至少按我们今天的眼光来看是如此)。他们会说,他们想要的就是很容易上手的编程语言。效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。
我觉得,放弃字符串类型已经是大家可以接受的想法了。Arc语言已经这样做了,看上去效果不错。以前用正则表达式很难描述的一些操作,现在用回归函数可以表达得很简单。
这种数据结构的扁平化趋势会怎么发展?我极其努力地设想各种可能,得到的结果甚至令我自己都吓了一跳。比如,数组会不会消失?毕竟数组只是散列表的一个子集,其特点就是数组的键全部都是整数向量。进一步说,散列表本身会不会被列表取代呢?
还有比这更惊人的预言。在逻辑上其实不需要对整数设置单独的表示法,因为可以把它们也看作列表,整数n可以用一个n元素的列表表示。这一样能完成数学运算,只是效率低得让人无法忍受。
编程语言会发展到放弃基本数据类型之一的整数这一步吗?我这样问并不是真的要你严肃思考这个问题,更多的是希望打开你对未来的思路。我只是提出一种假想的情况:如果一股不可抗拒的力量遇到了一个不可移动的物体,会发生什么事。具体就本文而言:一种效率低得不可想象的语言遇到了性能强大得不可想象的硬件,会发生什么事。我看不出放弃整数类型有什么不妥。未来相当漫长。如果我们想要减少语言内核中基本公理的数目,不妨把眼光放得远一点,想一想如果时间变量t趋向无限会怎么样。一百年是一个很好的参考指标,如果你觉得某个想法在一百年后仍然可能是难以令人接受,那么也许一千年后它也依然难以令人接受。
让我说清楚,我的意思不是说所有的整数运算都用列表来实现,而是说语言的内核(不涉及任何编译器的实现)可以这样定义。在现实中,任何进行数学运算的程序可能都是以二进制形式表示数字,但是这属于编译器的优化,而不属于语言内核语义的一部分。
另一种消耗硬件性能的方法就是,在应用软件与硬件之间设置很多的软件层。这也是我们已经看到的一种趋势,许多新兴的语言就被编译成字节码^。比尔·伍兹曾经对我说,根据经验判断,每增加一个解释层,软件的运行速度就会慢一个数量级。但是,多余的软件层可以让编程灵活起来。
^「字节码(byte code)是已经经过编译但是需要进一步处理才能变成机器码的中间代码。它的好处是与硬件和软件环境无关,在编译器的配合下,可以在不同的操作系统上运行。字节码的典型运用就是Java语言。——译者注」
Arc^语言最初的版本就是一个极端的例子,它的层很多,运行速度非常慢,但是确实带来了相应的好处。Arc是一个典型的“元循环”(meta circular)解释器,在Common Lisp的基础上开发,很像约翰·麦卡锡在他经典的Lisp论文中定义的eval函数。Arc解释器一共只有几百行代码,所以很便于理解和修改。我们采用的Commom Lisp版本是CLisp,它本身是在另一个字节码解释器的基础上开发的。所以,我们一共有两层解释器,最上面那层效率低下得惊人,但是语言本身是能用的。我承认只是勉强可用,但是确实能用。
^「Arc是Lisp的一种方言,由本书作者提出,目前由他本人和罗伯特·莫里斯负责开发。——译者注」
即使是应用程序,使用多层形式开发也是一种很强大的技巧。自下而上的编程方法意味着要把软件分成好几层,每一层都可以充当它上面那一层的开发语言。这种方法往往会产生更小、更灵活的程序。它也是通往软件圣杯——可重用性(reusability)——的最佳路线。从定义上看,语言就是可以重用的。在编程语言的帮助下,你的应用程序越是采用这种多层形式开发,它的可重用性就越好。
可重用性这个概念多多少少与20世纪80年代兴起的面向对象编程有些关联。不管怎样寻找证据,也不可能把这两件事完全分开。某些使用面向对象编程开发出来的软件确实具有可重用性,但是这不是因为它使用了面向对象编程,而是因为它的开发方法是自下而上的。以函数库为例,它们具有可重用性,是因为它们属于语言的一部分,而不是因为它们采用面向对象或者其他编程方法。
顺便说一句,我不认为面向对象编程将来会消亡。我觉得,除了某些特定的领域,这种编程方法其实没有为优秀程序员带来很多好处,但是它对大公司有不可抗拒的吸引力。面向对象编程使得你有办法对面条式代码进行可持续性开发。通过不断地打补丁,它让你将软件一步步做大。大公司总是倾向于采用这样的方式开发软件。我预计一百年后也是如此。
既然是谈论未来,最好谈谈并行计算(parallel computation),因为看上去并行计算好像就是为未来而存在的。无论怎么想,并行计算似乎都是未来生活的一部分。
它会在未来实现吗?过去二十年,人们都在说并行计算马上就会来临。但是,到目前为止,它对编程实践并没有太大影响。这是真的吗?芯片设计师已经不得不把它考虑在内,为多CPU计算机开发系统软件的程序员也是如此。
但是,真正的问题在于,并行计算到底能达到哪个抽象层次?一百年后它就会影响到开发应用软件的程序员吗?或者,它还只是编译器作者需要考虑的事情,在应用软件的代码中根本就无处寻觅?
一种可能是,大多数可以用到并行计算的场合,人们都会放弃使用并行计算。虽然我总的预测是未来的软件会挥霍掉大部分新增的硬件性能,但是并行计算是一个特例。我估计随着硬件性能得到惊人的提升,如果你明确地说想要并行计算,那么肯定可以得到它,但是通常情况下你不会用到它。这意味着,除了一些特殊的应用程序,一百年后的并行计算不会是那种大规模的并行计算(massive parallelism)。我预料,对于普通程序员来说,一切更像对进程进行分叉,然后让多个进程在后台并行运行。
这是编程进行到很后期才要做的事情,属于对程序的优化,类似于你想开发一种特定的数据结构来取代现有的数据结构。程序的第一个版本通常会忽略并行计算提供的各种好处,就好像编程开始时会忽略某种特定的数据结构给你带来的好处一样。
除了某些特定的应用软件,一百年后,并行计算不会很流行。如果应用软件真的大量使用并行计算,这就属于过早优化了。
一百年后会有多少种编程语言?从最近来看,出现了大量的新语言。硬件性能提高是一个原因,这就允许程序员根据使用目的在运行速度和编程便利性之间做出不同的取舍。如果这就是未来的趋势,那么一百年后强大的硬件只会使得语言数目变得更多。
伹是,另一方面,一百年后的常用语言可能只有很少几种。部分原因是基于我的乐观主义,我相信在未来,如果你的作品确实很出色,你可能选择的是一种开发起来很方便的语言。使用这种语言写出来的软件第一版的运行速度很慢,只有对编译器进行优化设置后运行速度才会提升。既然我抱有这种乐观主义,那么我还要做一个预言。有些语言可以达到机器的最高效率,另一些语言的效率则慢到刚刚可以运行而已,两者之间存在巨大的差距。我预言一百年后,这段差距之间的各个点上都会有对应的编程语言存在。
因为这段差距正在变得越来越大,所以性能分析器(profiler)将变得越来越重要。目前,性能分析并没有受到重视。许多人好像仍然相信,程序运行速度提升的关键在于开发出能够生成更快速代码的编译器。代码效率与机器性能的差距正在不断加大,我们将会越来越清楚地看到,应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发。
我说将来可能只有很少几种常用语言,但没有把用于特定领域的“小众语言”(little language)算进去。我觉得,这些嵌入式语言的想法很不错,一定会蓬勃发展。但是我判断这些“小众语言”会被设计成相当薄的一层,使得用户可以一眼看出在底下作为基础的通用型语言,这样就减少了学习时间,降低了使用成本。
谁来设计这些未来的语言?过去10年最激动人心的趋势之一就是开源语言的崛起,比如Perl、Python和Ruby。语言设计已经被黑客接管。到目前为止这样到底是好是坏还看不清楚,但是发展势头令人鼓舞。比如,Perl就有一些绝妙的创新。不过,它也包含了一些很糟糕的想法。对于一种充满进取心、大胆探索的语言来说,这也是很正常的事。以它现在这种变化的速率,大概只有上帝才知道一百年后Perl会变成什么样。有一句俗话说,如果你自己做不到,那就去当老师。这在语言设计领域不成立,我认识的一些最出色的黑客就在当教授。但是,当老师的人确实有很多事情不能做。研究性职位给黑客带来了一些限制。在任何学术领域,都有一些题目是可以做的,另一些题目是不可以做的。不幸的是,这两类题目的区别通常取决于它们写成论文后看上去是不是很高深,而不是取决于它们对软件业的发展是否重要。最极端的例子可能就是文学,文学研究者的任何成果几乎对文学创作者都毫无影响。
虽然科学领域的状况要稍好一点,但是研究者可以做的题目与能够对设计优秀语言有所帮助的题目之间的交集小得令人沮丧。(奥林·希弗斯曾经对这一点表达不满,而且说得头头是道。)比如,研究变量类型的论文好像多得无穷无尽,尽管事实上静态类型语言看来无法真正支持宏(在我看来,一种语言不支持宏,那就不值得使用了)。
新语言更多地以开源项目的形式出现,而不是以研究性项目的形式出现。这是语言的一种发展趋势。另一种发展趋势是,新语言的设计者更多的是本身就需要使用它们的应用软件作者,而不是编译器作者。这似乎是好的趋势,我期待它继续保持下去。
一百年后的物理学基本上不可能预测。但是计算机语言不一样,现在就动手设计一种一百年后可以吸引使用者的新语言,这在理论上似乎是可能的。
设计新语言的方法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后,这样的假设好像都是有道理的。
你应该写什么程序?随便什么,只要能让你最省力地写出来就行。但是要注意,这必须是在你的思维没有被当前使用的编程语言影响的情况下。这种影响无处不在,必须很努力才能克服。你也许觉得,对于人类这样懒惰的生物,喜欢用最省力的方式写程序是再自然不过的事情。但是事实上,我们的思想可能往往会受限于某种现存的语言,只采用在这种语言看来更简单的形式,它对我们思想的束缚作用会大得令人震惊。新语言必须靠你自己去发现,不能依靠那些让你自然而然就沉下去的思维定势。
采用程序的长度作为它耗费工作量的近似指标是个很有用的技巧。这里的程序长度当然不是指字符的数量,而是指各种句法元素的总长度,基本上就是整个解析树的大小。也许不能说最短的程序就是写起来最省力的程序,但是当你一心想把程序写得简洁而不是松松垮垮时,你就更接近省力这个目标,你的日子也会变得好过得多。所以,设计语言的正确做法就变成了,看着一段程序,然后问自己是不是能把它写得更短一点?
实际上,用想象出来的一种一百年后的语言来写程序,这件事情的可靠程度,取决于你对语言内核的估计是否足够正确。常规的排序,你现在就可以写出来。但是,想要预测一百年后的语言使用什么函数库就很难了。很可能许多函数库针对的领域现在还根本不存在。比如,如果SETI@home计划^成功,我们就需要与外星人联系的函数库了。当然,如果外星人的文明高度发达,已经到了用XML格式交换信息的地步,那就不需要新的函数库了。
^「SETI@home是一个寻找地球以外智慧生命的科学实验、由加州大学伯克利分校发起并主持。它使用射电望远镜监听太空中的无线电信号,然后用计算机进行数据分析,如果发现有些信号不可能自然产生,就可以证明外星文明的存在。1995年,该项目决定向志愿者开放,使用全球联网的大量计算机进行分布式计算,1999年5月开始正式运行。详细情况参见http://setiathome.berkeley.edu。——译者注」
另一个极端是,我觉得今天你就能设计出一百年后的语言内核。事实上,在有些人看来,大部分语言内核在1958年就已经设计出来了^。
^「Lisp语言的第一版规格说明书是1958年发布的。——译者注」
如果今天就能使用一百年后的编程语言,我们会用它编程吗?观古而知今。如果1960年就能使用今天的编程语言,那时的人们会用它们吗?
在某些方面,回答是否定的。今天的编程语言依赖的硬件在1960年并不存在。比如,Python这样的语言,正确的缩进(indentation)在编写时很重要,但是1960年的计算机没有显示器,只有打印机终端,所以编写起来就不会很顺利。但是,如果把这些因素排除在外(你可以假设,我们只在纸上编程),20世纪60年代的程序员会喜欢用现在的语言编程吗?
我想他们会的。某些缺乏想象力、深受早期编程语言思想影响的人可能会觉得不可能。(没有指针运算,如何复制数据?没有goto语句,如何实现流程图?)但是我想,那时最聪明的程序员一定能轻松地使用今天的大多数语言,假定他们能得到的话。
如果我们现在就能拥有一百年后的编程语言,那就至少能用来写出优秀的伪码^。我们会用它开发软件吗?因为一百年后的编程语言需要为某些应用程序生成快速代码,所以很可能它生成的代码能够在我们的硬件上运行,速度也还可以接受。相比一百年后的用户,我们也许不得不对这种语言做更多的优化,但是总的来看,它应该仍然会为我们带来净收益。
^「伪码又称虚拟代码,用来抽象地描述算法,而不是现实存在的编程代码。——译者注」
现在,我们的两个观点就是:(1)一百年后的编程语言在理论上今天就能设计出来;(2)如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的结果。如果我们把这两个观点联系起来,那就得出了一些有趣的可能性。为什么不现在就动手尝试写出一百年后的编程语言呢?
当你设计语言的时候,心里牢牢记住这个目标是有好处的。学习开车的时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。我认为,设计编程语言时,我们也应该这样做。
概述
浪费可以分成好的浪费和坏的浪费。我感兴趣的是好的浪费,即用更多的钱得到更简单的设计。所以,问题就变成了如何才能充分利用新硬件更强大的性能最有利地“浪费”它们?
现在,我们的两个观点就是:(1)一百年后的编程语言在理论上今天就能设计出来;(2)如果今天真能设计出这样一种语言,很可能现在就适合编程,并且能够产生更好的结果。如果我们把这两个观点联系起来,那就得出了一些有趣的可能性。为什么不现在就动手尝试写出一百年后的编程语言呢?
当你设计语言的时候,心里牢牢记住这个目标是有好处的。学习开车的时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。我认为,设计编程语言时,我们也应该这样做。
12 拒绝平庸:别忘了你的对手与你一样,能用任何想用的语言编写互联网软件。
原文
1995年,罗伯特·莫里斯和我一起创办了Viaweb。我们打算开发软件,让用户可以自己搭建网上商店。当时,我们的创意是把软件放在服务器端,使用普通的网页作为用户界面。
当然,那个时候许多人可能都想到过这个主意。但是,就我所知,Viaweb是第一个互联网应用程序。在我们看来,这真的是很新颖的想法,所以我们就把公司命名为Viaweb,意即我们的软件通过网络使用,而不是运行在你的桌面电脑上^。
^「在英语中,via是一个介词,意为“经过……”,所以Viaweb的意思就是经过网络。——译者注」
另一个特别之处是,这个软件主要采用Lisp语言开发^。它是最早的用Lisp语言开发的大型应用程序,在此之前,Lisp语言主要用于大学和实验室中。
^「一开始的时候,Viaweb有两个部分——编辑器和订单处理系统。前者用Common Lisp开发,主要供用户搭建自己的网站。后者用C语言开发,主要用来处理订单。在Viaweb的第一版中,Lisp是最主要的开发语言,因为订单处理系统非常小,占用的代码很少。2003年1月,Yahoo发布了Viaweb编辑器的新版本,采用C++和Perl开发。但是,为了把原始程序翻译成C++,他们可能不得不专门写一个Lisp解释器,因为据我所知,Viaweb所有的页面生成模板还没变,都是使用Lisp代码。(参见Greenspun写的Tenth Rule一书第198页。)」
埃里克·雷蒙德写过一篇文章《如何成为一个黑客》(How to Become aHacker)。文中有一部分专门谈到,在他看来,如果你想当一个黑客,应该学习哪些语言。他建议从Python和Java入手,因为它们比较容易学。想当高级一点的黑客,还应该学习C和Perl。前者用来对付Unix系统,后者用来系统管理和开发CGI脚本。最后,真正非常严肃地把黑客作为人生目标的人,应该考虑学习Lisp:
Lisp很值得学习。你掌握它以后,会感到它给你带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到Lisp。
为什么不用呢?编程语言毕竟是一种工具。如果Lisp语言真的能开发出更好的程序,你就应该用它。如果它无助于编程,那么就不会有人需要它。
这不仅仅是一个理论问题。软件业是竞争非常激烈的行业,而且容易出现垄断。在不考虑其他情况的条件下,某家公司的软件更快更好用,就会把竞争者赶出这个市场。一旦你开始创业,你就会更深切地感受到这一点。一般情况是,创业公司要么赢得一切,要么彻底失败。你要么成为富翁,要么一无所获。创业的时候,如果你选择了错误的技术,竞争对手就会一举打败你。
创业公司尤其如此。大公司可以互相模仿,但是创业公司就不行。我觉得很多人没有意识到这一点,尤其是一些创业者。
大公司每年平均成长大约10%。所以,如果你掌管一家大公司,只要每件事都做到大公司的平均水准,你就能得到大公司的平均结果,也就是每年成长大约10%。
如果你掌管创业公司,当然也可以这样。你把每件事都做到平均水准,就能得到平均结果。问题在于,小公司的平均结果就意味着关门倒闭。创业公司的生存率远低于50%。所以,如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。
回到1995年,我们懂得一些竞争对手不懂的事情(至少在我们看来是如此),这些事情甚至直到今天都很少有人懂:如果开发只在自己服务器上运行的软件,这意味着你想用什么语言就能用什么语言。如果开发桌面软件,就完全不一样了,大多数情况下你只能使用操作系统所用的开发语言。10年前,开发桌面软件就意味着要使用C语言。但是,对于互联网软件,你能使用任何你想用的语言。如果你还同时拥有操作系统和语言的源码,那么你的自由就更大了。
但是,这种新出现的自由是一把双刃剑。既然你可以使用任何语言,你就不得不思考到底使用哪一种语言。如果你的公司对这种选择的自由视而不见,而竞争对手看到了,那么你就有被击败的危险。
如果选择哪种语言都行,你到底使用哪一种语言?我们选择Lisp。首先,很明显,对于这个市场来说,快速开发出产品是很重要的。我们所有人都是从零开始,所以能够快速做出新功能的公司就会取得巨大的竞争优势。我们知道Lisp语言真的非常合适快速开发软件,而且我们的软件运行在服务器端,你一写完代码就能发布出去,所以这又进一步放大了快速开发的效果。
如果其他公司不想使用Lisp语言,那就更好了。这会让我们拥有技术优势。我们不能放过任何有利的因素。创办Viaweb的时候,我们对于如何经营一家公司毫无经验,对市场推广、雇用员工、融资、发展新客户等都一无所知。在此之前,我和莫里斯甚至连一夭正式上班的经历都没有。我们唯一擅长的事情就是开发软件。我们希望这一点可以弥补我们的劣势。任何在软件开发上面有助于我们获得优势的事情我们都不能放过。
可以这样说,我们使用Lisp只是一个大胆的冒险。我们设想如果用Lisp语言开发自己的软件,就能比竞争对手更快地写出新功能,还能做到他们做不到的事情。同时,因为Lisp是一种抽象层次非常高的语言,所以就不需要非常庞大的开发团队,这会降低成本。如果我们的设想是正确的,那么我们就能用更少的钱做出一个更好的产品,从而获得利润。最终,我们将独占市场,竞争对手什么也得不到,到头来只能退出这个行业。我们当时心里就是这么盘算的。
这次冒险的结果如何?多少有点出人意料,它竟然达到了我们的设想。我们前前后后遭遇到很多竞争对手,一共大概有二三十个,但是他们的软件没有一个能与我们竞争。我们的软件运行在服务器端,用户可以“所见即所得”地搭建网上商店,感觉就像在操作桌面软件。我们的竞争对手使用CGI脚本。我们在功能上总是遥遥领先于他们。有时,他们出于绝望,试图引入我们没有的功能。但是,有了Lisp语言的帮助,我们的开发周期很短。有时候,竞争对手刚刚发布新闻稿宣布将引入新功能,我们就能在一两天内做出自己的版本。当对手找来的记者抽出时间打电话过来想了解我们的反应,我们就会告诉他我们已经有了这个功能。
竞争对手一定觉得我们好像拥有了某种秘密武器,能够破解他们内部的通信或者其他机密。事实上,我们的确拥有秘密武器,但是没他们想的那么复杂。从来没有人向我们泄露他们的内部机密,只是我们的开发速度比别人想象的更快而已。
我们的秘密武器很类似上面的情景。我们使用一种奇特的人工智能语言开发软件,它的语法非常古怪,大量使用括号。多年来,要是听到别人这样描述Lisp语言,我会勃然大怒。但是现在,这却成了我们的优势。在竞争中,你的对手无法理解你的技术优势,这可是再宝贵不过了。商场如战场,对手摸不透你,你的胜算就增加了。
虽然有些令人难为情,但是我必须承认,就是因为这个原因,在Viaweb创业期间我从来没有公开谈论过Lisp语言。我们对新闻媒体闭口不谈Lisp,如果你在我们的网站上捜索Lisp,只会发现我在个人介绍中提到过两次,那是我写的两本关于Lisp的书。这是故意的,创业公司对竞争对手应该越保密越好。如果他们不知道(或者不关心)我们的软件用什么语言开发,我就要把这个秘密保持下去^。
^「莫里斯觉得不用这么保密,因为即使竞争对手知道我们使用Lisp语言,对他们也不会有帮助:“如果他们真的聪明,早就已经在用Lisp编程了。”」
Lisp语言到底好在什么地方?如果它真的这么好,为什么没有得到广泛使用呢?这种问题听起来有点像绕口令,但是实际上回答起来很简单。Lisp语言的好处不在于它有一些狂热爱好者才明白的优点,而只在于它是目前最强大的编程语言。它没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。当然,上面两句话都需要进一步解释。
我先从一个争议极大的命题开始讲起:编程语言的编程能力有差异。至少不会有人反对高级语言比机器语言更强大这一观点。今天的大多数程序员通常情况下都不会想用机器语言编程,而是使用一种高级语言,然后再让编译器帮你把它翻译成机器语言。这种观念甚至已经移植到了硬件,从20世纪80年代开始,硬件的指令集都是针对编译器而不是针对程序员设计的。
大家都知道,徒手用机器语言写出整个程序是一件很蠢的事。但是,把这个观点推广到一种更普遍的情况,知道的人就不多了。如果你有好几种语言可以选择,在不考虑其他因素的情况下,你不选择最强大的那种语言就是一件很蠢的事^。
^「如果从图灵等价(Turing-equivatent)的角度来看,所有语言都是一样强大的,但是这对程序员没有意义。(没人想为图灵机编程。)程序员关心的那种强大也许很难正式定义,但是有一个办法可以解释,那就是有一些功能在一种语言中是内置的,但是在另一种语言中需要修改解释器才能做到,那么前者就比后者更强大。如果A语言有一个运算符,可以移除字符串中的空格,而B语言没有这个运算符,这可能不足以称A语言比B语言强大,因为你可以在B语言里写一个函数实现这个功能。但是,如果A语言支持某种高级功能(假定是递归),而B语言不支持,你就不可能通过自己编写函数库解决了,所以这就代表A语言比B语言更强大。」
上面这个观点有许多例外情况。如果在开发的程序必须与另一个程序紧密配合,那么可能最好还是使用后者的开发语言。如果你的程序只是要做一些很简单的事(比如整数运算或者位操作),那就不妨使用一种比较靠近机器的低层次语言,主要原因是这样运行起来会更快一些。如果你的程序很短,只是为了特定场合一次性使用,那么你最好根据自己要解决的问题选择具有最强大函数库的语言,不过,总的来看,对于应用程序来说,还是应该选择总体最强大、效率也在可接受范围内的编程语言,否则都是不正确的选择,就好像你选择机器语言编程一样,只是程度上有差异而已。
大家都公认机器语言属于非常低层次的语言。但是,至少在社会上很多人眼里,高级语言其实也差不多。但事实并非如此,高级语言与机器语言的差别很大。从技术上看,“高级语言”并不是一个定义很清晰的名词。在高级语言与机器语言之间并不存在一条明确的分界线。语言的抽象性是一条连续曲线,从最强大的语言一直到最底层的机器语言,每一种语言的能力都有差异^。
尽管Lisp语言非常强大,但是我并不期望有谁(超过25岁的人)读完这篇文章就立刻开始学习它。我写这篇文章的目的不是想改变任何人的观点,而是想让那些有兴趣学习Lisp语言的人放心,他们知道Lisp是一种强大的语言,但是担心使用者太少,学会了也没什么用。我想让他们明白,在商业竞争中使用Lisp语言就会带来优势。你的竞争对手不懂Lisp,这将使得它的强大更充分地表现出来。
如果你想在创业公司中使用Lisp语言,你不仅不应该担心使用它的人太少,反而应该希望这种局面保持下去。事实上,现状很可能真的会保持下去。因为编程语言的特点之一就是它会使得大多数使用它的人满足于现状,不想改用其他语言。人类天性变化的速度大大慢于计算机硬件变化的速度,所以编程语言的发展通常比CPU的发展落后一二十年。在麻省理工学院这样的地方,20世纪60年代初就开始使用高级语言了。但是,许多公司直到80年代还在用机器语言编程。我敢打赌,很多人对机器语言恋恋不舍,直到CPU开始采用精简指令集^了才不得不放弃使用机器语言。这就好比酒吧已经到了打烊时间,酒保开始整理桌子、收拾东西准备回家,客人才被迫离开。
^「精简指令集计算机(Reduced Instruction Set Computer,简称RISC)是CPU的一种架构,对指令数目和寻址方式都做了精简,使其实现更容易,执行速度更快,编译器的效率更高。它在20世纪80年代开始得到大规模采用。——译者注」
技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物^。所以,一种很普通的编程语言就是很普通的程序员使用的语言,它的变化就像冰山那样缓慢。大概在1960年,Lisp语言引入了垃圾回收机制(Garbage Collection),今天已经被广泛认为是非常好的做法。Lisp的动态类型特点也同样受到越来越多人的认同。闭包是20世纪60年代Lisp语言引入的功能,现在的接受程度还很低。宏也是60年代中期Lisp语言引入的,现在还是一片处女地。
^「所以,如果你想对编程语言进行比较,那就做好准备打一场宗教战争,或者索性就写一本绝对不带个人色彩的大学教材,枯燥得像人类学研究一样。那些喜欢平静生活的人以及想要得到终身教职的人对这个话题唯恐避之不及。但是,必须承认的是,它只是一半与宗教有关,所以剩下的一半依然值得研究,尤其是当你要设计新语言的时候。」
很显然,那些很普通的编程语言正在主导一切。我不建议你挑战这种强大的习惯势力,相反,我建议你向日本合气道选手学习,利用这种势力削弱你的竞争对手,让他们自食其果。
如果你为大公司工作,想要改用Lisp语言可能不是一件容易的事。你很难说服自以为是的老板,让他允许你用Lisp语言开发程序。老板受到报纸的影响,认为某些其他语言将主宰世界(就像20年前Ada语言受到的评价)。但是,如果你为创业公司工作,那里没有这样的老板,那么你就能和我们一样,将他人的Blub困境转变为你的优势。你的竞争对手被牢牢粘在那些很普通的语言上面,永远都追不上你使用的技术。
如果你为创业公司工作,那么这里有一个评估竞争对手的妙招——关注他们的招聘职位。他们网站上的其他内容无非是一些陈腐的照片和夸夸其谈的文字,但是招聘职位却不得不写得很明确,反映出他们到底想干什么,否则就会引来一大批不合适的求职者。
在Viaweb创业期间,我读过大量竞争对手的招聘职位。差不多每个月都有一个新的竞争对手浮出水面。我首先会看他们的产品有没有一个试用版,然后就去找他们的招聘职位。这样过了几年,我就知道哪些公司值得关注,啷些公司不用在意。有些公司的职位描述使用了大量的IT词汇,这样的内容越多,这家公司就越不构成威胁。最不用担心的竞争对手就是那些要求应聘者具有Oracle数据库经验的公司,你永远不必担心他们。如果是招聘C++或Java程序员的公司,对你也不会构成威胁。如果他们招聘Perl或Python程序员,就稍微有点威胁了。至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘Lisp黑客的公司,就会真的感到如临大敌。
概述
随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。
浪费程序员的时间,而不是机器的时间,才是真正的无效率。随着计算机速度越来越快,这会越来越明显,所以,现在被认为缺点是运行速度慢的语言,将来会有更大的发展空间,毕竟从哲学角度上将,它的慢必然伴随着其他方面的优势。
Lisp是最好的编程语言。
创业公司对竞争对手应该越保密越好。
13 书呆子的复仇:在高科技行业,只有失败者采用“业界最佳实践”。
原文
软件业有一场永不停息的战斗,书生气的开发者与官僚主义的经理之间总是发生冲突。大家应该都看过漫画《呆伯特》,熟悉里面那个发型高耸的经理^。我想,技术行业的大部分人对这个角色都过目难忘,因为在他们的公司里就有这个角色的原型。
^「这篇文章发上网后,我收到了一封显然发自肺腑的电子邮件,开头是这样写的:发型高耸?难道有谁的头发不是向上耸的吗?如果你只能想出这种词去悔辱你的经理,那么你们这些人活该被称为“书呆子”。」
那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。
举例来说,假设你需要写一个软件。你的经理根本不懂这个软件的运作机制,也不知道各种编程语言有什么区别。但是,他竟然明确要求你一定要使用某一种语言进行开发。没错,他就是要求你一定要用Java语言。
为什么他会提出这种要求?让我们看看他脑袋里是怎么想的。他的想法无非就是,Java是业界的标准。我知道肯定如此,因为媒体对此有铺天盖地的报道。既然它是标准,那么使用它就不会错。另外,这也意味着人才市场上肯定有无数Java程序员,即使现在为我打工的这批人都辞职了(真奇怪,这种事情总是不断发生),我也能够轻易地找到替代者。
嗯,这听起来也不无道理。但是,它的前提是一个没有说出口的假设,而这个假设实际上是错的。你的经理相信所有编程语言的功能都差不多,可以互相替代。如果这种想法是对的,那么他要求你用Java编程就很合理了。反正编程语言之间没有区别,那么就用大家都在用的那种语言吧。
但是,编程语言是不一样的。就算不探讨各种语言之间的具体区别,我也能向你证明这一点。回到1992年,如果你问经理使用什么语言开发软件。他会像今天一样毫不迟疑地回答说C++。如果所有编程语言都一样,为什么答案变了?进一步说,为什么Java语言的设计者要如此麻烦地去创造一种新语言呢?
一般来说,如果你动手创造一种新语言,那是因为你觉得它在某些方面会优于现有的语言。Java语言之父詹姆斯·戈斯林在第一份《Java白皮书》中说得很清楚,之所以要设计Java,就是想解决C++的一些弱点。所以结论就是,各种编程语言的编程能力是不相同的。如果你接受你的经理的假设,然后一路追溯到Java语言的源头,就会得到与他的假设完全不同的结果。
到底谁对?戈斯林还是你的经理?结果当然是意料之中的,戈斯林是正确的。某些情况下,一些语言就是比另一些语言更出色。可是这样一说又导致了另外的问题。C++不适合解决某些难题,所以Java才被设计出来。那么,什么情况下应该使用Java,什么情况下应该使用C++呢?会不会某些情况下其他语言比它们更合适呢?
一旦你开始思考这个问题,就会发现它非常棘手。如果你的经理被迫去想这个问题,当他看到它的复杂性时,脑袋恐怕都会爆炸。如果所有语言真的都一样,那么他只需选择一种看上去获得大部分人拥戴的语言就可以了,因为这实际上是一种流行风尚,而不是技术问题,所以即使像你的经理这样对技术无知的人也有可能轻松得到正确答案。但是,如果语言各有不同,你的经理就会突然发现,有两个互相关联的方程,他必须找到一个能够同时满足两个方程的最佳解,而最要命的却是他对此根本一无所知。第一个方程是找到(相对于要解决的问题)能够适用20年左右的最佳语言,第二个方程是(为这种语言)找到合适的程序员、函数库的机会有多大。如果假定所有语言都不同,就会遇到这种苦苦求解的情况,所以难怪你的经理不愿意接受这个假设了。
认为所有语言都一样的看法的缺点是自欺欺人,但是优点是可以使许多事情变得很简单。我想这就是为什么它被广泛接受的主要原因。它是一个令人舒服的想法。
Lisp和Fortran代表了编程语言发展的两大方向。前者的基础是数学,后者的基础是硬件架构。从那时起,这两大方向一直在互相靠拢。Lisp语言刚设计出来的时候就很强大,接下来的二十年它提高了运行速度。而那些所谓的主流语言把更快的运行速度作为设计的出发点,然后再用四十多年的时间一步步变得更强大。直到今天,最高级的主流语言也只是刚刚接近Lisp的水平。虽然已经很接近了,但还是没有Lisp那样强大。
你不能让那些衣冠楚楚、西装革履的家伙替你做技术决策。潜在的并购方有没有对我们使用Lisp语言感到很难接受?稍微有一点吧,但是如果我们不使用Lisp,我们就根本写不出现在的软件,也就不会有人想收购我们。他们眼中不正常的事情恰恰就是使得这一切发生的原因所在。如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。
由于选择了不当的编程语言而导致项目失败的可能性,是你的经理不愿意考虑的问题。事实上大部分的经理都这样。因为你知道,总的来说,你的经理其实不关心公司是否真的能获得成功,他真正关心的是不承担决策失败的责任。所以对他个人来说,最安全的做法就是跟随大多数人的选择。
在大型组织内部,有一个专门的术语描述这种跟随大多数人的选择的做法,叫做“业界最佳实践”。这个词出现的原因其实就是为了让你的经理可以推卸责任。既然我选择的是“业界最佳实践”,如果不成功,项目失败了,那么你也无法指责我,因为做出选择的人不是我,而是整个“业界”。
我认为这个词原来是指某种会计方法,大致意思就是不要采用很奇怪的处理方法。在会计方法中,这可能是一个很好的主意。“尖端”和“核算”这两个词听上去就不适合放在一起。但是如果你把这个标准引入技术决策,你就开始要出错了。
技术本来就应该是尖端的。正如伊拉恩·加内特所说,编程语言的所谓“业界最佳实践”,实际上不会让你变成最佳,只会让你变得很平常。如果你选择的编程语言使得你开发软件的速度只有(选择更激进技术的)对手的几分之一,那么“最佳实践”真的起错了名字。
所以,我们就有了两点结论,我认为它们非常有价值。事实上,这是我用自己的经历换来的。第一,不同语言的编程能力不一样。第二,大多数经理故意忽视第一点。你把这两点事实结合起来,其实就得到了赚钱的诀窍。ITA软件公司是运用这个诀窍的典型例子。如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。
当然,我说使用其他语言无法解决这个问题,这句话并不完全正确。所有这些语言都是图灵等价的,这意味着严格地说,你能使用它们之中的任何一种语言写出任何一个程序。那么,怎样才能做到这一点呢?就这个小小的例子而言,你可以使用这些不那么强大的语言写一个Lisp解释器就行了。
这样做听上去好像开玩笑,但是在大型编程项目中却不同程度地广泛存在。因此,有人把它总结出来,起名为“格林斯潘第十定律”(Greenspun’s Tenth Rule):
任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。
如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用:(a)使用一种强大的语言;(b)为这个难题写一个事实上的解释器;或者(c)你自己变成这个难题的人肉编译器。在Python的例子中,这样的处理方法已经开始出现了,我们实际上就是自己写代码,模拟出编译器实现词法变量的功能。
这种实践不仅很普遍,而且已经制度化了。举例来说,在面向对象编程的世界中,我们大量听到“模式”(pattern)这个词,我觉得那些“模式”就是现实中的因素(c),也就是人肉编译器^。当我在自己的程序中发现用到了模式,我觉得这就表明某个地方出错了。程序的形式应该仅仅反映它所要解决的问题。代码中其他任何外加的形式都是一个信号,(至少对我来说)表明我对问题的抽象还不够深,也经常提醒我,自己正在手工完成的事情,本应该写代码通过宏的扩展自动实现。
「皮特·诺维格发现,总共23种设计模式之中,有16种在Lisp语言中“本身就提供,或者被大大简化”。
概述
你不能让那些衣冠楚楚、西装革履的家伙替你做技术决策。潜在的并购方有没有对我们使用Lisp语言感到很难接受?稍微有一点吧,但是如果我们不使用Lisp,我们就根本写不出现在的软件,也就不会有人想收购我们。他们眼中不正常的事情恰恰就是使得这一切发生的原因所在。如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。
所以,我们就有了两点结论,我认为它们非常有价值。事实上,这是我用自己的经历换来的。第一,不同语言的编程能力不一样。第二,大多数经理故意忽视第一点。你把这两点事实结合起来,其实就得到了赚钱的诀窍。ITA软件公司是运用这个诀窍的典型例子。如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。
14 梦寐以求的编程语言:一种好的编程语言,是让黑客可以随心所欲使用的语言。
原文
为了找到这些问题的答案,我想我们可以观察黑客,了解他们使用什么语言。编程语言本来就是为了满足黑客的需要而产生的,当且仅当黑客喜欢一种语言时,这种语言才能成为合格的编程语言,而不是被当作“指称语义”(denotational semantics)或者编译器设计。
黑客的看法其实比语言设计者的更重要。编程语言不是数学定理,而是一种工具,为了便于使用,它们才被设计出来。所以,设计编程语言的时候必须考虑到人类的长处和短处,就像设计鞋子的时候必须符合人类的脚型。如果鞋子穿上去不舒服,无论它的外形多么优美,多么像一件艺术品,你也只能把它当作一双坏鞋。
大多数程序员也许无法分辨语言的好坏。但是,这不代表优秀的编程语言会被埋没,专家级黑客一眼就能认出它们,并且会拿来使用。虽然他们人数很少,但就是这样一小群人写出了人类所有优秀软件。他们有着巨大的影响力,他们使用什么语言,其他程序员往往就会跟着使用。老实说,很多时候这种影响力更像是一种命令,对于其他程序员来说,专家级黑客就像自己的老板或导师,他们说哪种语言好用,自己就会乖乖地跟进。
假定你的语言已经能够满足上面三项条件——一种免费的实现,一本相关书籍,以及语言所依附的计算机系统——那么还需要做什么才能使得黑客喜欢上你的语言?
黑客欣赏的一个特点就是简洁。黑客都是懒人,他们同数学家和现代主义建筑师一样,痛恨任何冗余的东西或事情。有一个笑话说,黑客动手写程序之前,至少会在心里盘算一下哪种语言的打字工作量最小,然后就选择使用该语言。这个笑话其实与真实情况相差无几。就算这真的是个笑话,语言的设计者也必须把它当真,按照它的要求设计语言。
简洁性最重要的方面就是要使得语言更抽象。为了达到这一点,首先你设计的必须是高级语言,然后把它设计得越抽象越好。语言设计者应该总是看着代码,问自己能不能使用更少的语法单位把它表达出来。如果你有办法让许多不同的程序都能更简短地表达出来,那么这很可能意味着你发现了一种很有用的新抽象方法。
对黑客来说,选择编程语言的时候,还有一个因素比简洁更重要,那就是这种语言必须能够帮助自己做到想做的事。在编程语言的历史上,防止程序员做出“错误”举动的措施多得惊人。这是语言设计者很自以为是的危险举动,他们怎么知道程序员该做什么不该做什么?我认为,语言设计者应该假定他们的目标用户是一个天才,会做出各种他们无法预知的举动,而不是假定目标用户是一个笨手笨脚的傻瓜,需要别人的保护才不会伤到自己。如果用户真的是傻瓜,不管你怎么保护他,他还是会搬起石头砸自己的脚。你也许能够阻止他引用另一个模块中的变量,但是你没法防止他日日夜夜不知疲倦地写出结构混乱的程序去解决完全错误的问题。
优秀程序员经常想做一些既危险又令人恼火的事情。所谓“令人恼火”,我指的是他们会突破设计者提供给用户的外部语义层,试着控制某些高级抽象的语言内部接口。比如,黑客喜欢破解,而破解就意味着深入内部,揣测原始设计者的意图。
你应该敞开胸怀,欢迎这种揣测,对于制造工具的人来说,总是会有用户以违背你本意的方式使用你的工具。如果你制造的是编程语言这样高度组合的系统,那就更是如此了。许多黑客会用你做梦也想不到的方式改动你的语法模型。我的建议就是,让他们这样干吧,而且应该为他们创造便利,尽可能多地把语言的内部暴露在他们面前。
其实,黑客并不会彻底颠覆你的工具,在一个大型程序中,他可能只是对语言改造一两个地方。但是,改动多少地方并不重要,重要的是他能够对语言进行改动。这可能不仅有助于解决一些特殊的问题,还会让黑客觉得很好玩。
一种真正优秀的编程语言应该既整洁又混乱。“整洁”的意思是设计得很清楚,内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。“混乱”的意思是它允许黑客以自己的方式使用。C语言就是这样的例子,早期的Lisp语言也是如此。真正的黑客语言总是稍微带一点放纵不羁、不服管教的个性。
优秀的编程语言所具备的功能,应该会使得言必称“软件工程”的人感到非常不满、频频摇头。与黑客语言形成鲜明对照的就是像Pascal那样的语言,它是井然有序的模范,非常适合教学,但是除此之外就没有很大用处了。
开发大型程序的另一个方法就是从一次性程序开始,然后不断地改进。这种方法比较不会让人望而生畏,程序在不断的开发之中逐渐进步。一般来说,使用这种方法开发程序,一开始用什么编程语言,就会一直用到最后,因为除非有外部政治因素的干预,程序员很少会中途更换编程语言。所以,我们就有了一个看似矛盾的结论:如果你想设计一种适合开发大型项目的编程语言,就必须使得这种语言也适合开发一次性程序,因为大型项目就是从一次性程序演变而来的。
一种编程语言要想变得流行,最后一关就是要经受住时间的考验。没人想用一种会被淘汰的语言编程,这方面已经有很多前车之鉴了。所以,大多数黑客往往会等上几年,看看某一种新语言的势头,然后才真正考虑使用它。
新事物的发明者通常对这个发现很震惊,他们没想到人们居然这样对待发明创造。但是,让别人相信一种新事物是需要时间的。我有一个朋友,他的客户第一次提出某种需求时,他很少理会。因为他知道人们有时候会想要自己并不真正需要的东西。为了避免浪费时间,只有当客户第三次或第四次提出同样的需求时,他才认真对待。这个时候客户可能已经很不高兴了,但是这至少保证他们提出的需求应该就是他们真正需要的东西。
大多数人接触新事物时都学会了使用类似的过滤机制。甚至有时要听到别人提起十遍以上他们才会留意。这样做完全是合理的,因为大多数的热门新商品事后被证明都是浪费时间的噱头,没多久就消失得无影无踪。虚拟现实建模语言VRML刚诞生时曾经轰动一时,但是我决定等到一两年后再去学习它,结果一两年后已经没有学习的必要了,因为市场已经把它遗忘了。
所以,发明新事物的人必须有耐心,要常年累月不断地做市场推广,直到人们开始接受这种发明。我们就耗费了好几年才使得客户明白ViaWeb不需要下载安装就能使用。不过,好消息是,简单重复同一个信息就能解决这个问题。你只需要不停地重复同一句话,最终人们将会开始倾听。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。
新事物的发展改进一般也需要很长时间。大多数技术在诞生后都逐渐发生了巨大的变化,编程语言更是如此。诞生头几年,一小批早期使用者比其他因素更能促进技术发展。早期使用者都是行家,要求也很高,能够很快找出你的技术中存在的缺点。而且,如果你的用户只有很少几个人,你就能够与他们所有人保持密切接触。只要不断改进你的系统,即使给用户造成了损失,早期使用者也会对你宽容大度的。
新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。自然成长式的一个例子就是在车库里白手起家、自力更生的创业者。几个好朋友埋头工作,在外界毫不知晓的情况下开发出某种新技术。他们把它推向市场,没有任何宣传,最初的用户寥寥无几(但是热心程度无与伦比)。创业者持续改进新技术,与此同时,通过口碑效应,用户数量不断增长。在创业者不经意间,他们已经壮大起来了。
大爆炸式的例子是有风险资本支持、在市场上大张旗鼓宣传的创业公司。他们急急忙忙地开发一个产品,推向市场的时候大肆曝光,立刻就获得了一大批使用者(至少他们希望如此)。
一般来说,车库里的创业者会妒忌大爆炸式的创业公司。后者的主导人物个个光彩照人、自信非凡,深受风险资本商的追捧。他们什么都买得起,在公关公司配合产品推出的宣传活动中,他们自己也附带成为了明星人物。自然成长式的创业者坐在自家车库里,觉得自己又穷又可怜。伹是我想他们不必难过。最终来看,自然成长式会比大爆炸式产生更好的技术,能为创始人带来更多的财富。如果你研究一下目前的主流技术,就会发现大部分都是源于自然成长式。
这种模式不仅存在于商业公司,还存在于科研活动中。Multics操作系统和Ada语言是大爆炸式项目,现在都已经销声匿迹了,而它们的继承者Unix和C语言则是自然成长式项目。
一种可能的解决方法是,将软件内部的接口设计成垂直接口而不是水平接口。这意味着软件内部的模块是一个个垂直堆积起来的抽象层,层与层之间的接口完全由其中的一层控制。如果较高的一层使用了较低的一层定义的语言,那么接口就由较低的一层控制;如果较低的一层从属于较高的一层,那么接口就由较高的一层控制。
让我们试着描述黑客心目中梦寐以求的语言来为以上内容做个小结。这种语言干净简练,具有最高层次的抽象和互动性,而且很容易装备,可以只用很少的代码就解决常见的问题。不管是什么程序,你真正要写的代码几乎都与你自己的特定设置有关,其他具有普遍性的问题都有现成的函数库可以调用。
这种语言的句法短到令人生疑。你输入的命令中,没有任何一个字母是多余的,甚至用到Shift键的机会也很少。
这种语言的抽象程度很高,使得你可以快速写出一个程序的原型。然后,等到你开始优化的时候,它还提供一个真正出色的性能分析器,告诉你应该重点关注什么地方。你能让多重循环快得难以置信,并且在需要的地方还能直接嵌入字节码。
这种语言有大量优秀的范例可供学习,而且非常符合直觉,你只需花几分钟阅读范例就能领会应该如何使用此种语言。你偶尔才需要查阅操作手册,它本身很薄,里面关于限定条件和例外情况的警告寥寥无几。这种语言的内核很小,但很强大。各个函数库高度独立,而且和内核一样经过精心设计,它们都能很好地协同工作。语言的每个部分就像精密照相机的各种零件一样完美契合,不需要为了兼容性问题放弃或者保留某些功能。所有函数库的源码都很容易得到。这种语言能够很轻松地与操作系统和用其他语言开发的应用裎序对话。
这种语言以层的方式构建。较高的抽象层透明地构建在较低的抽象层之上。如果需要的话,你可以直接使用较低的抽象层。
除了一些绝对必要隐藏的东西,这种语言的所有细节对使用者都是透明的。它提供的抽象能力只是为了方便你的开发,而不是为了强迫你按照它的方式行事。事实上,它鼓励你参与它的设计,给你提供与语言创造者平等的权力。你能够对它的任何部分加以改变,甚至包括它的语法。它尽可能让你自己定义的部分与它本身定义的部分处于同等地位。这种梦幻般的编程语言不仅开放源码,更开放自身的设计。
概述
对黑客来说,选择编程语言的时候,还有一个因素比简洁更重要,那就是这种语言必须能够帮助自己做到想做的事。在编程语言的历史上,防止程序员做出“错误”举动的措施多得惊人。这是语言设计者很自以为是的危险举动,他们怎么知道程序员该做什么不该做什么?我认为,语言设计者应该假定他们的目标用户是一个天才,会做出各种他们无法预知的举动,而不是假定目标用户是一个笨手笨脚的傻瓜,需要别人的保护才不会伤到自己。如果用户真的是傻瓜,不管你怎么保护他,他还是会搬起石头砸自己的脚。你也许能够阻止他引用另一个模块中的变量,但是你没法防止他日日夜夜不知疲倦地写出结构混乱的程序去解决完全错误的问题。
优秀程序员经常想做一些既危险又令人恼火的事情。所谓“令人恼火”,我指的是他们会突破设计者提供给用户的外部语义层,试着控制某些高级抽象的语言内部接口。比如,黑客喜欢破解,而破解就意味着深入内部,揣测原始设计者的意图。
你应该敞开胸怀,欢迎这种揣测,对于制造工具的人来说,总是会有用户以违背你本意的方式使用你的工具。如果你制造的是编程语言这样高度组合的系统,那就更是如此了。许多黑客会用你做梦也想不到的方式改动你的语法模型。我的建议就是,让他们这样干吧,而且应该为他们创造便利,尽可能多地把语言的内部暴露在他们面前。
所以,发明新事物的人必须有耐心,要常年累月不断地做市场推广,直到人们开始接受这种发明。我们就耗费了好几年才使得客户明白ViaWeb不需要下载安装就能使用。不过,好消息是,简单重复同一个信息就能解决这个问题。你只需要不停地重复同一句话,最终人们将会开始倾听。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。
15 设计与研究:研究必须是“新”的,而设计必须是“好”的。
原文
设计与研究的区别看来就在于,前者追求“好”(good),后者追求“新”(new)。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的。我认为这两条道路最后会发生交叉:只有应用“新”的创意和理论,才会诞生超越前人的最佳设计;只有解决那些值得解决的难题(也就是“好”的难题),才会诞生最佳研究。所以,最终来说,设计和研究都通向同一个地方,只是前进的路线不同罢了。
如果把创造一种编程语言看成是设计问题,而不是科研方向,那么有何不同?
最大的不同在于你会更多地考虑用户。设计的时候,一开始总是问:我为谁设计?他们需要什么?比如,优秀的建筑师不会先设计,然后强迫用户接受,而是先研究最终用户的需求,然后做出用户需要的设计。
注意,我说的是“用户需要的设计”,而不是“用户要求的设计”。我不想让读者产生一种印象,认为设计师就像厨师一样,顾客点什么菜就一模一样做出来。艺术的各个领域有着巨大的差别,但是我觉得任何一个领域的最佳作品都不可能由对用户言听计从的人做出来。
有一句话说“顾客永远是对的”,这是指评价优秀设计的标准是看它能够多大程度上满足用户的需求。如果你的小说没人爱看,或者你做的椅子极不舒服,那么就说明你的作品失败了,被一票否决了。就算你的小说(或者椅子)有着最先进的理论指导也无济于事。
大多数优秀设计都是这样产生的,它们关注用户,并且以用户为中心。
我说设计必须考虑用户的需求,这里的“用户”并不是指所有普罗大众。事实上,你可以选择任何想要的目标用户。比如,假定你正在设计一种工具,你可以把目标用户定为初学者,也可以定为专家级用户。一种人眼里的优秀设计可能在另一种人眼里却是糟糕无比。这里的重点是你必须选出某些人作为你的目标用户。我觉得,除非设定目标用户,否则一种设计的好坏根本无从谈起。
如果目标用户群体涵盖了设计师本人,那么最有可能诞生优秀设计。如果目标用户与你本人差别很大,你往往会假定目标用户的需求比你本人的需求更简单,而不是更复杂。低估用户(即使出于善意)一般来说总是会让设计师出错。我怀疑那些设计“公共住宅项目”(housing project)^的建筑师根本没想过自己住在里面会是什么感觉。编程语言也有这种现象。C、Lisp和Smalltalk都是设计者为了自己使用而设计的,而Cobol、Ada和Java则是为了给别人使用而设计的。
^「“公共住宅”指的是由政府出资建造的房产,用来出租给低收入家庭居住,类似于廉租房。——译者注」
如果你觉得自己在为傻瓜设计产品,那么很可能不仅无法设计出优秀产品,而且就连傻瓜也不喜欢你的设计。
不过,就算你的设计针对的是最高端的用户,你也一样是设计给人类使用。研究就不一样了。做数学研究时,你不会只为了方便读者理解而故意选择一种更麻烦的证明方式,你只会选择最直接、最简洁的证明。我想,一般来说科学研究都是这样。科学观点不需要服从人类工程学(ergonomic)。
软件开发也可以这样做。原型(prototype)并不只是模型(model),不等于将来一定要另起炉灶,你完全能够在原型的基础上直接做出最后的成品。我认为,只要有可能,你就应该这样做。这样的方式使得你可以利用在开发过程中一路产生的新想法。不过更重要的是,这样做有助于鼓舞士气。
先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。如果你正在写的代码一个小时之后就可以看到运行结果,这好比让你看到不远处就是唾手可得的奖励,你因此会受到激励和鼓舞。其他艺术领域也是如此,尤其是油画。大多数画家都是先画一个草图,然后再逐步加工。如果你采用这种方式,那么从理论上说,你每天收工的时候都可以看到整体的效果,不会对最后的成品一点感觉都没有。跟你说实话吧,画家之间甚至流传着一句谚语:“画作永远没有完工的一天,你只是不再画下去而已。”这种情况对于第一线的程序员真是再熟悉不过了。
士气也可以解释为什么很难为低端用户设计出优秀产品。因为优秀设计的前提是你自己必须喜欢这种产品,否则你不可能对设计有兴趣,更不要说士气高昂了。为了把产品设计好,你必须对自己说:“哇,这个产品太棒了,我一定要设计好!”而不是心想:“这种垃圾玩意,只有傻瓜才会喜欢,随便设计一下就行了。”
设计意味着做出符合人类特点和需要的产品。但是,“人类”不仅包括用户,还包括设计师,所以设计工作本身也必须符合设计师的特点和需要。
概述
软件开发也可以这样做。原型(prototype)并不只是模型(model),不等于将来一定要另起炉灶,你完全能够在原型的基础上直接做出最后的成品。我认为,只要有可能,你就应该这样做。这样的方式使得你可以利用在开发过程中一路产生的新想法。不过更重要的是,这样做有助于鼓舞士气。
画作永远没有完工的一天,你只是不再画下去而已。