聆听大师们的声音 - 《编程大师访谈录》读后

可以说,执行特定任务就像是从大杂烩中选定菜目,排出一席美味佳肴。你可以左手一份美味右手一盘佳肴,但搁在一起可能味同狗粮。懂得巧妙搭配食材才称得上好厨师。同样,把程序各个部分妥善组合在一起,才是成就优秀计算机程序员之道。

-- 《编程大师访谈录》

聆听大师们的声音 - 《编程大师访谈录》读后_第1张图片
图片来源:douban.com

这个周末,我花了两天时间读完了《编程大师访谈录》。书中收录了对19个传奇程序员的访谈内容,其中不乏大师们对编程的严肃思考和深刻洞见,读来趣味盎然。本文摘录了一组具有代表性的问答,从中可以对大师们对待编程的认识和想法管窥一斑。

请注意,大师们的见解与论断未必全盘正确,不加思考地把他们的观点拿来奉为圭臬是危险的。本书的迷人之处在于,大师们的那些充满冒险性与创造性的想法可以给我们带来深刻的启发。循着这些启发做一番自己的思考,或可得到一二真知。

另外,本书的成书时间是1986年。阅读时,需要把访谈置于当时的环境背景之下,方能透过时空和这些大师进行对话。

对计算机与编程的看法

问:你认为计算机科学真的是科学吗?

查尔斯·西蒙尼:最简单的回答是,它是科学,就跟数学是科学一样。计算机程序可以视作数学对象。

约翰·沃诺克:不见得。比起科学,它更是工程学科。科学就是提出假说,做各种实验,在现实世界中创建模型。计算机却不是这样,它们是关于现实世界模型的自我实现的预言,是极好的信息工具。但是,说到计算机科学,我不知道它试图追求什么样的真理。

约翰·佩奇:我一直在说,计算机科学不是一门真正的科学,因为你没有实际发现有关物质世界的任何东西 -- 但是,这只说对了一半。有时候一个问题的答案一下子豁然开朗了,就好像答案一直都在那里一样,而我发现了它。我仔细检查,发现答案是完美的。怪吧?

问:计算机或编程什么地方吸引你?

受访者对这个问题的回答非常的一致,总结而言,他们都是被“编程”这项任务背后蕴含的创造性和美学特性所吸引。

C·韦恩·莱特莱夫:我喜欢高科技的东西,我喜欢做出一些东西,让它们显示在屏幕上。如果你程序写得好,它可以非常优雅:它就像在歌唱,它制作精良。从工程的角度来看,我享受面对这一切,就像面对一辆漂亮的汽车,一座坚固的桥,或是一栋精美的建筑。它的一切都是那么平衡、那么和谐。

安迪·赫兹菲尔德:这是我能像到的唯一的工作,可以让我身兼工程师和艺术家两种角色。它包含难以置信的、严密的技术元素,这是我所喜欢的,为此你必须一丝不苟,思维缜密。另一方面,它有极具创造性的一面,唯一真正的限制就是你的想象力。这两种元素的联姻使得编程独一无二。你必须既当艺术家又当科学家,我喜欢这一点。我喜欢在编程工作的核心中创造魔法把戏。

问:你认为编程是艺术、科学、技能、手艺,还是......?

查尔斯·西蒙尼:什么是编程,人们对此一直各持己见。有人说它是科学,有人说它是艺术,还有人称之为技能或手艺。我认为这三方面兼而有之。我们喜欢说它蕴含大量艺术成分,但是我们都知道它里面更多的是科学。我认为,只要将科学、艺术和技能这三者拿捏得恰到好处,你就能取得一些引人瞩目的成绩。最优算法的知识当属科学,结构的想象则是艺术。这些算法的细节,以及编写高效代码实现这些结构的转换,是编程像手艺活的一面。

彼得·罗伊森:我当然认为这是艺术。我认为任何做得好的事情都可以成为艺术,因为任何工作都可以加上一定的品味或艺术天赋来完成。在我自己的工作中,我不但关心代码做什么,也关心它看起来如何。我经常重新整理代码,就为了让它看起来更漂亮。

加隆·兰尼尔:嗯,计算机本身没有什么特性。它们是空的,就像一张白纸。因为他们的思想完全是空的,所以他们的特性完全有人来决定,其程度超过任何其他人类活动的领域。...... 我更多地把编程看作是艺术。上周末我在一个电视节目上和彼得·德奇交谈,他说编程是一种手艺。然后,还有些人认为编程是数学。这完全取决于个人的不同看法。

