程序员为什么热衷造轮子

article/2025/9/30 18:53:37

搜索一下“造轮子”或者“程序员为什么喜欢造轮子”,会看到很多相关的讨论,这是个老生常谈的话题,很多人谈过了,谈了很多年。不过还是有再谈的必要。

造轮子”的含义:

明知道你做的不可能比前辈做得更好,却仍然坚持要做。

就软件开发而言,“造轮子”是指,“业界已经有公认的软件或者库了,却还坚持要自己做”。

在软件开发过程中,有时你想造轮子老板却极力反对,有时你不想造轮子老板却坚持要造一个出来,为什么会有这种两极状况?

这篇文章就来讨论“造轮子”这件事,包括下列主题:

  • 程序员为什么会重复造轮子
  • 为什么有人不让“造轮子”
  • 什么时候可以造轮子

为什么会重复造轮子?

每个造轮子的程序员都有自己“不得不造”的理由。比如:

  • 以为自己的需求独一无二,现有的库就是在某个点上满足不了
  • 老轮子没有规格说明书,或者接口太复杂,不知道怎么用,搞明白太难
  • 需要在老轮子上添加新功能,然而老轮子代码难读无人可问,不知道何时能弄明白,看不到结果,容易放弃
  • 眼界有限,不知道已有这样的轮子
  • 版权原因无法使用第三方库,比如Google Android实现JVM(Google曾因为一行代码而和Oracle打官司),比如阿里YunOS自己实现JVM
  • 就想锻炼自己,因为造轮子对自己的设计、编码能力有很大好处,对理解业务也有很大好处
  • 自己造轮子,有“控制感”,看得见摸的着,可以一步一步来,一个一个小目标迭代出大目标,不断成功的小激励,会带给自己前行的动力
  • 创新成分多(对自己而言),有成就感
  • 不相信老轮子,譬如老轮子可能有后门、漏洞(想想OpenSSL的心脏出血漏洞)、后期万一要修改没把握等,反正是觉得自己造轮子心里更踏实
  • 不想让自己产品的关键技术掌握在别人手里,也不想让自己的核心用户数据流经别人的系统
  • 别人的轮子不开放,我就是要赶紧造(山寨)一个出来以便获得话语权或商业利益

为什么有人不让“造轮子”

有坚持要造轮子的,也有高呼“不要重复造轮子”的。那为什么有人不让造轮子呢?

  • 项目(产品)时间紧张,用第三方库搭积木快,能节约时间
  • 领导上(或队友)认为想造轮子的程序员水平就那样,不可能造出比现有库(软件)更好的轮子,显然会漏洞百出推高维护成本
  • 造轮子是个看上去很美做起来很操蛋的事儿。复杂一点的轮子,造出来很费劲,道阻且长,很可能骑虎难下或半途而废,导致精力和时间的浪费
  • 待造的轮子不是产品的关键(比如一个字符串类、一个XML解析类),不属于核心竞争力,不值得花费人力,要把精力放在最重要的事情上

结合为什么要造轮子以及为什么不让造轮子,就可以理解本文一开始提到的那种反差极大的状况。

什么样的轮子可以重新造?

看现在的软件发展趋势,越来越多的基础服务能够“开箱即用”、“拿来用就好”,越来越多的新软件可以通过组合已有类库、服务以搭积木的方式完成。这是趋势,将来不懂开发语言的人都可以通过利用现有软件组件快速构建出能解决实际问题的软件产品。

在这种趋势下,软件(服务)就慢慢演化为两极:

  • 满足终端用户的应用类产品
  • 解决软件产品通用问题的基础服务(组件)

比如你在自己的App中需要即时通信功能,完全可以使用融云、环信、网易云信等服务快速集成。

比如你想在自己的App中添加支付功能,完全可以使用Ping++或Pay++来解决诸多支付渠道的集成问题。

比如你想添加分享功能,ShareSDK、友盟SDK可以节省你很多时间。

比如你想做跨平台的游戏,使用Cocos2d-x远比自己在Android、iOS上从底层从OpenGL ES干起要高效得多。

比如你想让你的网站支持更多用户更多并发,能够快速部署、迁移、规模复制,那完全可以借助阿里云、AWS、Azure等而没必要自己搞。

比如你想推送消息给用户,就可以用腾讯信鸽、极光、个推、百度云推送、友盟等。

