我当初是怎么管理技术团队的
此文为早期文档
创建于2015/6/28
关键词:管理技术人才、管理技术团队、技术传承、对题集/错题集、研发哲学
本文档适用人员:研发干部
阅读大约需要二十分钟。
0x00,背景知识
窝窝技术团队大约两三百人左右,主要是五大块:研发、数据、无线、质量、运维。
2012年年初,一个大项目结束后,我召开了飞行研讨会,经过这次深刻反思,形成了几个影响深远的管理观点:
-
管理者要向下提供工具,以形成干部的简单、易记忆、易执行的工作套路。
-
干部要直面白刃战,必须随时能深入到业务细节。
-
培训直到最基层,有案例点评,结合正反实例反复讲,有机会就讲,有机会就补充,有机会就强调,不断检查,不断重复。业务精英都是从五湖四海汇集而来,工作习惯、方式、话术、意识不尽相同,所以需要通过重复重复再重复、CheckCheck再Check,不仅仅要矫正错误行为,更重要的是指明什么是正确的行为。
随后的数年岁月里,首先我们在实践中形成了自己的研发哲学:
-
Don't make me think:凡是被很多人不断重复的好习惯,要将其自动化,绑定到工具之中,以"Don't make me think"的方式来推广最佳实践(best practice)。
-
If it hurts, do it more and often:如果一件事做起来很烦,那就把它拆成很多块儿,每天做一点,每次做一点。
-
这个世界从来没有什么救世主:从来就没有什么救世主,要创造人类的幸福全靠我们自己,不要指望有什么人能救我们,只能绞尽脑汁闯阵。
-
没有苦劳,只有功劳:没有结果就没有意义。不要期望公司因为你和小伙伴们有苦劳而宽容你们没有产出,这是一个商业公司。
其次,经过长期的磨合,我们认同如下理论:
企业的研发管理应该注重建立一个良性的循环:
-
研发能力的提升,有助于促进研发效率的改善;
-
研发效率的提升,使得研发人员可以有更多的空余时间,进而激发更多的研发活力;
-
研发活力的提升,研发人员积极交流与分享,有助于提升研发人员的总体能力。
过去的软件开发方法论,往往只是注重了研发管理中的一两个方面,缺乏整体视角,常常期望以一套方法论包打天下。事实上,真实情况下的研发管理,需要至少三套方法论:
-
提升研发能力,主要依靠经验积累,建立企业内部的知识库与传承体系(促进交流与协作,借助研发活力促进研发能力提升,也很重要);
-
提升研发效率,主要依靠科学的数据分析,建立或引进一系列的研发工具,建立合理的流程与制度(通过提升研发人员能力,激发他们不断改进效率,也很重要);
-
提升研发活力,主要靠多种社会化的沟通机制,促进分享与交流(给研发人员松绑,让他们有足够的空余时间,也很重要)。
我们从2012年开始推行的很多策略制度都暗合以上理论,下面展开讲一讲。
0x01,管控基本思路
=2012年=
1.1.RCA制度
话说2011年下半年,多个技术团队融合,又处于“飞行过程中换发动机”的重构期间,陆续出现了项目一再 delay、Bug 数迟迟不能收敛、相似问题在不同团队反复发生、刚修复的 Bug 又复现等现象,团队之间也互相抱怨。为了遏制这种势头,我组织了一些项目管理者和大家分享他们之前的成功经验,看看能不能从中找到解决之道。
2011年9月的一次分享会上,鲍嘉宝分享了他在上一家公司做飞信项目时降低 Bug 率的几个措施:
方案一:逐步落实质量保障措施
-
增加 RCA(Root Cause Analysis,根本原因分析)制度,对 Bug 的成因进行分析和标注,定时汇总并通告,让开发人员集体增长问题解决经验,减少同类问题多次出现的概率;
-
开展协议与接口规范讲解,降低使用方因为理解偏差或者使用随意造成问题的概率;
-
强制推行编码规范,降低代码随意造成问题的概率;
-
规范化技术方案实施与评审机制,降低逻辑层面与架构层面造成问题的概率;
方案二:Bug 评审会
-
定期或不定期开展 Bug 评审会,清理库存 Bug,或者针对难以解决的 Bug 协商处理方案;
-
评审会上对“解决 Bug”和“做新需求”的优先级进行明确安排;
-
Bug 评审会还具备其他职责,包括回归测试出现问题的解决方案讨论,上线前遗留 Bug 的处理措施的确定等。
最终,从2012年9月开始,研发体系正式推广 RCA 制度,双周一次 RCA 总结会,发送质量保障周报,公布每个开发任务的有效软件 Bug 数和千行代码缺陷率等指标。
当时的具体做法如下所示:
1)双周一次RCA总结会
主持人:质量控制负责人
形式:会议
面向对象:研发全体+质量控制全体
时间:每双周五下午14点~16点
开始执行时间:2012 年 9 月 28 日
规则:
1. 点评案例提前准备好,要点名;
2. 重点针对漏测 Bug ;
2.1. 兼顾有典型意义的 Bug;
3. 回顾每一个 RCA 案例时,做到:
3.1. 造成的后果或影响,
3.2. BUG的原因(一定要问清楚,说得太含糊可起不到警示作用),
3.3. 漏测的原因,
3.4. 得到的教训,
3.5. 事后补救措施或改进方案。
2)每周质量保障报告
报告人:质量控制负责人
形式:邮件
发送范围:质量控制部全体,研发部全体,产品经理全体,SA 全体
第一份报告:漏测BUG简报
字段:
项目名称 上线时间 BUG描述 严重程度 发现人 线上处理办法 责任人 缺陷类型
第二份报告:项目质量简报
字段:
项目名称 提测时间 测试用例数 (预计)上线时间 有效Bug数 严重Bug数 严重缺陷率 平均Bug解决时长 千行代码缺陷率
在之后的几年里,我们在技术团队内部贯彻了 RCA 处理流程:
-
收集足够多证据
-
重新描述问题
-
现象没有描述清楚之前,切勿下结论
-
构建证据链
-
给出结论
-
线下重现
-
确认影响范围
-
纠正线上数据
-
制定防范措施
-
撰写 RCA 报告
-
公开通报(包括同步给其他业务部门)
-
纳入 RCA 案例库
时至今日,RCA 已汇总了七季,RCA 报告数百个,成为了研发体系的宝贵财富。
RCA报告的标准格式为:
-
背景知识(Optional)
-
问题现象
-
影响范围
-
问题原因
-
问题分析过程(Optional)
-
解决办法
-
后续处理措施:如线上脏数据如何修复,如对用户造成的影响如何弥补等(Optional)
-
经验教训
-
RCA类型:如代码问题、实施问题、配置问题、设计问题、测试问题
=2013年 - 2014年=
在设定2013年工作计划时,我明确需要解决如下三个问题:
-
对产品的质量及细节(如稳定性、速度、体验等)的把控不足,
-
团队的开发效率不够理想(如产品的迭代速度慢),
-
技术团队对于行业关键技术的掌握能力偏弱。
我认识到,必须预留足够多的研发资源,优先解决技术团队日常开发和维护过程中遇到的痛苦。
那时候我们有哪些痛苦?
-
开发联调环境、测试环境搭建和部署麻烦,动辄服务中断、接口,开发者为此劳心劳力。
-
系统之间的数据同步,一般通过接口同步调用达成,不够可靠,不能保证最终数据一致性,遗漏后难以排查。
-
层出不穷的定时任务难以管理,日志难以查看,常常是用户投诉了,我们才发现定时任务没有执行或者执行失败了。
-
不能保证平滑上线,常常通宵上线。
……
于是,2013年集中解决制造工具、持续集成和过程透明化数据化这三件事。
1.2.制造工具
制造(或发现)什么样的工具 ?答案是:
-
提高开发效率的 ,
-
提高系统可伸缩和可靠性的,
-
不同业务线可复用的。
方法是:
-
找到技术团队的痛点;
-
找到技术团队的生产效率低的原因;
-
抽象业务场景;
-
有针对性地深入了解其他公司如何解决的,梳理各种方案,向功课好的学生学习;
-
发现现有开源工具,或组织人员开发工具,制定和验证高可用方案 。
实例:
-
自动化测试
-
早期的自动化测试都是基于 QTP 的,比较古老。2013年开始,质量控制部一支人马开始基于 Robot Framework(Python)做,另一支人马则基于 Lazyman(Ruby)展开做。
-
持续集成
-
2012年大家想做持续集成,之后大家各自发展,一,主站全部切换到 gitlab 管理代码,二,由 hudson 或 jenkins 驱动构建,三,使用统一的 maven 库,四,去除那些影响构建和部署的配置项,五,运维部开发自动化上线的管理平台。
-
定时任务调度和管理 JobCenter
-
最开始是因为多个定时任务停了或天天报错,但无人知晓,直到用户投诉。
-
所以痛下决心整顿。开发中间件 JobCenter 花了三个月,推广又花了三个月。
-
异步推送 NotifyServer
-
CMS 与商品中心之间的消息推送屡屡失败,引发各种问题和投诉,排查费时费力。
-
最终决定自行研发一个健壮的中间件 PushServer。
时至今日(注:指2015年),积累的通用技术工具有:
-
前期基于StatsD+Graphite,后期基于OpenTSDB的智能监控解决方案-天机
-
定时任务调度与管理系统-JobCenter
-
内部统一认证系统-IdCenter
-
异步消息可靠推送-NotifyServer
-
分布式跟踪系统-鹰眼
-
分布式缓存管理平台-Discache
-
基于ELK的异常日志分析方案
-
基于Diamond的持久化配置中心和业务降级方案
-
基于ElasticSearch的搜索筛选排序解决方案
-
基于FastDFS的文件上传和分布式文件存储系统
-
数据库自动化运维平台
-
基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
-
基于TCPCopy的仿真压测方案
1.3.持续集成
我在《窝窝研发过去几年做对了哪些事》一文中讲过:
每逢业务大跃进,就会欠下一屁股技术债。
是债就要还。
酷壳陈浩说过,技术债是不能欠的,要残酷无情地还债。很多事情,一开始不会有,那么就永远不会有。一旦一个事情烂了,后面只能跟着一起烂,烂得越多,就越没有人敢去还债。
首当其冲的就是线下环境和线上环境的维护和发布,大把大把的时间浪费在这上面,一代又一代的工程师在离职时表达了愤懑情绪。
于是,从2012年6月开始到2013年10月底,窝窝研发体系开始了持续集成第一季整改,万事开头难,这一干就是一年多。
所谓的第二季 CI,截止到2014年6月,至此,团购业务线基本做到了线下自动化编译、部署、测试(日检),线上自动化上线和回退。
第三季 CI 主要是让 PHP 工程(CMS和SWP)和前端(CSS/JS/Images)也接入自动化上线体系,截止到2014年10月底,基本完成。
目前,基于 Docker 的私有云深刻地影响着持续集成的方方面面,所有的环节都被改变了。
1.4.过程透明化数据化
2013年我在内部做职场培训时,以《职场(潜)规则:心法和技法》为题讲过:
十三)解释成本很高
彪悍的人生也必须解释。
前面说过,多数人都不太清楚其他板块和部门在做什么,是怎么运转的,管理方式是什么,人都投在哪儿了,为什么做这件事为什么不做那件事,那个外部投诉是怎么解决的,为什么一个我认为简单的问题你们却迟迟未解决。
如果我们没有做到冰箱陈列式的项目管理方式,如果没有养成信息第一时间同步、通报的习惯,我们就可能被迫事后解释。
当你需要解释的时候,其实已经有点儿晚了。
别人心中可能已经形成了观点,可能还传播出去了,你又保证不了你的解释能让该听到的人都听到,听到也不见得再帮你传播。
还会耗费你我大量时间解释,与其如此,不如提前主动通报、制定流程和信息同步。
所以我们应该有意识地遵循如下模式:
模式75 冰箱门
——团队成员定期地把各自的工作成果展现给团队所有的人。
项目产物的公开展示反映出团队成员之间的信任,它传达了一种信号——没有什么会仅仅因为主观原因而隐藏起来。没有人会因为让其他人看到了未完成的事务或进度延迟而担心。冰箱门型项目上的团队成员基本上不会去“偏袒”或者粉饰自己的进度报告。
所以,从2013年3月开始,我们试图一步步做到过程数据化 ,然后做到过程透明化:
-
按项目:
-
收集项目实施中的各种数据
-
资源投入、占用和释放
-
工时
-
加班工时
-
代码统计信息
-
测试用例数
-
BUG数/严重BUG率/缺陷类型/解决时长
-
线上漏测数
-
千行代码缺陷率
-
按部门
-
细分到日的人员工作饱和度
-
技术分享和培训的类型和工时
-
过程透明化
-
每一个流转环节都向外部干系人通告,过程透明,数据可检索
-
提前发出延期预警通告
-
提前发出风险警示
1.5.预研药不能停
工程师文化中有一条:愿意投资比较长期的项目。是的,如果一个技术团队总被”紧急且重要“和”紧急且不重要“的事情牵着鼻子走,没有余力去做”重要但不紧急“的事情,最后一定是被动挨打,积劳成疾,最后病入膏肓。
我在《窝窝研发过去几年做对了哪些事》一文中讲过:
职场潜规则里我讲过,一定要低头拉车抬头看路。
最开始我们怎么抬头看路呢,那就是看淘宝这么多年都怎么过来的,他们在不同阶段都在解决什么问题。
冯仑说过,我们要把别人的历史当作自己的未来,这样,才能知道过去人家在做什么,我们现在应该怎么做。
于是,从2013年开始,我们抽调宝贵的研发人力,花费三四个月去做 JobCenter、NotifyServer、鹰眼、数据仓库,花费大量精力去测试 Dubbo、Cobar,做完这些还需要见缝插针地分批分期内部推广。
但这些提前量都是值得做的,否则我们很可能做着做着就“死做做死”了。
所以,药不能停,技术领袖需要眼光放长远,技术积累和传承不可能一蹴而就,中间的坑一个也少不了,不趟怎么知道有多少雷,曾鸣的话怎么说的:
什么叫战略?
——做对了一定会有好结果。
什么叫执行?
——中间的苦,一步也少不了。
时至今日(注:指2015年),我们提前预研了这些解决方案:
-
基于mesos+marathon+consul+registrator+haproxy+docker的容器虚拟化方案
-
基于Shib+Presto的大数据即席查询方案
-
基于HUE+Oozie的Hadoop集群调度与管理
-
基于Piwik+Flume+Kafka+Storm的推荐评测系统
-
基于Cobar的水平分库方案
-
Disruptor在订单交易中的应用方案
-
基于Ionic+Cordova+Saas+Bower+Angularjs+CoffeeScript+Gulp的HTML5移动开发方案
-
基于ArtTemplate+FrozenUI+Backbone+Zepto的H5轻应用方案
-
灰度发布平台
-
运维自动化平台
-
自助式报表解决方案
1.6.分享与学习的氛围
工程师文化中还有两条:分享与学习的氛围强,让工程师有一定的冗余时间自我学习新知识。这也暗合最前面我提到的研发能力、研发效率和研发活力三者之间的循环促进关系。
为了激发研发活力,需要多管齐下,从2012年开始我们有意识去做:
-
定期举办技术分享讲座,当研发人员足够多,方向足够广时,Topic 还是有很多的;
-
为了开讲座,需要给主讲人预留出一定的学习和准备时间;
-
为了让大家有研究有思考有实践,不能把人全陷在具体业务逻辑开发上,不要过分追求低费率和性价比,明明10个人的活儿非让5个人干,最后项目也屡屡延期,一年到头技术团队也没进步。
其次,研发工程师要能够清晰表达。别人听不懂,多半是因为你讲不清楚,你讲不清楚,往往是因为你本来就没想明白没听懂,自然也就没逻辑。
所以,我们从新员工入职之后就有意识要求他们,在试用期内,新人必须做一次技术分享和一次技术评审,面对各方的 challenge,逼着大家学会公开陈述和清晰表达。
以后,我打算实行讲师制度,效仿微博的新兵训练营,申请预算,为训练营讲师的课件制作和授课支付费用。
1.7.组织架构随需调整
当组织结构影响效率时,就要动动组织结构了 ,干部都得抬抬屁股动动窝了。
首要目的是要避免以部门为沟壑。何谓沟壑?阻碍了问题排查或解决,阻碍了技术方案的推行,某类型工程师过少形成管理死角或不利于技术进步,这都叫沟壑。
有时也可能为新业务线提供骨干和人员。这都需要调整部门结构。
以上这七点就是窝窝技术团队在2012、2013、2014这三年间所做出的管控策略。我们认为管理技术人才是一门学问,第一,外行不可能领导内行,第二,靠挖人,靠猎头,一朝一夕之间不可能组建一支能打硬仗的技术团队,那只能攒出乌合之众。
-第一节完-
头图图片来源于必应搜索
欢迎订阅我的微信订阅号『老兵笔记』