程序员到底要不要重复造轮子?

关于这个话题,现在这里阐述立场:就公司工作而言,不建议重复造轮子。就个人技术而言,强烈建议造轮子!

程序员圈子里流行这么一句话:“不要重复造轮子”。它的原文是:“Stop Trying to Reinvent the Wheel”,意思是“不要重复发明轮子”。

首先我们要搞清楚两个概念 —— 造轮子和发明轮子。轮子是在距今6800年前被发明出来,在此之前我们的祖先可能已经就在尝试对轮子的创造。从三角形、四边形、五边形等等,一直到最后的圆形轮子,每种轮子都不一样,这叫做发明轮子。

而当轮子的形状确定后,再发明其它形状的轮子就没有意义了,改进轮子才是重点,于是就有了石轮、木轮、空心木轮、气轮的转变。而现在,气轮也有多种款式,适用于不同的场景,这叫做造轮子。

可以看出,发明轮子已经变得毫无意义,但是造轮子依然是人们所关注的焦点。

jdbc操作数据库过于繁琐,所以有了hibernate。hibernate过于笨重,因此有了轻量级的mybatis。mybatis 手写sql比较麻烦,因此衍生出了通用Mapper、mybatisplus等框架,struts2浪费资源,所以有了单例的SpringMVC。。。这就是重复造轮子的过程,了解现有轮子的原理和利弊,加以改进,这并不是一个无意义的过程。

造轮子是一种学习方式,造轮子前需要对现有的轮子理解透彻,我相信mybatisplus的作者一定熟读了mybatis的源码,这样才能把自己的轮子造的好,这是自我能力提高的表现,同时可以增加自己的知名度。有的人工作了五六年依然只会crud,有的人已经靠造轮子成了大V。有的人依然沉溺于旧技术而排斥新技术,有的人已经靠造轮子写了书。有的人在小公司使用SSM写完了一生的项目,有的人靠造轮子已经被大公司挖走。。

造轮子是学习技术的极好途径,当你要造一个轮子时,必定要去阅读类似的源码。初步可能寸步难行,而当你攻破了一个、两个、三个关卡之后不知不觉的就理解了他的架构方式,你会发现高手之所以是高手,代码可读性真的高。有些的代码读起来很享受,而有些人的代码读起来让人想死。而当你理解了框架源码后,自己的技术也就有了质的飞跃。

在阅读了源码之后,不知不觉中你的架构水平、代码规范、设计思想已经不知不觉的养成了,而不去尝试造轮子的话比如下面两个问题就可能有人答不上来。

  1. 接口和抽象类的使用场景是什么?
  2. jdk8为接口提供了default关键字,接口方法也能拥有具体实现,那么接口是否可以替代抽象类?

而一个熟读了源码并尝试造轮子的人是不会有这种疑问的。

此外,对于社招而言,需要外练筋骨皮、内练一口气。造轮子就是外练的过程。通过自己去阅读轮子、造轮子,将心得分享到各个博客、论坛,或者是将自己造的轮子开源到github,以此来增加自己在行业里的名气。诸如科大讯飞之类卡学历的公司不少,所谓学历就是指学校的名气,学校的名气间接地反映了你个人的实力,而你个人的名气事实上远远比学校名气要有用。当你个人在行业内有了一定的知名度,什么学历不够、工作年限短、项目经验少都不再会影响到你,就等着猎头挖你吧。如果在面试的时候面试官也知道你,那绝对是必过的。

分布式事务这块,三种(也可以说是四种)模式已经定型,txlcn、seata、ShardingSophia等分布式事务框架层出不穷;分库分表这块也有mycat和sharding jdbc两大阵营;而至于像ruoyi、jeecg等敏捷开发框架亦或是gitea、gogs这样的git仓库那就是群魔乱舞。这是典型的重复造轮子的过程,而这些技术也并没有因为有了前者而导致后者热度上不去,因为它们各有所长。我相信这些轮子的作者小日子过得一定不错。

造轮子就像学习一样需要有个过程,不要想着自己写个框架就指定火(这样的人我见过,真的,写了个mybatisplugs就大骂mybatisplus各种缺点,结果自己的框架存在严重的sql注入问题,甚至被我爆出了数据库账号密码。。)。我们总看到谁谁谁多么厉害,但是人家背后付出的努力是你看不到的。

那么如何造轮子呢?

首先,看源码。想要拥有造轮子的能力至少你得熟悉别人的轮子,源码的阅读是不可缺少的。源码并不是那么的高高在上,可以先从HashMap、HashTable、ConcurrentHashMap、Vector、ArrayList等集合框架的源码入手,读懂了之后尝试着手写,这些东西事实上读懂一个其他的都是分分钟的事情。像Hashmap实现原理这个问题可以说90%以上的公司都会问,而如果只靠背的话很容易就忘了,自己确实阅读过源码并且手动实现过那就可以记住一辈子。

接着,封装工具类。所谓框架只是个概念,比如早期的JQuery和Bootstrap就称为框架,而现在只能称之为库。而前段中库和框架的关系就类似于java中工具类和框架的关系。封装工具类就是造轮子的基础,或者说封装工具类就是在造轮子。在对源码熟悉并且代码规范和思想有所了解之后,就可以自己去封装工具类了,这里推荐两个工具类:StringUtils和ReflectionUtils,当然后者在网上可能搜不到,因为这是我自己造的轮子。前者是对lang3的StringUTils进行增强,如trim方法不能去除特殊字符的空白符,StringUtils没有提供脱敏方法,没有中文钱数转英文方法等等,这就是这个轮子的缺陷,那么就需要去完善它。而后者就是常用的反射框架,通过对此的封装,能加深对反射的理解,而反射则是一切框架的基础。

工具类封装的多了,渐渐地就开始由小到大,那么你就可以开始阅读框架源码了,这里建议从mybatis开始,这是最贴近我们的一套框架,通过阅读mybatis框架的源码,加深对其的理解,为其写中文注释等等。最后通过mybatis的插件机制自己写一个分页插件。这是重复造轮子的过程,但是它并不是没有意义。通过一个分页插件,就能加深对MappedStatement、Executor、ResultSetHandler等等等的理解,这对后期自己完全手写mybatis是极有帮助的。

最后需要提到的是,上面的那些过程一定不要忘记发博客。上面仅仅是通过重复造轮子去提高自己的技术水平,而发博客、开源到github则是提高自己的名气。事实上写博客也是将自己的知识点向外输出的过程,只有向外输出了,才能记得更深刻,这也不失为一种学习方法。

最后需要说的是,重复造轮子并不是不可取,相反我非常建议多造造轮子,这是对自己技术的磨练,也是更深层次的学习。

发布了30 篇原创文章 · 获赞 35 · 访问量 2765

猜你喜欢

转载自blog.csdn.net/qq_36403693/article/details/104044942