读《黑客与画家》


一杯清水因滴入一滴污水而变污浊,一杯污水却不会因一滴清水的存在而变清澈。

作者简介:保罗•格雷厄姆,《黑客与画家》一书的作者,硅谷创业之父。1964年,出生于匹兹堡郊区的一个中产阶级家庭。父亲是设计核反应堆的物理学家,母亲在家照看他和他的妹妹。青少年时代,格雷厄姆就开始编程。但是,他还喜欢许多与计算机无关的东西,这在编程高手之中是很少见的。

保罗•格雷厄姆在康奈尔大学读完本科,然后在哈佛大学获得计算机科学博士学位。1995年,他创办了Viaweb,帮助个人用户在网上开店,这是世界上第一个互联网应用程序。1998年夏天,Yahoo!公司收购了Viaweb,收购价约为5000万美元。

此后,他架起了个人网站paulgraham.com,在上面撰写了许许多多关于软件和创业的文章,以深刻的见解和清晰的表达而著称,迅速引起了轰动。2005年,他身体力行,创建了风险投资公司Y Combinator(Y运算子,简称YC,Y Combinator是一个编程术语,意思是创造其它函数的函数),将己的理论转化为实践,目前已经资助了80多家创业公司。现在,他是公认的互联网创业权威。


《黑客与画家:硅谷创业之父Paul Graham文集》主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。书中的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解我们这个时代、迫使读者独立思考。

为什么书呆子不受欢迎

“书呆子”与“高智商”有强烈的正相关关系,你越喜欢读书,就越不受别人的欢迎,因此“书呆子”和“受欢迎”之间,有一种更强烈的负相关关系。这样看来,“高智商”似乎导致了你不受欢迎。道理应该是浅显直白的,爱读书的人一般不愿意和无聊或低俗的人去讨论生活的乐趣以及人生的意义,相对地,他们更愿意花时间独处,去汲取未知世界的养分,成长自己。而人际关系又多数是和彼此之间的交流或者共同的生活交织在一起,这样就自然导致独处的人不容易受到别人的欢迎,但是记住天才都是孤独的,没人能跟得上他们思维的脚步,他们也不愿意停留,而是一直进取。这些都是我的个人见解,在本书中,作者认为书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。他们的注意力都放在读书或者观察世界上面,而不是放在穿衣打扮、开晚会上面。

黑客与画家

判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。我们大概都认识这样一些人,他们在其它方面非常聪明,但是把问题解释清楚的能力却惊人低下。软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知。基于这些原因,也导致了目前软件世界里面的主流问题,软件工程师看用户就像傻瓜一样,用户呢?看开发软件的人也像傻瓜一样,互相看不上,互相不理解。所以技术人员也要适当的学会换位思考,这样才能够开发出更符合大众水平更加流行的优秀作品。如果只能让别人记住一句关于编程的名言,那么这句名言就是《计算机程序的结构与解释》一书的卷首语:“程序写出来是给人看的,附带能在机器上运行”。

“换位思考”不仅是为了你的用户,也是为了你的读者。这对你是有利的,因为你也会读自己写的东西。许多黑客六个月后再读自己的程序,却发现根本看不懂它是怎么运行的。注意一点,把代码写得便于阅读,并不是让你塞进去很多注释。只有在那些不太成熟、容易出现问题的地方,你才应该加上注释,提醒读者注意那里,就好像公路上只有在急转弯处才会出现警示标志一样。

不能说的话

要是能坐上时间机器回到过去,不管哪一个年代,有一件事都是不会改变的,那就是“祸从口出”。你一定要小心自己说的话,自以为无害的言论会给你惹来大麻烦。历史的常态似乎就是,任何一个年代的人们,都会对一些荒谬的东西深信不疑。他们的信念还很坚定,只要有人稍微表示一点怀疑,就会惹来大麻烦。我们这个时代是否有所不同?只要读过一点历史,你就知道答案几乎确定无疑,就是“没有不同”。即使有那么一丝微小的可能,有史以来第一次,我们这个时代的所有信念都是正确的,那也是处于惊人的巧合,而不是因为我们真正找到了正确的方向。我想作者应该是没有读过中国历史,否则他就会知道不仅有些话不能说,而且还不能写出来,这都要拜大清朝特有的文字狱所赐。

良好的坏习惯

不少公司都想知道,什么事情可以外包(指的是聘请另一个公司来执行,而不是指把业务部门转移到海外),什么事情不可以外包。一个可能的答案是,公司内部所有不直接感受到竞争压力的部门都应该外包出去,让他们暴露在竞争压力之下。

如何创造财富

