极限编程里最容易被忽略的实践

news2024/12/27 22:26:34

在前面的一篇文章里面我和大家聊过了极限编程的重要性,今天想和大家聊聊极限编程里面最简单但也往往最容易被忽略的实践——编码规范。

说到编码规范,每一个开发人员都非常熟悉,每一个团队也都有自己的编码规范。但实际的执行情况如何呢?估计大多数的团队都是形同虚设,编码规范只是存放在文档库里面的一个文档而已。

为什么编码规范难以落到实处?我觉得大家都忽略了编码规范的重要性。编码规范是极限编程中一系列实践的基础,认真执行编码规范可以说是极限编程里投资回报率最高的实践。

首先编码规范是代码集体所有权的基础。可以想象下春秋战国时期各个诸侯国都有自己的文字,沟通交流的成本比较高,而秦始皇统一六国后迅速统一了文字,有利于法令、文化的传播和发展。涉及到编程,也是同样的道理。如果一个团队里面每个人的编码风格都不一样,每个人看别人的代码都觉得不爽,就没有办法做到代码的集体所有权。只有有统一的编码规范,才有可能做到真正的代码集体所有。

其次只有做到统一的编码规范,才有可能实行结对编程。结对编程是一种很好的极限编程实践,通过二人结对编程的方式,可以高效地产出有质量的代码。但实施结对编程的一个前提,最起码是两个人写代码的风格是一致的。如果一个人是按照驼峰规范写代码,一个人按照下划线规范来写代码,估计写的时候要打架。

综上,编码规范是代码集体所有权和结对编程的前提。代码集体所有权和结对编程又可以更好地帮助实施后续的实践,比如持续集成、测试驱动开发等等。而且只有真正意义上做到集体所有,才有可能推进知识在团队里面的传承,降低团队的风险,也为团队内部轮岗创造了条件。

既然编码规范这么重要,为什么在实施的时候往往被忽略掉呢?我觉得可以从团队和个人两个角度来分析。

从团队角度来看,有很多团队都是按照模块来分配工作。比如我接触的禅道项目管理软件的客户里面,有很多就是这样分配的。比如张三负责A模块,李四负责B模块。张三和李四之间没有交叉交流的地方,如果不认真遵守团队共有的编码规范,难免会各有各的风格。那么这种按模块分配也是违背了集体所有的这一项实践。会造成重复造轮子、代码冗余、单点风险等等问题。应当打破这种按模块的分配方式,让每一个人都可以参与到每一个模块的开发中。

从团队的另一个角度来说,往往是缺少一个强有力的推进者。执行编码规范就需要纠正别人的代码,难免会得罪人。所以团队里面是否有一个强有力的推进者,对编码规范的实施起到了至关重要的作用。建议团队里面挑选一位责任心比较强的骨干研发人员来推进编码规范,以身作则,效果会比较好。
 

从个人角度来看,很多开发人员会觉得自己的能力很强,只要保证自己写的代码能执行就可以了,很有个性。其实这都是不够职业的表现。大家可以看看网上流传出来的Google或者微软的程序员的代码,都在严谨地遵循统一的编码规范,认认真真地写代码。代码是写给别人看的,所以一定要想办法把代码写得清楚。


所以不管从团队角度来看,还是从个人角度来看,认真遵循编码规范,都可以带来很多好处。最后和大家分享下我们团队的编码规范实践。

第一,是在制定编码规范的时候简化规则。规则越多,就越不容易记忆,越容易出现意外。我们的命名格式就只有一个驼峰。从数据库到程序到页面,所有的命名格式都遵循驼峰这样一个规则。我了解有的团队的命名格式会比较多,比如类名首字母会大写、数据库字段名会用下划线间隔,其实必要性不大,简单一点更容易遵循。

其次,我们会更关注起一个好的名字。从数据库名到表名,到字段名,到程序里面的类名、属性名、方法名、参数、返回值,到接口里面的入参出参,再到页面里面的元素、样式,一定要多花点心思想一个可以自我解释的名字。有的朋友可能会讲,还有注释呢。但与其写注释来解释这个名字是什么含义,为什么不花点功夫让它自我解释呢?

