<audio id="audio" title="第197讲 | 邱良军：做好研发管理的3个关键" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/82/ed/8268e0a215be894f4d29f6c9f4b041ed.mp3"></audio>

你好，我是极智嘉研发总监邱良军，一个18年的IT老兵，其中有8年管理经验，包括研发管理、项目管理、运营管理。前三篇我们讲了对技术团队的基本认识、团队的招聘要点、以及团队管理的要诀，今天我们继续聊聊打造高效技术团队时如何做研发管理。

项目管理包括了5大过程、10个领域和42道管理过程，这边我们不展开细讲，有兴趣的可以看项目管理的相关介绍。

研发管理简单来说就是如何高效的写代码、做产品及做运维支持等。主要研究方向有软件开发生命周期管理和项目管理，包括项目管理PMP认证、瀑布开发主流模式CMMI软件成熟度模型、Agile敏捷开发（前有XP极限编程，后是主流Scrum）、DevOps（开发运维一体化）等。

过去个别大神一个人就可以开发一套系统，不需要分工、不需要团队协作，甚至不需要各种工具，研发管理就会变得非常简单。然而现实生活中，情况往往比较复杂。这里我们分析一个成功的IT创业公司在快速发展过程中，研发管理是如何伴随着组织扩大和组织架构演变进化的，我们一般可分为三个阶段或三个层次：

第一阶段是公司的创业初期，创始团队中往往有技术强人和产品牛人，大家齐心协力目标一致，就是把产品尽快做出来，推向市场或者寻找客户。研发管理主要关注技术和产品，其中产品（或业务）又是最主要的，这时候考虑的是客户的痛点需求，而研发效率是最关键的，用最少的钱办最重要的事情。

在这个阶段，团队规模小、目标一致，基本不需要管理，主要是个人技术能力+行业洞察能力的叠加。之后团队开始扩大发展，产品功能不断完善，研发管理关注的核心点主要在系统稳定性、产品系统不出现性能问题等方面上，团队的协作主要依赖于协同软件的使用，开发模式通常会选择敏捷开发、快速迭代的方式来做，团队加班加点是常态。

第二阶段是公司初具规模，一般到了A/B/C轮融资，研发团队接近或超上百人，甚至几百人。由于业务需求的急剧扩张，客户迅速增加，对于系统功能和性能的要求越来越高，还有安全性、高可用、稳定性等等要求，团队忙的应接不暇，而初期产品牛人和技术强人都做了团队管理者。

在这个阶段，研发团队通常处于混乱期，然后开始寻找解决方案，一般来讲，第一步是梳理流程，各种会议没完没了的开，最后基本是参考CMMI3/5模型来提升研发管理能力。再按照分工拆分为产品、开发、测试、运维、架构等团队，开发还要继续拆为前端开发、基础组建、中间件、架构等团队。各团队清晰地划分职责，加上各种关系、成员个体能力差异，各种争论互怼经常发生，慢慢的就形成了部门墙。到此为止，公司步入研发管理标准化阶段，同时伴随着更大的问题是研发效率不断下降，客户满意度和管理层的满意度急剧下降，公司出现危机。

第三阶段是公司达到几百甚至上千人的研发规模，各职能部门都建立起来了，研发效率却越来越低，做什么事情都特别难，客户抱怨员工也抱怨，危机四伏。创始人及核心骨干特别怀念创业之初金戈铁马，气吞万里如虎的潇洒自由。

在这个阶段，为了拆除厚厚的职能部门墙，研发管理的组织架构不得不再次做调整，增加PMO项目办公室，临时组建项目团队来打各种战役。开发模式演变为CMMI瀑布式+敏捷迭代模式相结合的方式来推进，并不断做精细化管理。我之前参加过软件精细化管理的一门课《Lean Six Sigma》，课程内容是参考丰田汽车的制造过程设计的，非常的不错。此外，在软件研发发布过程、测试及运维过程中，这个阶段的研发团队都在推自动化、智能化工具的使用，让有风险和重复性的工作变得快速而简单。

研发管理的成长就是技术积累、业务理解、研发效率和风险控制的平衡发展过程，我们应该从实际出发，根据公司和团队发展的不同阶段而灵活使用不同的方法。总得来说包括了对产品的理解（行业知识累计），还有技术水平（研发能力、含运维）、工程效能和流程管理等诸多方面。

