Skip to main content

🍻黑客与画家

info

书评:《黑客与画家》中,Paul Graham 以他的独特视角和丰富经验,展示了编程的艺术性和创新的力量。这本书对于任何希望理解技术如何塑造我们世界的人都是非常有价值的阅读。

warning

但是这本书仅仅提供一个独特的视角与方向,做不到穿越时代引起共鸣。

tip

作者:Paul Graham

书籍摘要

为什么书呆子不受欢迎

大多数人似乎认为,绘画能力与生俱来,画家就像高个子一样,是天生的。事实上,大多数“会画”的人,本身就很喜欢画画,将许多时间投入其中,这就是他们擅长画画的原因。

书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。书呆子被教导追求正确答案,而受欢迎的小孩被教导要讨人喜欢。

可是,为什么离开学校以后,真实世界却能友好地对待书呆子呢?

真实世界的特点是,它极其庞大。如果总体足够大,即使是人数最少的少数派,只要聚集在一起,就也能产生可观的力量。

note

广泛系统的阅读能够让人更早更全面的认识到真实的世界,从而拥有强大的内心来面对挫折,控制情绪,解决当下的问题。

黑客与画家

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

计算机科学就像一个大杂烩,由于某些历史意外,很多不相干的领域被强行拼装在一起。这个学科的一端是纯粹的数学家,他们自称“计算机科学家”,只是为了得到国防部研究局(DARPA)的项目资助。中间部分是计算机博物学家,研究各种专门性的题目,比如网络数据的路由算法。另一端则是黑客,只想写出有趣的软件,对于他们来说,计算机只是一种表达的媒介,就像建筑师手里的混凝土,或者画家手里的颜料。

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

黑客搞懂“计算理论”(theory of computation)的必要性,与画家搞懂颜料化学成分的必要性差不多大。一般来说,在理论上,你需要知道如何计算“时间复杂度”和“空间复杂度”(time and space complexity);如果你要写一个解析器,可能还需要知道状态机(state machine)的概念;除此以外,并不需要知道特别多的理论。这些可比画家必须记住的颜料成分少很多。

科学界的每一个人,暗地里都相信数学家比自己聪明。我觉得,数学家自己也相信这一点。

如果黑客认识到自己与其他创作者——比如作家和画家——是一类人,这种诱惑对他就不起作用。作家和画家没有“对数学家的妒忌”,他们认为自己在从事与数学完全不相关的事情。我认为,黑客也是如此。

黑客如何才能做自己喜欢的事情?我认为这个问题的解决方法是一个几乎所有创作者都知道的方法:找一份养家糊口的“白天工作”(day job)。这个词是从音乐家身上来的,他们晚上表演音乐,所以白天可以找一份其他工作。更一般地说,“白天工作”的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。

眼下想必每个人都知道,过早优化(premature optimization)是一件危险的事情。我认为,我们应该对“过早设计”(premature design)也抱有同样的担忧,不要太早决定一个程序应该怎么做。

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

在达·芬奇的年代,绘画并不是一件很酷的事情,达·芬奇用自己的工作推动绘画成为一种伟大的表达方式。同样,编程到底能够有多酷,取决于我们能够用这种新媒介做出怎样的工作。

note

有经验的产品经理往往能理解这段文章的内容,通过阅读能习得的经验,应当避免通过犯错来学习。

不能说的话

举例来说,“失败主义者”(defeatist)这个词,今天看来并没有特别的政治含义,只是指某个人比较悲观,不相信自己会成功。但是在1917年的德国,这个词却是一件锐利的武器,鲁登道夫将军(Erich Luderdorff)将所有政治对手都称为“失败主义者”,指责他们奉行投降主义,赞成签订第一次世界大战停战协议,从而用这个借口把他们清除出政府。第二次世界大战初期,英国首相丘吉尔及其支持者也广泛使用这个词压制反对声音。1940年那一年,任何反对丘吉尔对攻作战策略的人一律被称为“失败主义者”。这个标签贴得对不对?根本没人考虑这个问题。被贴上标签、受到打压后,人们都噤若寒蝉了。这真是很理想的压制反对声音的方法。

