3.1 代码审核机制

2023-11-05

一次咨询活动,同一朋友交流基于复用的架构设计理念时,他说:“你讲的那个很好,但离我们现状有点远。我现在每天要编码、要开会、要出差、要交流、要带人、要流程,招个能干的人可难了,而刚做顺手的就想跑,留一堆代码让我擦屁股……”一段话不知道出了多少一线工程师的心酸,我们又有多少人是整日忙的晕头转向而最后却又碌碌无为。

额外,这段话也道出了一个关键点,我们的技能提升是分层次的,跨层次对话,如和饥饿的人交流饮食品味一般,适得其反。从入职到架构师,我将整个嵌入式成长之路分为了多个层次:入职——团队——抽象——复用——架构——标准化。现在,我们迈过了入职陷阱,开始进入团队构建层次。

在继续之前,我想让大家做一个简单推理,设想一下:如果你是我那个朋友,在这种工作状态下再继续十年,会是什么样子呢?记不得在哪儿摘录的一段警世危言,或许会带着我们穿越时间。

“一名优秀工程师的成长需要时间
但仅仅靠时间堆砌,却难以培养出一名优秀的工程师
让人无奈的是,国内工程师的成长环境恶劣
导致所谓的十年工作经验,仅仅是十年工作经历而已
或悲催的转行,或无奈的继续,不小心陷入中年危机
然而上有老,下有小…… ”

朋友们,抬眼往四周看一看吧,那些早腻烦工作混日子的人,那些被迫转型但举步维艰的人,甚至是那些身陷工作经济困局而跳楼的人,比比皆是。如果你不试着改变,你就会成为下一个。

如何走出这个困局呢?软件工程的研究成果早就告诉我们答案,通过代码审核机制,完成从个人到团队的锐变。

代码审核,英文名为code review,是指他人对计算机源码的审查,是软件编码(code)和提交(commit)之间的一个重要流程,用于提升软件质量。

我花了很大功夫,也走了很多弯路,才在自己团队内部形成有效的代码审核习惯。但是,当我跌跌撞撞站到了彼岸,我惊喜的发现,所有的辛苦都是值得的。

大家可能会有这样的体会,工作经验丰富到一定程度后,大部分工作可以立即排出个一二三来,也知道哪些点容易出错,但即使如此,如果所有事都亲力亲为,依然需要花不少时间。控制好关键节点,交由团队其他人并进行审核,其结果等价于自己在做。此时,好似所有的人都成为你的臂膀,那种如臂使指的感觉,或许只有亲历过来能真正体会。

因为所有的代码都处在动态审核中,某工程师即使提出离职,我一般能在两到三天内完成工作交接,再也不会出现以前那种因某人离开而塌掉一块业务的被动局面状态。

稀缺会引发进一步的稀缺,当你忙的一塌糊涂时,你很难有机会去尝试如何提升工作效率。审核机制,给我带来最大的价值就是时间开始适度富余了,我不仅能出色的完成了各项本职工作,而且开始有时间去思考、总结、提升,这些都有助于进一步提升工作效率。

因此,职场的朋友们,您哪怕爬,也要爬过这一层境界,然后借助团队的力量,铺就你成长的阶梯。

◇◇◇

代码审核,直白一点就是阅读别人的代码吗!相信大家都有读他人代码的痛苦经历,也经常会埋怨弄懂这段垃圾代码,还不如重写一遍呢。因此,推行代码审核机制,从来都是知易行难的一件事。

为了让代码异于阅读,制定编程规范是首当其冲的问题。统一的编程规范,至少会让别人的代码看起来像自己的代码,因此,各公司都制定了各种五花八门的编程规范。但即使是这么一点点小小的要求,推行起来也阻力重重,大多情况下最后都会不了了之。

起步艰难,形成有效的代码审核机制更是不易,为何会这样呢?又怎么办呢?

我刚参加工作时,接触过一款产品,其架构设计挺优秀的,甚至可以说是我初学架构设计的奠基石,但该产品最后却走向了被淘汰的命运。

为何会出现这样的现象,或许代码中的一段注释会给你答案:我今生最倒霉的事情就是接了这段代码,这段注释后面还附有很多条血泪史。

在《clean code》一书中,bob大叔认为在代码阅读过程中人们说脏话的频率是衡量代码质量的唯一标准。同理,《编写可读代码的艺术》一书中,作者也提到程序员之间的相互尊重体现在他的代码中,也能体现他对工作的尊重。

无数的血泪史告诉我们,代码最重要的读者不是电脑,不是解释器,不是编译器,是人,是我们的同事,是三个月后的我们自己。代码不是用复杂技巧表现自己多牛叉的,而是需要让他人快速理解、轻松维护、容易扩展,这样才配得上一个专业程序员的情怀。

道理没错,但我们在执行方面却举步维艰。

记得领导让我开始整理编程规范时,作为一个典型的外向型IT男,有表现机会,当然跃跃试试了。因此我开始下功夫,从网上找了MISRA规范,华为编程规范等,然后将其中的精华(当时能力有限,基本看到的都是精华)都找出来,然后汇聚成了一本超百页洋洋洒洒的C编程规范第一版。

