作为程序员相信大家或多或少都提过代码质量这个词,那到底什么是代码质量呢?或者说什么是好的代码呢?我相信每个人都会有自己的理解,一千个观众就有一千个哈姆雷特。就好比我们评价一个产品是不是好产品一样,有的人会从实用性的角度来评价,实用那就是好产品;有的人会从外观设计上来评价,好看那就是好产品。由于每个人评价的维度不同,评价的标准也不同,造成这种所谓的“好”和“坏”具有很强的主观性。对代码质量的评价也面临同样的问题,当我们无法得出一个放之四海而皆准的标准时,相信权威或许是一个好办法。下面我摘录《代码整洁之道》中关于整洁代码的讨论:
我喜欢优雅和高效的代码,代码逻辑应该直截了当,叫缺陷难以掩藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省的别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。
– Bjarne Stroustrup,C++语言之父 《C++程序设计语言》作者
整洁的代码简单直接。整洁的代码如同优美的散文。整洁的代码从来不隐藏设计者的意图,充满了干净利落的抽象和直截了当的控制语句。
– Grady Booch,《面向对象分析与设计》作者
通过两位大神的描述,我们大致可以总结出高质量的代码首先应该便于阅读和理解,方便维护和扩展,逻辑清晰且直接,设计优良,性能优异且没有隐藏的bug等。
从上面的定义我们知道,对代码质量的评价是非常主观的,我们很难客观地通过一套量化指标来评定一段代码是好是坏。并且每种标准适用的范围和场景并不相同。所以要做代码质量治理第一件事就是要基于团队共识形成一套适用于团队内部的标准,这既可以降低个人的主观性,也避免了将各种指标生搬硬套做出很多无效的产出。
在制定团队标准前我们首先应该了解自己所在的团队,一般可以从人、事、环境三个维度来分析,下面以我所在的团队为例,进行团队画像:
从团队画像我们可以看出团队成员有多种技术背景,不同的技术栈代码风格会有很多差异,大家很容易将另一种语言的风格带入到Java开发中,这就造成代码风格不统一,因此整理统一的编码规范非常关键。我们做的是toB业务用户规模较小,但是业务流程复杂,因此我们在做质量治理时应该多关注程序的健壮性而非并发用户数这种指标。至此我们产出了第一版适用于自己团队的衡量代码质量的模型,然后我们可以基于这些指标对我们的代码进行针对性的治理,并且可以从实践过程发现问题,然后再完善这套模型。
有了模型,我们下一步要做的就是制定具体的指标:
指标 | 期望 |
---|---|
编码规范 | |
圈复杂度 | |
重复率 | |
最佳实践 | |
覆盖率 | |
响应时间 | |
资源利用率 | |
漏洞数 | |
错误数 |
讲了这么多我相信大家心里肯定会有一个疑问,那就是我们为什么要做代码质量治理?做代码质量治理到底会有什么产出?要回答这个问题我们不妨从反面来思考,假如不注重代码质量会产生什么后果。我相信大家都会有这样的经历,当我们回头看自己半年前或一年前写的代码时心里肯定会有一个大大的疑问,这特么写的啥,为什么会有这么奇葩的写法。当一个项目进过多个版本迭代后,里面夹杂着各种废弃的和正在使用的代码,各种逻辑相互交织,修改起来牵一发而动全身,这时维护起来将变得非常困难,面对这么一坨烂代码,到底是缝缝补补又三年还是推倒重来,这也是一个值得思考的问题。总结起来不注重代码质量会造成以下几点后果:
虽然不做代码治理会产生很多问题,但是真要实践起来,还是会有很多难点。下面是我总结的几点常见难点:
上面我们讲了很多方法论的东西,下面我们一起来探讨下如何进行落地。对代码进行质量治理我们可以从这3个方面进行入手,首先针对代码中的顽疾进行专项治理,然后在研发流程中设置卡点来保证每次迭代代码的质量,最后是打造团队注重代码质量的文化,只有意识提高了,才能真正产出高质量的代码。
进行专项治理首先需要识别出当前代码中有哪些痛点,而要识别代码中的痛点可以使用一个非常经典的指标:WTF/min。专项治理因为目标都很明确,只要选择好方案去执行就可以了。
在研发流程中设置各种卡点,是我们进行质量治理最重要的手段。我们需要使用一系列的工具作为抓手,层层递进来保障代码的质量。
代码管控大致会经历4个阶段:
规范化:
保证代码质量的第一步是建立团队代码规范,让大家能够形成共识,才能知道怎么做。建立规范这个过程其实是比较难的,要想建立一套好的规范要求你经验非常丰富,只有踩过无数的坑,才能发现为什么这样做会更好。在落实规范这件事上我们选择站在巨人的肩膀上然后再加入团队特有的一些共识制定一套适用自己的规范准则。
自动化:
工欲善其事必先利其器,代码规范制定好后怎样能保证每个人都能按照规范编写代码,如果只靠个人自觉性那是不靠谱的,必须要有工具来做支撑,没有通过工具检测的代码就不能被提交到仓库。
流程化:
有了工具可以帮助我们高效的实现代码规范的落地,但是没有制度和流程的约束,随着时间的推移代码质量意识在团队中慢慢就会被淡化,最终又会回到初始的混沌状态,所以我们必须在制度和流程上强制采取质量保证措施。
中心化:
当公司规模较大时,往往会划分为很多个小团队,每个小团队很可能各自为政,这时就很难从细节上去保证规范的落实,并且每个小团队适用的规范也不尽相同,不能用一套标准去要求所有人,到这个阶段更多的关注点应该放在方法论的输出上,而非具体的执行细节,具体的执行细节可以让各个团队自己去实施,但是需要有一套统一的评分标准来评估每个团队的实施状况。
所有的工具和流程制度都属于代码质量治理的外部力量,只有培养团队的质量文化才能最大限度的统一团队意志,自驱性的保证代码质量,这才是最高效率的方式。关于怎样才能打造好自己团队的文化,我觉得是值得每个人去思考的话题。关于代码质量这个方向我觉得可以关注以下几个方面:
说起代码质量每个人都会觉得很重要,但真正在实际工作中却往往会忽视掉,不管是工程师还是管理者都应该去反思其中的原因。做代码质量治理应该找到适合自己团队的方式,先从简单的开始循序渐进的进行,慢慢的培养大家的质量意识,多找到团队当前遇到的问题和痛点,先把重要的解决掉,然后再去解决不那么重要的问题,如果一开始就把高度拔的非常高往往就很难进行落地。代码质量治理就像一场马拉松,需要慢慢进行积累,很难立马就看到效果,只要长期坚持下去就一定能收获相应的成果。