黑客与画家(10 万册纪念版)
保罗·格雷厄姆
181 个笔记
阅读周期:

  • 阅读时长:12 小时
  • 开始时间:5/19/2020, 1:02:22 AM
  • 结束时间:6/24/2020, 1:10:52 AM

就像设计师/产品经理和开发者一样 设计师给出设计图/产品原型 开发者实现

有时,黑客做的事情被称为“软件工程”(software engineering),但是这个词也是误导的。与其说优秀的软件设计师是工程师,还不如说是建筑师。建筑学和工程学之间的区别并不是很严格的,但就是存在区别。这表现在“做什么”和“怎么做”:建筑师决定做什么,工程师想出怎么做。


保罗·格雷厄姆其人其事

保罗·格雷厄姆有一套完整的创业哲学,他的创业公式是:
(1)搭建原型
(2)上线运营(别管 bug)
(3)收集反馈
(4)调整产品
(5)成长壮大


平装版译者序

在这里,hack 作为名词有两个意思,既可以指很巧妙或很便捷的解决方法,也可以指比较笨拙、不那么优雅的解决方法。两者都能称为 hack,不同的是,前者是漂亮的解决方法(cool hack 或 neat hack),后者是丑陋的解决方法(ugly hack 或 quick hack)。hack 的字典解释是砍(木头),在这些学生看来,解决一个计算机难题就好像砍倒一棵大树。那么相应地,完成这种 hack 的过程就被称为 hacking,而从事 hacking 的人就是 hacker,也就是黑客


在 20 世纪 60 年代这个词被发明的时候,“黑客”完全是正面意义上的称呼。TMRC 使用这个词是带有敬意的,因为在他们看来,如果要完成一个 hack,就必然包含着高度的革新、独树一帜的风格、精湛的技艺。最能干的人会自豪地称自己为黑客。
这时,“黑客”这个词不仅是第一流能力的象征,还包含着求解问题过程中产生的精神愉悦或享受。也就是说,从一开始,黑客就是有精神追求的。自由软件基金会创始人理查德·斯托尔曼说:“出于兴趣而解决某个难题,不管它有没有用,这就是黑客


根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。只有其行为同时满足这三个标准,才能被称为“黑客”。


(1)使用计算机以及所有有助于了解这个世界本质的事物都不应受到任何限制。任何事情都应该亲手尝试。
(Access to computers—and anything that might teach you something about the way the world works—should be unlimited and total. Always yield to the Hands-On Imperative!)
(2)所有信息应该都是自由的。
(All information should be free.)
(3)不信任权威,提倡去中心化。
(Mistrust Authority—Promote Decentralization.)
(4)判断一名黑客的水平应该看他的技术能力,而不是看他的学历、年龄或地位等其他标准。
(Hackers should be judged by their hacking, not bogus criteria such as degrees, age, race, or position.)
(5)你可以用计算机创造美和艺术。
(You can create art and beauty on a computer.)
(6)计算机使生活更美好。
(Computers can change your life for the better.)
根据这六条“黑客伦理”,黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步。


黑客成了反社会的技术高手的代名词,仿佛只要他坐在键盘前,就有一种从事犯罪活动的魔力,可以操纵任何与网络相连的机器,从核弹到车库大门,都在黑客敲打键盘的操作之中被控制


前言

革新对于软件行业实在是太重要了,而革新和异端实际上是同一件事。优秀的黑客养成了一种质疑一切的习惯。


1 为什么书呆子不受欢迎

当年,他们还不如直截了当告诉我们,我们这些孩子就是“野蛮人”,我们的世界愚不可及。


想起看过的一部电影,孩子当总统时候国家乱成一锅粥

当年,他们还不如直截了当告诉我们,我们这些孩子就是“野蛮人”,我们的世界愚不可及。


成年人就不会去欺负书呆子。为什么小孩子会这样做呢?
一部分原因是,青少年在心理上还没有摆脱儿童状态,许多人都会残忍地对待他人。他们折磨书呆子的原因就像拔掉一条蜘蛛腿一样,觉得很好玩。在一个人产生良知之前,折磨就是一种娱乐。
孩子们欺负书呆子的另一个原因是为了让自己感到好受一些。当你踩水的时候,你把水踩下去,你的身体就会被托起来。同样,在任何社会等级制度中,那些对自己没自信的人就会通过虐待他们眼中的下等人来突显自己的身份。我已经意识到,正是因为这个原因,在美国社会中底层白人是对待黑人最残酷的群体。


孩子们欺负书呆子的主要原因也与追求“受欢迎”的心理有关。怎样才能让自己更受欢迎?个人魅力只是很小的一方面,你应该更多地考虑如何结盟。秘诀就是不停地设法使自己与其他受欢迎的人变得关系更密切。没有什么比一个共同的敌人更能使得人们团结起来了。


与不受欢迎的小孩保持距离,可以为你加分;那么与他们关系密切,就会为你减分。我认识的一位女性说,她在高中时对书呆子有好感,但是害怕被人看到她与书呆子说话,因为其他女孩会因此取笑她。不受欢迎是一种传染病,虽然善良的孩子不会去欺负书呆子,但是为了保护自己,也依然会与书呆子保持距离。


公立学校的老师很像监狱的狱卒。看管监狱的人主要关心的是犯人都待在自己应该待的位置。然后,让犯人有东西吃,尽可能不要发生斗殴和伤害事件,这就可以了。除此以外,他们一件事也不愿多管,没必要自找麻烦。所以,他们就听任犯人内部形成各种各样的小集团。根据我读到的材料,犯人内部的关系是扭曲、野蛮、无孔不入的。处在这种人际关系的最底层可不是好玩的事。


学校、监狱、上流社会的女士午餐会,都做不到这一点。这些场合的成员都好像关在封闭的泡沫之中,所作所为只对泡沫内部有影响,对外部没有影响。


我们有一个专门的短语描述这种情况,即在没有任何严肃标准的前提下,产生排名的情况。我们会说情况“倒退至人缘比赛”(degenerates into a popularity contest)


如果你觉得人生糟透了,那不是因为体内激素分泌失调(你父母相信这种说法),也不是因为人生真的糟透了(你本人相信这种说法)。那是因为你对成年人不再具有经济价值(与工业社会以前的时期相比),所以他们把你扔在学校里,一关就是好几年,根本没有真正的事情可做。任何这种类型的组织都是可怕的生存环境。你根本不需要寻找其他的原因就能解释为什么青少年是不快乐的。


2 黑客与画家

创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。这种类型的工作很难用研究性的论文表达。


塞缪尔·约翰逊  说过,人们对一个作家的评价,需要 100 年才能达成一致 。你必须先等他的那些有影响力的朋友都死了,然后再等他的追随者都死了,才能对他有一个公正的评价。


