随想006:帮忙的时机

2023-05-16

我一直不理解发生在我身边的一个现象。

从我第一次发现到现在已经几年了,在一个又一个人身上,不断地出现。

在编程界,重复 可能是软件中一切邪恶的根源,我为此吃过苦头。让我记忆尤深的是,当重复代码需要修改时,你要记得改变所有重复处。这不是你是否能记住的问题,而是你何时忘记的问题。

当新人向我请教问题,我得以看到他们的代码。当我看到代码中有重复时,总是想让他们避免我曾吃过的苦头。于是我暂停当前的问题,告诉他们这里存在代码重复,为了引起他们的注意,我会告诉他们重复的危害,以及改正方法。

让我不解的事情就此发生。当我过几天查看他们的代码时,在不同的时候,不同的人身上,从来没有一个人修改重复代码,哪怕只是简单到把重复部分提取为一个函数。

重复是一件无伤大雅的小事吗?

我想不是的。
无论是《程序员修炼之道》、还是《代码整洁之道》,它们都强调要遵循 DRY 原则系统中的每一项知识都必须具有单一、无歧义、权威的表述。重复代码是违反 DRY 原则最为明显的例子。

为何称其为 DRYDRY - Don’t Repeat Yourself(不要重复你自己)。

所以对编程而言,消除重复是一件天大的事情。甚至有人说“自函数发明以来,软件开发领域的所有创新都是在不断尝试从代码中消灭重复”。

这也是我困扰的原因,我已将重复的危害告诉了他们,为何他们还是置之不理?

我的经验对别人来说是一文不值吗?

直到不久前,我知道了原因。

因为他们不需要

与人类需求层次理论类似,当一个人还为挨饿受冻担心时,跟他谈论个人理想抱负是不现实的。同样,这些新人还在为实现功能而担心时,跟他谈代码质量,他们不需要,也不关心。

从他们向我请教的问题就能看出来:“朱工,我这个 ADC 采集数据是错误的,你能帮我看下吗?”、“朱工,我 Ping 不通板子,你能帮我看下网络部分吗?”

这都是功能实现问题。

在进度的压力下,实现功能,无疑更具有吸引力。

再回到人类需求层次理论,人解决衣食住行后,会自然的追求友情、爱情,追求自尊和尊重。当新人程序员实现功能后,他们会自发的追求代码质量吗?

就我接触到的人来说,完全不会

当一个项目实现功能后,一些项目会安排我进行代码审查。

对于刚工作3年内的新人,我进行代码审查的标准很简单:

  • 不能有重复
  • 不能有魔法数
  • 函数体不大于 80 行
  • 函数嵌套不大于 3 层
  • 圈复杂度不大于 15
  • 遵循单一职责原则:一行代码只做一件事、一个变量只做一件事、一个函数只做一件事
  • 命名要准确清晰。

在审查的过程中,如果我发现了BUG,他们会很积极的修改,但如果是提升代码质量的重构,比如要求用宏来替换魔法数、用函数封装重复代码、将复杂函数拆分成简单小函数等,他们就会开始找理由、找困难,他们开始抗拒。

在我看来,提升代码质量非常重要,高质量代码更清晰,所以可以减少BUG的产生,高质量代码更好修改,所以更适应未来的需求变化。为什么新人对提升代码质量没有明显兴趣?

因为我所提出的一切关于提升代码质量的观点,新人都没有共鸣

的确,刚刚接触编程的小伙子对代码质量标准是不会有什么感觉的。

要对这件事有感觉,需要经历几个不愉快的项目。

他们没有吃过代码重复的苦头,没有维护过整个项目只有一个超过10000行代码的 main.c 文件、没有经历过一个简单需求改出一堆连绵不绝 BUG 的崩溃事件。

没有类似的经历,就不会有共鸣。

你说得再正确,也改变不了他人。除非他们自己想要了解,不然你就一点办法也没有。就像我进行的代码审查,因为他们不能理解其中的重要性,所以不愿做,最后变成了我指出一个地方,新人修改这个地方,就这么软抗拒。

虽然我很想告诉他们目前不知道的编程法则,但如果他们自身没有这种需要,我就在白费力气。

换句话说,要是没有求助,不要主动帮忙






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
千金难买知识,但可以买好多奶粉


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

随想006:帮忙的时机 的相关文章