其后的结果估计大家应该能猜到了,我被炮轰的体无完肤了。想想也是,几百条的规范不说执行,仅记忆都是一件不可能的事情,再说即使执行了,又如何审核呢。

初次尝试就以这样的方式没了下文,但整理规范这件事本身对我还是有影响的,自己在写代码时,潜移默化的总是会用到一些,再然后,就潜移默化的影响到了身旁的人,影响到了自己所在的项目组。一段时间之后,一组员在阅读其他组代码时,发现别人的代码已没法读了。暮然回首,原来我们已在灯光阑珊处。

不经意间的成功让我开始深入思考编码规范如何推广的问题。我思考了良久,得出两个结论。

第一点:再多的编程规范,再多的教条,也赶不上一段优秀代码。每个人都有追逐优雅的天性,当好东西都被拿来占为己有时,编程规范自然推广下去了。

这一条,实际上慢慢的成为了我后来的工作准则之一。连自己都做不到的事情,不要去要求别人。将自己的代码交由别人审核,很快就能带出多个自己。

第二点:初期推广,需要保证大家半小时的注意力能够听完一遍。

我看过一本讲解脑科学的书籍,说人脑记忆力非常有限的,3条最佳,5条尚可,超过7条就开始左脑进右脑出了,而且半个小时内,大家也顶多学习5条。因此,我发狠,原先300条的编程规范,一定、必须、无论如何也要压缩到五条。

反复的割肉放血,第N版的编程规范终于出炉了,依次如下:
1. 云深不知处——文件全局观
2. 灭绝裹脚布——编码细节观
3. 代码如天书——约定注释
4. 相见不相识——统一名称
5. 懒人大法——借助工具

因为其中第五条是探讨如何通过工具辅助实现前四条的,都不好算作编程规范了,因此,我们团队内部经常戏称为四条半编程规范。后续,我会用连续的五篇内容分别介绍每条规范的来龙去脉。

返回目录

——————————————

我是小马儿,一个渴望良知与灵魂的嵌入式软件工程师,欢迎您的陪伴与同行,如需最新版PDF电子书,或期望深入交流,可加我个人微信nzn_xiaomaer,需备注“异维”二字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3.1 代码审核机制 的相关文章

  • 使用vscode把代码或文件夹上传进gitee库里

    1 首先读者自行下载 git 2 在gitee中新建一个仓库 3 建完仓库后会出现以下界面 4 复制图中1 选择你个你想要的文件夹 右键选择 5 之后会跳出来一个小框框 把图中2和3分别复制进小框框里 ctrl v没用 右键选择Paste
  • CObject/CCmdTarget/CCmdTarget三个类的能力

    三个类的能力分别为 CObject 运行时类型识别 RTTI 动态创建 Dynamic Creation 文件读写 Serialization CCmdTarget 消息机制 拥有DECLARE MESSAGE MAP宏 从而可以接收WM
  • 二十二、SQL 数据分析实战(案例1~案例10)

    文章目录 案例1 用户信息表 stu table 案例2 员工绩效表 score table 案例3 销售冠军信息表 month table 案例4 月销售额记录表 sale table 案例5 每季度员工绩效得分表 score info
  • Kubernetes 入门 篇 Master 节点的安装与部署

    在安装K8s 的时候 遇到了很多问题 花了几天的时间排错 记录一下环境搭建的完整过程 希望对入门K8s 的朋友有所帮助 操作系统版本 CentOS Linux 8 Docker 版本 Docker version 23 0 1 运行 Kub
  • 迷茫

    读了两年的软件工程 迷茫始终伴随着自己的前行道路 我想吃计算机这碗饭 我又不想吃太久 这个问题我都感觉很吃屎 大一刚开始 学的是C语音 老师就是按着书本的知识给你讲 数据类型 函数 控制语句 数组 指针 文件 讲完之后 这些东西还是这些东西

