阮一峰

阮一峰《黑客与画家》(十万本纪念版),保罗·格雷厄姆著,阮一峰译,人民邮电出版社,2022年6月。

黑客和画家都是创作者。

读完计算机专业的研究生课程后,我去了艺术学校,学习绘画。很多人都很惊讶:一个喜欢电脑的人居然喜欢画画!他们似乎认为摆弄电脑和画画是完全不同的两码事——电脑是冰冷、准确、有序的,画画是某种原始欲望的热烈而狂野的表达。

这种观点是错误的。电脑和绘画有许多共同之处。其实在我所知道的所有行业中,黑客和画家最相似。

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

……

我发现,黑客新思想的最佳来源,并不是那些名字中带有“计算机”二字的理论领域,而是其他的创造性领域。与其在“计算理论”领域寻找创意,不如在绘画中寻找创意。

举个例子,我在大学接受的教育是,在电脑上编程之前,要把程序在纸上写清楚。但是我从来没有这样给自己编程过。我喜欢直接在电脑前编程,而不是在纸上编程。更糟糕的是,我没有耐心地一步一步写完整个程序来保证它大体正确,而是先把代码堆起来再慢慢修改,不管对错。书上说调试是纠正打字错误和疏忽的最后一步。但是我的工作方法看起来编程就是调试。

很长一段时间,我都为此而郁闷,就像小学老师教我怎么握铅笔,我却一直没学会的感觉。如果我看到了其他创作领域,比如绘画或建筑,我会认为我的方法实际上有一个正式的名字:制图。我现在觉得大学里教我的所有编程方法都是错的。当你把整个程序想清楚了,就应该去写代码,而不是之前,这和作家、画家、建筑师是一模一样的。

了解这一点对软件设计影响很大。这意味着编程语言的主要特征应该是允许动态扩展。编程语言是用来帮助你思考程序的,而不是用来表达你已经思考过的程序。它应该是铅笔,而不是钢笔。如果每个人都像学校里教的那样编程,静态类型是一个好的概念。然而,我认识的黑客中没有一个喜欢用静态类型语言编程。我们需要的是一种可以随意涂抹、擦拭、纠正的语言。我们不想坐以待毙,小心翼翼地把一个装满各种可变类型的茶杯放在膝盖上。为了和一丝不苟的编译器对话,我们尽量选词,保证变量类型匹配,让自己显得礼貌周到。

创作者和科学家不一样,理解这一点有很多好处。除了不用担心静态类型,还可以避免另一个困扰科学家的问题,那就是“数学家的嫉妒”科学界每个人都暗暗相信数学家比自己聪明。我想数学家自己也相信这一点。最终的结果是,科学家倾向于让他们的工作尽可能看起来像数学。对于物理这样的领域,这可能不会有太大的不利影响。但是,越是往自然科学方向发展,越是成为一个严重的问题。

满满一页的数学公式真的让人印象深刻。提示:用希腊字母来表示变量名会更让人印象深刻。所以,你被极大地诱惑去解决能用数学公式解决的问题,而不是去解决真正重要的问题。

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

……

保罗·格拉厄姆是美国著名的程序员、Lisp专家、风险投资家和作家。第一个互联网应用Viaweb的发明人之一,后来被雅虎以5000万美元收购,成为著名的雅虎!商店.Y Combinator成立于2005年,成功孵化了数千个初创项目和近万名创始人,总估值近万亿美元。《黑客和画家》的作者。

黑客怎么做自己喜欢的事?我觉得解决这个问题的方法是一个几乎所有创作者都知道的方法:找一份“日工”养家糊口。这个词来自音乐家,他们在晚上表演音乐,所以他们可以在白天找到另一份工作。更通俗的说,“白天工作”就是有一份赚钱的工作,有一份爱好的工作。

几乎所有的创作者在职业生涯的早期都有一份“日常工作”。画家和作家尤为突出。运气好的话,你可以找到一份和你的“正职”非常相关的“日工”。音乐家似乎经常在唱片店工作。同样,钻研编程语言或操作系统的黑客很可能利用这些工具得到一份“日常工作”。

