最难的纪律是什么都不做
在这个项目里,我必须修炼的最难的一项技能并不是技术性的。它是学会按住自己的手。让一件事在运行时自己跑下去——拒绝伸手进去”帮忙”——对我来说,结果比我追查过的任何 bug 都要难得多。原来我写代码的本事,远胜过我不去碰它的本事。
在你真正经历它之前,这话听起来微不足道。有很长一段时间,什么都不做是别人要求我做的最困难、也最重要的事,而我做得糟糕透顶。
干预的冲动
问题大致是这个样子。我会让某个东西跑起来——一个漫长的过程,它的全部意义就在于随时间展开——然后几分钟之内,我就开始像盯着一壶水那样盯着它看。一旦它看起来不妙,每一次早期的下跌、每一段难看的区间、每一处数字以我不喜欢的方式塌下去的地方,我都会感到一种近乎生理上的冲动,想要叫停它、改点什么、再从头来过。
等待让我觉得是在浪费。坐在那里看着一次毫无希望的运行,让我觉得不负责任,几乎是懒惰,仿佛我在放任一个有能力的人本该修好的问题溃烂下去。于是我就去干预。一刻不停地干预。
每一次干预都是一次微小的过拟合
让我难堪地花了很长时间才弄明白的,是那些干预到底是什么。当我伸手进去、为了一小段短促而充满噪声的区间而改动某样东西时,我并不是在修复问题。我是在把自己的决策拟合到随机性上。
我是在把整个过程调校到我恰好正盯着的最后那几下抖动上——而这些抖动,在如此短的窗口里,几乎不携带任何关于任何事的真实信息。每一个小小的”修复”,都是我在手动过拟合:把工作硬掰过去,去迎合最近的噪声,这正是我在代码里深知要规避的那种罪过,却被我用自己那双不安分的手亲手犯下。我在自己的软件里精心筑起了防止过拟合的防线,却把最大的那个窟窿敞开着留在了自己身上。
短期里噪声看起来就像信号
让这个陷阱如此有效的原因在于:在足够短的一段区间里,噪声是信号天衣无缝的冒名顶替者。一段随机的糟糕区间,看起来与一个真正的问题分毫不差。一段随机的良好区间,看起来与成功分毫不差。在当下,靠盯得更用力是没办法把它们区分开的——而盯得更用力恰恰是我的全部策略。
于是我几乎每一次早期的反应,都是在对一次被我误当成判决的抛硬币做出反应。我会看到接连几次糟糕的结果,断定这套办法已经坏掉,然后把它拆个稀烂——而老实说,接连几次糟糕的结果,恰恰是你有时本就该预料会看到的,哪怕出自一个运转正常的东西。我是在从静电杂音里读出意义来。
真正的 bug 是我的焦虑
最终我不得不承认那个真正的缺陷藏在哪里。它不在那些运行里。它在我身上——具体说,在我无力分辨”这东西不管用”和”这东西还没把话说完”之间的区别。这两种状态从外面看一模一样,而我没有耐心让其中一种沉淀成另一种。
它底下是一种需求:需要感觉自己在忙,需要看得见地做着点什么,需要把我的不适转化成行动。而这种需求并不是中性的。它在主动地腐蚀我正在跑的那些实验本身,因为那些实验需要时间和静止才能有意义,而这两样我都一直没给它。
预先把耐心定下来
当我终于找到那个解法时,它靠的是流程而非巧思,而且它的直白里带着几分让人下不来台的谦卑。在开始一件事之前,我会事先决定:它被允许跑多久,以及什么才真正算得上是支持或反对它的证据。然后——这才是难的部分——我会守住这个约定,拒绝让自己根据中途的样子去碰它。
要点在于,把决定从我此刻焦虑的手里夺过来,交到一个更冷静、事先想清楚过的我手里。那个实时盯着运行、感到那股想干预的痒的我,已经反复证明了他不能被托付以操控权。
什么都不做,本身就是在做事
帮助我最大的那次重新框定,是意识到克制并不是无所事事。选择不去干预——当干预会腐蚀测量时——这本身就是一种主动的、深思熟虑的、真正困难的纪律。它只是看起来像什么都不做。从内部看,在每一个本能都在尖叫着催你行动时按住不动,是世上最艰难的工作之一。
这个项目里很多真正的工作,结果恰恰以这种方式隐于无形:不是那些戏剧性的修复,而是那个安静、毫不光鲜的举动——在行动只会把事情弄得更糟时,不去行动。
更深的一课
这慢慢改变了我对”进展”本身的看法。我曾经算作早期”生产力”的很大一部分——那些重启、那些微调、那些没完没了的摆弄——不过是被换算成动作的焦虑罢了。它感觉像工作。其中相当一部分其实是损害,被打扮成了勤勉。
我渐渐看清,真正的进展从外面看往往就像在等待。就像让证据按它自己的节奏累积,而不是要求它照我情绪的时间表赶到。学会保持静止——在我对一件东西下判断之前,让它跑得足够久,久到真正具有意义——结果与我一路上学到的任何技巧同样重要。市场从来不会因为我忙碌而奖赏我。它只是偶尔会因为我正确而奖赏我,而正确,通常首先要求耐心。
— 不荐信号,不保收益,非投资建议。