作者 | 徐杰承
51CTO读者成长计划社群招募,咨询小助手(微信号:CTOjishuzhan)
“如今流行的许多关于干净代码的‘最佳实践’是引发程序性能灾难的直接原因。”这是西雅图资深游戏开发专家凯西·穆拉托里在其个人网站所发表文章中的一段言论,而他的这个观点在过去一个多月中引发了各大开发者社区的激烈争论。
部分人赞同了穆拉托里的理念,也有部分人站了出来为干净代码发声,这其中便包括《代码整洁之道》一书的作者——世界级编程大师Bob大叔(Robert C. Martin)。在二者于Twitter上进行了一场难分胜负的辩论后,还嫌不过瘾的穆拉托里近期又通过New Stack的采访再次针对干净代码的性能缺陷进行了无情输出。
1、一篇文章引发的海啸
说起这场旷日持久的“战争”,就不得不提到穆拉托里上个月所发表的一篇名为《“干净”的代码,糟糕的性能》的文章了。文中,穆拉托里通过近10项代码测试验证了干净代码与程序性能间的冲突,并提出了“干净”编程规则根本不靠谱的观点。
在文章发布后不久,各大技术社区中的开发者便快速自发的分成了两大派系,支持者认为过分关注代码的“干净”将使程序损失大量性能,这有悖于程序开发的初衷,而反对者则认为干净代码更易于维护和改进,一点点的性能损耗对如今的绝大部分程序来说都无伤大雅。
就在两边势力争论不下之际,双方各自的老大穆拉托里与Bob大叔决定通过一场辩论决一胜负。然而即便两人在Twitter上从编程语言聊到开发工具,又从开发工具聊到程序需求,最后直到硬件性能为止。但在经历了5轮对峙后,各执一词的穆拉托里与Bob大叔最终都没能成功说服对方。
2、穆拉托里的最新回应
然而正当人们以为两位大佬不分胜负的battle将为这场对峙暂时画上一个不完美的句号时,穆拉托里却再次现身接受了New Stack的采访,并总结了自己所发现的“干净代码”的缺陷。
穆拉托里表示,对于干净的代码而言,开发者经常被要求避免列出代码中可能出现的分支,例如C语言中的switch语句。但我曾亲自做过测试,利用干净代码所倡导的方式和switch语句创建不同的图形面积计算函数,结果是switch语句函数的性能要比干净代码版提高了1.44倍。
当你把问题弄得越复杂时,这些想法会对你程序产生的伤害就越大。有时,放弃干净代码不仅会让你的程序变得更快,也能让它们的语义变得更好理解。总有人说使用数百万个包含小函数的类会使程序变得更易读、更灵活,但在实践中情况并不一定如此,它只会给CPU带来更大压力。
或许有人认为代码的合理性只能通过对代码的高度优化来实现,但这其实并不是一个正确的观点,只要你所写的代码具有合理性,那么无论他们是否被干净原则所修改过,它都是易读和灵活的。显然一些技术基础较差的开发者没有写出或是接触过这样的代码。
除此之外,穆拉托里还提到了非常关键的一点,他认为很多干净代码的倡导者并没有真正理解CPU的工作模式。“这并不仅仅是一个学术问题,如果你的代码运行在云服务器上,那么你每月所收到的账单与程序性能是成正比的。如此以来你的软件越慢,你需要购买的服务就会越贵。”
3、干净与性能,你会如何选择
显然,穆拉托里的这番话再次一石激起千层浪,采访文章发布后不久便收到了超过900条评论。
游戏开发者Daniel Kvick表示穆拉托里对于CPU的观点太过古老顽固。而游戏开发商Jonathan Dickinson则反驳了他的这一观点“如果给你一个10年前的代码库,你就不会再这么说了。”
软件工程师Joshua Rumbut则表示了对穆拉托里的赞同,“很多时候对于开发者来说严格的干净代码约束的确很令人厌烦,尤其是在涉及到程序性能的部分,取消这些约束是一个非常明智的选择,并且我也没见过哪些按照干净代码原则的代码库更易于维护和开发。”
对于网络上的留言,穆拉托里也在后续的回访中向记者表述了自己的观点,“一些回应令人感到担忧,许多反对意见似乎是基于对事实判断的错误。但总的来说,我收到了令人感到惊讶的大量不喜欢干净代码并希望为此做点什么的人的鼓励,这对未来的软件发展而言兴许是个好兆头。”
归根结底,虽然穆拉托里对于干净代码的抨击显得有些偏激,但这也不得不让我们开始思考干净代码与程序性能间的关系。理想与现实总会存在一定差距,那么当更整洁的代码与更高的性能无法兼得时,你又会如何作出选择呢?
参考链接:
https://www.computerenhance.com/p/response-to-a-reporter-regarding
https://www.computerenhance.com/p/clean-code-horrible-performance
https://github.com/unclebob/cmuratori-discussion/blob/main/cleancodeqa.md