微信扫描登录

程序员访谈录:9位优秀程序员的Q&A(上)

在图灵,我和李昐共事过程中,创办了《码农》月刊,近30期杂志覆盖了千万互联网IT从业者,《图灵访谈》近百篇文章采访了国内外优秀IT人才,希望为IT和计算机行业报道更多体现永恒价值的内容和信息,包括高德纳,BrianKernighan,松本行弘、Martin Fowler这样的国际编程大师,也包括国内像丁香园CTO冯大辉、酷壳博主左耳朵耗子、云风….等这样的国内顶尖开发者和学者。

如今,我和李盼都离开了图灵,今天摘录一篇非常有名的程序员访谈录,算是纪念过去,开创未来,希望访谈栏目还能继续办下去,而且能越办越好。我们

  • 希望报道的程序员是一个个充满创造力、自由不羁的小鲜肉和大咖们,爱生活,爱Coding。
  • 遵从最佳实践而痛恨陈规教条,欣赏天才而不迷信权威,他们喜欢思考而不轻易苟同。虽是技术人,却追求人文理想,敢于呐喊,说出自己的观点和主张,也更善于脚踏实地,凭借代码的力量创造神奇,用自己的点滴工作去改变现状。

下面这篇访谈录源自2006年,最先发布在波兰程序员 Jaroslaw 的博客上。原作者提出了10个问题,都是有关于他认为读者会感兴趣的或尊敬的各位优秀程序员所创造的各种事物。

编程是一门艺术,程序员是艺术家

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

不管怎么样,我得到了很多很有意思的内容,所以,这对我绝对是一次很有意义的经历。并不是每一个人都回了我的邮件,也并不是每一个人都同意回答我的这些问题,也许在我发布这篇文章后我会得到那些回答,但是我已经迫不及待想把这些东西发布了。

— Jaroslaw

介绍

首先我们看看这9位优秀程序员是哪些人:

  • Linus Torvalds: Linux内核的作者。
  • Dave Thomas: Pragmatic Programmer, Programming Ruby还有其他一些关于编程的优秀书籍的作者。
  • David Heinemeier Hansson: 一个新热门的web开发框架Rails Framework的作者(David Heinemeier Hansson被称为DHH,这里提到的热门框架即Ruby on Rails,他是37signals的合伙人之一,也是《重来》一书的联合作者)
  • Steve Yegge: 也许是这些人当中名气最小的,但是他给出了一些有趣的回复,他有一个非常受欢迎的关于编程的博客,同时,他也是一款名为“Wyvern”的游戏的作者。
  • Peter Norvig: Google搜索总监,有名的Lisper,关于AI的著名书籍的作者。
  • Guido Van Rossum: Python 发明者。
  • Bjarne Stroustrup: C++语言的创造者。
  • James Gosling: Java语言的创造者。
  • Bray: XML和Atom规范的作者之一。

Q1:你是怎么学习编程的?学校有什么帮助吗?还是你没有在任何学校毕业?

多位程序员提到,主要是自学编程,但是在学校提供的课程还是很有用的帮助,在一些基础概念(如复杂性分析)方面,建议如果有条件的话,最好还是能够取得学位证书。

Steve Yegge: 在我17岁的时候,我在HP的计算器中用他们的RPN 栈语言自学编程的。在这之前,我尝试过学习编程一两次,但都没有学成。HP 28c 和 48g 的科学计算器是一个很牛的东西,而且还有不错的文档。我搞了一本3D图形的书,并很费力地把其中的Pascal语言转成RPN栈语言,并用48g写了一个3D的线框图渲染图。运行的还不错,在我买了PC和Turbo Pascal之后,我开始认真地学习编程。在我进入大学计算机科学专业之前,我已经是一个不错的程序员了。我在华盛顿大学拿到了计算机科学学位,这绝对是有价值的,所以,我建议所有的程序员都应该得到计算机科学专业的学位。

Linus Torvaldsl:我没有在学校里学过编程,我在主要是读我自己想读的书,或是就直接去编程 (一开始在 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:也许吧。但老实说,我没见到过懂这些学科和好的程序员有很大的相关性。然而,我见过有音乐背景和好的编程技能有很强的相关性。我不知道这为什么,但是我怀疑大脑中的某个区域可以让人即可以写出好的音乐,也可以写出好的代码。

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

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

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

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

从以上访谈可以看出,最牛的程序员并没有那么死追编程技巧,更重要的是编程的思想和理念,用最简洁的方式实现复杂的功能。 一个优秀的程序员是善于遇到问题解决问题的,而不是记忆大量的本来就不存在的标准答案。优秀的程序员,是能令竞争对手无比恐惧的,他们把枯燥无味的代码变成了丰富多彩的软件艺术。

因此想到自己从事技术社区传播的工作,所爱之事的热情延伸到更多人身上,影响着这个时代很多从业者和新手们,想到这些很心潮澎湃。

下一篇内容预告:

  • Q4:你认为计算机编程领域的下一个大事件是什么?X-oriented编程、Y语言、并行计算还是什么?
  • Q5:如果你有三个月的时间去学习一个相对较新的技术,你会选择什么?
  • Q6:你认为让某些程序员的效率10倍甚至100倍于其他人的原因是什么?
  • Q7:你最喜欢的工具(操作系统,编程/脚本语言,文本编辑器,版本控制系统,shell,数据库引擎,其他你无法离开的工具)是什么?为什么更喜欢这个工具?
  • Q8:你最喜欢的计算机编程相关的书是什么? Q9:你最喜欢的与计算机编程无关的书是什么? Q10:你最喜欢的乐队或表演者或作曲家是谁?

本篇参考了酷壳coolshell博主陈皓对《九个超级程序员的采访》一文的翻译和解读。 ​ 欢迎大家关注程序员访谈。