你把整个程序想清楚的时间点,应该是在编写代码的同时,而不是在编写代码之前,这与作家、画家和建筑师的做法完全一样。


如果某一天你想要去赚大钱,那么记住上面这一点,因为这是创业公司能够成功的原因之一。大公司为了避免设计上的灾难,选择了减少设计结果的标准差。但是当你排斥差异的时候,你不仅将失败的可能性排除在外,也将获得高利润的可能性排除在外。这对大公司来说不是问题,因为生产特别优秀的产品不是它们的获胜手段。大公司只要做到不太烂,就能赢。


真正竞争软件设计的战场是新兴领域的市场,这里还没有人建立过防御工事。只要你能做出大胆的设计,由一个人或一批人同时负责设计和实现产品,你就能在这里战胜大公司。微软公司自己一开始就是这样走向成功的,苹果公司和惠普公司也是如此。我觉得几乎所有的创业公司都是这样取得成功的。


令我惊讶的是,雇主都很犹豫,不愿意手下的黑客为开源软件项目工作。但是,在 Viaweb,要是你不愿意这样干,我们会很犹豫要不要雇用你。我们面试程序员的时候,主要关注的事情就是业余时间他们写了什么软件。因为如果你不爱一件事,你不可能把它做得真正优秀,要是你很热爱编程,你就不可避免地会开发你自己的项目。


我想大多数创作者都是这样学习和工作的,作家和建筑师似乎都是如此。也许对于黑客来说,采取像画家这样的做法很有好处:应该定期地从头开始,而不要长年累月地在一个项目上不断工作,并且试图把所有的最新想法都以修订版的形式包括进去。


黑客的出发点是原创,最终得到一个优美的结果;而科学家的出发点是别人优美的结果,最终得到原创性。


绘画的这个创作过程就值得学习。我认为黑客也应该这样工作。你不能盼望先有一个完美的规格设计,然后再动手编程,这样想是不现实的。如果你预先承认规格设计是不完美的,在编程的时候,就可以根据需要当场修改规格,最终会有一个更好的结果。


黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作 16 个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。


有些工作需要投入巨大的热情,另一些工作则是不需要很操心的日常琐事。在你厌倦的时候再去做那些比较容易的工作,这是个不错的主意。
对于编程,这实际上意味着你可以把 bug 留到以后解决。消灭 bug 对我来说属于轻松的工作,只有在这个时候,编程才变得直接和机械,接近社会大众想象中的编程的样子。消灭 bug 的过程就像解一道数学题,已知许许多多的约束条件,你只要根据条件对方程求解就可以了。你的程序应该能产生 x 结果,但是却产生了 y 结果。哪里出错了?你知道自己最后肯定能解决这个问题,所以做起来就很轻松,就好像刷墙一样,接近于休闲了。


正确的合作方法是将项目分割成严格定义的模块,每一个模块由一个人明确负责。模块与模块之间的接口经过精心设计,如果可能的话,最好把文档说明写得像编程语言规范那样清晰。


事实表明,从他人的角度思考问题正是成功的奥秘所在。“换位思考”并不就意味着你要做自我牺牲。实际上,这是完全不同的两回事。了解别人对于事情的看法,并不代表你为他的利益服务。


你要明白,用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。


源代码也应该可以自己解释自己。如果我只能让别人记住一句关于编程的名言,那么这句名言就是《计算机程序的结构与解释》 一书的卷首语:
程序写出来是给人看的,附带能在机器上运行。


真话

并不是所有不能说出口的话都是我们要找的答案。实际上,只有同时满足两个条件才行。第一个条件是,这些话不能说出口;第二个条件是,它们是正确的,或者看起来很可能正确,值得进一步讨论


触怒他人的言论是那些可能会有人相信的言论。我猜想,最令人暴跳如雷的言论,就是被认为说出了真相的言论。


为了找出那些“不能说的话”,让我们问自己,它们会不会是真的?OK,当你发现某些言论很可疑时,你可以这样想,那些话听上去真是大逆不道(或者其他类似的形容词),但是有没有可能是真的?这就是找出“不能说的话”的第一种方法:判断言论的真伪。


异端邪说

所以,如何找出那些我们自以为正确却会被未来人们耻笑的话?方法就是关注这些标签!比如,有一个标签叫做“性别歧视”,你问自己哪些想法属于“性别歧视”。然后,把头脑中跳出来的那些想法按照先后顺序列出来,再逐个追问,它们真的属于“性别歧视”吗


1989 年,一些聪明的研究人员设计了一个实验,给放射科医生看胸部 X 光片,请他们判断病人有没有肺癌迹象。研究人员记录了医生检查 X 光片时的眼球运动。 研究发现,即使那些医生漏掉了一个癌症病灶,他们的目光通常也会在那个地方停留一会。这说明他们的头脑深处已经意识到那里有问题,但是这种深层的反应没有上升为自觉的意识。我认为,类似的思维机制存在于每个人的头脑中,很多看似叛逆的“异端邪说”,早就“潜伏”在我们的思维深处。如果我们暂时关闭自我审查意识,它们就会第一个浮现出来。


时空差异

所以,我们就有了找出“不能说的话”的第三种方法:将当代观念与不同时期的古代观念 diff  一下。diff 得到的结果,有一些用当代标准衡量是很令人震惊的。古人认为可以说的话,我们认为是不可以说的。但是,你有把握断言你比古人更正确吗?


因为主观完全同意自己的观点,所以觉得别人的骇人听闻,而不是静静思考淡若处之。

x 观点在一种文化中不允许说出口,而在其他文化中说不说都可以。我的判断是,认为 x 观点骇人听闻的一方更可能是错误的一方。


道貌岸然

还有第四种寻找“不能说的话”的方法:寻找那些一本正经的卫道者,看看他们到底在捍卫着什么。


机制

我还想到了第五种方法,可以找出“不能说的话”,那就是去观察禁忌是如何产生的。某种道德观念到底是怎么出现的,又是怎么被其他人接受的?如果我们能够理解它的产生机制,可能就可以应用于我们自己的时代。


流行的思想观点与流行的服饰产生方式不尽相同,但是,它们的传播途径却很相似。第一批的接受者总是带有很强的抱负心,他们有自觉的精英意识,想把自己与普通人区分开来。当流行趋势确立以后,第二批接受者就加入进来了,人数比上一批庞大得多,恐惧心在背后驱使着他们。 他们接受流行,不是因为想要与众不同,而是因为害怕与众不同


为什么这样做

首先,我这样做与小孩子翻石头是出于同样的原因:纯粹的好奇心。我对任何被禁止的东西都有特别强烈的好奇心。我要亲眼看一下,然后自己做决定。


守口如瓶

