优秀的程序员都不写注释的吗?

说在前面

编程界里流传着这么一句话:“程序员最讨厌的两种人,一种是不写注释的人,另外一种是让我写注释的人”。"是否需要写注释"长期处于争议旋涡:有人认为注释是代码冗余,顶尖程序员应追求"自解释"代码;另一派则坚持注释是团队协作的基石。

不写注释派观点

“现在居然还有人写代码注释的,代码得有多差”

  • 逻辑至上:代码本身应通过命名规范(如calculateTaxRate())、模块化设计(单一职责原则)实现自解释,冗余注释反而干扰阅读
  • 维护成本:代码频繁迭代时,注释与实现可能不同步(如修改算法后未更新注释),导致误导风险

写注释派观点

“如果程序员在编写代码时也加上良好的注释,其他程序员就可以更好地理解和使用这些代码”

  • 历史证据:Java JDK、Linux内核等顶级项目注释详尽,Apache基金会要求注释覆盖率≥30%
  • 认知局限:即使代码逻辑清晰,也无法传递设计决策的上下文(如选择B+树而非红黑树的权衡)

核心矛盾

注释本质是代码可维护性与开发效率的博弈,而非单纯的技术能力问题

场景决定价值

场景类型 注释需求强度 典型案例
长期维护模块 ★★★★★ 基础框架、核心算法
短期临时脚本 ★☆☆☆☆ 数据清洗的一次性脚本
多人协作接口 ★★★★☆ REST API定义、SDK公共方法
复杂业务逻辑 ★★★★☆ 业务需求临时处理方案

GitHub统计显示,注释密度超过20%的仓库,其Issue平均解决速度快1.8倍(来源:2024年GitHub年度报告)

优秀注释四大场景

  1. 解释Why,而非What
  • 错误示例:重复代码功能
// 计算用户折扣  
double discount = user.getLevel() * 0.1;  
  • 正确示例:阐明设计动机
/* 采用线性折扣模型(而非阶梯式),因历史数据表明用户等级与消费频次正相关  
  公式验证见Confluence文档#D-203,2024年AB测试结论支持该方案 */  
const discount = user.getLevel() * 0.1;  
  1. 标记临时方案与技术债
# TODO: 需替换为更高效的曼哈顿距离计算,当前欧氏距离导致性能下降12%  
# 临时方案因iOS客户端v2.3.1存在浮点运算兼容性问题(详见Issue#447)  
function calculate_distance(x1, y1, x2, y2){
   return ((x2 - x1)**2 + (y2 - y1)**2)**0.5;
} 
  1. 警示非常规操作
// !!! 绕过React状态管理,直接操作DOM  
// 仅限视频播放器全屏切换使用,其他场景可能导致渲染管线冲突  
document.getElementById('player').requestFullscreen(); 
  1. 结构化元数据
/**
 * 订单服务类(用于处理用户订单生命周期)
 * @author jyeontu
 * @lastmodified 2025-03-20
 * @deprecated 自 v2.18 起废弃,请使用 {@link NewOrderService}
 * @see {@link ./src/services/order/v2/new-order-service.js}
 * @version 1.4.3
 */
class OrderService {
  /**
   * 计算订单税费(支持跨境场景)
   * @param {number} amount - 订单金额(单位:美元)
   * @param {string} countryCode - ISO 3166 国家代码(如 "US")
   * @returns {number} 税费计算结果
   * @throws {InvalidCountryError} 国家代码非法时抛出
   */
  calculateTax(amount, countryCode) {
    // ...
  }
}

注释与代码比价表(维护阶段)

对比维度 无注释成本 有注释收益
接手他人代码 平均耗时增加3倍(来源:StackOverflow调研) 新成员上手周期缩短65%
故障排查 定位根因时间增加2.5倍 通过注释历史决策快速收敛问题
架构升级 重构引发兼容性问题概率40%+ 依赖关系注释降低重构风险

结语

是否应该写注释需要结合场景评估成本收益:

  • 短期项目可精简注释以提效
  • 长期核心模块或复杂业务场景需详尽记录设计逻辑与历史背景
  • 人机协作时代,AI辅助可以生成基础注释,开发者可以聚焦业务决策与架构权衡的深度解析

