为什么研发规范,代码评审,单元测试推不动
![为什么研发规范,代码评审,单元测试推不动](https://static001.geekbang.org/infoq/37/3774e4ec7f8195218872f32f43af5a7f.png)
如何区别一个研发团队是草台班子还是正规军,相信很多人的评判标准是有没有实施研发规范,有没有代码评审,单元测试等。但我相信任何一个尝试推动研发规范,代码评审和单元测试的团队迟早都会发现这是一件非常难的事情,很有可能搞得天怒人怨。为什么会这样?
推动研发规范容易犯的错误在于执行僵化,与现实脱节。为了保障规范被严格执行,往往会要求步步留痕,定期抽查;而为了保障其权威性,一般会把抽查结果和绩效挂钩。虽然有规范和没规范相比,完成相同的需求肯定会花更多的时间,但是在绝大多数公司里,业务方才不管你研发部门有啥规范,排期就得按 deadline 规范。这种情况下,不但研发人员的工作量增大了,而且即使项目顺利上线,如果某些步骤忘记留痕,规范检查的时候一样会跳进黄河也洗不清。你们的团队是不是每次规范抽查也都搞得鸡飞狗跳的,都会花时间搞合规性自检呢?这些额外增加的时间成本严重的甚至会影响到功能开发和测试的时间,当然线上质量也很难提升。如果不仔细分析,管理层面很容易得出当前规范还不够严格的结论, 出现每出一个线上事故,就增加一条规范的搞笑行为。解决之道也很简单,就是确保研发测试有充分的时间去开发测试系统,并把评判研发效能的重点放在实际线上事故率是否降低上面。但实操层面,由于研发处于弱势地位,基本不可能说服业务和管理支持这么做。所以突破点应该放在提高研发效率上。
代码评审的问题是团队很容易在风格等低价值的问题上反复纠结,而忽略更重要的结构性优化。代码评审的前提是对质量标准有共识,并且评审者对这些标准有足够的判断力。在对代码不熟悉和研发进度紧迫等因素的影响下,评审很容易局限在命名规则,编码格式等简单规范上。而对高内聚,低耦合等设计原则,方法过长,调用层次过深等结构不良问题难以深入。这会导致评审仅限于皮毛,不但浪费时间,而且对代码品质提升帮助不大。同时现实中代码评审往往都由团队的 tech leader 组织,leader 的水平基本决定了代码评审的上限。如果不巧 leader 本身水平一般但又很强势,就会搞成一言堂,不但拉低水平还会打击士气,时间长了人才就流失了。如何解决这个问题?提高团队的设计和编程能力,特别是一线 leader 的能力当然是一个手段,但能力这个东西没法快速突破,因此这显然不是一个速效办法。
单元测试则是一个典型的头痛医头,脚痛医脚的例子。一般单元测试的评判标准主要看覆盖率高低。但有没有发现要提高覆盖率非常之难,不但一年下来增加不了几个点,团队的抵触情绪还很大。或者覆盖率看起来很高,但实际测试代码顶多就是 system.out.print,几乎没有断言,不但起不到单元测试的目的,还白白增加了很多无用的代码。为什么会这样?除了上面说的时间不够外,很多研发并不真正了解单元测试,把写单元测试简单的等同于会熟练使用 mock 工具。那通过增加时间和培训能解决这个问题吗?其实没用,因为要想写好单元测试的前提条件是代码的可测试性足够好。但前面也说过代码评审的效果很差,显然解决不了代码可测试性差的问题。那到底该怎么办?
说到底,今天的开发方式和二三十年前相比并没有本质的变化,开发效率也一样没什么提高。在效率没有增加的前提下,增加研发规范,代码评审和单元测试一定会导致开发周期延长,整体效率下降。很多公司面对这种情况的本能反应就是加班,搞得大家疲于奔命。
我不知道有多少人意识到研发效率增长长期停滞是一件非常不正常的事情!
有没有什么办法能带来质的改变,能同时提升研发效率,代码质量和可测试性呢?答案就是低代码技术。虽然现在市场上绝大多数低代码技提升的主要是前端页面的开发效率,帮不上后端研发的忙。但 x-series 是专门面向后端的低代码工具。X-Series 包含 3 个独立工具,xUnit 用于构建清晰的后台系统;xDecision 用于表达复杂的判断逻辑;xState 用于管理复杂的状态变迁。
xunit 通过以下几个方面提升后端研发效率:
加快设计速度。研发人员可以使用 xunit 将系统功能用流程图进行表达,将设计时间由天缩短为分钟。维护时也无需深入了解代码,可以从流程图上直接定位到对应代码。
保障代码质量。流程图通过步骤对整体代码进行了切分,步骤间的调用顺序由流程图来保障。每个步骤对应的代码只关心当前步骤所处理的逻辑。通过这种方式不仅能从根本上满足高内聚低耦合,结构简单等质量要求,同时还能保持代码精简。当代码增长时,可以通过增加流程节点的方式灵活的对代码进行重新分布,确保每个步骤的代码长度在合理范围之内;反之也可以通过合并步骤,避免代码过于零散。
提高可测试性。可测试性是代码质量的自然延伸,有了符合设计原则并且精简的代码,就可以满足写单元测试的前提条件。
更进一步,如果问题是由代码质量造成的,那么没有代码的话,自然也就没有和代码相关的问题。xdecision 和 xstate 正是从这个思路出发,直接使用决策树和状态机模型来可视化表达业务逻辑,连代码都不需要。没有代码甚至还解决了业务,研发和测试之间沟通不畅的问题。利用可视化模型,设计评审和功能验收时可以直接拉上业务和测试一起参与,更容易达成一致。
总之,只有提升研发效率才能支撑研发团队落实研发规范,代码评审和单元测试。而提效最直接的手段是运用像 x-series 这样的面向后端的低代码技术。未来,x-series 一定会得到更加广泛的应用。你还不行动起来吗?
评论