Java程序员不满自身现状,是如何在三年内一步步进入BAT拿高薪?
焦躁阶段
后来我去了本地的一个小公司去做服务端的开发。虽然叫服务端开发,但其实就是做系统指标监控功能,从DB中读取一些指标数据,通过图表的形式展现在浏览器中,所用的技术无非就是Spring MVC那一套。这种CRUD的工作内容做时间长了,就纯粹是体力劳动了,技术视野没办法打开。
即使写这么简单的功能代码,却还总是被leader批评,说我写的代码质量太差,配不上这几千块的工资。人总是要脸面的,为了改变这种状况,就开始想着如何在平凡的工作中把事情做到极致,开始关注代码质量,开始真正的啃起了《Java编程思想》、《effective java》、《设计模式》这些书。
同时强迫自己在代码开发前,多画一些架构图、数据流程图,写代码的时候也强迫自己代码分层,经过半年的磨炼,渐渐的也能写出一些松耦合高内聚的代码,也改变了满屏if-else乱飞的现象。leader也不再说我代码差了,还给我涨了几百块钱(知识就是金钱)!
打开见识阶段
当时我以为这就是优秀程序员的核心能力,就鼓足勇气去投了一些大公司的职位,却没收到一个面试邀请函。后来投了几个小公司的面试,收到了面试却没收到offer,因为有的面试题我根本没有概念,比如:
相比关系型数据库,NoSQL的优势在哪里,你们在什么场景下会用到?分析日志里存的都是账号登陆信息,一天100G左右,找某一时间段内登陆次数最多的一个账号你们的并发量有多大,对于雪崩现象是如何规避的?这些问题让我意识到:语法与设计模式只是程序员基本技能而已,要想进一步发展,必须在数据结构、高并发、分布式技术等方面提高。最开始学习的时候是很艰难的,基础弱,加上工作中又没有这些技术的使用场景,所以只能在论坛、博客等看零碎的文章,进步比较慢。
要想系统的学习,图书和网络课程是比较好的选择。我买了诸如《java并发编程实践》、《大型分布式网站架构设计与时间》、《Spring Cloud与微服务构建》等书,来来回回看了好几遍。然后在网上看了些视频,有免费的,也有收费的。我还花了近半年时间系统性地学习了一套课程,学完之后对Java相关的技能有了更为体系化的了解。同时,对于非科班出身或基础知识不够扎实的工程师来说,也可以有效起到查漏补缺的作用。
之后我就试着在工作中利用这些技术,当时的状态就是“拿着锤子后,看到哪里都是钉子”,学到一个新技术后,就想强行用在任何项目上,leader有时候说我疯了,可我觉得也不必鄙视这种经历,凡事都有一个认知过程,这也是一种积累。
知识深化阶段
大概17年下半年,我就投了一些大的互联网公司职位,比上次好一点,有一些公司给我了面试邀请,但最后却都还是没收到offer。
后来复盘一下面试问题,发现我在整体技术面上回答得较好,但在细节技术点上,有点吃力,比如面试官问:
聊一聊你对JVM的原理,如何减少Full GC的情况?消息队列如何保证顺序消费?如何保证at least once特性?数据是通过push还是pull方式给到消费端,各自有什么弊端?如果消费失败,可能是哪些原因引起?如果是因为网络原因引起,该如何解决?通俗的话来讲,就是虽然我见识了各种各样的轮子了,也知道各种轮子适合在什么样的路上跑,但不知道为什么适合。针对这种情况,结合已有的知识体系,选择了一个方面进行了深入,我当时选的是消息队列的深入研究,从网络协议、服务端消息存储、客户端消费、各种异常情况的处理等都摸了一遍。
这个过程我会针对每个环节进行假设反问,如果这一步失败了,会发生什么情况,该如何处理?这种思维培养了我对技术问题细节思考的能力,现在看来真的是受益匪浅。
18年上半年,我又去试了大公司的面试,虽然过程磕磕绊绊,但是面试官觉得我思考问题还是挺全面的,潜力比较大,因此最后收到了待遇丰厚的Offer!
逆袭路上的3点体会
为什么我会一直执念于要去BAT之类的大型互联网公司工作?除了因为薪水诱人,更是因为能有大规模分布式的技术可以挑战。
回首三年来的升级打怪之路,从15年毕业后,能到成为顶尖互联网公司的资深Java开发工程师,不免感慨良多。如果说让我给大家分享几点心得,那以下的3点应该是我近两年来最大的感触:
跳出舒适圈,找到目标是前进的起点。如果你在自己当下的工作中无法接触太多的新技术,可以尝试多去外面公司面试,这能在一定程度上帮助自己找到学习的目标;
跳槽要趁早,杜绝成为温水里的青蛙。对于想跳槽到大公司的同学来说,一定要趁早。因为同样的水平情况下,大公司更会看中「潜力」—— 年龄越大,潜力越小;
始终保持你的学习欲。对于工程师来说,学习永无止境。但埋头苦学是不够的,你要注意自己的学习一定要有系统性,除了手头的项目和身边“大牛”的指导外,看书和网络课程是最有效的方法,用少量的金钱换取宝贵的时间,是非常值得的。
如果你依然觉得有些茫然,那么以下的福利很适合你,有自己个人学习规划的可以忽略,但是期待提升自己技术栈的也可以看看(文末彩蛋)
针对大型互联网企业所整理出来最适合工程师们学习的一套正确方向!关注我私信回复【高级架构】获取文末学习资料1.阿1巴巴的数据库连接池druid
2.阿里巴巴Dubbo+Zookeeper注册中心
3.阿里巴巴MyCat分库分表
4.pushlets推送技术
5.Linux操作系统下shell编程
6.Redis缓存技术(session统一管理案例实现)
7.引入接口联调过程
8.支付宝和微信支付
9.支付中的掉单处理
10.处理常见超卖问题
11.互联网金融项目的撮合业务系统
12.互联网金融项目的满标审核、散标发布
13.消息队列ActiveMQ的具体应用
14.乐观锁、悲观锁、分布式锁
15.接口安全方案
16.集群环境下的定时任务
17.分布式文件系统FastDFS
分布式文件系统存储合同文件
18.NoSQL&MongoDB&Cassandra
19.HttpComponents
21.20FreeMarker/Velocity
22.SpringBoot
23.Log4j2.
24.性能调优
25.JVM调优
26.Java程序性能优化
27.Tomcat
28.Mysql
29.Spring IOC
30.Spring AOP
31.Spring MVC
32.Spring 5新特性
33.Mybatis
34.分布式架构
35.架构核心服务层技术
36.架构关键技术设施
37.分布式消息通讯 异步于MQ
38.分布式缓存
39.Redis
40.Memcached
41.MongoDB
42.数据存储
43.高并发分流技术Nginx
44.分布式解决方案
45.微服务架构
46.团队协作开发
性能调优
JVM调优
Java程序性能优化
Tomcat
Mysql
应用框架源码解读
Spring IOC
Spring AOP
Spring MVC
Spring 5新特性
Mybatis
分布式架构专题
分布式架构思维
架构开发基础
架构核心服务层技术
架构关键技术设施
分布式消息通讯 异步于MQ
分布式缓存
Redis
Memcached
MongoDB
数据存储
高并发分流技术Nginx
分布式解决方案
微服务架构
团队协作开发
工程化+框架源码
性能调优+并发编程
微服务专题
分布式框架+项目实战