怎样处理糟糕的代码?

在职业生涯中,程序员难免会遇到糟糕的代码(bad code)——但是你并不需要成为一个打败这些糟糕代码的“恶人”。

从轻松的角度来讲,糟糕的代码可以创造大量的就业机会。比如:

  • 需要从诸多优秀开发人员中找一个人来修复错误代码。
  • 需要一两个高级开发人员来做代码审查,确保代码以后不会再次变得糟糕。
  • 其他人还需要时不时地去咨询那位糟糕的程序员,以便弄明白这些乱七八糟的代码到底在干嘛。

也就是说,我们都有过类似经历。我们不知疲倦地加班加点,试图去解决一个特别麻烦的错误,这时我们发现一个代码块,而它就是问题的根源。当你试图弄明白这堆一团乱麻的代码的意义时,却发现这段代码根本无法阅读,逻辑混乱不堪,且完全未加任何代码注释,你会倒吸一口凉气,然后开始咒骂:

“这到底是谁写的代码?”

“谁竟然如此愚蠢?”

“怎么会有人写出如此毫无条理、人神共愤的代码呢?”

但我要说,这并不是正确的解决方式。毕竟,我们所有人,在某些时期都会写出糟糕的代码。可以这么说,在这个星球上,每一个开发人员都会在他的一生中制造出安全漏洞、不匹配的 UI 元素,而且绝对不止一次犯下这些错误。不能就此评价说这个开发人员很糟糕。我们都是人,是人就会犯错。

作为一名优秀的开发人员,你对糟糕代码的处理方式与你未来的职业发展有很大关系。优秀的开发人员会抛开个人或群体恩怨,对代码进行更深入透彻的理解,而不是将他们的愤怒情绪一股脑儿发泄到那些编写糟糕代码的倒霉开发人员身上。

优秀的开发人员会尽量避免主观性评价,对糟糕的代码给予建设性的、客观的批评,这样糟糕的代码就不会卷土重来。他们把解决这些糟糕的代码转化为学习和分享的机会,这样每个人都能从中受益。

这里我想分享一些优秀的开发人员处理糟糕代码的方法。

1. 识别问题

美国音乐家“艾灵顿公爵”有句话说得很对:

“问题是让你竭尽全力去努力的机会。”

请带着好奇心和同理心去解决问题。一般来说,代码的问题在于,编写代码有多种方法,而没有一种方法称得上是最好的方法。所以在评估代码前,试着找出这样写代码背后的原因。设身处地为其他开发人员着想,并找出问题所在。

程序员往往很固执。他们不喜欢被别人告知他们自己的错误。所以,正确的方法是对他有足够的同理心,找出是什么原因让他们写出如此随处可见的 goto 语句,如此层层嵌套的 switch 语句,以及如此晦涩难懂的变量命名。只要有足够的同理心,你很快就会弄明白背后原因。

“我必须在 1 小时内完成代码”

“没有可用的 API”

“我的领域知识有限”,等等……

通过识别问题,你不仅可以从代码原作者的角度来看待问题,还可以提出具体的解决措施来纠正代码,而不是在黑暗中对别人进行盲目攻击。

2. 谨慎提问

英国哲学家弗朗西斯·培根有句名言:

“一半的智慧来自于谨慎的提问。”

一旦你识别了代码问题,下一步就是与你的同事坐下来,提出一些更深入的问题。这里的关键词是“谨慎”。最好的做法是确保问答环节不会演变成一场像西班牙宗教审判一样残酷无情的审问。

对历史爱好者来说,西班牙教士托尔克玛达在费迪南德二世国王和伊莎贝拉一世女王的帮助下建立。在西班牙宗教审判所时期,许多人在街上围观人群面前被活活烧死。实际上,西班牙宗教审判所的作用是为了巩固新统一的西班牙王国的君主制,但它却是通过这种臭名昭著的残忍手段来达到这一目的。

通过问合乎逻辑的问题,你不仅能巩固自己对问题的理解,而且还允许其他开发人员对错误产生自我认识,并以此让他学会运用正确的自我质询来改善自己的代码,他需要在编写代码前用这些问题来进行自省。

通过提问,你也表明了你对他的观点持开放态度。当你的同事感到受到尊重时,他们就不太可能持有防御性态度。

一旦你找到错误和原因,你就有责任在整个团队中传播睿智的话语,这样以后就没有人再编写糟糕的代码了。

3. 抑制重写代码的本能

美国作家 Anthony J. D’Angelo 有一句名言说得很中肯:

“不要重新发明轮子,而是去重新调整它。”

编写高质量的代码会比编写前面所提及的糟糕代码花费更多时间。有时候,更快地“把某样东西做出来”在商业上是有其意义的。

