【书摘】黑客与画家

黑客行为必须包含三个特点:好玩、高智商、探索精神。只有其行为同时满足这三个标准,才能被称为“黑客”。


他说:“运营创业公司,每天都像在战斗;而为大公司工作,就像在窒息中挣扎。”于是,他选择了辞职。

根据理查德·斯托尔曼的说法,黑客行为必须包含三个特点:好玩、高智商、探索精神。只有其行为同时满足这三个标准,才能被称为“黑客”。另一方面,它们也构成了黑客的价值观,黑客追求的就是这三种价值,而不是实用性或金钱。

黑客价值观的核心原则可以概括成这样几点:分享、开放、民主、计算机的自由使用、进步。

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

任何一种艺术,不管是否重要,如果你想要在该领域出类拔萃,就必须全身心投入。

书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。他们的注意力都放在读书或者观察世界上面,而不是放在穿衣打扮、开晚会上面

青少年在心理上还没有摆脱儿童状态,许多人都会残忍地对待他人。他们折磨书呆子的原因就像拔掉一条蜘蛛腿一样,觉得很好玩。在一个人产生良知之前,折磨就是一种娱乐。

黑客与画家的共同之处,在于他们都是创作者。与作曲家、建筑师、作家一样,黑客和画家都是试图创作出优秀的作品。他们本质上都不是在做研究,虽然在创作过程中,他们可能会发现一些新技术(那样当然更好)。

当然,“做什么”和“怎么做”不应该分得太开。如果你决定做一件事,却不知道怎么做,你就是在自找麻烦。但是,只是单纯地决定如何实现某种规格,那肯定不是黑客。黑客的最高境界是创造规格。虽然看起来,做到这一点的最好方法就是先做出一个样品把规格实现了。

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

我发现,黑客新想法的最佳来源,并非那些名字里有“计算机”三个字的理论领域,而是来自于其他创作领域。与其到“计算理论”领域寻找创意,你还不如在绘画中寻找创意。

编程语言是用来帮助思考程序的,而不是用来表达你已经想好的程序。它应该是一支铅笔,而不是一支钢笔。如果大家都像学校教的那样编程,那么静态类型(static typing)是一个不错的概念。但是,我认识的黑客,没有一个人喜欢用静态类型语言编程。我们需要的是一种可以随意涂抹、擦擦改改的语言,我们不想正襟危坐,把一个盛满各种变量类型的茶杯,小心翼翼放在自己的膝盖上,为了与一丝不苟的编译器大婶交谈,努力地挑选词语,确保变量类型匹配,好让自己显得礼貌又周到。

因为实际上只有很少一部分黑客懂得如何正确设计软件,公司的管理层很难正确识别到底应该把设计软件的任务交给谁。所以,大部分公司不把设计软件的职责交给一个优秀的黑客,而是交给一个委员会,黑客的作用仅仅是实现那个委员会的设计。

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

创业的另一个问题是赚钱的软件往往不是好玩的软件,两者的重叠度不高。设计编程语言是很好玩的事情,事实上,微软的第一个产品就是一种编程语言。但是,如今没有人会出钱买编程语言。如果你想赚钱,你可能不得不去干那些很麻烦很讨厌的事情,因为这些事情没人愿意义务来干

黑客如何才能做自己喜欢的事情?我认为这个问题的解决方法是一个几乎所有创作者都知道的方法:找一份养家糊口的“白天工作”(day job)

因为如果你不爱一件事,你不可能把它做得真正优秀,要是你很热爱编程,你就不可避免地会开发你自己的项目

有一件事情是可以借鉴的(至少可以确认),那就是应该如何学习编程。画家学习绘画的方法主要是动手去画,黑客学习编程的方法也理应如此。大多数黑客不是通过大学课程学会编程的,他们从实践中学习,13岁时就自己动手写程序了

