腾讯敏捷开发及快速迭代
从 2006 年开始,腾讯的研发规模开始膨胀,开发模式急需规范和标准化,到底走 IPD(集成产品开发)还是 Agile(敏捷)的开发路线,公司管理层也在为拿不定主意而犯愁,之后研发管理部开始与 ThoughtWorks 公司接触,逐渐将敏捷产品开发引入进来,并正式命名为 TAPD(Tencent Agile Product Development)。
接触是从一次 3 天 15W 的培训开始的,ThoughtWorks 派来了一个 4 人讲师团队,由此也诞生了腾讯日后推行敏捷的第一批种子。接着总结腾讯本身是怎么样子的,有这样一个框架之后就搞一些团队去实践,通过实践以后再不断改 进,本身也是一个不断迭代的过程。
整个实施阶段大概分成几个阶段:
- 试点期:组织很多专题研讨和内部培训,树立标杆,更大范围内进行培训。
- 推广期:内部建立一个顾问团队,开发一些扫盲的课程,不断的到一些团队里面去介绍去培训,让大家接受这些理念。
同样腾讯在推广敏捷的过程中也面临一些挑战:
- 团队非常多,每个团队特点都不一样,比如规模不一样,应用方法不一样;
- 产品非常广,互联网上所有的产品腾讯几乎都有,这种多元化的产品它本身产品的研发模式会有一些不一样,那么敏捷、TAPD 怎么样去适应这种多元化产品的研发;
- 敏捷在腾讯也是存在一个过程改进,这样就会存在一些不适应性,针对这种不适应性应该怎么样去做才能更好;
- 腾讯人员本身的素质也是参差不齐,每年校园招聘大概会招聘 1000 多个毕业生,这些毕业生从毕业到能上手工作,他们对敏捷的了解,融入到团队中都需要一个过程;
- 一些长周期的项目,比如 QQ 客户端,一个版本的发布可能要半年到 1 年的时间,像这样一个产品怎样去做敏捷开发,也许它就不适合敏捷开发。
正是由于这些挑战,才孕育出了独特的腾讯敏捷模式。以下为收集的一些资料整理:
一、整体的框架结构
简言之,腾讯的 TAPD 是吸收了 XP+SCRUM+FDD 三者特点的并行迭代开发模式,涉及范畴包括敏捷项目管理和敏捷软件开发。
1、产品
采用 FDD,即产品特性开发驱动的一种模式,腾讯的产品会有一个明确的产品经理这样一个角色,他会负责整个产品,包括产品的验证、产品的方向、市场调研、用户 调研等。FDD 模式是一种非常适合产品经理来对产品做一些滚动的要求,腾讯在产品设计上引入了类似 FDD 这样的模式,但是也不完全是 FDD,只是参考 FDD,所有的开发团队都是由产品经理所归纳出来的产品特性去驱动整个产品的研发。
FDD 的核心是面向产品的功能点,但这个功能点是从客户角度出发的,并不是从系统角度出来的。功能点是用一个短句描述出一个业务需求,而这个业务需求的粒度是按 开发时间来衡量的(一般不超过两个星期)。特征与用例的相似之处是,两者都可以用短句(动宾短语)来描述;两者的不同之处在于,用例用 UML 的用例图来表示,而特征是用四色原型(类图)来表示。产品经理这个角色有点 Scrum 的 Product Owner 的味道。但产品特性和 backlog 相差甚远,因为产品特性只是一个动宾短语,而 backlog 却是一个完整的故事(story)。
2、项目管理过程
腾讯采取了 SCRUM,但也不完全是 SCRUM ,腾讯根据自己的特点去总结的一些实践,大概的项目管理过程同 SCRUM 的过程比较类似,包括每天的晨会、迭代、timebox、每个迭代完成的时候会有 showcase、回顾总结等。
3、开发实践
参考了很多 XP 的实践,就 XP 完整的实践来说会比较理想化,很多东西不一定在实际开发中能够采纳,所以腾讯也是采纳其中的某些实践,比如自动化测试和持续集成,通过这样的实践就能保证产品有一个快速发布的过程。
二、腾讯的快速迭代过程
一个完整的迭代过程包括概念、设计、开发、测试和发布五个过程。
- 在概念阶段,会采用 FDD 里面提到的一些好的最佳实践来支撑到我们怎么样去敏捷的做需求开发,会制定一些产品发布的计划,比如产品在未来,某个迭代什么时候发布,要发布哪些产品特性,都是在这个阶段做的。
- 在设计阶段,会做产品原型上的设计。对于互联网产品说更多的是通过快速原型法快速的让产品在不同范围内去做一些体验,比方产品在某个迭代的一个小 迭代里面,可能会在一个团队里面先去体验,可能就会采取发布到公司某一个部门去体验,或者发布到整个公司范围去体验,它会是一个不断放大的一个过程。
- 在开发和测试阶段,更多的采取 XP 的一些实践,包括编码规范,代码走读,比如 1 周一次代码走读,构建持续集成的环境,包括自动化构建,自动化测试等,会有一些好的测试上的实践,如全员测试,就是将测试看成不仅仅是测试人员的工作,更 多的是整个团队的工作,当然也包括这个产品的其他同事的工作,通过全员测试来激发大家对产品质量负责。
- 在发布阶段,腾讯采用的是灰度发布,同传统的软件发布不一样。项目中整个迭代过程就通过类似 SCRUM 模式去管理,如有每日晨会,如何建设团队氛围,统一的管理平台,每次迭代完成时的总结回顾等等,这属于项目管理的工作。
其中分析、设计、开发、测试、发布这五个过程可以内部再迭代,而且这五个过程不是分阶段开展的,即不是分析完了之后才设计,全部设计完了才开 发,开发结束了才测试,测试通过了才发布。而是边分析边设计——在业务不复杂的情况下,这是可行的——边设计边开发,开发完一个功能就测试一个功能,同时 开发下一个功能。
还有一些基础的工作,如代码管理,版本管理,文档管理,异地开发管理,这些在腾讯的整个管理体系里面都包含的,还有会制定一些相关的规范,不过规范不是很强硬的要求每一个项目必须执行,更多的由团队自己选择,让他们根据自己团队的特点、规模去选择应该采取哪些实践。
二、腾讯是如何做敏捷管理的?
1、故事墙
就是白板 story wall,平时工作中很多团队都会使用,这些团队会把每天开发的一些产品特性采用 story 的方式每天都在白板里面展示出来,整个团队每天都会围绕这个白板能够清晰的看到整个产品或者整个项目的一个过程,包括整个产品特性的过程。写在白板上比用 Excel 或者其它工具管理好,因为写在白板上让人感觉更紧迫、更正式、更一目了然,有一种别人在监督、在注视的感觉。
2、每日晨会
每个团队每天大概花 15-30 分钟,回顾昨天做了什么、昨天有些什么问题、同时也会介绍每个人今天计划做些什么工作。对 Team 而言这是检查进度、快速调整非常有效的形式。
最早是通过白板的方式去做,就是每天项目经理组织团队成员对着白板,白板上体现项目的进展情况,通过会议可以很明确的知道昨天大家做到什么样子,今天大家计划做什么,最早的时候每个成员都是口头汇报的。实践一段时间就发现了一些问题:
- 对于一个 20、30 人的团队,每天要怎样做晨会,这是目前遇到的比较大的困惑;
- 晨会很容易形式化,究竟带来什么样的效率和效果,目前也在通过一些方式去研究,去探讨。
- 有一些形式上的呆板,刚开始做会觉得比较有意思,觉得这跟传统做法不一样,每天这样做并且做多了就感觉很枯燥,这也是面临一个挑战。
后来腾讯也做了一些改进,比如为了让成员的参与程度更强一些,包括形式上会更强一些,现在有些团队就会采取每个人轮流主持的方式,刚开始晨会的 时候我们也会通过一些好玩的东西去刺激一下某些东西,但是现在看来的话,感觉改进的还是不是很透。在腾讯内部有一个交流通信的软件,有些项目也开始不采用 站起来开晨会的方式,觉得站起来效率也不高,就会通过即时通信软件每天去交流,最后由一个人去统一输出,这样能解决一些分布式团队的合作。所谓分布式团队 就是这个团队中有些同事在这个大楼,有些同事是在那个大楼,通过这种实时交流的方式可以解决一些问题。
3、规划游戏
对敏捷的一种常见误解是不要计划,其实在敏捷的体系中不仅强调计划,甚至区分 Release 计划、Iteration 计划和 Task 计划等多种不同粒度、不同时长的计划。规划游戏突出的是让用户代表参与,由用户代表评估用户故事/特性的优先级,开发人员评估任务的开发时间,由用户代 表+项目经理+核心成员三方共同排序、组合,确定本次迭代计划需要实现的特性列表。在腾讯用户代表就是产品经理。腾讯特别强调的是并行迭代,即多个版本并 行,最大程度发挥资源的效率。Release(发布)可理解成当实现的产品特性累积到一定用户价值时的正式发布,它是比迭代更大的概念;迭代是在固定时间 内开发特性的过程,Release 一般包括多次迭代。
4、时间盒
在腾讯的产品研发中,产品的每一个迭代都有一个明确的时间盒。在每一次迭代开始的时候会召开一次 IPM 会议,即本次迭代的计划会议,会议中团队中的所有成员包括产品人员、开发人员、项目经理、总监、部门领导,一起去敲定本次迭代要完成的任务,一旦任务敲定 下来,本次迭代就会严格按照这个去落实执行。TimeBox 反映了敏捷开发的节奏,即在固定时间内实现不固定特性的周期,抛开需求定义阶段,从设计-实现-测试到部署,在腾讯一般一至两周时间居多。
5、产品演示
提交测试前由开发人员演示实现的功能,产品经理到场 Review 是否符合当初的设想,避免接近发布时才反馈。
6、迭代总结
在每一个产品发布的时候都会有一个总结。具体的做法是,把做得好的、不好的总结出来,做得好的在下一次迭代发扬光大,做得不好的在下一次迭代就 要注意改进。这样的总结是要求项目的所有成员都必须参加,包括项目的开发人员、测试人员、QA、项目经理、产品经理等,每个人都要去去总结他在上一个迭代 中碰到了什么问题,通过便签纸的方式贴出来,项目经理实际上可以看成是 Scrum Master
,包括站起来总结这样一些东西,包括我们下一次迭代继续发扬什么,必须要注意什么东西,最后就会得出一个 excel 的文档,包括上一个迭代中出的问题,具体的解决办法,都会有
7、自运转团队
早期的项目,为了能提高效率,项目经理希望每个角色都能全力以赴的提升自己的效率,于是自己承担起来大量沟通和推进的工作,那个时候的都在被 PM 推着走,一旦 PM 休假,项目基本没有什么产出,当时去了以后,发现问题很严重,团队的主动性必须被调动起来才行。
自运转团队,是将需求开发过程详细划分成开发的各环节,并明确每个环节的负责人,由该负责人来驱动上下游的负责人,而不再由项目经理来连接各个 环节,再配合上高效的项目协助工具平台,实现开发过程自运转。这时项目经理则由指挥者变成服务者,观察环节之间产生的瓶颈,并及时采取措施扫除障碍。
三、腾讯是如何进行敏捷开发的?
1、用户研究
如何加强用户的参与度,这是一种成本比较低的用户研究方法。通过抓取一些用户数据做分析,分析用户在这个产品上整个体验的过程是怎样的,通过后 台的数据可以看到整个活动的曲线,同时 CE 也可以通过一些科学的手段去保证,包括市场调研、用户研究、数据挖掘、产品体会等,这就是通过一些对用户反馈、用户观察的工具去配合去对用户做研究。比如 QQ 拍拍的一个用户的研究,我们可以到现场去做的一个调研,经常会由产品经理和用户研究人员到用户的实际办公地点进行调研,做一天的反馈,通过观察用户一天是 如何使用你的产品,配合一些相关的工具去科学的分析。因为互联网是非常强调同用户的这种反馈的,腾讯有自己内部的一个 CE 反馈平台,在这个平台上可以收集到所有用户的反馈,产品经理可以每天都会看到他所负责的产品有哪些反馈,包括内部的、外部的,然后他就可以根据这些反馈对 产品进行一些快速的调整,包括开发一些什么样的产品特性,内部同事也可以踊跃的在平台上反馈,内部同事本身就是 QQ 用户。
2、故事卡片/故事墙/特征列表
StoryCard 是 XP 中推荐的需求定义方法,要求符合 Invest 和 Moscow 原则;故事墙则用于跟踪故事卡片的变化状态,而特征列表是 Tencent 一直沿用的需求表达形式,在腾讯的 TAPD 工具中已经实现了类似 ThoughtWorks 的 Mingle 的故事卡片管理功能,对于需求跟踪而言这是不错的方法,一目了然。
3、结对编程
理论上结对编程可以提高代码的质量,而且并不会降低开发效率,但腾讯的业务繁忙,资源上不允许两人结对。但是在一些团队里面还是一直在尝试着做 结对编程的工作。一个在编写程序,旁边还有一个人,同时记录编写过程、编写思路、碰到的问题、自己的想法,编写完以后一段时间他们会交换一下,就是互相交 换着进行编程,这是一个结对编程的一个过程。
4、测试驱动
“测试驱动开发”在腾讯执行地并不太好,腾讯的产品以 Web 形式居多、业务逻辑相对简单,C++下的单元测试有些力不从心。相反自动化测试在腾讯比较盛行,因为有测试部门专门的自动化测试 Team 在推动,而且链接的是正式生产环境,可以即时反映产品当前的状态。
5、持续集成
持续集成可以降低发布前集成阶段的难度与成本,腾讯的自动化构建系统推行的比较早,覆盖了大多数产品,而且正在朝自动化构建-自动化测试-自动化发布三者协同的目标迈进。作为加快产品的发布的能力,持续集成在以下几个方面作用明显。
- 自动编译输出报告,维护代码可运行,及时暴露风险,降低集成成本。
- Dailybuild 日构建系统,让产品经理、测试人员可以尽早进行体验和测试。
- 作为一个自动化系统,利用静态代码检查、单元测试报告等手段为团队提供报告,促进编码质量不断得到重视,降低缺陷解决成本、缩短解决时间。
6、灰度发布
灰度发布是腾讯的又一创新,它将产品试用扩大到海量用户一端,在小范围及时吸取用户反馈,分析用户行为和喜好,持续修正自己产品的功能体验。在 互联网行业,灰度发布已经成为最重要的发布控制手段。有时我们希望通过向小部分用户开发新功能,让他们先来体验新功能、新特性。通过用户反馈、数据运营的 手段及早获得反馈,及时改进。以此方式,既可以降低发布风险,也可以提升发布频率,加快发布节奏。
简单说就是,将一项业务不是一下发布给所有用户,而是分批分期的发布,目的有两个方面,一是减轻服务器压力,二是期间可以在小范围收集到用户的 反馈,如果业务出现问题,不会让大范围用户受到影响。随着经验的累计,我们有了许多种灰度策略和方法,灰度也有了更多的应用,甚至引入到了测试环境,即选 择一些热心用户,将功能首先发布给他们,通过他们的使用,来帮助进行一些现网测试,这使得一些难于模拟的测试场景变得简单,测试人员的压力大大降低;更重 要的用户是最好的测试人员,测试结果更加真实;同时他们也享受到了优先体验的特权,可谓一举三得。发布的时候也有策略,比如发布时如何放量,对用户有些什 么样的实验,技术上怎样做一些后台开关,运营上怎样跟进,怎样保证 4 小时人员的留守,发布完后怎样收集用户反馈等等都会有一些统一的规则。
7、发布汽车
过于频繁的发布会打破团队节奏,有效的发布管理是必不可少的,根据业务特点,我们通常会采用三种发布模式,我们管它叫“发布汽车”。
- 班车模式:像班车一样,固定周期进行,比如每两周发布一次,这周比较适合特性规划比较好的产品,比如 QQ 客户端基本每个月都会发布一个版本。
- 的士模式:与 QQ 客户端不同,QQServer 作为一个平台,它的需求来源非常多,因此它采用多线并行的方式,根据需求来源分成十多个子项目,根据每个子项目如果想要发布,就像打的一样随叫随发布。他的好处是快,但是协调发布的成本是比较高的,比作班车花钱要多。
- 警车模式:顾名思义可以不按法规来开车,因此对于一下特别紧急的需求或运营事件,必须采用警车这种模式,紧急发布,但这样做成本更高,会把交通秩序搞乱,开发节奏打破。
8、重构
好的代码不是设计出来的,而是重构出来的。
四、总结
当然流程和开发方法确定了还远远不够,更难的是如何将它推动落地。首先腾讯组织开发了承载敏捷思想的 TAPD 项目管理工具,它类似 ThoughtWorks 的 Mingle;然后推出了敏捷能力模型,类似 CMM 成熟度模型一样对 Team 评级加以引导;同时还推出了敏捷指数排行榜形成竞争,营造你追我赶的声势氛围。