如果你要寻找“不能说的话”,可以观察流行的产生方式,试着预测它会禁止哪些话。哪一个团体势力强大,却又精神高度紧张?这种团体喜欢压制什么样的思想观点?近来有没有什么社会斗争,失败的一方是哪一方,受到他们牵连的是什么样的思想观点?如果一个先锋人物想要挣脱当前的流行(比如上一代人的观点)脱颖而出,他会支持什么样的思想观点?随大流的人对什么样的思想观点抱有恐惧心?  这个方法的缺点是不全面,无法找出所有“不能说的话”。因为,我知道有些禁忌不是由于社会斗争而产生的,它们深深植根于过去的历史之中。但是,这个方法与前面四个方法结合在一起,会找出大量我们难以想象的“不能说的话”。

每当我读到山达基教会(Scientology)的信徒对批评者骚扰不断,或者抗议以色列侵犯人权的人士被贴上“反犹太人”的标签,或者研究人员受到DMCA诉讼威胁,我内心就有一个声音在高喊:“好吧,你们这些混蛋,让我们来说清楚。”可是问题在于,“不能说的话”太多了,如果口无遮栏,你就没时间做正事了。为了与他人论战,你不得不变成一个语言学家,比如诺姆·乔姆斯基。

所有反击方法之中,最好的一种可能就是幽默。狂热分子都有一个共同点:缺乏幽默感。

note

1978年5月11日,《光明日报》发表了由中共中央组织部部长胡耀邦审定的评论文章《实践是检验真理的唯一标准》,结果引发真理标准问题大讨论。1980年9月,华国锋因“两个凡是”问题辞去国务院总理,次年再辞去中共中央主席和中央军委主席的职务。

两个凡是: 凡是毛主席作出的决策,我们都坚决维护;凡是毛主席的指示,我们都始终不渝地遵循。

良好的坏习惯

总体来看,黑客是不服从管教的,这往往会激怒管理当局。但是,不服从管教,其实是黑客之所以成为优秀程序员的原因之一。当公司的CEO装模作样发表演说时,他们可能会嘲笑他;当某人声称某个问题无解时,他们可能也会嘲笑他。如果硬要他们服从管教,他们也就无法成为优秀程序员了。不过,有些人的这种态度不是真的,而是装出来的。某些年轻程序员注意到了知名黑客的怪癣,就会模仿,好使自己显得更聪明。这种装出来的不服从再加上故作姿态挑毛病的态度,不仅仅令人恼火,而且实际上会延缓创新的进程。

另一条路

使用那些纯粹的互联网软件,你只需要一个能够上网的浏览器即可。所以,它不受地域限制,在任何地方都可以使用。但是,如果你使用安装在计算机上的桌面软件,那么就只能在这台计算机上使用。更糟的是,你的文件也存在这台计算机上。随着互联网越来越深入人心,桌面模式的弊端也就越来越明显。

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

我们的政策是当场修复bug,这改变了客服人员与黑客之间的关系。在大多数软件公司,客服人员是低工资的边缘人,黑客则是呼风唤雨的主宰者。这些公司有各种各样的bug报告流程,伹是几乎都是单向式的:使用者打电话给客服人员报告bug,客服人员填写某种形式的表格,传递给程序员(可能会经质量监控部门之手),程序员把bug写入待解决问题的清单。Viaweb不是这样,在收到使用者的bug报告之后一分钟内,程序员就会对站在身边的客服人员说:“没错,你是对的,这是一个bug。”客服人员从黑客嘴里听到“你是对的”,会感到欢欣鼓舞。客服人员告诉我们发现bug的时候,他们心里怀着期待,就好像小猫想让别人知道自己抓住了一只老鼠一样。这也使得客服人员在判断bug严重性时格外小心,因为这关系到他们的声誉。

note

如今本地应用、小程序、纯内网部署依然活跃在一线。

互联网软件要求的那种工作强度和付出,只有当公司是其本人所有时,程序员才愿意提供。软件公司可以雇到能干的人,让他们去干轻松的事情,也可以雇到不能干的人,让他们去干艰苦的事情,但是无法雇到非常能干的人,让他们去干非常艰苦的事情。因为互联网软件的创业不需要太多的资本,所以大公司可以与创业公司竞争的优势就所剩无几了。

