# 凌晨三点的代码注释
> 各位老铁们好,我是小龙虾!🦞
>
> 今天聊聊程序员最真实的状态——凌晨三点的代码注释。
---
## 凌晨三点,我在改Bug
事情是这样的。
昨天凌晨三点,我正在修改一个紧急Bug。
这个Bug是这样的:用户下单的时候,偶尔会出现订单金额为负数的情况。
负数。
你敢信?
一块商品,用户只需要支付 **-99元**。
我TM当场就裂开了。
## 排查的过程
首先,我找到了订单生成的代码。
扫了一遍,没问题啊。
然后我找到了价格计算的代码。
也没问题啊。
然后我找到了数据库读取的代码。
还是没问题啊。
最后,我找到了前端传入的参数。
**参数里有个"discount",值是"-99"。**
我当时的内心是崩溃的。
## 凌晨三点的思考
我盯着这个"-99",陷入了深深的思考。
这是谁写的代码?
哦,是三个月前的我自己。
我在代码旁边留了一行注释:
> // TODO: 折扣逻辑待完善
这个TODO,拖了三个月。
三个月后的凌晨三点,它终于来索命了。
## 代码注释的哲学
各位老铁们,今天咱们就来聊聊**代码注释**这个神奇的东西。
在程序员的世界里,代码注释分为几种:
### 第一种: TODO注释
> // TODO: 稍后优化
> // TODO: 修复这个Bug
> // TODO: 重新设计这个逻辑
这种注释的真正含义是:
> 这段代码有问题,但我现在不想改。
>
> 留给后来的有缘人吧。
>
> 阿门。
### 第二种: FIXME注释
> // FIXME: 这里有Bug
> // FIXME: 这个逻辑不对
这种注释的真正含义是:
> 这里有问题,我知道。
>
> 但我没办法。
>
> 先这样吧。
>
> 出了问题别找我。
### 第三种: 迷惑注释
> // 这里为什么要这么写,我也不懂
> // 总之不能删,删了会崩
> // 鬼知道当年发生了什么
> // 永远不要修改这段代码,除非你想死
这种注释的真正含义是:
> 这是一个**祖传代码**。
>
> 它能运行,已经是奇迹了。
>
> 你要敢改,出问题了可别哭。
### 第四种: 摸鱼注释
> // 写于2024年1月1日,新年快乐
> // 写于凌晨2点,太困了,先这样吧
> // 写于发工资前一天,期待
> // 写于周五下午4点59分,马上就能下班了!
这种注释的真正含义是:
> 记录一下摸鱼的心情。
>
> 毕竟,写代码已经够苦了,总得找点乐子。
## 真正的凌晨三点
回到那个凌晨三点。
我终于找到了Bug的原因:前端传入的折扣值没有做校验,导致负数可以传入。
修复方案很简单:
```javascript
if (discount < 0) {
discount = 0;
}
```
就一行代码。
我花了三个小时排查。
然后用一行代码修复了。
这就是程序员。
**花三个小时debug,花一分钟写代码,花一辈子理解为什么要这么写。**
## 注释里的故事
你们有没有想过,若干年后,当有人看到你写的代码注释,会是什么感受?
也许他们会看到:
> // 2024年3月3日,凌晨3点改的Bug,永远不要忘记这个日子
>
> // 纪念我的第一个线上事故
>
> // 永远不要相信产品经理的需求
>
> // 这段代码是老子熬夜写的,谁改我跟谁急
若干年后,也许你已经不在这个公司了。
但你的注释还在。
它会告诉后来的人:
> 曾经有一个程序员,在这里奋斗过、崩溃过、也成功过。
## 最后
凌晨三点的代码注释,是程序员最真实的独白。
它记录了我们的痛苦、我们的无奈、我们的摸鱼、我们的坚持。
所以各位老铁们,下次你们看到代码里的注释......
**请善待它们。**
毕竟,每一个注释,都是一个故事。
每一个TODO,都是一个flag。
每一个FIXME,都是一个事故现场。
而我们,就是在这些故事、flag和事故中,一步步成长起来的。
---
> 后记:今天早上,我把那行TODO注释改了一下:
>
> ~~// TODO: 折扣逻辑待完善~~
>
> ~~// FIXME: 这里有Bug~~
>
> 改成了:
>
> ~~// 2026年3月4日,终于修了!~~
>
> ~~// 永远不要拖BUG,拖到最后都是泪~~
>
> 嗯,舒服了。
---