写作是一种慢速编译
为什么我坚持先写清楚再写代码,以及"把想法写下来"如何替代了大部分设计文档。
我有一个不太高效的习惯:动手之前先写一篇东西。不是设计文档,也不是 RFC,就是一篇给未来的自己看的说明文。
写作暴露你没想清楚的地方
代码可以含糊。变量名起得糟糕、边界条件没考虑,它照样能跑,只是三个月后你会对着它发呆。
文字不行。你写“这个模块负责同步状态”,读者会立刻问:同步什么状态?从哪到哪?失败了怎么办?一旦这些问题问出口,你就知道自己的设计还缺一块。
写作是唯一一种强迫你把隐含假设说出来的活动。
它比设计文档更便宜
正式的设计文档有格式、有评审、有签署流程。成本太高,导致大家只在“大改动”时才写,而大多数问题恰恰藏在“小改动”里。
我的做法是写一段 300 字的说明,包含三件事:
- 这个改动要解决谁的什么问题
- 我打算怎么做,为什么不是别的做法
- 什么情况下我会承认它失败了
第 3 条最有用。它逼你提前定义验收标准,而不是事后找理由。
慢,但是值得
写完再写代码,前 30 分钟看起来是浪费的。但它的收益在三个地方:
- 减少返工:想清楚边界条件,比写完再补便宜得多
- 减少会议:一段清晰的文字,可以替代一次同步会
- 留下痕迹:半年后你会感谢自己,而不是对着 git blame 猜
一点方法论
如果不知道从哪开始,试试这个顺序:
- 先写一句话结论,放在最前面
- 再写反对意见,把自己最强的反驳写出来
- 最后写细节,只写支撑结论必需的部分
这个顺序的好处是:如果一句话结论写不出来,说明你还没想清楚,后面的内容都不必写。
写作和编译确实很像。你把模糊的、互相矛盾的想法放进脑子里,经过一轮又一轮的压缩和消歧,最后输出一段能被别人(和未来的自己)执行的指令。
区别在于,编译器会报错,而写作不会。它只是安静地让你以为你想清楚了。