黑客通过实践学习编程,这又是一个标志,说明黑客与科学家的区别有多大。科学家就不会通过干活来学习科学,而是通过做实验和解题来学习。科学家研究的基础都是现有的很完美的成果,在这个意义上,他们的第一步只是在复制别人已经做过的工作。最后,他们才会从某一个点开始,进行自己的原创性工作。但是,黑客就不一样,从一开始做的就是原创性工作,根本没有他人完美的成果可以依靠。所以,黑客的出发点是原创,最终得到一个优美的结果;而科学家的出发点是别人优美的结果,最终得到原创性。

创作者另一个学习的途径是通过范例。对画家来说,博物馆就是美术技巧的图书馆。几百年来,临摹大师的作品一直是传统美术教育的一部分,因为临摹迫使你仔细观察一幅画是如何完成的。

同样地,黑客可以通过观看优秀的程序学会编程,不是看它们的执行结果,而是看它们的源代码。开源运动最鲜为人知的优点之一,就是使得学习编程变得更容易了。

还有一个可以借鉴绘画的地方:一幅画是逐步完成的。通常一开始是一张草图,然后再逐步填入细节。但是,它又不单纯是一个填入细节的过程。有时,原先的构想看来是错的,你就必须动手修改。

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

一种好的编程语言,应该像油画颜料一样,能够使得我们很从容地改变想法。动态类型语言在这一点上就是赢家,因为你不必提前就设置好各种变量的数据类型。不过我认为,编程语言灵活性的关键还不在这里,而在于这种语言应该非常抽象。最容易修改的语言就是简短的语言。

坚持一丝不苟,就能取得优秀的成果。因为那些看不见的细节累加起来,就变得可见了。

如果黑客只是一个负责实现领导意志的技术工人,职责就是根据规格说明书写出代码,那么他其实与一个挖水沟的工人是一样的,从这头挖到那头,仅此而已。但是,如果黑客是一个创作者,他从事的就不是机械性的工作,他必须具备灵感。

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

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

就像绘画作品一样,大多数软件是为人类用户准备的。所以,黑客必须像画家一样,时刻考虑到用户的人性需要,这样才能做出伟大的产品。你必须能够站在用户的角度思考问题,也就是说你必须学会“换位思考”。

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

判断一个人是否具备“换位思考”的能力有一个好方法,那就是看他怎样向没有技术背景的人解释技术问题。

软件的部分功能就是解释自身。为了写出优秀软件,你必须假定用户对你的软件基本上一无所知。你要明白,用户第一次使用你的软件的时候,不会预先做好功课,他们没有任何准备就开始用了,所以软件的使用方式最好能符合用户的直觉,别指望用户去读使用手册。

程序写出来是给人看的,附带能在机器上运行。

所谓“时尚”,本质上就是自己看不见自己的样子。好比我们在地球上,却感觉不到地球在动。但真正令人惊恐的是,流行一时的不仅有衣服,还有道德观念。明明是专横武断、毫无依据的错误观点,但是大多数人却深信不疑,受到影响而不自知。这是非常危险的。

历史的常态似乎就是,任何一个年代的人们,都会对一些荒谬的东西深信不疑。他们的信念还很坚定,只要有人稍微表示一点怀疑,就会惹来大麻烦。

为了防止他人复制,古代制作地图的工匠会故意在地图上画错一个小地方。如果你的地图与他的地图一样,就说明不太可能是你自己独立制作的。

我猜想,道德禁忌的最大制造者是那些权力斗争中略占上风的一方。你会发现,这一方有实力推行禁忌,同时又软弱到需要禁忌保护自己的利益。

优秀作品往往来自于其他人忽视的想法,而最被忽视的想法就是那些被禁止的思想观点

训练自己去想那些不能想的事情,你获得的好处会超过所得到的想法本身。

人们喜欢讨论的许多问题实际上都是很复杂的,马上说出你的想法对你并没有什么好处。

如果你想要清晰地思考,就必须远离人群。但是走得越远,你的处境就会越困难,受到的阻力也会越大,因为你没有迎合社会习俗,而是一步步地与它背道而驰。