从经济学观点看,你可以把创业想象成一个压缩过程,你的所有工作年份被压缩成了短短几年。你不再是低强度地工作四十年,而是以极限强度工作四年。在高技术领域,这种压缩的回报尤其丰厚,工作效率越高,额外报酬就越高。

一个大学毕业生总是想“我需要一份工作”,别人也是这么对他说的,好像变成某个组织的成员是一件多么重要的事情。更直接的表达方式应该是“你需要去做一些人们需要的东西”。公司不过是一群人在一起工作,共同做出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司。

要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。就算你无法测量每个员工的贡献,但是你可以得到近似值,那就是测量小团队的贡献。一般情况下,小型团队都由多人组成。只有表演或写作这样的特殊工作,你才会一个人单干。你最好找出色的人合作,因为他们的工作和你的一起平均计算。团队越大,每个人的贡献就越接近于整体的平均值。

如果你有两个选择,就选择较难的那个。如果你要选择是坐在家里看电视,还是外出跑步,那就出去跑步吧。这个方法有效的原因可能是遇到两个一难一易的选择时,往往出于懒惰的缘故,你会选择较易的那个选项。在意识深处,你其实知道不懒惰的做法会带来更好的结果,这个方法只是迫使你接受这一点。

关于工业革命的起因,已经有大量的文献论述过。但是,创造财富的人能够心安理得地享用自己的财富,这确实是工业革命的一个必要条件。如何从经济学观点看什么是创业公司呢?简单说,就是可以让人更快速工作的地方。你不再是慢慢地积累50年的普通工资,而是要尽快地将这笔钱赚到手。所以,政府禁止个人财富积累实际上就是命令人民减慢工作的速度。缓慢工作的后果并不仅仅是延迟了技术革新,而且很可能会扼杀技术革新。只有在快速获得巨大利益的激励下,你才会去挑战那些困难的问题,否则你根本不愿意去碰它们。冷战、第二次世界大战、近代的大多数战争都说明了这个道理。要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住它们的血汗钱,你就会无敌于天下。

别老是想着去赚世界上的钱,而是应该想着为世界创造财富,当你真的能为世界创造财富的时候,金钱也就会找上你了。假设你拥有一辆老爷车,你可以不去管它,在家中悠闲度日,也可以自己动手把它修葺一新。这样做的话,你就创造了财富。世界上因为多了一辆修葺一新的车,财富就变的更多了一点,对你尤其是如此。财富和金钱完全是两码事,请大家不要混淆一谈,你拥有财富,比如技术、人脉、后台等等,这些都是可以帮你赢得金钱的,但是你拥有金钱不一定比财富来的稳固,如果被政府没收的话,你还能不能赚到这么多的金钱,但是拥有财富的人是不一样的,财富是别人无法夺走的,哪怕你现在是个穷光蛋,你都有可能随时变成百万富翁。

程序员创造财富的速率存在巨大的差异,一个优秀的程序员连续工作几个星期就可以创造价值100万美元的财富。同样的时间内,一个平庸的程序员不仅无法创造财富,甚至还可能减少财富(比如引入了bug)。这就是为什么如此之多的最优秀程序员都是自由主义者的原因。我们这个世界,你向下沉沦或者向上奋进都取决于你自己,因为最顶尖的5%的程序员写出了全世界99%的优秀软件。

创造财富不是致富的唯一方法,在人类的历史长河中,它甚至不是最常见的方法。就在几个世纪前,财富的主要来源还是矿石、奴隶、农奴、土地、牲畜,而快速获得财富的方法只有继承、婚姻、征服、没收。

关注贫富分化

事实上,财富与金钱是两个概念。金钱只是用来交易财富的一种手段,财富才是有价值的东西,我们购买的商品和服务都属于财富。财富从何而来?人类创造出来的。财富总量不是固定不变的,不像大饼那样会被分光。如果你想要更多的财富,自己生产就可以了。由于每个人创造财富的能力和欲望强烈程度都不一样,所以每个人创造财富的数量很不平等。

作者提出了一种关于贫富分化的新观点,即现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大,如果这种扩大没有反映在收入上面,只有三种可能的解释:(1)技术革新停顿了;(2)那些创造大部分财富的人停止工作了;(3)创造财富的人没有获得报酬。如果想社会繁荣而不扩大贫富分化,可以反推(1)(2)的可能性不大,那么只能是(3)。但是如果得不到报酬,人们是否愿意创造财富?唯一的可能就是,工作必须提供乐趣。

