伟大的黑客
2004年7月
(本文源自2004年Oscon大会的演讲。)
有些程序员比其他人优秀得多。这种差异是我们这个领域最显著的特征之一。但我认为随着时间的推移,越来越多的领域也会看到这种现象。所以如果我们能理解这个现象,我们可能不仅仅是在学习编程。我们可能是在学习未来的模式。
爱迪生们
几个月前我完成了一本新书,在评论中我不断注意到"具有挑衅性"和"有争议"这样的词。更不用说"愚蠢"了。
我并不是有意让这本书有争议。我只是想让它高效。我不想浪费人们的时间告诉他们他们已经知道的事情。直接给他们差异更有效率。但我想这必然会带来一本令人不安的书。
关于哪个想法最有争议,这一点没有争议:财富差异可能没有我们想象的那么大的建议。
我在书中并没有说财富差异本身是好事。我说在某些情况下它可能是好事的标志。剧烈的头痛不是好事,但它可能是好事的标志——比如,你在头部受到撞击后正在恢复意识。
财富差异可能是生产力差异的标志。(在一个只有一个人的社会中,它们是相同的。)这几乎肯定是好事:如果你的社会没有生产力差异,很可能不是因为每个人都是托马斯·爱迪生。很可能是因为你没有托马斯·爱迪生。
在低技术社会中,你看不到太大的生产力差异。如果你有一个游牧部落收集柴火,最好的柴火收集者会比最差的效率高多少?两倍?而当你给人们一个像电脑这样的复杂工具时,他们能用它做的事情的差异是巨大的。
这不是一个新想法。弗雷德·布鲁克斯在1974年就写过这个,他引用的研究发表于1968年。但我认为他低估了程序员之间的差异。他写的是代码行数的生产力:最好的程序员能在十分之一的时间内解决给定问题。但如果问题不是给定的呢?在编程中,就像在许多领域一样,困难的部分不是解决问题,而是决定要解决什么问题。想象力很难衡量,但在实践中它主导着用代码行数衡量的那种生产力。
生产力在任何领域都有差异,但很少有领域差异如此之大。程序员之间的差异如此之大,以至于成为一种质的差异。我不认为这是编程固有的特征。在每个领域,技术都会放大生产力的差异。我认为在编程中发生的事情只是我们有大量的技术杠杆。但在每个领域,杠杆都在变长,所以随着时间的推移,越来越多的领域会看到这种差异。公司和国家的成功将越来越取决于他们如何处理这个问题。
如果生产力差异随着技术增加,那么最有生产力的个人的贡献不仅会不成比例地大,而且实际上会随时间增长。当你达到一个群体的90%产出由1%的成员创造时,如果某些事情(无论是维京人的袭击还是中央计划)将他们的生产力拉低到平均水平,你就会损失惨重。
如果我们想从他们那里获得最大收益,我们需要理解这些特别有生产力的人。是什么激励着他们?他们需要什么来做他们的工作?如何识别他们?如何让他们来为你工作?当然还有这个问题:如何成为他们中的一员?
不仅仅是钱
我认识几个超级黑客,所以我坐下来思考他们有什么共同点。他们的决定性特征可能是他们真的热爱编程。普通程序员写代码是为了付账单。伟大的黑客把它视为他们为了乐趣而做的事情,而且很高兴发现人们会为此付钱给他们。
伟大的程序员有时被认为对金钱漠不关心。这并不完全正确。确实他们真正关心的是做有趣的工作。但如果你赚足够的钱,你就可以做任何你想做的工作,因此黑客被赚大钱的想法所吸引。但只要他们还必须每天上班,他们更关心在那里做什么而不是得到多少报酬。
从经济角度来看,这是一个极其重要的事实,因为这意味着你不必支付给伟大黑客接近他们价值的报酬。一个伟大的程序员可能比普通程序员效率高十倍或一百倍,但他会认为自己很幸运能获得三倍的报酬。正如我稍后会解释的,这部分是因为伟大的黑客不知道他们有多好。但这也是因为金钱不是他们主要想要的东西。
黑客想要什么?像所有工匠一样,黑客喜欢好的工具。事实上,这是轻描淡写。优秀的黑客发现使用糟糕的工具是无法忍受的。他们会直接拒绝在错误的基础设施上工作。
在我曾经工作过的一家创业公司,我们公告板上钉着的一件东西是IBM的一则广告。那是一张AS400的图片,标题是,我想是"黑客鄙视它"。[1]
当你决定为项目使用什么基础设施时,你不仅是在做技术决定。你也在做社会决定,这可能比技术决定更重要。例如,如果你的公司想写一些软件,用Java写可能看起来是一个谨慎的选择。但当你选择一种语言时,你也在选择一个社区。你能雇来在Java项目上工作的程序员不会像你能雇来在Python项目上工作的程序员那么聪明。而且你的黑客质量可能比你选择的语言更重要。不过,说实话,优秀黑客更喜欢Python而不是Java这个事实应该告诉你这些语言的相对优点。
商业人士更喜欢最流行的语言,因为他们把语言视为标准。他们不想把公司押在Betamax上。但关于语言的问题是,它们不仅仅是标准。如果你必须在网络上传输比特,一定要使用TCP/IP。但编程语言不仅仅是一种格式。编程语言是一种表达媒介。
我读到Java刚刚超过Cobol成为最流行的语言。作为标准,你不能再要求更多了。但作为表达媒介,你可以做得更好。在我能想到的所有伟大程序员中,我只知道一个会自愿用Java编程。在我能想到的所有不为Sun工作、不从事Java工作的伟大程序员中,我知道零个。
伟大的黑客也通常坚持使用开源软件。不仅因为它更好,而且因为它给他们更多控制权。优秀的黑客坚持控制权。这是使他们成为优秀黑客的一部分:当某样东西坏了,他们需要修复它。你希望他们对为你写的软件有这种感觉。当他们对外部系统也有同样的感觉时,你不应该感到惊讶。
几年前,一个风险投资家朋友告诉我他参与的一家新创业公司。听起来很有前途。但下次我跟他谈话时,他说他们决定在Windows NT上构建他们的软件,并刚刚聘请了一位非常有经验的NT开发者作为他们的首席技术官。当我听到这个消息时,我想,这些人完蛋了。第一,CTO不可能是一流的黑客,因为要成为著名的NT开发者,他必须多次自愿使用NT,我想象不出一个伟大的黑客会这样做;第二,即使他很优秀,如果项目必须建立在NT上,他也很难雇到任何优秀的人为他工作。[2]
最后的边界
除了软件之外,对黑客来说最重要的工具可能是他的办公室。大公司认为办公空间的功能是表达等级。但黑客使用他们的办公室不仅仅是为了这个:他们把办公室用作思考的地方。如果你是一家科技公司,他们的想法就是你的产品。所以让黑客在嘈杂、分散注意力的环境中工作,就像在空气充满煤灰的油漆工厂工作一样。
漫画《呆伯特》对隔间有很多话要说,而且有充分的理由。我认识的所有黑客都鄙视它们。仅仅是被打断的前景就足以阻止黑客处理困难的问题。如果你想在有隔间的办公室里完成真正的工作,你有两个选择:在家工作,或者在其他人不在的时候(早来、晚走或周末)来。公司难道没有意识到这是某些事情出问题的标志吗?办公环境应该是帮助你工作的东西,而不是你不得不克服的东西。
思科这样的公司为每个人(包括CEO)都有隔间而自豪。但他们并不像他们认为的那样先进;显然他们仍然把办公空间视为等级的象征。还要注意,思科以很少在内部进行产品开发而闻名。他们通过收购创造新技术的创业公司来获得新技术——在那里,黑客们确实有安静的地方工作。
一家理解黑客需求的大公司是微软。我曾经看到微软的一则招聘广告,上面有一张大门的图片。前提是:为我们工作,我们会给你一个真正能完成工作的地方。你知道,微软在大公司中很特别,因为他们能够在内部开发软件。也许不是很好,但足够好。
如果公司想让黑客有生产力,他们应该看看黑客在家做什么。在家,黑客可以自己安排事情,以便能完成最多的工作。当黑客在家工作时,他们不会在嘈杂、开放的空间工作;他们在有门的房间里工作。他们在舒适、邻里般的地方工作,周围有人,需要思考时可以散步,而不是在玻璃盒子里,周围是停车场。当他们感到疲倦时,他们可以躺在沙发上小睡,而不是坐在办公桌前假装工作。没有清洁工队在黄金编程时间咆哮而过。没有会议,或者,上帝保佑,没有公司团建或团队建设活动。当你看看他们在电脑上做什么时,你会发现这强化了我之前关于工具的说法。他们可能不得不在工作中使用Java和Windows,但在家里,在他们可以自由选择的地方,你更可能发现他们使用Perl和Linux。
事实上,关于Cobol或Java是最流行语言的统计数据可能具有误导性。如果我们想知道什么工具最好,我们应该看看黑客在可以自由选择时选择什么——也就是说,在他们自己的项目中。当你问这个问题时,你会发现开源操作系统已经占据了主导市场份额,第一语言可能是Perl。
有趣
除了好的工具,黑客还想要有趣的项目。什么使项目有趣?嗯,显然像隐形飞机或特效软件这样明显性感的应用程序会很有趣。但任何应用程序如果提出新颖的技术挑战都会变得有趣。所以很难预测黑客会喜欢哪些问题,因为有些问题只有在人们发现新的解决方案时才会变得有趣。在ITA(编写Orbitz内部软件的公司)之前,从事航空票价搜索的人可能认为这是最无聊的应用程序之一。但ITA通过重新定义问题使其变得更有雄心,从而使其变得有趣。
我认为Google也发生了同样的事情。当Google成立时,所谓的门户网站的传统观点是搜索是无聊和不重要的。但Google的人不认为搜索是无聊的,这就是为什么他们做得这么好。
这是管理者可以发挥作用的地方。就像一个父母对孩子说,我打赌你十分钟内打扫不完整个房间,一个好的管理者有时可以通过重新定义问题使其更有趣。史蒂夫·乔布斯似乎特别擅长这一点,部分原因仅仅是因为他有高标准。在Mac之前有很多小型、便宜的电脑。他把问题重新定义为:制造一个漂亮的。这可能比任何胡萝卜或大棒都更能推动开发者。
他们确实做到了。当Mac首次出现时,你甚至不需要打开它就知道它会很好;你可以从外壳看出来。几周前,我在剑桥的街上走着,在某个人的垃圾中看到似乎是一个Mac手提箱。我往里看,里面有一个Mac SE。我把它带回家,插上电源,它启动了。快乐的Macintosh笑脸,然后是finder。我的天,它太简单了。就像…Google。
黑客喜欢为有高标准的人工作。但仅仅严格是不够的。你必须坚持正确的事情。这通常意味着你必须自己就是一个黑客。我偶尔看到关于如何管理程序员的文章。实际上应该有两篇文章:一篇是关于如果你自己是程序员该做什么,另一篇是关于如果你不是该做什么。第二篇可能可以压缩成两个字:放弃。
问题不在于日常管理。真正优秀的黑客实际上是自我管理的。问题是,如果你不是黑客,你就无法识别优秀的黑客。一个类似的问题解释了为什么美国汽车如此丑陋。我称之为设计悖论。你可能认为你可以通过雇佣一个伟大的设计师来使你的产品变得美丽。但如果你自己没有好的品味,你如何识别一个好的设计师?从定义上说,你不能从他的作品集看出来。你不能根据他获得的奖项或工作经历来判断,因为在设计领域,就像在大多数领域一样,这些往往是由时尚和社交驱动的,实际能力排在第三位。没有其他办法:如果你不知道什么是美丽的,你就无法管理一个旨在生产美丽事物的过程。美国汽车丑陋是因为美国汽车公司由品味差的人经营。
这个国家的许多人把品味视为某种难以捉摸的,甚至是轻浮的东西。它两者都不是。要推动设计,管理者必须是公司产品最苛刻的用户。如果你真的有好的品味,你可以像史蒂夫·乔布斯那样,让满足你成为优秀的人喜欢解决的问题。
讨厌的小问题
很容易说出哪些问题不有趣:那些不是解决几个大的、清晰的问题,而是必须解决许多讨厌的小问题的问题。最糟糕的项目之一是编写一个充满bug的软件的接口。另一个是为个别客户的复杂和定义不清的需求定制某些东西。对黑客来说,这类项目是千刀万剐。
讨厌的小问题的显著特征是,你从中学不到任何东西。编写编译器很有趣,因为它教你什么是编译器。但编写一个充满bug的软件的接口不会教你任何东西,因为bug是随机的。[3]所以不仅仅是挑剔使优秀的黑客避免讨厌的小问题。这更像是一个自我保护的问题。处理讨厌的小问题会让你变笨。优秀的黑客避免它,就像模特避免芝士汉堡一样。
当然,有些问题本质上就有这种特征。由于供求关系,它们特别赚钱。所以一家能找到方法让优秀黑客处理乏味问题的公司会非常成功。你会怎么做?
这种情况发生在一个地方是创业公司。在我们的创业公司,我们有罗伯特·莫里斯做系统管理员。这就像让滚石乐队在成人礼上表演。你无法雇佣那种人才。但人们会为公司做任何数量的苦差事,只要他们是创始人。[4]
更大的公司通过划分公司来解决这个问题。他们通过建立一个独立的研发部门来让聪明人为他们工作,在那里员工不必直接处理客户讨厌的小问题。[5]在这个模型中,研究部门就像一个矿场。他们产生新想法;也许公司的其他部分能够使用它们。
你可能不必走这么远。自底向上编程提出了另一种划分公司的方式:让聪明人作为工具制造者工作。如果你的公司制造做x的软件,让一组人构建编写该类型软件的工具,另一组使用这些工具编写应用程序。这样你可能能让聪明人编写99%的代码,但仍然让他们几乎像在传统研究部门一样与用户隔离。工具制造者会有用户,但他们只会是公司自己的开发者。[6]
如果微软使用这种方法,他们的软件就不会有这么多安全漏洞,因为编写实际应用程序的不那么聪明的人不会做像分配内存这样的底层工作。与其直接用C编写Word,他们会用Word语言的大乐高积木组装。(我相信技术术语是Duplo。)
聚集
除了有趣的问题,优秀黑客喜欢的是其他优秀黑客。伟大的黑客倾向于聚集在一起——有时非常显著,就像在施乐帕克研究中心那样。所以你不会因为你为他们创造的环境有多好而线性地吸引优秀黑客。聚集的趋势意味着它更像是环境的平方。所以是赢家通吃。在任何时候,黑客最想工作的地方只有大约十个或二十个,如果你不是其中之一,你不仅会有更少的优秀黑客,你会有零个。
拥有优秀的黑客本身并不足以使公司成功。这对Google和ITA来说效果很好,它们现在是两个热点,但它对思维机器或施乐没有帮助。Sun有一段时间表现不错,但他们的商业模式是下行电梯。在这种情况下,即使是最好的黑客也无法拯救你。
不过,我认为在其他条件相同的情况下,能够吸引优秀黑客的公司将具有巨大优势。有些人会不同意这一点。当我们在1990年代拜访风险投资公司时,有几个人告诉我们,软件公司不是通过编写优秀软件获胜的,而是通过品牌、主导渠道和做正确的交易。
他们似乎真的相信这一点,我想我知道为什么。我想很多风险投资家,至少是无意识地,在寻找下一个微软。当然,如果微软是你的模型,你不应该寻找希望通过编写优秀软件获胜的公司。但风险投资家寻找下一个微软是错误的,因为除非其他公司准备在正确时刻弯腰成为下一个IBM,否则没有创业公司能成为下一个微软。
使用微软作为模型是错误的,因为他们的整个文化都源于那一次幸运的突破。微软是一个糟糕的数据点。如果你把他们排除在外,你会发现好的产品确实倾向于在市场上获胜。风险投资家应该寻找的是下一个苹果,或下一个Google。
我想比尔·盖茨知道这一点。让他担心Google的不是他们的品牌力量,而是他们有更好的黑客。[7]
识别
那么谁是伟大的黑客?当你遇到一个时如何知道?事实证明这非常困难。即使是黑客也无法判断。我现在相当确定我的朋友特雷弗·布莱克威尔是一个伟大的黑客。你可能在Slashdot上读过他如何制造自己的Segway。这个项目的显著之处在于他用一天时间写了所有软件(顺便说一下,用Python)。
对特雷弗来说,这是家常便饭。但当我第一次见到他时,我以为他是个完全的白痴。他站在罗伯特·莫里斯的办公室里对他喋喋不休地说着什么,我记得站在他身后对罗伯特做手势,示意把这个疯子赶出办公室,这样我们就可以去吃午饭了。罗伯特说他一开始也误判了特雷弗。显然当罗伯特第一次见到他时,特雷弗刚刚开始一个新计划,涉及把他生活的每个方面都写在一堆索引卡片上,他随身携带这些卡片。他还刚从加拿大来,有浓重的加拿大口音和鲻鱼发型。
这个问题因为黑客尽管以社交迟钝著称,但有时会花很大力气显得聪明而变得更加复杂。当我在研究生院时,我偶尔会在MIT AI实验室闲逛。一开始有点令人畏惧。那里的人说话都很快。但过了一会儿我学会了快速说话的技巧。你不必想得更快;只需用两倍的词来说每件事。当时我偶尔做咨询,当我和客户谈话时,有时我会故意摆出这种MIT的架势来震慑他们,特别是在演示我声称已经工作了几个星期但实际上前一天晚上才写的软件时。
有了这么多的信号干扰,当你遇到优秀黑客时很难识别他们。我到现在也无法判断。你也不能从他们的简历看出来。似乎判断一个黑客的唯一方法是和他一起工作。
这就是为什么高科技地区只出现在大学周围。这里的活性成分不是教授而是学生。创业公司在大学周围成长,因为大学把有前途的年轻人聚集在一起,让他们在相同的项目上工作。聪明的人学会识别其他聪明的人,然后一起策划他们自己的新项目。
因为你只能通过和他一起工作来识别一个伟大的黑客,黑客自己也不知道他们有多好。这在大多数领域都是如此。我发现那些在某方面很优秀的人与其说是确信自己的优秀,不如说是对为什么其他人似乎如此无能感到困惑。我遇到的做伟大工作的人很少认为他们在做伟大工作。他们通常觉得自己愚蠢和懒惰,他们的脑子每十天只有一天正常工作,这只是时间问题,直到他们被发现。
但对黑客来说特别难以知道他们有多好,因为很难比较他们的工作。这在大多数其他领域更容易。在百米赛跑中,你10秒内就知道谁最快。即使在数学中,似乎也有关于哪些问题难以解决以及什么构成好的解决方案的普遍共识。但黑客就像写作。谁能说哪本小说更好?当然不是作者。
至少对黑客来说,其他黑客可以判断。这是因为,与小说家不同,黑客在项目上合作。当你通过网络向某人抛出几个困难的问题时,你很快就能知道他们如何有力地回应。但黑客无法观察自己工作。所以如果你问一个伟大的黑客他有多好,他几乎肯定会回答,我不知道。他不是在谦虚。他真的不知道。
而且我们中没有人知道,除了我们实际一起工作过的人。这把我们放在一个奇怪的情况:我们不知道我们的英雄应该是谁。黑客变得出名往往是由于随机的公关事故。偶尔我需要给出一个伟大黑客的例子,我从来不知道该用谁。首先想到的名字总是倾向于我认识的人,但用他们似乎很蹩脚。所以我想,也许我应该说理查德·斯托曼,或林纳斯·托瓦兹,或艾伦·凯,或某个像那样的名人。但我不知道这些人是否是伟大的黑客。我从未和他们一起工作过任何东西。
如果有一个黑客界的迈克尔·乔丹,没有人知道,包括他自己。
培养
最后,黑客们一直在思考的问题:如何成为一个伟大的黑客?我不知道是否可能让自己成为一个。但肯定可能做一些让你变笨的事情,如果你能让自己变笨,你可能也能让自己变聪明。
成为一个优秀黑客的关键可能是做你喜欢的事情。当我想到我认识的伟大黑客时,他们有一个共同点是,让他们做任何他们不想做的事情都极其困难。我不知道这是原因还是结果;可能是两者都是。
要做好某件事,你必须热爱它。所以只要你能保持编程作为你热爱的事情,你可能会做得很好。试着保持你14岁时对编程的好奇感。如果你担心你当前的工作正在腐蚀你的大脑,它可能确实如此。
最好的黑客当然倾向于聪明,但这在很多领域都是如此。有什么品质是黑客独有的吗?我问了一些朋友,他们提到最多的是好奇心。我一直以为所有聪明人都很好奇——好奇心只是知识的一阶导数。但显然黑客特别好奇,特别是关于事物如何运作。这很有道理,因为程序实际上是对事物如何运作的巨大描述。
几个朋友提到了黑客集中注意力的能力——正如一个人所说,他们"调出自己头脑之外的一切"的能力。我当然注意到了这一点。我听到几个黑客说,即使只喝半杯啤酒,他们就完全无法编程。所以也许黑客确实需要某种特殊的集中注意力的能力。也许伟大的黑客能在他们的头脑中加载大量的上下文,所以当他们看一行代码时,他们看到的不仅是那行代码,还有它周围的整个程序。约翰·麦克菲写道,比尔·布拉德利作为篮球运动员的成功部分归功于他非凡的周边视觉。“完美"视力意味着大约47度的垂直周边视觉。比尔·布拉德利有70度;当他看着地板时能看到篮筐。也许伟大的黑客有某种类似的天生能力。(我通过使用非常密集的语言来作弊,这缩小了场地。)
这可以解释关于隔间的分歧。也许负责设施的人,没有需要打破的注意力,不知道在隔间工作对黑客来说感觉就像把大脑放在搅拌机里。(而比尔,如果关于自闭症的传言是真的,太清楚这一点了。)
我注意到伟大黑客和一般聪明人之间的一个区别是黑客更政治不正确。就优秀黑客之间有秘密握手而言,这是当他们足够了解对方,可以表达会被公众用石头砸死的观点时。我可以看到为什么政治不正确在编程中会是一个有用的品质。程序非常复杂,至少在优秀程序员手中非常流畅。在这种情况下,有质疑假设的习惯是有帮助的。
你能培养这些品质吗?我不知道。但你至少可以不要压制它们。所以这是我最好的配方。如果可能让自己成为一个伟大的黑客,方法可能是和自己做以下交易:你永远不必做无聊的项目(除非你的家人会因此挨饿),作为回报,你永远不允许自己做一个半途而废的工作。我认识的所有伟大黑客似乎都做了这个交易,尽管也许他们中没有人在这件事上有任何选择。
注释
[h] 在不同技术阶段最有生产力的个人不一定是同一个人。能量和决心总是重要的,但例如,随着技术增加,体力变得不那么重要。
在近代欧洲早期,最重要的品质可能是组织能力。那种使艾萨克·牛顿与众不同的才华几乎没有实际效果。现在会有更多效果。
[1] 公平地说,我必须说IBM制造不错的硬件。我用IBM笔记本电脑写了这篇文章。
[2] 他们确实完蛋了。几个月后他们就关闭了。
[3] 我想这就是人们在谈论"生命的意义"时的意思。表面上看,这似乎是一个奇怪的想法。生命不是一个表达;它怎么可能有意义?但它可以有一种感觉很像意义的品质。在一个像编译器这样的项目中,你必须解决很多问题,但问题都遵循一个模式,就像信号一样。而当你必须解决的问题是随机的时,它们似乎像噪音。生命的意义是什么?一个隐喻。
[4] 爱因斯坦一度设计冰箱。(他有股权。)
[5] 很难准确地说计算机世界中的研究是什么,但作为第一个近似,它是没有用户的软件。
我不认为发表论文是让最好的黑客想在研究部门工作的原因。我认为主要是因为不必与产品经理开三个小时的会议,讨论将韩语版Word 13.27与会说话的曲别针集成的问题。
[6] 类似的事情在建筑行业已经发生了很长时间。当你两百年前建造一座房子时,当地的建筑商建造里面的一切。但越来越多的是,建筑商所做的是组装由其他人设计和制造的组件。这就像桌面出版的到来一样,给了人们以灾难性方式实验的自由,但它确实更有效率。
[7] Google对微软来说比网景更危险。可能比任何其他公司都更危险。特别是因为他们决心战斗。在他们的工作列表页面上,他们说他们的"核心价值观"之一是"不要作恶”。从一家销售豆油或采矿设备的公司来说,这样的声明仅仅是古怪的。但我认为我们计算机界的所有人都知道这是对谁的宣战。
感谢杰西卡·利文斯顿、罗伯特·莫里斯和莎拉·哈林阅读了这篇演讲的早期版本。
英文版:www.paulgraham.com/gh.html|中文版:HiJiangChuan.com/paulgraham/030-great-hackers
更新记录:
- 2025-03-27 HiJiangChuan 初稿翻译,术语待验证;