在大众眼里,“黑客”(hacker)就是入侵计算机的人。可是,在程序员眼里,“黑客”指的是优秀程序员。这两个含义其实是相关的。对于程序员来说,“黑客”这个词的字面意思主要就是“精通”,也就是他可以随心所欲地支配计算机。

丑陋的做法与聪明的做法存在一个共同点,那就是都不符合常规

总体来看,黑客是不服从管教的,这往往会激怒管理当局。但是,不服从管教,其实是黑客之所以成为优秀程序员的原因之一

最新的版权法设置了前所未有的障碍,禁止外部人员了解专有技术的内部细节,从而也就禁止了外部人员从这个途径产生新构想

公民自由并不仅仅是社会制度的装饰品,或者一种很古老的传统。公民自由使得国家富强。如果将人均国民生产总值与公民自由的关系画成图,你会发现它们是很清楚的正相关关系。公民自由真的是国家富强的原因,而不是结果吗?我认为是的。在我看来,一个人们拥有言论自由和行动自由的社会,往往最有可能采纳最优方案,而不是采纳最有权势的人提出的方案。专制国家会变成腐败国家,腐败国家会变成贫穷国家,贫穷国家会变成弱小国家

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

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

但是,硬件需要考虑的地方,不仅仅在于怎么才能避免出问题,还在于怎样才能最大地发挥它们的作用。只要你控制了硬件,就能为用户提供更多的功能。

对于互联网软件,没人规定只能使用某些语言开发,因为所有的硬件都控制在你手里,你想要用什么语言,就能用什么语言。不同的语言适合不同的任务,你应该根据不同场合,挑选最合适的工具。

互联网软件每时每刻都在被使用。你的代码一上线,就会经历严酷考验。bug很快就会浮出水面。

早一点发现bug就不容易形成复合式bug,也就是互相影响的两个bug。

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

我们的客户支持是免费的,因为我们希望知道用户的反应。如果他们使用时遇到困难,我们希望立刻知道,这样就能再现错误、解决问题、发布新版本。

我们的这种方法让所有人都感到满意。客户很高兴,拨打厂商服务热线是免费的,而且还被当作通风报信的人,受到郑重对待。客服人员也喜欢这样,因为这使得他们可以帮助用户,而不是对着用户读操作手册;程序员喜欢这样,因为他们能够再现bug,而不是通过模糊不清的二手报告了解bug。

能够即时发布软件,对开发者是一个巨大的激励。步行上班途中,我经常会想哪些地方还需要变动,然后当天就予以实现。一些重大功能也是这样来的。即使某个功能要花两个星期(或者更长时间)开发,我也很确定,一旦写完就可以立刻看到效果。

如果软件的新版本要等到一年后才能发布,我就会把大部分新构思束之高阁,至少过上一段时间再来考虑。但是,构思这种东西有一个特点,那就是它会导致更多的构思。你有没有注意过,坐下来写东西的时候,一半的构思是写作时产生的?软件也是这样。实现某个构思,会带来更多的构思。所以,将一个构思束之高阁,不仅意味着延迟它的实现,还意味着延迟所有在实现过程中激发的构思。事实上,将一个构思束之高阁,甚至会限制新构思的产生。

Viaweb和其他许多软件公司一样,大部分代码都有明确的负责人,而且只有一个。如果你负责某件事,那就真的是你负责。除了你以外,没有人能批准(他们甚至都不知道)这部分代码的发布。如果你出错了,没有人会提醒你,唯一的代码保护机制就是你的羞耻心,你不想被同事当成傻瓜,这就足矣

要让软件变得可靠,关键是你要全神贯注,而不是开发得很慢。

互联网软件不仅把开发者与他的代码更紧密地联系在了一起,而且把开发者与他的用户也更紧密联系在了一起

效率对互联网软件至关重要,因为硬件费用由你支付。你的资本支出成本除以服务器所能支持的最大用户数量,就是你为每个用户付出的成本。如果你的软件效率高,你就能比同样硬件配置的竞争对手多发展用户,获得更多的利润

