「四年总结」一名程序猿的打怪升级之路
不知不觉,入行已经四年时间了,写博客也写了四年了。在即将步入2020新的一年,写下这一篇文章,对自己过去四年的进行一次分析和总结,既作为自己的年终总结,也希望能对各位读者、各位Developer的成长有些许启发。
一、为什么要写博客?(爱好由来落笔难,一诗千改始心安)
为什么要写博客? 这个问题小编曾经也在问自己,每次的思索都是片段的,从来没有认真去想过,如果非要我直接来回答,那我可能就会用两个字来形容,爱好。
1. 那么究竟爱好是如何形成的呢?
经过费脑的思考,终于得到了答案,答案就是,因为怕,因为懒。
- 那么究竟怕什么呢? 怕出错,怕犯错,怕不知道如何来解错;
- 为什么说懒呢?懒得再次犯错,懒得犯错后手忙脚乱不知道如何处理。
所以每次遇到问题或者不明白的地方,凡是经过思考后得到的产物都会以笔记方式记录下来。好记性不如烂笔头其实说的就是这个道理。但是这个道理小编直到大学毕业才明白,所以之前小编一直都是一个战五渣。因为是学渣所以学历也一直是小编最大的弱项,但是也正因为知道自己是一个 学渣,因为知道自己的弱项,所以才不敢松懈对新知识的追求。悟已往之不谏,知来者之可追。在此再一次向阅读到这篇文章的读者建议一下,好记性不如烂笔头,一定要多记笔记。每一个笔记都是一份个人财富。可能在未来的某一天对你做人做事或者解决问题提供重要灵感和线索。
2. 如何强制自己养成记笔记习惯?
习惯这个东西是很难养成的,从小父母就告诉我们要养成读书的好习惯,可是说了那么多年,都没有在学习阶段养成。(PS: 这句话仅对学渣生效,因为从小就很优秀的人还是很多的)。那么接下来小编说一下,我的理解,并提供一个解决思路:
- a. 实用主义
- b. 养成计划
实用主义
不知道我们有没有注意到,大部分开发者,在读书时期英语都不是很好,读都可能不会读,更不用说默写单词了,但是入行一段时间后,竟然都可以独立阅读纯英文文档,并写出单词。小编把这个情况称为实用主义效应,之前学英语学不会,主要是不知道自己学的这些单词究竟会有什么用处,会在哪里用。所以就一直学不好。但是作为开发者,我们很明白,我学习这个单词我会在哪个地方用。
所以我们在养成记笔记习惯前先确定方向,哪一些东西需要记笔记,那些东西不用记笔记。比如我的记笔记方向就是技术类方向,管理方面和设计方面的笔记记得就很少。
养成计划
坚持记笔记一个月。小编的习惯养成是在学习Java Web开发时候,那时候我们大学还未毕业,因为在学校学习的Java基本都是算入门的,并没有参加什么实战项目,所以学校组织参加一个培训机构,作为实习的考核。学费是1.5w人民币(这个金额差不多是我家庭1/3年的收入),为期5个月。实际天数可能更少,核算下来每天学费是在100+人民币。假如每天不学习点什么,那么就感觉对不起家人。如何证明自己有收获呢? 小编当时的做法就是记笔记。
于是在电脑上记录了一个文件夹。每天的学习知识点都记录一篇笔记。没想到真的坚持了30天。后来这份笔记在我找工作时候立了很多功劳。也是我打下了牢实的Java基本功。小编相信任何一件事只要坚持一个月就会强制养成习惯。你认为呢?
二、 写博客有什么用?(读书破万卷,下笔如有神)
写博客有什么用,写博客给自己带来了什么收获 ?
1. 二次学习,建立索引
当我们对遇到的问题或学习的知识进行记录的时候,其实也是一个二次思考的过程。比如我们要把我们学习到的可能杂乱无章的知识点,进行归纳和总结。在归纳和总结的过程中无形的对这个知识点进行了系统的总结和归类。并与你目前已掌握的知识点建立联系。这点就类似于Mysql记录一条数据,给这个数据并添加了一个索引,当遇到类似的问题,你可能想不到怎么解决,但是能记得你之前记录的一个笔记,当你翻看笔记时候就找到了解决问题的办法。这个办法曾帮助小编解决了无数个问题。
2. 巩固知识
有一个词叫似懂非懂,如何判断自己是真的掌握还是似懂非懂呢? 假如有一个知识点,我们自己理解了,那么我们在给其他人讲的时候是一定可以把对方讲明白的,在面对对方的提问时候,通过对问题的回答,就可以为对方解惑。但是假如在面对对方的提问,不能回答上来,或者说根本就讲不明白,那么其实我们自己也是不明白的。那这个时候应该怎么做? 手机在手,世界我有 。直接百度谷歌搜索你不明的地方,对笔记进行知识点补充。
3. 主动学习,避免问题
在新人刚进入到行业中,可能会遇到很多系统中的问题,比如 Spring 的各种问题。找不到 Bean 、注入失败问题、循环依赖问题。 等等问题。肯定会手忙脚乱,影响项目进度,影响自己的工作心情,和工作节奏,可能晚上下班回家睡觉都睡不踏实。(PS: 小编在第一年就是这种情况) 这个时候如何解决呢? 如何才能让我们快乐的编码,充分把握项目节奏,多留出时间陪女朋友呢?
小编认为只有一个方法。即正面问题,主动出击,找到解决问题的根源。多阅读常见开发框架的源码知识,并记录下来。这样当你知道框架的实现原理之后就能主动的避免问题和快速的解决问题了。
提一个问题,Spring是如何解决循环依赖问题的 ?
这个问题,我问10个开发同学,可能9个都不能给我讲清楚。但是如果你读到这篇文章,小编举一个列子你就明白了。下面图中的文字,是我在2018年开发框架时候写的注释。
/**
* 为什么不解决循环依赖问题?
* 1. 循环依赖本来就是一种错误的编程导致的,与其在使用时候发现,不如在服务启动就提前发现。
* 2. 循环依赖创建的对象,就跟错误的递归调用一样,极容易造成内存溢出,等无法自动修复的系统级异常。
* <p>
* 如何解决循环依赖的问题?
* 1. 发现有循环依赖,就先实例化对象(前提1.Bean有无参构造;前提2.单例模式,不支持原型模式)
* 2. 实例化对象(不进行属性注入),因为都是单例,所以到单例里面分别获取这两个循环依赖的对象,进行互相注入依赖对象
* <p>
* 伪代码实现
* <pre>
* class A{
* B b;
* }
* class B{
* A a;
* }
*
* A a = new A();
* B b = new B();
* a.setB(a);
* b.setA(b);
*
* </pre>
*
* @author liuxin
* @version Id: SingletonBeanRegistry.java, v 0.1 2018/10/29 2:21 PM
*/
如果你对文字的描述还是看不明白,就看伪代码。 Spring只是把伪代码给实现而已,其实原理就跟伪代码一样很简单。
以上的主要想说的是,多学习框架源码,因为框架是很庞大的,很系统化的,所以更要系统化记笔记。这样就能快乐编程了。留出更多时间来配女朋友了。 但是学习的前期是很痛苦的,所以要先死后生,终有破茧成蝶的一天。
三、四年打怪升级路?( 道阻且长,行则将至 行而不辍,未来可期)
回顾过去的三年多时间,很多东西历历在目,经历过无数个加班,也通过无数个宵。但从未后悔,也未敢抱怨。这其中大部分加班都是在上海度过的,下面回顾2016~2019。
1. 2016 - 2017 记录问题,总结问题
小编工作的第一年。也是小编的疯狂成长期。这一年也是SpringBoot真正开始流行的一年,于是这一年小编写了36篇关于SpringBoot的笔记。但是这个时候的笔记偏向于实用主义,这些笔记帮我快速解决了很多问题。
2. 2018 - 发现问题,避免问题
前一年总是在被动的解决问题,让小编我加了很多的班,最终致使小编找不到女朋友,于是痛定思痛,主动去找问题,正视问题。这一年开始了对框架源码的疯狂学习(PS: 学习时间仅仅占用我生活时间的很小一部分,小编并没有很爱学习),主要是看一点记一点,先将问题记成知识点,然后再将知识点连成片,最后在将片连成面。最终形成自己关于框架的知识面(PS: 只要你对Spring形成自己的知识面,那么就可以轻松独立面对任何Java方面的框架的源码 )。因为天下文章一大抄,看你会抄不会抄,抄来抄去有提高,框架之间也是互相借鉴和学习的。我们也可以拿来主义,先拿来,后改造利用。形成新的轮子。现在回顾想想挺简单,但是实际学习并不容易,但是只要不放弃,坚持记笔记。问题就能迎刃而解。如果不是有记笔记的习惯,小编早就放弃了。现在小编不能说对Spring全部知识点都掌握,但是可以说掌握百分之六七十。最起码遇到问题不在紧张,不在惊慌。这个时候你就可以对同事说。
稳住,不要慌,有我在。
3. 2019 - 了解问题,解决问题
在经历了扎实的前两年学习,基本到第三年就遇不到什么问题,这里不是指不会遇到问题,而是说,遇不到那种值得让你记笔记的问题了(但是实际也会有,并不多)。因为大部分问题,你都可以通过自己的知识体系而化解了。这个时候就开始要主动的去找问题,并提出解决方案了。这一年小编开始重复造轮子,很多人质疑过重复造轮子是浪费时间,但是小编想说的是如果从学习角度想,重复造轮子是最容易提升自己的一个重要手段,因为在造轮子的过程中才会真正体会到框架的设计者们为什么会这样去设计,这样设计的好处在哪里。
这一年小编在业余时间独自开发了三个为解决问题而设计的开源项目。
- a. Easy-sentinel
Easy-sentinel一款专门为SpringBoot项目设计的限流组件,利用Redis+lua从而来实现高性能和分布式的能力。使用比较简单。通过半嵌入式的开发即可使用分布式注解。
- b. Spring-turnoff
Spring-turnoff Turnoff就是简化代码而产生的,通过类似于Hystrix的注解方法,来实现相同的功能,Turnoff主要是利用BeanPostProcessor后置处理器来完成,代码非常简单,只依赖Spring,无论是Dubbo分布式还是SpringCloud分布式,还是单体应用都可以使用。
- c. Tomato
Tomato专门为SpringBoot项目设计的幂等组件,让天下没有难写的防重代码。 基于控制时间两种防重策略 策略一: 滑动窗口策略 每次请求设置当前请求的控制时间,控制时间内请求均会被拦截。 策略二: 固定窗口策略 仅仅为第一次请求生成一个控制时间,控制时间内相同的请求会被拦截,控制时间过期后,以此类推。
四、收获(微雨过,小荷翻,榴花开欲然 )
1. 技能栈
业务时间不断的独立开发,让小编掌握了一条龙的开发流程及中小型企业技术体系如何升级到完善,从设计前端到后端均可独立完成。
设计主要是(PS + 作图网站)、前端(Vue + Ant + Element UI)、后端(Java体系,Python作为脚本,服务监控到,日志查询ELK)、运维(Centos运维命令,NginxWeb服务器)、域名购买认证备案到域名解析。但是这些还不够,其实大多数开发者都可以做到这一点,其实小编主要想说的是,金无足赤人无完人,人外有人天外有天,既然选择了开发行业,就不能停止学习,因为新技术总是日新月异,不进则退,而作为开发者,你的技术体系就是你的生存之道。所以学习不能停。如果有技术问题可以和小编一起留言沟通。
2. 不断完善的个人博客网站
另外通知一下,经过一夜的开发,博客的文章目录功能正式上线了,只为读者拥有更好的阅读体验。各位看官同学,如果对网站有要求或者建议,可以给小编私信或者网站留言。
3. 游戏
王者荣耀至今停留在了钻石水平无任何进步,还好刺激战场是几个赛季的王牌选手。
五、路在何方 ?(翻山涉水两肩霜花)
路一直在脚下,但是向何方走,就取决于我们自己,小编也在问自己到底是有技术路线还是管理路线。但是目前给自己的答案是25岁之前走技术路线,25岁之后开始慢慢积累管理方面的知识。但是技术路线也不会停止,毕竟这个是小编的爱好,如果不是爱好支撑着,可能早就放弃了。回家采菊东篱下,悠然见南山了。
这个问题是所有技术人的问题,尽早计划未雨绸缪吧。
六、总结(逝者如斯夫,不舍昼夜)
以上就是就是小编对过去四年的回忆和总结,收获不多,但是应该还好。在2020年,小编会写更多的系列性文章,在头条和程序猿升级课网站(小编的个人网站),希望能够为各位新人或者迷茫中的同学,指点迷津,少走弯路。最后提前祝大家新年快乐,过年回家注意人身财产安全。
感谢您的阅读,本文由 程序猿升级课 版权所有。如若转载,请注明出处:程序猿升级课(https://blog.springlearn.cn/)