过度工程是我最爱的拖延方式
有那么一段时间,我在这个项目上拼命努力,产出惊人,对这一切感觉好极了——而实际上几乎没有任何真正的进展。我在设计这个系统宏大的未来:一套庞杂、由众多部分组成的架构,里面满是会相互协调、能够扩展、最终自我运转的组件。
唯一的问题是,这一切本应建立在其上的那个最基本的东西,还根本不能工作。完全不能。
在建好村庄之前就构建帝国
系统的核心——在其他一切重要之前,它首先必须做到的那一件根本性的事——还不能工作。它很不可靠,残缺不全,并且顽固地抗拒着我修复它的种种尝试。
于是,很自然地,我把注意力转向了将要坐落在它之上的那些层。各个部分如何彼此对话。它将如何扩展,去处理远远超出它目前所能——它现在连一点点都处理不了——的负载。它将如何在完工之后自我部署和自我更新。实际上,我是在为一家还没有产品的公司绘制一份详尽的组织架构图——为一家其唯一核心功能都跑不起来的企业,规划它的管理结构。
为什么过度工程让人感觉如此美妙
我想诚实地谈谈这为什么如此诱人,因为这份诱惑正是整个陷阱所在。设计未来的架构是一种纯粹的、毫无阻力的快乐。没有失败的测试盯着你看,没有顽固的 bug 死活不肯被解决,没有现实在推着、顶着你的计划。只有你,和一张干净的脑内示意图,在图里一切都完美契合,因为图里没有任何东西被迫真正运行过。
它之所以让人感觉是最有成效的那种工作,恰恰是因为它是毫无阻力的那种。而毫无阻力可以让人感觉像是在进步——直到你注意到,自己其实根本没有动过。
它诚实的名字:逃避
剥去那些自我美化的描述,这件事真正的本质,是逃避。核心问题——让那个最基本的东西工作起来——既困难、又令人沮丧,而且真的充满不确定性;我不知道自己能不能解决它,每一次尝试都把我的脸按进那份不确定里。相比之下,那套宏大的架构既轻松又能带来无尽的满足感。我在那里总能取得”进展”,因为”进展”无非意味着在示意图里再添上一个整齐的方框。
于是我不断地从那个困难的、真实的问题,逃向那个舒适的、想象出来的问题,并给这场逃跑起了一个体面的名字。我管它叫设计。
那个破绽:解决我还没遇到的问题
有一个明显的信号,我视而不见了很久。我设计的每一个精巧部件,解决的都是只有在基本系统能工作之后才会存在的问题。只有当各个部分能运转,协调才有意义。只有当有值得扩展的东西,扩展才有意义。只有当有完工的东西可以部署,自我部署才有意义。我在为一些问题精心准备答案,而我的项目还根本没有挣得提出这些问题的资格。
当你发现自己在解决一些其实还没遇到的问题时,值得问一问:你究竟是在逃避哪个问题。
代价比浪费时间更糟
损害远不止我倾注在那些想象出来的基础设施上的工时。我设计的那套精巧结构,变成了一种牢笼。一旦我认定了那个宏大的形态,那个真实问题真正需要的简单、直接的修复,就不得不从我过早地、围绕一个根本不能工作的系统裹上去的全部架构中,硬挤出一条路来。我为一座并不存在的建筑搭起了脚手架,然后还得先把脚手架拆掉,才能开始打地基。
过早的结构不只是浪费你的精力。它会主动地约束它本应服务的那个东西,而且它越是精巧,就越抗拒你最终不得不做出的那些微小而诚实的改动。
解法:先挣得下一层
最终真正帮到我的,是一条几乎直白到令人难堪的规则:在下面那一层真正能工作之前,你没有资格去建上面那一层。不是”已经设计好了”。不是”已经计划好了”。是能工作。扩展、协调、自动化——这些是你凭借拥有某个真实的、值得扩展的东西而挣来的奖赏,而不是你为了让自己感觉在做一件严肃的事,而提前添加上去的装饰。
我拆掉了那个想象中帝国的大部分。到头来,能够独自面对那一个我此前如此精心逃避的困难问题,反倒是一种解脱。
更深的教训:舒适可能是一个警告
我从中得到的最让人不舒服的东西,是对舒适本身的怀疑。当工作感觉纯粹地美好——毫无阻力、令人满足、没有失败、没有现实对你说不——那么很有可能,你已经悄悄地偏离了那个真正的问题,转向了一个更轻松的、想象出来的问题,而它恰好让人感觉像是同一回事。
困难的问题会反推回来。这正是你借以辨认它们是不是真问题的方式之一。所以现在,每当构建开始让人感觉可疑地愉悦,我都试着把这份愉悦当作一个问题、而不是一种奖赏来对待:我究竟是在通过如此享受这件事,来逃避哪个困难的、抗拒着我的、真正重要的东西?
— 不提供信号,不承诺收益,亦非投资建议。