Kimber Lockhart 在一次黑客峰会的演讲中曾经说过,开发人员在处理糟糕代码时所犯的最大错误之一就是去重新编写代码。大多数情况下,重写代码并不能解决糟糕的代码。因此,在采取这重写代码这一步骤之前,不妨先问许多问题:

重写后的代码一定会比旧版本更好吗?

从成本效益的角度来分析,值得付出这样的精力吗?

真的是所有的旧代码都很糟糕吗,或许我们可以重用很多旧代码?

等等……

她提出了一个包含三步骤的方法来处理糟糕的代码。

  • 对代码进行优先排序。首先需要解决哪一部分问题?我们能保留代码的其他部分吗?
  • 封装处理糟糕的代码。仍然让旧代码保持运行,但通过把它封装在一个模块中使其与其他新代码分离,这意味对于这段代码除了修复外,其他人不能再对它添砖加瓦。虽然旧代码仍然可以被调用,但是对它的封装可以防止糟糕代码的进一步传播。
  • 凸显糟糕的代码。显式地标记糟糕的代码,这样就没有人复制这些糟糕的代码让问题变得更加复杂。Lockhart 建议删除糟糕代码,但是要小心地进行删除操作。而且建议为了准确识别要删除的代码,每周花几个小时来创建一个自动化系统,这对于系统的长期清理来说是一个很好的实践。

关键是要从最坏的情况中找出其最好的部分,并以缓慢而稳定的方式来消除最坏情况。并不是所有糟糕的代码都是技术债造成的,如果在这些代码中也有不错的部分,我们应该聪明地对之进行合理重用和适应。

4. 最后,要谦虚

正如美国作家和演讲家 Zig Zigler 所说的:

“谦卑会比傲慢打开更多的大门。”

总所周知,骄傲导致许多悲剧英雄的堕落。

例如,简·奥斯汀的名著《傲慢与偏见》中的达西先生在得到伊丽莎白·班纳特的爱之前,不得不放下他的傲慢。而但丁把骄傲列为七宗罪之一。

我想大家都同意以上对于骄傲的看法。而与之相对的,谦卑的真正定义是一种安静的理解,即使你擅长你所做的事情,但你不期望别人过分赞扬你。

所以,如果你已经修正了代码,也不要让你的自负对你产生影响。不要得意忘形地向整个团队发送垃圾邮件。也不要一有机会就站在高处大声嚷嚷你的成绩。

要知道,你也是凡人,不可能毫无纰漏永不失误。你也可能会写出糟糕的代码并陷入同样的困境,当这种情况发生时,你需要的是每个人的帮助和支持。请永远不要忘记这一点。

简而言之,请以开放的心态处理糟糕的代码,学习,改进,然后你教育其他人去改进。

正如美国作家 Roy T. Bennett 所说的那样:

“要去改进,而不是找借口。要寻求尊重,而不是寻求关注。

作者介绍:

Ravi Rajan,总部位于印度孟买的全球 IT 项目经理。他还是一位狂热的博主、俳句诗人、考古学家和历史狂人。也是一个多产的作家,写作主题从人工智能到爱情,十分广泛。

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

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

相关文章

LeetCode 1706. 球会落何处(模拟)

文章目录1. 题目2. 解题1. 题目 用一个大小为 m x n 的二维网格 grid 表示一个箱子。 你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角线挡板,跨过单元格的两个角,可以将球导向左侧或者右侧。 将球导向右侧的挡板跨过左上…

android listview 异步加载图片并防止错位

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题。 我简单分析一下: 当重用 convertView 时&#x…

Python最实用的25个小技巧

Python 是一种通用的高级编程语言。用它可以做许多事,比如开发桌面 GUI 应用程序、网站和 Web 应用程序等。 并且,通过处理常见的编程任务,Python 能让开发者专注应用程序的核心功能。此外,Python 语言的简单语法规则进一步简化了…

LeetCode 1705. 吃苹果的最大数目(优先队列)

文章目录1. 题目2. 解题1. 题目 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。 在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i days[i] 天时&#xff0…

Action重定向总结