我说黑客解决生计问题的方法是找一份“日工”,然后在剩下的时间里开发漂亮的软件,但我没说这是新方法。开源软件行业的黑客已经这么做了。我想说的是,开源软件的这种工作模式可能是正确的模式,因为它已经得到了其他领域创作者的验证。

令我惊讶的是,雇主们对让他们的黑客为开源软件项目工作犹豫不决。然而,在Viaweb,如果你不想这么做,我们会毫不犹豫地雇佣你。我们在面试程序员的时候,主要关心的是他们业余时间写什么软件,因为如果你不热爱某样东西,你就不可能把它做得真正好。如果你热爱编程,必然会开发自己的项目。

因为黑客更像是创造者而不是科学家,要了解黑客,不应该从科学家身上寻找灵感,而应该观察其他类型的创造者。那么,从画家身上,我们能从黑客身上学到什么呢?

可以学习(至少证实)的一点是如何学习编程。画师学习绘画的主要途径是手绘,黑客学习编程的方法也应该如此。大多数黑客不是通过大学课程学习编程,而是从实践中学习,有的13岁就自己写程序了。即使在大学,黑客学习编程也主要是靠自己写程序。

画家的作品会被保存下来。如果你观察这些作品,你可以看到他们是如何通过练习一步步学习绘画的。如果你把一个画家的作品按时间顺序排列,你会发现每幅画所用的技巧都是基于你在上一个作品中学到的东西。如果一部作品特别突出,往往可以在一部更早的作品中找到小规模的初始版本。

我觉得大多数创作者都是这样学习和工作的,作家和建筑师似乎也是这样。也许对黑客来说,采取像画家一样的方法是好的:他们应该定期从头开始,而不是在一个项目上工作多年,并试图以修订版的形式包含所有最新的想法。

黑客通过实践学习编程,这是另一个表明黑客与科学家有多么不同的标志。科学家不会通过工作来学习科学,而是通过做实验和解决问题来学习。科学家的研究是基于现有的完美结果。从这个意义上说,他们的第一步只是复制别人已经完成的工作。最后,他们会从某一点出发,进行他们原本的工作。然而黑客就不一样了。他们一开始做的都是原创性的工作,没有别人完美的成果可以依靠。所以黑客的出发点是原创,最后得到一个美好的结果;科学家的出发点是别人的美好成果,最后获得原创性。

社交网络剧照。

创作者如何模仿杰作?

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

作家就是这样学习写作的。本杰明·富兰克林通过总结和模仿爱迪生和斯蒂尔的文章来学习写作。雷蒙德·钱德勒也是这样学会写侦探小说的。

同样,黑客可以通过看优秀的程序来学习编程,不是看它们的执行结果,而是看它们的源代码。开源运动的一个鲜为人知的优势是它使学习编程变得更加容易。当我学习编程时,我不得不主要依靠课本上的例子。当时可用的源代码主要来自Unix,但即使是Unix也不是开源的。大多数阅读Unix源代码的人都通过了John Leon的书的非法副本。虽然这本书写于1977年,但在1996年之前是不允许出版的。

画画还有一点值得学习:一幅画是一步一步完成的。通常是从一个草图开始,然后逐渐填充细节。然而,这不仅仅是一个填写细节的过程。有的时候,原来的想法好像是错的,你要修改。当无数的古代油画在x光下检查时,我们可以看到修改的痕迹,四肢的位置被移动过,或者面部表情被调整过。

这种绘画的创作过程值得借鉴。我觉得黑客也应该是这样工作的。你不能指望先有一个完善的规范设计,再开始编程,这是不现实的。如果事先承认规范设计不完善,编程时可以根据需要现场修改规范,最终会有更好的结果。大公司的内部结构让他们很难做到这一点。这是创业公司的另一个优势。)

现在大家一定知道过早优化是一件危险的事情。在我看来,我们应该对“过早设计”有同样的关注,不要过早决定一个程序应该做什么。

