黑客与画家:硅谷创业之父Paul Graham文集

Paul Graham

内容提要

  • 书中的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解我们这个时代,迫使读者独立思考。

O'Reilly Media, Inc.介绍

  • 世界著名计算机图书出版机构O'Reilly Media, Inc
  • The Whole Internet User's Guide & Catalog
  • O'Reilly Media, Inc.所有的编辑人员以前都是程序员,或者是顶尖级的技术专家。

保罗·格雷厄姆其人其事

  • 他们放弃开发桌面软件还有另一个原因,那就是两人都没学过如何开发Windows程序,并且也不太想学。
  • 1998年,收购终于成功。雅虎以4900万美元的价格兼并了Viaweb,将其改名为Yahoo!Store,这是雅虎最早的收购行动之一。
  • 保罗·格雷厄姆有一套完整的创业哲学,他的创业公式是: (1)搭建原型 (2)上线运营(别管bug) (3)收集反馈 (4)调整产品 (5)成长壮大

译者序

  • 1968年至1972年期间,美国出版过一本叫做《地球商品目录》(Whole Earth Catalog)的杂志,内容从植物种子到电子仪器,无所不包,出版目的据说是要帮助读者“理解整个系统”。
  • 黑客行为必须包含三个特点:好玩、高智商、探索精神。
  • 《黑客与画家》这个书名就是在提示应该把黑客与画家当作同一种人看待。和画家一样,黑客只是怀有一门特殊手艺、有创造天赋的普通人。这个书名还有另一层含义,即编程是一种艺术创作,黑客就是艺术家,开发软件与画家作画、雕塑家雕刻、建筑师设计房屋并没有本质不同。

前言

  • 为什么黑客那么在乎言论自由?我认为,部分原因在于,革新对于软件行业实在是太重要了,而革新和异端实际上是同一件事。优秀的黑客养成了一种质疑一切的习惯。

1 为什么书呆子不受欢迎

  • 让自己感到好受一些。当你踩水的时候,你把水踩下去,你的身体就会被托起来。同样,在任何社会等级制度中,那些对自己没自信的人就会通过虐待他们眼中的下等人来突显自己的身份

2 黑客与画家

  • 创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。这种类型的工作很难用研究性的论文表达。
  • 编程到底能够有多酷,取决于我们能够用这种新媒介做出怎样的工作。

真话

  • 触怒他人的言论是那些可能会有人相信的言论。我猜想,最令人暴跳如雷的言论,就是被认为说出了真相的言论。
  • 首先,管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。随着事业的发展,你自己就能琢磨出来其他的诀窍。

永远质疑

  • 如果你想要清晰地思考,就必须远离人群。但是走得越远,你的处境就会越困难,受到的阻力也会越大,因为你没有迎合社会习俗,而是一步步地与它背道而驰。小时候,每个人都会鼓励你不断成长,变成一个心智成熟、不再耍小孩子脾气的人。但是,很少有人鼓励你继续成长,变成一个怀疑和抵制社会错误潮流的人。
  • 认为所有语言都一样的看法的缺点是自欺欺人,但是优点是可以使许多事情变得很简单。我想这就是为什么它被广泛接受的主要原因。它是一个令人舒服的想法。
  • 如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。

4 良好的坏习惯

  • 经济学里有一条拉弗曲线(Laffer curve),认为随着税率的上升,税收收入会先增加后减少。我认为政府的力量也是如此,随着对公民自由的限制不断上升,政府的力量会先增加后减小。

用户的胜利

  • “你的电脑”这个概念正慢慢成为过去时,取而代之的是“你的数据”。你应该可以从任何电脑上获取你的数据。或者更准确地说,在任何终端设备上获取你的数据,终端设备不一定是电脑。

代码之城

  • 设计桌面软件就像设计一幢大楼,而设计互联网软件就像设计一座城市:你不仅需要设计建筑物,还要设计道路、路标、公用设施、警察局、消防队,并且制定城市发展规划和紧急事件的应对方案。

软件的发布

  • 互联网软件的发布规则是:它运行不了,你就无法发布;一旦它能运行了,你就可以立刻发布。

