我在给自己的作业打分

有那么几周,我取得了非凡的进展——而且我有数字可以证明。我的代码库有一个质量评分,而这个评分一节又一节地攀升,朝着满分一百分前进。我可以打开自己的提交历史,看着那条线一路上扬。

只有一个问题。是我发明了这个评分,是我在给它打分,而它所衡量的那项测验,几乎和我正在构建的东西是否真的有用毫无关系。

那个感觉像进展的数字

在某个时刻,我开始给自己的代码评定一个质量等级——一种关于它有多干净、有多有条理、感觉有多”完成”的判断——并一路追踪它。六十八变成了八十五。八十五变成了九十五。九十五一点点逼近一百。每一步都感觉像是一项我可以指出来的成就,而在一个漫长、不确定的项目里,一个可靠地往上走的数字是莫大的安慰。

这种感觉有多好,怎么形容都不为过。每一节工作结束时,都有向前推进的证据。按照我自己的记分卡,我赢了。

评分是真的;进展不是

问题在于,这个评分衡量的是手艺——整洁、结构、我对自己作品的那份自豪——而不是这个项目存在的唯一目的。这套系统在它真正的任务上,并不比几周前更好。我构建出了一张漂亮的、不断攀升的曲线图,所衡量的却是一个早已悄悄与目标脱钩的量。

这就是一个你为自己发明的指标的危险所在:没有任何东西迫使它与现实保持连接。它可以一升再升,而它本应代表的那个东西却纹丝不动地坐在原地。而正因为是定义了它,你会是最后一个察觉它已经漂移了的人。

为什么一个自编的指标如此诱人

诚实地面对我为什么这么做是有帮助的,因为这不是愚蠢。这是逃避,打扮成了勤勉。

真正的问题——这套系统在它的任务上真的变得更好了吗?——是艰难的、缓慢的,而且常常令人沮丧。答案以爬行的速度推进,如果它还动的话,而诚实的答案往往是”没有,还没”。那个自编的问题——我的代码干净吗?——则是轻松的、快速的,而且完全在我的掌控之中。当衡量你工作的真正标准既痛苦又遥远时,一个今天就回报你的标准几乎是无法抗拒的。你选择那个假指标,并不是因为你愚蠢。你选择它,是因为它对你温柔,而真正的那个不是。

动作与进展

从内部看,这两者几乎无法区分。我很忙。我在推送提交。我在解决问题,看着一个数字改善。我大脑用来侦测生产力的每一个信号都在放电。

但这其中几乎没有一点是朝着唯一重要的结果迈进。这是动作——真实的努力、真实的工作、确实付出的——指向一个我之所以选定、恰恰因为它容易命中的目标。动作在你做的时候感觉像进展。差别只会在后来才显现,当你抬起头,意识到自己走了多远,却离目标近了多么微不足道的一点点。

那个我拒绝去看的破绽

有一项检查本可以很快揭穿这一切,而我从未做过:更高的质量评分,是否对应着在真正任务上更好的结果?我从未把这两样东西放在一起画出来。如果我画了,我猜我会看到一条上升的线和一条平的线并排着,几乎没有迹象表明两者一起移动。

我想,我内心有一部分是知道的。回避这个对比并非疏忽;它是一种自我保护。那个自编的评分,只在我从不拿它去对照它假装能预测的那个东西时,才保有它的力量。

解法:衡量你真正想要的

修复的过程并不光鲜,还有点痛苦。我退役了那个虚荣的评分,把自己拖回到那个令人不适的问题——这套系统在它的本职上变得更好了吗?——并下定决心去追踪那个,哪怕它移动得很慢、长时间停滞、有时还倒退。

一个几乎不动的真指标,比一个一飞冲天的假指标更有价值。真的那个是被允许令人泄气的;这正是让它之所以为真的一部分。一个只会往上走、从不传递坏消息的数字,并没有在衡量任何能够反过来推动你的东西——换个说法,它可能根本没在衡量什么。

手艺是真实的——它只是不是目标

我想小心,别矫枉过正。干净的代码并非一文不值。结构、清晰、作品的质量——这些都是真实的,它们会累积复利,而一团乱麻终将扼死一个项目。错误从来不在于在意手艺。错误在于把它提拔为那个目标,因为真正的目标太不确定了,不敢直视。

一个手段可以是有价值的,却仍会变成一个陷阱,如果你让它来代替目的。我从中获得的纪律是,对任何一个正让我感觉良好的数字,不断地追问:这是我真正想要的东西,还是一个舒适的代理,被我抓来只因为真正的标准太难面对了?诚实的答案往往令人不适。事实证明,那份不适,正是你终于在看着正确的数字的更可靠的迹象之一。

— 不荐信号,不保收益,非投资建议。