工程实践,也有称为技术实践,其推进在敏捷转型当中具有重要位置,有推算认为效能提升里面的至少一半来自于工程实践。由于不能严格的区分提升来自于哪里,以上推算难以证实,但也可以体会到工程实践的重要性。
当一位教练辅导10人团队时,可以与团队成员逐个结对,手把手传递,而在敏捷转型在超过100人的情况下,工程实践的推进就会遭遇规模化问题。而随着敏捷DevOps的深入,当前1000人级别的推进已经有很多了,到了千人级规模,显然逐个结对显然推进速度不够快,原先在10人团队的推进手段很难复制到千人级。本文试图来看看千人级工程实践推进。以下来探讨下工程实践规模化的要点。
首先跟着上面例子,既然光靠1个技术教练逐个结对去推进显然不够,那么很自然的有个方案是建设技术教练团队和外围热情者,比如工程实践主题的CoP,比如TDD CoP,持续集成CoP。但是这个方案在业界采纳的比例不高,成建制的管理教练团队比较多见,成建制的技术教练团队相对很少,就算有,人数也有限。在规模化下工程实践氛围也许比有限的技术教练团队更加重要,而千人级工程实践氛围的带动得要有赖于组织刻意的推动,首选是持续集成。
规模化工程实践首选的推进点是持续集成。通过持续集成工具,天然可以方便地以组织级视角来观察,也就是可以得到规模化展现和度量。比如可以看到哪些团队或者系统已经启用了CI(持续集成),具体样例指标有:
另外持续集成是组合实践,不同组织有不同侧重点,而且在理论上与持续部署存在交叉。从规模化推进角度,试图来识别持续集成里哪些实践更加优先。
招行去年2019年公布了其DevOps建设情况,里面给出了招行成熟度模型,成熟度分三级:一级包含了自动化编译、静态代码扫描、发布制品库三个工程实践。二级是在一级的基础上,增加了自动化部署。三级是在二级的基础上增加了单元测试和自动化测试。(引用自招行滕乐英老师分享的演讲实录丨招商银行DevOps实践及DevOps标准认证评估分享)
笔者的归纳与招行此模型大体一致,按优先顺序从高到低如下:
自动化编译是理所当然的高优先,没有这个余下一切免谈。
静态代码扫描是组织级容易推进的工程实践,最典型的例子是安装SonarQube服务,提供给各一线团队使用。开始时可以降低门槛来切入,切实让广大一线团队感受到好处,然后可以迅速铺开,切实规模化的观测到组织整体代码质量情况。与此实践对照的是人工code review,code review需要一线团队主动的人工付出,其规模化推进就有较大困难,需要专项建设。
发布制品库为发布管理要点,确保投产版本准确并且可以回溯。
自动化部署在海量服务部署情况下显然也是高优先。
然后来到了复杂的自动化测试。首先的复杂来自于自动化测试这个词本身,自动化测试在不同组织语境下有不同含义,有些地方说的自动化测试是指启用诸如selinium的自动化测试,招行把单元测试和自动化测试并列,看起来单元测试好像不是自动化测试。
本文采用其字面意思,即是覆盖全部自动化测试,采用微软的自动化测试分类方法,按如下划分:
特征是无需部署安装也不依赖外部资源,这与经典单元测试高度重合。为什么不用单元测试这个提法?因为有些地方的单元测试超出了L0范畴,甚至覆盖到了L2,这与XUnit系列单元测试工具的强大有关,无论如何,单元测试这个词目前存在不同理解,啰嗦一些的L0自动化测试更加精准。
特征是无需部署安装但依赖外部资源,也类似于单元测试,一般所用工具就是XUnit系列。
特征是无UI界面基于接口/API的测试。仍然可以使用XUnit系列工具,当然也可以使用专门接口测试工具。
特征是UI界面自动化测试。常见使用Selinium。
微软公布的实例里面说明当前微软目前现有大多数测试都是L3级,而招行的情况是接口测试占据多数,招行精益敏捷类对接口测试覆盖率要求达到100%,也就是在以上的L2级。
招行将其测试组合形容为测试橄榄球型,这与笔者之前所提出的纺锤形是一回事。
对于微软实例说L3最多,这也许与微软产品特征有关,尤其是其Office系列,这样的话是冰淇淋形。笔者猜想微软测试冰淇淋形组合是特例。而招行测试橄榄球形更加代表了规模化测试推进的样例。
测试金字塔理论上以L0为基础,数量最多。但从性价比上不是最经济的,在规模化角度上,跨团队接口联通更加优先。
因此自动化测试里面优先推进建设以接口/API测试为特征的L2自动化测试,然后L0,L1。而基于界面的L3测试更加排在后面。
个别一线团队会自动自发地建设持续集成,但如果在千人规模上考虑这个问题,就不能够指望自动自发。因为这里面存在至少2重困难:
1,持续集成建设本身存在难度;
2,对如何实践是否带来高效率没有统一认识。
因此要培养工程实践氛围,值得利用持续集成工具特性来开展组织级工程实践度量,建立标杆,引领更多团队前进。
对于指标样例,有如下列推荐
持续集成是工程实践规模化的核心实践。其中的自动化测试推荐优先以基于接口/API的L2自动化测试。技术教练团队值得考虑,但有难度,更重要的是提升工程实践氛围,值得收集并公开各种度量。