此外,我们还非常强调代码片段的管理。对于现在的语言来讲,最小的管理单位就是方法函数这一个级别了。函数方法里面的实现都是通过一行行的代码组成,这时候可以灵活的运用注释、空行、对齐等方式将代码行组织为代码片段。这样当阅读代码的时候,可以很容易搞清楚这个函数方法的宏观结构和逻辑,可以更容易定位问题。试想一个50行代码的函数,如果中间没有任何空行来间隔,阅读起来将是多么痛苦的一件事情。
 

我们还会通过定期的集体代码评审来对齐大家的编码规范。每两周抽一个时间,把大家都聚到一起,统一来看代码。一个文件一个文件地比对审查规范的问题、命名的问题、逻辑的问题、版式的问题,以及实现方案的问题、效率的问题和安全的问题等等。通过这种方式可以很有效地保证规范在团队里面的贯彻执行。


最后,除了参考我们禅道团队的编码规范,给大家推荐一本书《编写可读代码的艺术》。书中有很多关于编程的规范和技巧,对于团队来说,可以参考其中的规范来制定团队的编码规范,提高团队代码质量、落实极限编程实践;对于个人来说,有利于提高代码可读性,做到内外兼修,成为优秀的程序员。不管是团队还是个人都可以从中获益良多,强烈推荐!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1844211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 8版本的新功能和改进有哪些?(MySQL收藏版)

目录 1. 简单介绍 2. 发展历史 3. MySQL 8产品特性 4. 数据库性能重点分析 1. 原生 JSON 支持改进 2. 隐式列优化 3. 改进的查询优化器 4. 并行查询 5. 分区表改进 MySQL 是一个流行的开源关系型数据库管理系统(RDBMS),由瑞典公司 M…

变长的时间戳设计

以前的时间戳有32位,以秒为单位,231秒≈68年,从1970年开始,到2038年会出问题。 后来出现的时间戳有64位,以纳秒为单位,263纳秒≈292年。 本次设计的变长时间戳,以32比特为单位,总共…

“尚泉杯”2024 演讲朗诵公益展演展播在京启动

2024 年 6 月 15 日“尚泉杯”2024 演讲朗诵公益展演展播启动仪式在北京隆重举行。本次活动宗旨是响应领导讲话精神,通过演讲朗诵等形式弘扬中国文化,展现中国魅力,促进文化交流。 活动以“爱我中华”为主体线索,鼓励参与者采用不…

显卡nvidia的CUDA和cuDNN的安装

显卡版本,和nvidia下载的 CUDA版本和CUDNN的关系 1. 显卡版本 nvidia-smi 硬件环境:显卡版本 4090 NVIDIA-SMI-555.85 我的驱动是510.85.02,驱动附带cuda12.5 2. nvidia下载的cuda版本 nvcc -V 我下载的是cuda12.5 cuda在安装版本过程…

新手下白对Latex下手啦!

第一次使用latex,浅浅地记录一下子吧。 首先我们一般会下载一个latex模板,如果想知道咋下载,评论去告诉俺哟! 新手小白首先要看懂结构,不然完全下不了手,本文就以IEEE的模板,从头往下讲咯~ 第…

【全网最全最详细】RabbitMQ面试题