一旦发现了“不能说的话”,下一步怎么办?我的建议就是别说,至少也要挑选合适的场合再说,只打那些值得打的仗


自由思考比畅所欲言更重要。如果你感到一定要跟那些人辩个明白,绝不咽下这口气,一定要把话说清楚,结果很可能是从此你再也无法自由理性地思考了。我认为这样做不可取,更好的方法是在思想和言论之间划一条明确的界线。在心里无所不想,但是不一定要说出来。我就鼓励自己在心里默默思考那些最无法无天的想法。你的思想是一个地下组织,绝不要把那里发生的事情一股脑说给外人听。“搏击俱乐部”的第一条规则,就是不要提到搏击俱乐部。


笑脸相迎?

你的策略,简单说,就是不赞同这个时代的任何一种歇斯底里,但是又不明确告诉别人到底不赞同哪一种歇斯底里。狂热分子试图引诱你说出真心话,但是你可以不回答。如果他们不放手,一定要你回答“到底是赞成还是反对我们”,你不妨以不变应万变:“我既不反对也不赞成。”
不过,更好的回答是“我还没想好”。哈佛大学校长拉里·撒墨尔斯(Larry Summers)被逼表态时,就是这样说的。 他后来解释说:“别想在我身上做石蕊试验 。”人们喜欢讨论的许多问题实际上都是很复杂的,马上说出你的想法对你并没有什么好处


永远质疑

所以每当你看到有些话被攻击为出自 ×× 分子或 ×× 主义,这就是一个明确的信号,表明背后有问题。不管在 1630 年还是在 2030 年,都是如此。当你听到有人在用这样的标签,就要问为什么。


如果自己就是潮水的一部分,怎么能看见潮流的方向呢?


4 良好的坏习惯

数据在本质上就是容易复制的。互联网的出现使得复制品更容易流通。难怪那些公司感到害怕了。但是,如同往常一样,恐惧影响了他们的判断。他们推动政府通过了严厉的法律,保护知识产权,作为对新技术的回应。立法者的原意可能是好的。但是,他们也许没有意识到,这样的法律弊大于利。


如果开发新技术时能意识到老技术能够带来益处 可以和老技术的持有者要求授权 以此为基础开发新技术 而不是人人能访问

数据在本质上就是容易复制的。互联网的出现使得复制品更容易流通。难怪那些公司感到害怕了。但是,如同往常一样,恐惧影响了他们的判断。他们推动政府通过了严厉的法律,保护知识产权,作为对新技术的回应。立法者的原意可能是好的。但是,他们也许没有意识到,这样的法律弊大于利。


近来一系列的政策变化,使得这个国家的公民自由范围不断收缩减小。对于黑客来说,这是非常不好的兆头。普通人肯定会感到大惑不解,为什么黑客如此在乎公民自由?为什么程序员会比牙医、销售员、园艺师更在乎呢?


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


这种事情早有先例:人们惊慌失措时采取的措施到头来产生了适得其反的效果。


代码之城

对于互联网软件,没人规定只能使用某些语言开发,因为所有的硬件都控制在你手里,你想要用什么语言,就能用什么语言。不同的语言适合不同的任务,你应该根据不同场合,挑选最合适的工具。尤其是在竞争者存在的情况下,“可以这样做”就变成了“必须这样做”(详见后文),因为如果你不利用语言的优势,那就会听任对手超过你。


软件 bug

软件公司有时会受到指责,因为他们竟然把发现 bug 的任务交给用户去完成。说实话,我其实提倡这种做法。对于互联网软件,这样做的好处很多,因为它的 bug 相对比较少,而且处理周期比较短


功能需有一定的质量保证,可以为了迭代速度牺牲一定的测试时间,上线后出问题尽快修复。

软件公司有时会受到指责,因为他们竟然把发现 bug 的任务交给用户去完成。说实话,我其实提倡这种做法。对于互联网软件,这样做的好处很多,因为它的 bug 相对比较少,而且处理周期比较短。


只要你能立刻解决 bug,对于普通用户来说,他们就会觉得你的软件几乎是毫无问题的。我觉得,普通的 Viaweb 用户可能一个 bug 都没遇到过。


因为软件发布以后,大多数 bug 都是罕见情况下才会发生的个案,受到影响的用户往往都是高级使用者,他们喜欢试验那些不常用的、难度大的操作。高级使用者对 bug 的容忍度比较高,尤其如果这些 bug 是在开发新功能的过程中引入的,而这些新功能又正是他们所需要的,他们就更能理解了。事实上,因为 bug 不多,你只有经过一些复杂的过程以后才会遇到它们,所以高级使用者往往因为发现了 bug 感到很得意。他们打电话给客服时,多半是一副胜利者的口吻,而不是怒气冲冲的样子,好像他们击败我们得分了一样。


全身心投入

将一个构思束之高阁,不仅意味着延迟它的实现,还意味着延迟所有在实现过程中激发的构思。事实上,将一个构思束之高阁,甚至会限制新构思的产生。


提高软件可靠性的关键在于开发时全神贯注,而不是降低开发速度。正是因为飞行员全神贯注,他才能在夜间让一架 18 吨重的飞机以 225 公里的时速平安降落在航空母舰的甲板上,做得比小孩子切面包还要安全。


金钱问题

一定数量的盗版对软件公司是有好处的。不管你的软件定价多少,有些用户永远都不会购买。如果这样的用户使用盗版,你并没有任何损失。事实上,你反而赚到了,因为你的软件现在多了一个用户,市场影响力就更大了一些,而这个用户可能毕业以后就会出钱购买你的软件


软件公司有时会采用分销模式,让 ISP 分销互联网软件。这样做很不好。服务器必须在你自己的控制之中,因为你需要不断改进硬件和软件。如果你放弃对服务器的直接控制,你就放弃了互联网软件的大部分优势。


目标客户

要让员工表现优秀,必须有竞争压力。销售员必须面对消费者,程序员必须面对竞争对手的软件,但是内部系统管理员就像老年单身汉,能够激励他的外部压力几乎没有。


桌面电脑

如果你现在开发桌面软件,就不得不接受微软公司的授权条款,调用它的 API,为它那个 bug 百出的操作系统伤透脑筋。历尽了千辛万苦,你最终写出了一个大受欢迎的软件,这时你可能会发现,你所做的一切其实只是在为微软公司做市场调查。


创业公司

程序员可能一整天都在伏案编写代码,然后到了某个时间,就下班回家,不再去想代码了。系统管理员则是永远都无法把工作抛到脑后,可能凌晨 4 点就会被叫到机房,不过好在大多数时候他们的工作都不是很复杂。互联网软件的出现使得这两种工作结合在一起,因此把它们各自不同的工作压力也合在一起。程序员变成了系统管理员,但是工作职责的范围却没有明确界定,使得工作压力陡然增加。


