🍻黑客与画家
书评:《黑客与画家》中,Paul Graham 以他的独特视角和丰富经验,展示了编程的艺术性和创新的力量。这本书对于任何希望理解技术如何塑造我们世界的人都是非常有价值的阅读。
但是这本书仅仅提供一个独特的视角与方向,做不到穿越时代引起共鸣。
作者:Paul Graham
书籍摘要
为什么书呆子不受欢迎
大多数人似乎认为,绘画能力与生俱来,画家就像高个子一样,是天生的。事实上,大多数“会画”的人,本身就很喜欢画画,将许多时间投入其中,这就是他们擅长画画的原因。
书呆子不受欢迎的真正原因,是他们脑子里想着别的事情。书呆子被教导追求正确答案,而受欢迎 的小孩被教导要讨人喜欢。
可是,为什么离开学校以后,真实世界却能友好地对待书呆子呢?
真实世界的特点是,它极其庞大。如果总体足够大,即使是人数最少的少数派,只要聚集在一起,就也能产生可观的力量。
广泛系统的阅读能够让人更早更全面的认识到真实的世界,从而拥有强大的内心来面对挫折,控制情绪,解决当下的问题。
黑客与画家
黑客与画家的共同之处,在于他们都是创作者。与作曲家、建筑师、作家一样,黑客和画家都是试图创作出优秀的作品。他们本质上都不是在做研究,虽然在创作过程中,他们可能会发现一些新技术(那样当然更好)。
计算机科学就像一个大杂烩,由于某些历史意外,很多不相干的领域被强行拼装在一起。这个学科的一端是纯粹的数学家,他们自称“计算机科学家”,只是为了得到国防部研究局(DARPA)的项目资助。中间部分是计算机博物学家,研究各种专门性的题目,比如网络数据的路由算法。另一端则是黑客,只想写出有趣的软件,对于他们来说,计算机只是一种表达的媒介,就像建筑师手里的混凝土,或者画家手里的颜料。
创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。这种类型的工作很难用研究性的论文表达。
黑客搞懂“计算理论”(theory of computation)的必要性,与画家搞懂颜料化学成分的必要性差不多大。一般来说,在理论上,你需要知道如何计算“时间复杂度”和“空间复杂度”(time and space complexity);如果你要写一个解析器,可能还需要知道状态机(state machine)的概念;除此以外,并不需要知道特别多的理论。这些可比画家必须记住的颜料成分少很多。
科学界的每一个人,暗地里都相信数学家比自己聪明。我觉得,数学家自己也相信这一点。
如果黑客认识到自己与其他创作者——比如作家和画家——是一类人,这种诱惑对他就不起作用。作家和画家没有“对数学家的妒忌”,他们认为自己在从事与数学完全不相关的事情。我认为,黑客也是如此。
黑客如何才能做自己喜欢的事情?我认为这个问题的解决方法是一个几乎所有创作者都知道的方法:找一份养家糊口的“白天工作”(day job)。这个词是从音乐家身上来的,他们晚上表演音乐,所以白天可以找一份其他工作。更一般地说,“白天工作”的意思是,你有一份为了赚钱的工作,还有一份为了爱好的工作。
眼下想必每个人都知道,过早优化(premature optimization)是一件危险的事情。我认为,我们应该对“过早设计”(premature design) 也抱有同样的担忧,不要太早决定一个程序应该怎么做。
黑客就像画家,工作起来是有心理周期的。有时候,你有了一个令人兴奋的新项目,你会愿意为它一天工作16个小时。等过了这一阵,你又会觉得百无聊赖,对所有事情都提不起兴趣。 为了做出优秀的工作,你必须把这种心理周期考虑在内。
在达·芬奇的年代,绘画并不是一件很酷的事情,达·芬奇用自己的工作推动绘画成为一种伟大的表达方式。同样,编程到底能够有多酷,取决于我们能够用这种新媒介做出怎样的工作。
有经验的产品经理往往能理解这段文章的内容,通过阅读能习得的经验,应当避免通过犯错来学习。
不能说的话
举例来说,“失败主义者”(defeatist)这个词,今天看来并没有特别的政治含义,只是指某个人比较悲观,不相信自己会成功。但是在1917年的德国,这个词却是 一件锐利的武器,鲁登道夫将军(Erich Luderdorff)将所有政治对手都称为“失败主义者”,指责他们奉行投降主义,赞成签订第一次世界大战停战协议,从而用这个借口把他们清除出政府。第二次世界大战初期,英国首相丘吉尔及其支持者也广泛使用这个词压制反对声音。1940年那一年,任何反对丘吉尔对攻作战策略的人一律被称为“失败主义者”。这个标签贴得对不对?根本没人考虑这个问题。被贴上标签、受到打压后,人们都噤若寒蝉了。这真是很理想的压制反对声音的方法。
如果你要寻找“不能说的话”,可以观察流行的产生方式,试着预测它会禁止哪些话。哪一个团体势力强大,却又精神高度紧张?这种团体喜欢压制什么样的思想观点?近来有没有什么社会斗争,失败的一方是哪一方,受到他们牵连的是什么样的思想观点?如果一个先锋人物想要挣脱当前的流行(比如上一代人的观点)脱颖而出,他会支持什么样的思想观点?随大流的人对什么样的思想观点抱有恐惧心? 这个方法的缺点是不全面,无法找出所有“不能说的话”。因为,我知道有些禁忌不是由于社会斗争而产生的,它们深深植根于过去的历史之中。但是,这个方法与前面四个方法结合在一起,会找出大量我们难以想象的“不能说的话”。
每当我读到山达基教会(Scientology)的信徒对批评者骚扰不断,或者抗议以色列侵犯人权的人士被贴上“反犹太人”的标签,或者研究人员受到DMCA诉讼威胁,我内心就有一个声音在高喊:“好吧,你们这些混蛋,让我们来说清楚。”可是问题在于,“不能说的话”太多了,如果口无遮栏,你就没时间做正事了。为了与他人论战,你不得不变成一个语言学家,比如诺姆·乔姆斯基。
所有反击方法之中, 最好的一种可能就是幽默。狂热分子都有一个共同点:缺乏幽默感。
1978年5月11日,《光明日报》发表了由中共中央组织部部长胡耀邦审定的评论文章《实践是检验真理的唯一标准》,结果引发真理标准问题大讨论。1980年9月,华国锋因“两个凡是”问题辞去国务院总理,次年再辞去中共中央主席和中央军委主席的职务。
两个凡是: 凡是毛主席作出的决策,我们都坚决维护;凡是毛主席的指示,我们都始终不渝地遵循。
良好的坏习惯
总体来看,黑客是不服从管教的,这往往会激怒管理当局。但是,不服从管教,其实是黑客之所以成为优秀程序员的原因之一。当公司的CEO装模作样发表演说时,他们可能会嘲笑他;当某人声称某个问题无解时,他们可能也会嘲笑他。如果硬要他们服从管教,他们也就无法成为优秀程序员了。不过,有些人的这种态度不 是真的,而是装出来的。某些年轻程序员注意到了知名黑客的怪癣,就会模仿,好使自己显得更聪明。这种装出来的不服从再加上故作姿态挑毛病的态度,不仅仅令人恼火,而且实际上会延缓创新的进程。
另一条路
使用那些纯粹的互联网软件,你只需要一个能够上网的浏览器即可。所以,它不受地域限制,在任何地方都可以使用。但是,如果你使用安装在计算机上的桌面软件,那么就只能在这台计算机上使用。更糟的是,你的文件也存在这台计算机上。随着互联网越来越深入人心,桌面模式的弊端也就越来越明显。
有一种编程方法叫做“函数式编程”(functional programming),它对你会有帮助,可以避免一些副作用。函数式编程在学术文献中研究得比较多,在商业软件中用得比较少。但是,对于互联网软件,它却很有用。很难用纯粹的“函数式编程”完成整个程序,但是它可以用来编写一些重要的部分,使得这些部分易于调试,因为它们不包含“状态”(state),非常便于不断进行小幅的修改和测试。我大量使用这种方法开发Viaweb的编辑器,我们自己的脚本语言RTML就是一种纯粹的函数式编程语目。
我们的政策是当场修复bug,这改变了客服人员与黑客之间的关系。在大多数软件公司,客服人员是低工资的边缘人,黑客则是呼风唤雨的主宰者。这些公司有各种各样的bug报告流程,伹是几乎都是单向式的:使用者打电话给客服人员报告bug,客服人员填写某种形式的表格,传递给程序员(可能会经质量监控部门之手),程序员把bug写入待解决问题的清单。Viaweb不是这样, 在收到使用者的bug报告之后一分钟内,程序员就会对站在身边的客服人员说:“没错,你是对的,这是一个bug。”客服人员从黑客嘴里听到“你是对的”,会感到欢欣鼓舞。客服人员告诉我们发现bug的时候,他们心里怀着期待,就好像小猫想让别人知道自己抓住了一只老鼠一样。这也使得客服人员在判断bug严重性时格外小心,因为这关系到他们的声誉。
如今本地应用、小程序、纯内网部署依然活跃在一线。
互联网软件要求的那种工作强度和付出,只有当公司是其本人所有时,程序员才愿意提供。软件公司可以雇到能干的人,让他们去干轻松的事情,也可以雇到不能干的人,让他们去干艰苦的事情,但是无法雇到非常能干的人,让他们去干非常艰苦的事情。因为互联网软件的创业不需要太多的资本,所以大公司可以与创业公司竞争的优势就所剩无几了。