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

导读:本文译自 Good Programmers Make Bad Designers,译文经由外刊 IT 评论 《好的程序员做不出好的软件设计》 发布。

不能仅仅因为某位程序员表现优异,就将其推上系统分析师、软件设计师或软件架构师的位置。

当团队或公司需要寻找一位能胜任软件架构师或设计师等重要职位的人选时,脑海中浮现的第一个想法通常是在程序员中挑选最优秀的一位。请避免这样做。 这类职位并非随意找一位不错的程序员就能胜任,即便将最资深的程序员晋升至此,也未必合适。

乍一听这似乎有些荒诞:为什么不能让程序员去做系统设计呢?毕竟,他们本就是设计程序的,不是吗?的确如此。但你需要明白的是,设计软件与编写程序需要的是两套完全不同的技能

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

为了解决重大、复杂的编程问题,程序员需要在特定的编程语言上积累数年的经验。也就是说,为了熟练使用某种语言并熟悉其各种特性,他必须专注于该语言。问题恰恰就出在这里。

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

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

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

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

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

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

语言是我们用来与人、与计算机交流的功能性工具,它明显地影响着我们的思考方式。我们对语言了解得越丰富、越多,越能帮助我们提高解决问题的能力。

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

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

如果我们不用这些优秀的程序员,谁又能担当软件设计的任务呢?当然不会是那些完全不懂编程的人。我们需要的是一种通才

一个优秀的软件设计者必须通晓过程式、面向对象式、函数式以及逻辑式编程语言——还包括各种优秀的软件开发方法论。他不能只熟悉一种方法模式,像一个专业领域人员那样。当然,他自己可能并不能写出最复杂的程序代码,因为他的知识太宽泛。尽管如此,他却能正确判断出什么样的设计才是一个正确的解决方案。

如果问题是处理一个钉子,他会找来一个熟练使用锤子的人;如果问题是处理一块巨石,他会叫来爆破部队,而不是让你徒劳地用锤子白费力气。


文章来源外刊 IT 评论
英文原文caffeinatedcoder

说明:本文观点基于经典软件工程理念,文中引用的外部链接(如 NYT 文章)发布于 2010 年左右,但关于“程序员技能专精”与“架构师视野广度”的讨论至今仍具有参考价值。