【老万】码工的故事:热面修代码
我人生最初的十八年生活在一个叫内江的三线城市(也有人说是五线),那里信息匮乏,最普及的文化活动是吹牛,最出名的美食是牛肉面,所以有内牛满面一说。
为了积蓄谈资,我从小对有意思的故事趋之若鹜,每次读到听到便会试图记住,有机会好拿出来显摆。
这天我读杂志 qio 到一个外国专家的故事。这位老爷爷是专业搞马达的,技术在方圆百里挑一,大家一提到他都直呼 +SKR,所以我们可以叫他加斯加。
有一天资本家工厂里的一台大马达出了问题,转速达不到要求,很多修理工轮番上阵都搞不定。莫法,只好请老专家马达加斯加出山。
老人家到了现场,一言不发,东敲敲西捣捣,最后掏出一支粉笔,在马达壳上某处画了一个圈,说:都是这里太卷闹的。拆开,把这里的线圈减去十圈,包你扎西德勒亚克西。
大家将信将疑,还是照做了。果不其然,专家还是斯加厉,一番操作之后马达运转如飞。资本家笑逐颜开82年拉菲庆贺,顺便问问老专家欲索酬金几何。
加爷伸出一个指头:一千块,US dollars。
资本家大惊:咋这么贵,what are you 弄啥咧?说道说道这一千块咋来的。
老爷爷不慌不忙,抓过那瓶拉菲一口闷了,又从资本家八姨太手里夺过口红,在餐巾纸上写下这段账单,看得我内牛满面:
画个圈圈:
一块。
晓得在哪块画圈圈:
九百九十九块。
~~~~
三十年河东,三十年河西。转眼我自己到了外国,也混成了一个写斯加加代码的专家。
这还真不是给自己脸上贴金,这年月“专家”不是啥好词,总让人联想到电线杆子上曾经铺天盖地的小广告。
我知道民间有位专家,专治不孕不育。这属于疑难杂症,十医九怵,而这位专家手法娴熟,治愈率接近 50%。
这么说吧,基本上女方有问题的都治不好,男方有问题的最后都怀上了。只有一次,患者是远近闻名的丑女,专家实在下不了手,说不治了。
扯回来。这天,公司一个东欧的高工,叫他老康吧,哭丧着脸找到我:老万,我这里有段前任传下的代码,在 sanitizer 模式下编译通不过,我 Z turn 一天多了还是莫法,你帮我瞅瞅?
我泡了一包香菇鸡汤方便面,打开电脑。
老康说:也不急,你先吃面,吃完咱再干。
我说:先看看再说。
一看,这程序包含的两个头文件有冲突。它俩都声明了同一个函数,但声明的签名却不一致,一个包括异常规范(exception specification),另一个没有。sanitizer 模式下,被编译器十动然拒了。
两个不一致的声明,肯定有一个是错的。正常情况下,我们需要找到错误的那个,把它改正。
只是这两个头文件来头都不小,一个来自 jemalloc,是一个著名的内存分配器,另一个来自 folly,是 Facebook 开源的基础软件。
它俩都是使用广泛的系统软件,牵一发动全身,改谁都可能造成一堆新问题,难怪老康搞不定。
作为中国来的老专家,我必须哎嘿咦儿哟,该出手时就出手哇,让洋人知道我天朝上邦闪电五连鞭的厉害。
只是这问题确实不好正面硬刚。
闭目一想,有些蹊跷:jemalloc 的用法一般是在链接时取代系统缺省的内存分配库,并不需要客户修改自己的源代码。这个程序包含 jemalloc.h 是啥操作?
找出当初加这行代码的记录一看,是误操作:根本没必要包含 jemalloc.h,因为程序里没一处用到了里面声明的函数。估计原作者对 jemalloc 的用法理解有误。
有方案了:去掉“#include <jemalloc.h>”这一行代码,编译通过,测试通过,问题解决。
方便面还是热的。真香。
删一行代码:
一块。
晓得删哪行代码:
九百九十九块。
~~~~
老康把下巴复位:Very very good! 俺服了中国人民。老万你咋晓得这个头文件没用的?
好问题。依靠专家经验的都不是好方案,因为它不可复制。如何在老专家不在场的情况下系统地解决这类问题?
其实“包含一个头文件有没有鸟用”是可以用算法判定的。只不过 C++ 太复杂(考虑到各种宏定义、模版、ADL规则、元编程等语言特性和它们的交互),这个算法难度贼高,一直没人有完美的解决方案。
你可以把这个问题扔给 chatGPT,但这有风险,三星就这样泄露了公司机密。所以很多公司规定不能把内部代码上传到外部 AI。
而且,这类专业性极强的问题不是大语言模型的强项,用插件还差不多。
十多年前,我在谷歌跟大牛 Craig Silverstein 开发了一个工具叫 IWYU(Include-What-You-Use),可以自动删除 C++ 代码中用不到的 #include 语句。这个工具开源了,所以我现在的公司也可以用。
这段故事,参见我的文章《我在谷歌弄啥咧:克雷格#1》和《谷歌新语言 Carbon 能干翻 C++ 吗?》。
IWYU 的主要作用是清理代码中的垃圾,让编译更快更稳定。偶尔它也可以排除头文件之间的冲突,解决不能编译的 bug。
我告诉老康:下次再遇到这种问题,用 IWYU 试试。
修一个 bug:
一千块。
教会大家自动修 bug:
一百万。
~~~~~~~~~~
猜你会喜欢:
谷歌对微软:代码管理工具哪家强?- 要集中还是要分布
后 C++ 演义(第一回、第二回) - 起底 C++ 发明人比雅尼
后 C++ 演义(第三回) - C++ 的最新发展
程序员护发秘籍 - 掌握这些工作技巧,包你不脱发
程序员的核心技能 - 以脱口秀的方式讲解程序员最重要的技能
如何做出保鲜十年的软件 - 老码农冒死披露行业内幕系列
dongbei 语言满月记事 - 一种基于东北方言的娱乐式程序设计语言
~~~~~~~~~~
关注老万故事会公众号:
本公众号不开赞赏不放广告。如果喜欢这篇文章,欢迎点赞、在看、转发。谢谢大家🙏