在不同的敏捷方法中,持续交付和质量内建是不可或缺的实践集,为期三天的 CAC@OPPO 技术教练训练营的目标就是教给大家持续交付和质量内建的基本原则、正确实践以及高效工具。

这次训练营和以往的培训不同,31 名学员在 4 位教练的辅导下,在三天的时间里遵循正确的敏捷技术实践完成一个模拟应用(新闻客户端)的练习。练习选择了学员们工作中常见的场景,也采用了一些较新的技术(Kotlin、RxJava2),激起了大家的学习热情。学员们忘我地投入编写代码,在实战中体会和领悟结对编程、测试驱动开发、集体代码检视、持续重构等技术实践对项目质量和开发效率的提升。

     
结对编程 代码检视 紧张编码
结对协作 积极参与 全情投入

本次培训还充分利用了 GitHub 服务生态,持续交付和质量内建的度量数据全程可视。学员们在教练的要求下,通过分析度量数据来发现问题,找出原因并做出改进。学员们在练习中严格遵守持续集成纪律,学会了如何正确看待度量数据(如代码覆盖率),学会了如何通过透明可视化的度量工具来牵引改进。

     
持续集成监视器 持续集成度量数据 代码覆盖率
实时反馈的 CI 监视器 教练分析 CI 度量指标 代码覆盖率变化趋势

第一天:“颠覆传统”

 
Donny为训练营开营讲话
Donny 为训练营开营

早上九点,Donny 宣布训练营正式开营。教练首先带领大家回顾了Scrum和极限编程两种敏捷方法论以及敏捷宣言,紧接着着重介绍了持续交付和质量内建所包含的关键的敏捷实践。接下来,两位教练对练习项目的第一个需求进行分析并拆分任务清单,通过结对编程为学员们展示了颠覆认知的测试驱动开发方法(TDD),从零开始完成了第一个任务,为大家展示了这种方式对代码质量的积极影响。当看到屏幕上的无效测试依然可以统计得到代码覆盖率时,学员们也明白了测试的有效性远比覆盖率来得重要。展示使用的简洁的 Kotlin 语言、高效的 Android Studio 的快捷操作都让学员们大开眼界。

     
Donny为训练营开营讲话 Donny为训练营开营讲话 教练贴身辅导
教练讲解 TDD 结对拆分任务 教练贴身辅导

下午,学员们就开始亲身的结对编程和测试驱动开发的实践。在晚上8点半的最后验收中,所有小组最终都通过了流水线的检验(“全绿”)。

 
第一天度量数据
第一天度量数据

注:图中展示的第二组流水线还在构建中,但最后通过了构建

一天新鲜紧张的学习结束后,学员们也感受到了新方法的魅力:

杨译绗:“学习了一种从未见过的编程方式 TDD,颠覆了传统的编程方式,而且感受到了其对于提高代码质量的巨大作用。开阔了眼界。”

唐享:“学习到代码覆盖率高并不能代表测试的有效性高,也不能完全代表代码就没有 bug!写单元测试,需要保证每条测试用例都有测试意图,才能更好的提高代码的质量。”

刘剑:“TDD 从听说到亲自实践,确实感觉有很大的优势。首先从测试的角度考虑就抓住了需求的重点,然后在一步步写测试代码时,会进一步细化对需求的理解,这样再写实现代码,就不会出现很大的冗余了,测试也显得更加有价值,并且也是后期代码重构结果正确与否的强有力保证。”

吴俊逸:“TDD 结对编程相当高效,且有助于结对者投入更多注意力,如同时刻都在进行 code review,以写出质量更高的代码。”

黄细闽:“实际实践了 TDD,对 TDD 有了真实的感受,后续项目中争取先在核心逻辑上应用,逐渐再扩大。”

何辉:“通过 TDD 测试驱动开发和结对编程的方式对传统的开发在思维上还是有差异,从一开始就是瞄准了需求的验收,逐渐细化需求分析,测试先行又很大程度的保证了质量和实现过程无偏差。”

第二天:“细节是魔鬼”

第二天的训练营用一场开生面的折纸游戏拉开帷幕。学员们通过折纸游戏理解了验收测试驱动开发(ATDD)“以终为始”的要求。教练们继续结对展示了如何将验收条件变成自动化的测试用例,也向大家说明了不同类型自动化测试的特点(比如覆盖的范围)和适用场景。教练还为学员们总结了在测试中解除依赖的重要手段“测试替身”。下午的代码“鞭尸”活动(集体代码走读)将训练营的气氛推向了高潮。教练们将学员们第一天提交的代码直接展示了出来,让大家一起来找茬。在激烈的讨论中,大家理解了即便是很细微的方法命名、注释、空格、换行也会对代码的可读性造成严重的影响。

     
教练展示 ATDD 集体代码走读 整洁代码讲解
教练展示 ATDD 集体代码走读 整洁代码讲解

虽然第二天练习的难度加大(客户端依赖的服务被关闭),但所有小组的流水线在验收时依然保持“全绿”。有的小组毅然选择了在验收时刻前回滚未能通过构建的代码,严格地遵守了“红不过夜”的持续集成纪律。

 
第二天度量数据
第二天度量数据

经过第二天更深入的学习和练习,学员们的感受也更加深刻了:

