写文档ROI 730%:程序员最亏本的习惯

上周五下午,我写了一个很巧妙的缓存淘汰策略。本地缓存+Redis两级联动,带版本号的失效机制,我自己都觉得挺漂亮。

周一,后端的小王跑来问我:”哥,你那个缓存是怎么回事?我要接一个新接口,不知道该怎么处理缓存。”

我放下手里的活,花了15分钟给他讲了一遍。画了个图,解释了为什么用版本号而不是TTL,怎么处理并发写入的脏数据问题。小王听懂了,走了。

周二,前端的小李来了:”哥,我这边请求有时候拿到旧数据,是不是缓存的问题?”

又是15分钟。

周三,新来的实习生在群里问:”请问缓存策略在哪个文件里?我翻了半天没找到。”

又是15分钟——而且这次我得从”什么是两级缓存”开始讲起。

半年下来,我大概解释了20遍。每次15分钟,总共5个小时。如果当初我花30分钟写个文档,后面19次每次就是一个链接的事。

30分钟 vs 5小时。你告诉我,哪个更浪费时间?

“没时间写文档”是程序员最贵的借口

我知道你在想什么——”我也知道文档好,但我真的没时间啊。”

有意思的是,你永远有时间解释第20遍,但没时间写第1遍。

这就是写文档最反直觉的地方:不写文档才是真正的浪费时间。只不过这个浪费不是一次性的,而是分散在未来几个月甚至几年里,每次只花你15分钟,你根本感觉不到自己在流血。

你想想看,你写一个工具函数,被调用了1000次,你会觉得”写这个函数浪费时间”吗?不会啊,你觉得这是理所当然的——一次封装,到处调用,这就是编程的核心思想。

文档是一模一样的道理。

文档就是你大脑里的函数封装。

你脑子里有一段关于缓存策略的知识——输入是”同事的问题”,输出是”15分钟的讲解”。不写文档,等于你把这段逻辑写成了内联代码:每次有人调用,你就得亲自执行一遍。写成文档,就是把它封装成一个函数:调用方只需要看文档(接口说明),不需要你本人来跑这段逻辑。

而且这个”函数”还有一个代码做不到的超能力——它可以被20个人同时并发调用,而你只需要”执行”一次。

这投入产出比,写代码都不一定有这么高。

内联代码 vs 函数封装

8.4小时:你不知道自己每周浪费了多少时间

“行吧,道理我懂,但到底有多浪费?给我个数字。”

行,上硬菜。

Stripe做过一个内部调研,结论挺扎心的:他们的工程师每周平均花8.4个小时在”寻找信息和等待别人回答”上

8.4个小时。一周按40小时算,五分之一的时间花在”找答案”上。不是写代码,不是做设计,不是调bug——就是单纯地找信息。

在Slack里翻聊天记录,在代码仓库里grep关键字,走到同事工位上问”那个接口的参数格式是什么来着”。

这8.4个小时里面,有多少答案其实已经存在了?在某个人的脑子里,在某次会议的讨论里,在某个PR的评论里——就是没有变成一份可以搜索、可以链接、可以转发的文档。

再来一个更狠的数据。Google内部统计过,一份好的设计文档(Design Doc),被阅读的次数平均是被修改次数的50倍

你写了1次,50个人读。

把这个数字代入ROI公式算一下:

  • 投入:你花1小时写一份文档
  • 单次回报:每个读者省10分钟(不用来找你问了)
  • 总回报:50人 x 10分钟 = 500分钟 ≈ 8.3小时
  • ROI:(8.3 - 1)/ 1 = 730%

你去看看理财产品,年化收益能到10%就烧高香了。文档的ROI是730%。而且这还是保守估计——那份文档可能活好几年,读者远不止50人。

如果你是一个”不喜欢做亏本买卖”的程序员,写文档是你能做的最赚的事。

文档的 ROI 计算

不只是ROI,还有复利

更可怕的是,文档的回报不是一次性的,它是复利的。

