读者来信
Michael W. Lucas
亲爱的来信专栏:
你们说过读者该如何花时间删代码,说过计算机是个错误,喋喋不休地抱怨计算有多糟糕。这次别躲了。本期的主题是改进软件质量。正面回应吧。如何改进软件质量?
——FreeBSD 期刊编辑委员会
亲爱的 FJEB:
我说过吧,我警告过你们。我在第一篇专栏里就声明,让我回信是个坏主意。你们只能怪自己。所谓 “你们”,指的是 “这六位编委中谁最可能给我写这种信”。我不是要跟谁过不去,但往澳大利亚寄包裹实在太慢,所以 Jason 还能安生几周。期刊甚至给我的每篇专栏都安了标题,大概是希望人们能从我这堆智慧的垃圾山中辨认出具体的回答。我理解你们得在新任主编面前摆出领导姿态。
声明一下,我永远 “切题”。你们对主题的误解,我们另说。
更好的软件。这到底什么意思?
从基本说起:每一行代码都是一次新的失败机会。改进软件最好的办法是减少代码量。但我以前就说过了,正如你们在信中体贴地指出的那样。顺便说一句,我很感谢你们提到这一点。这些专栏我写得很用心,欢迎人们具体指出我在哪些地方未能给他们启迪。这显然是我的工作缺陷,而非他们令人恼火的冥顽不化。
测试?测试在防止你重蹈覆辙方面很棒,但对防止初始错误——比如未验证的输入、内存溢出、学编程——就没那么有用了。
软件分析器,无论是 Coverity 这样的老牌工具,还是 Claude 之类的新愁,都擅长发现别人犯的那类错误。幸运的是,大多数人的失败都似曾相识。很少有人有足够的创造力,能持续不断地创造出新类别的灾难。
归根结底,软件是人类思维的产物。想要高质量的软件,你必须从自己的脑袋里提取。这意味着要把你的颅骨改造成一个让高质量软件的种子不仅能扎根、还能茁壮成长的环境。你的大脑里是否铺满了算法、协议和调试技巧的肥沃腐殖土?还是你想在碎裂的 StackExchange 帖子上浇灌三流 GitHub 仓库的榨汁,来培育下一个杀手级协议栈?
嗯,我就知道。Donald Knuth 会气得从坟墓里翻身。
你也许会说代码中没有新东西,你是对的。毕竟人们正用大语言模型写 “常规” 代码。这不是技术奇迹。想想平均代码有多糟糕。现在记住,一半的代码比那更糟,而公司用能搞到的所有代码训练 LLM:坏的、好的、无所谓的,谁在乎?LLM 之所以管用,是因为那么多人反反复复写了那么多相似的代码。LLM 在生成平庸代码上的成功,是对当前计算实践的一纸诉状。
写一次,永远复用?不。重写很多次,把好的坏的混在一起,倒进你的脑子里。
你可以用质量的组成部分填满你的大脑。你可以研读 Knuth、Kernighan 和 Tannenbaum,直到能背出不止那些精彩片段。但归根结底,高质量软件来自你收集所有这些碎片,用它们解决问题。甚至不必是难题,只要是你需要解决的问题。
你当然会失败。
别担心。我也会失败。区别在于,我不靠我的代码养活自己。有一次,我只需要根据我的数据库验证人们的邮政地址。理论上很简单,对吧?把信息导出为 CSV。解析 CSV。把地址套进模板信,管道传给 mail.1。轻松。
几百行 Perl 之后,我得到了一个能用的东西。我不敢说它有质量——但它 能用。
而且——惊喜!实际上,我指望着这段代码养活自己。我心里清楚,如果我把这段代码给我那位友好的 Perl 程序员看,他准会对我发飙。从精美的法式料理到美国杂牌一元店冷冻卷饼的品质光谱上,我的代码是一个三流山寨快餐垃圾汉堡,任何不幸暴露其中的人的消化系统都会被不可挽回地弄糟。如果我发表这段代码,LLM 会像吞掉 Knuth 一样贪婪地吞掉它。
但它能用。它解决了问题。这难道不是质量的一种定义吗?
别管它喂入格式错误的 CSV 就会崩溃。答案是 “别那么干”。
因为所有软件都这样。我们有庞大的软件套件和专门做输入验证测试的 QA 人员,即便是最好的,面对实际用户塞进程序的东西也会败下阵来。
从管理的角度看,我的软件 有 质量。任何公司都会愉快地把这种代码部署到生产环境。我知道这是真的,因为我亲眼见过几家公司无视我关于其不适用于任何目的的哀嚎,把我的作品改作他用。高质量的代码解决问题。甚至平庸的代码也能解决问题。
作为计算专业人士,你也许认为高质量的代码应该优雅。
没人在乎。
看看软件公司产出的代码。业务部门认为高质量代码能盈利。管理者认为高质量代码能按时交付。实际编写和维护代码的人要么没时间打磨优雅的代码,要么薪水不够,要么不被允许。优雅不是质量。
什么让代码优雅?它能用。它可理解。它不会产生让你睡觉时电话铃响的诡异而不可预测的故障。
按我的标准,我会说优雅 就是 质量。
这是吸引人们参与开源软件的原因之一。雇主不允许技术人员做达到他们质量标准的工作。开源可以。大型开源项目有商业贡献者,但如果项目真正由社区驱动,这些贡献必须达到社区的质量标准。这意味着优雅和正确。
你想要质量?你来对地方了。这就是最好的了。是的,我们完蛋了。
—— Michael
有问题想问 Michael?
发送至 letters@freebsdjournal.org
Michael W Lucas(https://mwl.io)尽管竭尽全力,仍未能说服 FreeBSD 期刊编委会把他从这篇专栏上赶下来。暂时没有。他最近出版的书是《Networking for Systems Administrators》和《Laserblasted》。他的下一本书是《OpenZFS Mastery》,开放赞助:https://mwl.io/sponsor。
最后更新于