……

类似的场景很多很多。这种趋势使得一部分厂商集中精力开发基础服务(组件),一部分企业集中精力解决用户需求。对基础服务(组件)厂商来讲,他通过解决更复杂的基础问题为其他厂商带来便利而盈利。对终端软件产品企业来讲,他通过解决用户问题给用户创造价值而盈利,从理论上讲,只要其产品从用户端或第三方获取的价值大于支出给基础服务厂商的价值,生意就可以做下去。

有了这样的认识,什么样时候可以造轮子什么时候最好不重复造轮子就不再是问题了。

对于提供基础服务的软件厂商,很多轮子必须造。因为他要提供服务给其他软件厂商,你拿友商的组件换个包装提供给其他软件厂商,没有竞争力。所以你看到在某个软件服务市场上,会有多家企业各自在造轮子,为的就是自己掌握核心科技有自己的竞争力。比如提供云服务的,有阿里,七牛,百度……比如提供即时通信服务的,有融云、环信、阿里云信……比如提供语音服务的,有科大讯飞、百度、OKVoice、Google、微软……

对于开发满足终端用户的应用类产品的公司,很多轮子就没必要造。比如你提供一个健身类的App,可能需要引入即时通信功能,用第三就好了。

从公司的角度讲是这个样子,那对程序员来讲呢?

对程序员来讲,在一开始的学习成长阶段,造轮子则具有特殊的学习意义,学习别人怎么造,了解内部机理,自己造造看,这是非常好的锻炼。每次学习新技术都可以用这种方式来练习。

当我们掌握了一门技术,可以用于实际产品开发中时,关于造轮子,就有了另外的划分:

一些基础的工具类库,比如String,比如Xml,比如Json,比如Http,比如推送,比如流媒体协议,重新造的必要性不大。而与业务相关的,可以尝试重构、再造,对理解业务有好处,也能更好适应新需求。


相关阅读:

  • 怎样新学一门技术
  • 问答 | 学习编程语言最好的方法是什么

老觉得在混日子?老迷惘找不到方向?老嫌薪水低?关注我的订阅号“程序视界”:


http://chatgpt.dhexx.cn/article/F0A1ejC2.shtml

相关文章

「轮子」是什么东西?创造它有什么意义?

程序员圈经常流行的一句话:“不要重复造轮子”。在计算机领域,我们将封装好的组件、库,叫做轮子。因为它可以拿来直接用,直接塞进我们的项目中,就能实现对应的功能。 有些同学会问,人家都已经做好了&#x…

Java获取当前日期的前后一天/一周/一月/一年

Date today new Date(); //当前时间 Calendar calendar Calendar.getInstance(); //得到日历 calendar.setTime(today);//把当前时间赋给日历 calendar.add(Calendar.DAY_OF_MONTH, -1); //设置为前一天 Date yesterday calendar.getTime(); //得到前一天的时间 calend…

java获取当前的年月日日期

