我总是在重新造已经存在的轮子
在这个项目上,我把惊人多的时间浪费在了重新构建那些早已存在的东西上。我精心打磨、倾注心血地重新实现各种工具和基础设施,而这个世界本就已经有了它们——能用、经过测试,而且免费可取。在我动手的那一刻,每一个这样的决定都感觉完全合情合理。但把它们加在一起,就构成了整个项目中规模最大、也最本可避免的浪费之一。
承认这一点让人很不自在,因为每一个例子在当时都伴随着一个听上去像是稳健工程判断的理由。我花了很长时间才意识到,这些理由几乎总是某种我不愿正视之物的合理化借口。
理由听上去总是很充分
为自己动手造轮子辩护从来都不难。我自己造的会更贴合我的具体需求,而不是一个通用工具。我会彻底理解它,直到每一行代码,而不是信任一个黑盒。现有的方案有种种缺陷和恼人之处,而我可以绕开它们。我不想背上这个依赖、不想承受版本的频繁变动、不想接受别人替我做的那些决定。
这些论点里的每一个,偶尔确实是真的。而这恰恰正是它们如此危险的原因。因为绝大多数时候,它们根本不是真正的理由——它们只是一层听上去体面的外衣,用来掩盖一个与”什么对项目最好”毫无关系的动机。
构建比集成更有意思
下面才是底下那个诚实的东西,那个我不愿说出口的东西。构建新东西是充满创造性和满足感的。那是好玩的部分,是感觉像真正在做工程的部分,是你能做出各种决定、看着某样东西从无到有逐渐成形的部分。相比之下,集成别人的工具则琐碎、令人沮丧,还带着一丝难堪——要去读陌生的文档,要绕开你本不会做出的设计选择,要去调试一个你并未完全理解的交互。
于是我会伸手去抓”我自己造一个就好了”,不是因为那是正确的决定,而是因为那是更舒服的那个。然后,关键就在这里,我会把这份偏好包装成工程判断的语言,把一个由”我想做什么”驱动的决定,呈现得仿佛是由”项目需要什么”驱动的。那些合理化是真诚的,但它们大多也只是一套戏服。
真正的代价,是那个本该属于我的问题
真正的代价,甚至还不是我倾注在每一次重新发明上的那几周时间,尽管那已经够糟了。真正的代价是这些时间从什么地方被偷走了。我花在重建一个已解决问题上的每一段时光,都是我没有花在那唯一一个真正尚未解决、也真正属于我的问题上的时光——那件没有任何现成工具能替我完成的事,那个具体而困难的问题,正是这个项目一开始之所以存在的全部理由。
那才是只有我会去做的事。世界早已解决了通用的基础设施;除了我,没有人会去解决我真正的问题。可我却在把自己最稀缺、最宝贵的资源——我那有限的专注力供给——恰恰花在了最不需要它的那些部分上,而那个需要全部专注力的部分却在一旁等着。我把它整个搞反了。
重新发明是一笔你要永远缴纳的税
我同样低估的一点是:造一个你自己的版本并不是一次性成本。它是一项永久的负债。这个自制工具如今成了你的,要你来维护、调试、扩展和写文档,永远,而且只有你一个人。没有社区去发现并修复它的 bug。除了你自己写的文档之外没有别的文档。当它以一种你看不懂的方式崩溃时,没有人可以求助,因为这世上唯一的专家就是你,而你早已忘了它是怎么工作的。
那个被我嫌弃而抛开的现有工具,背后有许多人在维护,在我之前就已经被无数其他用户撞遍了它的边角、淬炼得足够坚固。而我的替代品,由一个疲惫不堪、手头还有一堆别的事要做的人独自维护。这种不对称在你造出它的那天并不会显现。它在那之后的每一天悄悄显现,作为压在其余一切之上的一笔税,而且会不断累积。
什么时候自己造轮子才真的是对的
平心而论,我并不想矫枉过正成”永远什么都别造”。有时候,自己动手造确实是正确的决定。当那个东西本身就是你的核心问题、那个真正困难的部分时,你当然要自己造——那就是正事。当不存在任何足够好的方案时。当现有的方案因为某个你能具体说清、并能为之辩护的理由而确实、确切地不适合你时。
最后这一点成了我的检验标准,而且是个很有用的标准。在为某个已经存在的东西构建替代品之前,现在我会强迫自己具体地、出声地说清楚:每一个现有方案究竟为什么无法满足我真正的需求。不是”我更喜欢我自己的”。不是”他们的很烦人”。而是一个具体的、站得住脚的理由。如果我拿不出这样一个理由——而且比我愿意承认的频率高得多的是,我拿不出——那么我做的就不是一个工程决定。我是在为那个更好玩的选择寻找合理化借口,而我应该去乖乖忍受无聊,用那个本就管用的东西。
把你的原创力花在它真正被需要的地方
帮助我最大的那个重新框定,是把原创性的努力看作一份严格有限的预算。你能用于深入的、新颖的、从零开始的工作的容量只有那么多,而你花在一个世界早已解决的问题上的每一份原创力,都是从那个只有你能解决的问题上直接偷走的一份。原创性之所以珍贵,恰恰因为它稀缺,而把它花在已解决的问题上是最昂贵的一种浪费,因为它挤占掉的东西太宝贵了。
所以这门功课,与直觉相反,是要在几乎所有地方都尽你所能地无聊、尽你所能地循规蹈矩——去借用,去复用,去接受那个不完美但管用的工具,去咽下别人设计带来的恼火——正是为了让你有余力,在那唯一一个原创性本身就是任务的地方,做到真正的原创。对载具要不折不扣地不原创,这样你才能为目的地留下一些东西。
更深的一课:目标是目的地,不是载具
这一切归根结底,是一个我从未察觉自己一直在犯的混淆:我悄悄地把构建东西等同于取得进展。它们并不是一回事。工具是载具。它们从来都不是目的地。从来没有人会因为我亲手打造出一个早已有十几种形态存在之物的精美版本而奖赏我——而那个真正的裁判,市场,更是丝毫不在乎我那重新实现的管道有多优雅。
唯一真正算数的,是朝着真正目标前进的距离。而重新发明,我后来才明白,是所有让你完美地原地不动的方式中,最赏心悦目、也最有满足感的一种——让你感觉很高产,产出了真实的成果,工作得很辛苦,却恰恰哪儿也没到达。我用构建来逃避的那份工作,正是那唯一一份真正属于我、该由我去做的工作。
— 没有信号,没有回报,不构成投资建议。