如果创业就是比别人工作的更勤奋、赚到更多的钱,那么很显然人人都想去创业。而且一定程度上,创业也比较有趣。但创业是有一些潜规则的,其中一条就是很多事情由不得你。比如,你无法决定到底付出多少。你只想更勤奋工作2到3倍,从而得到相应的回报。但是,真正创业以后,你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。另一条潜规则就是,创业的付出与回报虽然总体上是成比例的,但是个体上是不成比例的。对于个人来说,付出与回报之间存在一个很随机的放大因子。你努力了30倍,最后得到的回报在现实中并不是30倍,而是0到1000倍之间的一个随机数。假定所有创业者都是努力30倍,最后他们得到的总体平均回报是30倍,但中位数却是0。大多数创业公司都以失败告终,其中并不都是很烂的项目,一种很普遍的情况是,某个创业公司确实在开发一个很好的产品,但是开发时间长了一点,结果就是资金用完,关门散伙。创业公司如同蚊子,往往只有两种结局,要么赢得一切,要么彻底消失。

防止垃圾邮件的一种方法

在所有对抗垃圾邮件的方法之中,“贝叶斯过滤”是最有效的工具。但是,使用的不同方法越多,综合效果就越好,因为任何对发送人构成限制的方法往往都会使得过滤器工作起来更顺利。即使同样是基于内容的过滤器,我也认为,如果有多种不同的软件可以同时使用会比较好。过滤器的差异越大,垃圾邮件想要逃过拦截就越不可能。

设计者的品味

  • 好设计是简单的设计
  • 好设计是永不过时的设计
  • 好设计是解决主要问题的设计
  • 好设计是启发性的设计
  • 好设计通常是有点趣味性的设计
  • 好设计是艰苦的设计
  • 好设计是看似容易的设计
  • 好设计是对称的设计
  • 好设计是模仿大自然的设计
  • 好设计是一种再设计
  • 好设计是能够复制的设计
  • 好设计常常是奇特的设计
  • 好设计是成批出现的
  • 好设计常常是大胆的设计

编程语言解析

如果你长期使用某种编程语言,你就会慢慢按照这种语言的思维模式进行思考。所以,后来当你遇到其它任何一种有重大差异的语言,即使那语言本身并没有任何不对的地方,你也会觉得它极其难用。

计算机程序只是文本而已,你选择什么语言,决定了你能说什么话,编程语言就是程序员的思维方式。如果你仅仅是要养家糊口,那么劝你最好选择市场流行的以及未来一段时间内仍然会流行的语言,这样你才不会被市场抛弃,而且可以更容易的找到工作。但是如果你要做的是黑客级别的技术高手,那么一个锋利的工具对你会更有帮助。

最优秀的苹果机为什么在市场上表现不佳?还是那个老生常谈的问题:成本太高。微软公司把所有精力都集中在软件上面,微软到现在依然是靠它三个最赚钱的部门即Windows、Office和服务器三大部门来支撑它的整个商业帝国,这些都是微软之根本所在,如果你想要打败微软,那么首先想想这三个里面你能消灭掉哪个,如果你最多消灭两个,那么劝你早日投降,因为结局已定。所以我不反对企业做大做强,但是正如李嘉诚所说的,你一定要有一个支柱性产业,当你的其他方向的发展还没有实现盈利的时候,你的支柱性产业的利润就可以用来培育那些将来可能盈利的方向。同时一旦出现大的金融动荡,你依然能够保证进退自如,因为你始终有一个可以为公司带来利润的产业。所以很多厂商只要专攻硬件就可以了,把硬件成本降了下来。单单是微软的软件或者第三方厂商的硬件都不足以赢得市场优势,但是它们结合起来,就在个人电脑出现后一段关键时期中主导了市场。苹果公司同时做软件和硬件,所以成本上没有优势。IBM的PC机也面临类似的问题,它的PC机卖的相当的贵,质量也很好,但是却没能统治市场,为什么?因为IBM的机器设计的所使用的都是可以用十年甚至更久都不会出现问题的部件与材料,但是现在的电子消费品更新的如此之快,用户干嘛要花那么多钱去买一个他只准备用两年或三年的产品,但是这个产品却可以用十年都没有质量问题,所以说成本是产品占领市场不得不考虑的一个问题。

