这篇文章说了一个反直觉的事:软件开发的产出不是代码,是知识。
想想看,写一个程序容易吗?太容易了。写一个能用的程序呢?难多了。区别在哪?在于你得知道它应该怎么运作。代码本身就是打字,难的是搞清楚该打什么。
作者提出了一个模型叫"五阶无知":
- 零阶:你知道,能证明。比如你会开车,开给我看就行。
- 一阶:你知道自己不知道。比如你不会俄语,这很清楚,去学就是了。
- 二阶:你不知道自己不知道。这才是真正的麻烦。你没有问题,所以也不会去找答案。
- 三阶:你没有办法发现自己不知道什么。这是"方法论"该干的事。
- 四阶:你不知道这个模型存在。恭喜,读到这里你已经消除了四阶无知。
为什么软件项目总是估不准?因为项目开始时,你大部分状态是二阶无知。你知道有很多东西要学,但你不知道具体是什么。所以你估的只是"你知道你不知道的部分",而忽略了"你不知道你不知道的部分"。
那些方法论、敏捷、Scrum 有什么用?它们的真正价值不是给你答案,而是帮你发现问题。一个好的流程会不断暴露你的二阶无知,把"不知道不知道"变成"知道不知道",然后你才能去找答案。
如果你把方法论当成答案机器,你会很沮丧,因为它只会给你更多问题。但那恰恰说明它在起作用。
还有个现象叫"90%完成综合症":程序员说90%完成了,然后连续几个月都是90%。他不是在骗你,他是真的不知道自己还差多少。因为剩下的部分是二阶无知,他看不见。
所以:下次写代码前,先问自己:我在生产代码,还是在获取知识?如果是后者,别急着交付第一版,那只是你的"探险草图"。真正的地图,得在你知道目的地长什么样之后再画。