写点什么

请继续重复发明轮子

  • 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:232582
用户头像

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

关注

评论

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

游戏夜读 | 做游戏选什么专业?

game1night

科学治疗“知识焦虑症”

陈驰远

个人成长 知识管理

高仿瑞幸小程序 02 创建Tabbar

曾伟@喵先森

小程序 微信小程序 大前端 瑞幸

我看拼多多黄峥:旧世界瓦解冰消

池建强

拼多多 黄峥

思维偏差与产品设计的关联思考

石君

产品设计 思维方式 安全产品设计

我愿沉迷于学习,无法自拔(三)

孙瑜

深度思考 程序员 感悟

DDD 实践手册(3. Entity, Value Object)

Joshua

系统设计 领域驱动设计 系统架构 架构模式

CEPH OSD Down故障分析与处理

木子

File类的文件操作

Howe

Java File 文件 io

源码浅析 - CocoaLumberjack 3.6 之 DDLog

Edmond

ios log4j CocoaLumberjack SourceCode DDLog

我的关注清单

lmymirror

知识管理 关注清单 RSS

leetcode1137:第 N 个泰波那契数

Damien

算法 LeetCode 斐波那契

大家看看我这个斜杠青年够斜吗?

伯薇

个人成长 斜杠青年 能力提升 好奇心 T型人才

阿里29大开源项目看看你都用过哪些

Bruce Duan

每天一道 python 面试题 - Python中的元类(metaclass) 详细版本

志学Python

python 爬虫 python元类

用 Vim 编辑 Markdown 时直接粘贴图片

mzlogin

vim markdown

Netty 源码解析(五): Netty 的线程池分析

猿灯塔

哲少荐书:这才是心理学

Jackey

心理学 读书

[计算机网络1]我所知道的关于TCP的一切

海神名

TCP 计算机网络 网络协议 原理

企业如何选择物联网中台

老任物联网杂谈

物联网中台 IOT Platform 物联网平台

轻轻一扫,立刻扣款,付款码背后的原理你不想知道吗?

楼下小黑哥

支付宝 微信支付 支付系统 付款码

虚拟化Pod性能比物理机还要好,原因竟然是这样!

亨利笔记

Kubernetes 容器 k8s vSphere pod

缘起:很久很久以前

escray

学习 测试驱动开发实战营

树莓派小车系列-直播

波叽波叽啵😮一口盐汽水喷死你

树莓派 ffmpeg 云直播 盐汽水 raspberry

百度开源项目

Bruce Duan

译文MapReduce:大型集群上的简化数据处理

海神名

mapreduce 译文 MIT 分布式计算

架构师们必备的三三制需求分析思维模型

常平

leetcode20.有效的括号

Damien

算法 LeetCode

扩展Redis:增加Redis命令

心平气和

redis

Java并发编程系列——线程池

孙苏勇

Java Java并发 并发编程 多线程 线程池

下一个阶段,就真的容易了吗?

ke_lv

生活

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