汪航:“经过教练演示过程中发生的一些问题,以及下午对代码的鞭尸,懂得了代码整洁之道,也体会到不断重构,不断运行,持续交付,单元测试和接口测试同时保证程序健壮,以前的开发流程虽然看上去流程简单,但其实,结合 AIDD 和 TDD 看似前期流程更加繁琐,但是为后续修改代码打下良好的地基,不会害怕重构带来的巨大影响。当然这也是对个人能力的提升和考验。毕竟这种开发模式要求写代码的思路是比较清晰的。”

许达兴:“对持续集成纪律有更深入理解,提交代码前确保本地代码编译和单元测试编译通过,push 时确保修改的提交不出现遗漏,若无法短时间内修复失败的构建,应立即 revert  提交;”

熊平:“强化了编写测试代码的知识,了解熟悉了测试框架使用。工作中一定要多写,不能眼高手低,要主动思考如何保证代码质量。”

朱小勇:“通过折纸的小游戏,觉得需求开发过程中的 kick off 比较重要,这个可以知道测试的验收标准,这样开发的需求一定是 bug 较少的。。”

张烨:“在代码鞭尸活动中,发现开发过程中经常会出现低质量的代码入库,导致后续维护成本急剧升高。作为开发人员不仅要做到功能实现,还要保证代码的可测试性以及整体代码的整洁干净。”

第三天:“拥抱变化”

上午,教练首先总结了这两天演示和练习过程中见过的代码坏味道和重构手法,并再一次展示了 Android Studio 强大的自动重构功能。有了自动重构的保障,学员们在需要代码坏味道时候能够更加游刃有余的进行重构。训练营的最后一节课,教练先通过五个为什么点明了这次培训乃至的整个变革项目的目的:“快速响应市场,拥抱变化”,然后教练站在一个工程师的角度,分享了自己的经历,如何用技术一点点去应对周围的变化,让自己、让别人更“爽一点”。

   
重构讲解 教练分享
重构讲解 教练总结分享

下午三点半,教练们开始最后一次紧张的验收。除了测试最终交付出来的 APP 和记录工具统计出来的度量数据,教练们还仔细审查了学员们提交的代码,发现了其中的无效测试并做除了对工具统计数据的修正,再次突出了正确有效测试的对质量内建至关重要的价值。

   
APP 截图 第三天度量数据
APP 展示 最终度量数据

下午四点半,激动人心的打擂环节开始了。六个小组依次上阵,将所学内容总结提炼,结合实际,谈感受、定计划,纷纷表示要把高效的技术、工具和方法应用到日后的工作之中。由 Donny、陈景远、张寅祥、李昂和四位教练组成的豪华评审团对各小组的学习成果进行检验。

     
吃瓜群众 吃瓜群众 抓紧时间
团队展示 吃瓜群众 抓紧时间

主要成员来自 Breeno 指令的 Nougat 小组则提出了在新需求和核心模块都要引入单元测试,要采用 TDD 和结对编程的方式,并且要对数据层进行重构。

主要由桌面开发和应届毕业生组成的 JellyBean 小组有效的代码覆盖率最高,他们提出了划分“责任田”(模块)并结合持续重构的思路。评委对“责任田”之间技术解耦的追问和通过自动化测试保障模块间契约的点评。毕业生们也讲述了他们对高效的技术实践如何推行的思考。

主力是短信团队成员的 Lollipop 团队提出要在团队内做技术分享,让更多人掌握高效的工具;要采用 TDD 的方式继续增加单元测试,产生高质量的代码;运用结对编程,开发间先讨论技术方案,以便提高一次性通过率。来自 Lollipop 的汪航和朱小勇更是讲出了自己的感受:

“技术热情再一次被点燃了…敏捷拥抱变化,技术改变世界!要不断的学习,走出自己舒适区”。

       
评委 评委 Donny 评委

打擂过程中,评委们重构保障、测试策略、结对编程运用场景的尖锐提问也引起了大家更深刻的思考。

 
景远感受
景远讲感受

“对教程中的整洁代码、重构印象十分深刻,重构可以实现人力的极大解放,重构的理念非常重要;单元测试、自动化测试提高效率,和结对编程和TDD都是相互促进的,需要高度重视。”

 
Donny
Donny 谈期望

“对于工程师而言,最主要是行动和结果。对新伙伴的能力培养,使其快速上手,就是一个非常典型的结对编程的适用场景;多实践,找到合适的场景,就可以多试。重构不是一个时间选择的问题,没有办法不做业务,给大家时间去重构。重构应该是形成一个习惯,重构的目的是为了让模块的结构变得更加清晰。我希望大家先想,然后果断的多实践,看到好的东西,要多模仿,将行为养成习惯。”

最终,Oreo、Lollipop、Jelly Bean 三个小组分别获得了训练营的冠、亚、季军。

         
积分榜 Donny 为冠军颁奖 景远为亚军颁奖 景远为季军颁奖  
积分榜 Donny 为冠军颁奖 景远为亚军颁奖 景远为季军颁奖  

技术教练社区再出发

训练营大合影

本次培训网站 https://cac-0pp0.github.io/ 将永久开源,供所有感兴趣的开发者随时查阅。培训网站干货满满,其中包括了练习的全部资源、练习过程的全部源码、参考资料,欢迎大家关注并将培训复制到自己的团队。培训也会持续更新,不断加入新鲜的技术内容,也欢迎大家贡献内容。同时,我们的技术教练实践社区(COP,Community of Practices)也宣告成立,我们会在双周四晚上固定交流时间(19点15分),为大家提供一个开放的技术交流平台。我们将不断的邀请技术高手为大家带来技术话题的分享,敬请期待!