伟大的黑客
原文:Great Hackers
作者:Paul Graham 发表:2004-07
译者:Claude(baoyu-translate)
2004 年 7 月
(本文由我在 OSCON 2004(O’Reilly 开源大会)上的一次演讲改写而成。)
几个月前我写完了一本新书,在书评里我不断看到“挑衅性“、“有争议“这类词。更别提还有“愚蠢”。
我并没想把这本书写得有争议。我是想把它写得高效。我不想浪费别人时间,去告诉他们已经知道的东西。直接把 diff(软件版本差异)丢给他们更高效。但这样写出来的书,大概注定会让人不安。
爱迪生们
最有争议的观点是哪一个,这一点反倒没有争议:那就是我提出“财富不均也许并不像我们以为的那么严重“。
我并没有在书里说财富不均本身是一件好事。我说的是,在某些情境下,它可能是好事的征兆。剧烈的头痛不是好事,但它可以是好事的征兆——比如,你被人打了头之后正在恢复意识。
财富的差异可以是生产力差异的信号。(在一个只有一个人的社会里,二者完全相同。)而这几乎肯定是好事:如果你的社会里没有生产力差异,那很可能不是因为人人都是爱迪生,而是因为你这里根本没有爱迪生。
在低技术社会里,你看不到太大的生产力差异。如果你有一个游牧部落在捡柴生火,最会捡柴的人能比最不会捡柴的人多产出多少?两倍?而当你把一种像计算机这样复杂的工具交到人们手里时,他们能用它做出来的东西的差异就是巨大的。
这并不是新观点。Fred Brooks(《人月神话》作者)在 1974 年就写过这件事,而他引用的研究发表于 1968 年。但我觉得他低估了程序员之间的差异。他写的是按代码行数衡量的生产力:最好的程序员能用十分之一的时间解决同一个问题。但如果问题不是给定的呢?在编程里,和很多领域一样,难的不是解决问题,而是决定要解决什么问题。想象力很难度量,但在实践中,它支配着那种以“代码行数“衡量出来的生产力。
每个领域的生产力都有差异,但很少有哪个领域差异这么大。程序员之间的差异大到已经成了一种本质上的差别。不过我并不觉得这是编程独有的现象。在每个领域,技术都会放大生产力上的差异。我觉得编程里发生的事,只是因为我们手里有大量的技术杠杆而已。但每个领域的杠杆都在变长,所以我们今天在编程里看到的这种差异,未来会有越来越多的领域看到。公司——还有国家——的成败,会越来越取决于他们如何应对这一点。
如果生产力差异随技术增长,那么最具生产力的少数人贡献的份额不仅会不成比例地大,还会随着时间越来越大。当你到了一个群体 90% 的产出由 1% 的成员创造的程度,要是有什么东西(无论是维京人劫掠还是计划经济)把他们的生产力拖到平均水平,你的损失就大了。
如果我们想从他们身上获得最多,就需要理解这些特别有生产力的人。他们的动力是什么?他们做工作需要什么?怎样辨认他们?怎样让他们来为你工作?当然还有一个问题:你怎样才能成为其中一员?
不止是钱
我认识几个超级黑客,于是我坐下来想了想他们身上的共同点。他们最本质的特征大概是:他们真的热爱编程。普通程序员写代码是为了糊口。伟大的黑客把编程当作好玩的事来做,并且很高兴地发现居然有人愿意为此付钱。
人们有时说伟大的程序员对钱不在意。这并不完全对。他们真正在乎的,确实只有“做有趣的工作“。但如果你能赚到足够多的钱,你就可以做任何你想做的事,正因如此,黑客确实会被“赚一大笔钱“这件事吸引。但只要他们每天还得去公司上班,他们更在乎的就是在那里做什么,而不是为此能拿多少钱。
从经济角度看,这是一个最重要的事实,因为它意味着你不用按伟大的黑客真正的价值去给他们付钱。一个伟大的程序员可能比普通程序员有十倍甚至一百倍的生产力,但他能拿到三倍的工资就觉得自己很走运了。我后面会解释,这部分是因为伟大的黑客并不知道自己有多好。但也是因为钱并不是他们最想要的东西。
那么黑客想要什么?跟所有匠人一样,黑客喜欢好工具。其实这么说还是轻描淡写了。好的黑客觉得用烂工具是无法忍受的。他们干脆会拒绝在技术栈不对的项目上工作。
我以前在一家创业公司工作过,公司公告板上钉的东西里,有一张是 IBM 的广告。图上是一台 AS/400(IBM 中型机),标题大概是这么写的:“黑客鄙视它。” [1]
当你为一个项目决定采用什么技术栈时,你做的不仅仅是技术决策。你也在做一个社会决策,而后者可能比前者更重要。比如说,如果你的公司想写一些软件,用 Java 写听起来像个稳妥的选择。但当你选择一门语言,你也在选择一个社区。你在 Java 项目上能招到的程序员,不会有你在 Python 项目上能招到的那些聪明。而你的黑客的素质,大概比你选哪门语言更重要。不过坦白说,“好的黑客更喜欢 Python 而不是 Java“这一事实本身,应该已经能告诉你这两门语言的相对优劣了。
商务人士偏爱最流行的语言,因为他们把语言看作标准。他们不想拿公司去赌 Betamax(索尼 70 年代败给 VHS 的录像带格式)。但语言这东西,不只是标准。如果你要在网络上传输比特,那当然请用 TCP/IP。但编程语言不只是一种格式。编程语言是一种表达媒介。
我读到过 Java 刚刚超越 Cobol,成了最流行的语言。作为标准,你别无所求。但作为一种表达媒介,你完全可以做得更好。在我能想到的所有伟大程序员里,我只知道一个会自愿用 Java 编程。而我能想到的所有不在 Sun(Java 的母公司)做 Java 的伟大程序员里,这个数字是零。
伟大的黑客一般还坚持用开源软件。不仅是因为开源软件更好,也是因为它给了他们更多的控制权。好的黑客坚持要有控制权。这是他们之所以是好黑客的原因之一:当东西坏了,他们必须把它修好。你希望他们对你雇他们写的软件抱有这种态度。那他们对操作系统抱有同样的态度,你就不该觉得意外。
几年前一位做风投的朋友跟我说起他参与的一家新创业公司。听起来挺有前景。但下次我和他聊天的时候,他说他们决定基于 Windows NT(微软 90 年代企业级操作系统)来构建他们的软件,并且刚刚雇了一位非常资深的 NT 开发者来当首席技术官。我一听,就想,这帮家伙完蛋了。第一,这位 CTO 不可能是顶级黑客,因为要成为知名的 NT 开发者,他必须自愿地、反复地用 NT,我没法想象一个伟大的黑客会这么做;第二,就算他自己很厉害,他也很难再雇到任何厉害的人来给他打工——只要这个项目必须建在 NT 之上。 [2]
最后的疆域
仅次于软件,对一个黑客来说最重要的工具大概就是他的办公室。大公司认为办公空间的功能是体现层级。但黑客对办公室的用途不止于此:他们用办公室来思考。而如果你是一家科技公司,他们的思考就是你的产品。所以让黑客在嘈杂、容易被打断的环境下工作,就像开一家空气里全是煤灰的颜料厂。
漫画《呆伯特》(职场办公讽刺漫画)有大量笔墨在讲格子间,这是有原因的。我认识的所有黑客都鄙视格子间。仅仅是“可能被打断“这种前景,就足以让黑客没法去攻克难题。如果你想在一个有格子间的办公室里干点真正的活,你只有两种选择:在家工作,或者一大早、很晚、或者周末去公司——总之是没有别人在的时候。公司难道意识不到这是哪里出了问题的信号吗?办公环境本应是帮助你工作的东西,而不是你顶着它工作的东西。
像 Cisco 这样的公司很自豪自家每个人都坐格子间,连 CEO 也是。但他们并没有自己以为的那么先进;很显然,他们仍然把办公空间当作层级的勋章来看。还要注意的是,Cisco 出了名的几乎不做内部研发。他们获取新技术的方式是收购那些做出新技术的创业公司——而那些创业公司里,大概黑客们的确有安静的地方可以工作。
有一家大公司是真的懂黑客需要什么的,那就是 Microsoft。我曾经看过一张 Microsoft 的招聘广告,画面里是一扇巨大的门。意思是:来给我们工作吧,我们会给你一个真正能干活的地方。你知道的,Microsoft 在大公司里很特别——他们有能力做内部研发。也许做得算不上好,但好到够用。
如果公司想让黑客有产出,他们应该看看黑客在家做什么。在家里,黑客可以自己安排一切,把效率拉到最高。当他们在家工作时,黑客不会在嘈杂、开放的空间里工作;他们在有门的房间里工作。他们待在温馨、街区感强、周围有人、需要琢磨问题时还能出去走走的地方,而不是待在停车场之间的玻璃盒子里。他们有沙发可以在累了的时候打个盹,而不是像昏睡过去一样坐在桌前假装在工作。也没有一队拿吸尘器的人在每天晚上黄金黑客时段轰隆隆地穿过。没有会议,更没有什么——千万别——公司团建或团队建设活动。而当你看他们在那台电脑上做什么时,你会发现这印证了我前面关于工具的说法。他们在公司可能不得不用 Java 和 Windows,但在家里、在他们能自己选择的地方,你更可能看到他们用 Perl 和 Linux。
确实,“Cobol 或者 Java 是最流行的语言“这种统计数据可能会误导人。如果我们想知道哪种工具最好,我们应该看的是黑客在能自由选择时会选什么——也就是说,在他们自己的项目里。当你这样问时,你会发现开源操作系统其实已经占据了主导份额,而排名第一的语言大概是 Perl。
有趣
除了好工具,黑客还想要有趣的项目。是什么让一个项目有趣?嗯,明显地,那种一听就酷的应用,比如隐形飞机或者特效软件,做起来肯定有趣。但任何应用都可以变得有趣——只要它带来新的技术挑战。所以很难预测黑客会喜欢什么问题,因为有些问题只有当做的人发现了一种新的解决方案之后才变得有趣。在 ITA(为 Orbitz 写机票搜索引擎的公司)出现之前,做机票票价搜索的人大概觉得这是世上最无聊的应用之一。但 ITA 通过用一种更有野心的方式重新定义这个问题,把它变得有趣。
我觉得 Google 也发生过同样的事。Google 创立时,那些所谓的门户网站之间的传统智慧是:搜索很无聊,也不重要。但 Google 的人不觉得搜索无聊,正因如此他们才把它做得这么好。
这是管理者能起作用的一个领域。就像家长对孩子说“我打赌你十分钟内收拾不完整个房间“一样,一个好的管理者有时能把一个问题重新定义成一个更有趣的问题。史蒂夫·乔布斯似乎特别擅长这个,部分仅仅是因为他有很高的标准。Mac 出来之前,已经有一大堆又小又便宜的电脑了。他把问题重新定义成:做一台漂亮的。这大概比任何胡萝卜或大棒都更能逼出开发者的潜能。
他们也确实交付了。Mac 第一次出现的时候,你甚至不需要把它打开就知道它会很好;从外壳就能看出来。几周前我在剑桥(马萨诸塞州,哈佛/MIT 所在地)的街上走,看到有人扔的垃圾里好像有一个 Mac 的手提箱。我打开看,里面是一台 Mac SE(苹果 1987 年款 Macintosh)。我把它拎回家,插上电源,它就启动了。先是笑脸 Mac 图标,然后是 Finder(Mac 桌面系统的文件管理器)。天哪,真简洁。就跟……Google 一样。
黑客喜欢为有高标准的人工作。但仅仅是要求严格还不够。你必须坚持要的是对的东西。这通常就意味着你自己得是个黑客。我偶尔会看到关于“如何管理程序员“的文章。其实应该有两篇文章:一篇是给本身就是程序员的人看的,另一篇是给不是程序员的人看的。而第二种文章大概能浓缩成两个字:放弃。
问题不在于日常管理。真正好的黑客几乎是自我管理的。问题在于,如果你不是黑客,你就分辨不出谁是好的黑客。一个类似的问题解释了为什么美国汽车这么丑。我把它叫做设计悖论。你也许会想,要让你的产品好看,雇一个伟大的设计师来设计就行了嘛。但如果你自己没有好品味,你怎么辨认得出一个好的设计师?根据定义,你没法从他的作品集里看出来。你也不能靠他得过的奖、做过的工作来判断,因为在设计领域和大多数领域一样,这些东西更多是被时尚和拉关系驱动的,真正的能力排第三,而且差得远。这事没法绕过去:你没法在不知道“美“为何物的前提下去管理一个旨在产出美的东西的过程。美国汽车难看,是因为美国汽车公司由没品味的人在管。
这个国家很多人觉得品味是某种难以捉摸、甚至是无关紧要的东西。其实都不是。要驱动设计,一个管理者必须是公司产品最挑剔的用户。如果你真的有好品味,你就能像史蒂夫·乔布斯那样,把“让你满意“变成那种厉害的人喜欢去做的问题。
糟糕的小问题
什么样的问题不有趣,倒是很容易说清楚:那些不是让你解决几个又大又清晰的问题,而是让你解决一大堆糟糕的小问题的项目。最糟糕的项目类型之一,就是给一个充满 bug 的软件写接口。另一种是你必须为某个客户复杂又模糊的需求做定制。对黑客来说,这种项目就是凌迟般的折磨。
糟糕的小问题最显著的特征是:你从中什么也学不到。写一个编译器很有趣,因为它教会你“编译器是什么“。但给一个有 bug 的软件写接口教不了你任何东西,因为那些 bug 是随机的。 [3] 所以让好的黑客回避糟糕的小问题的不只是挑剔。这更像是自保。研究糟糕的小问题会让你变蠢。好的黑客回避它们,跟模特躲开芝士汉堡是一个道理。
当然,有些问题天生就是这种性质。出于供需关系,它们的报酬还特别高。所以一家能让伟大的黑客去做枯燥问题的公司会非常成功。怎么做到呢?
发生这种情况的一个地方就是创业公司。在我们当年的创业公司里,Robert Morris(早期互联网蠕虫作者,PG 合伙人)做的是系统管理员。那就像让滚石乐队来给犹太成人礼演出。这种水准的人才你是雇不来的。但只要是自己作为创始人的公司,人们什么样的杂活都愿意干。 [4]
更大的公司用拆分公司的办法解决这个问题。他们建一个独立的研发部门,让员工不用直接去面对客户那些糟糕的小问题,以此把聪明人吸引进来。 [5] 在这种模式下,研究部门的功能就像一座矿山。他们生产出新想法;说不定公司的其他部分能用得上。
你不一定非要走这种极端。自底向上编程提示了另一种拆分公司的办法:让聪明人去做工具制造者。如果你的公司做的软件是用来做 x 的,那就让一组人专门搭建写这一类软件用的工具,再让另一组人用这些工具来写应用。这样你也许能让聪明人写下你 99% 的代码,同时几乎像传统研究部门一样把他们与用户隔开。工具制造者也有用户,但用户只会是公司自己的开发者。 [6]
如果 Microsoft 用了这种办法,他们的软件就不会有这么多安全漏洞,因为不那么聪明的、写实际应用的人就不会去做内存分配这种底层的事。他们就不会直接用 C 来写 Word,而是把 Word 语言的大块乐高积木拼起来。(专业术语应该叫“得宝“——乐高的更大颗粒系列,给幼童用。)
扎堆
除了有趣的问题,好的黑客还喜欢的就是其他好的黑客。伟大的黑客倾向于扎堆——有时扎堆扎得相当壮观,比如施乐 PARC。所以你能吸引到的好黑客的数量,并不会与你为他们创造的环境的质量成线性比例。扎堆这一倾向意味着,效果更像环境的平方。所以这是赢家通吃。在任何一个时间点,黑客最想去的地方大概只有十到二十个,如果你不是其中之一,你不仅会有更少的伟大黑客,你的伟大黑客数会是零。
光是拥有伟大的黑客,本身并不足以让一家公司成功。这对 Google 和 ITA 来说挺有用——它们都属于当下的热点——但它没救得了 Thinking Machines(1980 年代超算公司)或 Xerox。Sun 有一段时间跑得不错,但他们的商业模式是一台向下的电梯。在这种情况下,再好的黑客也救不了你。
不过我觉得,在其他条件相同的情况下,能吸引到伟大黑客的公司会有巨大的优势。有些人不会同意这一点。九十年代我们去找一家又一家风投时,有好几位告诉我们,软件公司不是靠写出伟大的软件赢,而是靠品牌、靠垄断分销渠道、靠把交易谈对。
他们似乎是真的相信这套,我也觉得我知道为什么。我想,很多 VC——至少在潜意识里——找的是下一个微软。当然,如果微软是你的范本,你就不该去找那种希望靠写出伟大软件取胜的公司。但 VC 找下一个微软是错的,因为没有任何创业公司能成为下一个微软——除非有另外一家公司准备好在恰好的那个时刻躬身让位,去当下一个 IBM。
把微软当作范本是一个错误,因为他们整个文化都来自那一次走运。微软是一个坏的数据点(统计学梗)。如果你把他们排除掉,你会发现好产品在市场上的确倾向于胜出。VC 该找的,是下一个苹果,或者下一个 Google。
我想比尔·盖茨知道这一点。让他担心 Google 的不是它品牌的力量,而是它有更好的黑客这一事实。 [7]
辨认
那么伟大的黑客都是谁?你遇到他们时怎么知道?这事原来非常难。连黑客自己都看不出。我现在相当确定我朋友 Trevor Blackwell(PG 朋友,自制 Segway)是一个伟大的黑客。你可能在 Slashdot(程序员/极客新闻聚合站)上读过他怎么自制了一台 Segway(双轮自平衡车)。这个项目最了不起的地方是,他用一天就把所有软件写完了(顺便说一下,是用 Python 写的)。
对 Trevor 来说,这只是家常便饭。但当我第一次见到他时,我以为他是一个彻头彻尾的傻子。他当时站在 Robert Morris 的办公室里,对着 Robert 叽叽咕咕讲什么我也忘了,我还记得我站在他身后,疯狂地朝 Robert 打手势——把这个疯子轰出去,咱们好去吃午饭。Robert 说他一开始也看走眼了。看样子 Robert 第一次见到 Trevor 时,Trevor 刚开始一个新方案:把自己生活的方方面面里的每一件事都写在一摞索引卡片上,随身带着这摞卡片到处走。他当时也刚从加拿大过来,操着一口很重的加拿大口音,留着一个鲻鱼头(前短后长的发型)。
让这件事更复杂的是,黑客虽然有“社交迟钝“的名声,有时候却会下不少功夫让自己显得很聪明。我在读研的时候经常去 MIT AI 实验室晃。一开始那地方还有点吓人,每个人说话都那么快。但过了一阵子,我就学会了“说话快“的窍门。你不需要想得更快,只要说的时候每句话用两倍的词数就行。
信号里有这么多噪声,你遇到好黑客的时候很难辨认出来。我现在都辨认不出。你也没法从他们的简历里看出来。看上去判断一个黑客的唯一办法就是和他在某件事上一起做。
这也是为什么高科技园区只在大学周围出现。这里的有效成分与其说是教授,不如说是学生。创业公司在大学周围长起来,是因为大学把有前景的年轻人聚到一起,让他们做同样的项目。聪明人会发现谁是别的聪明人,他们一起再去琢磨自己的新项目。
因为你只能通过和黑客一起做事来辨认伟大的黑客,所以黑客自己也分不清自己有多好。这一点在大多数领域都成立。我发现那些在某件事上很伟大的人,与其说是确信自己很伟大,不如说是困惑——为什么别的人看起来都那么差劲。
但黑客判断自己有多好特别难,因为他们的工作很难拿来比较。这在大多数其他领域都更容易。一百米跑里,10 秒内你就知道谁最快。就连数学里也似乎有一个普遍共识,关于哪些问题难解、什么样的解算好。但黑客这件事,就像写作。两本小说哪一本更好,谁能说得清?反正不是作者本人。
至少在黑客之间,别的黑客能看出来。这是因为,跟小说家不同,黑客在项目上合作。当你能把几个难题隔着球网打到对方那一边时,你很快就能学到他打回来打得有多狠。但黑客没法看自己干活。所以如果你问一个伟大的黑客他有多好,他几乎一定会回答:我不知道。他不只是谦虚。他是真的不知道。
而我们当中没有人知道——除了对那些我们真正一起共事过的人。这让我们处在一个奇怪的境地:我们不知道我们的英雄该是谁。出名的黑客,往往是因为公关上的偶然事件而出名的。我偶尔需要举一个伟大的黑客作例子,我从来不知道该用谁。第一个浮现在脑海里的总是我个人认识的人,但用他们似乎有点逊。所以,我想,也许我该说 Richard Stallman(自由软件运动发起人),或者 Linus Torvalds(Linux 创始人),或者 Alan Kay(Smalltalk 之父),这些名声很大的人。但我并不知道这些人是不是伟大的黑客。我从来没和他们在任何事情上合作过。
如果黑客界存在一个迈克尔·乔丹,没人知道——他自己也不知道。
培养
最后,是黑客们一直在琢磨的那个问题:怎样才能成为一个伟大的黑客?我不知道一个人是否真能把自己变成那样。但有些事情确实能让你变蠢,这是肯定的——而如果你能让自己变蠢,那大概也能让自己变聪明。
成为好的黑客,关键也许在于做你喜欢的事。当我想到我认识的那些伟大的黑客,他们身上有一个共同点:要让他们去做不想做的事,难得不得了。我不知道这是因还是果,也许两者都是。
要把一件事做好,你必须爱它。所以,只要你能把“黑客“这件事保留为自己所爱的事,你大概就能做得不错。试着保留你 14 岁时对编程的那种惊奇感。如果你担心现在的工作正在腐蚀你的脑子,那它多半就是。
最厉害的黑客往往很聪明,这当然没错——可这在很多领域都成立。有没有什么品质是黑客独有的?我问过几个朋友,他们提到最多的一条是“好奇心“。我一直以为聪明人都好奇——好奇就是知识的一阶导数。但显然黑客特别好奇,尤其是对“事情是怎么运作的“这件事。这也讲得通,因为程序本质上就是对“事情是怎么运作的“的庞大描述。
好几个朋友提到了黑客的专注能力——其中一个是这么说的,他们能“屏蔽脑袋外的一切“。这一点我确实注意到了。我也听过好几个黑客说,他们哪怕只喝了半杯啤酒,就完全没法编程了。所以编程也许真的需要某种特殊的专注能力。也许伟大的黑客能把大量上下文一次性装进脑子里,所以当他们看一行代码时,看到的不止那一行,而是它周围的整段程序。John McPhee(美国非虚构作家)写过,Bill Bradley(1970 年代 NBA 球员)作为篮球运动员的成功,部分得益于他超凡的周边视觉。“完美“的视力大约意味着垂直方向 47 度的周边视野;Bill Bradley 有 70 度——他低头看地板时也能看见篮筐。也许伟大的黑客也有某种类似的天赋。(我作弊——用一种极其密集的语言,把球场缩小。)
这或许能解释关于格子间的那种鸡同鸭讲。也许那些管行政设施的人,因为自己根本没什么专注力可言,就完全意识不到:对一个黑客来说,在格子间里工作,感觉就像脑子被塞进了搅拌机里。(而比尔·盖茨——如果关于他自闭症的传闻属实——则太清楚这种感觉了。)
我注意到伟大的黑客和一般聪明人之间的一个区别是:黑客更政治不正确。好的黑客之间如果说有什么暗号,那就是当他们彼此熟到一定程度时,会互相说出那些在大众面前会被乱石砸死的观点。我也明白为什么“政治不正确“在编程里会是个有用的品质。程序非常复杂,而且至少在好程序员手里,它非常灵活可塑。在这种情境下,养成质疑前提假设的习惯是很有帮助的。
这些品质能不能培养出来?我不知道。但你至少可以不去压制它们。所以这里是我能给出的最佳配方。如果一个人确实有可能把自己变成伟大的黑客,那办法或许是与自己立下这样一个约定:你永远不必做无聊的项目(除非你家人会因此饿死),作为交换,你绝不允许自己做马虎活。我认识的所有伟大的黑客似乎都立过这个约定——尽管他们当中或许并没几个人有别的选择可言。