一份好文档不只是省了别人找你问的时间,它还会触发连锁反应。

小王看了你的缓存文档,不用来问你了——省了你15分钟,也省了他鼓起勇气走过来的社交成本。然后小王基于你的文档写了新接口的缓存处理,在PR里贴了你的链接。代码审查的人点进去看了,也搞懂了设计意图。一份文档,同时服务三个人。

半年后来了个新人,在Wiki里搜”缓存”,直接找到了你的文档。不需要任何人带他,自己就搞懂了。而你——可能早忘了这事了。

更妙的是,两年后你自己换了个项目,回头要看当初的设计思路。打开自己写的文档,五分钟就想起来了。你写的文档,最后连你自己都服务了。

这就是复利。你封装了一个函数,每多一个调用方,你当初写那几行代码的价值就又涨了一截。文档也一样——每多一个读者,你当初花的那30分钟就又赚了一笔。

你以为写文档要2小时,其实5分钟就够了

“好吧,我承认文档有用。但一想到要写文档,脑子里浮现的就是那种目录齐全、排版精美、图文并茂的技术文档,光想想就累了。”

问题就出在这儿。你把”写文档”的门槛想得太高了。

你不需要写一个RFC。你不需要写一个完美的技术方案。你需要的是一个最小可行文档——就像MVP一样,先上线,有人用了再迭代。

这是我的模板,5项内容,核心场景20分钟搞定,简单的5分钟就行:

1. 标题 + 一句话总结 「订单服务的两级缓存策略——本地缓存+Redis,用版本号控制一致性」

2. 背景 为什么要做这个?「高峰期订单查询QPS到了5000,直接打DB扛不住,加了两级缓存」

3. 做了什么(3-5个bullet point)

  • 一级缓存:Caffeine本地缓存,容量1000,过期5分钟
  • 二级缓存:Redis,过期30分钟
  • 一致性:写入时递增version字段,读取时对比version
  • 降级:Redis不可用时fallback到DB直查

4. 怎么用 「查看 OrderCacheService.java,核心方法是 getOrderWithCache()」

5. 注意事项(踩过的坑)

  • 本地缓存不能设太大,JVM内存会爆
  • Redis过期时间别设整数分钟,要加随机偏移防雪崩

再举个前端的例子,更简单:

标题:前端环境变量配置说明 背景:新人每次都搞不清楚.env文件怎么配 做了什么:整理了dev/staging/prod三套环境的变量表 怎么用:复制.env.example,改对应的值就行 注意事项:NEXT_PUBLIC_开头的才会暴露给浏览器,别把密钥放进去

就这么多。不需要目录。不需要完美排版。不需要配图。写在团队Wiki里,往群里发个链接。下次有人问,你回复一个URL就行。

你看,文档的门槛不是”两小时写一份完美文档”,而是”五分钟写一份够用的文档”。用程序员的话说:你不需要一上来就写一个高度抽象的通用框架,先写一个能跑的函数就行。

最小可行文档模板

文档不是债务,是资产

大多数程序员把文档当成一种债务——”我应该写但没写”,带着负罪感。每次有人在周会上提起”我们文档是不是太少了”,全场沉默三秒,然后话题自动跳过。下周继续不写。

换个角度想:文档不是债务,是资产

每写一份文档,你就在自己的”知识银行”里存了一笔定期。它会持续产生利息——每次有人读到它,省下的时间就是你的利息收入。

你写的那5个小时口头解释?那就是被通胀吃掉的现金——说完就没了,不产生任何复利。

而30分钟写出来的文档?那是一笔不断增值的存款。

所以我的建议是:从今天开始,每次你发现自己在口头解释同一件事第二遍的时候,停下来,花5分钟把它写成文档。不用完美,不用齐全,只要把刚才嘴上说的东西打成字。

这5分钟,是你作为程序员能做的回报率最高的投资。别再把知识内联在脑子里了——封装一次,让全世界调用。

没有之一。