正确的工具可以帮助我们避免这种危险。一门好的编程语言,就像油画颜料一样,能让我们轻易改变想法。动态类型语言在这一点上是赢家,因为你不用提前设置各种变量的数据类型。但是,我认为编程语言灵活性的关键不在这里,而在于语言要非常抽象。最容易修改的语言是短语言。

接下来我要说的是,一幅优秀的画一定要比它应有的样子更好,这听起来可能有点矛盾。例如,达芬奇的作品“Ginevra de’Benci”现藏于美国国家美术馆。你可以看到,达芬奇在女孩的头后面放了一根树枝。他非常仔细地画了树枝上的每一片叶子。很多画家可能觉得只是背景中的陪衬,没人会仔细看,还不如简单处理一下。

列奥纳多·达·芬奇的《吉内夫拉·德·本西》,1474年,图片来自《黑客与画家》。

但是达芬奇不这么认为。他对工作每一部分的认真程度完全不取决于是否有人被期望仔细看这一部分。他就像篮球巨星迈克尔·乔丹,对每一个球都一丝不苟,从不降低对自己的要求。

坚持做到一丝不苟,你就能取得优异的成绩,因为那些看不见的细节加起来就变得看得见了。当人们走到列奥纳多·达·芬奇的女性肖像前时,他们的注意力往往会立即被它吸引。当时,他们甚至没有看到标签,也没有意识到这是达芬奇的作品。所有那些看不见的细节组合在一起,让这样的东西产生了一种惊人的效果,仿佛成千上万个细微的声音在用同一个音调歌唱。

同样,优秀的软件也需要对美的狂热追求。如果你看看优秀软件的内部,你会发现那些没人期望看到的部分也很美。我对代码的重视远远超过其他任何事情。如果我用这种态度对待日常生活中的一切,那么我就有资格请心理医生开药了。看到代码前面的缩进,或者看到难看的变量名,都让我抓狂。

如果一个黑客只是一个负责实现领导意志的技术工人,他的职责就是按照规范写代码,那么他其实就和一个挖沟的一样,从一头挖到另一头,仅此而已。但是,如果一个黑客是一个创造者,他从事的不是机械的工作,他一定是有灵感的。

黑客和画家一样,工作的时候都有一个心理周期。有时候,当你有一个令人兴奋的新项目时,你会愿意每天为它工作16个小时。过了这段时间,你又会觉得无聊,对什么都失去兴趣。

为了做好工作,你必须考虑到这个心理循环。只有这样,你才能找到处理不同事情的不同方法。你有一辆手动挡汽车。当你开车上山时,有时你不得不松开离合器以防止汽车熄火。同样,暂时放手,有时也能防止热情熄灭。对于画家、黑客这样的创作者来说,有些工作需要极大的热情,有些则是不需要太操心的日常琐事。当你无聊的时候,做些简单的工作是个好主意。

……

《模仿游戏》剧照。

通过“移情”获得灵感

就像绘画一样,大多数软件是给人类用户的。所以黑客必须像画家一样时刻考虑用户的人性需求,才能做出伟大的产品。你必须能够站在用户的角度去思考,也就是你必须学会“设身处地”。

在我很小的时候,我经常被告知要设身处地为别人着想。现实中,这必然意味着你应该做别人需要的,而不是你想做的。这样好像对我不好,所以我下定决心不要成为这样的人。

但是我完全错了。事实表明,站在他人的角度思考是成功的秘诀。“感同身受”并不意味着你必须做出自我牺牲。其实这是两码事。知道别人对事物的看法,不代表你为他们的利益服务。在某些情况下,比如在战争中,了解对手只是为了攻击对手。

大多数创作者为人类用户创作。为了吸引用户,你必须了解用户需要什么。例如,几乎所有最伟大的画都是人画的,因为人总是对自己感兴趣。

在普通黑客和优秀黑客的所有区别中,能否“感同身受”可能是最重要的单一因素。有些黑客很聪明,但是完全以自我为中心,完全不设身处地为用户着想。这样的人很难设计出优秀的软件,因为他们没有站在用户的角度看问题。

