怪怪谈注释
闲话不说,本篇主要讨论注释的非必要性。
以我个人的经历来说:从满篇清晰工整的注释到一字未写的(过于玩具的不提,只谈那些逻辑复杂或者职责分配分散的),上至大牛神作下至身边比Community Server写的还乱的,我从没看过注释。
另一方面,说实话,虽然很多人B4我这样的,但是我仍然要恬不知耻地说,我也基本不写注释;而过去在作为一个管理者的角色时,我从来不要求别人写注释。什么叫做“基本”呢?
就是说以下两种情况例外:
1. 一句或一段代码抽象过了头,也许需要跟业务相关的描述建立一个直观的对应。
2. 因为安排的不够妥帖或者很难妥帖,一段逻辑中蹦出一句为不相关逻辑服务的代码。
而这两种情况出现的极少。
当然这和我经历过的几个工作环境有关系:无论是遗留还是全新,我总能自己决定是不是重构或让别人重构;如果我花费了比预期更多的时间读代码的话,我也总能让人相信那就是必要的。
但是可以想象,一个比我接触过的环境更加赶鸭子上架的环境,如果没有把设计和代码整理好的时间,也必然没有做注释的时间。很多人否认这一点,认为加几句话自己以后看也清楚,费什么功夫。
不是这样。
在头脑发热的时候,大多数人只想抓住自己当时稍纵即逝的灵感(无论在哪个水平上),他脑子里怎么想的在当时是非常明白的,而5分钟后就未必了。这时他确实应该整理思路,可List上却有其它更重要的事情。【1】
那么我的观点是什么呢?
要么组织上并不存在资源(时间、人力)不足的情况,这时大多数设计和实现因为足够好而无需注释;要么就根本没时间写注释。这绝对不是作者的错,有时甚至不是组织的;尤其从作者的角度来看,根本没辙。【2】
唯一的办法就是不断增加阅读代码的水平、理解业务逻辑的水平。这两个能力获取的信息相互印证,一点一点往前走。组织没提供给你足够时间怎么办?那不是你的错,也不必为此有愧疚或愤怒,咱也是没辙。
那么什么时候也不需要注释和文档吗?不是,比如库作者必须写明接口如何使用就是一例。但在这个之前,首要的一点是,尽量不要设计的让人深入库源码才能得心应手;需要说明的是,库是如此,而框架却很难做到这样。
也正是库和框架的区别,导致GoF中其中一个在若干年后放弃了框架式的设计。但是大家都有反射ASP.NET源码的经历:至少从我个人来说,即使对它的设计颇有意见,但也从来没有产生“要是有注释就好了”的念头。
合格的程序才是我们想要的,而不是注释。不合格的程序往往也就意味着连写注释的条件都没有:即使不是因为当时的具体情况,而仅仅是因为组织雇佣了一个水平低下且不负责任的人,这也是一个资源问题。
大家知道我很少说人情世故,上面这些话也不是从这个角度分析。
不过有一点,没有什么是我们能要求别人的。我们是擦屁股的人的时候,我们要知道社会认可了那个留下便便的;我们是管理者的时候,我们应该想办法为组织争取更多的资源,这是管理者的一个职责和义务所在。
是不是所有情况下都如此恶劣?当然不是。
比如就一些公司所针对的业务来说,可以以很低的成本就形成越来越多的约定和约束,让程序员可以自由发挥的余地越来越小。但这个过程主要是自上而下的,而本篇的目的是给任何水平层面上“不写注释”的程序员说两句,就不多关注了。
没办法的时候呢? 只能听天由命了。
P.S. 很多大牛甚至喊出了“注释是有害的”这样的口号;如此看来,我还是不够激进了,惭愧。
注释一:
什么叫更重要的事情?就是说,已经完成的代码做的再完美、文档在齐全,下面这件事不做或做不完,整个项目也会死。
一次完善也许可以说不算什么,但是谁写程序能够只有一处需要完善呢?我们要明白的是,当我们为几处生气的时候,这仅仅意味着我们只见到了这几处。
这样的代码即使不能说值得表扬,但针对具体情况,也许已经不错了:此人当时在其他更必要的地方花费的心血是我们没能体会的。
如果处处都让人生气,这就一定是一个非常严重的资源问题,不属于程序员这个层次,不再赘言。
注释二:
有人可能会说了,你别操蛋了,哦,至少够我写注释的时间,就不够那孙子了?三点:
1. 你面临的情况不同。人无法两次进入同一条河流,这点没法真正彻底的反驳。
2. 你水平比较高,也不过是因为组织掌握资源的状态和能力发生了变化;没人应该因为水平低挨骂。
3. 重申一遍个人观点,如果一个人真有足够的时间写清晰的、很难让任何人误解的注释,他应该把这个时间花在代码上。
多说一句的是,我并不是在说存在即是reasonable,具体问题具体分析。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器