如果软件效率足够高,每个用户的硬件成本现在可以接近免费。

我认为,如果公开收取软件的订阅费,而不是让用户购买软件的所有权,操作起来会更自然、更简便。“订报纸模式”正是互联网软件天然的收费模式。

有钱的客户倾向于更贵的选择,即使便宜的选择更符合他们的需要,他们也不会买。这种现象普遍存在。

我认为,许多人没有意识到最早的创业公司是多么脆弱和踌躇。许多创业公司的出现完全出于偶然。

开发互联网软件的创业公司会把与创业有关的每一件事做到极致。只用更少的人、更少的钱,就可以把软件写出来,并且开始运作。你必须打破常规、快速行动,循规蹈矩不可能成功

如果你是一个黑客,并且梦想自己创业,可能会有两件事情令你望而却步,不敢真正开始采取行动。一件是你不懂得管理企业,另一件是你害怕竞争。可是实际上,这两件事都是没有通电的电篱笆。

首先,管理企业其实很简单,只要记住两点就可以了:做出用户喜欢的产品,保证开支小于收入。只要做到这两点,你就会超过大多数创业公司。随着事业的发展,你自己就能琢磨出来其他的诀窍。

从制造简洁的产品开始着手,首先要保证你自己愿意使用。然后,迅速地做出1.0版,并且不断加以改进,整个过程中密切倾听用户的反馈。用户总是对的,但是不同的用户要求不一样。低端的用户要求简化操作和清晰易懂,高端的用户要求你增加新功能。软件最大的好处就是让一切变得简单。但是,做到这一点的方法是正确设置默认值,而不是限制用户的选择

如果他们的观点真的很好,那就听从他们,关键是你要自己判断,不要盲从。只有懂得设计的黑客,才能设计软件,不能交给对软件一知半解的设计师。如果你不打算自己动手设计和开发,那就不要创业。

创业公司往往与技术有关,所以“高技术创业公司”这个短语几乎就是同义重复。创业公司其实就是解决了某个技术难题的小公司。

任何公司的成功历程中,运气都是一个很大的随机因素。

通过创造有价值的东西而致富,这种方法的优势不仅仅在于它是合法的(许多其他方法如今都是不合法的),还在于它更简单。你只需要做出别人需要的东西就可以了。

创造有价值的东西就是创造财富。你最好先搞清楚什么是财富。财富与金钱并不是同义词

最可能明白财富能被创造出来的人就是那些善于制作东西的人,也就是手工艺人。他们做出来的东西直接放在商店里卖。但是,随着工业化时代的来临,手工艺人越来越少。目前还存在的最大的手工艺人群体就是程序员。

这就是为什么如此之多的最优秀程序员都是自由主义者的原因。我们这个世界,你向下沉沦或者向上奋进都取决于你自己,不能把原因推给外界。

公司一切行为的目的都是盈利,从而生存下去。创造财富是大多数公司盈利的手段。

如果一家公司真正能够按照贡献付薪,它将取得巨大成功。许多雇员会更努力地工作。更重要的是,这样一家公司将吸引那些工作特别努力的人,从而超越竞争对手。

这就是创业公司的真正意义。理想情况下,你与其他愿意更努力工作的人一起组成一个团队,共同谋取更高的回报(相比他们为大公司工作的情况)。因为创业公司的团队往往是自发形成的,许多有抱负的创始人彼此之间早就相识(至少听说过对方),所以他们对彼此贡献的评估要比一般的小团体更准确

团队越大,每个人的贡献就越接近于整体的平均值。所以,在不考虑其他因素的情况下,一个非常能干的人待在大公司里可能对他本人是一件很糟的事情,因为他的表现被其他不能干的人拖累了。