软件bug

  • 有一种编程方法叫做“函数式编程”(functional programming),它对你会有帮助,可以避免一些副作用。函数式编程在学术文献中研究得比较多,在商业软件中用得比较少。但是,对于互联网软件,它却很有用。很难用纯粹的“函数式编程”完成整个程序,但是它可以用来编写一些重要的部分,使得这些部分易于调试,因为它们不包含“状态”(state),非常便于不断进行小幅的修改和测试。

全身心投入

  • 计划这个词,只是将构思束之高阁的另一种表达方式。只要想到好的构思,我们就立刻着手实现。

逆向的《人月神话》

  • 向一个项目增加人手,往往会拖慢项目进程。随着参与人数的增加,人与人之间需要的沟通呈现指数式增长。人数越来越多,开会讨论各个部分如何协同工作所需的时间越来越长,无法预见的互相影响越多越大,产生的bug也越来越多。
  • 向一个项目增加人手,往往会拖慢项目进程。随着参与人数的增加,人与人之间需要的沟通呈现指数式[插图]增长。人数越来越多,开会讨论各个部分如何协同工作所需的时间越来越长,无法预见的互相影响越多越大,产生的bug也越来越多。

金钱问题

  • 一定数量的盗版对软件公司是有好处的。不管你的软件定价多少,有些用户永远都不会购买。如果这样的用户使用盗版,你并没有任何损失。事实上,你反而赚到了,因为你的软件现在多了一个用户,市场影响力就更大了一些,而这个用户可能毕业以后就会出钱购买你的软件。
  • 软件公司有时会采用分销模式,让ISP分销互联网软件。这样做很不好。服务器必须在你自己的控制之中,因为你需要不断改进硬件和软件。如果你放弃对服务器的直接控制,你就放弃了互联网软件的大部分优势。

目标客户

  • 有钱的客户倾向于更贵的选择,即使便宜的选择更符合他们的需要,他们也不会买。这种现象普遍存在。原因就是,那些索要高价的人将更多的钱投入推销。
  • 大公司付出的高价之中,很大一部分是商家为了让大公司买下这个商品而付出的费用。

创业公司

  • 互联网软件永远没有收工的那一天,如果你愿意,可以一直干下去,每天忙上16个小时。而且,你能够做到这一点,意味着竞争者也能做到这一点,所以长时间工作变成了一种必需,不得不如此。因为你能做到,所以你必须做到。这简直就是逆向的帕金森定律[插图]。
  • 互联网软件永远没有收工的那一天,如果你愿意,可以一直干下去,每天忙上16个小时。而且,你能够做到这一点,意味着竞争者也能做到这一点,所以长时间工作变成了一种必需,不得不如此。因为你能做到,所以你必须做到。这简直就是逆向的帕金森定律。

为什么不尝试一下?

  • 比较软件的标准应该是看对手的软件将来会有什么功能,而不是现在有什么功能。
  • 你也许不会相信,但是我向你保证,微软公司害怕你。它的那些目中无人的中层管理人员也许不是这样想的,但是比尔·盖茨肯定是,因为1975年,上一次发布软件的新方式出现时,他也曾经跟你一样白手起家。

6 如何创造财富

  • 如果你想致富,应该怎么做?我认为最好的办法就是自己创业,或者加入创业公司。
  • 创业公司其实就是解决了某个技术难题的小公司。

一个命题

  • 从经济学观点看,你可以把创业想象成一个压缩过程,你的所有工作年份被压缩成了短短几年。你不再是低强度地工作四十年,而是以极限强度工作四年。在高技术领域,这种压缩的回报尤其丰厚,工作效率越高,额外报酬就越高。
  • 这里有一个守恒定律:如果你想赚100万美元,就不得不忍受相当于100万美元的痛苦。

运气的成分

  • 致富的方法有许多种,本文只谈论其中的一种,也就是通过创造有价值的东西在市场上得到回报,从而致富。其他许多种的致富方法包括赌博、投机、婚姻、继承、偷窃、敲诈、诈骗、垄断、行贿、游说、造假、开矿等。获得最可观的财富往往会涉及其中的几种方法。

金钱不等于财富

  • 创造有价值的东西就是创造财富。你最好先搞清楚什么是财富。财富与金钱并不是同义词。[插图]财富存在的时间与人类历史一样长久,甚至更长久,事实上蚂蚁也拥有财富。金钱是一种历史相对较短的发明。
  • 交换媒介的优点是,它使得交易可以进行下去。缺点是,它往往模糊了交易的实质。人们觉得做生意就是为了挣钱,但是金钱其实只是一种中介,让大家可以更方便地获得自己想要的东西。大多数生意的目的是为了创造财富,做出人们真正需要的东西。

