AI实践哪家强?来 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:232964
用户头像

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

关注

评论

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

vue3 name 属性的使用技巧

new_cheng

Vue 前端 Vue3 VUE 3.0 源码

2022最新CSS高频面试题指南

CoderBin

CSS 前端 面试题 秋招 10月月更

阿里云云边一体容器架构创新论文被云计算顶会 ACM SoCC 录用

阿里巴巴云原生

阿里云 云原生 容器服务

FlyFish一周年,社区大咖邀你共话开源!

云智慧AIOps社区

低代码 可视化 数据可视化 大屏可视化 无代码

专访韩向东|元年科技:专业与技术并重,赋能财务数字化转型

元年技术洞察

数字化转型 财务数字化

京东云开发者|京东云RDS数据迁移常见场景攻略

京东科技开发者

MySQL 数据同步 数据迁移 云迁移 数据订阅

NAT基础:NAT技术原理,静态NAT、动态NAT、NAPT、Easy IP、NAT Server的原理,以及各NAT的配置方法和转换示例。

Python-派大星

10月月更

JUC 浅析(四)

Andy

对话创始人:团队研发效能应该如何管理和度量?

LigaAI

团队管理 敏捷开发 研发管理 研发效能 企业号十月PK榜

教你处理数仓慢SQL常见定位问题

华为云开发者联盟

数据库 后端 华为云 企业号十月 PK 榜

如何提升研发效能?我们先从指标谈起

Kyligence

数据分析 指标管理

如何在C#或VB.NET程序中为幻灯片添加或删除批注

Geek_249eec

C# PPT VB.NET

27位技术实战派负责人齐聚 深聊降本增效 你一定不想错过!

阿里技术

云计算 云原生 云栖大会 降本增效

数字化时代,企业如何创新自己的客户服务

Baklib

ACL访问控制列表 基础、创建ACL访问控制列表的两种方式、配置ACL访问控制列表规则、修改ACL规则的默认步长。子网掩码、反掩码、通配符掩码的区别和作用。

Python-派大星

10月月更

要努力,但也别焦虑

源字节1号

程序人生

从清华大学到苏州经贸,双一流和普通高校都在使用的数据科学教学实训平台

ModelWhale

大数据 人才培养 数据竞赛 实训 教学

推广TrustAI可信分析:通过提升数据质量来增强在ERNIE模型下性能

汀丶人工智能

nlp

报名倒计时1天!平头哥、中科院软件所PLCT实验室等技术专家解读最新RISC-V技术

OpenAnolis小助手

报名 risc-v 云栖大会 Workshop 龙蜥峰会

区块链≠绿色?波卡或成Web3“生态环保”标杆

One Block Community

区块链 环保 波卡生态

36氪|元年科技发布新版数字化PaaS平台,更新多个组件

元年技术洞察

方舟 PaaS 中台战略 企业数字化

软件要想做的好,测试必定少不了

华为云开发者联盟

测试 开发 华为云 企业号十月 PK 榜

KubeVela 插件指南:轻松扩展你的平台专属能力

阿里巴巴云原生

阿里云 开源 容器 云原生 KubeVela

订单中心架构设计与实践

小小怪下士

Java 程序员 系统架构 架构设计

Spark on k8s在阿里云EMR的优化实践

阿里云大数据AI技术

大数据 spark 企业号十月PK榜

华为数通HCIA小型拓扑综合实验,运用OSPF动态路由协议、ACL访问控制列表,交换机生成树协议,修改交换机根桥、交换机划分vlan、链路聚合等相关数通技术、NAT地址转换以及NAT网络地址转换的配置

Python-派大星

10月月更

“程”风破浪的开发者|学习中的境界

林冲

学习方法 “程”风破浪的开发者

JUC 浅析(三)

Andy

软件测试丨接口测试该怎么做?持证上岗的Charles,可以帮你做什么?

测试人

软件测试 接口测试 charles 测试开发

手把手教你从安装CentOS7.4镜像开始,搭建IoT视频监控系统

华为云开发者联盟

后端 开发 华为云 企业号十月 PK 榜

阿里是如何使用分布式架构的?阿里内部学习手册分享

Java全栈架构师

架构 分布式 微服务 后端 高并发

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