风险投资商(VC)知道这个道理,为它起了一个名字——进入壁垒(barriers to entry)。如果你有一个新点子去找VC,问他是否投资,他首先就会问你几个问题,其中之一就是其他人复制你的模式是否很困难。也就是说,你为竞争对手设置的壁垒有多高。你最好做出令人信服的解释,阐明你的技术难以复制的原因。否则一旦大公司看到了,它们就会做出自己的版本,再加上它们的品牌、资本、经销能力,一夜之间就把你的市场全部抢走。那时你就像来到开阔地带的游击队,会被正规军一举歼灭。

潜在的买家会尽可能地拖延收购。收购这件事最难的地方就是让买方真正拿出钱。大多数时候,促成买方掏钱的最好办法不是让买家看到有获利的可能,而是让他们感到失去机会的恐惧。对于买家来说,最强的收购动机就是看到竞争对手可能收购你

像优化软件一样优化公司,用户数量就是判断公司表现好坏的指标。

你必须时刻牢记的最基本的原则就是,创造人们需要的东西,也就是创造财富。如果你想通过创造财富使得自己致富,那么你必须知道人们需要什么

一旦自己的财产有了保证,那些想致富的人就会愿意去创造财富,而不是去偷窃。由此导致的新技术不仅被转化成财富,还被转化成军事力

“不公平”这三个字就是“老爹模式”的独门标志。为什么别的情况下人们不会想到这三个字?因为要是你现在还处于“老爹模式”,认为财富就是从某个口子流出来、被大家分享的东西,而不是来源于满足他人的需求的创造活动,那么当你注意到有些人赚钱比其他人多得多时,你就会不偏不倚地得出“不公平”这个结论。

17世纪的英国很像今天的第三世界,当官是公认的发财职业。那个年代要赚大钱仍然主要通过贪污,而不是经商。到了19世纪,情况就变了,虽然存在大量贪污受贿(今天依然如此),但是政府逐渐被一些将良心和名誉看得比金钱更重要的人所控制。技术的发展使得通过创造而积累财富的速度第一次有可能超过通过偷窃而积累财富的速度。19世纪典型的富人不是宫廷朝臣,而是实业家。

无论在物质上,还是在社会地位上,技术好像都缩小了富人与穷人之间的差距,而不是让这种差距扩大了。

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

在一个剥夺个人财产的社会,财富创造活动中所有那些没有乐趣的事情都会急剧地放慢,乃至停顿。对历史进行实证检验,我们就可以得出这个结论。

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

统计学方法的一大优点就是,你不需要一封封去看垃圾邮件。在使用它之前的六个月,我大概看了足足几千封垃圾邮件,这真是很苦恼的一件事。数学家Norbert Wiener说,如果你与奴隶比赛,你也会变成一个奴隶。与垃圾邮件搏斗就有这种令人退化的效果。

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

美感是第一道关卡。丑陋的数学在世界上无法生存。

对于我们设计师来说,美就不仅仅是一个理论问题了。如果世界上真有“美”存在,我们需要能够认出它。设计产品时,我们需要良好的品味。与其把“美”说成一个虚无缥缈的抽象概念,还不如让我们考虑一个实际的问题(这样就能避免喋喋不休的空谈):如何才能做出优美的产品?

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

就像别的工作一样,只要你不断地从事设计工作,你就会做得越来越好。你的品味会出现变化,你会像别人一样有所提高。如果这样的话,那么你以前的品味就不只是与现在不同,而是不如现在的好。因此,所谓的“品味没有好坏之分”的公理也就顿时见鬼去了。

好设计是简单的设计。从数学领域到绘画领域,你都可以听到这种说法。在数学中,它表示简短的证明往往是更好的证明。特别是对于数学公理来说,少即是多。在编程中,这种说法也基本适用。对于建筑师和设计者,它意味着美依赖于一些精心选择的结构性元素,而不依赖于表面装饰品的堆砌。(装饰品本身并不是坏事,只有当它被用来掩盖结构的苍白时,才变成了一件坏事。)绘画也是类似的,认真观察的、非常有代表性的静物作品往往要比表面极尽华美、但是实质上只是无意义重复的“巨作”(比如再现非常复杂的花边的绘画作品)更有价值。在写作上,这种说法意味着只说必须要说的话,并且说得简短。

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