从美学的角度看程序

问:你认为什么样的代码清单或算法结构在审美上是优美或悦人的?

这是一道非常主观的问题,不过受访者的回答都提到了同一个元素,那就是“结构的简单、清晰与一致”。

查尔斯·西蒙尼:我觉得代码清单带给人的愉快同整洁的家差不多。你一眼就能分辨出家里是杂乱无章还是整洁如新。我敢打赌,我在3米开外就能看出程序拙劣与否。我也许没法保证它很不错,但如果从3米外看起来就很糟,我敢保证这程序写得不用心。如果写得不用心,那它在逻辑上也许就不会优美。

加里·基尔代尔:当一个程序干净整洁、结构良好、前后一致时,它就是美丽的。我不能拿程序和蒙娜丽莎来比,但程序的简单和优雅确实是美的。不同程序的风格差异是耐人寻味的,很像是艺术评论家眼中达.芬奇的蒙娜丽莎和凡高画作之间的差异。我特别喜欢 LISP 编程语言,它是如此赏心悦目。在 LIST 语言中有一个被称作 M 的简明表达式。用 M 表达式写的算法非常美,你几乎想把它装裱起来挂载墙上。

关于方法论

** 问:程序员需要具备什么样的素质才能写出成功的程序?**

鲍勃·弗兰克斯顿:优秀的人一般需要满足两个因素:正好具备这个知识领域所需要的心智,并且在能力上又不是太愚钝。这样的组合很罕见,但并非不可思议。......一个优秀的程序员必须喜欢编程,对它感兴趣,这样他才会努力多学一点。优秀的程序员还要对美学有感觉,并且有相应的负罪感,能够敏锐地意识到什么时候违反了程序的美感。负罪感迫使他更加努力地去改进程序,使程序更加符合美感。

乔纳森·萨奇:天赋、气质、动机和努力工作的结合。我知道有很多人期望在很短的时间就成为一名好的程序员,但能成功做到这一点的人并不多。成功来自一遍又一遍地做同样的事情,每一次学习一点点,下一次都做得更好一点点。

问:你编程的过程是什么样的?

加里·基尔代尔:我遵循非常明确的、适合自己的流程。我会先画数据结构,然后花很长时间思考数据结构。在开始编程前,我会一直思考整个程序的流程。

比尔·盖茨:我喜欢在坐下来编写代码之前先把整个设计方案构想清楚。而在完成代码后,我喜欢回去把它从头到尾再全部重写一遍。

彼得·罗伊森:我是个非常“自底向上”的程序员。我不为整体战略伤脑筋,因为除非完成了所有的细节,否则我从来看不清全貌。

问:团队合作编程对项目有什么影响?

受访者在这个问题上又达成了一致:开发团队应该尽可能精简。

约翰·佩奇:如果一个产品需要四到五个人开发,那和你自己一个人编程时采取的方法是不同的。我坚信只能有一个人来做产品和高层结构的设计,最多不能超过两个人。所有的设计出于一个头脑,才能够实现和谐与一致。如果试图取悦所有人,让一个委员会来做设计,你的方向就错了。那绝对是致命的。

C·韦恩·莱特莱夫:不论是单枪匹马还是在一个非常小的团队里,我都能工作得很好。当团队超过6个人时,那就完全失控了。

关于其他兴趣

问:不编程的时候,你都做些什么?还有其他兴趣爱好吗?

查尔斯·西蒙尼:还有其他不少有意思的事情,我也乐此不疲。我对埃及象形文字略知一二。学习其他语言、旅行和观察世界都是很不错的活动。我还持有私人旋翼飞机飞行员执照。

加里·基尔代尔:我会间歇性的短期休假,因为我也很喜欢享受生活。这时我会外出,开飞机只是为了从工作中脱身出来。

约翰·佩奇:我是个飞行员。我正在盖一座房子,我弹吉他,喜欢游泳,不是为了游泳而游泳,而是为了锻炼身体。

杰夫·拉斯金:五花八门。我是个典型的发明家。我做过大量不同领域的项目。例如,我有一家公司制作无线电遥控模型飞机。另外我正在做一个钢琴方面的新设计。...... 我正在开发一款数控铣床。