桌面软件迫使用户变成系统管理员,互联网软件则是迫使程序员变成系统管理员:用户的压力变小了,程序员的压力变大了。这未必是坏事。如果你的创业公司正在与一家大公司竞争,这一点就很有利。 互联网软件提供了一种天然的途径,使得你可以用较少的人力完成较多的工作,从而超过竞争对手。创业公司对这一点应该感到心满意足。


为什么不尝试一下

如果你是一个黑客,并且梦想自己创业,可能会有两件事情令你望而却步,不敢真正开始采取行动。一件是你不懂得管理企业,另一件是你害怕竞争。可是实际上,这两件事都是没有通电的电篱笆。
首先,管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。随着事业的发展,你自己就能琢磨出来其他的诀窍。


至于如何做出用户喜欢的产品,下面是一些通用规则。从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出 1.0 版,并且不断加以改进,整个过程中密切倾听用户的反馈。用户总是对的,但是不同的用户要求不一样。低端的用户要求简化操作和清晰易懂,高端的用户要求你增加新功能。软件最大的好处就是让一切变得简单。但是,做到这一点的方法是正确设置默认值,而不是限制用户的选择。如果竞争对手的产品很糟糕,你也不要自鸣得意。比较软件的标准应该是看对手的软件将来会有什么功能,而不是现在有什么功能。无论何时,你都要使用自己的软件。Viaweb 的主要功能是建立网上商店,但是我们也使用它建立自己的网站。不要只因为对方的头衔是市场专家、设计师或产品经理,就盲目听从他们的话。如果他们的观点真的很好,那就听从他们,关键是你要自己判断,不要盲从。只有懂得设计的黑客,才能设计软件,不能交给对软件一知半解的设计师。如果你不打算自己动手设计和开发,那就不要创业。


一个命题

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


工作是什么

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


更努力地工作

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


在大公司中,个人的表现无法单独测量,公司里其他人会拖累你。


可测量性和可放大性

我认为,任何一个通过自身努力而致富的个人,在他们身上应该都能同时发现可测量性和可放大性。我能想到的例子就有 CEO、电影明星、基金经理、专业运动员。有一个办法可以发现是否存在可放大性,那就是看失败的可能性。因为收入和风险是对称的,所以如果有巨大的获利可能,就必然存在巨大的失败可能。CEO、电影明星、基金经理、运动员的头顶都悬着一把宝剑,随时可能掉下来。一旦他们搞砸了,他们就完了。如果你有一个令你感到安全的工作,你是不会致富的,因为没有危险,就几乎等于没有可放大性。


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


而且,在任何情况下,如果聪明真的令他人妒忌,这反而会招来女生。因为女生喜欢被其他男生妒忌的男生。


小团队=可测量性

大公司就像巨型的古罗马战舰,一千个划船手共同划桨,推动它前进。但是,两个因素使得它快不起来。一个因素是,每个划船手看不到自己更努力划桨有何不同;另一个因素是,一千人的团队使得任何个人的努力都被大大地平均化了。


乔布斯曾经说过,创业的成败取决于最早加入公司的那十个人。我基本同意这个观点,虽然我觉得真正决定成败的其实只是前五人。小团队的优势不在于它本身的小,而在于你可以选择成员。我们不需要小村庄的那种“小”,而需要全明星第一阵容的那种“小”。


高科技=可放大性

小团队天生就适合解决技术难题。技术的发展是非常快的,今天很有价值的技术,几年后可能就会丧失价值。小团队在如今这个时代可谓如鱼得水,因为他们不受官僚主义和繁琐管理制度的拖累。而且,技术的突破往往来自非常规的方法,小团队就较少受到常规方法的约束。
大公司也能开发出新技术,就是开发得比较慢而已。大公司的规模决定了它们无法快速行动,也无法测量并奖励表现优异的员工。所以在现实中,大公司开发出来的新技术只出现在那些需要大规模资本投入的领域,比如微处理器、电厂、大型民用飞机等,因为在这些领域内创业公司没有能力与之竞争。不过,即使在这些领域,大公司还是依仗创业公司提供零部件和构思。


难包括:1 问题本身难以解决 2 市面上没有常规解决方案

在实际操作中,这就意味着我们故意选择那些很困难的技术问题。假定软件有两个候选的新功能,它们创造的商业价值完全相同,那么我们总是选择较困难的那个功能。不是因为这个功能能带来更多的收入,而是因为它比较难。我们很乐于迫使那些又大又慢的竞争对手跟着我们一起走进沼泽地。


俗话说得好,最好的防御就是进攻。如果你开发出来的技术是竞争对手难于复制的,那就够了,你不需要依靠其他防御手段了。一开始就选择较难的问题,此后的各种决策都选择较难的那个选项。


潜规则

但是,真正创业以后,你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。


用户数量

你必须时刻牢记的最基本的原则就是,创造人们需要的东西,也就是创造财富。


财富和权力

要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱,你就会无敌于天下。


财富的老爹模式

孩子没有能力创造财富,他们享有的一切都来自别人无偿的给予。既然得到财富不要求对应的付出,那么它当然应该平均分配。 大多数家庭都是这样,如果兄弟姐妹中有人多得到了一份,其他孩子就会喊:“不公平!”


人与人之间的差别并不是那么稳定的线性关系。也许 CEO 和运动员的技能和决心只比普通人高出 10 倍(倍数不重要),但是人与人之间就是存在着重大差别。


当我们说一些工作报酬过高,另一些工作报酬过低,我们的真实想法到底是什么?在自由竞争的市场经济中,价格由买家的需求决定。如果人们喜欢棒球甚于喜欢诗歌,那么棒球运动员的收入就是要比诗人的收入高。如果说某种工作的报酬过低,那就相当于说人们的需求不正确。
当然,人们确实会需求不正确的东西。这有什么好奇怪的呢?你不觉得声称某种工作报酬过低的说法更奇怪吗? 如果你觉得由于人们的需求不正确,导致某些工作的报酬过低而且不公平,那么这个世界一定会让你感到非常遗憾,人们就是喜欢看电视真人秀,而不是莎士比亚作品,人们就是喜欢吃玉米热狗,而不是水煮蔬菜,这是不是很不公平呀?要是你觉得不公平的话,那你就同把蓝颜色说成最漂亮的颜色、把方的说成圆的那样蛮不讲理


偷窃

如果税收是用在了强大国家 造福社会这些事情上 也相当于创造财富了

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


中产阶级的出现使得财富总量不再是一个固定不变的值,财富的分配也不再是一种零和游戏。苹果公司的两个创始人乔布斯和沃兹尼亚克没有使得他人变得更贫穷就赚到了钱。事实上,他们创造出来的东西使得人类的物质生活变得更富有。他们只能这样做,否则不会有人付钱给他们的。


