你不能看到一个程序员还不错,就把他推到系统分析师、软件设计师或软件架构师的位置上。
若是你在团队或公司里寻找一个能胜任软件架构师或设计师这样重要位置的人时,首先出如今脑子里的想法一般是在程序员中选一个最好的。别这么干。这样的位置不是随意的找个不错的程序员就能胜任的。把你最资深的程序员晋升到这个位置也未必就合适。
乍一听你可能感受荒诞。为何我不能让一个程序员去作系统设计呢?毕竟,他们是设计程序的,不是吗?的确是的,没错。但你要明白的事情是,设计软件相对于编写程序,它须要的是一套彻底不一样的技能。
让咱们来看看为何一个好的程序员就未必能够作一个好的软件设计师。但首先,让咱们来问问本身一个问题,是什么让一个程序员变的优秀,甚至杰出?要想成为一个好的程序员,你须要有能力实现真实世界里重要的软件。只可以写出一个简单的文本编辑器是远远不够的。
为了能作到能够解决重大的、复杂的编程问题,一个程序员须要在某个特色的编程语言上进行数年的经验积累。也就是说,为了能熟练的使用这种语言、熟悉这种语言的各类特点,他必须专一于这种语言。问题就在这儿。
对于只有锤子的人,他能解决的问题就是钉钉子
若是你专一于一种语言,并能作到精通掌握,那你遇到的问题模式极可能就限制于跟这种语言相关的领域。简言之,若是你懂PHP,那全部的问题都基本上是跟Web开发相关。相同的道理,若是你所有的知识都集中的Java上,那你对全部问题的解决思路都会沿着面向对象的方向,即便是使用过程式编程对于解决你的问题会更优的状况下,你也会如此。
(注:有句谚语:若是你唯一的工具是一把锤子,你每每会把一切问题当作钉子。参见:《每位开发人员都应铭记的10句编程谚语》)
一个程序员,只懂得1、两种编程语言,这会严重的限制他的解决问题的能力。例如,若是你的编程语言是C语言,对于手头出现的问题,你绝对不可能想出一种面向对象的解决思路,由于你的编程语言不提供这样的语言特征。跟Haskell程序员不同,C++程序员不可能想出函数式解决方案。你的编程语言里提供告终构体和枚举类型与否,会严重的影响你剖析一个问题的方式。若是你使用的语言的能力很弱,或你只知道少数几种语言,你解决问题的能力相应的会被削弱。(编注:推荐阅读《学习不一样编程语言的重要性》)
语言塑造了咱们的思惟方式
有人说,咱们的语言塑造了咱们的思考和认知这个世界的方式。我基本上认同这个观点。当一我的的母语里的名词都有性别之分时,他必定不会同说其它种母语的人那样一提起“警察”这个词就基本上认为是男的。当一我的的母语里对蓝色和绿色不区分时,他对世界的感知会和那些有区分的人的感知大不同。
若是咱们回首中世纪学校的三学科,它们被描述为:语法解决概念和对象如何在书写和话语中被表现,用逻辑对它们进行分析,最终以修辞为目的同他人交流。对于咱们来讲,编程语言也有语法。若是咱们的编程语言不够强,咱们对事物和概念的认识以及对如何表达它们都不会有完整的视野。
语言,咱们用来跟人们、跟计算机交流的功能,明显的影响着咱们的思考方式。咱们对语言知道的越丰富、越多,越能帮助咱们提升解决问题的能力。
那么,什么样的人更合适?
那么,一个在某一两种编程语言里具备专长的程序员,在当他解决一个问题时,会存在必定的局限。他会局限于他使用的语言容许他作的事。所以,他不会成为一个好的软件设计师或分析师。
若是咱们不用这些优秀的程序员,谁又能担当软件设计的任务呢?固然不会是那些彻底不懂编程的人了。咱们须要的是一种通才。一个优秀的软件设计者必须通晓过程式,面向对象式,函数式,以及逻辑式编程语言—还包括各类优秀的软件开发方法论。他不能只熟悉一种方法模式、像一个专业领域人员那样。固然,他本身并不能写出复杂的程序,由于他的知识太宽泛。尽管如此,他却能正确的判断出怎么样的设计才是一个正确的解决方案。若是问题是处理一个钉子,他会找来一个熟练使用锤子的人;若是问题是处理一个巨石,他会叫来爆破部队,而不是让你徒劳的用锤子白费力气。程序员