转自 JYeontu

4 个赞

真不写,代码解释一切。

咋说呢,不写注释,我自己看我去年写的代码都费劲……

5 个赞

越优秀越写吧

1 个赞

我个人是看情况,详细注释,总结型注释,或者不写注释都有。

如果我认为这个代码块有可重用价值,或者可能会需要优化、修改,我就会详细注释。
如果只是具有可重用价值,但是优化或者修改还不如重写一套的话,我的注释就会仅仅总结整个模块的功能和接口。
如果代码块足够简单到自解释,或者代码块复杂到写了注释也看不懂,我就不写了。

1 个赞

啊? AI生成代码时候自带注释了啊

2 个赞

这四大优秀注释场景同样适用于记笔记。(写注释就是记笔记,只是代码还需要用来运行、协作的,笔记是用来看的)

能避免笔记变成废纸,记了不看、看了不懂的情况。


是转自这篇文章吗?写代码的时候一定要写注释吗?_代码要写注释吗-CSDN博客

看起来论坛本文有很多原创观点啊

!学到了,尤其是示例1的错误范例,准备将这个提示作为全局提示词扔给AI。

其实我还喜欢写一个程序结构表(或者叫大纲?),像设计图那样设计每个组件负责什么。这个东西一般是在第一行代码开始前完成。

d7d86a09fa94fa708940788925da4037.JPG

大概類似這樣吧…
(兩端不寫,靠中的寫)

4 个赞

现在用 AI 加注释是真的爽

3 个赞

延伸一下,我感觉很多软件、游戏的“个性化设置”缺乏注释(此注释是面向用户的,原文中的注释是面向程序员的)。

比如一个开关,用户不知道效果是什么。

觉得现在的注释就仅在公共接口有用!

非文档注释的意义不大了,以前看太久的代码无行级注释得花时间理解上下文

但现在有AI,虽然AI写长代码问题很大,但让AI对现有代码进行注释却几乎接近完美!

所以觉得个人不需要写非文档注释,将来需要读的时候让AI辅助理解代码就是!

有时间+心情好就写,逻辑复杂的写,其他随缘

1.命名不规范的加个注释还能看,不规范还没注释看着可太费劲了
2.代码迭代不更新注释,这种不应该去谴责这个不更新注释的人吗?关注释什么事啊,它很无辜啊

说的可太对了,库库整一堆设置,连句说明都没有,谁能看明白

这两件事情在现在ai的辅助下问题都不太大。我现在写完代码,选中整个函数,让ai帮我加注释。只要代码写的够清晰,它能够解释的非常细致准确。更新注释也可以让它去做。换个角度面对没有注释的代码同样可以让他把注释添加上。这可实在是太爽了

这个问题有时候也挺难解决的,就比如某个设置项虽然表面上就是一个开关,但是绝对没有办法用一两句话去解释这个开关的功能。甚至解释之后必须要附上充足的示例才能够让别人明白,这种情况下的描述就很难写,尽可能选择重点写了一堆,然而用户还是看的云里雾里。

一个例子:Obsidian 的 Excalidraw 插件,作者努力对每一个设置项进行了描述。但很多设置相依就很难猜测它的实际效果,还得设置尝试慢慢摸索。但又实在不想抱怨作者,毕竟作者简直是拿写文档的镜头在写的设置页,算是十分细致用心的。

发散一下,最近我很喜欢这种实体的操作介面。

第一次上手是懵的,需要搭配说明书,但是用熟练之后就很顺手。这种介面也很有美感。

很多音乐相关的软件都会采用这种拟真的操作介面。



说的极端的话几乎一定是错的,除非写库并不需要写大量的注释来说明你在干什么,优秀的代码应该是自解释的——但是这也没说那些比较难理解的部分不需要注释啊

我个人写注释少,可能只有 3% 的行数写了注释吧(就是那些意图不够明显的代码)……但是再看几年前的代码也只是觉得显得粗糙而不是看不懂

现在一般Copilot自动生成~!

还是要写的,一般写整体逻辑,或者写故事,也就是这部分代码改动的时候当时发生了什么,留下历史脉络,让后来人知道要注意什么

我写注释看心情
心情好不写
心情不好 瞎写
赶代码量 啥都写注释