巴尔扎克说过:“每一笔巨大财富的背后,都隐藏着罪行。”这句话被广泛引用,但是他其实说的是另一个意思,如果巨大财富没有明显的来源,那可能就来源于精心安排的犯罪活动,由于掩盖得太好,使得罪行被人遗忘了。如果我们正在谈论 11 世纪的欧洲,那么这样的误读反而是正确的。但是,巴尔扎克生活在 19 世纪的法国,那里的工业革命当时已经很发达了。巴尔扎克很清楚,你不用偷窃也可以发财。起码他自己就是这样做的,他写出受欢迎的小说,从而赚到了钱。


技术的杠杆效应

技术对生产效率的提高不是线性的,而可能是多项式形态(polynomial)的。所以,随着时间推移,我们应该会看到个人生产效率总是保持增长。这种增长会使得贫富差距不断扩大吗?这取决于你指的是什么“差距”。
技术应该会引起收入差距的扩大,但是似乎能缩小其他差距。一百年前,富人过着与普通人截然不同的生活。他们住在大房子里,有许多仆人服侍,穿着华丽但是不舒适的服装,乘着马车旅行(因此还有马厩和马夫)。现在,由于技术的发展,富人的生活与普通人的差距缩小了。


这不能说明穷人和富人生活差异生在缩小,而是人们总体生活质量提高了。差异还取决于穷人和富人提高的速度

富人与穷人之间生活差异的鸿沟正在缩小,品牌是这种差距的遗留物。


确实有很多人非常有钱,完全不必再去工作,他们之所以还在工作,不是因为感到社会压力,而是因为无所事事使人感到孤独和消沉。


公理的不同意见

我想提出一种相反的观点:现代社会的收入差距扩大是一种健康的信号。技术使得生产率的差异加速扩大,如果这种扩大没有反映在收入上面,只有三种可能的解释:(a)技术革新停顿了;(b)那些创造大部分财富的人停止工作了;(c)创造财富的人没有获得报酬。


如果我可以做选择,到底是生活在一个整体上非常富裕但是我个人相对贫穷的社会,还是生活在一个我个人相对非常富裕但是整体上非常贫穷的社会呢?我会选择第一个选项。如果我有小孩的话,可能哪一个选项更好还值得争论。但是,总的来说,你要避免的是绝对贫穷,而不是相对贫穷。如果必须在这两种社会之间做选择,根据目前的证据,我选择个人相对贫穷、但是整体上更富裕的社会。


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

开发垃圾邮件过滤器时,统计学方法往往不是程序员首先想到的方法


用户收到的垃圾邮件越多,他就越不可能注意到被过滤掉的垃圾邮件中包含着一封正常邮件。这就导致了一个很奇怪的后果,如果你的过滤器效果越好,就越不能出现误判,一旦误判,后果就会变得很严重,因为过滤器工作得非常良好,所以用户相信它,就不太可能去检查被它过滤掉的邮件。


如果上面的公式计算出来的概率大于 0.9,我就把这封邮件当作垃圾邮件。但是在实践中,把这个门槛值设为多少并不是很重要,因为计算出来的概率值大多数都分布在两端,很少落在中间。


数学家 Norbert Wiener 说,如果你与奴隶比赛,你也会变成一个奴隶。与垃圾邮件搏斗就有这种令人退化的效果。为了识别垃圾邮件的每一个特征,你不得不钻进发送者的脑袋,搞清楚他们怎么想。说实话,我一刻都不想待在那里。


刚开始的时候可以有一个所有人共享的基本概率分布表,但是到了最后,每个用户应该都分别有自己的概率分布表,这是根据他收到的邮件对每一个词进行统计后得出的。这样做可以:(a)使得过滤器更有效;(b)让每个用户自己定义,什么是他眼中的垃圾邮件;(c)使得垃圾邮件的发送者无法针对过滤器做出调整(这可能是最大的好处)。


9 设计者的品味

品味。如今很少听到这个词了,人们往往使用别的叫法,但它却的的确确是我们离不开的基本概念。我的朋友的意思是,他想要的学生不仅应该技术过硬,还应当能够使用技术做出优美的产品。
数学家会把出色的工作称赞为“优美的”。无论古今,科学家、工程师、音乐家、建筑师、设计师、作家、画家都是这样做的,他们都使用同一个词。这仅仅是巧合吗,还是他们之间有共识?如果真的有共识,那么我们能不能将某一个领域发现的“美”的规律运用于另一个领域呢?


喜欢一件东西,却不知道为什么自己喜欢它,原因可能是这件东西是美的,但也可能因为他们的母亲也拥有同样的东西,或者杂志上某个明星使用它,或者仅仅因为它的价格很昂贵。人类的思想就是没有经过整理的无数杂念的混合。


把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。但是问题是,这种说法是不正确的。只要你自己开始动手设计东西,就能明白这一点。


装饰品本身并不是坏事,只有当它被用来掩盖结构的苍白时,才变成了一件坏事。


这样强调简单似乎有点奇怪。有人会说,简单就是事物本来的样子,装饰反而意味着更多的工作。但是,当人们自己从事创造性工作的时候,好像就会忘了保持简单这个原则。刚开始写作的人喜欢用浮夸的语调,根本不像他们平时说话的样子。设计师喜欢用波浪式卷曲表现他们的艺术感。画家发现自己都是表现主义者(expressionist)。这些装饰都是花架子,在作家的长句、画家“表现主义”的画笔之下,根本就是空洞无物,表面的装饰掩盖了内部的空虚,太可怕了。


当你被迫把东西做得很简单时,你就被迫直接面对真正的问题。当你不能用表面的装饰交差时,你就不得不做好真正的本质部分。


好设计是永不过时的设计。


永不过时作为目标是一种帮助自己找到最佳答案的方法:如果你不愿别人的答案取代你的答案,你就只好自己做出最佳答案。某些大师的作品太过杰出,永不过时,使得后人几乎难以在该领域立足。自从 16 世纪出现了德国雕刻大师丢勒(Dürer),后世的雕刻家都因为自己的作品被拿来与他的作品作比较而苦不堪言。


好设计是解决主要问题的设计。


好设计是启发性的设计。


在建筑学和设计学中,这条原则意味着,一幢建筑或一个物品应该允许你按照自己的愿望来使用。


好设计通常是有点趣味性的设计


我想,这是因为幽默一定程度上反映了力量。幽默感是强壮的一种表现,始终拥有幽默感就代表你对厄运一笑了之,而丧失幽默感则表示你被厄运深深伤到。所以,强壮的标志(或者至少是特点)就是轻松面对自己的人生。充满自信的人常常像燕子一样,以一种居高临下的姿态轻盈地看待周围的一切


