好的程序员做不出好的软件设计

你不能看到一个程序员还不错,就把他推到系统分析师、软件设计师或软件架构师的位置上。

如果你在团队或公司里寻找一个能胜任软件架构师或设计师这样重要位置的人时,首先出现在脑子里的想法通常是在程序员中选一个最好的。别这么干。这样的位置不是随意的找个不错的程序员就能胜任的。把你最资深的程序员晋升到这个位置也未必就合适。

乍一听你可能感觉荒诞。为什么我不能让一个程序员去做系统设计呢?毕竟,他们是设计程序的,不是吗?的确是的,没错。但你要明白的事情是,设计软件相对于编写程序,它需要的是一套完全不同的技能。

让我们来看看为什么一个好的程序员就未必可以做一个好的软件设计师。但首先,让我们来问问自己一个问题,是什么让一个程序员变的优秀,甚至杰出?要想成为一个好的程序员,你需要有能力实现真实世界里重要的软件。只能够写出一个简单的文本编辑器是远远不够的。

为了能做到可以解决重大的、复杂的编程问题,一个程序员需要在某个特点的编程语言上进行数年的经验积累。也就是说,为了能熟练的使用这种语言、熟悉这种语言的各种特色,他必须专注于这种语言。问题就在这儿。

对于只有锤子的人,他能解决的问题就是钉钉子

如果你专注于一种语言,并能做到精通掌握,那你遇到的问题模式很可能就限制于跟这种语言相关的领域。简言之,如果你懂PHP,那所有的问题都基本上是跟Web开发相关。相同的道理,如果你全部的知识都集中的Java上,那你对所有问题的解决思路都会沿着面向对象的方向,即使是使用过程式编程对于解决你的问题会更优的情况下,你也会如此。

一个程序员,只懂得一、两种编程语言,这会严重的限制他的解决问题的能力。例如,如果你的编程语言是C语言,对于手头出现的问题,你绝对不可能想出一种面向对象的解决思路,因为你的编程语言不提供这样的语言特征。跟Haskell程序员不一样,C++程序员不可能想出函数式解决方案。你的编程语言里提供了结构体和枚举类型与否,会严重的影响你剖析一个问题的方式。如果你使用的语言的能力很弱,或你只知道少数几种语言,你解决问题的能力相应的会被削弱。

语言塑造了我们的思维方式

有人说,我们的语言塑造了我们的思考和认知这个世界的方式。我基本上认同这个观点。当一个人的母语里的名词都有性别之分时,他一定不会同说其它种母语的人那样一提起“警察”这个词就基本上认为是男的。当一个人的母语里对蓝色和绿色不区分时,他对世界的感知会和那些有区分的人的感知大不一样。

如果我们回首中世纪学校的三学科,它们被描述为:语法解决概念和对象如何在书写和话语中被表现,用逻辑对它们进行分析,最终以修辞为目的同他人交流。对于我们来说,编程语言也有语法。如果我们的编程语言不够强,我们对事物和概念的认识以及对如何表达它们都不会有完整的视野。

语言,我们用来跟人们、跟计算机交流的功能,明显的影响着我们的思考方式。我们对语言知道的越丰富、越多,越能帮助我们提高解决问题的能力。

那么,什么样的人更合适?

那么,一个在某一两种编程语言里具有专长的程序员,在当他解决一个问题时,会存在一定的局限。他会局限于他使用的语言允许他做的事。因此,他不会成为一个好的软件设计师或分析师。

如果我们不用这些优秀的程序员,谁又能担当软件设计的任务呢?当然不会是那些完全不懂编程的人了。我们需要的是一种通才。一个优秀的软件设计者必须通晓过程式,面向对象式,函数式,以及逻辑式编程语言—还包括各种优秀的软件开发方法论。他不能只熟悉一种方法模式、像一个专业领域人员那样。当然,他自己并不能写出复杂的程序,因为他的知识太宽泛。尽管如此,他却能正确的判断出怎么样的设计才是一个正确的解决方案。如果问题是处理一个钉子,他会找来一个熟练使用锤子的人;如果问题是处理一个巨石,他会叫来爆破部队,而不是让你徒劳的用锤子白费力气。

[英文原文:Good Programmers Make Bad Designers ]
分享这篇文章:

30 Responses to 好的程序员做不出好的软件设计

  1. oonogard says:

    深表赞同,一直都觉得写出一个高效精确的程序,跟设计出一个灵活易于扩展的软件,是挺不相关的两件事情。当然,加一点努力的话,两种能力还是可以相得益彰的。

  2. sjinny says:

    人们有时会喜欢强调自己特别的那一面的价值,但是把平庸作为一个优点来公开强调就有点幼稚了。现实中优秀的程序员往往也是优秀的设计师,否则他不会被认为是个优秀的程序员。文中那种只懂怎么用锤子的人最多算是优秀的coder,但是没有人会认为优秀的coder就是优秀的程序员吧。

  3. ^J^ says:

    同意观点,不同意结论。
    文章最大的问题就是假定优秀的程序员只精通一种编程语言。但是现实是这样的么?程序员不需要写过程式的存储过程么?程序员不需要写面向对象的Java/C#么?程序员不需要纠结于函数式的JavaScript么?
    所以结论是:如果一个程序员只精通一种语言,那么他很可能不能成为好的架构师;如果他精通多种语言,干嘛不让他试试看?

  4. ivyforgood says:

    我觉得原文的意思是,“好的程序员做出了坏设计”,而非当前的标题意思。估计也是标题党。

  5. reus says:

    这文想必能得到很多程序做不好,而又想做架构师,以便能使唤好程序员的人的赞同

  6. haitao says:

    合格的架构师,应该是好程序员(必要条件)

  7. Sweet says:

    说点题外话。
    这个还是要看自己看问题的高度和所处的位置,并且和自身的对技术,对知识的渴望程度有关。
    最重要的,对自己要有个定位。无论是上班的也好,学习的也好,一定要去主动的挑战未知的领域,喜欢学习的多学,不喜欢学习的强迫自己学。当然,家境好的可以无视。

  8. 陈山 says:

    老外的情况放在中国未必合适,据说,据说,据说:老外编程分工很细的,而中国程序员,哎···不说了···大家懂的····

  9. mudball says:

    顶reus。
    这句话最错误:“当然,他自己并不能写出复杂的程序,因为他的知识太宽泛。尽管如此,他却能正确的判断出怎么样的设计才是一个正确的解决方案。”
    不是每个好的程序员都能成为好的设计师,但好的设计师一定是或曾经是好的程序员。

  10. yjqing07 says:

    且不说作者的观点是否正确(正确性也是一个相对的概念),但从其能够悟出程序员和设计师各自本身的局限性,从而可以清醒认识到自己的薄弱点。

  11. univasity says:

    恩,确实。

    每种人都能找到其适合的位置,所以不要都以为专家都是大人物,他们的思维都被自己领域的学识所限定了… 呵呵。

  12. daxian says:

    作者的观点精确与否并不紧要,需要看到的是自己的局限性,想想自己是不是已经被常用的语言给圈起来了?需要了解和用更多的语言

  13. Roy says:

    我不是清楚其他程序员是怎么样的,但我明显可以看出,作者完全不了解程序员,他在文章里提到的程序员完全是那种刚出道1,2年的新手。当然也不排除有很多人工作很久了还是那样。如果你真的热爱你的工作,你不会只懂一点点的

  14. puck says:

    不认同作者的观点。这个结论太荒谬,太草率。

  15. jiazt says:

    你所在的公司90%以上的JAVA程序员,你什么都懂
    然后跟老大说:这个项目我们不用JAVA做
    老大:~~~ !

  16. jokey says:

    在中国找一个这样的软件架构师太难了

  17. followith says:

    个人觉得作者的结论有些偏激。我觉得一个人架构系统的能力和他是否是程序员,是否会使用多种编程语言并没有直接的致命的关联。要做好一个系统架构师,需要的技能是对需求的前瞻性,对目前流行的技术,框架的敏锐触觉,有一些不同行业的项目经历和背景的话则更优些。
    上述的这些技能,我不认为一个优秀的程序员身上就不具备,无法表示认同。

  18. athome says:

    标题应是“好的程序员不一定能带领部队创出好的软件设计”吧!

  19. dujing says:

    凡事不能一概而论,作者的观点未免有些偏激,事事应该因人而异、因地制宜。首先我就不太苟同作者对“好的程序员”的定义。精通一门语言,会写点东西的那是“码工”,不是“好的程序员”。至少我是程序员出身的,我主要精通C++,当然其他语言我多少也会用,我做过的许多软件设计和架构,都被用户们认可的,虽然我不敢自诩自己是好的构架师。不过同样,我相信皮尔*盖茨在做微软系统架构师和总设计师之前必然是一个“好的程序员”。大多数做不到并不代表统统做不到,也许事实反而是极少数做不到,也许作者本身就不是一个好的CTO,团队是要引导和教育的,不能因为某些人一时不行,我们就断定他一辈子都不行,人是会改变的。团队的力量是伟大的,为什么我们不能换一种方式继续工作?也许我们的构架师、设计师们是有点草包,也许我们程序员们是有点不给力,难道每一款好的设计一定出自于知名设计师之手么?难道你天生就什么都会?做事嘛,团队里应该少些抱怨,多些理解和配合,其实很多事情需要的是激情、方法和坚持。

    • dujing says:

      补充一点,任何时候最好的设计并不一定是做合适的设计。举个简单的例子,微软操作系统里有很多很好的设计,也许团队里的程序员都不擅长实现这种设计,反而有一个不是最好,大家都容易理解和实现,并且又能较好的解决问题的方案。正如我日常总和伙伴们说:软件够用就行,不一定非要最新版本吧?

  20. 李国铭  这篇文章, 并对这篇文章的反应是俺的神呀
  21. 拉着猪逛街 says:

    很显然,要成为这些所谓的架构师、设计师之前,很大一部分人是从程序员过来的,那么,问题来了,写这篇文章的用意是什么,不要让好的程序员去顶替一个设计师,那试问:如果都不要刚毕业的学生,那有工作经验的人哪来儿的呢?

发表评论

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

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