速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

请继续重复发明轮子

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

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

关注

评论

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

从Integer开始阅读JDK源码

指尖流逝

Java jdk源码

制作Unknown Pleasures效果图的3种方法

张云金_GISer

设计 T恤 GIS 地图

Java新技术:文字块

X.F

Java 编程语言

为AndroidApk添加系统级签名

Howe

Java android

职场“35岁现象”:焦虑 or 出路?是时候说出真相了!

狂师

职场 成长 软件测试 测试 软件开发

Spring中的测试类~简洁方便

程序员的时光

spring

找工作不得不知道的事

熊斌

认知提升 求职

如何梳理画出牛逼的、高大上的架构图?

狂师

程序员 企业架构 开发者 软件测试 软件开发

程序员陪娃漫画系列——上学路上

孙苏勇

程序员 生活 陪伴 漫画

Nacos 1.1.4 与微服务的实践经验记录

itfinally

Java 微服务 nacos

缓存的五种设计模式

Rayjun

缓存

iOS Release 版本开启调试功能

liu_liu

ios release 调试

为什么每个软件人都要懂点系统架构?

刘华Kenneth

架构 DevOps 高可用 敏捷 高并发

Kafka系列第4篇:消息发送时,网络“偷偷”帮忙做的那点事儿

z小赵

kafka 推荐 实时计算

Redis学习笔记(概述)

编程随想曲

redis

Boyer-Moore 算法

Kenn

算法 数组 Boyer-Moore

动画设计的十个原则

养牛致富带头人

设计 动画

KubeFATE: 用云原生技术赋能联邦学习(二)

亨利笔记

Kubernetes 云原生 k8s FATE KUBEFATE

Dubbo 概述

会飞的猪

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

孙瑜

深度思考 程序员 感悟

游戏夜读 | 2020周记(4.3-4.10)

game1night

Java并发编程系列——锁顺序

孙苏勇

Java Java并发 并发编程 多线程

认识数据产品经理(一 数据产品经理的细分)

马踏飞机747

大数据 数据中台 数据分析 产品经理

聊聊测试工程师的价值

软件测试 质量 测试工程师产出 测试的价值

Spring Cloud概述

会飞的猪

技术人员加薪二三事

南方

管理 职场 技术管理 加薪 劈空掌

20 大类,100+ 网络副业兼职平台汇总推荐

一尘观世界

程序员 自由职业 副业 赚钱

记录自有意义

彭宏豪95

人生 写作 感悟 记录

JAVA中Base64加密与解密

Howe

Java base64 加密解密

动态规划问题的思路和技巧

Kenn

算法 动态规划

聊聊数据库原理和索引结构:1000万条数据优化后为什么能提升1500倍

牧码哥

MySQL 数据库 数据结构 性能优化 索引结构

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