好设计是艰苦的设计。如果观察那些做出伟大作品的人,你会发现他们的共同点就是工作得非常艰苦。如果你工作得不艰苦,你可能正在浪费时间。
困难的问题需要艰巨的付出才能解决,高难度的数学证明需要结构非常精细的解决方法(它们往往做起来很有趣),工程学也是如此。


好设计是看似容易的设计


好设计是对称的设计。


好设计是模仿大自然的设计。我不是说模仿大自然这种行为本身有多么好,而是说大自然在长期的演化中已经解决了很多设计问题。所以,如果你的设计与大自然很接近,那么它基本上不会很差


好设计是一种再设计。


好设计是能够复制的设计。我们对待复制的态度经常是一个否定之否定的过程。刚入门的新手不知不觉地模仿他人,逐渐熟练之后才开始创作原创性作品。最后他会意识到,把事情做对比原创更重要。


不知不觉的模仿几乎必然将导致坏设计。如果你不知道自己的想法从何而来,那么你可能就是在模仿另一个模仿者。19 世纪中期,拉斐尔画派主导了整个画坛,几乎每个学画的人都在模仿拉斐尔,可是经常谬以千里。有一些艺术家实在看不下去了,被如此之多模仿拉斐尔的人搞烦了,于是成立了前拉斐尔画派 。
等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。
我想,最伟大的大师最终会达到一种超脱自我的境界。他们一心想找到正确答案,如果别人已经回答出了一部分,那就没理由不拿来用。他们足够自信地使用他人的成果,完全不担心因此丧失个人的特点。


唯一达到“奇特”的方法,就是追求做出好作品,完成之后再回过头看。


好设计是成批出现的


好设计常常是大胆的设计。


今天的实验性错误就是明天的新理论。如果你想做出伟大的新成果,那就不能对常识与真理不相吻合之处视而不见,反而应该特别注意才对。


单单是无法容忍丑陋的东西还不够,只有对这个领域非常熟悉,你才可能发现哪些地方可以动手改进。你必须锻炼自己。只有在成为某个领域的专家之后,你才会听到心里有一个细微的声音说:“这样解决太糟糕了!一定有更好的选择。”不要忽视这种声音,要培育它们。优秀作品的秘诀就是:非常严格的品味,再加上实现这种品味的能力。


机器语言

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


高级语言

编译器不是高级语言唯一的实现方法,另一种方法是使用解释器,它的作用是实时地将代码解释为相应的机器语言,然后一行行运行。相比之下,编译器则是先将整个程序全部翻译成机器语言,然后再运行。


开放源码

开放源码的优势还不仅局限于可以自己动手解决 bug。这里的关键是所有人都可以参与。所以,开源软件就像一篇经受同行评议的论文。许许多多的聪明人仔细阅读了 Linux 和 FreeBSD 这样的开源操作系统的源码,发现并且解决了大量的 bug。相比之下,Windows 的可靠性只能依赖于大公司自己的质量保证部门了。


语言的战争

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


文艺复兴

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


11 一百年后的编程语言

无论何时,选择进化的主干可能都是最佳方案。要是你不幸选错了,变成了一个尼安德特人,那就太糟了。你的对手克鲁马努人时不时就会来攻打你,把你的食物全部偷走。
这就是我想找出一百年后的编程语言的原因。我不愿意押错赌注。


编程语言之所以可能出现聚合,一个原因是它的概率空间  比较小,另一个原因是它的突变不是随机的。语言的设计者们总是有意识地借鉴其他语言的设计思想。
对于语言设计者来说,认清编程语言的进化路径特别有用,因为这样就可以照着样子设计语言了。这时,认清进化的主干就不仅有助于识别现存的优秀语言,还可以把它当作设计语言的指南。


我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。


我已经预测了,一旦未来硬件的性能大幅提高将会发生什么事。新增加的运算能力都会被糟蹋掉。


对速度的追求是人类内心深处根深蒂固的欲望。当你看着计算机这个小玩意,就会不由自主地希望程序运行得越快越好,真的要下一番功夫才能把这种欲望克制住。设计编程语言的时候,我们应该有意识地问自己,什么时候可以放弃一些性能,换来一点点便利性的提高。


如果我们把一种语言的内核设想为一些基本公理的集合,那么仅仅为了提高效率就往内核添加多余的公理,却没有带来表达能力的提升,这肯定是一件很糟的事。没错,效率是很重要,但是我认为修改语言设计并不是提高效率的正确方法。


Lisp 语言的黑客早就明白数据结构灵活性的价值。我们写程序的第一版时,往往会把所有事情都用列表的形式处理。所以,这些最初版本可能效率低下得惊人,你必须努力克制自己才能忍住不动手优化它们,这就好像吃牛排的时候必须努力克制自己才能不去想牛排是从哪里来的一样,至少对我来说是这样的。


效率低下的软件并不等于很烂的软件。一种让程序员做无用功的语言才真正称得上很烂。浪费程序员的时间而不是浪费机器的时间才是真正的无效率。随着计算机速度越来越快,这会变得越来越明显。


因为这段差距正在变得越来越大,所以性能分析器(profiler)将变得越来越重要。目前,性能分析并没有受到重视。许多人好像仍然相信,程序运行速度提升的关键在于开发出能够生成更快速代码的编译器。代码效率与机器性能的差距正在不断加大,我们将会越来越清楚地看到,应用软件运行速度提升的关键在于有一个好的性能分析器帮助指导程序开发。


尽管事实上静态类型语言看来无法真正支持宏


设计新语言的方法之一就是直接写下你想写的程序,不管编译器是否存在,也不管有没有支持它的硬件。这就是假设存在无限的资源供你支配。不管是今天还是一百年后,这样的假设好像都是有道理的。


你也许觉得,对于人类这样懒惰的生物,喜欢用最省力的方式写程序是再自然不过的事情。但是事实上,我们的思想可能往往会受限于某种现存的语言,只采用在这种语言看来更简单的形式,它对我们思想的束缚作用会大得令人震惊。新语言必须靠你自己去发现,不能依靠那些让你自然而然就沉下去的思维定势。


秘密武器

埃里克·雷蒙德写过一篇文章《如何成为一名黑客》(How to Become a Hacker)。文中有一部分专门谈到,在他看来,如果你想当一个黑客,应该学习哪些语言。他建议从 Python 和 Java 入手,因为它们比较容易学。想当高级一点的黑客,还应该学习 C 和 Perl。前者用来对付 Unix 系统,后者用来系统管理和开发 CGI 脚本。最后,真正非常严肃地把黑客作为人生目标的人,应该考虑学习 Lisp:
Lisp 很值得学习。你掌握它以后,会感到它给你带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到 Lisp。


