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

article/2025/9/30 19:07:40

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

有些同学会问,人家都已经做好了,你再来重新弄一遍,有什么意义?这不是在浪费时间吗。

殊不知,造轮子是一种学习方式,能快速进步,造得好,是自己超强能力的表现,同时能增加自己的知名度,有些人靠造轮子成了知乎大V,有些人靠造轮子写了书,有些靠造轮子被大公司挖人。

站在公司角度,是不是要造轮子有很多原因。站在个人技术角度,强烈建议大家造轮子,它能给你想不到东西。

这篇文章,站在技术角度来分析,轮子是什么,造轮子能给我们带来什么,我们要如何造轮子,希望能帮到大家,记得帮我点赞哦。

目录:

  • 发明轮子与造轮子的区别
  • 造轮子能得到什么
  • 造轮子的不同阶段、
  • 在工作中,要尝试造轮子吗?

一、发明轮子与造轮子的区别

现在我们都知道,轮子应该是圆的,最省力。而当我们的祖先,不知道什么形状都省力的情况下,就可以会发明出三角轮、四边轮、五边轮、圆形轮等等。每种轮子形状都不一样,这叫发明轮子。

而当大家都知道圆形的轮子是最好的形状以后,再发明其它形状的轮子就没什么意义了。而此时,如何改进现有的圆形轮子,才是最重要的。

上图中,同样是圆形轮子,但从石头轮到木头轮,再到空心木轮,再到气轮的演变过程,使圆形轮子越来越省力。

所以,这就是发明轮子和造轮子的区别,发明轮子是完全不考虑前人的基础,从零开始。而造轮子,其实是改进轮子的过程,在前人的基础上,能越来越好。

流行在程序圈的名句:“不要重复造轮子”,其它它的英文原原文是““Stop Trying to Reinvent the Wheel”。”真正的意义是,不要重复发明轮子。

所以,这也就是我们造轮子指明了方向,我们需要了解之前轮子的原理和利弊,加以改进,使它更好。而不是完全从零开始,自己重新弄。

二、造轮子能得到什么

1、学习技术的极好途径

我刚开始学习自定义控件时,自己根本不知道如何下手,就到github上搜别人写好的很漂亮的控件。怎么搜,我们等下会讲。

一次性找很多,一个个下载源码来看,找那些符合当前自己水平的控件,分析它的实现原理,找到哪些知识我不会,就去学这方面的知识。等这些都学会了,自己再跟着实现一遍,甚至还能发现它的一些bug,并能给它修复。

当你学了一个、两个、三个组件以后,就会发现,很多自定义控件所用到的知识都差不多,到现在,虽然我已经出了两本自定义控件的书了,但我仍经常到github上找找漂亮的自定义控件效果源码来看。总会发现些不会的知识亟待补充。

github的一个个开源组件,为我们提供了丰富的学习资源,而且别人的代码能上传上去,获取一些star,恰恰说明了人家代码写好的,在分析人家代码实现原理的过程中,不知不觉的就理解了他的代码架构方式,当你读了几个组件源码,你会发现,高手之所以是高手,代码可读性真的很高,有些人的代码读起来很享受,而有些人的代码读起来很想死。

而正是在分析别人代码的过程中,我们的架构水平和各种规范,也不知不觉地养成了,比我们自己沉浸在自己的舒适圈里,自认为自己很牛逼,毫无对比,更能清楚认识自己的水平。

向别人学习,不仅是一种态度,更是一向提升自己的方式。

三、造轮子的不同阶段

造轮子像学习一样,是有个渐进的过程的。不要想着,自己弄出来一个组件,就指定火,好大喜功,一步登天,那是不可能的。

VIVO有个名言,凡事都有因果,我们只管埋头种因,到收获的季节自然喜迎丰收!

我们老看到,人家谁谁谁,怎么怎么样,多么多么厉害。其实,人家的努力和付出,你是看不到的。大家都是人,不是神。你所有看到的都是假相,他们背后的努力,你是看不到的。

第一阶段:学习为主、查漏补缺