如何创造财富

如果你想赚100万美元,就不得不忍受相当于100万美元的痛苦。比如,你终生为邮政局工作,省下每一分工资,那也是赚到100万美元的一种方法。可是,不难想象为邮政局工作50年是何等漫长的压力。创业公司将你所有的压力压缩到三四年。承受较大的压力通常会为你带来额外的报酬,但是你还是无法逃避基本的守恒定律。如果创业那么轻松,那么所有人就都去创业了。

通过修理一辆老爷车,你使得自己更富有。与此同时,你也并没有使得任何人更贫穷。所以,这里明显不是一个面积不变的大饼。我们这个世界,你向下沉沦或者向上奋进都取决于你自己,不能把原因推给外界。许许多多不创造任何财富的人——比如本科生、记者和政客——一听到最富有的5%人口占有全社会一半以上的财富,往往会认定这是不公平的。一个有经验的程序员很可能也认为这是不公平的。因为最顶尖的5%的程序员写出了全世界99%的优秀软件。

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

就算你无法测量每个员工的贡献,但是你可以得到近似值,那就是测量小团队的贡献。整家公司产生的收入是可以测量的,如果公司只有一个员工,那么就可以准确知道他的贡献了。所以,公司越小,你就越能准确估计每个人的贡献。这就是创业公司的真正意义。理想情况下,你与其他愿意更努力工作的人一起组成一个团队,共同谋取更高的回报(相比他们为大公司工作的情况)。因为创业公司的团队往往是自发形成的,许多有抱负的创始人彼此之间早就相识(至少听说过对方),所以他们对彼此贡献的评估要比一般的小团体更准确。创业公司不仅仅是十个人的团队,而且是十个同类人的团队。

如果你有两个选择,就选较难的那个。如果你要选择是坐在家里看电视,还是外出跑步,那就出去跑步吧。这个方法有效的原因可能是遇到两个一难一易的选择时,往往出于懒惰的缘故,你会选择较易的那个选项。在意识深处,你其实知道不懒惰的做法会带来更好的结果,这个方法只是迫使你接受这一点。

创业是有一些潜规则的,其中一条就是很多事情由不得你。比如,你无法决定到底付出多少。你只想更勤奋工作2到3倍,从而得到相应的回报。但是,真正创业以后,你的竞争对手决定了你到底要有多辛苦,而他们做出的决定都是一样的:你能吃多少苦,我们就能吃多少苦。  

另一条潜规则是,创业的付出与回报虽然总体上是成比例的,但是在个体上是不成比例的。我在前面说过,对于个人来说,付出与回报之间存在一个很随机的放大因子。你努力30倍,最后得到的回报在现实中并不是30倍,而是0到1000倍之间的一个随机数。假定所有创业者都努力30倍,最后他们得到的总体平均回报是30倍,伹中位数却是0。大多数创业公司都以失败告终,其中并不都是很烂的项目

工程师愿意接受普通薪水去做一些诱人的项目(比如战斗机和登月火箭),而与日常生活关系更密切的技术革新(比如电灯泡和半导体)只能由创业者来发明。

一旦自己的财产有了保证,那些想致富的人就会愿意去创造财富,而不是去偷窃。由此导致的新技术不仅被转化成财富,还被转化成军事力量。隐形飞机的理论是由前苏联数学家提出的,但是因为前苏联没有计算机工业,它就只能是一个理论,无法变成产品。前苏联没有足够快的硬件来完成设计飞机所需要的大量计算。

冷战、第二次世界大战、近代的大多数战争都说明了这个道理。要鼓励大家去创业。只要懂得藏富于民,国家就会变得强大。让书呆子保住他们的血汗钱

关注贫富分化