随机推荐

  • echarts 黑色样式

    lt THIS EXAMPLE WAS DOWNLOADED FROM https echarts apache org examples zh editor html c 61 dataset simple1 gt lt DOCTYPE
  • 磁盘分区

    磁盘 xff1a 可以被分区成多个分区槽 xff08 partition xff09 以Windows来看 xff0c 磁盘可以被分区为 C xff1a xff0c D xff1a xff0c E xff1a 槽 C D E就是分区槽 而L
  • 【STM32】IAP下载程序分析

    IAP下载程序分析 IAP基本原理STM32启动流程程序跳转代码实现总结 IAP基本原理 要实现STM32的IAP xff08 在应用编程 xff09 xff0c 需要分别建立bootloader和app工程 这里的bootloader程序
  • vue el-date-picker 设置可选近30天且时间范围为7天

    对 el date picker 限制 xff1a 默认选择时间范围为最近一天 xff1b 设置快捷选项 xff1a 最近1天 最近3天 最近7天等 xff1b 限制只能选择今天以及今天以前30天 xff1b 选择一个时间之后 xff0c
  • MySQL索引分析

    1 索引是什么 xff1f 索引是一种能提高数据库查询效率的数据结构 它可以比作一本字典的目录 xff0c 可以帮你快速找到对应的记录 索引一般存储在磁盘的文件中 xff0c 它是占用物理空间的 正所谓水能载舟 xff0c 也能覆舟 适当的
  • 任务是如何调度(切换)的?

    学习任务的切换有助于自己理解操作系统的运行过程 并且任务的调度 xff08 切换 xff09 也是操作系统中的重要的部分 任务的切换中关键是任务控制块的控制 xff0c 将现在以及将来要运行的任务向堆栈中的存储与恢复 因为 C OS II总
  • 机器学习算法五:随机森林(Random Forest)

    集成学习 xff1a 通过构建并结合多个学习器来完成学习任务 xff1b 集成学习中主要包括boosting算法 和bagging算法 xff1b boosting算法 xff1a xff08 线性集成 xff09 关注于降低偏差 xff1
  • 怎样利用VNC远程连接LINUX桌面

    关于显示等问题都有 xff0c 比较详细 http blog csdn net zhouyunjie archive 2008 11 27 3396824 aspx 先要修改 vnc xstartup文件 bin sh Uncomment
  • VNC多用户

    1 为vnc建立用户 newuser 2 拷贝 root vnc 里的xstartup文件到用户目录 home newuser 3 修改xstartup文件 xff0c 在最后增加 xff1a gnome session amp 4 以ne
  • 【环境配置】初试使用mitmproxy搭建网络代理

    初试使用mitmproxy搭建网络代理 1 参考文章 老版本的很多功能已经不能用了 xff0c 用新的版本研究了一下 参考文章 https mitmproxy org http www freebuf com sectool 76361 h
  • 关于Keil 的快速注释功能,并为其添加快捷键

    原地址 xff1a http blog sina com cn s blog 6859cadf0101i3p4 html Keil版本uVision 4 03 1 在Keil gt Edit gt Advanced中有两项 Comment
  • 【OpenCV】ArUco Marker

    1 创建 span class token keyword import span cv2 span class token keyword as span cv span class token keyword import span n
  • 非常实用,华为、新华三、锐捷交换机的配置命令分享

    干弱电这一行难免会接触到交换机 xff0c 华为 新华三锐捷交换机又是最常见的交换机 xff0c 关于他们的命令配置很容易弄混 xff0c 而且在实际项目配置中也很容易出错 xff0c 因此 xff0c 本期我们将来介绍这三家交换机的基础配
  • 打飞机小游戏

    设计目标 xff1a 高质量的代码要有这些优点 复用性好 扩展性好 维护性好 可移植性好 健壮性好 效率好 可读性好 所以设计代码的时候不要只想到功能的实现 xff0c 还要考虑功能的扩展及代码复用等 设计规则 xff1a 需求分析抽取共性
  • windows 安装 Navicat Premiun

    Navicat Premiun 中文网站 Navicat Premiun 官网下载 简介 Navicat Premium 是一套数据库管理工具 xff0c 结合其它Navicat 成员 xff0c 支持单一程序同时连接到 MySQL Mar
  • 论文排版中MathType的使用(论文投稿必备)

    使用mathtype往论文中插入公式时 xff0c 若需要编号 xff0c 则点击 右编号 xff08 若只需插入文本行内 xff0c 则点 内联 xff09 由于论文是分栏格式 xff0c 单行公式太长导致编号串行 xff0c 因此需要将
  • python语言中变量的共享引用及原处修改

    代码段一 xff1a 代码段1 gt gt gt a 61 6 gt gt gt b 61 a gt gt gt a b 输出 xff1a 6 6 上述代码段一中 xff0c 第一行我们创建了对象6 xff0c 并将变量a 与之相关联 xf
  • 通用环形缓冲区 LwRB 使用指南

    什么是 LwRB xff1f LwRB 是一个开源 通用环形缓冲区库 xff0c 为嵌入式系统进行了优化 源码点击这里 Github LwRB 特性 使用 ANSI C99 编写FIFO xff08 先进先出 xff09 无动态内存分配 x
  • Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端

    基于 TCP 的服务器端 客户端 绝大多数 TCP 服务器端都按照如下顺序调用 xff1a 在 Windows 环境下 xff0c 代码表示为 xff1a WSADATA wsaData span class token punctuati
  • 随想006:帮忙的时机

    我一直不理解发生在我身边的一个现象 从我第一次发现到现在已经几年了 xff0c 在一个又一个人身上 xff0c 不断地出现 在编程界 xff0c 重复 可能是软件中一切邪恶的根源 xff0c 我为此吃过苦头 让我记忆尤深的是 xff0c 当