大饼谬论

  • 金钱不是财富,而只是我们用来转移财富所有权的东西。

手工艺人

  • 我们这个世界,你向下沉沦或者向上奋进都取决于你自己,不能把原因推给外界。

工作是什么

  • 你早上起床,来到一个新的地点,也是几幢建筑物,开始做你正常情况下没兴趣做的事情。仅有的区别就是,上班的日子不如上学的日子有趣,但是有人付钱给你,而不是你付钱给学校。

更努力地工作

  • 你想更努力地工作,但是你的工作与其他许多人的工作混杂在一起,这样就产生了问题。在大公司中,个人的表现无法单独测量,公司里其他人会拖累你。

可测量性和可放大性

  • 要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。

小团体=可测量性

  • 就算你无法测量每个员工的贡献,但是你可以得到近似值,那就是测量小团队的贡献。
  • 乔布斯曾经说过,创业的成败取决于最早加入公司的那十个人

高科技=可放大性

  • 小团队天生就适合解决技术难题。技术的发展是非常快的,今天很有价值的技术,几年后可能就会丧失价值。小团队在如今这个时代可谓如鱼得水,因为他们不受官僚主义和繁琐管理制度的拖累。而且,技术的突破往往来自非常规的方法,小团队就较少受到常规方法的约束。

潜规则

  • 真正创业以后,你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。
  • 创业公司不像能经受打击的黑熊,也不像有盔甲保护的螃蟹,而是像蚊子一样,不带有任何防御,就是为了达到一个目的而活着。蚊子唯一的防御就是,作为一个物种,它们的数量极多,但是作为个体,却极难生存。
  • 保险的做法就是在早期卖掉自己的创业公司,放弃未来发展壮大(但风险也随之增大)的机会,只求数量较少但是更有把握的回报。

用户数量

  • 大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你。我们发现这会使得CEO们连夜行动。次强的动机则是让他们担心如果现在不买你,你的高速成长将使得未来的收购耗资巨大,甚至你本身可能变成一个他们的竞争对手。
  • 你必须时刻牢记的最基本的原则就是,创造人们需要的东西,也就是创造财富。

财富和权力

  • 创造财富不是致富的唯一方法。在人类的历史长河中,它甚至不是最常见的方法。就在几个世纪前,财富的主要来源还是矿石、奴隶、农奴、土地、牲畜,而快速获得财富的方法只有继承、婚姻、征服、没收。所以,很自然地,财富的名声不好。
  • 没有财富的激励,技术革新就会逐渐停顿。
  • 只有在快速获得巨大利益的激励下,你才会去挑战那些困难的问题,否则你根本不愿意去碰它们。
  • 要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。

7 关注贫富分化

  • 有没有可能,在现代社会中,收入差距拉大实际上是一种健康的信号?

财富的老爹模式

  • 每个人的技能不同,导致收入不同,这才是贫富分化的主要原因,正如逻辑学的“奥卡姆剃刀”原则所说,简单的解释就是最好的解释。
  • 一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。
  • “不公平”这三个字就是“老爹模式”的独门标志。为什么别的情况下人们不会想到这三个字?因为要是你现在还处于“老爹模式”,认为财富就是从某个口子流出来、被大家分享的东西,而不是来源于满足他人的需求的创造活动,那么当你注意到有些人赚钱比其他人多得多时,你就会不偏不倚地得出“不公平”这个结论。

偷窃

  • 在控制程度更高的社会,统治者和官僚阶层用税收代替直接充公。但是,根本的一点并没有变,那就是致富的方法不是创造财富,而是以统治者的强权进行搜刮掠夺。

技术的杠杆效应

  • 首先,技术肯定加剧了有技术者与无技术者之间的生产效率差异,毕竟这就是技术进步的目的。一个勤劳的农民使用拖拉机比使用马可以多耕六倍的田。但是,前提条件是他必须掌握如何使用新技术。
  • 技术无法使其变得更便宜的唯一东西,就是品牌。这正是为什么我们现在越来越多地听到品牌的原因。富人与穷人之间生活差异的鸿沟正在缩小,品牌是这种差距的遗留物。
  • 如今,确实有很多人非常有钱,完全不必再去工作,他们之所以还在工作,不是因为感到社会压力,而是因为无所事事使人感到孤独和消沉。
  • 技术在加大收入差距的同时,缩小了大部分的其他差距。

