最近在 Hacker News 上有一篇热门文章,叫做《重新发明轮子》。
观点很新颖,通读一下,我被文章说服了。
这篇文章的核心观点可以概括为:"重新发明轮子"其实是件好事,我们不应该盲目避免它。
作者认为这个建议害人不浅。就像告诉孩子"别碰这个别碰那个"一样,会扼杀好奇心和探索精神。
动手才能真懂。作者引用物理学家费曼的话:"我无法创造的东西,我就不理解"。这就像学做菜,光看菜谱永远不如亲自下厨房摸索一遍来得深刻。
哪怕是最基础的东西(比如编程中的字符串处理),其实都藏着无穷的复杂性。自己动手做一遍,你会发现"原来这么复杂!"
我感觉文章中最打破常规的观点是:
1、"失败也有价值"
传统观念认为重复造轮子是浪费时间,但作者说:即使你造出来的轮子不如现有的,这个过程本身就是巨大的收获。就像学画画,哪怕画得不好,但你理解了绘画的过程。
2、"一个轮子,多种可能"
最有意思的是,作者说你本来想造汽车轮子,结果可能造出了滑板轮子、陶艺轮子,甚至是方向盘。这种"歪打正着"的创新往往最有价值。
3、"小实验,大收获"
不要想着一步到位做出完美产品,而是快速做小实验、小原型。这就像学骑自行车,与其研究半天理论,不如直接上车摔几跤。
简单来讲,这篇文章就是在为"折腾"正名。它告诉我们:
1、好奇心比效率更重要 - 宁可"浪费时间"去探索,也不要一味追求现成答案
2、理解比使用更有价值 - 会用iPhone和会造iPhone是两个层次
3、失败是成功的学费 - 每次"重新发明轮子"的失败,都让你离真正的创新更近一步
作者最后的金句也很精辟:"为了洞察而重新发明,为了影响而重用" - 学习时要敢于从零开始折腾,但真正做事时要善于站在巨人肩膀上。
原文翻译如下:
最有害的建议之一就是"不要重新发明轮子"。
这个建议通常出于好意,但一般来自两类人:
那些曾经尝试过发明轮子并知道这有多困难的人
那些从未尝试过发明轮子却盲目遵循这个建议的人
无论如何,这两种立场都会导致一种阻碍好奇心和探索精神的氛围。我很庆幸有些人没有遵循这个建议;我们欠他们现代生活中的许多便利。
即使从表面上看,这个建议也是糟糕的:我们今天拥有的轮子比公元前4500-3300年第一个轮子被发明时要好得多。同样重要的是,轮子在各个文明和文化中都被重新发明过。
注意:当我在这篇文章中提到"轮子"时,请将其替换为你个人感兴趣的任何工具、协议、服务、技术或其他发明。
发明轮子就是学习
"我无法创造的东西,我就不理解" —— 理查德·费曼,物理学家和诺贝尔奖获得者
要真正从根本上理解某样东西,你必须能够首先实现一个简化版本。它是否好用并不重要;你可以稍后丢弃它。
例如,在计算机科学中,有许多概念通常被认为超出了普通人的能力范围:协议、密码学和网络服务器等等。
更多的人应该知道这些东西是如何工作的。因此,我认为人们不应该害怕重新创建它们。
一切都是兔子洞
基础的东西往往被理所当然地接受。例如,在编程中,字符串或路径是非常复杂的概念。如果你对它们的工作原理感兴趣,自己实现一个字符串或路径库是一个很好的练习。
即使最终没有人使用你的作品,我敢打赌你会学到很多。例如:
日常事物中有着无限的复杂性。 构建一个哪怕只有一个其他人觉得有用的东西,是一种令人谦卑的体验。 像你一样的人类创造了这些抽象概念。它们并不完美,你可以在自己的设计中做出不同的权衡。
关于最后一点,一切都是权衡,每个简单问题都有几十个,有时是几百个陷阱。
在这个过程中,你将不得不就正确性、简单性、功能性、可扩展性、性能、资源使用、可移植性等方面做出决策。
你的解决方案可以在其中一些方面表现出色,但不能在所有方面都表现出色,也不能满足所有用户的需求。这也意味着现有解决方案有缺陷,可能不是为了解决你的特定问题而设计的;无论这个解决方案多么成熟。
深入兔子洞本身就很有趣,但还有另一个好处:这是作为工程师提升水平的少数几种方法之一……但前提是你不能在最终得到你试图探索的东西的可用版本之前就放弃。如果你过于频繁地在项目之间跳跃,你将什么也学不到。
重新发明轮子的理由
重新发明轮子有很好的理由:
制造一个更好的轮子(在某种意义上更好)
学习轮子是如何制造的
向别人传授关于轮子的知识
了解轮子的发明者
能够在轮子坏了的时候更换或修理它们
在这个过程中学习制造轮子所需的工具
学习构建更大系统(比如车辆)意味着什么的一小部分
帮助需要非常特殊轮子的人。也许是为了轮椅?
谁知道呢?你想出的轮子可能不是汽车的最佳选择,但也许适用于……滑板或自行车?或者你在制造更好轮子方面失败了,但你在此过程中想出了测试轮子的更好方法。见鬼,你的轮子甚至可能根本不是用于交通工具的!它可能是陶轮,根据维基百科的说法,"一种用于将粘土塑形(称为拉坯)成圆形陶瓷制品的机器"。你可能最终会制造出完全不同类型的轮子,比如方向盘或飞轮。我们需要更多跳出框框思考的人。
重用 vs 重新发明
当然,不要忽视他人的工作——研究他们的工作,在你认为合适的地方重用。不要出于对他人工作的不信任或无知而重新发明轮子。另一方面,如果你从未尝试过检验自己的知识,你怎么能学到足够多的关于你所在领域的知识来推进它呢?
我观察到,通过进行小实验,你可以进展得非常快。特别是在软件工程中,构建小型原型既便宜又快速。解决你自己的问题,从小处开始,保持简单,不断迭代。
所以,综合以上所有内容,这是我的建议:
为了洞察而重新发明,为了影响而重用。