- 保罗·格雷厄姆 《黑客与画家》
- https://book.douban.com/subject/35889905/
- 书摘卡片
译者序
-
想要把握这个时代,就必须理解计算机。理解计算机的关键,则是要理解计算机背后的人。表面上这是一个机器的时代,但是实际上机器的设计者决定了我们的时代。程序员的审美决定了你看到的软件界面,程序员的爱好决定了你有什么样的软件可以使用。我们的时代是程序员主导的时代,而伟大的程序员就是黑客。
-
“黑客”这个词不仅是第一流能力的象征,还包含着求解问题过程中产生的精神愉悦或享受。也就是说,从一开始,黑客就是有精神追求的。自由软件基金会创始人理查德·斯托尔曼说:“出于兴趣而解决某个难题,不管它有没有用,这就是黑客。”
根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。只有其行为同时满足这三个标准,才能被称为“黑客”。另一方面,它们也构成了黑客的价值观,黑客追求的就是这三种价值,而不是实用性或金钱。
-
真正的黑客致力于改变世界,让世界运转得更好。媒体对黑客的定义未免过于片面。为了澄清“黑客”这个概念,他们提出只有传统意义上的黑客才能被称为 hacker,而那些恶意入侵计算机系统的人应该被称为 cracker(入侵者)。这个观点已经在程序员社区中得到普遍认同。
前言
- 计算机程序只是文本而已。你选择什么语言,决定了你能说什么话。编程语言就是程序员的思维方式。
为什么书呆子不受欢迎
-
如果智力本身与“受欢迎”无关,为什么聪明的小孩一直不受同龄人的欢迎呢?我认为,答案就是他们真的不想让自己受欢迎。
-
我更想追求的事另一件事情——聪明。这不仅仅意味着在学校得到好成绩(虽然某种程度上这也挺重要)。我真正想要的事,能够设计奇妙的火箭,写出漂亮的文章,理解编程原理。一句话,我想要做伟大的事情。
-
青少年每时每刻都想融入群体之中。
-
一般来说,对于那些高度困难的领域,只有身处其中的人,才能意识到成功需要不间断(虽然未必是自觉的)付出。举例来说,大多数人似乎认为,绘画能力与生俱来,画家就像高个子一样,是天生的。事实上,大多数“会画” 的人,本身就很喜欢画画,将许许多多时间投入其中,这就是为什么他们擅长画画的原因。同样的,受欢迎也不是天生的,而是要你自己做出来的。
-
在一个人产生良知之前,折磨就是一种娱乐。
-
在任何社会等级制度中,那些对自己没自信的人就会通过虐待他们眼中的下等人来突显自己的身份。我已经意识到,正是因为这个原因,在美国社会中底层白人是对待黑人最残酷的群体。
-
没有什么比一个共同的敌人更能使人们团结起来了。
-
许多人似乎认为,聪明的小孩在人生的这个阶段应该与“正常的”小孩待在一起。也许吧。但是,至少在某些情况中,书呆子感到不适应的真正原因是其他人都是疯子。
-
表面上,学校的使命是教育儿童。事实上,学校的真正目的是把儿童都关在同一个地方,以便大人们白天可以腾出手来把事情做完。我对这一点没意见,在一个高度工业化的社会,对孩子不加管束,让他们四处乱跑,无疑是一场灾难。
-
人类喜欢工作,在世界上大多数地方,你的工作就是你的身份证明。但是,我们那时做的所有事情根本就是无意义的,至少那时看来是这样。最好的情况下,那些事情也不过是遥远的将来我们可能从事的实际工作的联系。它所面向的目标是如此遥远,以至于当时我们都不知道自己练习这些到底是为了干什么。
-
校园生活的真正问题是空虚。除非成年人意识到这一点,否则无法解决这个问题。可能意识到这个问题的成年人,是那些读书时就是书呆子的人。
黑客与画家
-
“做什么“和”怎么做“不应该分得太开。如果你决定做一件事,却不知道怎么做,你就是在自找麻烦。
-
创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。这种类型的工作很难用研究性的论文表达。
-
你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前,这与作家、画家和建筑师的做法完全一样。
-
如果大学和实验室不允许黑客做他们想做的事情,那么适合黑客的地方可能就是企业。不幸的是,大多数企业也不允许黑客做他们想做的事情。大学和实验室强迫黑客成为科学家,企业强迫黑客成为工程师。
-
大公司为了避免设计上的灾难,选择了减少设计结果的标准差。但是当你排斥差异的时候,你不仅将失败的可能性排除在外,也将获得高利润的可能性排除在外。这对大公司来说不是问题,因为生产特别优秀的产品不是它们的获胜手段。大公司只要做到不太烂,就能赢。
-
真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。微软公司自己一开始就是这样走向成功的,苹果公司和惠普公司也是如此。我觉得几乎所有的创业公司都是这样取得成功的。
所以,开发优秀软件的方法之一就是自己创业。但是,这样做会遇到两个问题。一个是自己开公司的话,必须处理许许多多与开发软件完全无关的事情。创业的另一个问题是赚钱的软件往往不是好玩的软件,两者的重叠度不高。
-
当我说,黑客解决生计问题的方法是找一份“白天工作”,然后在其余时间开发优美的软件,我并没有说这是一个新方法。开源软件界的黑客早就这样做了。我想说的其实是,开源软件的这种工作模式可能就是正确的模式,因为它已经被其他领域的创作者都验证过了。
-
大多数黑客不是通过大学课程学会编程的,他们从实践中学习,13 岁时就自己动手写程序了。即使上了大学,黑客学习变成依然主要通过自己写程序。
-
眼下想必每个人都知道,过早优化(premature optimization)是一件危险的事情。我认为,我们应该对“过早设计”(premature design)也抱有同样的担忧,不要太早决定一个程序应该怎么做。
-
同样地,优秀的软件也要求对美的狂热追求。如果你查看优秀软件的内部,就会发现那些预料中没有人会看见的部分也是优美的。
-
黑客就像画家,工作起来是有心里周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作 16 个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。为了做出优秀的工作,你必须把这种心理周期考虑在内。只有这样,你才能根据不同的事情找出不同的应对方法。
-
正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。
-
判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。
-
软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知。你要明白,用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。
-
源代码也应该可以自己解释自己。如果我只能让别人记住一句关于编程的名言,那么这句名言就是《计算机程序的结构与解释》一书的卷首语:程序写出来是给人看的,附带能在机器上运行。
不能说的话
-
要是能坐上时间机器回到过去,不管哪一个年代,有一件事都是不会改变的,那就是“祸从口出”。你一定要小心自己说的话。自以为无害的言论会给你惹来大麻烦。
-
触怒他人的言论是那些可能会有人相信的言论。我猜想,最令人暴跳如雷的言论,就是被认为说出了真相的言论。
-
我猜想,道德禁忌的最大制造者是那些权利斗争中略占上风的一方。你会发现,这一方有实力推行禁忌,同时又软弱到需要禁忌保护自己的利益。大多数的斗争,不管它们实际上争的是什么,都会以思想斗争的形式表现出来。
-
他们接受流行,不是因为想要与众不同,而是因为害怕与众不同。
-
想要做出优秀作品,你需要一个什么问题都能思考的大脑。尤其是那些似乎不应该思考的问题,你的大脑也要养成思考它们的习惯。优秀作品往往来自于其他人忽视的想法,而最被忽视的想法就是那些被禁止的思想观点。
-
做一个异端是有回报的,不仅是在科学领域,在任何有竞争的地方,只要你能看到别人看不到或不敢看的东西,你就有很大的优势。
-
自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明白,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。我认为这样做不可取,更好的方法是在思想和言论之间划一条明确的界限。在心里无所不想,但是不一定要说出来。我就鼓励自己在心里默默思考那些最无法无天的想法。你的思想是一个地下组织,绝不要把那里发生的事情一股脑说给外人听。“格斗俱乐部”的第一条原则,就是不要提到格斗俱乐部。
-
“守口如瓶”的真正缺点在于,你从此无法享受讨论带来的好处了。讨论一个观点会产生更多的观点,不讨论就什么观点也没有。所以,如果可能的话,你最好找一些信得过的知己,只与他们畅所欲言、无所不谈。这样不仅可以获得新观点,还可以用来选择朋友。能够一起讨论“异端邪说”并且不会因此气急败坏的人,就是你最应该认识的朋友。
-
人们喜欢讨论的许多问题实际上都是很复杂的,马上说出你的想法对你并没有什么好处。
-
想要摆脱你自己的时代的流行,需要一点自觉。没有了时间所产生的距离,你不得不自己创造距离。你不要让自己成为人群的一份子,而要尽可能地远离人群,观察正在发生的事情,特别注意那些被压制的思想观点。
-
如果你想要清晰地思考,就必须远离人群。但是走得越远,你的处境就会越困难,受到的阻力也会越大,因为你没有迎合社会习俗,而是一步步地与它背道而驰。小时候,每个人都会鼓励你不断成长,变成一个心智成熟,不再耍小孩子脾气的人。但是,很少有人鼓励你继续成长,变成一个怀疑和抵制社会错误潮流的人。
如果自己就是潮水的一部分,怎么能看见潮流的方向呢?你只能永远保持质疑。问自己,什么话是我不能说的?为什么?
良好的坏习惯
-
在人们心目中,编程是非常精确的、有条不紊的,这真是非常奇怪的想法。计算机确实是非常精确、有条不紊的,但是黑客的所作所为完全出于兴趣,想到哪里就做到哪里,没有明确的计划,只求开心。
-
很自负的人必须培养出敏锐的感觉,及时发现周围情势的变化,知道怎样才能脱身。
-
公民自由并不仅仅是社会制度的装饰品,或者一种很古老的传统。公民自由使得国家富强。如果将人均国民生产总值与公民自由的关系画成图,你会发现它们是很清楚的正相关关系。公民自由真的时国家富强的原因,而不是结果吗?我认为是的。在我看来,一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。专制国家会变成腐败国家,腐败国家会变成贫穷国家,贫穷国家会变成弱小国家。
-
政府侵犯公民自由,表面上看,并不会让程序员的代码质量下降。它只是逐渐地导致一个错误观点占上风的世界。黑客对于公民自由是非常敏感的,因为这对他们至关重要。他们远远地就能感到极权主义的威胁,好比动物能够感知即将来临的暴风雨。
另一条路
-
互联网软件运行在服务器上,用户界面就是网页。对于普通用户来说,使用这种新型软件将更容易、更便宜、更机动、更可靠,通常也比桌面软件更强大。
-
数据在客户端与服务器之间走一个来回大概耗时 0.1 秒,所以与用户密集互动的软件(比如 Photoshop)仍然会把数据处理的部分放在桌面端。但是看看大多数人使用计算机的目的,你会发现 0.1 秒的时滞根本不成问题。
-
大多数人,在大多数时候,总是选择最省事的做法。如果互联网软件能够击败桌面软件,一定是赢在更方便这一优势上。无论从用户的角度还是从开发者的角度来看都是如此。
-
“你的电脑”这个概念正慢慢成为过去时,取而代之的是“你的数据”。你应该可以从任何电脑上获取你的数据。或者更准确地说,在任何终端设备上获取你的数据,终端设备不一定是电脑。终端设备不应该存储数据,它们应该像电话那样。
-
互联网软件的发布规则是:它运行不了,你就无法发布;一旦它能运行了,你就可以立刻发布。
-
互联网软件每时每刻都在被使用。你的代码已上线,就会经历严酷考验。bug 很快就会浮出水面。
-
构思这种东西有一个特点,那就是它会导致更多的构思。你有没有注意过,坐下来写东西的时候,一半的构思是写作时产生的?软件也是这样。实现某个构思,会带来更多的构思。所以,将一个构思束之高阁,不仅意味着延迟它的实现,还意味着延迟所有在实现过程中激发的构思。事实上,将一个构思束之高阁,甚至会限制新构思的产生。因为你看一眼堆放在一边、还没有实现的构思,就会像“我已经为下一个版本准备了很多新东西要实现了”,你就懒得再思考更多的新功能了。
-
计划这个词,只是将构思束之高阁的另一种表达方式。只要想到好的构思,我们就立刻着手实现。
-
软件应该做到用户认为它可以做到的事情。但是,你不知道用户到底怎么想,除非你亲眼看到他们如何使用你的软件,相信我,看到和看不到大不相同。
-
效率对互联网软件至关重要,因为硬件费用由你支付。你的资本支出成本除以服务器所能支持的最大用户数量,就是你为每个用户付出的成本。如果你的软件效率高,你就能比同样硬件配置的竞争对手多发展用户,获得更多的利润。
-
没有盗版是一种“优势”,但也是一个问题。一定数量的盗版对软件公司是有好处的。不管你的软件定价多少,有些用户永远都不会购买。如果这样的用户使用盗版,你并没有任何损失。事实上,你反而赚到了,因为你的软件现在多了一个用户,市场影响力就更大了一些,而这个用户可能毕业以后就会出钱购买你的软件。
-
盗版实质上是一种价格歧视,只不过针对的是最底层的消费者。我觉得,软件公司明白这个道理,所以故意对某些盗版行为睁一只眼闭一只眼。由于互联网软件无法盗版,所以软件公司必须相处其他策略推广软件。
-
服务器必须在你自己的控制之中,因为你需要不断改进硬件和软件。如果你放弃对服务器的直接控制,你就放弃了互联网软件的大部分优势。
-
通过 ISP 分销互联网软件,就好比让自动售货机出售寿司。
-
不少公司都很想知道,什么事情可以外包,什么事情不可以外包。一个可能的答案是,公司内部所有不直接感受到竞争压力的部门都应该外包出去,让它们暴露在竞争压力之下。
-
大公司付出的高价之中,很大一部分是商家为了让大公司买下这个商品而付出的费用。
-
开发互联网软件的创业公司会把与创业有关的每一件事做到极致。只用更少的人、更少的钱,就可以把软件写出来,并且开始运作。你必须打破常规、快速行动,循规蹈矩不可能成功。
-
只要人们继续上网,互联网软件就输不了。互联网也许不是唯一的提供软件的途径,但是它现在就能发挥作用,并还将持续很长一段日子。互联网软件的开发成本低,即便是最小型的公司,也可以很容易地制作和发布。互联网软件做起来很辛苦,还有许多特别大的压力,但是这样只会使得创业公司成功的机会变大。
-
如果你是一个黑客,并且梦想自己创业,可能会有两件事情令你望而却步,不敢真正开始采取行动。一件是你不懂得管理企业,另一件是你害怕竞争。可是实际上,这两件事都是没有通电的电篱笆。
-
至于如何做出用户喜欢的产品,下面是一些通用规则。从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出 1.0 版本,并且不断加以改进,整个过程中密切倾听用户的反馈。用户总是对的,但是不同的用户要求不一样。低端的用户要求简化操作和清晰易懂,高端的用户要求你增加新功能。软件最大的好处就是让一切变得简单。但是,做到这一点的方法是正确设置默认值,而不是限制用户的选择。如果竞争对手的产品很糟糕,你也不要自鸣得意。比较软件的标准应该是看对手的软件将来会有什么功能,而不是现在有什么功能。无论何时,你都要使用自己的软件。
-
不要只因为对方的头衔是市场专家,设计师或产品经理,就盲目听从他们的话。如果他们的观点真的很好,那就听从他们,关键是你要自己判断,不要盲从。只有懂得设计的黑客,才能设计软件,不能交给对软件一知半解的设计师。如果你不打算自己动手设计和开发,那就不要创业。
-
不要被微软吓到。你能做它做不到的事情,正如它能做到你做不到的事情一样。开发互联网软件不需要得到任何人的许可,没有人能够组织你。你不需要去申请许可证,不需要在零售店的货架上谋得一席之地,也不需要卑躬屈膝地求人家,将你的软件与操作系统捆绑在一起。你能够通过浏览器发布软件,没有人能在你和浏览网站的用户之间插上一脚。
你也许不会相信,但是我想你保证,微软公司害怕你。它的那些目中无人的中层管理人员也许不是这么想的,但是比尔·盖茨肯定是,因为 1975 年,上一次发布软件的新方式出现时,他也曾经跟你一样白手起家。
如何创造财富
-
创业公司往往与技术有关,所以“高技术创业公司”这个短语几乎就是同义重复。创业公司其实就是解决了某个技术难题的小公司。
-
从经济学观点看,你可以把创业想象成一个压缩过程,你的所有工作年份被压缩成了短短几年。你不再是低强度地工作四十年,而是以极限强度工作四年。在高技术领域,这种压缩的回报尤其丰厚,工作效率越高,额外报酬就越高。
-
创业公司不是变魔术。它们无法改变创造财富的法则,它们只是代表了财富创造曲线远端上的一点。这里有一个守恒定律:如果你想赚 100 万美元,就不得不忍受相当于 100 万美元的痛苦。比如,你终生为邮政局工作,省下每一分工资,那也是赚到 100 万美元的一种方法。可是,不难想象为邮政局工作 50 年是何等漫长的压力。创业公司将你所有的压力压缩到三四年。承受较大的压力通常会为你带来额外的报酬,但是你还是无法逃避基本的守恒定律。如果创业那么轻松,那么所有人就都去创业了。
-
交换媒介的优点是,它使得交易可以进行下去。缺点是,它往往模糊了交易的本质。人们觉得做生意就是为了挣钱,但是金钱其实只是一种中介,让大家可以更方便地获得自己想要的东西。大多数生意的目的是为了创造财富,做出人们真正需要的东西。
-
我们这个世界,你向下沉沦或者向上奋进都取决于你自己,不能把原因推给外界。许许多多不创造任何财富的人——比如本科生、记者和政客——一听到最富有的 5% 人口占有全社会一半以上的财富,往往会认定这是不公平的。一个有经验的程序员很可能也认为这是不公平的。因为最顶尖的 5% 的程序员写出了全世界 99% 的优秀软件。
-
一个大学毕业生总是想“我需要一份工作”,别人也是这么对他说的,好像变成某个组织的成员是一件多么重要的事情。更直接的表达方式应该是“你需要去做一些人们需要的东西”。即使不加入公司,你也能做到。公司不过是一群人在一起工作,共同做出某种人们需要的东西。真正重要的是做出人们需要的东西,而不是加入某个公司。
-
要致富,你需要两样东西:可测量性和可放大性。你的职位产生的业绩,应该是可测量的,否则你做得再多,也不会得到更多的报酬。此外,你还必须有可放大性,也就是说你做出的决定能够产生巨大的效应。
-
CEO 也是一种同时具备可测量性和可放大性的工作。公司的表现就是 CEO 的表现,所以它具备可测量性。CEO 的决策决定了整个公司的方向,所以它具备可放大性。
-
如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。但是,如果你想同时具备可测量性和可放大性,不一定非当上 CEO 或电影明星不可。你只需要成为某个攻克难题的小团体的一部分就可以了。
-
小团队的优秀不在于它本身的小,而在于你可以选择成员。我们不需要小村庄的那种“小”,而需要全明星第一阵容的那种“小”。
-
团队越大,每个人的贡献就越接近于整体的平均值。所以,在不考虑其他因素的情况下,一个非常能干的人待在大公司里可能对他本人是一件很糟的事情,因为他的表现被其他不能干的人拖累了。当然,许多因素都会产生影响,比如这个人可能不太在乎回报,或者他更喜欢大公司的稳定。但是,一个非常能干而且在乎回报的人,通常在同类人组成的小团队中会有更出色的表现,自己也会感到更满意。
-
选择公司要解决什么问题应该以问题的难度作为指引,而且此后的各种决策都应该以此为原则。Viaweb 的一个经验法则就是“更上一层楼”。假定你是一个手脚敏捷的小男孩,身后有一条壮硕的大狗正在追你。你跑到楼梯口,这时应该上楼还是下楼?我觉得应该上楼。如果下楼的话,大狗可能跑得跟你一样快。上楼的话,大狗的庞大身躯就将成为劣势。不错,跑上楼你会比较吃力,但是大狗会感到更吃力。
-
俗话说得好,最好的防御就是进攻。如果你开发出来的技术是竞争对手难于复制的,那就够了,你不需要依靠其他防御手段了。一开始就选择较难的问题,此后的各种决策都选择较难的那个选项。
-
创业是有一些潜规则的,其中一条就是很多事情由不得你。比如,你无法决定到底付出多少。你只想更勤奋工作 2 到 3 倍,从而得到相应的回报。但是,真正创业以后,你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。另一条潜规则是,创业的付出与回报虽然总体上是成比例的,但是在个体上是不成比例的。
-
我认为,如果你的公司有机会被收购,那将是不错的选择。管理一家公司与创立一家公司是不同的两件事。当情况基本稳定下来以后,不妨让大公司来接手。
-
在这两种收购动机中,归根结底的因素都是用户数量。你以为买家在收购前会做很多研究,搞清楚你的公司到底值多少钱,其实根本不是这么回事。他们真正在意的只是你拥有的用户数量。事实上,买家假定用户知道谁有最好的技术。虽然这听上去很蠢,但是用户是你证明自己创造了财富的唯一证据。财富就是人们需要的东西,如果没人使用你的软件,可能不是因为你的推广活动很失败,而是因为你没有做出人们需要的东西。
-
冷战、第二次世界大战、近代的大多数战争都说明了这个道理。要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。
关注贫富分化
-
一个人的工作具有多少价值不是由政府决定的,而是由市场决定的。
-
当我们讨论“收入分配不公平”时,我们还要问问收入从何而来,收入背后的财富到底是谁生产出来的。如果收入完全根据个人创造的财富数量而分配,那么结果可能是不平均的,但是很难说是不公平的。
-
技术无法使其变得更便宜的唯一东西,就是品牌。这正是为什么我们现在越来越多地听到品牌的原因。富人与穷人之间生活差异的鸿沟正在缩小,品牌是这种差距的遗留物。但是,品牌只是商品的标签,即使买不起名牌,至少你还可以买普通牌子,这总比根本无法消费这一种商品要好得多。
-
技术的发展加大了贫富差距,这是不是一个社会问题?好像没有那么严重。技术在加大收入差距的同事,缩小了大部分的其他差距。
-
我想提出一种相反的观点:现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大,如果这种扩大没有反应在收入上面,只有三种可能的解释:(a)技术革新停顿了;(b)那些创造大部分财富的人停止工作了;(c)创造财富的人没有获得报酬。
-
即便是最先进的高科技公司,也有至少 90% 的工作没有乐趣、令人生厌。
-
在一个剥夺个人财产的社会,财富创造活动中所有那些没有乐趣的事情都会急剧地放慢,乃至停顿。
-
只要你压制收入差距的扩大,不管是用偷窃私人财产的做法(封建社会),还是用高额税收的做法(某些现代政府),最终结果看来都是一样的,那就是社会作为一个整体变得更贫穷了。
如果我可以选择,到底是生活在一个整体上非常富裕但是我个人相对贫穷的社会,还是生活在一个我个人相对非常富裕但是整体上非常贫穷的社会呢?我会选择第一个选项。如果我有小孩的话,可能哪一个选项更好还值得争论。但是,总的来说,你要避免的是绝对贫穷,而不是相对贫穷。如果必须在这两种社会之间做选择,根据目前的整局,我选择个人相对贫穷、但是整体上更富裕的社会。
一个社会需要有富人,这主要不是因为你需要富人的支出创造就业机会,而是因为他们在致富过程做出的事情。我在这里谈的不是财富从富人流向穷人的那种扩散效应(trickle-down effect),也不是说如果你让亨利·福特致富,他就会在下一场宴会雇佣你当服务员,而是说如果你让他致富,他就会造出一台拖拉机,使你不再需要使用马匹耕田了。
防止垃圾邮件的一种方法
- 垃圾邮件永远在进化,现在能够过滤它们不等于永远能够过滤它们。说实话,如今的大多数垃圾邮件过滤器就像杀虫剂一样,唯一作用就是创造出杀不死的新品种害虫。
设计者的品味
-
与其把“美”说成一个虚无缥缈的抽象概念,还不如让我们考虑一个实际的问题(这样就能避免喋喋不休的空谈):如何才能做出优美的产品?
-
把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。但是问题是,这种说法是不正确的。只要你自己开始动手设计东西,就能明白这一点。
-
众多不同学科对“美”的认识有着惊人的相似度。优秀设计的原则是许多学科的共同原则,一再反复地出现。
-
当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。
-
以永不过时作为目标是一种帮助自己找到最佳答案的办法:如果你不愿别人的答案取代你的答案,你就只好自己做出最佳答案。
-
答案可以不断改进,同样,问题本身也可以不断改进。软件的难题通常可以被改成等价的较已解决的形式。
-
幽默一定程度上反映了力量。幽默感是强壮的一种表现,始终拥有幽默感就代表你对厄运一笑了之,而丧失幽默感则表示你被厄运深深伤到。
-
好的设计并非一定要有趣,但是很难想象完全无趣的设计会是好的设计。
-
如果观察那些做出伟大作品的人,你会发现他们的共同点就是工作得非常艰苦。如果你工作得不艰苦,你可能正在浪费时间。困难的问题需要艰巨的付出才能解决,高难度的数学证明需要结构非常精细的解决方法(它们往往做起来很有趣),工程学也是如此。
-
当解决难题成为压倒一切的任务时,那些流行样式与华丽装饰就被抛到一边去了。
-
并非所有的痛苦都是有益的。世界上有有益的痛苦,也有无益的痛苦。你需要的是咬牙向前冲刺的痛苦,而不是脚被钉子扎破的痛苦。解决难题的痛苦对设计师有好处的,但是对付挑剔的客户的痛苦或者对付质量低劣的建材的痛苦就是另外一回事了。
-
科学和工程学的一些最重大的发现在形式上往往很简单,会使得你觉得自己也想过。可是,如果它真的那么简单,往上面发现人不是你呢?
-
在大多数领域,看上去容易的事情,背后都需要大量的练习。练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为。有时,我们的训练只是为了让身体养成下意识的反应。
-
在数学和工程学中,递归尤其有用。归纳式证明方法既简洁又美妙。在软件中,能用递归解决的问题通常代表已经找到了最佳解法。
-
对称的危险在于它可以用来取代思考,在大量使用重复的时候这种危险性更大。
-
写实的目的不是为了给生活留下一模一样的的记录,而是为你的思想提供一个咀嚼点:你的眼睛看着某样东西,你的手就代表你的思想,画出一些比较有意思的内容。
-
等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。
我像,最伟大的大师最终会达到一种超脱自我的境界。他们一心想找到正确答案,如果别人已经回答出了一部分,那就没理由不拿出来用。他们足够自信地使用他人的成果,完全不担心因此丧失个人的特点。
-
推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达芬奇之所以成为达芬奇,主要原因不仅仅是他的天赋,更重要的事他生活在当时的弗洛伦萨,而不是米兰。今天,人类生活的流动性高得多,但是伟大的项目依然不成比例地集中在少数几个热点上。
-
在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果。某种程度上,你个人最多可以对趋势产生一定的影响,但是你不可能决定趋势,实际上是趋势决定了你。(或许有人办得到,但是米兰的达芬奇显然没有办到。)
-
今天的实验性错误就是明天的新理论。如果你想做出伟大的新成果,那就不能对常识与真理不相吻合之处视而不见,反而应该特别注意才对。
-
单单是无法容忍丑陋的东西还不够,只有对这个领域非常熟悉,你才可能发现哪些地方可以动手改进。你必须锻炼自己。只有在成为某个领域的专家之后,你才会听到心里有一个细微的声音说:“这样解决太糟糕了!一定有更好的选择。”不要忽视这种声音,要培育它们。优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。
编程语言解析
-
所谓“编译器”,本身就是一个程序,作用是将简便方式书写的程序转变为硬件可以理解的语言。
-
编译器不是高级语言唯一的实现方法,另一种方法是使用解释器,它的作用是实时地将代码解释为相应的机器语言,然后一行行运行。相比之下,编译器则是先将整个程序全部翻译成机器语言,然后再运行。
-
语言设计者之间的最大分歧也许就在于:有些人认为编程语言应该防止程序员干蠢事,另一些人则认为程序员应该可以用编程语言干一切他们想干的事。Java 语言是前一个阵营的代表,Perl 语言则是后一个阵营的代表。
-
允许你做某事的语言肯定不差于强迫你做某事的语言。所以,至少在这方面我们可以得到明确的结论:你应该使用允许你面向对象编程的语言。至于你最后到底用不用则是另外一个问题了。
一百年后的编程语言
-
编程语言之所以可能出现聚合,一个原因是它的概率空间比较小,另一个原因是它的突变不是随机的。语言的设计者们总是有意识地借鉴其他语言的设计思想。
-
那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。
-
编程语言进化缓慢的原因在于它们并不是真正的技术,语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。所以,编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。数学符号的进化是缓慢的渐变式变化,而不是真正技术的那种跳跃式发展。
-
对速度的追求是人类内心深处根深蒂固的欲望。当你看着计算机这个小玩意,就会不由自主地希望程序运行得越快越好,真的要下一番功夫才能把这种欲望克制住。设计编程语言的时候,我们应该有意识地问自己,什么时候可以放弃一些性能,换来一点点便利性的提高。
-
essay(论文)这个词来自法语的动词 essayer,意思是“试试看”。从这个原始意义来说,论文就是你写一篇文章,试着搞清楚某件事。软件也是如此。我觉得一些最好的软件就像论文一样,也就是说,当作者真正开始动手写这些软件的时候,他们其实不知道最后会写出什么结果。
-
效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。
-
代码效率与机器性能的差距正在不断加大,我们将会越来越清楚地看到,应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发。
拒绝平庸
-
选择使用哪一种技术的时候,你不能考虑别人的做法,只能考虑什么样的技术能最好地完成工作。
-
如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。
-
如果你为创业公司工作,那么这里有一个评估竞争对手的妙招——关注他们的招聘职位。他们网站上的其他内容无非是一些陈腐的照片和夸夸其谈的文字,但是招聘职位却不得不写得很明确,反映出他们到底想干什么,否则就会引来一大批不合适的求职者。
书呆子的复仇
-
那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。
-
你不能让那些衣冠楚楚、西装革履的家伙替你做技术决策。
-
如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。
-
一种出色的工具到了真正优秀的黑客手里,可以发挥出更大的威力。
-
在大型组织内部,有一个专门的术语描述这种跟随大多数人的选择的做法,叫做“业界最佳实践”。这个词出现的原因其实就是为了让你的经理可以推卸责任。既然我选择的是“业界最佳实践”,如果不成功,项目失败了,那么你也无法指责我,因为做出选择的人不是我,而是整个“业界”。
-
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。
梦寐以求的编程语言
-
即使不考虑语言本身的优秀是否能带动流行,我想单单流行本身就肯定会使得这种语言变得更好,只有流行才会让它保持优秀。编程语言的最高境界一直在发展之中。虽然语言的核心功能就像大海的深处,很少有变化,但是函数库和开发环境之类的东西就像大海的表面,一直在汹涌澎湃。
-
如果说用户数从 0 到 20 比从 20 到 1000 更困难,我也不会感到惊讶。发展最早的 20 个用户的最好方法可能就是使用特洛伊木马:你让人们使用一种他们需要的应用程序,这个程序偏巧就是用某种新语言开发的。
-
简洁性是静态类型语言的力所不及之处。不考虑其他因素时,没人愿意在程序的头部写上一大堆的声明语句。只要计算机可以自己推断出来的事情,都应该让计算机自己去推断。
-
对黑客来说,选择编程语言的时候,还有一个因素比简洁更重要,那就是这种语言必须能够帮助自己做到想做的事。在编程语言的历史上,防止程序员做出“错误”举动的措施多得惊人,这是语言设计者很自以为是的危险举动,他们怎么知道程序员该做什么不该做什么?我认为,语言设计者应该假定他们的目标用户是一个天才,会做出各种他们无法预知的举动,而不是假定目标用户是一个笨手笨脚的傻瓜,需要别人的保护才不会伤到自己。如果用户真的是傻瓜,不管你怎么保护他,他还是会搬起石头砸自己的脚。你也许能够阻止他引用另一个模块中的变量,但是你没法防止他日日夜夜不知疲倦地写出结构混乱的程序去解决完全错误的问题。
-
函数库的使用应该符合程序员的直觉,让他可以猜得出哪个函数能满足自己的需要。
-
你只需要不停地重复同一句话,最终人们将会开始倾听。人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。
-
为了写出优秀软件,你必须同时具备两种相互冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。在你的大脑中,有一个声音说“千难万险只等闲”,还有一个声音却说“早岁那知世事艰”。
这里的难点在于你要意识到,实际上这两种信念并不矛盾。你的乐观主义和怀疑倾向分别针对两个不同的对象。你必须对解决难题的可能性保持乐观,同时对当前解法的合理性保持怀疑。
做出优秀成果的人,在做的过程中常常觉得自己做得不够好。其他人看到他们的成果觉得棒极了,而创造者本人看到的都是自己作品的缺陷。这种视角的差异并非偶然,因为只有对现状不满,才会造就杰出的成果。
如果你能平衡好希望和担忧,它们就会推动项目前进,就像自行车在保持平衡中前进一样。在创新活动的第一阶段,你不知疲倦地猛攻某个难题,自信一定能够解决它。到了第二阶段,你在清晨的寒风中看到自己已经完成的部分,清楚地意识到存在各种各样的缺陷,此时,只要你对自己的怀疑没有超过你对自己的信心,就能够坦然接受这个半成品,心想不管多难我还是可以把剩下的部分做完。
设计与研究
-
设计与研究的区别看来就在于,前者追求“好”(good),后者追求“新”(new)。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的。我认为这两条道路最后会发生交叉:只有应用“新”的创意和理论,才会诞生超越前人的最佳设计;只有解决那些值得解决的难题(也就是“好”的难题),才会诞生最佳研究。所以,最终来说,设计和研究都通向同一个地方,只是前进的路线不同罢了。
-
让用户满意并不等于迎合用户的一切要求。用户不了解所有可能的选择,也经常弄错自己真正想要的东西。做一个好的设计师就像做一个好医生一样。你不能头痛医头,脚痛医脚。病人告诉你症状,你必须找出他生病的真正原因,然后针对病因进行治疗。大多数优秀设计都是这样产生的,它们关注用户,并且以用户为中心。
-
我说设计必须考虑用户的需求,这里的“用户”并不是指所有普罗大众。事实上,你可以选择任何想要的目标用户。
-
如果目标用户涵盖了设计师本人,那么最优可能诞生优秀设计。如果目标用户与你本人差别很大,你往往会假定目标用户的需求比你本人的需求更简单,而不是更复杂。低估用户(即使出于善意)一般来说总是会让设计师出错。
-
在软件领域,贴近用户的设计思想被归纳为“弱即是强”(Worse is Better)模式。这个模式实际上包含了好几种不同的思想,所以至今人们还在争论它是否真的成立。但是,其中有一点是正确的,那就是如果你正在设计某种新东西,就应该尽快拿出原型,听取用户的意见。
-
士气是设计的关键因素。[…]先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。如果你正在写的代码一个小时之后就可以看到运行结果,这好比让你看到不远处就是唾手可得的奖励,你因此会受到激励和鼓舞。其他艺术领域也是如此,尤其是油画。大多数画家都是先画一个草图,然后再逐步加工。如果你采用这种方式,那么从理论上说,你每天收工的时候都可以看到整体的效果,不会对最后的成品一点感觉都没有。跟你说实话吧,画家之间甚至流传着一句谚语:“画作永远没有完工的一天,你只是不再画下去而已。”这种情况对于第一线的程序员真是再熟悉不过了。