判断一个人是否具备“换位思考”的能力,一个很好的方法就是看他如何向没有技术背景的人解释技术问题。我们大概都认识在其他方面很聪明的人,但是把问题解释清楚的能力却出奇的低。如果外人在聚会上问他们“什么是编程语言”,他们会回答:“哦,高级语言就是编译器生成目标代码的输入代码。”高级语言?编译器?目标代码?…..如果对方不知道什么是编程语言,那么他显然不会知道这些概念。

《硅谷》(第一季)剧照。

软件的部分功能是解释它自己。为了写出优秀的软件,你必须假设用户基本上对你的软件一无所知。你要明白,用户第一次使用你的软件,并没有提前做足功课。他们没有任何准备就开始使用,所以最好按照用户的直觉来使用软件,不要指望用户会看手册。在这方面,我见过最好的系统是1984年的原版Macintosh电脑。它做了一件当时其他软件都做不到的事情:真的成功了。

源代码也应该解释它自己。如果我只能让别人记住一句关于编程的名言,那么这句名言就是《计算机程序的构造与解释》一书的序言:

程序必须写给人们阅读,有时写给计算机执行。

换位思考不仅是为了你的用户,也是为了你的读者。这对你有好处,因为你也会读到你写的东西。很多黑客半年后看了自己的程序,才发现根本看不懂它是怎么工作的。我知道有几个人因为这次经历发誓不再使用Perl。

在一些地方,它被视为高水平、高智商的标志,甚至发展成为一种时尚。但是,我不认为共情和智商有什么联系。在数学和自然科学领域,不用学习如何向别人表达自己,也能取得好的成绩。那些领域的人一般都很聪明,所以人们很自然地把“聪明”和“不懂得换位思考”联系在一起。但是,世界上有很多愚蠢的人,也不懂“换位思考”。

最后,如果编程是绘画和写作一样的工作,黑客会有机会像伟大的艺术家一样被尊重和传播给后代吗?毕竟,生命只有一次,你可能想用它来做一些伟大的事情。

可惜这个问题很难回答。威信总是在很长一段时间的滞后之后建立起来的。就像来自遥远星系的光一样,需要很多光年才能被我们看到。那些名画中有一些来自500年前画家的杰出作品。在那些画家去世之前,没有人像我们今天这样重视这些作品。1465年的人可能会觉得很奇怪。后世的人们提到乌尔比诺的强大的费德里科公爵的主要原因是弗朗切斯卡把他的鼻子画得非常独特。

皮耶罗·德拉皮耶罗·德拉弗朗切斯卡作品,乌尔比诺公爵和公爵夫人肖像(局部),1465-1466。图片来自黑客和画家。

所以,虽然我必须承认现在的艺术家比黑客酷多了,但是我们不要忘记,在古代绘画兴盛的黄金时代,画家们并不像今天这么酷。

我们可以有把握地说,现在是编程的黄金时代。大多数领域的伟大作品都诞生于很久以前。1430年至1500年的绘画杰作仍然无人能及。莎士比亚出现的时候,戏剧这种文学体裁刚刚发展起来,剧院这种表演戏剧的场所也刚刚诞生。他把戏剧这种艺术形式提升到了一个高不可攀的高度,以至于后世的每一个剧作家都不得不生活在他的阴影下。德国雕塑家阿尔布雷特·丢勒和英国小说家简·奥斯汀都是这样的大师。

我们看到这种模式反复出现。当一种新媒体刚刚诞生时,人们热情高涨,激动不已。在短短几代人的时间里,他们探索了这种媒介的大部分可能性,并将它的能量发挥到了极致。编程目前好像就在这个阶段。

在达芬奇的时代,绘画并不是一件很酷的事情。莱昂纳多·达·芬奇用他的作品来宣传绘画是一种伟大的表达方式。同样,编程有多酷取决于我们能利用这种新媒体做些什么。

《黑客与画家》(十万本纪念版),保罗·格雷厄姆著,阮一峰译,人民邮电出版社,2022年6月。

文/保罗·格雷厄姆

摘录/李永波

校对/茜茜

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论