(点击上方公众号,可快速关注)

“这不可能啊”、“见鬼了”。。。这是每个程序员都听过或说过的迷之言语。这些话基本上说明有人已经“撞邪”了。编程实际上是一项复杂的系统性工程,包括构思、实际编码和测试等阶段,每一阶段都极有可能产生错误,而且本身计算机容错性是有限的,所以出现错误是再非常正常的,我想应该没有人编程没出过错吧。

背景

为啥要写这篇文章呢,这是因为最近一段时间碰到两个“不可思议”的bug,百思不得其解的那种。

第一个bug由删除一行代码导致。这行代码,我清晰地记得当时我想了很长时间最终并没有删除,但最后的提交却包含了删除改动。常常有人说鬼压床,我怎么感觉有鬼压delete键呢。

第二个bug也是由删除一行代码导致。有个功能要迁移到另一个服务,这个功能我是完全拷贝过去的,但是最后发现代码却少了一行,不是代码块的开头和结尾,而是中间的一行。这排除了我复制不全的可能,但又是怎么删除的代码呢?

原因分析

代码的bug虽然好找,但找到产生这些bug的原因却不容易,这往往跟个人的习惯强关联,所以回溯和反思自己的行为变得尤为重要。思来想去,产生以上bug的原因有以下可能:

  • 当时头脑是混乱的

    在大脑是混沌的状态很容易做出错误的决策,即使感觉当时是“清晰”的,但怎么能相信当时的大脑印象呢--你觉得没删,但实际上却删了。

  • 当时可能有人打扰

    这种情况很多见。思维的连续性能有效保证编码的质量,这已经是人人皆知的真理,但在实际工作中,这种环境却很难满足。一会这边找人查问题,一会来人谈需求,过会可能还会有人催进度,等等,甚至有时候同时处理多件事。为啥很多程序员喜欢大半夜工作,因为半夜安静更能集中自己的注意力,当然这是不好的习惯。在思维的切换过程中,丢掉一些信息点是很正常的。

  • 不小心碰到了删除键

    有可能你在“左手指月”的时候碰到了删除键,或者办公桌上的一些小物件倒了压到了删除键。。。虽然可能性看起来不高,但真的是很有可能的。

培养好的编码习惯

通过上面的原因分析,可以看到这个bug本身跟编码习惯息息相关。良好的编码习惯是驱除这些“邪门”bug的最佳途径。这些编码习惯包括:

  • 放下傲慢,重拾敬畏

    现实是很复杂的,一些“看起来正确”的推理是站不住脚的。比如,上面提到的第二个bug,如果简单的认为完全的拷贝代码而不需要检查,那就会出现上面的问题。实际上现实中还有很多奇怪的现象,比如,服务以前没问题,加了一行人畜无害的代码,服务竟然崩溃了。。。所以,我们要有敬畏之心,认真对待每次改动。

  • 及时提交

    这条主要为了减少后续代码出现异常改动的可能性。如果代码已经检查完毕,要尽快的提交,在前面的文章 【Git】怎么样才是好的提交 有提到这点。

  • 不要一心二用

    经过实践证明,一心二用是行不通的。当然有些人看起来好像挺享受一心二用,包括以前的我,之所以没出错,很可能是当前处理的事情的复杂度较低,或并行度不高。如果难度增大,没有人不出错。编程是一项复杂度高的系统工程,即使一心一用都可能导致出错,为何要进一步增加出错的概率呢?

  • 严格执行代码审查

    这一步是最重要的,是问题代码进入master分支的最后一步,一定要认认真真执行。如果工作配置不具备,自己可以执行,一行一行代码地审读。如果这一步我能做好,估计上面的两个bug就没有了。

鸣谢:封面图标来源Becris的作品。