公理的不同意见

  • 我想提出一种相反的观点:现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大,如果这种扩大没有反映在收入上面,只有三种可能的解释:(a)技术革新停顿了;(b)那些创造大部分财富的人停止工作了;(c)创造财富的人没有获得报酬。
  • 但是,只要你压制收入差距的扩大,不管是用偷窃私人财产的做法(封建社会),还是用高额税收的做法(某些现代政府),最终结果看来都是一样的,那就是社会作为一个整体变得更贫穷了。
  • 总的来说,你要避免的是绝对贫穷,而不是相对贫穷。如果必须在这两种社会之间做选择,根据目前的证据,我选择个人相对贫穷、但是整体上更富裕的社会。
  • 一个社会需要有富人,这主要不是因为你需要富人的支出创造就业机会,而是因为他们在致富过程做出的事情。

8 防止垃圾邮件的一种方法

  • 不过,虽然接近于零,发送垃圾邮件还是有成本的。[插图]所以,只要我们把垃圾邮件的回应率降得很低(不管手段是直接过滤,还是让垃圾邮件被迫掩盖它们的销售意图),商家就会发现,发送垃圾邮件是一件经济上不值得的事情。

9 设计者的品味

  • 喜欢一件东西,却不知道为什么自己喜欢它,原因可能是这件东西是美的,但也可能因为他们的母亲也拥有同样的东西,或者杂志上某个明星使用它,或者仅仅因为它的价格很昂贵。人类的思想就是没有经过整理的无数杂念的混合。
  • 把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。但是问题是,这种说法是不正确的。只要你自己开始动手设计东西,就能明白这一点。
  • 好设计是简单的设计。
  • 如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不是来自风潮的影响。
  • 好设计是解决主要问题的设计
  • 好设计是启发性的设计。
  • 好设计通常是有点趣味性的设计
  • 好设计是艰苦的设计。
  • 好设计是看似容易的设计
  • 在大多数领域,看上去容易的事情,背后都需要大量的练习。练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为。有时,我们的训练只是为了让身体养成下意识的反应。
  • 对称的危险在于它可以用来取代思考,在大量使用重复的时候这种危险性更大。
  • 好设计是模仿大自然的设计
  • 好设计是一种再设计。
  • 好设计是能够复制的设计。
  • 等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。
  • 好设计常常是奇特的设计。
  • 唯一达到“奇特”的方法,就是追求做出好作品,完成之后再回过头看。
  • 推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达·芬奇之所以成为达·芬奇,主要原因不仅仅是他的天赋,更重要的是他生活在当时的佛罗伦萨,而不是米兰。
  • 好设计常常是大胆的设计
  • 优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。

机器语言

  • 一个操作所需的代码越多,就越难避免bug,也越难发现它们。

高级语言

  • 程序员的助手不是一个人,而是编译器。所谓“编译器”,本身就是一个程序,作用是将简便方式书写的程序(就像上面这一行命令)转变为硬件可以理解的语言。
  • 编译器不是高级语言唯一的实现方法,另一种方法是使用解释器,它的作用是实时地将代码解释为相应的机器语言,然后一行行运行。相比之下,编译器则是先将整个程序全部翻译成机器语言,然后再运行。

语言的战争

  • 如果你长期使用某种语言,你就会慢慢按照这种语言的思维模式进行思考。所以,后来当你遇到其他任何一种有重大差异的语言,即使那种语言本身并没有任何不对的地方,你也会觉得它极其难用。缺乏经验的程序员对于各种语言优缺点的判断经常被这种心态误导。

抽象性

  • 如果你非常关注运行速度,那么最好使用接近机器的语言。

安全带还是手铐?

  • 在静态类型语言中,写代码时必须知道每个变量的类型。而在动态类型语言中,随便什么时候,你都可以把变量设为任意类型的值。