[HttpPost]public ActionResult StudentList( string StudName, string studName, DateTime BirthDay, FormCollection form, string controller, string Action, StudentModels student){//其中StudName为aspx页面中标签的name属性(StudName不区分大小写)//其中BirthDay为页面…

全面系统地总结Linux的基本操作(上)

1、 Linux文件和目录 Windows 和 Linux 文件系统 在 windows 平台下,打开"计算机",我们看到的是一个个的驱动器盘符:每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示: 在 …

Pytorch 神经网络nn模块

文章目录1. nn模块2. torch.optim 优化器3. 自定义nn模块4. 权重共享参考 http://pytorch123.com/ 1. nn模块 import torch N, D_in, Hidden_size, D_out 64, 1000, 100, 10torch.nn.Sequential 建立模型,跟 keras 很像 x torch.randn(N, D_in) y torch.randn…

全面系统地总结Linux的基本操作(下)

4、 Linux命令-系统管理 4.1 查看日历:cal cal 命令用于查看当前日历,-y 显示整年日历: 4.2 显示或设置日期:date 设置时间格式(需要管理员权限): date [MMDDhhmm[[CC]YY][.ss]] format CC 为年前两位 yy 为年的后…

腾讯QQ企业邮箱POP3/SMTP设置

腾讯企业邮箱支持通过client进行邮件管理。POP3/SMTP协议收发邮件server地址分别例如以下。接收邮件server:pop.exmail.qq.com (port 110)发送邮件server:smtp.exmail.qq.com (port 25)同一时候支持SSL加密方式登录,此时须要更改一下port号。…

免费个人博客:使用hexo+github搭建详细教程

前言 使用github pages服务搭建博客的好处有: 全是静态文件,访问速度快;免费方便,不用花一分钱就可以搭建一个自由的个人博客,不需要服务器不需要后台;可以随意绑定自己的域名,不仔细看的话根…

LeetCode 1235. 规划兼职工作(动态规划+二分查找)

文章目录1. 题目2. 解题1. 题目 你打算利用空闲时间来做兼职工作赚些零花钱。 这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]。 给你一份兼职工作表,包含开始时间 startTime,结束…

刷新页面,无论点击多少次让Element UI的Message消息提示弹出一个

一、遇到的问题 Element UI的Message消息提示是点击一次触发一次的。在开发的时候经常会作为一些校验提示,但是公司的测试人员在进行测试时会一直点,然后就会出现如下图的情况。虽然客户使用的时候一般来说不会出现这种情况(毕竟客户不会闲着…

如何让二维码自适应浏览器的尺寸

一、遇到的问题: 正常浏览网页,二维码正常显示,但是随着浏览器的扩大与缩小,二维码尺寸不会随着屏幕自适应 正常浏览(截取部分): 缩小浏览器(截取部分&#xf…

E6全部刷机包

此版本号基于R533_G_11.11.10P_GSZMCAUT679DA01B_LP064DA_T679DA_S005_E001_P002_R001_G004_1FF.sbf制作耳机接听或挂机正常内置Loader(asmotoe2)、Console(网上的大侠)、showQ(bint大侠)、SetupPKG&#x…

LeetCode 330. 按要求补齐数组(贪心)

文章目录1. 题目2. 解题1. 题目 给定一个已排序的正整数数组 nums,和一个正整数 n 。 从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数…

系统总结vue组件间通信、数据传递(父子组件,同级组件)

总结一下对vue组件通信的理解和使用。一、组件目录结构 父组件&#xff1a;app.vue子组件&#xff1a;page1.vue子组件&#xff1a;page2.vue 父组件 app.vue <template><div id"app"><p>请输入单价: <input type"text" v-model&qu…

LeetCode 1224. 最大相等频率(哈希)

文章目录1. 题目2. 解题1. 题目 给出一个正整数数组 nums&#xff0c;请你帮忙从该数组中找出能满足下面要求的 最长 前缀&#xff0c;并返回其长度&#xff1a; 从前缀中 删除一个 元素后&#xff0c;使得所剩下的每个数字的出现次数相同。 如果删除这个元素后没有剩余元素…

从零开始,手把手交给你vue如何新建一个项目

vue创建项目&#xff08;npm安装→初始化项目&#xff09; 第一步npm安装 首先&#xff1a;先从nodejs.org中下载nodejs 图1 双击安装&#xff0c;在安装界面一直Next 图2 图3 图4 直到Finish完成安装。 打开控制命令行程序&#xff08;CMD&#xff09;,检查是否正常 图5 …

数学图形(1.33) 棕子曲线

#http://www.mathcurve.com/courbes2d/vasques/vasques.shtml vertices 10000 t from 0 to (8*PI) a rand_int2(1, 30) b rand_int2(1, 4) n 8 x cos(n*t - t)*cos(n*t) y cos(n*t)^2 a 10 x x*a y y*a 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生…

LeetCode 1278. 分割回文串 III(区间DP)

文章目录1. 题目2. 解题1. 题目 给你一个由小写字母组成的字符串 s&#xff0c;和一个整数 k。 请你按下面的要求分割字符串&#xff1a; 首先&#xff0c;你可以将 s 中的部分字符修改为其他的小写英文字母。接着&#xff0c;你需要把 s 分割成 k 个非空且不相交的子串&…