好的编码习惯是一场代码驱邪仪式相关推荐

  1. 良好的编码习惯 —— 5 个提高代码质量的技巧

    原文地址:Good Coding Practices – Five Tips to Enhance Code Quality 原文作者:Jay 译文出自:掘金翻译计划 本文永久链接:github.co ...

  2. 程序员你为什么这么累【续】:编码习惯之工具类规范

    导读: 程序员你为什么这么累? 我的编码习惯 - 接口定义 我的编码习惯 - Controller规范 我的编码习惯 - 日志建议 我的编码习惯 - 异常处理 我的编码习惯 - 参数校验和国际化规范 ...

  3. 我的编码习惯 —— API 接口定义

    工作中,少不了要定义各种接口,系统集成要定义接口,前后台掉调用也要定义接口.接口定义一定程度上能反应程序员的编程功底.列举一下工作中我发现大家容易出现的问题: 1. 返回格式不统一 同一个接口,有时候 ...

  4. 第十四期:5 个 JS 不良编码习惯,你占几个呢?

    在阅读JavaScript代码时,你是否有过这种感觉:你几乎不明白代码的作用?代码使用了很多 JavaScript 技巧?命名和编码风格太过随意? 这些都是不良编码习惯的征兆. 在阅读JavaScri ...

  5. 程序员你为什么这么累【续】:编码习惯之日志建议

    转自:https://mp.weixin.qq.com/s?__biz=MzAxODcyNjEzNQ==&mid=2247484164&idx=1&sn=8351e9fb42e ...

  6. python编程能力等级测试_测试不得不知的python编程小技能-----升级版基础语法和优秀的编码习惯...

    编程和学习python,最后快速上手.能写小工具,写自动化用例这类要求对鹅厂的测试人员来说都是一些基础的必备素质,但是一个优秀的测试,也是有着一颗开发完美测试工具的心的.但是罗马不是一天构建成,特别是 ...

  7. 我的编码习惯 —— Controller规范

    今天来说说大家关注的AOP如何实现. 先说说Controller规范,主要的内容是就是接口定义里面的内容,你只要遵循里面的规范,controller就问题不大,除了这些,还有另外的几点: 1. 所有函 ...

  8. 团队项目开发“编码规范”之九:代码分析

    团队项目开发"编码规范"之九: 代码分析 发布日期:2011年3月17日星期三作者:EricHu                                           ...

  9. 常规、LFM、相位编码、频率编码等雷达调制信号代码(MATLAB)

    介绍 有关傅里叶变化介绍的优秀博文:点这里真的超级有惊喜 雷达信号调制种类: 常规脉冲信号 参考博文: 博文1 博文2 优秀博文:主要参考 matlab代码: 加高斯白噪声:awgn(x,SNR) c ...

  10. 从一副漫画说编码思维,编码习惯,编码风格 (条件判断,死代码,true 或false)

    漫画中机器人要杀了人类,但是那个程序员说他并没有写代码让机器人杀人类啊!! 代码中确实给isCrazyMurderingRebot赋值了false作为初值,开发者的本意也是永远不要让它变为true,永 ...

最新文章

  1. 知乎讨论:有必要将所有机器学习算法都实现一遍吗?
  2. win7清除系统托盘图标的方法
  3. Git复习(五)之多人协作、git push失败、git pull失败
  4. C# 如何用代码触控件的事件
  5. 多久没有给家里打过电话了?
  6. 北航教授李波:说AI会有低潮就是胡扯,这是人类长期的追求
  7. python中import os_Python常用模块os--与操作系统交互
  8. JAVA8之妙用Optional解决判断Null为空问题
  9. python render_requests-html库render的使用
  10. div常用效果方法-transform
  11. ios build fdk-aac
  12. 普元EOS更新license
  13. 麦肯锡方法:解决问题的七个步骤
  14. SQLite数据库锁机制研究
  15. 【DIY小记】踏平Win10升级之坑——我们无法更新系统保留的分区
  16. win7计算机锁频图片怎么设置,Win7电脑锁屏壁纸怎么设置?Win7系统设置锁屏壁纸的方法...
  17. 2020年宁夏回族自治区水稻种植分布数据
  18. Java面试不通过?这篇文章你看了吗?
  19. 膨胀腐蚀-OpenCL加速及kernel变成二进制文件
  20. DDOS攻击检测和防护

热门文章

  1. 淘宝API签名异常,如何正确计算SIGN参数?(error code:25 Invalid Signature)
  2. 松翰单片机 c语言例程 宏定义出错,求助.松翰单片机 2714 用仿真器可以 , 但是烧到单片机不行. (amobbs.com 阿莫电子论坛)...
  3. PTA 哈利·波特的考试(Floyd计算最短距离并输出路径)
  4. flink的流处理的source
  5. python明文密文_python实现对输入的密文加密
  6. Python全栈笔记(六)
  7. 西数完善黑盘系列 3TB黑盘终面市
  8. 读网卡MAC地址的几种方法
  9. 安装Mendeley后Word中没有出现对应的Mendeley插件
  10. 机器人定位误差标定模型