面向对象编程

  • 面向对象编程。它是一种不同的组织程序的方法。假定你要写一个程序,计算二维图形的面积。首先,你必须知道到底是圆形还是正方形。一种解决方法是用一整块的代码判断遇到的是什么图形,然后再用相应的公式计算面积。面向对象编程不是这样,它的方法是写出两个类,一个是圆形类,另一个是正方形类,然后每个类里面用一小块代码(叫做方法)计算该类图形的面积。求面积的时候,你就问要用哪一个类,然后再使用相应的方法得出最后答案。

文艺复兴

  • 实际上,很多历史学家相信战争是文艺复兴的一个副产品。[插图]当时,欧洲活力旺盛可能就是因为它分成许多互相竞争的小国。它们互相毗邻,所以新思想能够从一个国家传播到另一个国家,但是它们又互相独立,使得单个的统治者无法遏制创新的发展。相比之下,中国古代的封建皇朝禁止民间建造大型的远洋船只,阻止了经济的正常发展。

11 一百年后的编程语言

  • 我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。
  • 我已经预测了,一旦未来硬件的性能大幅提高将会发生什么事。新增加的运算能力都会被糟蹋掉。
  • 效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。
  • 每增加一个解释层,软件的运行速度就会慢一个数量级。但是,多余的软件层可以让编程灵活起来。
  • 即使是应用程序,使用多层形式开发也是一种很强大的技巧。自下而上的编程方法意味着要把软件分成好几层,每一层都可以充当它上面那一层的开发语言。这种方法往往会产生更小、更灵活的程序。它也是通往软件圣杯——可重用性(reusability)——的最佳路线。
  • 面向对象编程使得你有办法对面条式代码进行可持续性开发。通过不断地打补丁,它让你将软件一步步做大。大公司总是倾向于采用这样的方式开发软件。我预计一百年后也是如此。
  • 在任何学术领域,都有一些题目是可以做的,另一些题目是不可以做的。不幸的是,这两类题目的区别通常取决于它们写成论文后看上去是不是很高深,而不是取决于它们对软件业的发展是否重要。最极端的例子可能就是文学,文学研究者的任何成果几乎对文学创作者都毫无影响。
  • 学习开车的时候,一个需要记住的原则就是要把车开直,不是通过将车身对齐画在地上的分隔线,而是通过瞄准远处的某个点。即使你的目标只在几米开外,这样做也是正确的。

秘密武器

  • 如果你想当一个黑客,应该学习哪些语言。他建议从Python和Java入手,因为它们比较容易学。想当高级一点的黑客,还应该学习C和Perl。前者用来对付Unix系统,后者用来系统管理和开发CGI脚本。最后,真正非常严肃地把黑客作为人生目标的人,应该考虑学习Lisp:Lisp很值得学习。你掌握它以后,会感到它给你带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到Lisp。
  • 选择使用哪一种技术的时候,你不能考虑别人的做法,只能考虑什么样的技术能最好地完成工作。
  • 在竞争中,你的对手无法理解你的技术优势,这可是再宝贵不过了。商场如战场,对手摸不透你,你的胜算就增加了。

Blub困境

  • Lisp语言的好处不在于它有一些狂热爱好者才明白的优点,而只在于它是目前最强大的编程语言。它没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。
  • 它没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变。
  • 通过归纳法我们就会知道,唯一洞悉所有语言优劣的人必然是懂得最强大的那种语言的人
  • 表面上,一个老年人拄着拐杖蹒跚而行,你不要只是看看而已,他背后可能有更多的故事值得了解,你应该想得更深一些。

创业公司的合气道

  • 人类天性变化的速度大大慢于计算机硬件变化的速度,所以编程语言的发展通常比CPU的发展落后一二十年。
  • 技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。[插图]所以,一种很普通的编程语言就是很普通的程序员使用的语言,它的变化就像冰山那样缓慢。
  • 技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。所以,一种很普通的编程语言就是很普通的程序员使用的语言,它的变化就像冰山那样缓慢。
  • 有些公司的职位描述使用了大量的IT词汇,这样的内容越多,这家公司就越不构成威胁。最不用担心的竞争对手就是那些要求应聘者具有Oracle数据库经验的公司,你永远不必担心他们。如果是招聘C++或Java程序员的公司,对你也不会构成威胁。如果他们招聘Perl或Python程序员,就稍微有点威胁了。至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘Lisp黑客的公司,就会真的感到如临大敌。

