超级程序员神话

上周我收到了一份邮件,一份让我心绪不宁的邮件。

邮件的作者基本上认为我在博客里和Pluralsight视频节目里谈论的都是非常浅显的话题,但发现我却虚伪的倡议面试内容应该设计的复杂些,应该为“真正的程序员”或超级程序员而设计。

这份邮件基本上表达了这样一种观点:开发应用程序的都不是“真正的程序员”,“真正的程序员”编写的是有难度的东西,跟复杂的数学算法相关的东西。

真有超级程序员吗?

超级程序员

我并不认为这种对编程和软件开发的认识和理解是他独有的,或是个别现象。甚至IT精英Scott Hanselman也称呼自己并且认为自己是欺世盗名的骗子

Scott Hanselman的这篇文章让我产生了共鸣,因为有时候我也有和他相同的感觉。

有时候,我很怀疑,我是否真的有能力解决真正有难度的问题。

让我斗胆猜测一下,我猜测大部分的程序员在思想里都会某种程度的承认,承认自己只是一个普通的程序员,但这世界上确实有一些超级程序员,他们在做一些诸如控制硬盘缓存或为谷歌建立搜索索引等非常复杂的算法问题。

好吧,不否认,当然会有一些程序员正在写一些代码处理各种你我都不能理解的复杂问题,但他们跟我们这些余下的程序员究竟有多大区别呢?

在一个为企业开发应用的程序员和一个为谷歌写搜索算法的程序员之间,或和一个开发用来控制读写头从磁盘扇区读取数据的物理操作的芯片程序员之间,有真正的不同吗?

在我回答这个问题之前…

让我们花几分钟时间谈谈他们所解决的问题。

你曾经遇到过的需要去解决的最有难度的问题是什么?

你是如何着手去解决这些问题的?

到最后,当你真正的解决了这个问题时,你是否觉得好像不是那么难?

当你回顾这段经历,回头来看这个问题时,你是否会发现,现在看来,它其实是个非常简单的问题?

你有很多疑问,我知道——可是我希望你在继续往下阅读前真正花时间思考一下这些疑问。

理解“认知”和“现实”之间的差距。这是非常重要的。很多的程序员,包括我在内,都经常分不清两者之间的区别。

大家都知道,我们对一个问题的认知经常跟这个问题的真实情况有很大差距。当我们还不理解一个问题时,我们会把这个问题想象的比它本身要复杂。但是,一旦我们理解了这个问题,我们会发现这实际上是一个很容易处理的问题。

让我来给你一个现实的例子。看一看下面这个数学公式。

复杂公式

我们可以把在看这个公式的人分成两类人。

  1. 对高等数学有相当了解的人,他们能立即认出这个公式,能马上知道它是干嘛的。
  2. 从来都没见过这样一堆符号的人,他们的即时反应会认为这是某种复杂的算法,可能需要几年的时间才能弄懂。

也许我说的并不很准确,但我想说的就是,在“会的人”和“不会的人”之间有一个清晰的分界线。

我可以用你已经熟悉的知识对这些符号做一个简单的解释。

准备好了吗?

这个公式跟下面这段代码是等效的:

var total = 0;
for(int i = n; i <= m; i++)
{
   total +=  f(i)
}

这说明了什么?

我想说的是,在数学算法中,在编程中,在我们的日常开发工作中,只有少数一些问题能称得上是有难度的问题,而且通常这些比较难的问题都能够分解成更小的问题(有时候需要多次分解),直到最后你需要处理的只是一个很简单的问题。

我的这个博客的目的,我的Pluralsight视频节目的目的,基本上都是告诉大家要把复杂的事情简单化。我自己的生活也是这样。

如果你想成为一个成功的程序员,你必须自己要学会如何做到这些,它会是你能学到的最重要的一门技能。

那么,现在来回答最初的问题——不,我不相信这世上存在超级程序员。我不认为在企业应用程序员和那些被视作在研究真正复杂问题或“真正的编程”的程序员之间有什么不同之处。

但不要误解我的意思,不要以为我是在说我不相信某些程序员会被其他程序员在技能高出好几个数量级。我敢大胆的说,真正优秀的程序员在效率是会比普通程序员高出10倍甚至20陪。

我想说的是,我们有一个习惯,总是忘记:当问题被分解成更小的问题后,所有的问题都变得如此简单,而且所有的问题都能这样去分解。

我想说的是,这个问题是一种能够阻挡你进步成为一个真正优秀程序员的问题,这是由于你自己的认知上错误导致的,你会把目前看上去复杂东西当作是不可理解的。

我想说的是,当你在开发一个对自己来说似乎是很容易的企业应用时,你可能忘记了,对于那些对编程一无所知的所有你的朋友和家人来说,这是一个多么困难或几乎不可能完成的事情。

仍然不赞同我的观点?

很好,你有这样思考的权利。

但我给你准备了一个难题。你想必一定是知道某位“超级程序员”了。也许你就是其中之一。如果是这样,我们要听你说说。请告诉我们一个非常有难度以至于其他的人有不可能理解的复杂问题。

我并不是在挖苦你。我是很严肃的,如果你能够证明我错了,那就证明给大家看。我至今还未遇到过一个不能分解成简单可理解的小问题的难题。