好设计是永不过时的设计。只要没有错误,每一个数学证明都是永不过时的

以永不过时作为目标是一种帮助自己找到最佳答案的方法:如果你不愿别人的答案取代你的答案,你就只好自己做出最佳答案

答案可以不断改进,同样,问题本身也可以不断改进。软件的难题通常可以被改成等价的较易解决的形式。历史上,物理学的主要难题曾经一度是如何诠释经典著作,后来逐渐变成对可观测到的行为进行预测,这种转变使得物理学的发展速度大大加快。

好设计是启发性的设计

我想,这是因为幽默一定程度上反映了力量。幽默感是强壮的一种表现,始终拥有幽默感就代表你对厄运一笑了之,而丧失幽默感则表示你被厄运深深伤到。所以,强壮的标志(或者至少是特点)就是轻松面对自己的人生。充满自信的人常常像燕子一样,以一种居高临下的姿态轻盈地看待周围的一切,比如希区柯克拍摄的电影、16世纪画家勃鲁盖尔(Bruegel)的绘画(甚至莎士比亚也是一个这方面的例子)。 好的设计并非一定要有趣,但是很难想象完全无趣的设计会是好的设计。

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

在绘画上,肖像画通常占据最高地位。这不是偶然的,原因不仅是面部肖像比其他题材更能打动人,还因为我们太擅长观察脸,所以肖像画家不得不加倍努力才能达到我们的要求

好设计是看似容易的设计。优秀运动员比赛时,让人觉得他轻轻松松就获胜了,优秀设计师也是如此,他们的工作看上去很容易。大多数时候,这是一种错觉。作家的文章读起来流畅自如,但是背后其实经过了反复修改。

白描其实是最难画的视觉媒介,因为它们要求几近完美的再现。用数学语言说,线条属于闭合解(closed-form solution),水平不够的艺术家没有办法直接解决问题,只能通过不断逼近来求解

在大多数领域,看上去容易的事情,背后都需要大量的练习。练习的作用也许是训练你把刻意为之的事情变成一种自觉的行为。有时,我们的训练只是为了让身体养成下意识的反应。

人们有时会说自己有了“状态”,我的理解是,他们这时可以控制自己的脊髓。脊髓是更本能的反应,面对难题时,它能释放你的直觉。

好设计是对称的设计。对称也许只是简洁性的一种表现,但是它十分重要,值得单独列为一点。自然界的对称大量存在,这就说明了对称的重要性。对称有两种:重复性对称和递归性对称。递归性对称就是指子元素的重复,比如树叶上叶脉的纹路。

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

好设计是一种再设计。很少有人一次就把事情做对。专家的做法是先完成一个早期原型,然后提出修改计划,最后把早期原型扔掉。扔掉早期原型是需要信心的,你必须有本事看出什么地方还可以改进

犯错误是很正常的事情。你不要把犯错看成灾难,要勇于承认、勇于改正。达·芬奇实际上重新发明了素描这种艺术形式,把它当作一种探索更多可能的方式。开源软件因为公开承认自己会有bug,反而使得代码的bug比较少。

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

等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。 我想,最伟大的大师最终会达到一种超脱自我的境界。他们一心想找到正确答案,如果别人已经回答出了一部分,那就没理由不拿来用。他们足够自信地使用他人的成果,完全不担心因此丧失个人的特点。

我曾在一家美术学校学习绘画,那里的学生最想做的就是发展出一种自己的风格。但是,如果你想做出好作品,不可避免地会采用一种独特的方式,就好像每个人走路的姿势其实都不尽相同。米开朗基罗并没想过要树立米开朗基罗风格,他只是想画好作品,结果不由自主地创造出了米开朗基罗风格。

推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达·芬奇之所以成为达·芬奇,主要原因不仅仅是他的天赋,更重要的是他生活在当时的佛罗伦萨,而不是米兰

