写点什么

请继续重复发明轮子

  • 2018-04-18
  • 本文字数:2629 字

    阅读完需:约 9 分钟

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

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

人们之所以如此不厌其烦地重复发明轮子,是因为轮子的用途一直在变。轮子的作用从最开始的节省劳动力到让飞机安全着陆,再到运载具有超级杀伤力的武器。现如今,轮子既可以小到人类感觉不到它们的存在,也可以大到载着巨型坦克在任意路面上行驶,既可以坚固到载着时速 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

感谢郭蕾对本文的审校。

2018-04-18 18:232567
用户头像

发布了 731 篇内容, 共 447.1 次阅读, 收获喜欢 2001 次。

关注

评论

发布
暂无评论
发现更多内容

2022 年了,还不了解 PWA ? 教你 VuePress 博客如何快速兼容 PWA

冴羽

JavaScript Vue 前端 vuepress PWA

Flutter 容器盒子布局模型

岛上码农

flutter ios 安卓 移动端开发 3月月更

业内首家!百度智能云智慧金融业务通过ISO37301合规管理体系认证

百度大脑

12 款最棒 Vue 开源 UI 库测评 - 特别针对国内使用场景推荐

蒋川

Vue vue admin

如何在 Vue 中使用 Chart.js - 手把手教你搭可视化数据图表

蒋川

Vue PDF pdf阅读器

Web 键盘输入法应用开发指南 (6) —— 开发实战(一)

天择

JavaScript 键盘 实战 输入法 3月月更

社区人物志|缪翎:见证开源世界的女性力量

ApacheDoris

大数据 开源 数据分析 OLAP apache doris

selenium操作元素遇到的异常

红毛丹

selenium

如何避免在面试中看走眼

Hockor

个人成长 面试经验

python 编辑器提示 do not use bare except

AlwaysBeta

Python vscode 编辑器 pycharm Python PEP

企业如何快速地制作出电子产品宣传册?

小炮

全网渗透率达80%!“耳朵经济”将成为当下市场的流行趋势

易观分析

耳朵经济 在线音频

关于中国芯片,这些话如鲠在喉

脑极体

基于 XuperChain 的区块链项目从 0 到 N(二)

刘旭东

区块链 XuperChain

大画 Spark :: 网络(5)-Spark中的server端和client端

dclar

大数据 hadoop spark Spark 源码 大数据开发

Hoo虎符研究院|区块链简报20220307期

区块链前沿News

Hoo 虎符交易所 虎符研究院

高精度轻量级目标检测产业应用,实现多类通信塔识别

百度大脑

Amazon Graviton2上数据压缩算法性能比较

亚马逊云科技 (Amazon Web Services)

数据 应用性能

服务器被入侵了?反手溯源出入侵者画像【网络安全】

H

黑客 网络安全

Tech Talk 活动预告 | 为什么说 Serverless 是应用开发的未来?

亚马逊云科技 (Amazon Web Services)

Serverless

教你Mac下终端配置iterm2+oh-my-zsh+powerlevel10k

锋享前端

Mac iterm2

React Draggable 实现拖拽 - 最详细中文教程 - 卡拉云

蒋川

React

appsmith 怎么用?评价如何

蒋川

appsmith

「架构实战营」模块四作业 考试试卷存储方案

hxb

「架构实战营」

java高级用法之:无所不能的java,本地方法调用实况

程序那些事

Java Netty 程序那些事 3月月更

springsecurity默认用户生成

急需上岸的小谢

安全代码审计-PHP

网络安全学海

网络安全 信息安全 渗透测试 漏洞 代码审计

CompusAss校园社团小程序解决方案

CC同学

免费硬件、专属导师、豪华大礼|AI达人创造营第二期项目征集启动啦!

百度大脑

PingCode 全新子产品 Insight 开放内测

爱吃小舅的鱼

小程序的第六年,我们还能怎么玩?

知晓云

小程序 微信 小程序生态 小程序运营

请继续重复发明轮子_语言 & 开发_CerebraLab_InfoQ精选文章