先到github,根据你喜欢的组件的关键字去找对应的组件,比如你搜索“自定义控件”,就会出来各种语言的包含自定义控件的组件列表,当你选中java语言时,就会筛选出,java语言下的所有自定义控件的组件列表。

一个个去看他们的效果,如果效果喜欢,就再下载下来源码读一读。看看人家是怎么实现的,怎么做的,用到哪些技术,不会的去学。

第一阶段,主要是以学习为主,先看人家是怎么做出来的,学习相关技术防出来一个。就这样,在你防个半年以后,会发现,在这个领域,你的知识已成系统,这时候,就可以尝试自己去写一个控件了。

当你发现有些知识不会的时候,看看下面我搜集的资料,很快学会即可。


第二阶段:简单控件自已实现

在自己的知识形成体系以后,在看博客或文章时,经常会看到人家介绍一些组件,这时,就想如果自己实现,要如何实现。自己先尝试实现出来,把bug都解决。

然后,再去看人家的源码,在对比的过程中,就会发现,思路是不是一样,他实现的比你好还是比你的差,他里面涉及的一些知识,是不是有问题等等。

通过不段的磨练,这方面的知识基本上就达到活学活用了,可以进入下一步了。

第三阶段:分析复杂控件实现原理,提交Merge Request

在自己能实现一些简单控件的时候,这时候就需要找一些复杂的组件来拆解了,看人家的代码架构。学习架构的知识和实现原理,为自己实现复杂控件打下基础。

比如,我前段时间研究Lottie框架,Lottie是一个动画框架,通过将AE做出来的动画直接应用于代码中。

在了解了Lottie的原理后,发现Lottie在字体解析与绘制时存在bug,就改它的源码,修复bug,增加功能等等,以使这个框架能顺利应用到项目中。

这就是达到一定水平后的驾驭能力,当你对一个领域熟练以后,对于高端框架,完全能够帮它修复bug,拓展功能,更进一步地,你可以改变它的核心逻辑,以达到更进一步改进框架的能力。

第四阶段:实现自己的组件——实现真正的造轮子

当你在使用一个框架、组件时,发现它用着不爽,或者有自己的想法时,就可以尝试自己去改进一个出来。当然,最好的改进方式,还是先对市面的所有相似组件原理完全了解之后,在他们的基础上加以改进,效果会更好。

我虽然,将这个步骤放在最后,但造轮子却是随时都可以的,大家不必担心自己写的组件不够好,被人批评。等你真正写完,放到github上,你可能会发现,根本没人看……批评都不会有。

这跟写博客是一样的,刚开始的时候,博客质量不高,根本也是没人看,但只要坚持优化写法,总会有炉火纯青的那一天。

很多人,喜欢什么都准备好了才开始。去年,我有个朋友想做公众号,一直在想着准备素材、调研方向、看各种教程,以他的说法,他要全部准备好了,熟门熟路了才会开始。

而我则不同,我在开始任何一件事前,只会思考定方向,做哪方面的内容,一旦方向定了,我从不会考虑准备的好不好,就是开始做。遇到不会的,想办法解决就是。现在他还在准备当中。

我们不管做什么事都需要打基石,开始打基石最好的时间便是现在,如果现在不开始,也许往后也不会再开始了。

四、在工作中要尝试轮子吗?

工作中,如果时间允许,简单的组件,可以尝试自己写,复杂的组件,建议使用现成的。毕竟公司不是慈善机构,不可能因为一个组件让你写个二十来天,更何况,网上有现成的,拿来用即可。你自己排期,排个二十来天,自己也没办法钟解释吧。

这篇文章就到这里,希望大家都能有所收货。记得帮我点赞哦。


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

相关文章

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 提取码:…

SPCL:Siamese Prototypical Contrastive Learning

论文链接:https://arxiv.org/abs/2208.08819 BMVC 2021 abstract CSL(Contrastive Self-supervised Learning)的一个缺点是,对比损失函数需要大量的负样本,以提供更好的理想互信息边界。 通过变大batch size来增加负样本数理,同…