让我们来谈谈分工
昨天,我看到一个新闻——雅虎取消了QA团队,工程师必须自己负责代码质量,并使用持续集成代替QA。 同时,也听到网友说,“听微软做数据库运维的工程师介绍,他们也是把运维工程师和测试工程师取消了,由开发全部完成。每个人都是全栈工程师”。于是,我顺势引用了几年前写过一篇文章《我们需要专职的QA吗?》,并且又鼓吹了一下全栈。当然,一如既往的得到了一些的争议和嘲弄;-)。
有人认为取消QA基本上是公司没钱的象征,这个观点根本不值一驳,属于井底之蛙。有人认为,社会分工是大前提,并批评我说怎么不说把所有的事全干的,把我推向了另外一个极端。另外,你千万不要以为有了分工,QA的工作就保得住了。
就像《乔布斯传》中乔布斯质疑财务制度的时候说的,有时候,很多人都不问为什么,觉得存在的东西都是理所应当的东西。让我们失去了独立思考的机会。分工也是一样。
所以,为了说完整分工这个逻辑。请大家耐住性子,让我就先来谈谈“分工的优缺点”吧。
目录
分工的优点和缺点
首先,分工(Division of Labour)应该是由 Adam Smith 在1776年的《国富论》中提出来的,Adam在那时候就观察到分工对于手工业生产效率的提高。他将效率提高的原因归结于三点:
- 熟练程度的增加。当一个工人单纯地重复同一道工序时,其对这道工序的熟练程度会大幅增加。表现为产量和质量的提高。
- 如果没有分工,由一道工序转为另一道工序时会损失时间,而分工避免了这中间的损失。
- 由于对于工序的了解和熟练度的增加,更有效率的机械和工具被发明出来,从而提高了产量。
分工的确是提高生产力。我想到了福特公司一开始做出来的汽车几乎卖不出去,原因有两个,一个是成本太高,另外是生产太复杂,产能太低。于是福特公司开始把制造一辆汽车的工序分解开来,进行分工,分工给福特公司带来的好处是:
- 很多工作可以并行了,而且因为事情变得简单后,执行力也变强了
- 一个非常复杂和高深的汽车制造因为分工后,很多工作不需要很NB的人来干了,只需要一般劳动者经过简单的培训就可以干了。而且,越干越熟练,越干越专业,最终可能让合适的人合适的事。
- 分工后导致了很多重复劳动可以用技术来解决,于是福特公司出现生产流水线的技术(你是否还记得卓别林《摩登时代》里的工业生产流水线的场景,那取自福特公司)。
于是,福特公司的生产效率大大提高,最终实现了让每个美国家庭都能买得起汽车的理想,同时让美国成为了轮子上的国家。
不过,我们需要注意的是,在《国富论》中,Adam他同时也提到,分工如果过细,同样会带来问题——简单重复的劳动会让人变成一个不会思考的机器,从而越来越笨,进而变成平庸的无技能的人。自“分工”出现以后,争论就没有停止过。
Karl Max同样认为分工越来越细,会导致人的技术越来越差,同时,大量的重复劳动也会导致人对工作的失出热情,产生厌倦和抵触心理,最终会导致生产力的下降。
同时,还有一些经济学家也同样表明分工的一些缺点:
- 导致人只关注整个事情中的一小块,缺乏全局视角,导致视野受限,没有完全领会工作的意义和目标,从而导致各种返工。
- 对于组织而言,分工也会导致出现大量的沟通协同成本,并出现碎片的生产方式,以及组织的孤岛形式,并不利于提高生产力。
当然,奥地利经济学家Ludwig von Mises 并不这么认为,他认为,在分工所得到的好处面前,这些副作用不算什么。并且,他认为在资本主义的制度下,完全是可以平衡分工的各种优点和各种缺点,从而可以达到提高生产力和提高人员素质的双赢解的。
比如说,分工中的各种沟通问题是可以通过一个标准协议来解的,造灯泡的,造开关的,造灯座的完全不知道对方的存在,他们只所以可以让做出来的东西拼在一起,完全是通过了一种标准协议完成的。这也是为什么这个世界上有各种各样的标准化的组织。
还有很多经济学家对分工都有自己的见解和想法。不过基本上就是上面这些Pros和Cons了。下图是一个PPT的两个slids,可以点击看大图(来源)
全球化下的分工
分工带来问题在全球化的浪潮下变得尤为突出。其委婉地被讲成是比较优势(Comparative Advantage)
比较优势(又叫相对优势)是经济学的概念,解释了为何在拥有相对的机会成本的优势下生产,贸易对双方都有利。当一方(一个人,一间公司,或一国)进行一项生产时所付出的机会成本比另一方低,这一方面拥有了进行这项生产的比较优势。于是,一个国家倘若专门生产自己相对优势较大的产品,并通过国际贸易换取自己不具有相对优势的产品就能获得利益。
于是乎,分工本来想要的是——合适的人干合适的事,但是在比较优势的情况下,商业社会把分工变成了——不是选择合适的人、公司或国家,而是选择成本低的人、公司或国家。
经济合作与发展组织OECD最近(2015年6月28日)对全球化这样建议的——
“有效率的政策的本质不是阻止失业而是鼓励就业,如果各个国家都在收获全球化的利益而不是开放贸易的话,那么一些地方就会失去工作机会,当然也伴随着在另一些地方出现新的工作机会,这是全球化进程不可避免的,而我们面对的挑战是怎么能流畅调整我们的流程,能为那些新出现的工作机会找到合适的技能匹配的工人”。
通过上面的说明,我想你可以知道,为什么中国成为了世界劳动力大国,而为什么当初美国科技公司进入中国的时候,首先把测试的工作放到了中国。这就是所谓的全球化分工。同时我们也可以看到,像我们中国这样技术能力的确非常不足的国家,的确是可以通过分工这种形式,让我们这些技能一般的技术人员参与一个复杂的有技术含量的项目当中。这其中就是分工的光明面和阴暗面。
那么,我们想一想,随着中国的人力成本的越来越大,国际化的分工因为商业资本的因素,必然不会选择中国,只会选择人力成本更低的国家,比如印度、越南、甚至人力成本更低的国家。美国雅虎和Adobe不是离开中国了么?再看看中国因为人民币的汇率或是人力成本的上升,我们在早几年关了多少个Made in China的工厂,这就是全球化的分工,商业上来说,他不是找最合适的人,而是找成本最低的人。
所以,你千万不要以为我一提倡全栈了,你QA的工作就保不住了,就算没有全栈,就算是你还在坚持的社会化的分工,也可能让你的QA的工作就保不住了,除非,你能提供更低的价格。(想想这其中的逻辑吧,人家美国人把一些技术工作(比如测试)外包到中国的原因不是因为中国人聪明,想得周全,适合干这个测试这个事,而是因为中国人廉价,所以,当中国不在廉价了,自然就会找更廉价的地方了)
为什么国家要从Made in China转型?不就是因为中国早期拿到的国际化分工就是这些没有技术含量的支持性的分工么?也因此而造就了大量的技能很一般的工人。为了能在全球化分工中能拿到更有质量的工作,我们必然要从劳动密集型转向成知识密集型,必然要从支持性的工作转变为产出性的工作,必然需要单一技能型的技工转变为复合型的人才。
分工的温床和天敌
分工的温床主要有两个,
- 一个是成本和效率,资本家或企业主或一个国家为了追求更快成本更底的生产方式,他们必然会进行大规模的分工,伴随着分工,他们也会把一些知识或技术密集型的工作生生地变成劳动密集型的工作。然后层层外包。
- 一个是组织的大小,当一个组织的人数不断的变大,那么,你只能把工作和任务分得更细。这是被人数逼的,而不是实际需要的。这就是为什么我们可以看到很多大公司里要么人浮于事,要么瞎忙。
分工的天敌主要有一个——那就是技术!
每当新技术出现的时候,一些复杂的工序会被一台机器或是一种高超的技术所取代,不管是被技术自动化,还是被技术所简化,总之,以前本来需要数十人或是数百人才能干的事,突然之间只需要一个人就可以干完了。生产力得到了巨大的释放。所以,你这就是我们常听的——科技是第一生产力!
说到这里,让我们再来看看雅虎的那条新闻——
在软件开发流程中去掉QA团队会发生什么?更少的代码错误,更快的开发周期。这是雅虎工程师过去一年的实验结果。雅虎的Warp Drive计划将程序开发从批发布转移了持续交付模式,工程师的代码不经过QA团队的人工检查而是直接发布。开发模式的转变导致了处理问题理念的根本性改变,迫使工程师开发自动检查工具去识别原来由人工检查发现的错误。雅虎的技术团队现在全部是工程师,而不再有QA团队容身之处。雅虎的首席架构师 Amotz Maimon说,他们本来预计可能会发生严重问题,结果出乎意料,每个曾经对此抱有怀疑态度的人都说新做法很有效。
所以,当你面对一些难题的时候,比如线上的故障,或是一个复杂的软件生产活动,你是要加更多的流程更多的人呢,还是要用技术解决问题呢?一边是温床,一边是天敌,你想好了吗?
什么样分工才是好的
分工是必然的,因为很简单,你不可能一个人干完所有的事情,所以必需要分工,分工不是问题,而问题则变成了——什么样的分工是理想的,是优雅的,是有效率的?
对于分工来说,一般来是一种组织和管理形为。就目前来说,现代的公司有两种分工模式,分别是Control 和 Commitment 这两种分工。
- Control就是控制型的管理,它是一种是基于工作技能的分工,于是员工会被这种分工分配到一个比较窄的技能里去完成一个非常明确的工作。
- 而Commitment则是面向员工的责任心和所承担的目标来分工并完成工作的。相比起前者来说,这样的分工在完成工作时,需要的不仅仅是技能,还需要更多的责任感。
这么说吧,
- 对于基于工作技能的分工,你会看到,这样的公司会把技术人员按编程语言来分,比如:Java、PHP、C/C++,或是分成:Web端、iOS端、Android端、后端、算法、数据。或是分成:开发,测试,运维。
- 对于基于Commitment的分工,你会看到他们这样分的,软件工程师(不分前后端,不分语言,不分运维,测试),因为这样的公司认为,他招的不是只有特定语言技能的Coder,而是而学多种语言多种技术能保证软件质量以及能对软件维护的软件工程师。这种公司的软件工程师是各种团队都可以去的,而他们的分工更多的是按软件的功能,软件的模块,或是软件的产品线来分工。
基于技能的分工已是过去时,而基于 Commitment 的分工是更有效率的分工的未来。你可以参看McAlister-Kizzier, Donna. 的文献 “Division of Labor.” 。
小结
我说了这么多,不知道你看懂了我想表达什么没有?我不强加我的价值观,只希望你自己问自己几个问题:
1)作为工作的人,在分工中你会怎样选择?是成为一颗棋子,一颗螺丝钉,还是成为一个多面手?
2)作为工作的人,当你选择工作或任务的时候,你是选择做支持性的工作,还是做产出性的工作?你是选择做劳动密集型重复工作,还是做知识密集型的创新性的工作?
3)作为老板,你是想要什么样的员工?听话的只会加班和干重复工作的劳动力,还是有责任心的为企业和产品负责的员工?
4)作为老板,你是想通过分工释放低端员工的生产力,还是通过科技或技术去创造更NB的生产力?
5)作为老板,分工中的问题,你找到比较优的解了吗?比如,对于不同团队间的协议,你找到了吗?
可能,在不同的情况下你会有不同的答案。但是对我来说呢,无论是什么情况,我都只会有一个答案。
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《让我们来谈谈分工》的相关评论
说的真好。刚刚毕业参加工作,我就在思考很多类似的分工问题。为什么公司不招全栈工程师而是按编程语言招人。这样分工招聘公司的效率,对公司就是最优的吗?有些时候其实并不是。
有些事情并不是存在即合理,事物总是会随着时间发展而变化。矛盾的产生有些时候并不是事物的问题,而是人的思维并没有跟上变化,扯了后腿而已。
我也是刚毕业当码农不久,在公司里了经常和测试MM打交道~感受到很多测试的一些专业技能十分缺乏,而且测试的流程自己也可以搞定,有时候真是觉得没必要再走一遍测试流程,延长了上线时间~
人的精力是有限的,做完开发在去做测试是一种精力的浪费
软件开发,如果将其看作按图纸码砖盖楼,那么请分工提高效率;如果将其看做是绘画写书般的创作,那么请用能工巧匠那样的全栈人才。
@thumb
朋友,我们可以换个方式去看:开发实际是测试的逆过程,而测试是真正面向需求的,所以测试开发合在一起有助你更加专注需求并持续交付,是有助于减少不必要的精力并提升解决问题的能力的。
可能大部分朋友真正的问题在于很多老板把看砍掉QA理解成一种降低研发成本的方式,而没有真正像文中所说的那样去替员工替项目思考,一个懂得全局思考并拥有解决能力的工程师的价值是很大的,因为编程的结果是一个知识型产品。
作者说的很好,个人觉得很正确。不过目前国内大多数的公司应该还是基于第一种的分工。能做到第二种分工的人,我觉得肯定是有的,但是把这些人聚集在一切,管理上很大程度上是比较困难的。这些人有一些毛病:1.有傲气,不能颐指气使。2,只能说服,不能命令着做任何事。要做到第二种分工,对整个公司都有很高的要求,特别是管理层。
再说说测试:现在唯一需要人去测试的可能就是UI部分了。其他的程序完全可以通过自动化的手段去自动测试。和人打交道的代码人来测,和机器打交道的代码,机器测。
“我想到了福特公司一开始做出来的汽车几乎买不出去” 错别字 “卖”
分工是大势所趋,一个人时间和经历有限,不肯能包揽全部。
但是劳动力密集型和知识密集型不能简单一概而论。 劳动密集型,分工提高生产力; 中间的流程或者工序之间的协作可以 通过标准化来弥补。 但是对于知识密集型,可以那么容易的标准化吗。 可以问题复杂度不是那么像流水线那样容易控制的。 尤其对于软件,变化如此之快,更改如此之方便,传统的行业有哪个行业完全可以这么随意变化?
其次,知识密集型对于人的重要性远远大于劳动密集型。 这样对于人的管理就更加总要。
我的观点,知识密集型一定要有全局观,在有一个细分领域专攻。 尤其对于自己工作上的上流,下流有所了解。 知道什么是问题,问题的权值是多少? 这样变化,有革新,只是方法,工具,变了,学习可以过度过去的; 但是对于已有对于行业的全局认识,这些不会那么容易变化的。
说了那么多只是在偷换一些概念而已.
前面说的作为开发人员,保证自己的代码质量,自己完成测试啥的这都是开发人员的工作,无可厚非,说道分工开始就开始偷换概念了.
如果一个php开发人员认为php的开发是自己的事,而涉及到php与java的交互就不是自己工作内的事儿不能完成的话,那这个是个人能力的问题而不是分工问题.所以所谓Control 和 Commitment 这两种分工,只是不同技术间的沟通问题,而不是分工问题,更谈不上谁好谁坏.
所以不存在全栈工程师这个职位,应为就算一个大牛他精通所有的技术语言也好,也并不意味着他应该去做所有的事情.而如何确定他的职能范围界限,这个才是分工问题.
所以文章最后所问的几个问题和所谓的全栈工程师这个职位,只不过是公司或者企业想要一个有着10个员工能力,但却只用发3个员工工资的员工而已.
最后,有的公司取消了一些团队可能是因为要调整生产方式提高生产效率,有的公司就是因为没钱
没错
分工是这个人类社会发展的必要,人类的进步本来就是让人类本身变得更懒,你也提到,分工是为了提交效率和产出。在开发项目中,测试不仅为了白盒测试,更多的也为了黑盒。可以说你的理论比较理想化。
作者说的很好,个人觉得很正确。
@haa
哈哈
文章中说的道理大抵我都觉得方向没错,但现实并不是那么理想的简单。
我也写了篇文回应一下 ,表达一下我的观点。
@石樱灯笼
现实当然不会简单,可这并不仅仅是耗子一个人的理想,有大量的实证,不用说亚马逊了,facebook没有测试部门,google没有测试部门而有一个Engineering Productivity部门,十年前作为软件业学习对象并曾提出系统:开发:测试人数比例1:3:3的微软现在也在取消专职qa。 有专门测试部门的比这几家的产品质量强么?
从产品角度,测试其实也是个很有意思,有技术挑战的事情,一个团队依赖只做测试的qa,他不了解用户需求场景,不了解技术方案的技术关键点,即便懂得浸泡测试这些术语,也是难以挖掘出深层次的问题的。这样团队交付的东西是不可信的。
从个人角度,一个不懂得jvm的内存机制,搞不清各种gc策略的差异的qa,是难以测出gc的问题的;而懂得各种gc策略,能熟练地分析gc日志并发现代码中问题的人,又何止只能做qa?dev、运维,什么你不能做?
@i六神
你看你提的几个例子,亚马逊,fb,google,国内能跟这几家比肩的也就只有三流氓了,你再看看三流氓的德行,差距不是一年两年啊。我2年前也觉得专职QA应该取消(当时我就是在做QA),但是事实上现在的前提是开发自己就保证不了质量,加个测试的主要目的就是分摊吃屎,毕竟开发的排量太大,自己吃不净。
想要讨论能否取消QA,首先就得先把coding的质量保证了才行。我自己的文章里也是这个观点。
@石樱灯笼
怎么没有人提到Apple, 他们公司是怎样做的呢? 我很好奇。
@pyskell
外企我不了解,我能接触到的也都只有国内这些国企民企创业团队的人,外企的和合资的我接触不到。
我所了解的,苹果也不是以技术为核心的公司,而是以产品为中心,不过这就跟分工啥的没啥太大关系了。
为什么我看这个文章会显得很平静,是已经超脱了吗。。。
下周要去面一家美国半导体公司的QA。。看了很蛋疼
任何事物的进化和发展是必然的,就像您所说的基于工作技能的分工慢慢偏向基于Commitment的分工,我们团队的分工模型就是您所说的Commitment模式。这种分工的形成我们没有依靠任何理论或依据,我们只有一个宗旨:多维度思考,但不仅局限于IT领域。
那你怎么不让我总一个人把公司所有活儿都干了,要员工干啥?!全站老总,全站经理,全站领导不是更好?!
这是典型的滑坡谬误。
感觉一些无脑性的QA工作肯定要被去除的, 这块还不如在开发中直接保证的, 投入产出比显然不高的.
如果你觉得QA不必要,那是因为你的QA不够好。
如果你觉得QA没有创造性,那是因为你不让QA参与研发。
如果你觉得研发自己也可以做QA,那是因为你有充足的时间和金钱支付给研发做兼职。
你可以裁掉专职QA,但是只能换成兼职QA。所以并不是要不要QA的问题,只是成本的权衡。就像小公司里没有专职运维,而是让程序员去兼任。
我们公司现在是3天做需求1天出计划1个月开放3个月测试,你懂得
我们公司现在是3天做需求1天出计划1个月开发3个月测试,你懂得
@skyler_tao
现在的测试都是指测试开发工程师了,自己写的代码,自己肯定测不出问题来。
陈老师终于又更新了,盼很久了
对于皓哥,对于一个合格的软件工程师来说,应该是不断更新自我,不断学习新技能/新语言/新技术的,这点和Commitment 的分工方式有着异曲同工之妙啊~
存在即合理,并不是绝对。雅虎的做法,并不符合中国大多数公司的中国国情。这种做法是比较激进的。
皓哥在《我们需要专职的QA吗?》这边文章里面,遇到的QA是不懂编程技术的,我道听途说到:真正合格的QA应该是编程很厉害的人退下来去做QA的,我表示赞同。就好像法官应该是经验丰富的律师去担任的。
QA的存在,就好像是监管部门的存在。
也持续看过你的博客好一段,也在知乎、微博上面看过很多相关你的讨论,终归这个是个很讲结果,甚至很功利的行当,也许哥们更适合国外一些,国内这个大环境一时半会也很难做出很好的大的改变。总不能一直是这么有志难伸的状态。
我觉得最后小结的问题有明显的导向。
看到浩哥最近GITHUB名媛聚会撸串的照片,容我大不敬说一下,浩哥都能当其他几位的大叔了,银丝满头,和真实年龄差距好大哦,不得不说IT行业就是把杀猪刀啊~~~
我们公司的也取消了,改成了TDD/BDD,所以都是开发者们自己测试。
任何一个问题也不是单独的问题,会牵扯到很多其他的东西。
但从工作角度讲,任何能够提高生产率的方式都是值得提倡的,任何现存制度都是值得挑战的。
但是涉及到人,人不光是一个社会的人,也是一个“自己”的人,家庭的人,然后“人”的个数和精力是有限的。如果工作中你是多面手,自然而然你会承担更多的责任和能力输出,这样家庭和自己必然会没有精力顾及。
私以为,任何资本主义的形式本质还是榨取个人劳动力的极限,为了资本巨大化。但这牺牲的是千千万万个“小我”,然后“大我”并不是为我,而是为了资本寡头。
所以这东西没有对错,你接受得了小螺丝钉,你就需要饱受小螺丝钉的平庸,也会享受到小螺丝钉之外的快乐。能量永远是守恒的,顾此必然失彼。
相对来说,分工确实很重要的
@skyler_tao
个人认为你有这种想法跟测试人员的水平有很大的关系,专业的测试团队还是非常重要的,尤其是对软件或系统的安全性进行测试时需要非常专业的测试团队(在网络安全行业,我们称之为渗透测试),如果安全问题或者bug被外人发现并利用了会给公司带来很大的损失,尤其是金钱损失。
然后所谓的全栈工程师常常是全跪工程师。
赞同 国富论分工的目的在于提高效率 但是同时提到 过分的分工的弊端 取消QA一方面是减少了QA人员这块的成本 更重要的是一次逆向的尝试 因为分工过度与否这个标尺的衡量 每个人 每个公司都有不同
大公司可以没有QA,因为人家是大都是知识密集型。小公司总是离不开QA,因为小公司大都是劳动密集型。对于一个小公司而言,临时组建的团队往往人员质量不高,没有那个能力做全栈工程师,而且你猜怎么着,他们也没有那个意愿去做全栈工程师。有这样能力的优秀人才,自然会去大公司。有这样意愿的优秀人才,经过努力,也决对不会留在原地吃屎。小公司想要集合这样一批有能力有热情的人才,我没见到过。
说得好,那么取消QA后原来QA的工资能加给我么。
@tryao
哈哈~ 你想多了。。。
全栈是一个过程
发现个错别字:”对于分工来说,一般来是一种组织和管理形为”,应是管理行为?
hahaha,确实想多了