黑客与画家是硅谷创业之父Paul Graham 的文集,介绍优秀程序员(黑客)的爱好与动机,书中的内容有助于我们了解计算机编程的本质、互联网行业的规则,同时让我们思考这个时代。
Paul Graham(保罗•格雷厄姆)介绍
1964年,保罗•格雷厄姆出生于匹兹堡郊区的一个中产阶级家庭。父亲是设计核反应堆的物理学家,母亲在家照看他和他的妹妹。
青少年时代,格雷厄姆开始编程。但他还喜欢许多与计算机无关的东西,这在编程高手之中很少见。
大学时代,保罗•格雷厄姆在康奈尔大学读完本科后在哈佛大学获得计算机科学博士学位。
1995年,他创办了Viaweb,帮助个人用户在网上开店,这是世界上第一个互联网应用程序。1998年夏天,Yahoo!公司收购了Viaweb,收购价约为5000万美元。
之后他在个人网站paulgraham.com上写了许多关于软件和创业的文章,以深刻的见解和清晰的表达而著称,迅速引起了轰动。
2005年,他创建了风险投资公司Y Combinator,将自己的理论转化为实践,目前已经资助了80多家创业公司。现在,他是公认的互联网创业权威。
黑客与画家目录
1.为什么书呆子不受欢迎——他们的心思在别的地方。
2.黑客与画家——黑客也是创造者,与画家、建筑师、作家一样。
3.不能说的话——如果你的想法是社会无法容忍的,你怎么办?
4.良好的坏习惯——与其他美国人一样,黑客的成功秘诀就是打破常规。
5.另一条路——互联网软件是微机诞生后的最大机会。
6.如何创造财富——致富的最好方法就是为社会创造财富。创造财富的最好方法就是创业。
7.关注贫富分化——“收入分配不平等”的危害,会不会没有我们想的那样严重?
8.防止垃圾邮件的一种方法——不久前,许多专家还认为无法有效地过滤垃圾邮件。本文改变了他们的想法。
9.设计者的品味——如何做出优秀的东西?
10.编程语言解析——什么是编程语言?为什么它们现在很热门?
11.一百年后的编程语言——一百年后,人类怎样编程?为什么不从现在开始就这样编程呢?
12.拒绝平庸——别忘了你的对手与你一样,能用任何想用的语言编写互联网软件。
13.书呆子的复仇——在高科技行业,只有失败者采用“业界最佳实践”。
14.梦寐以求的编程语言——一种好的编程语言,是让黑客可以随心所欲使用的语言。
15.设计与研究——研究必须是“新”的,而设计必须是“好”的。
黑客与画家章节内容节选
我读完计算机本科以后,去艺术学校学习绘画。许多人感到奇怪,喜欢计算机的人也会喜欢美术吗?他们大概认为编程序和画画是两种完全不同的工作,编程需要冷静,精密,和正确的方法,而画画是表达某种狂热的情感。
这种印象是不对的,编程和画画有很多共同之处,实际上,在我认识的不同类型的人中间,画家和黑客是最相似的。
画家和黑客的相似之处在于:他们都是创造者,就好像作曲家,建筑师,以及作家一样。
他们的目的是创造某种美好的事物。尽管在创造的过程中,也许会发现新技术,但他们的根本目的并不是研究技术。
我想黑客不得不接受名声上的不确定性,这一点上, 他们和其他创造者没什么不同。实际上比较起来还要幸运一些。在编程领域,一时的流行风气虽然也有影响,但没有绘画领域那么大。
还有比别人的误解更糟的事情。更糟的危险是你可能自己误解自己。你通常在相关领域寻找灵感。如果你在计算机系,很自然地会以为,编程的本质就是实现计算机理论。
我读本科的时候有一种令我很不舒服的感觉,我觉得自己应当多学一点计算机理论,可是期末考试完了不到三个礼拜,我就把那些东西全忘光了。这让我觉得自己不够尽责。
现在我认识到我那时的想法都是错误的。黑客对计算机理论的了解程度,只要达到画家对颜料化学所了解的程度就够了。
你应当知道怎样计算时间和空间复杂度,知道图灵机模型。也许应当知道状态机,至少知道这个概念,如果要写语法解析或者正则表达式库的时候会用得到。画家对颜料的学问上,要记的东西比这还要多一些。
对我来说,灵感的源泉不是来自于那些挂着计算机招牌的地方,而是那些聚集着创造者的地方。
我从绘画方面得到的灵感比我从计算机理论上得到的,要多得多。
打个比方。我上学的时候,学生在上机之前,要把整个程序先用纸笔写出来。可是我觉得这不是我写程序的方式。我喜欢坐在计算机前面写程序,根本不用纸笔,好长一段时间我都感到很沮丧。
我不喜欢在纸上先写出程序并检验正确性,而是喜欢先敲一段代码,然后慢慢敲打成型。我受到的教育告诉我,调试应当是检查输入错误的最后一关,而按照我的方式,程序基本上就是调试出来的。
如果那会我知道别的创造者-比如画家和建筑师-的做法的话,我就早该知道这种方法的名字是:打草稿。
我可以告诉你,他们在大学时教我的方法是错的。你应当是一边写程序一边来确定程序的走向, 这和画家, 作家以及建筑师的做法完全一样。
这里蕴涵着软件设计的真义, 认识到这一点, 就意味着程序语言应当首先要具有延展性。语言要有助于在编程中思考, 而不是仅仅表达思考的结果。
程序语言应该象铅笔, 而不是象钢笔。
我们需要这样一种语言, 我们用它来随意涂抹。而使用静态类型语言编程序的感觉, 就好象手放在膝盖上, 小心翼翼握着茶杯, 正襟危坐着和一个严肃的老太太谈话。
谈论创造者这种话题, 我们除去了另外一个困扰的科学的问题: 数学嫉妒。科学界的每个人暗地里都认为数学家比自己聪明。我想数学家们自己大概也这么认为。
反正科学家们总是把自己的作品弄得象数学论文一样。这对物理学倒还没什么大害, 但是你要是在自然科学上走得越远, 就越发现这个问题的严重性。
如果黑客认同创作者的身份, 像是画家和作家一样, 他们就不会受此诱惑。作家和画家才不理会数学呢, 根本就是不相干的事情。我认为, 黑客也应当这样看。
如果大学和研究所不让黑客做自己想做的事情, 他们还可以去公司, 可惜, 公司和大学的做法是一丘之貉。
大学和研究所要求黑客当科学家, 而公司要求黑客当工程师。
我也是最近才发现这问题的。Yahoo买了Viaweb之后, 他们问我的意向, 我一向就不喜欢商业公司, 我就说我还是想编程序。进了Yahoo以后, 我发现在他们那里, 编程序的意思就是代码实现, 和设计没关系。程序员就是代码工人, 他们把产品经理的愿望, 以代码形式记录下来。
看起来这是大公司的一贯的做法。这样做的目的是减低工作的偏差。只有少数程序员真正懂得设计软件, 而且这些有才能的人很不容易一下子识别出来。
所以与其把软件的未来寄托在少数聪明人身上, 不如把软件设计让一个委员会来做, 程序员只管编码实现。
如果你想赚钱, 那么记住我的话, 因为我讲的正是小公司取胜的机会。
大公司采取保险的做法, 意图规避风险。但是试图限制这种工作效果上的震荡的时候, 固然避免了最坏的可能但也失去了最好的。这对大公司当然不是问题, 大公司取胜的原因不是因为发明了伟大的产品, 而是因为犯的错误比其他大公司少而已。
如果你有办法和一个大公司竞争某种产品, 这个公司的产品是产品经理们设计的, 那么, 他们永远赶不上你。不过这样的机会很不容易找到。你很难和大公司卷入软件竞争, 就好比你很难和对手在城堡里徒手搏斗一样。
写一个比微软的word还要好的字处理器是可能的, 但是在操作系统这个微软独占的堡垒里, 他们对你根本就不屑一顾。
软件竞争只能在全新的市场中展开, 因为在那里还没有谁建立起防御工事。你有可能采取大胆的策略, 集合那些既做设计又做编码的人, 来赢得竞争。
微软最初就是这样做的, 苹果,HP也莫不如此。我想任何成功的创业公司都是走的这条路。
所以, 创造伟大软件的一个办法就是创业开公司。不过这里面还有两个问题。
第一, 开公司以后, 除了编程序, 你需要做好多其他事情。在Viaweb的时候, 我真的希望自己能挤出四分之一的时间编程就好了。
实际上我四分之三的时间都是在做很讨厌甚至很麻烦的事情。对此我深有体会, 有一次当我开完董事会去补牙, 坐在诊所的椅子上, 我觉得简直在度假。
还有另一个问题。写有趣的软件和写赚钱的软件, 没多少共同之处。
设计语言是很有趣的工作, 微软的第一个产品就是。但是没人会花钱买语言。要想赚钱就得写那种很麻烦的, 没人会免费干的软件。
所有的创造者都会面临这个问题。价格是供求关系决定的, 对有趣软件的需求总是比较少,而解决一般用户的平凡问题的需求, 总是多一些。
在高速公路边上演出, 观众一定少, 在庙会搭个台子演出, 观众一定多。
写长篇小说的收入, 比不上写广告词的收入, 虽然那些广告最后的归宿是垃圾箱。
设计一种语言的回报一定不多, 而搞定某些公司的老掉牙的数据库和Web服务的连接问题, 回报会丰厚得多。
我认为这个难题的答案, 是创造者们应当找一个养家糊口的"日常工作"。
这个名词最初是惯于晚上演出的音乐家们使用的。它的意思是: 你做一个工作是为了赚钱, 另一个工作是因为你喜欢。
几乎所有的创造者在他们职业生涯的早期, 都有日常工作。其中最为人所知的就是画家和作家。
如果能赚钱的日常工作刚好是你所喜爱的工作, 那你就太幸运了。音乐家就经常在唱片店工作。正在用某种语言或者操作系统的黑客, 也应当找个相近的系统管理或维护的工作。
黑客是创造者, 不太像是科学家。黑客寻找灵感的地方, 不应当是科学领域, 而是其他创造者工作的领域。那么, 我们从绘画上, 能够得到什么启示呢?
第一件可以从绘画领域学习的,或者说可以验证的, 就是怎样学习编程。绘画都是在实践中学会的, 编程亦然。
大部分黑客都不是因为念大学计算机课才走上编程之路的。他们13岁年纪就开始学着写程序。即使是上了大学计算机课, 你真正学会编程, 大多也是通过自己实际写程序。
画家通常会留下一系列作品, 你可以从中观察到他们在实践中学习的过程。如果你按年代顺序观察一个画家的作品, 你会发现后一个作品在前一个作品基础上的提高。如果一幅画中的某样东西特别出色, 你多半会在更早的作品中发现其发展成熟的轨迹。
我认为大多数创造者都是这样工作的。作家和建筑设计师也不例外。对于黑客而言, 我觉得这样的做法大概比较好:
从一个大概的草稿开始起步, 不断尝试采纳新的想法, 做修订版,而不是连续几年埋头做一个题目。
创造者学习的另一种方法是观摩杰作。对画家来说, 美术馆是技巧的宝库。几百年来, 美术馆都是画家学习和借鉴大师作品的地方, 它成为传统教育方式的一个部分。观摩杰作强迫画家仔细观察那幅画是如何画成的。作家也是如此。
同样, 黑客也是通过看优秀的程序来学习编程--不仅看它的外在表现, 而且要看源码。开源软件有一个少人提及的优点就是: 你很容易从中学习编程。
绘画的过程就是不断改进的过程, 这是值得我们学习的另一个地方。绘画通常从草图开始,逐渐地添上细节, 但又不仅仅是添上细节那么简单。有时候会发现最初的想法是错的。无数的人像作品, 在x光照射之下, 会发现面部轮廓修改过, 嘴的位置也移动过, 诸如此类。
这就是我们应当学习的榜样, 编程也应当遵循同样的做法。想要假设软件的规格设计完美无缺, 这显然是不切实际的。
预先接受这种现实对你有好处, 写程序的时候就会有所准备,随时应对可能发生的设计规格上的改变。
伟大的软件对于美的追求, 也需要超人的投入。当你仔细查看好软件的时候, 会发现那些不为人注意的部分同样优美。
我不是说我自己写的软件是伟大的, 但我知道, 写代码的时候,要尽量写得清晰易读。有的程序变量名取得丑陋极了, 有的程序行缩进乱七八糟, 读这样的代码真能让我发疯。
如果把黑客仅仅当作代码工人的话, 那他会像工人挖水沟一样从一头干到另一头。但是如果把黑客当作创造者的话, 我们就必须考虑灵感的因素。
软件和绘画一样, 都是为人而做的。黑客也应当像画家一样, 努力创作出伟大的作品。你必须为用户的立场着想。
我小时候, 就听人讲要学会从别人的立场来设想。意思就是做别人想要你做的事情, 而不是做你自己想做的事情。这当然给"换位思考"这个词带来了坏名声。因此我一直不愿意这样做。
可是, 我错了。换位思考确实是成功的秘密, 这并不意味着放弃自我。理解别人的观点, 并不是说你要按别人的兴趣办事。
在某种情况下刚好相反, 举个例子, 打仗的时候, 理解敌人观点, 其目的恰好是要反其道而行之。
大多数创作是为人的, 你得理解人的需要。差不多所有伟大的作品主题都是人, 因为人最感兴趣的, 就是人类自身。
好程序员和伟大的程序员之间的唯一的差别, 就是体察别人的能力。有些程序员很聪明, 但说到"换位思考", 则是完全的自我主义者。这样的人不可能设计出伟大的软件, 他们从来不懂得理解别人的观点。
判断一个人换位思考的能力如何, 最好的办法是看他怎样向那些不懂技术的人讲解技术问题。
我们大概都见过那样一些人, 不管多么聪明, 这件事情上却是糟得很。如果有人问, 什么是编程语言, 他们会说, 呃, 就是一种高级语言, 能经过编译器处理产生目标码。高级语言?编译器? 目标码? 不知道编程语言的人, 难道会知道这些东西?
软件的目标之一, 就是解释自己。
你要写出好程序, 就应当知道用户对软件了解甚少。他们用软件时, 全无思想准备。如果软件的行为刚好合乎他们的设想, 那就最好了。
别指望用户会去读操作手册。这方面, 我见过的最好系统是早期的苹果, 那时候还是1985年。苹果干了所有软件都做不了的事情, 那就是能正常运行。
源码同样也应当解释自己。如果让人回忆关于编程的名言, 经常提到的是结构化和解释语言初期的一句话:
程序写出来是给人看的, 碰巧机器也能运行。
你不但要为用户设身处地着想, 对读者也是一样, 因为读者可能就是你自己。好多程序员写了程序, 过半年再看, 简直看不懂究竟是怎么回事。我就见过有几个人因为这原因放弃了。
缺乏换位思考的能力仿佛是高智商的特征, 尤其在某些地方, 这都成了一种风尚。但我不觉得真的有什么关联。
数学和自然科学和人类感情无关, 这些领域的人显然都很聪明, 于是乎高智商就和"不通世故人情"挂起构来。
事实上好多平常智商的人在这方面也不行。看看脱口秀节目里那些站起来发问的人, 那些问题问的, 真叫拐弯抹角, 主持人得重新梳理一遍, 才能搞得清是啥意思。
我们可以自信地说, 现在正是黑客事业的光辉年代, 在大部分领域, 伟大的作品诞生很早。1430-1500年代的绘画现在仍难以超越, 莎士比亚彷佛生来就是戏剧家, 把这门艺术推进到如此之高的程度, 以致于后来的剧作家都生活在他的阴影里。奥斯汀的小说, 也是如此。
一次又一次, 我们看到同样的模式。
新的媒体诞生了, 人们热情高涨, 短短几代人就把它的能量发挥到极至。黑客事业似乎也正处于这样的时期。
达芬奇时代的绘画行业并不酷, 是他的杰作造就了绘画行业的酷。黑客事业之未来, 全依赖我们今日之创造。