13 书呆子的复仇

  • 那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。

朝着数学的方法发展

  • 1958年,约翰·麦卡锡第一个提出了Lisp语言。我认为,当前最流行的编程语言不过只是实现了他在1958年的想法而已。
  • 简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。你不应该把Lisp语言与50年代的硬件联系在一起,而是应该把它与快速排序(Quicksort)算法进行类比。这种算法是1960年提出的,至今仍然是最快的通用排序方法。

向心力

  • 使用一种不常见的语言会出现的问题我想到了三个:你的程序可能无法很好地与使用其他语言写的程序协同工作;你可能找不到很多函数库;你可能不容易雇到程序员。

附录:编程能力

  • 闭包(即一个函数,通过它可以引用由包含这个函数的代码所定义的变量)
  • 所有这些语言都是图灵等价的,这意味着严格地说,你能使用它们之中的任何一种语言写出任何一个程序。那么,怎样才能做到这一点呢?就这个小小的例子而言,你可以使用这些不那么强大的语言写一个Lisp解释器就行了。
  • 如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用:(a)使用一种强大的语言;(b)为这个难题写一个事实上的解释器;或者(c)你自己变成这个难题的人肉编译器。

外部因素

  • 一种语言必须是某一个流行的计算机系统的脚本语言(scripting language),才会变得流行。Fortran和Cobol是早期IBM大型机的脚本语言。C是Unix的脚本语言,后来的Perl和Python也是如此。Tcl是Tk的脚本语言,Visual Basic是Windows的脚本语言,(某种形式的)Lisp是Emacs的脚本语言,PHP是网络服务器的脚本语言,Java和JavaScript是浏览器的脚本语言。
  • 如果你想设计一种流行的编程语言,就不能只是单纯地设计语言本身,还必须为它找到一个依附的系统,而这个系统也必须流行。

可编程性(Hackability)

  • 一种真正优秀的编程语言应该既整洁又混乱。“整洁”的意思是设计得很清楚,内核由数量不多的运算符构成,这些运算符易于理解,每一个都有很完整的独立用途。“混乱”的意思是它允许黑客以自己的方式使用。

函数库

  • 我认为,未来50年中,编程语言的进步很大一部分与函数库有关。未来的函数库将像语言内核一样精心设计。优秀函数库的重要性将超过语言本身。某种语言到底是静态类型还是动态类型、是面向对象还是函数式编程,这些都不如函数库重要。

效率

  • 编程时提高代码运行速度的关键是使用好的性能分析器(profiler)

时间

  • 人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。
  • 新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。

15 设计与研究

  • 设计与研究的区别看来就在于,前者追求“好”(good),后者追求“新”(new)。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的。
  • 先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。如果你正在写的代码一个小时之后就可以看到运行结果,这好比让你看到不远处就是唾手可得的奖励,你因此会受到激励和鼓舞。

志谢

  • 父亲教给我什么是怀疑主义,母亲教给我如何发挥想象力。