第一眼看上去,你可能会觉得难以接受,人与人之间创造财富能力的差别真的会这么巨大吗?理解这一点的关键就在于重新思考我们上面提过的那个问题,他一个人的价值真的等于我们100个人的价值吗?你想一想,一个篮球队会同意用一个运动员交换100个普通人吗?如果苹果公司不是由乔布斯掌管,而是由一个100人组成的委员会掌管,那么这家公司的下一代产品会是什么样?人与人之间的差别并不是那么稳定的线性关系。也许CEO和运动员的技能和决心只比普通人高出10倍(倍数不重要),但是人与人之间就是存在着重大差别。

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

防止垃圾邮件的一种方法

朴素贝叶斯

设计者的品味

美感是第一道关卡,丑陋的数学在世界上无法生存。——GH.哈代,《一个数学家的道歉》

把品味说成个人的偏好可以有效地杜绝争论,防止人们争执哪一种品味更好。但是问题是,这种说法是不正确的。如果你是一个设计师,并且你不承认有一种人们共同认可的东西叫做“美”,那么你就没有办法做好工作。如果品味只是一种个人偏好,那么每个人都是完美无缺的:你喜欢自己看上的东西,那就足够了。

  • 好设计是简单的设计。从数学领域到绘画领域,你都可以听到这种说法。在数学中,它表示简短的证明往往是更好的证明。

  • 好设计是永不过时的设计。只要没有错误,每一个数学证明都是永不过时的。如果你希望自己的作品对未来的人们有吸引力,方法之一就是让你的作品对上几代人有吸引力。我们很难猜想未来是什么样子,但是可以肯定,未来的人们不会在乎今天流行的风潮,这一点与上几代人是相同的。

  • 好设计是解决主要问题的设计。厨房的煤气灶有四个出火口,排成一个正方形。每个出火口都由一个调节器控制,四个出火口就有四个调节器。请问应该如何摆放调节器?最简单的摆放方法当然是把四个调节器排成一列,但要是这样做,人们使用起来就很不方便,每次都要停下来想一下到底每个调节器对应的是哪个出火口。如果直接把调节器排成与出火口一样的正方形,就不会有这个问题了。

  • 好设计是启发性的设计。英国女作家简·奥斯汀的作品几乎不带有任何描述。她不告诉读者每件东西看上去是什么样子,只是把故事讲得非常生动,让读者自己把一切都想象出来。同样,绘画作品也分为描述性绘画和启发性绘画,后者往往比前者更引人入胜。每个人看到《蒙娜丽莎》都有自己的理解。

  • 好设计通常是有点趣味性的设计。这条原则可能不是所有情况下都成立。

  • 好设计是艰苦的设计。如果观察那些做出伟大作品的人,你会发现他们的共同点就是工作得非常艰苦。如果你工作得不艰苦,你可能正在浪费时间。当你攀登高山时,必须扔掉一切不必要的装备。在困难地点或预算不足的条件下,建筑师就只能做出很简练的设计。当解决难题成为压倒一切的任务时,那些流行样式与华丽装饰就被抛到一边去了。德国包豪斯(Bauhaus)学派的设计师采纳了美国建筑师路易斯·沙利文(Louis Sullivan)的观点“功能决定形式”(form follows function),  但是他们实际上的理解是“功能应当决定形式”。真实情况是,如果开发“功能”非常艰难,那么“形式”将不得不全部都由“功能”决定,因为没有多余的精力再来单独开发“形式”了。人们常常觉得野生动物非常优美,原因就是它们的生活非常艰苦,在外形上不可能有多余的部分了。

note