令人惊讶的是,多个受访者对驾驶飞机(或者遥控模型飞机)有着极大的兴趣。对此,约翰·佩奇表达了自己的看法:

约翰·佩奇:一个原因是那些相当成功的程序员是有财力开飞机的。还有一个原因是,飞行对工程师来说是一个煅炼,因为它涉及操纵复杂的事物,这是工程师喜欢做的。程序员也喜欢驯服复杂的东西,而开飞机是非常复杂的,所以掌控飞机是很有趣的。最后,开飞机像编程。一名优秀的飞行员要给乘客提供完美、平稳的航行体验,而优秀的程序员给客户提供的是在计算机上完美、无需费脑的经历。

对未来的预想

问:你认为未来计算机在社会中会扮演什么角色?

本书成书于上世纪80年代,这给了我们一个绝佳的机会通过今天的视角来审视书中人物对未来的设想与预言。

丹·布兰克林:我觉得将来的个人计算机会跟台式机有所不同,现在的电脑就像是放在你办公桌上的电话。未来的个人电脑应该更像是个记事本。我的记事本随身携带,为什么它就不能是电脑呢?嗯,这不同于我们现在熟知的个人电脑。计算机技术会用在各种各样的全新场合,比如用作记事本。

鲍勃·弗兰克斯顿:我认为现在的这种计算机会消失。计算机会变成智能代理或家用电器。个人计算机最终将销声匿迹。当然这个过程是逐渐的。有一个阶段会有很多针对个人计算机使用者的应用,但这决不是进化的终点。虽然人们还无法准确预言计算机究竟会怎么发展,但谁会喜欢在桌子中间放这个一个大盒子呢?

彼得·罗伊森:对于整个行业或者整个世界,我都不那么关心。对于世界,我的关心程度只限于我希望世界是安宁的,我也希望尽我能尽的本分让世界安宁。


附录 - 受访者名单:

  • 查尔斯·西蒙尼 - Microsoft Word 和 Microsoft Excel 等著名软件的领导开发者。值得一提的是,西蒙尼曾于2006年和2009年两度进行太空旅行。另外,著名的匈牙利命名法也与他有关。
  • 巴特勒·兰普森 - 曾担任 DEC 公司高级企业顾问工程师,1995年进入微软并一直工作至今。另外,兰普森自1987年开始一直担任麻省理工学院电气工程与计算机科学希兼职教授。
  • 约翰·沃诺克 - Adobe 公司的联合创始人,PostScript 语言的开发者。
  • 加里·基尔代尔 - CP/M 操作系统与 PL/1 编程语言的开发者。
  • 比尔·盖茨 - 这位不用介绍了吧。
  • 约翰·佩奇 - 软件出版公司副总裁,主导开发了 PFS 系列产品。
  • C·韦恩·莱特莱夫 - dBASE 系列产品的开发者,曾为 NASA 的“海盗”号火星探测器的着陆支持软件编写数据管理程序 MFILE。
  • 丹·布兰克林 - VisiCalc 电子表格程序的合作开发者。
  • 鲍勃·弗兰克斯顿 - VisiCalc 电子表格程序的合作开发者。
  • 乔纳森·萨奇 - 取得非凡成功的 Lotus 1-2-3 电子报表软件的主要开发者。
  • 雷·奥奇 - 曾在莲花公司与乔纳森.萨奇共事过,后加入微软。是 Symphony 程序的开发者。
  • 彼得·罗伊森 - T/Maker 公司的创始人以及 T/Maker 电子表格程序的开发者。
  • 鲍勃·卡尔 - Framework 套件的开发者。
  • 杰夫·拉斯金 - 苹果电脑公司 Macintosh 项目的发起人。
  • 安迪·赫兹菲尔德 - Macintosh 操作系统的主要开发人员。2015年上映的电影《史蒂夫·乔布斯》中有不少关于他的戏份。
  • 岩谷徹 - 吃豆人游戏的缔造者。
  • 斯科特·金 - Inversion 一书的作者以及 Inversions for the Macintosh 程序的开发者。
  • 加隆·兰尼尔 - Moondust 游戏的开发者,亦是虚拟现实领域的拓荒者。
  • 迈克尔·霍利 - 层在卢卡斯影业旗下参与 SoundDroid(音响机器人)程序的开发工作。

你可能感兴趣的:(聆听大师们的声音 - 《编程大师访谈录》读后)