在历史的任何时刻都有一些热点项目,一些团体在这些项目上做出伟大的成绩。如果你远离这些中心,几乎不可能单靠自己就取得伟大成果。某种程度上,你个人最多可以对趋势产生一定的影响,但是你不可能决定趋势,实际上是趋势决定了你。

好设计常常是大胆的设计。在任何一段历史中,人们都会把某些荒谬的东西当作正确的,并且深信不疑,以至于一旦你出言质疑,就有被排挤或者被暴力伤害的危险。

实际上,我觉得发现丑陋的东西要比你想象出一个优美的东西更容易。大多数做出优美成果的人好像只是为了修正他们眼中丑陋的东西。伟大成果的出现常常来源于某人看到一样东西后,心想我能做得比这更好

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

编程语言的一个重要特点:一个操作所需的代码越多,就越难避免bug,也越难发现它们。

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

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

一些黑客只喜欢自己用的语言,反感其他所有的语言。另一些黑客则说所有的语言都一样。事实介于这两个极端之间。语言之间确实有差别,但是很难确定地说哪一种语言是最好的。这个领域依然还在快速发展。

语言设计者之间的最大分歧也许就在于,有些人认为编程语言应该防止程序员干蠢事,另一些人则认为程序员应该可以用编程语言干一切他们想干的事。Java语言是前一个阵营的代表,Perl语言则是后一个阵营的代表。(美国国防部很看中Java也就不足为奇了。)

面向对象编程的优点在于,如果你需要修改程序,计算另一种图形的面积,比如三角形,你只需要再另外增加一块相应的代码就可以了,甚至可以不修改程序的其他部分。

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

我认为,编程语言就像生物物种一样,存在一个进化的脉络,许许多多分支最终都会成为进化的死胡同。这种现象已经发生了

编程语言的进化与生物学进化还是有区别的,因为不同分支的语言会发生聚合。

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

我认为,基本运算符是一种语言能否长期存在的最重要因素。其他因素都不是决定性的。这有点像买房子的时候你应该先考虑地理位置。别的地方将来出问题都有办法弥补,但是地理位置是没法变的。 慎重选择公理还不够,还必须控制它的规模。数学家总是觉得公理越少越好,我觉得他们说到了点子上。

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

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

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

一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率低下得惊人(至少按我们今天的眼光来看是如此)。他们会说,他们想要的就是很容易上手的编程语言。

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

在任何学术领域,都有一些题目是可以做的,另一些题目是不可以做的。不幸的是,这两类题目的区别通常取决于它们写成论文后看上去是不是很高深,而不是取决于它们对软件业的发展是否重要。最极端的例子可能就是文学,文学研究者的任何成果几乎对文学创作者都毫无影响。

Lisp很值得学习。你掌握它以后,会感到它给你带来的极大启发。这会大大提高你的编程水平,使你成为一个更好的程序员。尽管在实际工作中极少会用到Lisp。

我们的秘密武器很类似上面的情景。我们使用一种奇特的人工智能语言开发软件,它的语法非常古怪,大量使用括号。多年来,要是听到别人这样描述Lisp语言,我会勃然大怒。但是现在,这却成了我们的优势。在竞争中,你的对手无法理解你的技术优势,这可是再宝贵不过了。商场如战场,对手摸不透你,你的胜算就增加了。

Lisp语言的好处不在于它有一些狂热爱好者才明白的优点,而只在于它是目前最强大的编程语言。它没有得到广泛使用的原因就是因为编程语言不仅仅是技术,也是一种习惯性思维,非常难于改变

如果你的程序很短,只是为了特定场合一次性使用,那么你最好根据自己要解决的问题选择具有最强大函数库的语言。不过,总的来看,对于应用程序来说,还是应该选择总体最强大、效率也在可接受范围内的编程语言,否则都是不正确的选择,就好像你选择机器语言编程一样,只是程度上有差异而已。