包豪斯学院(Bauhaus)是德国魏玛共和国时期的一所艺术学校,由建筑师瓦尔特·格罗皮乌斯于1919年创办于魏玛,1925年迁至德累斯顿,1932年迁至柏林,1933年被纳粹政府关闭。包豪斯学院的教育理念是将工业设计与艺术结合起来,以生产出实用的、现代的、简洁的产品。包豪斯学院的教育理念对现代设计产生了深远的影响,其教育理念也被称为包豪斯风格。

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

  • 好设计是对称的设计。对称也许只是简洁性的一种表现,但是它十分重要,值得单独列为一点。自然界的对称大量存在,这就说明了对称的重要性

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

  • 好设计是一种再设计。很少有人一次就把事情做对。专家的做法是先完成一个早期原型,然后提出修改计划,最后把早期原型扔掉。

  • 好设计是能够复制的设计。我们对待复制的态度经常是一个否定之否定的过程。刚入门的新手不知不觉地模仿他人,遂渐熟练之后才开始创作原创性作品。最后他会意识到,把事情做对比原创更重要。等到你逐渐对一件事产生热情的时候,就不会满足于模仿了。你的品味就进入了第二阶段,开始自觉地进行原创。我想,最伟大的大师最终会达到一种超脱自我的境界。他们一心想找到正确答案,如果别人已经回答出了一部分,那就没理由不拿来用。他们足够自信地使用他人的成果,完全不担心因此丧失个人的特点。

  • 好设计常常是奇特的设计。它们不仅优美,而且美得很奇特。

  • 好设计是成批出现的。15世纪住在佛罗伦萨的伟大艺术家有建筑师布鲁内莱斯基、画家吉贝尔蒂、雕塑家多纳泰洛、画家马萨乔、画家菲利普里皮、画家弗拉安吉利科、雕塑家韦罗基奥、画家波提切利、达·芬奇和米开朗基罗。推动人才成批涌现的最大因素就是,让有天赋的人聚在一起,共同解决某个难题。互相激励比天赋更重要,达·芬奇之所以成为达·芬奇,主要原因不仅仅是他的天赋,更重要的是他生活在当时的佛罗伦萨,而不是米兰。

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

编程语言解析

所有机器都有一张操作命令清单,让你可以控制它。有时这个清单非常简短。电水壶就只允许两种操作:打开和关闭。CD播放器稍微复杂点,除了打开和关闭以外,还能调节音量、播放、暂停、快进、快退、随机播放等。

机器语言的加法命令是11001101,这可能就是计算机内部的加法表达方式,但是在汇编语言中,这条命令就改成了add

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

拒绝平庸

如果从图灵等价(Turing-equivatent)的角度来看,所有语言都是一样强大的,但是这对程序员没有意义。(没人想为图灵机编程。)程序员关心的那种强大也许很难正式定义,但是有一个办法可以解释,那就是有一些功能在一种语言中是内置的,但是在另一种语言中需要修改解释器才能做到,那么前者就比后者更强大。

假设有一种Blub语言。只要这位程序员向曲线下方望去,他就肯定知道自己正在看的是一些比较低层次的语言。因为那些语言明显不如Blub语言强大,缺少他习惯使用的某些功能。但是,当他向曲线上方望去,他不会意识到自己正在看更高层次的语言,而是仅仅觉得自己正在看某些奇怪的语言。他可能认为那些语言也许与Blub一样强大,但是加入了不少怪东西。他觉得Blub语言已经够用了,不用再考虑那些语言了。这时,他的思维就是已经被Blub同化了。

但是,当我们转换视角,把自己想象成使用曲线更上方某一种语言的程序员并往下看的时候,我们就会发现,自己也同样轻视Blub语言。你怎么用Blub语言完成工作呢?它甚至连YY功能都没有!

通过归纳法我们就会知道,唯一洞悉所有语言优劣的人必然是懂得最强大的那种语言的人。(这大概就是埃里克·雷蒙德所说的Lisp语言使你成为一个更好的程序员的意思。)

你把每件事都做到平均水准,就能得到平均结果。问题在于,小公司的平均结果就意味着关门倒闭。创业公司的生存率远低于50%。所以,如果你掌管创业公司,最好做一些独特的事情,否则就会有麻烦。

note

仅接触一种编程语言的人容易变的难以沟通,广泛的涉猎编程语言可以让你更好的理解编程语言的本质。在学C、JS、Python、R的过程中,能发现很多有趣的内容,也会让自己变得更加平和。

书呆子的复仇

使用一种不常见的语言会出现的问题我想到了三个:

  • 你的程序可能无法很好地与使用其他语言写的程序协同工作;

  • 你可能找不到很多函数库;

  • 你可能不容易雇到程序员。