术语解释

  • 抽象(abstract)隐藏细节。编程语言越抽象,你写出程序所需的运算步骤就越少,每一步的功能就越强。
  • 带宽(bandwidth) 网络连接时传送数据的速度。
  • Blub困境(Blub Paradox)程序员的思想往往会受到自己正在使用的语言的束缚,不相信还存在更强大的语言。
  • Blub困境(Blub Paradox) 程序员的思想往往会受到自己正在使用的语言的束缚,不相信还存在更强大的语言。
  • 布鲁克斯假说(Brooks's Hypothesis)程序员一天写出的代码行数是一个常量,与他使用什么语言无关。
  • 缓冲区(buffer)一个内存区域,用来保存程序需要的输入数据,或者将程序的输出数据累积起来,到一定数量后再输出。
  • CGI脚本(Common Gateway Interface script,通用网关接口脚本)当网络服务器需要进行某种运算(比如数据库搜索)而不是直接传输现有文件时所运行的一种程序。CGI脚本的主要缺点是,每次运行只能生成一个页面,无法像桌面软件那样将数据保存在内存中从而实现与用户的不间断对话。
  • 点击轨迹(click trail)同一个用户向网络服务器发出的一系列HTTP请求,基本等同于他浏览的网页顺序。
  • 复杂度(complexity)算法的“时间复杂度”(time complexity)指的是,当输入的数据量不断增加时,计算机完成这种算法所消耗的时间。比如,假定你要在一间屋子中寻找某一个人,方法是看每个人的脸,那么找到这个人所需要的时间与屋中的人数成正比。这样一种算法就叫做O(n),意为所需的时间与n成比例(n代表数据量)。现在进一步假设你要在屋子中寻找看上去长得很像的两兄弟(或两姐妹),那么你所需要的时间可能与人数的平方成正比,因为你也许不得不每两个人就比较一次,而所有可能的两人组合是人数的平方,算法就是O(n2)。
  • 最终用户(end user)需求很简单的用户的婉转说法。
  • 闭包(lexical closure) 一个函数,通过它可以引用由包含这个函数的代码所定义的变量。
  • 宏(macro)一个能够生成其他程序的程序。要在不同语言中实现这一点,就意味着不同语言的宏差异很大,一种语言的“宏”可能比另一种语言的“宏”强大得多。
  • “奥卡姆剃刀”原则(Occam's Razor) 简单的解释就是较好的解释。
  • “奥卡姆剃刀”原则(Occam's Razor)简单的解释就是较好的解释。
  • 帕金森定律(Parkinson's Law) 完成一项任务所需要的资源会不断扩展,直至把这种资源消耗光为止。
  • 帕金森定律(Parkinson's Law)完成一项任务所需要的资源会不断扩展,直至把这种资源消耗光为止。
  • 管道(pipe) 将操作系统的各种命令连接起来的一种方式,使得一个命令的输出变成另一个命令的输入。
  • 过早优化(premature optimization) 还没有写完程序,你就开始考虑它的性能问题。这样的软件好比姑娘还没有成年却已经嫁人了。
  • 性能分析器(profiler) 一种观察运行中的目标程序的程序,它会告诉你目标程序的哪一个部分最消耗资源
  • Python一种由Guido van Rossum开发的开源编程语言。带有强烈的面向对象风格,被爱好者看作是Perl语言的一种较为简洁的替代品。
  • 递归(recursive)一种调用自身的算法。警察审讯犯人时就会用到递归。警察先问犯人是否知道案件的情况,或者是否知道谁干的,如果犯人回答知道,那么继续这样问下去。
  • 正则表达式(regular expression)一种分解字符串的模式,就像筛子一样从字符串中取出想要的部分。
  • Ruby一种较新的开源编程语言,由松本行弘[插图](Yukihiro Matsumoto,又称matz)开发,是Perl和Python的竞争者。
  • 服务器(server)网络上的一台计算机,用来回应其他计算机的请求。
  • 套接字(socket) Unix操作系统的一种内部渠道,不同计算机的进程通过它可以在网络上交换信息。
  • 面条式代码(spaghetti)扭曲缠绕在一起的代码,没有人能够读懂,包括作者本人。
  • SSL(安全套接字层,Secure Sockets Layer) 一种在网络上安全传输数据的协议。
  • 系统管理员综合症(system administrator disease) 系统管理员心底里总是认为,他们管理的那些设备只是独立的设备,而不是用户的工具。更概括地说,他们的态度就是将客户视为一种麻烦,而不是自己能够有这个饭碗的原因。这种心理是感受不到竞争压力的工作职位所特有的。
  • 语义单位(token)一串同属于一个单位的字符。更通用的叫法是“词”(word)。
  • 图灵完备(Turing-complete) 如果一种编程语言写出的所有程序都能被转换成图灵机程序,并且反之也成立,那么这种编程语言就是图灵完备的。所有当代编程语言都是图灵完备的,这意味着(在理论上)它们的功能都是一样强大的。图灵完备又称图灵等价(Turing-equivalent)。
  • URL(统一资源定位符,Uniform Resource Locator)网页的地址。更精确地说,是一个指向网络服务器的请求,目标通常是一个网页,但是也可能是要求某种操作(比如网络搜索)。
  • VC(风险投资商,Venture Capitalist) 为他人创业或再融资提供金钱的人,他们要求创业者用股份来交换投资。
  • 所见即所得(wysiwyg)What you see is what you get(你看到的就是你得到的)的缩写(发音为whizzy wig)。