Lisp代码由Lisp数据对象构成。其他语言的源代码一般由字符组成,字符串是主要数据类型之一,但是Lisp语言不完全是这样。经过解析器处理之后,Lisp代码就变成了你可以遍历的数据结构。

如果你理解编译器的工作原理,那么事实是,与其说Lisp有一种很奇特的语法,还不如说它根本没有语法。一般的源代码程序经过编译器解析会生成解析树。Lisp的奇特之处就在于,你可以完全写出程序,控制这种解析树,进行任意的存取操作。Lisp的这种程序就叫做宏,它们可以用来生成其他程序。

如果你想在创业公司中使用Lisp语言,你不仅不应该担心使用它的人太少,反而应该希望这种局面保持下去。事实上,现状很可能真的会保持下去。因为编程语言的特点之一就是它会使得大多数使用它的人满足于现状,不想改用其他语言。人类天性变化的速度大大慢于计算机硬件变化的速度,所以编程语言的发展通常比CPU的发展落后一二十年

技术的变化速度通常是很快的。但是,编程语言不一样,与其说它是技术,还不如说是程序员的思考模式。编程语言是技术和宗教的混合物。

在Viaweb创业期间,我读过大量竞争对手的招聘职位。差不多每个月都有一个新的竞争对手浮出水面。我首先会看他们的产品有没有一个试用版,然后就去找他们的招聘职位。这样过了几年,我就知道哪些公司值得关注,哪些公司不用在意。有些公司的职位描述使用了大量的IT词汇,这样的内容越多,这家公司就越不构成威胁。最不用担心的竞争对手就是那些要求应聘者具有Oracle数据库经验的公司,你永远不必担心他们。如果是招聘C++或Java程序员的公司,对你也不会构成威胁。如果他们招聘Perl或Python程序员,就稍微有点威胁了。至少这听起来像一家技术公司,并且由黑客控制。如果我有幸见到一家招聘Lisp黑客的公司,就会真的感到如临大敌。

Lisp比图灵机表达起来更简洁。证明这一点的一种方法就是写一个Lisp通用函数,证明它比图灵机的一般性描述更短、更易懂。这个Lisp函数就是eval……它用来计算Lisp表达式的值……。编写eval函数需要发明一种表示法,能够把Lisp函数表示成Lisp数据。设计这种书写法完全是为了满足论文写作的需要。(我)根本没有想过用它来编写Lisp程序并在计算机上运行。

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

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

如果你创业的话,千万不要为了取悦风险投资商或潜在并购方而设计你的产品。让用户感到满意才是你的设计方向。只要赢得用户,其他事情就会接踵而来

一心让臣民行善的暴君可能是最专制的暴君。

黑客的看法其实比语言设计者的更重要。编程语言不是数学定理,而是一种工具,为了便于使用,它们才被设计出来。所以,设计编程语言的时候必须考虑到人类的长处和短处,就像设计鞋子的时候必须符合人类的脚型。

著名散文家E.B.怀特说过,“最好的文字来自不停的修改”。所有优秀作家都知道这一点,它对软件开发也适用。设计一样东西,最重要的一点就是要经常“再设计”,编程尤其如此,再多的修改都不过分。

为了写出优秀软件,你必须同时具备两种互相冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。在你的大脑中,有一个声音说“千难万险只等闲”,还有一个声音却说“早岁哪知世事艰”。

你的乐观主义和怀疑倾向分别针对两个不同的对象。你必须对解决难题的可能性保持乐观,同时对当前解法的合理性保持怀疑。

做出优秀成果的人,在做的过程中常常觉得自己做得不够好。其他人看到他们的成果觉得棒极了,而创造者本人看到的都是自己作品的缺陷

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

如果你觉得自己在为傻瓜设计产品,那么很可能不仅无法设计出优秀产品,而且就连傻瓜也不喜欢你的设计。

先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。

最后,我要感谢我的父母。父亲教给我什么是怀疑主义,母亲教给我如何发挥想象力。有了这样的母亲,我眼前的世界就从黑白变成了彩色。