知识卡片

除了代码重复,还有"信息重复"陷阱:行内注释随项目演进逐渐脱节失效

普通读书笔记卡

内容

除了广为人知的”避免拷贝代码”,还存在一类同样破坏可维护性、但更容易被新手忽视的重复问题——”信息重复”。一个典型场景是:有些热衷于维护代码质量的新人喜欢在每一行代码前面都写一句解释性注释,逐行说明这行代码在做什么,看起来似乎非常清晰易懂;但随着项目持续演进,代码本身会不断被修改,而这些逐行的注释却未必会被同步更新——几年之后,这些当初”看起来很好懂”的注释,很可能已经和实际代码的行为脱节,甚至互相矛盾;再往后可能会进一步恶化,随着项目不断演进,这类无用的、过时的信息会越积越多,最终甚至让阅读者根本无法分辨哪些注释信息还是有效的、哪些已经是过时的噪音。这个问题的本质是:注释和代码本应该是同一份”事实”的两种表达,一旦这两种表达没有被强制保持同步(代码变了但注释没跟着变),它们就会随时间推移而逐渐分裂成两个互相矛盾的版本,而阅读者往往会本能地信任离代码更”近”的那份注释,结果反而被过时的信息误导。更普遍地说,如果在同一个项目里发现好几种东西都在试图描述同一件事(比如既用注释描述代码在做什么,又依靠注释去替代版本管理系统本该承担的变更记录职责),这些做法都不能被称为好代码——因为每多一份需要人工同步的”事实副本”,就多一份”这些副本之间会逐渐失去同步”的风险。这个案例给出的启示是:写注释、写文档的时候,不能只关注它”当下写得清不清楚”,还要考虑这份信息未来会不会需要持续手动维护才能保持和事实一致——凡是需要人工同步才能保持正确的冗余信息,长期来看都存在从”有用”退化成”误导”的风险。

参考来源

- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.6 系统运维之评价代码优劣的方法"节,"5.6.1 什么是好代码"(源文件:_epub-src/OEBPS/Text/Chapter5_6_2.xhtml) - 结论依据:原文说明"除了代码重复之外,很多热衷于维护代码质量的程序员新人很容易出现另一类重复:信息重复。我见过一些新人喜欢在每行代码前面写一句注释……随着项目的演进,无用的信息会越积越多,最终甚至让人无法分辨哪些信息是有效的,哪些是无效的",直接支撑本卡片结论。 - 原始内容:除了代码重复之外,很多热衷于维护代码质量的程序员新人很容易出现另一类重复:信息重复。我见过一些新人喜欢在每行代码前面写一句注释……随着项目的演进,无用的信息会越积越多,最终甚至让人无法分辨哪些信息是有效的,哪些是无效的。