本文由“外刊IT评论”网(http://www.aqee.net/)荣誉出品html
你不能看到一个程序员还不错,就把他推到系统分析师、软件设计师或软件架构师的位置上。程序员
若是你在团队或公司里寻找一个能胜任软件架构师或设计师这样重要位置的人时,首先出如今脑子里的想法一般是在程序员中选一个最好的。别这么干。这样的位置不是随意的找个不错的程序员就能胜任的。把你最资深的程序员晋升到这个位置也未必就合适。编程
乍一听你可能感受荒诞。为何我不能让一个程序员去作系统设计呢?毕竟,他们是设计程序的,不是吗?的确是的,没错。但你要明白的事情是,设计软件相对于编写程序,它须要的是一套彻底不一样的技能。架构
让咱们来看看为何一个好的程序员就未必能够作一个好的软件设计师。但首先,让咱们来问问本身一个问题,是什么让一个程序员变的优秀,甚至杰出?要想成为一个好的程序员,你须要有能力实现真实世界里重要的软件。只可以写出一个简单的文本编辑器是远远不够的。编程语言
为了能作到能够解决重大的、复杂的编程问题,一个程序员须要在某个特色的编程语言上进行数年的经验积累。也就是说,为了能熟练的使用这种语言、熟悉这种语言的各类特点,他必须专一于这种语言。问题就在这儿。编辑器
若是你专一于一种语言,并能作到精通掌握,那你遇到的问题模式极可能就限制于跟这种语言相关的领域。简言之,若是你懂PHP,那全部的问题都基本上是跟 Web开发相关。相同的道理,若是你所有的知识都集中的Java上,那你对全部问题的解决思路都会沿着面向对象的方向,即便是使用过程式编程对于解决你的问题会更优的状况下,你也会如此。函数
一个程序员,只懂得1、两种编程语言,这会严重的限制他的解决问题的能力。例如,若是你的编程语言是C语言,对于手头出现的问题,你绝对不可能想出一种面向对象的解决思路,由于你的编程语言不提供这样的语言特征。跟Haskell程序员不同,C++程序员不可能想出函数式解决方案。你的编程语言里提供告终构体和枚举类型与否,会严重的影响你剖析一个问题的方式。若是你使用的语言的能力很弱,或你只知道少数几种语言,你解决问题的能力相应的会被削弱。测试
有人说,咱们的语言塑造了咱们的思考和认知这个世界的方式。我基本上认同这个观点。当一我的的母语里的名词都有性别之分时,他必定不会同说其它种母语的人那样一提起“警察”这个词就基本上认为是男的。当一我的的母语里对蓝色和绿色不区分时,他对世界的感知会和那些有区分的人的感知大不同。ui
若是咱们回首中世纪学校的三学科,它们被描述为:语法解决概念和对象如何在书写和话语中被表现,用逻辑对它们进行分析,最终以修辞为目的同他人交流。对于咱们来讲,编程语言也有语法。若是咱们的编程语言不够强,咱们对事物和概念的认识以及对如何表达它们都不会有完整的视野。spa
语言,咱们用来跟人们、跟计算机交流的功能,明显的影响着咱们的思考方式。咱们对语言知道的越丰富、越多,越能帮助咱们提升解决问题的能力。
那么,一个在某一两种编程语言里具备专长的程序员,在当他解决一个问题时,会存在必定的局限。他会局限于他使用的语言容许他作的事。所以,他不会成为一个好的软件设计师或分析师。
若是咱们不用这些优秀的程序员,谁又能担当软件设计的任务呢?固然不会是那些彻底不懂编程的人了。咱们须要的是一种通才。一个优秀的软件设计者必须通晓过程式,面向对象式,函数式,以及逻辑式编程语言—还包括各类优秀的软件开发方法论。他不能只熟悉一种方法模式、像一个专业领域人员那样。固然,他本身并不能写出复杂的程序,由于他的知识太宽泛。尽管如此,他却能正确的判断出怎么样的设计才是一个正确的解决方案。若是问题是处理一个钉子,他会找来一个熟练使用锤子的人;若是问题是处理一个巨石,他会叫来爆破部队,而不是让你徒劳的用锤子白费力气。
联想到一本书里面提到(子柳写的《淘宝技术这10年》),我把大体意思概括以下:
在系统的发展过程当中,架构师的眼光很是重要,做为程序员,只要把功能实现便可,但做为架构师,要考虑系统的扩展性,重用性,对于这种敏锐的感受,有人说是一种"代码洁癖"。淘宝早期几个架构师具有了这种感受。虽然个别架构师具有了"代码洁癖",但淘宝前台系统的业务量和代码量仍是呈现爆炸式的增加,业务方老是在后面催,开发人员不够就继续招人,招来的人根本看不懂原来的业务,只有摸索着在"合适的地方"加一些"合适的代码",看看运行起来像那么回过后,就发布上线。这样恶性的循环中,系统愈来愈臃肿,业务的耦合性愈来愈高。开发的效率愈来愈低。借用当时流行的一句话"你写一段代码,编译一下能经过,半个小时就过去了;编译一下没经过,半天就过去了。“在这种状况下,系统出错的几率也逐步增加,经常你是修改了商品相关的某些代码,发现交易出现问题了,甚至你改了论坛的某些代码,旺旺又出问题了。这让开发人员苦不堪言,而业务方还认为这些开发人员办事不力。因为当时从硅谷空降了一位技术高管,他告诉咱们一切要以系统稳定运行为中心,全部影响系统稳定的因素要解决掉。每作一个平常修改,必须对整个系统作回归测试一遍。多个平常修改若是放在一个版本中,只要一个功能没有测试经过,整个系统都不能发布。咱们把这叫作火车模型:任何一个乘客没有上车都不能发车。这样作的后果是,新功能上线速度慢了,因此当时明显感受到业务方的不满。压力很大。因为把天天晚上都须要作一次整个系统的回归测试,在这种要求下,整个系统很庞大,咱们不得不对这个超级复杂的系统开始肢解和重构。好比把用户信息模块拆分出来,叫作uic,它只处理最基础的用户信息操做:getUserById,getUserByName等。系统进行拆解后,相互之间互补影响,不会由于一个用户中心程序出错,交易没法使用。新作的淘宝旅行,淘宝彩票,只是在交易流程数据需求上不一样。可是用户信息是跟淘宝主站相似的,若是当时可以作系统拆解,就不用从新作一遍,调用uic中的信息便可(如今的淘宝旅行,淘宝机票是分开展现的就是这个缘由,当时为了避免给淘宝主站添乱,单独从新写了两套系统用于旅行和机票)