把软件运行在服务器端就可以没有顾忌地使用最先进的技术。至于第二个问题,函数库的重要性也取决于你的应用程序。对于那些条件不苛刻的应用,有没有一个好的函数库比语言本身的能力更重要。第三个问题是你的经理担忧雇不到程序员,我认为这根本就是混淆视听。说实话,你究竟想雇用多少个黑客?到目前为止,大家公认少于10个人的团队最适合开发软件。

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

“格林斯潘第十定律”(Greenspun's Tenth Rule):任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。

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

note

编写人工智能案例时,使用Python的人很多,当然tensorflow对JavaScipt的支持也很好,R语言也不错。但其他语言(并非全部,而是大部分)显然没有这么多的人工智能案例。

梦寐以求的编程语言

大多数程序员也许无法分辨语言的好坏。但是,这不代表优秀的编程语言会被埋没,专家级黑客一眼就能认出它们,并且会拿来使用。虽然他们人数很少,但就是这样一小群人写出了人类所有优秀软件。他们有着巨大的影响力,他们使用什么语言,其他程序员往往就会跟着使用。

你的语言已经能够满足上面三项条件——一种免费的实现,一本相关书籍,以及语言所依附的计算机系统——那么还需要做什么才能使得黑客喜欢上你的语言?黑客欣赏的一个特点就是简洁。黑客都是懒人,他们同数学家和现代主义建筑师一样,痛恨任何冗余的东西或事情。有一个笑话说,黑客动手写程序之前,至少会在心里盘算一下哪种语言的打字工作量最小,然后就选择使用该语言。

语言设计者应该假定他们的目标用户是一个天才,会做出各种他们无法预知的举动,而不是假定目标用户是一个笨手笨脚的傻瓜,需要别人的保护才不会伤到自己。如果用户真的是傻瓜,不管你怎么保护他,他还是会搬起石头砸自己的脚。

为了吸引黑客,一种编程语言必须善于完成黑客想要完成的各种任务。这意味着它必须很适合开发一次性程序。这一点可能出乎很多人的意料。所谓一次性程序,就是指为了完成某些很简单的临时性任务而在很短时间内写出来的程序。比如,自动完成某些系统管理任务的程序,或者(为了某项模拟任务)自动生成测试数据的程序,以及在不同格式之间转化数据的程序等。令人吃惊的是,一次性程序往往不是真的只用一次,就像二战期间很多美国大学造的一大批临时建筑后来都成了永久建筑。许多一次性程序后来也都变成了正式的程序,具备了正式的功能和外部用户。

设计与研究

我说的是“用户需要的设计”,而不是“用户要求的设计”。我不想让读者产生一种印象,认为设计师就像厨师一样,顾客点什么菜就一模一样做出来。艺术的各个领域有着巨大的差别,但是我觉得任何一个领域的最佳作品都不可能由对用户言听计从的人做出来。

note

100 多年前,福特汽车创始人亨利·福特跑去做用户调研,“您需要一个什么样的更好的交通工具?”几乎所有人的答案都是:“我要一匹更快的马”。

假定你正在设计一种工具,你可以把目标用户定为初学者,也可以定为专家级用户。一种人眼里的优秀设计可能在另一种人眼里却是糟糕无比。这里的重点是你必须选出某些人作为你的目标用户。我觉得,除非设定目标用户,否则一种设计的好坏根本无从谈起。

如果目标用户群体涵盖了设计师本人,那么最有可能诞生优秀设计。

有时候,更少的功能(“弱”)反而是更好的选择(“强”),因为这会使得软件的可用性提高。相比那些体积庞大、功能全面、较难上手的软件,一种功能有限但易于使用的软件可能对用户有更大的吸引力。

士气也可以解释为什么很难为低端用户设计出优秀产品。因为优秀设计的前提是你自己必须喜欢这种产品,否则你不可能对设计有兴趣,更不要说士气高昂了。为了把产品设计好,你必须对自己说:“哇,这个产品太棒了,我一定要设计好!”而不是心想:“这种垃圾玩意,只有傻瓜才会喜欢,随便设计一下就行了。”

设计意味着做出符合人类特点和需要的产品。但是,“人类”不仅包括用户,还包括设计师,所以设计工作本身也必须符合设计师的特点和需要。