报名参加CloudWeGo黑客松,奖金直推双丰收! 了解详情
写点什么

请继续重复发明轮子

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

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

关注

评论

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

Elastic search 单节点、两节点、三节点环境

escray

elasticsearch elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

IM即时通讯实现的原理

v16629866266

音视频又贵又卡还不够炫?云原生的华为云视频云服务带你重塑新体验

华为云开发者联盟

云原生 音视频 云服务 华为云

产品经理训练营-第一周-作业

邹小胖

产品经理训练营

也说一下996

张老蔫

28天写作

[ARTS-Review]Maximizing Developer Effectiveness Review

OutOfMemory1024

ARTS 打卡计划

Spring Boot 集成MyBatis

武哥聊编程

Java mybatis springboot SpringBoot 2 28天写作

KubeEdge应用案例 | 谐云基于云边协同平台,推进中移在线分公司IT技术架构产业升级

华为云原生团队

云计算 开源 云原生 边缘计算 边缘技术

Redis 学习笔记 06:压缩列表

架构精进之路

redis 七日更 28天写作

【小菜学网络】集线器

fasionchan

网络编程 计算机网络 网络协议 TCP/IP

产品经理 VS 项目经理 VS 需求工程师

王一凡

产品经理 项目经理 需求工程师

SpringCloud 从入门到精通10---Nacos安装和使用

Felix

简化业务代码开发:看Lambda表达式如何将代码封装为数据

华为云开发者联盟

函数式接口 数据 代码 函数 lambad

【小菜学网络】以太网帧结构

fasionchan

网络编程 计算机网络 网络协议 TCP/IP

产品经理书单推荐

王一凡

寻找学习资源的三种方式

石云升

学习方法 搜索技巧 28天写作

iTerm2 实现 ssh 自动登录,并使用 Zmodem 实现快速传输文件

米开朗基杨

iterm2

《2020年微信视频号研究报告》 | 视频号 28 天 (11)

赵新龙

28天写作

永续合约系统APP开发|永续合约软件开发

系统开发

Kafka 原理以及分区分配策略剖析

vivo互联网技术

大数据 kafka 文件存储 消息队列

地下钱庄简单介绍

IT方案内参

大数据 地下钱庄 技战法

8周架构

FreeOcean

全网呕血整理:关于YOLO v3原理分析

华为云开发者联盟

算法 计算 yolo

[ARTS-Share]OutOfMemory的Kafka学习笔记(1)

OutOfMemory1024

ARTS 打卡计划

第八周作业&总结

胡益

作业1

瑾瑾呀

合约跟单交易软件系统开发|合约跟单交易APP开发

系统开发

第十三周学习总结

晴空万里

架构师训练营第2期

亿级大表在线不锁表变更字段与索引

华为云开发者联盟

数据库 数据 索引 表格

架构师系列 14 PageRank算法

桃花原记

SpringCloud 从入门到精通 11---Nacos负载均衡

Felix

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