• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

请继续重复发明轮子

相关文章 搞代码 7年前 (2018-06-26) 175次浏览 已收录 0个评论
文章目录[隐藏]

  “重复发明轮子”这句话原本用于比喻无谓的重复劳动,但这个比喻似乎也不那么恰当,因为在人类的历史长河中,轮子已经被重复发明了无数次。

请继续重复发明轮子

  制作轮子的材料在变化,从石头、木头到金属合金、碳纤维。轮子的组成和比例在变化,从厚实饱满、粗糙到精细镂空、带有数百个轮辐。轮胎和轮轴在变化,所以轮子也得重新设计。轮子滚动的路面和使用轮子的机械装置在变化,所以轮子也跟着变。即使是轮子的形状也难逃改变的命运,甚至出现了方形的轮子。

  人们之所以如此不厌其烦地重复发明轮子,是因为轮子的用途一直在变。轮子的作用从最开始的节省劳动力到让飞机安全着陆,再到运载具有超级杀伤力的武器。现如今,轮子既可以小到人类感觉不到它们的存在,也可以大到载着巨型坦克在任意路面上行驶,既可以坚固到载着时速500公里的高速列车飞驰,也可以智能到让机器人在外星球上行走探险。

 重复发明轮子与编程

  如果把“重复发明轮子”这个比喻放到计算机领域,也不见得太恰当,因为有很多广泛流传的软件本身就是被重复发明的“轮子”,不能说它们是无谓的重复劳动。linux是对Unix的重新发明,MariaDB是对mysql(MySQL是对PostgreSQL和oracle的重新发明,而PostgreSQL是对Oracle的重新发明)的重新发明,现代C++是对老版C++的重新发明,C++是对c语言(C语言是对B语言的重新发明,而B语言是对BCPL的重新发明)的重新发明,Rust是对C++和C语言的重新发明,Clojure是对LISP的重新发明,LISP是对IPL和Lambda Calculus的重新发明,Haskell是对System FC的重新发明,System FC是对System F的重新发明,System F是对Labmda Calculus的重新发明,DOT是对OO的重新发明,Kotlin是对java的重新发明……我可以举无数个这样的例子。Vim是对Vi的重新发明,Wayland是对Xorg的重新发明,Ubuntu是对Debian的重新发明。

  很多优秀的软件并不只是简单地往已有代码库中添加新特性而已,而是通过不断迭代,创造出比以往更好的东西。GitHub上很多流行的代码库都有数百个分支,而对于每一类软件工具,我们又有很多不同的选择。

  人们经常说“不要重复发明轮子”,但他们忽略了这样的一个事实:大部分优秀的计算机软件实际上就是被重复发明的轮子,而并非是全新的东西。这些变化是循序渐进的,我们基于已有的概念逐步迭代,慢慢修改它们,让它们变得更好。这是个无穷尽的过程,甚至我们忘记了自己是从哪里出发的,也不知道终点在哪里。我们唯一要付出的是时间,也许这就是计算机编程的神奇之处。在这里,没有所谓的资源短缺,也不管我们如何疯狂,我们总能创造出一些东西。

  重复发明轮子不是罪,只是我们要知道在何时以及如何重复发明轮子。

 当没有合适的轮子可用时

  在找不到可用的工具时,就自己开发一个,而不是基于已有的库开发一个不那么好用的“次品”。或许其他人也有同样的需求,那么就可以把你开发的工具分享给他们。自己开发可能需要更长时间,但会更有趣,而且开发出来的工具可能更好用。当然,具体要怎么做,完全取决于你自己。你可以“勤快”得像某些C语言开发者一样,连list和vector都要自己实现,也可以“懒惰”得像某些JavaScript开发者一样,连最简单的判断奇数的函数都要从网上下载(比如日下载量超过十万的“is_odd”包,地址是https://www.npmjs.com/package/is-odd)。

  以Julia为例,Julia是一门与Python非常像的编程语言,只是它更容易部署,不需要虚拟环境就可以运行,它运行更快,而且支持大规模的并发。Julia就是一个被重复发明的轮子,因为从理论上说,它所能做的事情,Cython也能做到,只要使用恰当的C/C++库,修改一点代码,再加上一点耐心就可以。但Julia与生俱来就提供了便利性,为开发人员节省了大量时间,还让开发变得更有趣。或许,它会是21世纪最让人瞩目的编程语言之一。

 当现有的轮子停滞不前时

  当很久没有人重复发明轮子,就可以考虑重新发明一个。出现这种情况,可能是因为现在的轮子已经够好了,没必要做出大的改进,但更有可能是因为大多数人希望有更好的轮子,只是他们没有时间去做。比如,有些问题虽然暂时得到了解决,但并不完美,因为当前的技术或框架无法提供更好的解决方案。这就留有余地,等待更好的时机出现。数年之后,或许技术发展到可以更好地解决这些问题。

  以图像识别为例,图像识别属于经典的分类器问题。人们在分类器问题上不断努力改进,直到2010年,通过使用Fisher Kernel这类算法才让分类器得到了非常精确的结果。当然,这些成果还不足以用于检测癌症肿瘤或汽车自动驾驶,从精确度和训练时间方面来看,它们的水平还只是处在鹦鹉和大象之间。直到有人重新发明了并不太流行的卷积神经网络,还使用了现代的GPU来训练那些早在90年代就开发出来的图像识别模型。2012年出现了著名的AlexNet&Co,而几年之后,图像识别技术发展到令人惊诧的地步,在中型数据集上训练出来的分类器甚至可以打败人类。

 当轮子受到所有权限制时

  比如Linux、GCC和Git,它们都是对已有版权软件系统的重新发明。在某些方面,它们比版权软件更好,而且它们是开源的。这意味着有更多的人在使用,有更多的人参与开发,这让它们能够以惊人的速度发展演化。

 当你觉得这样做很有趣时

  对一个已经很完美的软件来一次重新发明,这样做也没什么错。你可能会失败,但你会从中学到很多。尽管别人已经解决了大部分问题,但你仍然能够从解决同样的问题中获得有趣的体验。数百万人想证明勾股定理或重新发明新的LISP,虽说他们最终不过是在重复发明相似的轮子,但他们所做的并没有什么错,只要他们能够从中获得乐趣。而如果你重新发明的轮子哪怕只是比原先的好那么一点点,都算是在造福人类。

 写在后面

  尽管放手去做吧,重复发明轮子不是罪。如果有人说重复发明轮子是无用功,那就告诉他们,你所做的其实是领域发展的基石。还记得那位在31岁就成为硅谷亿万富豪的马斯克吗,他对天体物理学和数学也只是懂点皮毛,却凭着数千万美金就让多国的航天局“颜面扫地”。要知道,这些航天局动不动就有数千亿的资金预算,还有数不清的博士和工程师为他们工作。马斯克发明了一个更便宜、更强大、更安全、更简便、更快的“轮子”。或许,你也可以开发出一个更直观、更优雅的JavaScript库,或者一个更快的Python编译器,或者一个更便宜的计算单元,或者一个更好的Spotify,或者一个更高效的查找表……谁知道呢,一切皆有可能!

  英文原文:https://blog.cerebralab.com/#!/blog/11

欢迎大家阅读《请继续重复发明轮子》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:请继续重复发明轮子

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址