“重新发明轮子”最初是用来比喻不必要的重复劳动,但这个比喻似乎不太贴切,因为在人类漫长的历史长河中,轮子被重新发明了无数次。如果把“重新发明轮子”的比喻套用在计算机领域,可能不太恰当,因为很多广为流传的软件本身就是被反复发明的“轮子”,不能说是无谓的重复劳动。Linux是Unix的改造;MariaDBisareinventionofMySQL(MySQLisareinventionofPostgreSQLandOracle,PostgreSQLisareinventionofOracle);现代C++是旧C++的再发明,C++是C的再发明(C是B的再发明,是BCPL的再发明),Rust是C++和C的再发明;Clojure是LISP的再发明,是IPL和Lambda微积分的再发明;Haskell是SystemFC的再发明,SystemFC是SystemF的再发明,SystemF是LabmdaCalculus的再发明;DOT是OO的重塑;Kotlin是JavaInvention的重塑;Vim是Vi的改造;Wayland是Xorg的改造;Ubuntu是Debian的革新……我可以继续说下去。许多优秀的软件不会简单地向现有代码库添加新功能,而是会迭代以创建比以往更好的东西。GitHub上许多流行的代码存储库都有数百个分支,我们为每种类型的软件工具提供了许多不同的选择。人们常说“不要重新发明轮子”,却忽略了一个事实,即大多数优秀的计算机软件实际上都是重新发明的轮子,而不是全新的东西。这些变化是渐进的,我们在已有概念的基础上逐渐迭代,慢慢修改,让它们变得更好。这是一个永无止境的过程,甚至我们都忘记了从哪里开始,也不知道终点在哪里。我们只需要付出时间,这也许就是计算机编程的魔力吧。在这里,不存在资源短缺的问题,无论我们多么疯狂,总能创造出一些东西。重新发明轮子并不是罪过,只是我们需要知道何时以及如何重新发明轮子。没有合适的轮子?自己做!当你找不到可用的工具时,自己开发一个,而不是基于现有的库开发一个不太好用的“缺陷产品”。也许其他人也有相同的需求,那么您可以与他们分享您开发的工具。自己开发可能需要更长的时间,但会更有趣,并且由此产生的工具可能更好用。当然,具体如何操作完全取决于您。你可以像一些C语言开发者那样“勤奋”,甚至自己实现list和vector,也可以像一些JavaScript开发者那样“懒惰”,连最简单的判断奇数的函数都得从互联网。下载(例如日下载量超过10万的“is_odd”包,地址为https://www.npmjs.com/package/is-odd)。以朱莉娅为例。Julia是一种与Python非常相似的编程语言,不同之处在于更易于部署,无需虚拟环境即可运行,运行速度更快,支持大规模并发。Julia是一个重新发明的轮子,因为理论上它能做的,Cython也能做,只需要使用合适的C/C++库,稍微修改一下代码,再加上一点耐心。但Julia内置的便利性为开发者节省了大量时间,让开发变得更加有趣。或许,它将成为21世纪最受瞩目的编程语言之一。现有的轮子卡住了?制作!当很长一段时间都没有人重新发明轮子时,请考虑重新发明一个。这可能是因为轮子已经足够好了,不需要进行重大改进,但更有可能是因为大多数人想要更好的轮子,只是没有时间这样做。比如有些问题虽然暂时解决了,但也不是没有破绽,因为目前的技术或者框架无法提供更好的解决方案。这为等待更好的时机出现留下了空间。几年后,也许技术会发展到更好地解决这些问题。以图像识别为例,图像识别是一个经典的分类器问题。直到2010年,人们一直在努力研究分类器,当时使用FisherKernel等算法获得了非常准确的结果。当然,这些结果不足以检测肿瘤或自动驾驶汽车。在准确率和训练时间上,他们的水平只在鹦鹉和大象之间。直到有人重新发明了不太流行的卷积神经网络,并使用现代GPU来训练早在90年代就开发出来的图像识别模型。大名鼎鼎的AlexNet&Co出现于2012年,几年后,图像识别技术发展到了惊人的地步,在中型数据集上训练的分类器甚至可以打败人类。车轮所有权受限?制作!示例包括Linux、GCC和Git,所有这些都是对现有受版权保护的软件系统的重新发明。在某些方面,它们比受版权保护的软件更好,而且它们是开源的。这意味着更多的人在使用它,更多的人在开发它,这使他们能够以惊人的速度发展。只是为了好玩?制作!重新发明一个已经很强大的软件并没有错。你可能会失败,但你会从中学到很多东西。虽然其他人已经解决了大部分问题,但您仍然可以从解决同样的问题中获得乐趣。数以百万计的人想要证明勾股定理或重新发明一个新的LISP,虽然他们最终重新发明了同一个轮子,但他们所做的并没有错,只要他们乐在其中。如果你改造的轮子比原来的轮子好一点点,那也算是造福于人类了。想创造!无论如何都要去做,重新发明轮子不是罪过。如果有人说重新发明轮子没有用,就把马斯克造火箭的故事扔到他脸上。或许,你还可以开发更直观优雅的JavaScript库,或者更快的Python编译器,或者更便宜的计算单元,或者更好的Spotify,或者更高效的查找表……因为你是一个热爱创造的程序员~