如果选择哪种语言都行,你到底使用哪一种语言?我们选择 Lisp。首先,很明显,对于这个市场来说,快速开发出产品是很重要的。我们所有人都是从零开始,所以能够快速做出新功能的公司就会取得巨大的竞争优势。我们知道 Lisp 语言真的非常合适快速开发软件,而且我们的软件运行在服务器端,你一写完代码就能发布出去,所以这又进一步放大了快速开发的效果。


我们唯一擅长的事情就是开发软件。我们希望这一点可以弥补我们的劣势。任何在软件开发上面有助于我们获得优势的事情我们都不能放过。


在竞争中,你的对手无法理解你的技术优势,这可是再宝贵不过了。商场如战场,对手摸不透你,你的胜算就增加了。


Blub 困境

大家都知道,徒手用机器语言写出整个程序是一件很蠢的事。但是,把这个观点推广到一种更普遍的情况,知道的人就不多了。如果你有好几种语言可以选择,在不考虑其他因素的情况下,你不选择最强大的那种语言就是一件很蠢的事。


我自己的经历也证实了这个看法。高中时我喜欢用 Basic 语言编程。这种语言功能很弱,甚至不支持递归,很难想象没有递归还怎么编程。但是我那时根本没觉得有损失,Basic 语言控制了我的思维。当时我非常精通 Basic 语言,只要是学过的部分都能熟练地使用。


创业公司的合气道

技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。 所以,一种很普通的编程语言就是很普通的程序员使用的语言,它的变化就像冰山那样缓慢。大概在 1960 年,Lisp 语言引入了垃圾回收机制(Garbage Collection),今天已经被广泛认为是非常好的做法。Lisp 的动态类型特点也同样受到越来越多人的认同。闭包是 20 世纪 60 年代 Lisp 语言引入的功能,现在的接受程度还很低。宏也是 60 年代中期 Lisp 语言引入的,现在还是一片处女地。
很显然,那些很普通的编程语言正在主导一切。我不建议你挑战这种强大的习惯势力,相反,我建议你向日本合气道选手学习,利用这种势力削弱你的竞争对手,让他们自食其果。


如果你为创业公司工作,那么这里有一个评估竞争对手的妙招——关注他们的招聘职位。他们网站上的其他内容无非是一些陈腐的照片和夸夸其谈的文字,但是招聘职位却不得不写得很明确,反映出他们到底想干什么,否则就会引来一大批不合适的求职者。
在 Viaweb 创业期间,我读过大量竞争对手的招聘职位。差不多每个月都有一个新的竞争对手浮出水面。我首先会看他们的产品有没有一个试用版,然后就去找他们的招聘职位。这样过了几年,我就知道哪些公司值得关注,哪些公司不用在意。有些公司的职位描述使用了大量的 IT 词汇,这样的内容越多,这家公司就越不构成威胁。最不用担心的竞争对手就是那些要求应聘者具有 Oracle 数据库经验的公司,你永远不必担心他们。如果是招聘 C++或 Java 程序员的公司,对你也不会构成威胁。如果他们招聘 Perl 或 Python 程序员,就稍微有点威胁了。至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘 Lisp 黑客的公司,就会真的感到如临大敌。


13 书呆子的复仇

那些经理奇迹般地同时具备了两种很常见但很难结合在一起的特点:(a)对技术一无所知;(b)对技术有强烈的个人观点。
举例来说,假设你需要写一个软件。你的经理根本不懂这个软件的运作机制,也不知道各种编程语言有什么区别。但是,他竟然明确要求你一定要使用某一种语言进行开发。没错,他就是要求你一定要用 Java 语言。


当你按照 Java、Perl、Python、Ruby 这样的顺序观察这些语言,你会发现一个有趣的结果。至少,如果你是一个 Lisp 黑客,你就看得出来,排在越后面的语言越像 Lisp。


朝着数学的方法发展

Lisp 和 Fortran 代表了编程语言发展的两大方向。前者的基础是数学,后者的基础是硬件架构。从那时起,这两大方向一直在互相靠拢。Lisp 语言刚设计出来的时候就很强大,接下来的二十年它提高了运行速度。而那些所谓的主流语言把更快的运行速度作为设计的出发点,然后再用四十多年的时间一步步变得更强大。直到今天,最高级的主流语言也只是刚刚接近 Lisp 的水平。虽然已经很接近了,但还是没有 Lisp 那样强大。


为什么 Lisp 语言很特别

术语“宏”在 Lisp 语言中的意思与其他语言中的不一样。Lisp 宏无所不包,它既可能是某样表达式的缩略形式,也可能是一种新语言的编译器。无论是想真正理解 Lisp 语言,还是只想拓宽编程视野,最好都学学宏。


向心力

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


乔纳森·埃里克森说现在是“编程语言的文艺复兴时期”,我想最大的原因就是有了服务器端软件。


如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来。如果没有用户,谁会关心你选择的“正统”技术是多么令人放心。


一个诀窍

所以,我们就有了两点结论,我认为它们非常有价值。事实上,这是我用自己的经历换来的。第一,不同语言的编程能力不一样。第二,大多数经理故意忽视第一点。你把这两点事实结合起来,其实就得到了赚钱的诀窍。ITA 软件公司是运用这个诀窍的典型例子。如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。


附录:编程能力

如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用:(a)使用一种强大的语言;(b)为这个难题写一个事实上的解释器;或者(c)你自己变成这个难题的人肉编译器。在 Python 的例子中,这样的处理方法已经开始出现了,我们实际上就是自己写代码,模拟出编译器实现词法变量的功能。


这种实践不仅很普遍,而且已经制度化了。举例来说,在面向对象编程的世界中,我们大量听到“模式”(pattern)这个词,我觉得那些“模式”就是现实中的因素(c),也就是人肉编译器。 当我在自己的程序中发现用到了模式,我觉得这就表明某个地方出错了。程序的形式应该仅仅反映它所要解决的问题。代码中其他任何外加的形式都是一个信号,(至少对我来说)表明我对问题的抽象还不够深,也经常提醒我,自己正在手工完成的事情,本应该写代码通过宏的扩展自动实现。


流行的秘诀

所以,即使不考虑语言本身的优秀是否能带动流行,我想单单流行本身就肯定会使得这种语言变得更好,只有流行才会让它保持优秀。


外部因素

一种语言必须是某一个流行的计算机系统的脚本语言(scripting language),才会变得流行。Fortran 和 Cobol 是早期 IBM 大型机的脚本语言。C 是 Unix 的脚本语言,后来的 Perl 和 Python 也是如此。Tcl 是 Tk 的脚本语言,Visual Basic 是 Windows 的脚本语言,(某种形式的)Lisp 是 Emacs 的脚本语言,PHP 是网络服务器的脚本语言,Java 和 JavaScript 是浏览器的脚本语言。


