最近有两个趋势我真的很讨厌:DevOps及“全栈”开发者的概念。随着DevOps运动越来越受欢迎我越发讨厌x86架构和单内核。但确实如此:我受不了。是什么引发我的痛苦呢?这是原因:不是每一个公司都刚起步,那怎么还要每个公司都必须表现得像它们的经历一样。
DevOps
“DevOps”用来表示密切地协作,将之前纯粹的开发者、纯粹的操作者以及纯粹的QA的角色内容进行穿插。因为软件需要以不断加快的速度释放出来,老的开发-测试-发布的“瀑布”型周期被打破了。开发者还必须为测试及发布环境的质量责任。
“开发者”(这个词是否适当有待商榷)越来越广的责任范围导致了对联合体求职者的需求:“全栈”开发者。这样的开发者能够做开发工作,是QA团队的成员,能够进行业务分析,做系统管理员和DBA。在你指责我夸张前回头再看下这个列表。列表中有你不希望“全栈”开发者精通的吗?
这些概念是从哪来的呢?初创公司,对(以及敏捷方法)。初创公司初起时奇形怪状,需要以一种艰苦的方式撑过最初的几年。对此我不否认。但不幸的是,初创公司的工程师承担了多种技术角色,被迫在缺乏一系列最基本能力的情况下承担“开发者”的角色。
身兼多职
想象你在一家初创公司,开发团队共有7人。你已经开发了一年某个web应用,现在看起来像模像样,一切顺利,但是在保持正常运转这方面却往往是令人抓狂的混乱。如果有一个特别麻烦的问题,需要深度研究数据库,你可没有权力说“这不是我的专长”,然后交给 DBA 团队处理。条件所限,你不得不承担起 DBA 的工作,自己解决这个问题。
现在把这个情景扩展到之前列出的所有职位吧。一个初创公司的开发者可能同时担任开发,QA,部署/操作分析员,系统管理员,还有 DBA 。初创公司天然如此,而有些人会特别适合这种环境。然而,不知从什么时候起,我们开始自欺欺人说自己适合;因为在任何时候,一个初创公司的开发者不得不身兼多职,他/她还必须一下子担任所有这些角色。
即使居然真有这样的人,这些“全栈”开发者仍然不能以他们适应的方式工作。初创公司并不是让他们在一段时间内担任某一个角色,然后再转换到下一个角色,而是要求他们一直同时担任所有这些角色。最糟的是:大部分好的开发者还几乎可以应付。
阶级
好的开发者都是聪明人。我知道我这么说肯定会被拍,但一个组织里的技术人员还是有一个重要程度的层次区别的。最顶层是开发,接下来是系统管理员和 DBA。QA 团队,“操作员”之类,发布管理员等等角色处于阶级的最底层。为什么是这么个顺序呢?
因为每个角色有能力做比它低的层次的所有工作。
初创公司教会我们这个道理。如果需要,好的开发者也能当合格的 DBA。他们也能当不错的测试,“部署工程师”,或者其他什么形形色色的职位。他们的工作需要他们对更低层工作的领域也了如指掌。但这其中有一个问题,希望说到这里你也能看出来:
反过来却行不通。
QA 无法凑合当开发用,构建(build)工程师也做不了 DBA 的工作。他们不具备担任这些角色所必须的专业知识。这也没关系。无论你喜欢与否,每个组织里都有这种阶级层次,而成员的能力层次、技术水平也有所不同。尽管如此,你让开发去做其他工作,没有人能来替他做开发的工作!
举个例子能说得更清楚一些。我爸爸是一个开私人诊所的牙医。他雇了一个秘书,一个保健专家和一个牙医助理。在所谓的“牙医Ops”环境下,我爸爸需要一边记录病人的预约,一边洗牙,同时还要挤出时间来给牙钻孔,实施根管治疗术,等等。我爸爸能做得了诊所里的其他工作,因为他具备这些工作所需的专业知识。
但是其他人做不了他的工作,即使全加起来也不行。
如果诊所要这么运转,牵涉到的所有人都会受到损害,(当然)除了雇员们。这场本意是希望提高软件质量的实验演变成了一场闹剧,最有才华的员工疲惫不堪(并且有价值的工作产出远远减少),而低层次的职位根本不存在。
这就是这个问题的关键所在。之前那些职位由不同能力层次的人分别担任,而“全栈”工程师使得这些职位没必要存在了。大公司非常喜欢这一点,因为这意味着它们可以远远减少雇佣人数,来完成同样的工作量。然而,在这个过程中,真正的开发在开发者工作所占的比例越来越小。这就是为什么我们会看到这么多的开发者通过不了 FizzBuzz:他们从来不用真正写任何代码。现在这个问题已经太普遍了,你能想象面试厨师时要问他,每天他有多少时间是真正用来烹饪的吗?
什么都做过一点,什么都不精通
如果你是一个有点规模的软件的开发者,你会需要一个能用的部署系统。考考你,马上说出以下系统各自的好处和坏处:Puppet,Chef,Salt,Ansible,Vagrant,Docker。现在实现你的部署解决方案吧!你恐怕都没有注意到,上面列出那些系统里有一项是完全无关的吧?
专业化是有原因的:人类能运用的知识有限。在任务之间切换,无疑是代价昂贵的。强迫开发者去承担其他专业人员的角色,意味着他们将:
-
没有把时间花在开发上
-
需要跟上一个极其庞大的知识领域
-
会不堪重负
不仅如此,要强迫开发者接受“全栈”的任务,公司要付给雇员的工资远高于完成其中大部分任务的市场平均价格。如果一个开发者1年赚100K,你可以雇4个1年100k的开发者来做一个两人的任务,50%的时间做开发,50%的时间做发布管理;或者,你也可以只雇一个发布管理员,花上大概75k,然后两个开发者全职开发。更不用说兼职发布管理的开发者,在没有发布需要管理时浪费的时间了。
不要扼杀开发人员
这样做全部的效果就是毁掉“开发者”的作用,并且替之以“技术工种”。我所知的每个开发人员都沉迷于编程,因为它们真正热爱它(在某点上)。当你强行让这些聪明人执行额外的任务时,你则伤害了每个相关的人。
并非每个公司都是初创公司。出于选择,初创公司没有让开发人员参与多种职能,他们这样做是因为必要。你的公司很可能在你没有创造出一些资源之前有着极大的制约。请不要混淆“精简”与“以最少雇员运营”的区别。看在上帝的面上,让开发人员写代码吧!
英文原文:How 'DevOps' is Killing the Developer
译文链接:http://www.oschina.net/translate/how-devops-is-killing-the-developer