在前面的一篇文章里面我和大家聊过了极限编程的重要性,今天想和大家聊聊极限编程里面最简单但也往往最容易被忽略的实践——编码规范。
说到编码规范,每一个开发人员都非常熟悉,每一个团队也都有自己的编码规范。但实际的执行情况如何呢?估计大多数的团队都是形同虚设,编码规范只是存放在文档库里面的一个文档而已。
为什么编码规范难以落到实处?我觉得大家都忽略了编码规范的重要性。编码规范是极限编程中一系列实践的基础,认真执行编码规范可以说是极限编程里投资回报率最高的实践。
首先编码规范是代码集体所有权的基础。可以想象下春秋战国时期各个诸侯国都有自己的文字,沟通交流的成本比较高,而秦始皇统一六国后迅速统一了文字,有利于法令、文化的传播和发展。涉及到编程,也是同样的道理。如果一个团队里面每个人的编码风格都不一样,每个人看别人的代码都觉得不爽,就没有办法做到代码的集体所有权。只有有统一的编码规范,才有可能做到真正的代码集体所有。
其次只有做到统一的编码规范,才有可能实行结对编程。结对编程是一种很好的极限编程实践,通过二人结对编程的方式,可以高效地产出有质量的代码。但实施结对编程的一个前提,最起码是两个人写代码的风格是一致的。如果一个人是按照驼峰规范写代码,一个人按照下划线规范来写代码,估计写的时候要打架。
综上,编码规范是代码集体所有权和结对编程的前提。代码集体所有权和结对编程又可以更好地帮助实施后续的实践,比如持续集成、测试驱动开发等等。而且只有真正意义上做到集体所有,才有可能推进知识在团队里面的传承,降低团队的风险,也为团队内部轮岗创造了条件。
既然编码规范这么重要,为什么在实施的时候往往被忽略掉呢?我觉得可以从团队和个人两个角度来分析。
从团队角度来看,有很多团队都是按照模块来分配工作。比如我接触的禅道项目管理软件的客户里面,有很多就是这样分配的。比如张三负责A模块,李四负责B模块。张三和李四之间没有交叉交流的地方,如果不认真遵守团队共有的编码规范,难免会各有各的风格。那么这种按模块分配也是违背了集体所有的这一项实践。会造成重复造轮子、代码冗余、单点风险等等问题。应当打破这种按模块的分配方式,让每一个人都可以参与到每一个模块的开发中。
从团队的另一个角度来说,往往是缺少一个强有力的推进者。执行编码规范就需要纠正别人的代码,难免会得罪人。所以团队里面是否有一个强有力的推进者,对编码规范的实施起到了至关重要的作用。建议团队里面挑选一位责任心比较强的骨干研发人员来推进编码规范,以身作则,效果会比较好。
从个人角度来看,很多开发人员会觉得自己的能力很强,只要保证自己写的代码能执行就可以了,很有个性。其实这都是不够职业的表现。大家可以看看网上流传出来的Google或者微软的程序员的代码,都在严谨地遵循统一的编码规范,认认真真地写代码。代码是写给别人看的,所以一定要想办法把代码写得清楚。
所以不管从团队角度来看,还是从个人角度来看,认真遵循编码规范,都可以带来很多好处。最后和大家分享下我们团队的编码规范实践。
第一,是在制定编码规范的时候简化规则。规则越多,就越不容易记忆,越容易出现意外。我们的命名格式就只有一个驼峰。从数据库到程序到页面,所有的命名格式都遵循驼峰这样一个规则。我了解有的团队的命名格式会比较多,比如类名首字母会大写、数据库字段名会用下划线间隔,其实必要性不大,简单一点更容易遵循。
其次,我们会更关注起一个好的名字。从数据库名到表名,到字段名,到程序里面的类名、属性名、方法名、参数、返回值,到接口里面的入参出参,再到页面里面的元素、样式,一定要多花点心思想一个可以自我解释的名字。有的朋友可能会讲,还有注释呢。但与其写注释来解释这个名字是什么含义,为什么不花点功夫让它自我解释呢?
此外,我们还非常强调代码片段的管理。对于现在的语言来讲,最小的管理单位就是方法函数这一个级别了。函数方法里面的实现都是通过一行行的代码组成,这时候可以灵活的运用注释、空行、对齐等方式将代码行组织为代码片段。这样当阅读代码的时候,可以很容易搞清楚这个函数方法的宏观结构和逻辑,可以更容易定位问题。试想一个50行代码的函数,如果中间没有任何空行来间隔,阅读起来将是多么痛苦的一件事情。
我们还会通过定期的集体代码评审来对齐大家的编码规范。每两周抽一个时间,把大家都聚到一起,统一来看代码。一个文件一个文件地比对审查规范的问题、命名的问题、逻辑的问题、版式的问题,以及实现方案的问题、效率的问题和安全的问题等等。通过这种方式可以很有效地保证规范在团队里面的贯彻执行。
最后,除了参考我们禅道团队的编码规范,给大家推荐一本书《编写可读代码的艺术》。书中有很多关于编程的规范和技巧,对于团队来说,可以参考其中的规范来制定团队的编码规范,提高团队代码质量、落实极限编程实践;对于个人来说,有利于提高代码可读性,做到内外兼修,成为优秀的程序员。不管是团队还是个人都可以从中获益良多,强烈推荐!