1998年,当时的搜索市场由雅虎统治,许多人认为再推出一个新的搜索引擎已经太晚了,互联网世界已经定型了。谷歌证明了这种看法是错误的。如果新事物真的有重大改进,那么它总是可以找到生存空间的。就像中国的人人网,模仿的是facebook,但是在人人之后,不是依然有程炳皓做出来的开心网吗,当初为什么开心败在了人人的手下,最根本的问题就是程炳皓根本不是陈一舟的对手,陈一舟是一个在商场里浸淫N年之久的老江湖,而程炳皓呢,仅仅是一个技术了得的技术员而已,所以开心的域名是kaixin001,当年有人劝程把kaixin这个域名买过来(因为创办开心网的时候,这个域名被老外注册过了),但是程根本不把此事放在心上,所以当人人对开心发起攻击的时候,陈一舟做的第一件事就是把kaixin这个域名买到手,然后利用许多用户的无知,把大量的用户引入到了这个假的开心网之上,即便后来陈一舟输了官司,关闭了kaixin,但是依然有大量的用户访问这个域名,而结果就是访问之后页面自动跳转到renren上了。所以对于开心输给人人之事,我不想多说,根本原因就是你不是人家的对手,所以输给别人也是再正常不过的了(说真的我很欣赏程炳皓这个人,一个许多人都应该学习的典范,一个中专学历的人,凭着自己对技术的钻研,到创办开心网,差点功成名就,只不过是由于不太懂得商场的残酷,而最终失败)。

我要纠正一个常识性的错误,几乎我碰到的所有的人都说虽然编程语言不同,但是你会了某种语言,其他的也就会了。我从来就没有这么认为过,首先不说他们的语法特点设计不同,就是语言的设计思想也没有一样的,另外每个语言都有每个语言所擅长的方向,经常看到有人拿Java和C++比速度,我觉得这种人就是无知,就像你拿男人和女人比谁的胸大是一回事,对于那些攻击Java速度的人,你怎么不比较Java和C++的跨平台能力呢?让我们复习一下Java的口号–“Write once, run ererywhere (WORA)”。请你们多多读书,提高修养。另外一点就是人们经常拿链表和数组比添加删除元素时候的速度,但是你有没有想过,你要添加删除某个元素是需要先找到它的,而数组的查找比链表要快的多的多,链表的添加删除是比数组快,但是如果我有几百万个元素,而我想删中间一个元素,数组可以直接定位,但是链表要查找将近一半的元素。谁快谁慢一目了然。如果你长期使用某种语言,你就会慢慢按照这种语言的思维模式进行思考。所以,后来当你遇到其他任何一种有重大差异的语言,即使那种语言本身并没有任何不对的地方,你也会觉得它及其难用。缺乏经验的程序员对于各种语言优缺点的判断经常被这种心态误导。一种编程语言能否流行并不取决于它本身,大多数程序员也许无法分辨语言的好坏。但是,这并不代表优秀的编程语言会被埋没,专家级的黑客一眼就能认出它们,并且会拿来使用。一种真正的优秀的编程语言应该既整洁又混乱。“整洁”的意思是设计得很清楚,内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。“混乱”的意思是它允许黑客以自己的方式使用。

一百年后的编程语言

编程语言进化缓慢的原因在于它们并不是真正的技术。语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。所以编程语言的进化速度更像数学符号的进化速度,而不像真正的技术的进化速度。数学符号的进化是缓慢的渐变式变化,而不是真正技术的那种跳跃式发展。

拒绝平庸

如果从图灵等价的角度来看,所有语言都是一样强大的,但是这对程序员没有意义。程序员关心的那种强大也许很难正式定义,但是有一个办法可以解释,那就是有一些功能在一种语言中是内置的,但是在另一种语言中需要修改解释器才能做到,那么前者就比后者更强大。

技术的变化速度通常是很快的。但是编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。所以,一种很普通的编程语言就是很普通的程序员使用的语言,它的变化就像冰山那样缓慢。

书呆子的复仇

衡量语言的编程能力的最简单方法可能就是看代码数量。所谓高级语言,就是能够提供更强大抽象能力的语言,从某种意义上,就像能够提供更大的砖头,所以砌墙的时候用到的砖头数量就变少了。因此,语言的编程能力越强大,写出来的程序就越短。

梦寐以求的编程语言

优秀的语言不一定会被市场接受,很可能无人使用,因为语言的流行不取决于它本身。语言流行的秘诀必须要涵盖以下几点,一种免费的实现,一本相关的书籍,以及语言所依附的计算机系统,除此之外还必须要简洁。其它特点还有诸如可编程性、一次性程序、精心设计的函数库、效率等。

设计与研究

设计与研究的区别看来就在于,前者追求“好”,后者追求“新”。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的。作者认为两条道路最后会发生交叉:只有应用“新”的创意和理念,才会诞生超越前人的最佳设计;只有解决那些值得解决的难题,才会诞生最佳研究。所以设计和研究都通向同一个地方,只是前进的路线不同罢了。

坚持原创技术分享,您的支持将鼓励我继续创作!