作者 | Kaiden 爱数AnyBackup数据库保护研发部-研发总监
目录
什么是技术债务?
技术债务的表象和消除手段
引入代码评审机制
评审对象
评审维度
评审流程
改进计划
对于代码评审的思考
代码评审是一项持续性工作
关注问题转为关注能力—提升团队的可持续性
Ward Cunningham(沃德·坎宁安)在1992年首次提出:交付第一次代码就像陷入债务。 债务是可以加快开发速度,只有通过重写代码,及时偿还债务。如果不偿还债务,就会发生危险。 把时间花在写一些不正确的代码上的每一分钟都算作该债务的利息。 整个软件项目可能在未合并代码的部署,面向对象设计或其他方面的债务问题而陷入停顿。
同时,卡内基-梅隆大学软件工程研究所(SEI)的Robert Nord在《The Future of Managing Technical Debt》提出了“技术债务全景图”(Tech Debt Landscape)的概念。
技术债务全景图主要从两个方向来分析技术债对于软件系统的影响:可维护性(Maintainability)、可演进性(Evolvability),同时结合问题的可见性(Visibility)分析技术债务对于软件开发过程的影响。
2011 年 3 月 25 日Gartner发布Gartner-CAST 白皮书:货币化技术债务,有如下描述:
基于以上的信息,相信大家会对技术债务有足够的的认识,那么我们思考以下几个问题:技术债务的载体是什么?技术债务具体的体现是什么?
程序的最初原型是代码,那么技术债务的载体也应该是代码。对于代码中的一些坏味道,就是我们所说的债务,具体体现在以下几个方面:
这些点带来的问题也就显而易见了,会导致:额外的研发成本;不稳定的产品质量;难以维护的产品。
那么如何在一个项目中解决这些问题,偿还债务,我们通常会建议开发人员优先解决其中的一些简单的问题,比如重复的代码等,一般的处理顺序如下:
在消除技术债务时,我们通常建议开发人员要注意以下基本准则:
当然在大型的软件项目开发过程中,往往是一个团队或者多个团队来共同研发,这就涉及到团队配合和流程规范上的问题了,我们通常建议采用如下的几个准则指导我们解决问题,这几点在后续的章节也会有更加详细的阐述:
当我们面对技术债务时,我们在实践过程中发现,代码评审是一种消除技术债务极为有效的方法。它可以为我们带来很多的好处,例如:传承高水平的代码编写技能;纠正人员编码态度;识别架构风险;提升研发效率和质量等等。
然而在项目管理的过程中,如何落地代码评审呢?在前期实践的过程中,我们采取的是发现问题,解决问题的思路,确定了以下几个环节(以下的点和具体的业务具有相关性,大家可参考其中的点提炼各自团队需要关注的核心点进行评审):
公司的规范是我们进行代码的评审的最低准入条件,我们在评审中要求,代码必须自检,必须符合公司基础的代码规范要求,才能进入评审环节,公司制定的各种规范指导大家进行开发,如:
同时各个子系统也针对各自的模块设计的顶层的架构设计,各自模块的架构设计必须和顶层的架构设计保持一致,使得项目管理,开发流程,软件设计上做到尽可能的统一,从而避免各自为政,野蛮生长的情况。例如数据库保护子系统的顶层架构设计如下:
当然公司也针对代码评审制定了详细的代码评审规范,目前规范已经迭代到3.0版本,由最初的各个团队提交针对于重大价值特性的代码的月度代码评审报告,到后续的全公司季度重大价值特性抽审,以及新增的月度初提交级研发人员代码成长记录档案,来跟踪促进初级开发人员的成长,代码评审的规范越来越全面,合理。
例如针对重大价值评审,规范详细列举了评审的各个大项以及其中包含的评审维度。其中就包含了前端评审细则,后端评审细则,以及架构设计评审细则。架构评审中就包含众多的维度,如:
在我们平常的研发过程中,代码评审可以是一件事,也可以是一个阶段的事,或者是一件需要持续坚持做的事,当我们以不同的态度对待它,就会产生不同的效果。我始终相信,只有持续的发现问题(技术债务),发起评审,制定改进计划,落地改进计划,才能真正的让代码评审发挥应有的效果,让技术债务呈良性下降趋势,才能做到债务的可见(暴露风险和潜在风险),止损(及时消灭潜在风险),改善(提升管理效率和研发质量)。
当一个团队持续做一件事时,将它常态化,那么它就会形成一种流程规范,并最终固化为人员的意识,而不是在代码评审是才会考虑消除技术债务,而是在日常研发中,他就会以评审的要求来审视自己的代码,从而在源头上杜绝可能发生的潜在风险,这样,就会在团队中达成一种无形的共识,我们在研发迭代过程中就有义务及时发现代码的坏味道,并修复它。
在这样的一个组织中,它就是一种可固化的组织能力,当新的成员进入时这个团队时,也会快速的对于这种共识产生认知,也会从前辈那里继承同样的能力。当然,这会是一个长期的过程,而这个过程中,我们更应该关注团队的赋能和人员的能力培养,而不是只关注如何解决问题。