import java.util.Calendar; import java.util.Date;public class Main {public static void main(String[] args) {Calendar cal Calendar.getInstance();Date datenew Date();//现在的日期cal.setTime(date);Integer yearcal.get(Calendar.YEAR);//获取年Integer month cal…

java获取当前日期(JAVA获取当前日期的前三天工作日)

在java里怎么取离当前日期最近的一个星期天??知道getNow import java。util。Calendar; import java。util。Date; public class Test { public static void main(String args[]){ //获得当前日期 Date date new Date(); Calendar cal tInstance…

Java 获取当前日期并且实现日期的格式化

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 点击跳转浏览。 今天做一个需求是 实现当前事件减去100天并且格式化为下图所示 实现代码如下: String time "";if(S…

Java获取当前日期的前一天

Java获取当前日期的前一天 //获取当前日期Date date new Date();//格式转换SimpleDateFormat f new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Calendar calendar Calendar.getInstance();//设置当前时间calendar.setTime(date);//在当前时间基础上减一年calendar…

Java获取当前时间的方法

1、 System.currentTimeMillis() 获取标准时间可以使用 System.currentTimeMillis() 方法来获取,此方法优势是不受时区的影响,但是得到结果是时间戳的格式,如: 1543105352845 可以通过代码将时间戳转化为我们可以理解的格式&…

Java获取当前日期和时间

文章目录 1、 System.currentTimeMillis()2、 Java.util.Date3、 Calendar API4、 Date/Time API4.1 LocalDate4.2 LocalTime4.3 LocalDateTime4.4 ZonedDateTime 5、 总结 1、 System.currentTimeMillis() 获取标准时间可以使用 System.currentTimeMillis() 方法来获取&#…

Java如何获取当前日期和时间?

本文将为您介绍 Java 中关于日期和时间获取的方法,以及介绍 Java 8 中获取日期和时间的全新API。 1、 System.currentTimeMillis() 获取标准时间可以使用 System.currentTimeMillis() 方法来获取,此方法优势是不受时区的影响,但是得到结果是…

孪生网络 Siamese Network

文章目录 孪生网络的发展孪生网络定义功能与用途损失函数 孪生网络的发展 孪生网络又称为连体网络,网络中的连体是通过共享权值来实现。孪生网络最早是出现在1993年的论文《Signature Verification using a ‘Siamese’ Time Delay Neural Network》用于美国支票上…

论文笔记:孪生神经网络(Siamese Network)

Siamese Network 原文:《Learning a Similarity Metric Discriminatively, with Application to Face Verification》 1、四个问题 要解决什么问题? 用于解决类别很多(或者说不确定),然而训练样本的类别数较少的分类…

SiameseFC超详解

SiameseFC 前言论文来源参考文章 论文原理解读首先要知道什么是SOT?(Siamese要做什么)SiameseFC要解决什么问题?SiameseFC用了什么方法解决?SiameseFC网络效果如何?SiameseFC基本框架结构SiameseFC网络结构…

Siamese网络代码详解 训练自定义数据集 模型推理

开门见山,Siamese网络结构如下所示: 主干网络:VGG16。整个VGG16的网络结构比较简单,如下图所示,主要分为5个部分: stage1为 2次33卷积+1次22最大池化,输出特征为64通道;stage2为 2次33卷积+1次22最大池化,输出特征为128通道;stage1为 3次33卷积+1次22最大池化,输出…

深度学习(自监督:SimSiam)——Exploring Simple Siamese Representation Learning

文章目录 前言SimSiam简述实验 前言 该文章是何凯明组发表于CVPR2021上的文章,目前已获得最佳论文提名,主要解决自监督对比学习中的奔溃解问题。奔溃解即不论什么输入,特征提取器输出的特征向量都相同。 本文将简单介绍SimSiam,…

siamese模型码详解(每一句代码都有解释!!!)

最近在研究Siamese模型来进行文本相似度的计算,今天就做一期代码详解,每一行的代码都会做出相应的解释,对于初学LSTM的人来说读懂代码是非常有必要的,Siamese模型就是将两个句子(训练数据)通过embeding层&a…

孪生神经网络(Siamese Network)详解

1. 要解决什么问题? 主要解决以下两类分类问题: 第一类,分类数量较少,每一类的数据量较多,比如ImageNet、VOC等。这种分类问题可以使用神经网络或者SVM解决,只要事先知道了所有的类。第二类,分…

Siamese Network (原理篇)

1. Siamese Network 用途 Siamese网络是一种相似性度量方法,当类别数多,但每个类别的样本数量少的情况下可用于类别的识别、分类等。传统的用于区分的分类方法是需要确切的知道每个样本属于哪个类,需要针对每个样本有确切的标签。而且相对来说…

siamese(孪生) 网络

siamese 网络, 是05年Yann Lecun提出来的。它的特点是它接收两个图片作为输入,而不是一张图片作为输入。 文献资料: 摘抄自caffe github的issue697 Siamese nets are supervised models for metric learning [1]. 译:孪生网络…

Siamese Network(孪生网络)

模型结构 上图是孪生网络的简单模型结构,思路很简单,就是输入两个样本到同样的网络(参数结构相同),最后计算两个网络输出的距离,如果距离较近就认为是同一类,较远就认为是不同的类别&#xff0c…

51、目标的相似度检测模型Siamese部署rk3399pro、ncnn、mnn进行推理加速

基本思想:需要一个判断目标相似度的模型,来比对被检测目标和既定目标的相似度,测试图片仅有的几张图片,感觉一般,量化图片尽量多点对于rknn 链接: https://pan.baidu.com/s/1NFjnCBh5RqJXDxEjl9TzHg?pwdxev4 提取码:…