## 产品和业务

一个段子说：CEO负责吹牛，销售负责让客户相信CEO吹的牛，CTO负责让CEO吹的牛变成真的。这个过程就是把CEO吹的天花乱坠的产品做出来，并且是在有限的时间和成本内把好的产品做出来。不过，业务类型的不同会产生很大的差异：对ToC业务，产品体验是至关重要的；对ToB业务，很多系统在签合同的时候还是个Demo，快速完成就非常关键。

不管公司是在初创阶段，还是在快速发展阶段，产品的好坏始终是最关键的，它决定着公司是否能赚到钱，决定着公司的生死。公司的一切必须围绕着产品来转，现在流行说人人都是产品经理，说的就是这个理。

研发管理的难点之一就是技术团队对业务的理解、对于产品的理解。在我的职业生涯中，做的都是ToB的业务（B是Business，指企业客户），并且主要是做的大B，有金融行业、半导体行业、仓储机器人行业等。对于技术管理者来说，如何做好对产品业务的理解是一个巨大的挑战。以下是我经历以及观察到的如何去理解产品和业务的一些实践：

1. 培养具有程序员思维的产品经理，或具有产品思维的程序员，通常乐于沟通、勤于沟通的程序员经过1~2年的锻炼就可以对行业比较熟悉。我曾经花了一年的时间专注学习国际银行监管的巴塞尔协议，并组织团队内部做业务知识的普及讲解。每周通过邮件做一次业务知识的推送，给团队创造一个学习了解业务的氛围。如此，也可以让产品经理和研发团队之间形成一些共同的语言，提升团队之间的沟通效率，甚至于开发也可以给产品一些建设性的建议。
1. 理解业务最好的方式就是从自己的生活出发，曾经我一个新加坡同事为一家银行研发一套银行开户系统。他想要快速地理解业务知识，并能及时了解系统上线后的运行情况。为此，他到此银行开了各种银行户头，并且存入少量的钱，自己掏钱来操作各种业务，包括线上和线下的操作。同时，他也到本地另外一家最大银行也做了相同的事情。通过在不同银行开户，了解了哪些是银行开户中的相同流程，哪些有差异；通过真实的开户及用卡体验，了解了银行开户的业务流程知识，并不断优化正在研发的系统。当这位同事到上海出差的时候，他也不忘这个事情，马上以外国人的身份到上海分行做开户体验，如此他既能了解中国分行的流程，又能进一步了解中国银行的一些监管要求。他把类似经验也分享给研发团队的其他人，整个团队对于产品业务的理解非常快速，开发出来的产品功能自然令客户满意了。
1. 产品设计遵循MVP原则，在开始设计产品时不要追求一个完美的产品需求(实际上这样的完美需求也是不存在的），而是通过提供最小化可行产品获取用户反馈，并在这个最小化可行产品上持续快速迭代，直到产品到达一个相对稳定的阶段。这样可以快速验证团队的目标，快速试错。

业内很多厉害的产品经理也是出身程序员，最有名的要属微信之父张小龙，其他的还有雷军、马化腾等都是技术达人+产品经理，所以技术团队也可以有产品思维，甚至于可以打造一支技术与产品兼顾的复合型团队。

## 技术和架构

研发管理的核心能力就是技术能力，产品的需求要转换为产品，最终依靠的是系统架构、代码质量。对于研发管理，这里我们需要防止两个极端：

第一种，追求技术上的完美，在系统设计的时候一上来就是高可用、高活、分布式、并发上万、亿级数据等，等系统做出来时，黄花菜都凉了。**“好的架构不是设计出来的，而是进化出来的”，**这句话被很多人引用，并不是给糟糕的起步寻找借口。就像前面一节说的，技术是为产品服务的，系统设计之初，**速度是关键。**To C业务需要快速获得客户，取得收入或者融资；To B业务的客户通常更着急，恨不得签完合同就要上线，当然公司为了快速获得收入也是希望尽快上线验收。

第二种是完全不管架构技术，只要能做出来就好，系统的稳定性极差，体验也不好。这样的系统即便是交付上线了，用户也会失去耐心，产品也就失去了意义。

因此，在系统不断迭代的过程中，我们需要不断做架构调整演化，代码也需要不断做重构调整，以适应业务发展的需要。在预算许可的条件下，适当的做6~12个月的业务前瞻。

在做研发管理的时候，我们还必须做好质量管理，其中代码质量是非常重要又极其容易被忽略的，工期或者资源一紧张，或者团队发生入离职的时候，代码质量就很容易失控。由于人员变化、新的需求功能的增加及变更，废代码、垃圾代码、不规范代码、奇葩代码、天书一般的代码都会出现。这几乎是研发过程管理中绕不开的梗，甚至上升到了软件工程师人品的高度了。对付这个的问题可以加强代码精细化管理：一方面可以使用代码扫描工具（比如 Sonar），另一方面加强代码人工审查。

在代码的重构中，特别是系统到一定的复杂度后，我们需要对代码做一定的减法，包括删除废代码和注释掉不用的代码，还有详细看一下代码逻辑，避免重复代码，重复造轮子。还可以利用一些已有的开源代码来替换写得不理想的代码。利用一些设计模式来简化系统的复杂性，提升代码的复用率。

## 工程效能 - 研发流程及工具使用

工程效能是研发管理中非常重要的一环，研发团队不断发展，工程效能的重要性就会日益凸显。在团队规模超过100人，甚至达到1000人时，就需要专门的人或者团队来关注这块了。工程效能的核心是在符合公司流程要求（风险控制要求）的前提下，提升各团队协作的效率。现在比较流行的是敏捷开发和DevOps两套方法论的使用，两种方式都是大量地使用自动化工具来提升效率。

**敏捷开发是是软件研发团队管理的一种方式，**要求团队成员都是自我驱动、自我管理，从而达到敏捷团队的自管理组织，JIRA支持的Scrum是敏捷的方法之一。JIRA可以做需求管理（User Story）、缺陷跟踪、任务管理等等，JIRA还提供了专门的Scrum视图和Kanban视图等，特别适合敏捷开发团队使用。大型互联网公司如LinkedIn、Facebook、eBay等内部几乎都在使用JIRA，我们公司也是使用JIRA来管理整个软件生命周期，并且是敏捷的开发模式。

DevOps涵盖开发、测试、发布、部署以及运营、监控一体化的过程管理，通过自动化工具的使用，把持续集成、持续交付、自动化的部署发布和监控、持续反馈和优化过程勾连形成一体化，又叫开发运维一体化。通过IDE集成Git和Sonar，在代码提交时做自动扫描检查，再通过Jenkins把Maven、JIRA、Git、Jmeter集成起来做到自动化的部署发布，以及Docker镜像、zibbix自动监控等，最后通过短信、邮件、微信、Jira等系统可以实现报警监控的自动化。

总结一下研发管理所讲的主要几点：<br>
1.从10人以下技术团队演化到几百上千人时，组织架构发生的裂变和团队分工，由此产生的乱弄和低效，再到部门墙的产生是无法避免的，最好要考虑好如何拆除部门墙，所谓分久必合合久必分。<br>
2.和研发管理相关的项目管理的知识，包括软件过程管理（开发生命周期），以及瀑布开发（CMMI）和敏捷开发（Scrum）等。<br>
3.研发管理的核心重点是产品、技术、工程效能。

在即将讲完团队管理及研发管理的时候，总结一下我对做事、管事及管人方面的理解和思考：

- 做事的本质是“高效自驱”，这样的员工谁都喜欢，并且这样的员工也会获得更多晋升和重用的机会。秘诀是勤学勤练，提升专业技能，做事靠谱、高效，有责任心。
- 管事的本质是“抓执行，勤反馈”，形成闭环，并不断通过总结和反思做提升。秘诀是思考问题的本质，找出根本的解决办法，最后形成流程和方法论。
- 管人的本质是“知人性，有人性”，每个人的个性都不同，然而人性却是相通的，学会换位思考，己所不欲勿施于人。秘诀是自我修养，知行合一，修炼自己的人品、口碑、心态最为重要。

## 作者简介

邱良军，极智嘉研发总监，TGO鲲鹏会会员，负责组建极智嘉苏州研发团队，以及筹建苏州研发中心， 4 个月将团队发展到 40 人，并承接两个系统开发，数条支持线的工作。曾在新电任职超 10 年，带领团队交付数个项目，团队峰值人员超 70 人。2014在文思海辉担任总监，从零开始将团队带至 300 人。18年IT老兵，管理经验丰富。


