对九个超级程序员的采访

12年前

  原文:《Q&A With Nine Great Programmers》时间有限,我只能粗译,难免错误。

  这篇访谈源自 2006 年,最先发布在波兰程序员 Jaroslaw “sztywny” Rzeszótko (AKA “Stiff”) 的博客上。但是这篇博文现在找不到了。非常感谢他能授权我重新发布这个博文。

在一个炎热无聊的下午,我突发奇想。我想通过电子邮件的方式对那些我非常感兴趣和非常敬重的程序员问 10 个问题。准备这 10 个问题我只花了 5 分钟,这些都是我个人想问他们的问题,所以,我基本上没想太多要问他们什么。最后两个问题和编程没有什么关系,我就是想问题这些人的一些兴趣爱好。另外, 不是每一个人都想回答我的,这是我第一次做“访谈”,所以,我犯了一些错误,让一些问题没有回答。不管怎么样,我得到了很多很有意思的内容,所以,这对我 绝对是一次很有意义的经历。

并不是第一个人都回了我的邮件,也并不是每一个人都同意回答我的这些问题,也许在我发布这篇文章后我会得到那些回答,但是我已经迫不及待想把这些东 西发布了,所以,我可能会更新这篇文章(更新:2006年 3 月 8 日,我收到了 Bjarne Stroustrup 的回信)