随机推荐

  • 常见排序算法(下)

    目录 1 交换排序 1 1交换排序的基本思想 1 2冒泡排序 1 3快速排序 1 3 1Hoare 1 3 2挖坑法 1 3 3 针对性的优化 1 3 4前后指针法 1 3 5非递归实现快速排序 2 归并排序 2 1递归实现归并排序 2 2
  • 4.POD 的基本用法

    文章目录 POD 的基本用法 1 POD运行说明 2 POD封装容器的用法 3 POD 共享的处理 4 POD 配置 4 1 ConfigMap POD 的基本用法 1 POD运行说明 K8S 对容器运行的要求是主程序一直要在前台执行 如果
  • Qt基本数据类型

    有符号8比特数据 16位数据类型 32位有符号数据类型 64位有符号数据类型 Windows中定义为 int64 Windows中定义为 int64 除非配置了 qreal float选项 否则默认为double 无符号8比特数据类型 无符
  • Jenkins Pipeline 项目持续集成交互实践路径

    Jenkins Pipleline插件介绍 Jenkins 2 x的精髓是Pipeline as Code 是帮助Jenkins实现CI到CD转变的重要角色 什么是Pipeline 简单来说 就是一套运行于Jenkins上的工作流框架 将原
  • keil5 不进入中断_C51编程20中断篇(串行通讯3)

    MCS 51单片机提供了4种串口的方式 但是我们只有方式1最常用 可变的10位串行通讯方式 下面就方式1的使用进行讲解 在开始之前先明确一个概念 中断会产生中断标志位 而CPU检测到中断标志位后 如果没有其他更高的中断在执行 CPU会响应该
  • redis的缓存穿透 缓存并发 缓存失效

    学习网址 https www cnblogs com shuchen007 p 9656232 html 截选一个集体缓存失效解决办法 引起这个问题的主要原因还是高并发的时候 平时我们设定一个缓存的过期时间时 可能有一些会设置1分钟啊 5分
  • Java课题笔记~ JSP内置对象

    1 九个内置对象 jsp的内置对象 JSP内置对象是不需要声明和创建就可以在JSP页面脚本中使用的成员变量 九个内置对象 1 out对象 在JSP页面中 经常需要向客户端发送文本内容 这时 可以使用out对象来实现 out对象是javax
  • 帆软下拉复选框,层级树状选择

    treelayer函数 1 概述 语法 treelayer TreeObject Int Boolean String 定义 返回一个树对象 TreeObject 第 n 层的值 一般为树数据集 或下拉树 视图树等树对象 并且可以设置返回值
  • mysql大表修改字段导致锁表(非阻塞)

    线上数据库难免会有修改表结构的需求 MySQL 在修改表结构时会锁表 这就会影响读写操作 小表还好 一会儿就修改完成了 但大表会比较麻烦 下面看一个解决方案 一 方式一 解决思路 1 新建一个表 结构就是要修改后的结构 2 在旧表上建立触发
  • 整合vxgPlayer使chrome支持vxg_media_player播放rtsp视频,目前全网唯一chrome支持rtsp,rtmp流的播放器

    目前有一个关于接入海康监控进行视频融合的项目需求 按理说在前端技术发展如此迅速的今天 使用web播放一个视频应该是不算什么难事 只是万事都有意外 因很多视频厂家的监控数据都不是普通的mp4啥的 所以使用普通的object 或者video 是
  • 单片机STM32在开发中常用库函数详解

    1 GPIO初始化函数 用法 voidGPIO Configuration void GPIO InitTypeDefGPIO InitStructure GPIO状态恢复默认参数 GPIO InitStructure GPIO Pin G
  • 【Leetcode】107. 二叉树的层序遍历 II

    题目描述 题解 很简单 分层的层序遍历 并且插入List
  • kafka异常:Uncaught exception in kafka-producer-network-thread 异常:Kafka scheduler has not been started

    版本 kafka 2 11 0 8 2 2 client java client 现象 kafka写入数据失败 没有异常信息 kafka客户端生产者日志 服务器一 2016 04 25 10 53 31 764 ERROR org apac
  • 【sklearn】fit()、transform()和fit_transform()的区别

    fit Method calculates the parameters mu and sigma and saves them as internal objects 解释 简单来说 就是求得训练集X的均值 方差 最大值以及最小值等这
  • 一些适用于ARM Cortex-M系列的动态加载库

    当涉及到ARM Cortex M系列芯片时 有许多适用于该系列的动态加载库 以下是其中一些 C OS III 它是一个基于优先级的实时操作系统 支持多任务和动态库加载 它为Cortex M系列芯片提供了完整的支持 包括ARM Cortex
  • 把玩数据在内存中的存储

    前言 时光如梭 今天到了C语言进阶啦 基础知识我们已经有了初步认识 是时候该拔高拔高自己了 目标 掌握浮点数在内存的存储 整形在内存的存储 鸡汤 时光易过 岁月蹉跎 深度剖析数据在内存中的存储 1 数据类型的介绍 前面已经讲解过了 可以再看
  • vue-element-admin第一篇:vue-element-admin初始项目

    1 事前准备 下载项目 https gitee com mirrors vue element admin git 执行代码 npm install npm run dev OK 准备工作完成 如果有报错 请移步到度娘那里去 2 先分析模块
  • [YOLO专题-10]:YOLO V5 - ultralytics/detect检测代码的命令行参数详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122266884 目录 第1章 准备
  • python时序数据处理2--提取年月信息、时间作差等

    同样首先先生成时序数据 1 生成时序数据 import pandas as pd import numpy as np from datetime import datetime timedelta test pd date range 2
  • 3.1 代码审核机制

    一次咨询活动 同一朋友交流基于复用的架构设计理念时 他说 你讲的那个很好 但离我们现状有点远 我现在每天要编码 要开会 要出差 要交流 要带人 要流程 招个能干的人可难了 而刚做顺手的就想跑 留一堆代码让我擦屁股 一段话不知道出了多少一线工