常红平,IT职场老兵,在做过除用户体验设计师外的所有软件研发团队中的角色后,于10年前开始专注于管理。爱技术、爱敏捷、爱读书、爱分享。现在IBM CIO中国实验室作为IBM全球软件和云服务销售系统负责人,领导IBM年交易量数百亿美金的核心系统的研发和运维工作。近年来,他还带领跨国团队成功实施了一系列敏捷转型、技术革新、和组织文化转型。
随着数字化时代全面到来,组织的敏捷转型已经成为必然。
2017年中国开发者调查报告显示,在彼时已有45.6%的开发者声称采用了敏捷开发模式。但如果详细了解这些开发团队,事实上很多还是在用新瓶装旧酒,甚至只是把原有的流程换个新名词而已。
时至今日,国内除一些互联网大厂和顶尖外企能够做到极致的敏捷外,大量的传统研发组织还处在敏捷转型的进程中,而小型初创公司也仍需要将原来粗放的研发管理转向精细化、规模化。
比如最近好几个业界同行在咨询我敏捷转型应该怎么组建团队:
我团队的项目需求特别动态,人又分布在不同部门。可不可以每当有项目来的时候我跨部门抓合适的人组成临时项目组?
我们公司有一些老旧系统,还有一些创新项目。我应该把新老项目的人都放在一个团队,还是分开?
我们公司跟国外团队一起做项目。我们共享一套代码库,经常一有冲突就要跟老外开会熬半宿或者等一天,怎么破?
仅关于敏捷组织架构的问题就包罗万象,所以我想还是有必要把这个话题详细聊聊。毕竟一个合适的敏捷组织架构是组织敏捷转型成功的最基本条件之一。
会者不难,在一个高效敏捷组织中司空见惯的事情,放到非敏捷组织中会被认为不可思议。今天就先聊聊一个极致的敏捷组织或者敏捷转型成功后一个组织大概会长成什么样子。
当然敏捷的组织架构只是敏捷实施成功的因素之一。但因篇幅有限,本文暂不涉及敏捷流程、实践、文化等部分。
简单起见,我们从小往大讲。假设你现在加入了一家初创公司,全权负责公司的IT部分。你拥有了一个响亮的头衔叫做研发总监,但手下其实也就有十来个人,你要怎么组建团队呢?
一、初创研发团队
你最先想到的一定是全功能,也就是团队中要具备各种必需的角色:业务分析、开发、测试、运维,等等。无论大小,一个非全功能团队基本无法做到端到端的从需求分析到系统上线到运维的工作。
再有就是角色之间要比例协调。全栈工程师当然好,但是在你的小初创公司里养不起样样精通的牛人,全栈只是因为缺钱不得已而为之的选择。那只好让大家尽量一专多能,每个人有专长,必要时能互相帮个忙。
此时你还没有必要拆分团队。团队从上到下、从业务到技术都是你一把抓。你只好工作996,还勉强能应付。
二、小型研发团队
公司业务发展还不错,你的团队要扩张了。这对你来说是个hAppy problem,你一个人肯定管不过来了,必须要有人帮你。于是你把一个你一手培养起来的得力干将提拔起来做一线经理。但因为研发团队就你们两个经理,于是你俩决定各分管一摊儿,但你总体负责就好。
既然是各分管一摊儿,两个部门最好都能独立运行,之间的交互除了必须的系统集成等必要的沟通外,互相依赖越少越好。所以你们决定在每个部门都复制全功能团队的做法。
但怎么把原来一个大团队拆成两个小部门呢?你俩决定还是按功能模块拆。这样两个部门之间的耦合最小。什么?一个部门开发,一个部门测试?马上2020年了,难道你们还在用瀑布式开发吗?对不起,如果是的话,这个故事我根本编不下去了,你的小公司根本活不到A轮好吗?
部门拆分造成了一段时间的混乱。职责不清、互相指责、踢皮球的事时有发生。原来的单体软件架构之前本来运行得好好的,因为模块间的严重依赖关系更加剧了职责划分的难度。几次严重的发布失败和系统宕机后,你俩一边改进软件架构,一边梳理研发流程,终于在部门职责划分上达成下面几个共识:
1、面向资产:资产可以是模块、应用程序、服务、平台等等。每个部门所负责的资产范围都要清晰,避免扯皮。如果不面向资产而是面向跨资产的业务功能、特殊技能等等划分团队,会造成大量跨部门的沟通。比如当两个部门在基于同一个模块开发时,会有大量代码耦合甚至冲突的问题。这时必须要在技术层面进行模块拆分和解耦。而当一个部门基于多个资产开发时,因为要学的东西太多,新人很难培养起来,所以当出现问题或者研发进度受阻时,团队成员之间无法互相支持。
2、端到端负责:首先是需求分析、开发、测试、部署的端到端,自己部门的事情自己从头到尾负责,尽量不求助于其他部门。其次是开发和维护的端到端。谁开发的功能,谁就应该维护。谁出的bug谁负责。这样保证各部门内沟通更加内聚,也跟其他部门降低耦合。
3、稳定的:各部门成员应该是相对稳定的,不经常被调动,以保证团队不总是跟新成员磨合。部门中每增加或减少一个人,团队都要经历一整轮的组建期、激荡期、规范期、和执行期(Forming, storming, norming and performing),这对团队的发布速率是有很大负面影响的。当然出于团队成员职业发展的需要,应该给团队成员定期轮岗的机会。但这种轮岗不应过于频繁。
4、专注的:各个部门应该有清晰的工作范围,并专注在这个范围内工作,而不是总要求去做很多团队职责范围之外的“杂事“,即使它很重要很紧急。这样既能保证团队的工作效率,又能培养团队在某项或某类任务上的专长。你们捋了一下团队经常抱怨的“杂事”后,发现其实很多事情在更高层面看也很重要,所以你们决定把这些事情划分到相关部门的正式工作范围内,并尽量在项目计划阶段考虑进去。
这样的共识达成之后,部门间合作顺畅了不少。
但随着公司的发展,每个部门的人也越来越多,你又觉得有些管不过来了。有了上次拆分的成功经验,你们决定尝试把这个做法也应用到部门内部——把部门内成员再划分成几个小团队。毕竟长期996之后你身体也开始有些吃不消,你希望团队有些事自己能自组织地做起来,而不是都依靠经理。
经过一番调整尝试,你梳理了部门内各个小团队的文化和规模,最后又得出几个关于小团队的最佳实践:
1、小的:你发现5到9个人的小团队规模是比较合适的,因为小团队成员之间的沟通基本靠喊。虽然面对面沟通效率很高,但因为这是所有人对所有人的广播式、全渠道沟通,当团队变大时,沟通成本会呈指数级提高,造成效率急剧降低。而当团队太小时,保证全功能又比较困难。当然在某些特殊情况下,把团队控制在5-9个人可能有实际困难,但是4-12人是底线了,再多再少都不好了。
2、每个队员为整体团队负责:这个团队文化你在团队扩张之前就一直在强调了。大家都是兄弟,出了事自然应该一起扛。但是在团队扩张之后不知为何这个文化就慢慢没有了,是因为新人太多冲淡了原来的文化?后来你才知道并不是。你悟出了组织架构是组织文化的基础。扩张每个团队那么大,职责不清楚,即使大家想为整体团队负责,也有心无力。当团队变小、份内的职责变清晰后,大家才更容易做所谓份外的事情,整体团队才更容易实现。
这样在部门内拆分出小团队后,即便每个小团队都不再设小队长的职务,但因为他们可以相当程度的自组织,你们两个部门经理一人带2-3个小团队感觉轻松了许多。既然日常研发管理方面压力小多了,你俩也可以专注在部门发展,人才培养、目标管理、客户关系等更重要的事情上了。
好了,现在你的小型团队终于可以比较高效的运转了。你突然发现你的每个小团队自然演进的结果居然和业界著名敏捷公司Spotify组织架构中的小分队(Squad)模式很像:
图片中部分内容源于spotify.com
研发效率上去了,公司业务再次爆发式增长,你俩的happy problem又来了,团队规模要再扩张一倍。怎么办呢?
三、中型研发团队
你俩决定复制之前成功经验。部门既然可以一生二,就可以二生四,将来四生八,实现传说中的指数级增长。
但是好像事情并没那么简单。现在是4个研发经理了,团队也快涨到100号人了。每个经理的日程表都被排得满满的。原来两个经理有事情商量插空就可以做,但现在必须提前好久约大家时间开会。整个团队项目计划时就更痛苦了。即使各个部门间耦合度已经很低了,但完全没有是不可能的。既然有耦合依赖关系就需要协调工作,但有那么多团队要协调起来导致会议又多又长、还低效。研发人员写代码的时间被严重挤占了。
于是在又一次长达数个小时的管理层会议后,你们总算想到了一个解决方案。能不能在小团队层面做一些聚合,或者在整个研发组织层面做更高层次的拆分呢?
说干就干。你们把现有的小分队都拿出来重新分了几个大组,每个大组都像小分队一样遵从高内聚、低耦合、全功能的原则来划分。每个大组负责一个大的或者一组紧密相关的资产,并且能独立完成所负责的资产的端到端的研发工作。每个大组之间的耦合尽量小,所有事务都尽量在大组之内完成,尽量避免跨大组的沟通。
每个大组内的几位一线经理中会选出一个总负责人,作为各大组间的沟通接口和大组内事务的总协调员,由大组内最资深的经理来兼任,你自己作为资深经理之一也开始兼任大组负责人。
上面的组织变革自然又少不了一番软件架构上的调整,系统拆分、解耦、等等。毕竟技术债是要及时还的,留多了到必须连本带利还的时候恐怕就想还也还不起了。
好了,改造完之后,现在整个研发组织的沟通被拆分成了大组之间的沟通。成本一下子就降下来了。原来随时可以开的管理层碰头会终于在大组内又想开就能开了。团队的各种沟通协调在大组内也容易做得多。大家终于又可以把时间用在愉快地撸代码上,而不是冗长的会议上了。
各个大组都是以各个大业务模块划分的,所以根据各模块所需要的人数不同,各大组的人数也不尽相同。这没关系。但你观察发现,一般一个大组最好控制在50人以内,或者是包含2-5个小分队。当人数超过这个之后,大组内小分队间的沟通成本会急剧升高。
大组内个小分队间的沟通还是挺多的,毕竟他们所负责的资产都紧密相关。这样协调工作是少不了的。原来这都是部门经理一把抓,但是组织大了,系统复杂了之后经理就必须放权让员工负责了。托从大公司高薪挖来的HR小姐姐的福,公司的管理和技术岗位的双线职业发展路线也弄清晰了,是时候在组织内培养一些专职技术人才了。
本来各个部门甚至小团队都有架构师、业务分析师等,现在基于大组内各小分队间协调工作的需要,你开始设立总架构师、总业务分析师等等。他们的职责范围在大组内不但是跨小分队的,也是跨部门的。当然你还有一些角色像用户体验设计师、系统管理员等等,他们也是在大组内被小分队共享的。
中型团队的组织架构终于组建差不多了。你突然想起应该参考下Spotify的组织架构图,你惊喜地发现你们所构建的大组很像Spotify中的部落(Tribe)。你自己所兼职扮演的角色叫做部落带头人。
图片中部分内容源于spotify.com
但部落带头人是个兼职角色,你除了要把自己的各个小分队带好外,部落内事务要协调,部落外沟通也要做。你发现自己连996都快搞不定了,简直在向007发展。
你又发现部落内的关键角色,像总架构师,总业务分析师等等也跟你一样忙得焦头烂额。更可怕的是,除了他们,其他人好像并没有那么忙。
在公司强制规定的996的上班时间里,很多人工作根本不饱满,你甚至发现有员工在边工作边摸鱼了!与其这样,大家都提高工作效率把工作时间改成正常965不好吗?
你知道这些问题不解决,别提公司进一步发展壮大、上市、出海,就连生存都有危险了。
到底根源在哪里,怎么迈过这个坎呢?再大型的组织怎么搞,传统组织怎么办?
四、突破瓶颈
到底问题在哪里呢?自己漏掉了什么重要的细节吗?你回过头重新查看Spotify的组织架构图,赫然发现自己确实漏掉了一个细节—部落带头人应该是轮值的。
图片中部分内容源于spotify.com
之前怎么没想到呢?轮值最不济可以让自己隔段时间休息下啊。你有点儿不怀好意地笑了。当然你猜轮值的主要目的是分享转播知识和技能,培养后备人才。那除了部落带头人,是不是其他关键角色也应该轮值呢?试试就知道。
于是你力排众议开始执行轮值制度——所有部落内关键角色必须定期轮值,保证任何关键角色必须有备份。关键角色既包括几位部落带头人(包括你本人),也包括部落中的关键共享角色。轮换周期为半年到一年不等。
轮值的事刚开始做起来时困难重重,但你知道暂时的困难是为了整个组的健康发展。HR小姐姐得知你的决定,也跑来给你点赞,说轮值制度是培养人才的重要实践之一,她主动提出要向全公司推广。
通过定期轮值制度,经过一段时间的阵痛后,组织内的瓶颈和单点故障终于慢慢消除了。原来分散在各个关键人物头脑中的知识被强制地文档化和分享。通过轮值,你发现其实组织中还有很多有能力的人才,只不过在没有轮值之前他们根本没有机会表现出来。
后来你才知道,这些有能力的人才里有人曾经因为遇到职业天花板悄悄地计划过离职,但是因为轮值制度让他们看到了希望,学到了新东西,他们最终选择留了下来。
那些原本是瓶颈和潜在单点故障员工,并没有因为自己变得不那么重要了而沮丧。相反他们非常高兴。他们的工作生活变得平衡了,而且仍然有机会展现自己的能力。当他们有机会向上发展时,他们的经理不会因为团队对他们的过分依赖而不敢放手,反而会帮他们赢得机会,哪怕是部门之外的。这不是传说中的服务型领导吗?
通过轮值,组织中变得人才济济。你发现那些关键总控角色慢慢变得不再需要了。于是无论是总架构师还是总业务分析师,你开始尝试让他们回归到小分队,这样其实连轮值都不需要了。大家在需要讨论跨小分队架构或业务需求时聚到一起共同决定下就好。
有意思的是,你发现虽然轮岗后关键人才回归了到了基层小分队,但真正的人才其实有没有那个头衔都会发光的。老外管这个叫Leadership without position power。大家虽然都是平级,但是真正的人才不需要级别比别人高就能展现影响力,大家也很愿意听他/她的意见。这样的人才走到哪里都是Thought Leader——思想领袖。你也发现自己主导了这么多改进后,虽然仍然是一线经理中的一员,你也变成了一线经理中的Thought Leader。你知道你离晋升应该不远了,如果公司能继续发展,你自然就是那下一个被任命的人。
五、大型研发团队
机会总是会留给有准备的人。而且对于有准备的人,机会永远不缺。现在它就来了。因为研发团队支持业务快速发展,公司业务蒸蒸日上,现在研发团队规模再次扩张,真的实现了指数级增长。
你名片上“研发总监”的头衔虽然没有变,但是你已经从一线经理晋升为二线,开始管理多个部门了。
你发现团队越大,团队间自组织沟通就变得更重要。但是这次你学聪明了,与其每次都自己摸索踩坑,不如先看看业界最佳实践是什么。翻开Spotify的组织架构图,你发现里面果然有这样的正式虚拟组织。它叫做行会(Chapter)。
你看到行会一般是一个部落内部相同角色组成的虚拟组织。它的组成可以是为了项目需要,也可以是为了职业发展或兴趣。你立刻想到各个小分队中的架构师经常聚在一起讨论整个部落级别的架构;各个小分队中的业务分析员也经常聚在一起讨论跨小分队的需求。这不就是事实上的架构师行会和业务分析师行会嘛?!
于是你鼓励小分队中的所有角色都建立自己的行会。开发人员组成了开发者行会,测试人员组成了测试者行会。这些行会都自己行动起来,制定代码规范、测试覆盖率提升计划、学习新语言、新技术等等,搞得热火朝天。
行会是部落内部的,跨部落的虚拟组织也有,在Spotify里叫公会(Guild)。公会比行会更加松散,多是一些兴趣小组,当然必要时也可以是临时的项目委员会。毕竟跨部落的耦合度再低也是有的。
图片中部分内容源于spotify.com
一开始时的行会和公会还是你要求员工组建的,后来大家气氛活跃起来了,就开始自己组织行会和公会了。大部分行会或公会自己都运行得很好,但也有少数不好的就逐渐自生自灭了。
你观察发现,那些运行不好的行会和公会大部分都没有很清晰的目标。于是你要求无论是你亲自任命的还是员工自行组建的行会和公会,都必须要有明确的使命和目标,并且这些目标要和整个组织的目标保持一致。你会对重点的行会和公会保持关注,并在必要时提供指导和帮助。但你不会干涉行会和公会的自组织运行,包括行会和公会负责人的任命和轮换,你知道你要做好的是服务型领导。
你开始悟出作为管理者其实只要帮团队搭建一个良好的环境和平台,为他们指明方向,然后在必要的时候助推一下,团队可以自组织运行得很好。
Spotify的组织架构中还要求,一线经理应该是行会的带头人而不是小分队带头人担任。但这对团队的自组织能力的要求极高。这要求每个小分队都能完全自组织地端到端地完成从需求分析到发布的工作,而不需要小分队有个带头人协调解决问题。你认真地评估了下自己团队的自组织成熟度,离完全自组织还有一段距离。所以你决定暂时还是让一线经理端到端地负责各个小分队。但你知道培养团队自组织的道路还是要持续走下去。
六、跨国研发团队
公司终于在纳斯达克上市,业务成功出海,要在国外也建立研发团队以支持当地业务了。
于是你的团队中开始有外国团队了。你知道你应该遵循的团队组队原则仍然是高内聚、低耦合、全功能。因为时差的原因,跨国团队合作沟通自然没有本地团队顺畅,所以你尽量让每个部落都各自集中在一地。如果实在因为特殊原因不能在一地,至少是应该在一个时区、或者使用同一种语言。
有一个特例是支持型的团队,比如客户支持、平台运维支持等。因为要提供跨时区7乘24小时的服务,他们就必须要零散地分布在不同的时区。这样的成员至少应该和部落中某个小分队在一起,以便很容易地在部落间共享知识。
你在公司挑选的重点国家都建立了研发中心。你自己也从二线研发总监晋升到管理多个研发总监的全球研发副总裁。你努力保证组织的扁平性,每个研发总监大概有10个左右的一线经理向他们汇报,你自己有10个左右的研发总监向你汇报。你知道扁平的组织架构是服务型领导的组织架构基础。当某个一线或二线经理所管理的人数太多或太少时,你就把他们进行拆分或合并,保证他们所负责的业务量和团队规模是类似的。
你把高内聚、低耦合、全功能的组队原则活学活用后,惊奇地发现你的研发组织架构居然和几何学中的分形暗暗相合。
把你的组织放大分成数个部分后,每一部分都(至少近似地)是整体组织缩小后的形状。就像一颗大树拆分成枝杈,再拆分成树叶、再拆分成叶子上的脉络,每次拆分后的形状都和整个大树的形状相似。你的每个研发总监的组织架构和你的大组织架构也是类似的。你知道你即使以后做到高级执行副总裁去管理整个跨国公司的研发组织,它的架构也应该大致长成这个样子。
七、传统组织怎么办?
故事讲完了。故事中的主人公虽然是虚构的,但他/她所构建的组织架构在现实中确是真实存在且高效运转的。如果你所在的公司恰好正经历故事中从小到大的扩张,也许你可以借鉴一下其中的团队组建方法。
但是,现实中的大多数问题其实来自于已有的传统研发组织的转型过程。
传统研发组织的转型是个更大的话题。传统组织因为历史原因欠债太多——组织债、文化债、技术债等等,转型的难度远比初创公司在发展过程中遇到的大得多。这些历史欠债还会纠结在一起互为因果,在转型过程中单纯地去还其中任何一个债都无法让转型成功。这需要组织变革者像抽丝剥茧一样地一层层地改造。这个话题我们放到后面有机会讲。今天只聊纯组织划分过程中的原则。
上面故事中的团队是一个逐渐生长壮大的过程。但不要误认为组织架构设计是自底向上搭积木的过程。正相反,即使在组织成长期,组织架构的搭建也是自顶向下不断拆分和解耦的过程。这与敏捷流程和实践的改进和创新不同,它们应该是自底向上不断演进的。作为组织领导者,在组织架构设计时,应该先根据自身业务特点划分出业务领域、业务子领域、然后是部落和部落中的小分队。
但问题是从哪里入手做拆分和解耦。在一个传统组织架构中,各个系统和团队间可能都是紧密耦合的。系统间的边界很难被识别。
这时候该用到康威定律了。根据康威定律,设计系统的架构受制于产生这些设计的组织的沟通结构。说人话就是你想要什么样的系统,就建什么样的团队。就是说组织设计者可以按照期望的系统架构先搭建组织。在新组织架构运行一段时间后,系统会自然会像组织相同的结构演进,从而促进组织间的解耦。
你想要什么样的系统我不知道,但一个好的系统大概率应该是可以按业务功能端到端发布的。从业务需求上看,各业务领域的变更频率通常是差别很大的。这就要求各业务领域之间能保持低耦合并且可以独立发布。这也是拆分和解耦的目的。通过拆分,减小批量大小;通过解构,减少领域之间依赖,从而达到加快价值交付的目的。所以我们在识别部落时应尽量以业务领域划分,而不是技术、职能等。
例如,在传统的单体企业应用架构中可能有展现层,中间件层,和基础架构层。如果团队按照这三层划分,很有可能的结果是所有业务模块在各层都高度耦合,而任何业务领域或业务模块的需求都不能被独立发布。
现代的微服务架构则是以业务为边界的,且每个微服务都是端到端发布的。团队如果按照业务领域划分,实际上会帮助跨领域的服务间保持松耦合。
随着中台技术的兴起,系统架构会分为前台,中台,基础平台等等。中台又可以分为技术中台,业务中台,数据中台等等。不同于传统单体架构的中间件层,中台本身也是具备业务能力的资产,应该被单独测试,单独上线。而因为前、中、后台的上线频率相差甚远,所以按平台来划分团队是合适的。
八、结束语
总结一下,本文讲述了组建敏捷研发组织架构的一些原则和在Spotify框架内的一些实践。无论是小型团队还是大规模敏捷,组队的核心原则都是高内聚、低耦合、全功能。
组队的方法是将整个组织按业务领域或平台自顶向下不断拆分,直到拆成一个个小分队为止。理想情况下每个负责发布功能的小分队都能独立完成从需求分析到发布的端到端的工作。跨小分队和部落的必要沟通通过行会和公会来自组织地进行。
无论是小分队还是部落,作为一个团队,它的组织架构是骨肉,但团队整体负责,荣辱与共的文化和实践才是灵魂。它让团队能够整体优化,而不是局部优化。如做不到这一点,这个团队只能被称之为一群人而已,而不能被称之为敏捷团队。如何在能力建设、敏捷实践和激励机制的保障下真正做到团队的整体负责,荣辱与共,我们有时间单独聊。
作为组织管理者,构建一个好的组织架构和组织文化也只是让组织高效运转的最基础的条件。在此之上还要为组织创建健康的环境、进行有效的目标管理、绩效管理、和人才培养等工作。团队管理本质上是让团队成员协同工作达到效率最大化。而团队中绝大多数的协同问题都不是成员的态度问题,而是上述各种管理没做到位,或团队生产关系没有设计到位。
看到这里,我相信上文开头提到的几个问题大家心中都已经有答案了。掌握团队组建原则之后要有能力活学活用。这里再给大家留个问题思考下——DevOps团队应该如何构建呢?是每个DevOps工程师都分散到各个小分队里,还是作为部落的共享角色,亦或是所有DevOps工程师单独组队?
顺便澄清一下,狭义上DevOps和平台运维的工作是不同的。DevOps关注的是如何保障各发布团队能快速频繁地交付稳定的软件,包括应用集成、部署、监控等工作。
而平台运维负责的是共享基础设施本身的管理,如系统级安全监控、容量管理、服务治理等,与软件功能发布无关。所以平台团队一般会单独组队。当然也有以谷歌为代表的很多公司,将狭义的DevOps和平台运维的工作合并后且赋予更多的管理职责,组成了网站可靠性工程师(Site Reliability Engineering)团队。
假设是纯DevOps呢?欢迎大家留言讨论。提示一下,答案不是唯一或放之四海而皆准的,它与整体组织的DevOps成熟度以及在当前成熟度下DevOps的工作重心相关。适合的才是最好的。