– Jaroslaw

  介绍

  • Dave Thomas – “Pragmatic Programmer”(注:douban) 和 “Programming Ruby”(注:douban) 以及其它一些优秀书籍的作者。 你可以在 这里 读读他对编程的一些想法。
  • Steve Yegge —— 他可能并不那么知名,但是他给了很多有意思的回答。他有一个很火的关于编程的 blog,他也是游戏 ”Wyvern” 的作者。(陈皓注:他最火的是去年在 Google+ 上对 Google 和 Amazon 的吐槽,06年他应该在 Google 了)

  Q1: 你是怎么学编程的?是从学校里学的吗?或者你没有上过学:) ?

  Steve Yegge

  在我 17 岁的时候,我在 HP 的计算器中用他们的 RPN 栈语言自学编程的。在这之前,我尝试过学习编程一两次,但都没有学成。HP 28c 和 48g 的科学计算器是一个很牛的东西,而且还有不错的文档。我搞了一本 3D 图形的书,并很费力地把其中的 Pascal 语言转成 RPN 栈语言,并用 48g 画了一个 3D 的线框架图。运行的还不错,在我买了 PC 和 Turbo Pascal 之后,我开始认真地学习编程。在我进入大学计算机科学专业之前,我已经是一个不错的程序员了。

  我在华盛顿大学拿到了计算机科学学位,这绝对是有价值的,所以,我建议所有的程序员都应该得到计算机科学专业的学位。

  Linus Torvalds

  我没有在学校里学过编程,我主要是读我自己想读的书,或是就直接去编程 (一开始在 Commodore VIC-20 学编程, 然后是 Sinclair QL 上编程)。

  当然,我觉得上大学非常有用。我没有去一个工科大学,我上了赫尔辛基大学,这是一个比较偏理论的大学,所以,那里的教育并没有那么多的编程的东 西(编程只是很少一部分),这里大多数的课程都倾向于教一些基础概念的东西,如:复杂性分析。看上去很无聊,甚至有点浪费时间,但是我还是觉得这些课有 用,我对大多数课都还比较 enjoy。所以,我觉得我可能在这些方面是一个比较好的程序员。

  David Heinemeier Hansson

  我学编程是从用 HTML 做我的第一个网页开始的。那时,我想当我的网页能动态地显示一些内容,所以,我选择了 ASP 和 PHP。在做完这个网页后,我知道了怎么去编程,于是我开始我的计算机科学和商业管理学位的学习。

  Peter Norvig

  我是从高中和大学课程中学编程的,但是我还是觉得我自己学得更多。

  Dave Thomas

  我是在高中学编程的。我完全地迷住了,我对编程爱得无法自拔,然后,我开始挑选那些提供软件开发课程的大学。最终,我去了伦敦大学的帝国学院。 第二年我就开始学习软件开发的课程了,那绝对是非凡的,学生和教员在一起工作把教材做得更好,每一个人都可以从中学到很多。这些课程给了我难以置信和非常 雄厚的软件开发背景。我在那里读到了博士,最后去创业了。

  关于“我是怎么学编程的”这个问题,我的回答是“我现在还在学编程”。我认为好的程序员一生都在学编程。这并不是去学一门语言或是一个代码库,好的程序员会对他们的编程技艺一年又一年地精益求精。

  Guido Van Rossum

  我去的那个大学有一个大型主机和很多不同的计算机课程。这对我很重要。

  James Gosling

  起初,我是自学的。在我去上大学之前,我就找到了一份程序员的工作。但是我很高兴我去了大学,在那里有很多乐趣,最终我学到了博士。

  Bjarne Stroustrup

  我先上的是 Aarhus 大学, 然后是剑桥大学(Cambridge),这两个大学教了我很多很有用的东西,这些东西为了以后的工作打下了基础。另外,我对编程和钱的关系学得非常好 —— 知道了真实世界的问题,正确性,维护性,准时交付,等等,这些比教育可能更重要。

  Tim Bray

  我本来想去做一个数学老师的。但是,那个学数学的大学要我去学几个计算机的课。

  Q2: 你们觉得对程序员最重要的事是什么?

  Steve Yegge

  沟通能力(写和说)。除非你可以让你的想法更有效率地传递出去,否则你不可能做得比编程更多的事。程序员应该疯狂地阅读,锻炼写作能力,参加一些写作培训课程,甚至锻炼在公开场合演讲的能力。

  Linus Torvalds

  It’s a thing I call “taste”. 有一件事,我把它叫做“品味”。

  我倾向于不从熟练程度来评判那些和我工作过的人。这些人能非常艰苦地写出很多代码,但是我想从他们对别人的代码的反应做出评判,这样我们就可以 明白他们自己写的代码怎么样,知道他们使用的方法怎么样。他们对别人的评判还告诉我,他们是不是有好的“品味”。是这样的,如果一个人没有“好的品味”, 那么他一般不会很好的评判他人的代码,他自己写的代码通常也不会很好。

  哦,这并不只是唯一的事。还有一件事,尤其在开源项目里,那是他是否有能力能和别人进行简单的沟通,告诉别人他要干什么,怎么干。这个能力可以告诉别人为什么你干的事是非常重要的,并不是所有的人都有这个能力。

  也就是说,有一些人可以写出很不错的代码,但他们并不一定能解释这些代码,他们也并不一定有好的品味,但是代码可以运行得不错。有时,你需要另 一个人(有那种不错的品味的人)把他的代码转成更好的形式。也就是说,任何一个程序员都需要那种可以用清晰的代码来解决复杂问题的基础能力。

  David Heinemeier Hansson

  很强的对有价值的事的感觉。你可以问问自己这个问题你有没有这种能力:我现在做的这个事值不值得做?很多程序员浪费了如大海一样的时间去做一些无意义的事。

  Peter Norvig

  我不觉得只有一个,如果要我说一个的话,我说是“专注”。

  Dave Thomas

  热情。

  Guido Van Rossum

  你的问题很难回答啊:-) 我猜,如果程序员会在早晨煎个鸡蛋做早餐,那真是无价的能力。

  James Gosling

  自我激发。你需要全身心地投入到你要做的事中。

  Bjarne Stroustrup

  把事想清楚的能力:程序必需要能清楚地理解问题并能清楚地表述解决方案。

  Tim Bray

  能为自己的直觉提供证据的能力。

  Q3: 你是否认为数学和/或物理是一种很重要的编程技能?为什么?

  Steve Yegge

  数学有很多的分支和程序员相关,他们是“离散数学”和“具体数学”。这些分支包括的学科有,概率论,组合数学,图论,归纳证明,和其它有用的东西。我会鼓励所有的程序员都去学习离散数学,无论能学多少,因为这总比什么都不懂强。

  对于传统的数学,我也不经常用,但是我需要的时候这些数据知识会很管用。例如,在我之前的工作中我就用到了微积分。我需要估计每个小时中某服务 的高峰时间的流量负载,所以,他的负载是跟着太阳走的就像一个正弦曲线一样。最简单的方式就是把每个小时的负载曲线给整合起来。如果我不知道微积分,我就 不知道怎么更为准确地估计。

  当年我在开发我的 Wyvern 游戏的时候,我的平面几何的知识对我非常有帮助。而且经常使用代数和线性代数的知识。但我很少在工作中使用三角学或微分方程,微积分同样也很少。

  我想说,简单的数学基础让我的技能比一般程序员好过 5% 到 10%。如果我了解更多的数学,我确信我会比今天做得更好,所以,我每周都会花几个小时学习数学。

  我喜欢物理,我还在学习物理,我会花我一生去理解量子力学。但是我却没有发现物理对我的程序员工作有多有用。当然,如果我从事一些和物理相关的工作,可能会有用,例如:3D 游戏编程,或是某种物理特性仿真。

  Linus Torvalds

  我个人认为有很强的数学背景是一件好事。但我不确信物理是不是这样的,但是我深信懂数学的人会让你成为一个更好的程序员。这些智力模型都是相通的。

  David Heinemeier Hansson

  根本没用。至少对业务编程和 Web 应用来说没用。但是数学可能对一个人的写作有很重要的帮助。

  Peter Norvig

  是的。很多相法都是从数学来的:归纳,递归,逻辑,等等。

  Dave Thomas

  也许吧。但老实说,我没见到过懂这些学科和好的程序员有很大的相关性。

  然而,我见过有音乐背景和好的编程技能有很强的相关性。我不知道这为什么,但是我怀疑大脑中的某个区域可以让人即可以写出好的音乐,也可以写出好的代码。(陈皓注:@Sir 阿怪 貌似就是这个例子)

  Guido Van Rossum

  数学,当然(对于一些学科是很重要的,我不关心微分方程,但是代数和逻辑学是很重要的),物理,我不觉得对编程技能有关,当然物理在其它很多地方很有意思。

  James Gosling

  当然!数学教会了我逻辑和推导……让我有了一双懂分析的眼睛。当我们分析算法的时候,数学是无法被取代的。

  Bjarne Stroustrup

  这要看程序员自己和项目性质了。以前的数据很有用,物理一般,但是学好物理是是学习应用数据最好的一条路。

  Tim Bray

  对我来说,在我的编程生涯中我从来都没有用过大学里教的数学。

  Q4: 关于编程,你们认为接下来的大事是什么?X-Oriented 编程,Y语言,量子电脑 ?

  Steve Yegge

  我认为 Web 编程会逐渐变成最最重要的客户端编程。而对于原来传统的客端端编程都会被废弃,如: GTK, Java Swing/SWT, Qt, 当然,所有的和平台有关的东西,例如 Cocoa 和 Win32/MFC/等。

  当然,这不会一晚上就发生了。这会在第一个十年内缓慢地发生,而在第二个十年内,Web Apps 最终会胜利。工具,语言,协议,和浏览器技术都会进步得非常快,并会完全超出你今天能干的事。每一年都会向前进一步,而从今天开始,我会最终决定把我所有 的应用开发全部切换到基于浏览器的应用。(陈皓注:我也是这么认为的,参看《来信,创业,移动互联网》)

  微软和苹果最终不愿意这个事发生,所以,触发这个事的第一步会是一个开源的浏览器(如:Firefox)开始到了支配市场的地位,然后会出现某 种 Firefox 的杀手级应用(这种杀手级应用可能会像 iTunes 一样,所有的人都会用它,只需要下载 Firefox)

  Linus Torvalds

  我并不认为我们会看到一个“大的跳跃”。我们只会看到很多的工作帮助我们把那些沉闷辛苦的工作变得更简单 —— 会有一个更高级别的语言,也许把简单的数据库集成到语言中来会是其中最主要一个。

  例如,我个人相信“Visual Basic”在编程方面比“面向对象”做得更多。当然,人们都在取笑 VB 是一个很烂的编程语言,并且人们在谈论 OO 语言都十多年了。但我还觉得不是这样的,Visual Basic 不是一个好的语言,但是我觉得 VB 那简单的数据库接口比 OO 更重要。

  所以,我认为会语言有很多的改进,并且,硬件的改进会让编程更容易,但我并不期望会有巨大的生产力或是革命性的改进。

  至少,你不会开始搞真正的 AI 的东西,我也不认为真的 AI 会变成某种你不需要编程的东西。

  David Heinemeier Hansson

  我从不试图预测未来。我也不相信命运一说。最好预测未来的方式就是去实现未来。

  Peter Norvig

  大规模的分布式处理

  Dave Thomas

  下一个最牛的事会被再下一个最牛的事所掩盖,然后再被再再下一个所掩盖,再再再下一个所掩盖……。这是一件没完没了的事,所以,我并不会试图去 找最牛的事,因为这会让人们忘了那些最真实的问题:把基本的东西做对。我们要让用户更满意,专注于交付有价值的东西,自豪于我们做的事。一个程序员可以使 用很多工具把这些事做得更好,而不是去追逐时尚和流行。

  Guido Van Rossum

  对不起,我没有那么多水晶球。我 CGI 被发明了 5 年后预测过它 :-)

  James Gosling

  有两个事是我现在最关心的,那就是要对付并行和复杂。

  Bjarne Stroustrup

  我不知道,我也不愿猜。

  Tim Bray

  不知道。

  Q5: 如果你有 3 个月学一个相对较新的技术,你会学什么?

  Steve Yegge

  我的确有 3 个月的业余时间,我准备学一下 Dojo (http://dojotoolkit.org) 和高级 AJAX 及 DHTML。我会通过开发一个相当牛的 Web 应用来学习他们。Dojo 真的酷,并且我确信它会越来越好。

  Linus Torvalds

  嗯,我真的很爱做 FPGA(可编程芯片),但我部是太忙了而不是坐来来开始学习。我喜爱和硬件打交道:很明显这个原因是因为我最终在做操作系统,因为操作系统(除了编译器)基本上都是在和硬件打交道,但我没有真正地自己去设计和做一个硬件。

  David Heinemeier Hansson

  Mac 的 Cocoa 编程

  Peter Norvig

  我想把 Javascript 学得更好,然也也想学 Flash.

  Dave Thomas

  如果“新”是对于我来说,那么我会去学钢琴课。

  如果“新”是说技术,我猜我会选择学习某种和为残疾人服务的有关的技术。

  Guido Van Rossum

  单板滑雪。

  James Gosling

  搞点有乐趣的东西,我会学习最新的 3D 渲染技术。我可能会写一个光子映射渲染器。

  Bjarne Stroustrup

  3个月只有很少的东西你可以学,我觉得你只能参加某个成熟领域的培训。

  Tim Bray

  安全,加密,数字签名,身份标识,等等。对我来说,从没学过这些东西对我来说是个很大的问题。

  Q6: 你们觉得如何让一些程序员可能有超过其它程序员 10 倍或 100 倍的生产力?

  Steve Yegge

  我想你应该考虑一下为什么不是让所有的程序员都一样牛。托马斯·爱迪生有一句关于天才的名言也许会给你一些启示。

  Linus Torvalds

  我真的不知道,我想,一些人之所以更牛是因为他们可以专注于那些重要的事,而更多的只不过是在应付。那些我所知道的真的很牛的程序员从很年轻的时候就在做事了。

  David Heinemeier Hansson

  把难题变简单的能力。

  Peter Norvig

  把整体问题一次性放入大脑的能力。

  Dave Thomas

  他们关心他们做的事。

  Guido Van Rossum

  大脑结构基因不同。

  James Gosling

  他们知道他们要做什么,他们不并不急于仓促行事。他们有他们要做的事的整个蓝图。

  Bjarne Stroustrup

  首先,缺少足够的职业培训,或基础不够。其次,这些人要即聪明(那种可以把事情想清楚,直达核心的能力),又有经验,并有使用工具的知识。编程需要把理论和实践结合起来 – 并不是使用没有实际业务的知识。

  Tim Bray

  令人惊讶的思维改变。

  Q7: 什么工具是你的最爱(操作系统,编程/脚本语言,文本编辑器,版本管理,shell,数据库,或其它没它你活不了的工具),为什么不是别的?

  Steve Yegge

  操作系统: Unix! 我用 Linux,cygwin,和 darwin。你无法打败那些高效的工具。每一个程序员都应该学习使用 /bin 和 /usr/bin 下的所有命令。

  脚本语言:Ruby。我几乎对所有的重要的脚本语言都很熟悉: Perl, Python, Tcl, Lua, Awk, Bash, 和一些我忘了的。但是我太懒了,而 Ruby 是目前所有脚本语言中最简单的,它应该是天堂制造的。

  编程语言:没有一个我喜欢的,我觉得所有的编程语言都很扯。我倾向于 Java,因为它很强,可跨平台,有多不错的工具和类库。但是 Java 未来会进化或是灭亡,Java 还没有好到可以永远保持其领先地位。

  文本编辑器:Emacs,因为这是迄今最好的编辑器。

  版本管理:SVN,Perforce 更好一些,但是也很贵。

  Shell 脚本: Bash, 因为我太懒了去学一个更好的。

  数据库: 当然是 MySQL,没有之一。

  其它:我发现 GIMP 是无价的,但也是令人恼炎的。我用这个东西好几年了,但什么也没干,但是我没它活不了。很讽刺吧。Firefox 越来越是我最重要的工具。如果让我去用 IE 和 Safari,我会有严重的窒息感。

  注:所有的这些工具 (Unix, Emacs, Firefox, GIMP, MySQL, Bash, SVN, Perforce) 都有一个共同点:他们是可扩展的。例如:他们都有可编程的 API。伟大的程序员知道怎么编写他们的工具,而不只是去使用。

  Linus Torvalds

  实际上,我最终也没有用过几个工具,而我却花了一些时间让这些工具为我工作。最大的事是我自己写了个操作系统,我也自己写了个版本管理系统(git),我用的文本编辑器是 micro-emacs – 最终我也定制和扩展了它。

  除了上面三个,其它的东西,我深度关心我的邮件阅读软件,我使用“pine”,并不是因为它是史上最好的邮件阅读软件,因为我习惯了,用它我会有最低限度的大惊小怪。

  David Heinemeier Hansson

  OS X, TextMate, Ruby, Subversion, MySQL. 这些组合让我很快乐。我希望那些有好的品味的专注于重要的事的工具。

  Peter Norvig

  我不喜欢那三大操作系统 – Windows, Mac, Linux。我喜欢 Python 和 Lisp, Emacs.

  Dave Thomas

  在使用 Linux 10 年后我转到 Mac 平台有两年多了。Mac 并不见得有多好,但是它不需要很牛的技术,也不需要经常维护,这让我可以让我更专心得使用它。

  我并不是一个单一工具的信仰者,我喜欢换来换去的,这样可以让我有更多的经骊。现在,我使用 OSX, Emacs, TextMate, Rails, Ruby, SVN, CVS, Rake, make, xsltproc, TeX, MySQL, Postgres, 还有一堆高效的小工具。没人知道我明年会用什么。

  Guido Van Rossum

  Unix/Linux, Python, vi+emacs, Firefox.

  James Gosling

  这些天,我在用 NetBeans. 用它可以干我想干的所有的事,清洁,简单和高效。这是最好的我永远要生活在其中的环境了。

  Bjarne Stroustrup

  Unix, sam (一个非常简单的文本编辑器), 当然,一个好的 C++ 编译器。

  Tim Bray

  我喜欢 Unix-like 的操作系统,像 Python 和 Ruby 的动态语言,像 Java 的静态语言(具体说来是 Java API) Emacs, 还有, bash, whatever, NetBeans.

  Q8: 你最喜欢的编程书是什么?

  Steve Yegge

  大哥,这个问题太难了。也许是”Gödel, Escher, Bach: an Eternal Golden Braid” (作者 Hofstadter)?虽然这不是严格意义上的编程的书,如果你要明确意义上的编程书,那么可能是 SICP (mitpress.mit.edu).

  Linus Torvalds

  嗨。这两天我在读一些小说,或是非计算机读物(老的但是有用的 “The Selfish Gene” 作者 Richard Dawkins)。

  如果要问我编程的书,我脑子里只出现了唯一一本真正的经典的编程的书 Kernighan & Ritchie 的 “The C Programming Language”,因为这本书太牛了,可读性强并且很短。考虚一下你想学到这世上一门最重要编程语言,并且它很薄,而且还有可读性,这真是一个奇迹。

  也就是说,其它我很喜欢的书并不是编程的,而是关于计算机结构和硬件的。那显然是 Patterson & Hennessy 的计算机结构的书,但是我个人也许更喜欢 Crawford & Gelsinger 的 “Programming the 80386?,这是我在开始写 Linux 时用的书。

  相似的原因,我还喜欢 Andrew Tanenbaum 的 “Operating Systems: Design and Implementation”.

  David Heinemeier Hansson

  我喜欢 Extreme Programming Explained 其摒弃了一般的编程实践,我还喜欢 Patterns of Enterprise Application Architecture 其出众地说明了抽象和具现的平衡。

  Peter Norvig

  Structure and Interpretation of Computer Programs

  Dave Thomas

  这关系到你所谓的“喜欢”,也许我最喜欢的是 IBM 的 “IBM/360 Principles of Operation.”

  Guido Van Rossum

  Neil Stephenson 的 Quicksilver.

  James Gosling

  Programming Pearls 作者 Jon Bentley.

  Bjarne Stroustrup

  K&R.

  Tim Bray

  Bentley 的 Programming Pearls

  Q9: 你最喜欢的和编程无关的一本书是什么?

  Steve Yegge

  只能是一本吗?这不可能。有太多太多我喜欢的书了。

  我这个月读过最喜欢的书是 “Stardust” (Neil Gaiman) 和 “The Mind’s I” (Hofstadter/Dennet).

  我最喜欢的作者是 Kurt Vonnegut, Jr. 和 Jack Vance.

  Linus Torvalds

  我在前面说过 Dawkins 的 Selfish Gene。在小说方面,有很多很多我 enjoy 的,但是几乎没有我特别喜欢的一本。我一般不会重读一本书,我的选择总是会变。我可能更喜欢科幻小说,如:”Stranger in a Strange Land” 作者 Heinlein,这是我青少年时期最喜欢的书,但现在并不是我喜欢的了。

  David Heinemeier Hansson

  1984, George Orwell.

  Guido Van Rossum

  Neil Stephenson 的 Quicksilver.

  James Gosling

  Guns, Germs & Steel 作者 Jared Diamond

  Bjarne Stroustrup

  我没有固定喜欢的书。目前是 O’Brian 的 Aubrey/Maturin 系列。

  Tim Bray

  One Day in the Life of Ivan Denisovich

  Q10: 你最喜欢的乐队/演奏家/作曲家?

  Steve Yegge

  喜欢的风格:古典音乐,动漫原声音乐,电脑游戏音乐

  喜欢的作曲家:Rachmaninoff, Chopin, Bach

  喜欢的演奏者:David Russell (古典吉它), Sviatoslav Richter (钢琴)

  喜欢的动漫音乐: Last Exile, Haibane Renmei

  Linus Torvalds

  实际上我并不太喜欢音乐,但是当我听音乐的时候,我一般听经典摇滚乐,如: Pink Floyd ,Beatles ,Queen 和 The Who 乐队。

  David Heinemeier Hansson

  我喜欢很多风格。 Beth Orton, Aimee Mann, Jewel, Lauryn Hill. Actually, 所有的这些都可以归到 Girls with Guitars ;).

  Guido Van Rossum

  Philip Glass.

  James Gosling

  我喜欢听民歌: Christine Lavin, Woody Guthrie, Pete Seeger…

  Bjarne Stroustrup

  乐队: The Dixie Chicks. 作曲家: Beethoven.

  Tim Bray

  看我的博客吧。

  . . . . . . . . . . . . . . . . . . . . . . . . . . .

  补充说明

  我之所以发现这篇文章,是因为我读到了 Jeff Atwood 的这篇名为 “Linus Torvalds, Visual Basic Fan” 的文章,这篇文章指向了 “STIFF ASKS, GREAT PROGRAMMERS ANSWER” 这篇文章,但是链接已坏了,然后,我搜了一下也没有搜到这篇文章。然后我去了 archive.org 搜了一下,并找到了这篇由 Jaroslaw Rzeszótko 写的博客。

  因为这篇博文现在找不到了,所以,我想我应该重新把它贴出来,这样其它人可以读一下这篇有意思的文章。所以,我向原作者取得了授权,再次感谢 Jaroslaw!