简洁

黑客都是懒人,他们同数学家和现代主义建筑师一样,痛恨任何冗余的东西或事情


可编程性

在编程语言的历史上,防止程序员做出“错误”举动的措施多得惊人。这是语言设计者很自以为是的危险举动,他们怎么知道程序员该做什么不该做什么?我认为,语言设计者应该假定他们的目标用户是一个天才,会做出各种他们无法预知的举动,而不是假定目标用户是一个笨手笨脚的傻瓜,需要别人的保护才不会伤到自己。如果用户真的是傻瓜,不管你怎么保护他,他还是会搬起石头砸自己的脚。你也许能够阻止他引用另一个模块中的变量,但是你没法防止他日日夜夜不知疲倦地写出结构混乱的程序去解决完全错误的问题。


你应该敞开胸怀,欢迎这种揣测。对于制造工具的人来说,总是会有用户以违背你本意的方式使用你的工具。如果你制造的是编程语言这样高度组合的系统,那就更是如此了。许多黑客会用你做梦也想不到的方式改动你的语法模型。我的建议就是,让他们这样干吧,而且应该为他们创造便利,尽可能多地把语言的内部暴露在他们面前。


一次性程序

为了吸引黑客,一种编程语言必须善于完成黑客想要完成的各种任务。这意味着它必须很适合开发一次性程序。这一点可能出乎很多人的意料。
所谓一次性程序,就是指为了完成某些很简单的临时性任务而在很短时间内写出来的程序


开发大型程序的另一个方法就是从一次性程序开始,然后不断地改进。这种方法比较不会让人望而生畏,程序在不断的开发之中逐渐进步


函数库

函数库的使用应该符合程序员的直觉,让他可以猜得出哪个函数能满足自己的需要。


效率

编程时提高代码运行速度的关键是使用好的性能分析器(profiler),而不是使用其他方法,比如精心选择一种静态类型的编程语言。


性能分析器甚至有可能自动找出不合理的算法。如果将来有人发现某种形式的内存访问是不合理算法的信号,我不会感到很惊讶。如果有一个小人儿可以钻进计算机看看我们的程序是怎么运行的,他可能会变成一个忙碌又悲惨的可怜虫,就像那些为政府跑腿的小人物。我总觉得自己用处理器做了很多无用功,但是一直没有找到能够看出程序是怎样浪费运算能力的好办法。


编程语言在这方面也能发挥作用,对线程的良好支持将使得所有用户共享同一个内存堆(heap)。持久化对象和语言内核级别的延迟加载(lazy loading)支持也有助于减少内存需求。


时间

人们真正注意到你的时候,不是第一眼看到你站在那里,而是发现过了这么久你居然还在那里。


诞生头几年,一小批早期使用者比其他因素更能促进技术发展。早期使用者都是行家,要求也很高,能够很快找出你的技术中存在的缺点。


新技术被市场接纳的方式有两种,一种是自然成长式,另一种是大爆炸式。自然成长式的一个例子就是在车库里白手起家、自力更生的创业者。几个好朋友埋头工作,在外界毫不知晓的情况下开发出某种新技术。他们把它推向市场,没有任何宣传,最初的用户寥寥无几(但是热心程度无与伦比)。创业者持续改进新技术,与此同时,通过口碑效应,用户数量不断增长。在创业者不经意间,他们已经壮大起来了。
大爆炸式的例子是有风险资本支持、在市场上大张旗鼓宣传的创业公司。他们急急忙忙地开发一个产品,推向市场的时候大肆曝光,立刻就获得了一大批使用者(至少他们希望如此)。


再设计

为了写出优秀软件,你必须同时具备两种互相冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。在你的大脑中,有一个声音说“千难万险只等闲”,还有一个声音却说“早岁哪知世事艰”。
这里的难点在于你要意识到,实际上这两种信念并不矛盾。你的乐观主义和怀疑倾向分别针对两个不同的对象。你必须对解决难题的可能性保持乐观,同时对当前解法的合理性保持怀疑


生活也是如此

如果你能平衡好希望和担忧,它们就会推动项目前进,就像自行车在保持平衡中前进一样。在创新活动的第一阶段,你不知疲倦地猛攻某个难题,自信一定能够解决它。到了第二阶段,你在清晨的寒风中看到自己已经完成的部分,清楚地意识到存在各种各样的缺陷。此时,只要你对自己的怀疑没有超过你对自己的信心,就能够坦然接受这个半成品,心想不管多难我还是可以把剩下的部分做完。
让这两股相反的力量保持平衡是很难的。初出茅庐的年轻黑客都很乐观,自以为做出了伟大的产品,从不反思和改进。上了年纪的黑客又太不自信,甚至故意回避一些挑战性很强的项目。


15 设计与研究

设计与研究的区别看来就在于,前者追求“好”(good),后者追求“新”(new)。优秀的设计不一定很“新”,但必须是“好”的;优秀的研究不一定很“好”,但必须是“新”的。


注意,我说的是“用户需要的设计”,而不是“用户要求的设计”。我不想让读者产生一种印象,认为设计师就像厨师一样,顾客点什么菜就一模一样做出来。艺术的各个领域有着巨大的差别,但是我觉得任何一个领域的最佳作品都不可能由对用户言听计从的人做出来。
有一句话说“顾客永远是对的”,这是指评价优秀设计的标准是看它能够多大程度上满足用户的需求。如果你的小说没人爱看,或者你做的椅子极不舒服,那么就说明你的作品失败了,被一票否决了。就算你的小说(或者椅子)有着最先进的理论指导也无济于事。


除非设定目标用户,否则一种设计的好坏根本无从谈起。


软件开发也可以这样做。原型(prototype)并不只是模型(model),不等于将来一定要另起炉灶,你完全能够在原型的基础上直接做出最后的成品。我认为,只要有可能,你就应该这样做。这样的方式使得你可以利用在开发过程中一路产生的新想法。不过更重要的是,这样做有助于鼓舞士气。


士气是设计的关键因素。令我吃惊的是,大家很少提到这一点。我的一位美术启蒙老师告诉我:如果你觉得画某样东西很乏味,那么你画出来的东西就会真的很乏味。比如,假设你必须画一幢建筑物,你决定从每一块砖头开始画起。你觉得自己可以坚持下去,但是画到一半的时候突然感到很厌倦,于是你就不再认真观察每块砖头并画出它们各自不同的特点,而是以一种机械重复的方式草草地把砖头画完了事。这样一来,你的作品效果就很差,甚至还不如一开始就不采用写实手法,只是若隐若现地暗示砖头的存在。


先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。如果你正在写的代码一个小时之后就可以看到运行结果,这好比让你看到不远处就是唾手可得的奖励,你因此会受到激励和鼓舞。