[英文原文:The Myth of the Super Programmer ]
分享这篇文章:

23 Responses to 超级程序员神话

  1. reduci says:

    很喜欢你翻译出来的这种味道

  2. gtss says:

    哥们,那些所谓世界难题,随便分解下就可以解决了,说那些问题难是那些假科学家忽悠,诺贝尔奖什么的根本不在话下
    觉得我会信么?呵呵

    • cyler123 says:

      处于实验室的某人表示:
      获得了诺贝尔的奖的重要工作也是在实验室完成的。
      而实验室里的工作,就是从问题的一个个方面,逐个完成的。只有少数人比较狗屎的发现了一些可以同时解决多个问题的方法(绝对狗屎运,相信我)

      另外,973项目,无一例外,全都是某个组牵头,然后具体的问题交给一个个小组完成,最终汇总成973项目成果~

  3. Luke says:

    这个还是在实现算法,是理由现有的公式,当然不难啦,就像告诉你怎么做排序,你去用一种语言实现,真正难的是如果创造一种更有效的排序方法,这才是所谓的开发算法

    • foxnake says:

      超级程序员 和 超级数学家 好像区别还蛮大的…
      排序?数据结构里所有的排序都是哪一年写成的?
      软工的高手好像也没几个是特别擅长算法的.
      话说回来,一般级别的算法难度,将算法问题域匹配到最短路径,二分图匹配之类的算法,和将商业应用问题域合理的映射到设计模式上好像也没什么难度差异.
      Facebook大红大紫之时,也没用过任何一个惊世骇俗的算法.

      当然,就像作者说的,就是在应用开发领域,程序员的高下之分也是天壤之别.

  4. 依云 says:

    「我至今还未遇到过一个不能分解成简单可理解的小问题的难题。」——真希望这位作者能够和我分享下费马大定理的分解 😀

  5. haitao says:

    分解往往需要很多步骤,每个步骤都可能有多种选择。。。只有大多数步骤的选择都正确的,才是高效的办法,否则都是吃力不讨好
    高手和低手的差距,就在这里。
    而不是分解好的最具体的工作,这些,谁来做都差不多

  6. julio says:

    怎么说呢,最初的“外刊”我很喜欢,最近发现从Google Reader点出来的是广告,然后才是文章,相当讨厌这样的方式~~这个是特意的吗??虽然我理解个人博客做广告的意义,但也不至于这样吧??

  7. foxnake says:

    与作者想法不谋而合.
    有多少毕业就进入企业的人看待科研时会有一种仰视的感觉.
    可是实际呢?科研也不就是遵循那一套工作方法,每天循规蹈矩的做事情.
    国内投行券商日进斗金的那一批经理,真的像我们想象的那样精于计算吗?
    如果你已足够聪明,就不要相信有哪个行业,会有一批全部比你聪明的人,在做你根本理解不了的事而自哀自怜.
    自己前行即可.

  8. 笑笑十年 says:

    我一直也认为我不是真正程序员,充其量我只能算是个业务熟练工。。。
    我不是科班出身,从事的也是没有太多技术含量的重复业务,但是我的薪水也不算太低,20K的岗位我可以随意挑着去,但是我依然认为我在真正的编程方面很菜。。。

    • GodfreyMao says:

      那你可算是我的学习目标啦。

    • yy says:

      20k代表的是你因为熟悉业务能为公司更多的利润 而不是技术水平的高低
      我的感觉是最能转化为收入的似乎就是业务熟悉度这种和技术水平关系不大的技能,所以要钱还是要技术是个难以抉择的难题啊,似乎还是没法分解的

  9. 砖家 says:

    分解问题本身就是程序员最重要的工作和难题。

  10. Blackgod says:

    文无第一,武无第二。一直觉得编程是一门偏文科的艺术。写文章给人看与写文章给编译器看而已。

  11. jeremy says:

    我想,作者的意思是,懂就简单,不懂就难

  12. simple says:

    同意Luke和haitao,当然有超级程序员。能把复杂的问题有效分解,用最简单的方法实现,就是超级程序员。写出Linux这样的系统以及改进算法和编译器的人,才是。
    建议对此有疑问的人,读一下这篇文章:传说中程序员的层次
    http://my.oschina.net/u/859307/blog/89214

  13. guruguru says:

    分解问题的能力就是区别超级和一般的标准了。

  14. adu says:

    非常赞同作者的观点,不过也是近一年来,才达到这样认识。没有作者的文字功底,不能很好表达出来,惭愧。

  15. chen says:

    其实,在人的思维成长过程中,这就是最重要的。系统性分析思维,一般晚上比较好吧,每个要解决的问题都需要一种策略,但一个策略却来源于无数经验的积累的分解。有广度和深度,才能真正完成一个艰难的任务。。。

  16. Kent says:

    很多数学问题,例如数值计算,到最后都可以分解为加减乘除,或许再加上对数表查表。
    那么,你知道如何分解么?
    比如用线性插值法去简化一个很复杂的函数计算?
    又或者是在平滑贴图中加入噪声以创建随机凹凸感?
    我觉得实际上遗漏了一个关键,分解问题的思路与方法就体现了程序员之间的不同。

  17. 莫小然 对这篇文章的反应是赞一个

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据