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

如果把“重复发明轮子”这个比喻放到计算机领域,也不见得太恰当,因为有很多广泛流传的软件本身就是被重复发明的“轮子”,不能说它们是无谓的重复劳动。

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,虽说他们最终不过是在重复发明相似的轮子,但他们所做的并没有什么错,只要他们能够从中获得乐趣。而如果你重新发明的轮子哪怕只是比原先的好那么一点点,都算是在造福人类。

想造就造!

尽管放手去做吧,重复发明轮子不是罪。

如果有人说重复发明轮子是无用功,就把马斯克造火箭的故事甩他脸上。

或许,你也可以开发出一个更直观、更优雅的 JavaScript 库,或者一个更快的 Python 编译器,或者一个更便宜的计算单元,或者一个更好的 Spotify,或者一个更高效的查找表……

因为你是热爱创造的程序员呀~

【编辑推荐】

【责任编辑:张燕妮 TEL:(010)68476606】

点赞 0

c语言 项目 轮子,程序员们为什么热衷于发明轮子?相关推荐

  1. c语言笔记——黑马程序员上课笔记

    C语言概述 1.1 什么是C语言 一提到语言这个词语,自然会想到的是像英语.汉语等这样的自然语言,因为它是人和人交换信息不可缺少的工具. 而今天计算机遍布了我们生活的每一个角落,除了人和人的相互交流之 ...

  2. 代码项目好程序员的标准

    这两天一直在学习代码项目之类的题问,上午正好有机会和大家共享一下. 序 决解题问的力能 知识积聚 自学力能 品尝 解了确准的事做方法 通沟的力能 对作工负责, 对代码有求追 怎么高提自己决解题问的力能 ...

  3. 关于C语言,C程序员的我想说两句...

    2019独角兽企业重金招聘Python工程师标准>>> #应用层C程序员有话说 C语言作为一门较低层的语言,有着她独有的特点 ##简约而不简单的C语言    C的历史很悠久了,就语言 ...

  4. java程序员工资和c语言工资_2017程序员薪资大爆料!你在哪个阶段?

    [[tupian4302]] 众所周知,程序员是一份高薪的职业,当然这是在同等级岗位下不同行业对比所得出的. 从调查结果来看,工作3年内,1/5的程序员群体年收入在6万以下. 1/5的程序员在3年内年 ...

  5. db和model用哪个开发大型项目 thinkphp_Java程序员开发大型应用程序时,必须要掌握几个的技巧...

    假如你是一名Java开发者,正在开发和维护包含2000个类并使用了很多框架的应用程序.你要如何理解这些代码呢?在典型的Java企业项目小组中,大部分能够帮你的高级工程师看起来都很忙,文档也很少.你需要 ...

  6. C语言?看女程序员是怎么往死里坑师兄的

    我有一个师兄一个很神奇的师兄之所以说他神奇是因为他真的很神奇师兄是个典型的学霸本科跟我一样是学土木工程的,后来考研又跨专业考到了计算机,毕业后成为一名程序员.他说你知道我为什么做程序员么?因为我可以随 ...

  7. 程序员学c语言吗,为什么程序员要学C语言

    请点击此处输入图片描述 C语言不是面向对象语言.因为这一点,任何程序员学习C语言必须学会用函数思考问题.当程序员真正的去学习一门面向对象语言时,就会有C语言的函数学习基础去对比.这会使学习面向对象编程 ...

  8. 学了java有必要学c语言吗_程序员有必要学习C语言吗?这几点原因很现实

    原标题:程序员有必要学习C语言吗?这几点原因很现实 C语言是编程语言中的一种,有不少程序员会有这样的疑问?难道做程序员就必须要学习C语言吗?甚至有人觉得,我平时的工作中也用不到C语言我为什么要学习呢? ...

  9. python实训项目-黑马程序员上海校区Python21期Django项目实训

    黑马程序员上海中心 月薪一万只是起点 关注 晚上十点,一名名Python学生正在酣畅淋漓地撸代码,手指不间断地敲击着键盘,发出机械而清脆的声音. 各个小组在经过为期4天的django项目小组开发,终于 ...

  10. 如果用编程语言参加战争,哪门语言才是程序员的最强武器?

    对程序员来说,编程语言就是武器,但有的武器好用,有的武器不好用,有的武器甚至会杀了自己 C语言是M1式加兰德步枪,很老但可靠. C++是双截棍,挥舞起来很强悍,很吸引人,但需要你多年的磨练来掌握,很多 ...

最新文章

  1. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用
  2. SCCM 2012 SP1系列(十)配置补丁更新-3
  3. 我在Archlinux下使用的软件
  4. 用Visual C#来清空回收站(1)
  5. Java项目代码结构
  6. SAP CRM One order appointment duration table
  7. 【机器学习经典算法源码分析系列】-- 逻辑回归
  8. 重读模式与架构(2)——层次划分的依据和角色职责
  9. 【论文笔记】基于强化学习的句子摘要排序
  10. CAD建模软件:BricsCAD 22 for Mac
  11. 集成ahci驱动的xp系统_IDE转AHCI模式 for win7+SSD
  12. linux版本搜狗,搜狗输入法linux版下载
  13. linux 中文转unicode,Linux下汉字编码的转换
  14. 2019大裁员!年关将至,最高裁员比例竟达90%?
  15. 【MAC M1芯片】PS已解决在M1苹果电脑上出现“液化”和WEB等黑屏问题
  16. 好玩的Python彩蛋
  17. 万有引力品牌战略全新升级,正式更名库奈光年
  18. 史上最全最强的手机软件列表(特别推荐)
  19. 关于我上传的资源!!
  20. 《国庆中秋除了发月饼,企业更应该做什么?》

热门文章

  1. iOS亮屏解锁命令【iOS自动化测试】--使用ssh
  2. 63岁老太太不远千里来传销 被玩坏的IPFS矿机游戏
  3. 第三方定量定性检测质谱实验
  4. [面试系列]牛客网前端社招面试
  5. 3G网络和4G网络的区别
  6. ios用xib实现三等分以及多等分思路
  7. Android WebView 跳转第三方App
  8. (机器学习)C均值算法(K-Means)之误差平方和推导
  9. uni-app 小程序分享到朋友和朋友圈
  10. cisco思科模拟器中断translating域名翻译快捷键