写点什么

怎样处理糟糕的代码?

  • 2019 年 12 月 10 日
  • 本文字数:2727 字

    阅读完需:约 9 分钟

怎样处理糟糕的代码?


在职业生涯中,程序员难免会遇到糟糕的代码(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 项目经理。他还是一位狂热的博主、俳句诗人、考古学家和历史狂人。也是一个多产的作家,写作主题从人工智能到爱情,十分广泛。


英文原文:


How to Deal with Bad Code.


2019 年 12 月 10 日 13:271565

评论 3 条评论

发布
用户头像
文理兼修,可怕。每陈述一段话都能恰到好处地引用一位名人的名言。我只知道鲁迅先生讲了很多名言,但是具体有啥名言我也不知道。
2019 年 12 月 12 日 00:12
回复
用户头像
一个懂哲学的人写代码是一件很恐怖的事情。
2019 年 12 月 10 日 14:22
回复
哈哈,有点
2019 年 12 月 10 日 17:55
回复
没有更多了
发现更多内容

【技术加油站】揭秘百度智能测试规模化落地

百度Geek说

百度 测试 后端 智能化测试

Linux grep命令详解,手把手教你写

程序媛可鸥

Python 程序员 面试

OBV指标交易策略(累积能量潮与移动能量潮,成交量多空比率净额及相关应用原则)

程序媛可鸥

Python 程序员 面试

【愚公系列】2022年03月 Docker容器 RabbitMQ集群的搭建

愚公搬代码

3月月更

【愚公系列】2022年03月 RabbitMQ EasyNetQ的用法(window11+vs2022+.NET 6)

愚公搬代码

3月月更

18年程序员生涯,读了200多本编程书,挑出一些精华分享给大家

程序媛可鸥

Python 程序员 面试

百度一线工程师浅谈日新月异的云原生

百度Geek说

云原生 后端

百度交易中台之账房系统架构浅析

百度Geek说

百度 架构 后端 交易中台

解密GaussDB(for Influx)时序洞察

华为云开发者联盟

Influxdb 时序数据库 GaussDB(for Influx) 时序数据 时序洞察

python DataFrame数据分组统计groupby()函数,值得推荐

程序媛可鸥

Python 程序员 面试

Python 中的八个“无代码”特性,这原因我服了

程序媛可鸥

Python 程序员 面试

Girlfriend含苞待笑——一次性处理上百份文档,BAT这种大厂履历意味着什么

程序媛可鸥

Python 程序员 面试

Matlab初级学习者,15个经典面试问题及回答思路

程序媛可鸥

Python 程序员 面试

复盘归因,提高交付质量的秘诀

老张

软件测试 交付质量 复盘归因

Python 中的文本分类,2021Python面试真题精选干货整理

程序媛可鸥

Python 程序员 面试

Python两个内置函数locals 和globals,Python项目开发如何设计整体架构

程序媛可鸥

Python 程序员 面试

python中strip(),lstrip(),rstrip()函数的使用讲解,Python开发知识点

程序媛可鸥

Python 程序员 面试

物联网应用开发实践案例-智慧农业

DS小龙哥

3月月更

【愚公系列】2022年03月 Docker容器 Oracle的搭建

愚公搬代码

3月月更

Python 下载的9种方法,如何才能通过一线互联网公司面试

程序媛可鸥

Python 程序员 面试

架构实战营模块六作业

刘洋

#架构实战营 「架构实战营」

【愚公系列】2022年03月 Docker容器 Mysql主从复制的搭建

愚公搬代码

3月月更

【愚公系列】2022年03月 RabbitMQ之Erlang-Window11下的安装

愚公搬代码

3月月更

15 本你必须阅读的 PyTorch 书籍,【2021Python最新学习路线

程序媛可鸥

Python 程序员 面试

Newton迭代法开方(Python),最详细的docker中安装并配置redis

程序媛可鸥

Python 程序员 面试

Python 中进程和线程的用法基本一样,跪了

程序媛可鸥

Python 程序员 面试

Python 蜻蜓fm有声书批量下载 支持账号登录 原创源码,斩获offer

程序媛可鸥

Python 程序员 面试

Python3通过函数名调用函数的几种场景实现,贼厉害

程序媛可鸥

Python 程序员 面试

【愚公系列】2022年03月 RabbitMQ 环境搭建和初步使用(window11+vs2022+.NET 6)

愚公搬代码

3月月更

NFS服务器原理、搭建、配置,Python面试题选择题

程序媛可鸥

Python 程序员 面试

Python 金融量化 随机指标交易策略,闭关60天学懂NDK+Flutter

程序媛可鸥

Python 程序员 面试

怎样处理糟糕的代码?_文化 & 方法_Ravi Shankar Rajan_InfoQ精选文章