一、说下RabbitMQ的架构大致是什么样的? RabbitMQ是一个开源的消息中间件,用于在应用程序之间传递消息。它实现了AMQP(高级消息队列协议)并支持其它消息传递协议,例如STOMP(简单文本定向消息协议&#xff…

动态轮换代理IP是什么?有什么用?

如果您要处理多个在线帐户,选择正确的代理类型对于实现流畅的性能至关重要。但最适合这项工作的代理类型是什么? 为了更好地管理不同平台上的多个账户并优化成本,动态住宅代理IP通常作用在此。 一、什么是轮换代理? 轮换代理充当…

AWR1843BOOST上的TM4C1294NCPDT是干啥用的?

摘要:AWR1843BOOST上面有2个体积较大的芯片,一片是雷达,另一片是什么呢? 答案:它就是XDS110仿真器。 有了它,就不用再买一个仿真器了。 从AWR1843BOOST的原理图中可以看到整个 BOOST板子上只有2个比较大的…

Java实现俄罗斯方块——文本域组件

技术实现: 1.初始化游戏窗口; 2.初始化游戏界面; 3.初始化游戏的说明面板; 4.随机生成下落方块; 5.绘制方块; 6.清除方块; 7.清楚某一行方块,上方方块掉落; 8.刷新…

elementUI的el-table自定义表头

<el-table-column label"昨日仪表里程(KM)" align"left" min-width"190" :render-header"(h, obj) > renderHeader(h, obj, 参数)" > <template slot-scope"scope"> <span>{{ scope.row.firstStartMil…

深度解析响应式异步编程模型

上一篇文章中我们聊了一下线程池,基于线程池的多线程编程是我们在高并发场景下提升系统处理效率的有效手段,但却不是唯一的。今天我们来看一下另一种异步开发的常用手段-响应式编程模型 传统多线程模型的缺陷 多线程模型是目前应用最为广泛的并发编程手段,但凡遇到什么性能…

小摩法兴纷纷转多,看涨港股的时机来了吗?

恒生指数今日高开一度上涨89点报18520点&#xff0c;创近两周高。之后持续震荡下行&#xff1b;恒指临近中 午跌幅扩大&#xff0c;恒生科技指数一度跌近1.5%。截止收盘&#xff0c;恒生指数跌0.52%&#xff0c;盘面上&#xff0c;石油、煤炭、环保、建筑节能等板块涨幅居前&a…

【简易版tinySTL】 vector容器

文章目录 基本概念功能思路代码实现vector.htest.cpp 代码详解变量构造函数析构函数拷贝构造operatorpush_backoperator[]insertprintElements 本实现版本 和 C STL标准库实现版本的区别&#xff1a; 基本概念 vector数据结构和数组非常相似&#xff0c;也称为单端数组vector与…

IP SSL证书使用率大幅度提升

IP SSL证书的使用人数在增长&#xff0c;这一趋势背后有几个推动因素&#xff1a; 1.网络安全意识提升&#xff1a;随着网络安全事件频发&#xff0c;用户和企业对数据保护的重视程度日益增加。IP SSL证书能为基于IP地址直接访问的网站或服务提供加密&#xff0c;有助于防止数据…

深入了解常用负载均衡软件

在构建高性能、高可用的分布式系统时&#xff0c;负载均衡技术扮演着至关重要的角色。它通过合理分发网络请求到后端服务器集群&#xff0c;从而有效提升系统吞吐量、减少响应延迟、并保障系统的稳定运行。本文将介绍几种常用的负载均衡软件&#xff0c;包括它们的优缺点、应用…

高效空气净化器大揭秘,不要再花冤枉钱了!对付“灰尘、毛絮”真好用

最近因为天气炎热的原因&#xff0c;基本上家家户户每天都在开窗通风透气&#xff0c;这就导致很多家庭一直饱受灰尘、毛絮等问题的困扰。 即使天天打扫&#xff0c;家里各处依旧能够找到灰尘、毛絮的踪迹&#xff0c;让很多人苦不堪言。甚至有一部分的灰尘毛絮又聚集在了一些…

C语言中字符串处理函数

目录 前言 1. strlen 测字符串长度函数 2.字符串拷贝函数 2.1strcpy 2.2 strncpy 3.strcat字符串追加函数 4. strcmp/strncmp 比较函数 5.字符查找函数 5.1 strchr 5.2 strrchr 6.atoi/atol/atof字符串转换数值 总结 前言 从0开始记录我的学习历程&#xff0c;我会尽…

Freemaker 模板

背景 发送邮件&#xff0c;正文利用freemaker完成 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId> </dependency>Autowired private Configuration configurer;GetMap…

04 - matlab m_map地学绘图工具基础函数 - 设置网格

04 - matlab m_map地学绘图工具基础函数 - 设置网格 0. 引言1. 关于m_grid2. 关于m_utmgrid3. 结语 0. 引言 本篇介绍下m_map中网格设置有关的函数m_grid和m_utmgrid&#xff0c;其中m_grid较为常用&#xff0c;m_utmgrid为设置UTM网格&#xff0c;仅支持在UTM投影下使用。 首先…

【数据库系统概论复习】关系数据库与关系代数笔记

文章目录 基本概念数据库基本概念关系数据结构完整性约束 关系代数关系代数练习课堂练习 语法树 基本概念 数据库基本概念 DB 数据库&#xff0c; 为了存用户的各种数据&#xff0c;我们要建很多关系&#xff08;二维表&#xff09;&#xff0c;所以把相关的关系&#xff08;二…