Reinvent the Wheel

Matthias Endler

重新发明轮子

原文由 Matthias Endler 发布,订阅该博客

最有害的建议之一,就是“不要重复造轮子”。

这话往往出于好意,但通常出自两类人之口:

  • 自己尝试造过轮子、深知其中艰难的人
  • 从未尝试造过轮子、只是盲目听从这一告诫的人

无论哪一种,都会营造出一种压制好奇心与探索精神的氛围。庆幸的是,总有人没有听从这句忠告——现代生活的诸多便利,都要归功于他们。

即便从最浅显的层面看,这句忠告也是错的:如今的轮子比公元前4500至前3300年间发明的第一批轮子要好得多。而且,轮子能在不同文明和文化中被反复重新发明,这一点也至关重要

说明:在本文中,每当我提到“轮子”,都请你把它替换成你个人感兴趣的任何工具、协议、服务、技术或其他发明。

发明轮子就是学习

“我无法创造的东西,我就无法理解。”
——理查德·费曼,物理学家、诺贝尔奖得主

要想在根本上真正理解某样东西,你必须先能做出一个玩具版的原型。做得好不好并不重要,之后大可把它丢掉。

以计算机科学为例,许多概念常被认为超出了凡人的能力范围:比如协议、密码学和 Web 服务器。

更多人应该了解这些东西是如何运作的。因此我认为,人们不应害怕去亲手复刻它们。

一切皆是兔子洞

人们常常把最基础的东西视为理所当然。比如在编程中,字符串或路径就是极其复杂的概念。如果你对它们的原理感兴趣,亲手实现一个字符串库或路径库会是极好的练习。

即便最终无人使用你的成果,我敢说你也会收获颇丰。比如:

  • 日常事物中蕴藏着无限的复杂性。
  • 做出一个哪怕只对另一个人有用的东西,都是一次令人谦卑的经历。
  • 这些抽象也是和你一样的人创造的。它们并不完美,你完全可以在自己的设计中做出不同的权衡。

就最后一点而言,一切皆是权衡,每一个练手问题背后都有几十个、甚至上百个容易踩坑的地方。

在这个过程中,你必须就正确性、简洁性、功能性、可扩展性、性能、资源占用、可移植性等等做出抉择。

你的方案或许能在其中某几方面表现出色,但不可能面面俱到,也不可能满足所有用户。这也意味着,现有的方案同样存在缺陷,未必就是为了解决你的特定问题而设计的——无论它看起来多么成熟、稳固。

钻兔子洞本身就乐趣无穷,但它还有另一个好处:这是工程师实现进阶的少数几种途径之一……前提是你没有在做出可用的成果之前就半途而废。如果你总是在项目之间频繁切换,就什么也学不到。

重造轮子的理由

重造轮子有许多充分的理由:

  • 造出更好的轮子(以某种“更好”的定义而言)
  • 了解轮子是如何制造的
  • 教会他人关于轮子的知识
  • 了解轮子的发明者
  • 能够在轮子出问题时更换或修复它们
  • 在过程中学会制造轮子所需的工具
  • 体会构建更大系统(如一整辆车)意味着什么,哪怕只是其中的一小部分
  • 帮助某个需要特殊轮子的人。比如,为轮椅造一个轮子?

谁知道呢?你造出的轮子也许并不适合汽车,却可能正好适合……滑板或自行车?又或者,你没能造出更好的轮子,却在过程中想出了更棒的轮子测试方法。甚至,你的轮子根本就不是为了交通而生的!它可能是陶轮——据维基百科说,“一种用于将黏土塑形(称为拉坯)成圆形陶瓷器的机器”。你最终造出的,也可能是完全不同类型的轮子,比如方向盘或飞轮。我们需要更多跳出固有思维的人。

复用还是重造

当然,不要无视他人的成果——去研究它们,在合适的地方加以复用。不要因为不信任或不了解他人的工作就去重造轮子。反过来说,如果你从未尝试检验自己的知识,又怎能对自己的领域了解得足够深入,进而推动它向前发展呢?

我观察到,通过开展一个个小实验,你可以进展得非常快。尤其在软件工程中,构建小型原型既便宜又快捷。解决你自己的问题,从小处着手,保持简单,不断迭代。

所以,综合以上所有,我的建议是:

为洞见而重造,为影响而复用。

本文章由 muse-spark-1.2-contributor 进行翻译

评论