转行Java一年后,我成功跳槽字节跳动!

去年的3月份(2019.03),我从传统制造企业转行,经过4个月的自学,进入了一家银行外包公司,做Java网页后端开发。工作到今年的8月份(2020.08),自学转行的经历可以在见我知乎回答:https://www.zhihu.com/question/25034235/answer/793756187

工作的这一年内,我不仅在实践中夯实了编程技术,同时也为了跳槽大厂额外地做了些准备和补充学习,终于在今天正式收获了字节跳动的offer。过程挺不容易的,同样的,我想像之前我的那份回答一样,写个经验分享,如果我这篇的文章,能够帮助陌生人,想来那也是件令人开心的事。

首先是我的背景介绍:某985工科本科,17年毕业在某家电企业做了两年的工艺工程师,后转行Java,在一家银行外包做了1年时间。

其次是我的目标:没有特定的公司,但是一定是大厂。进入大厂这个目标在我转行的时候就确定了,当时我的想法是,不管怎么样,先进入一家公司工作半年或者一年的时间,然后跳槽大厂。大厂我在心里就是一线的腾讯,百度,阿里,字节,华为,二线的新浪,滴滴等等...,我想表达的是,如果你有这个进入大厂的目标,那么就要下定决心,这样好帮助你提早做好准备规划。

然后是确定进入大厂要掌握的技能,这个从招聘要求中看不出来,因为大厂的招聘要求都是比较虚的,比如什么要有热情之类的,这些对我们没有帮助,有帮助的信息其实在牛客网,牛客网面经分为社招和校招,我们主要看社招,校招的可以参考看看。经过广泛阅读和筛选,我把要做的准备分为这四个部分:

  • 算法题:大厂面试必考算法题,需要花大量时间去学习数据结构和刷算法题。
  • 后端技术:大致是springboot、springcloud、dubbo、zookeeper、redis、mysql、kafka、rocketMQ、docker以及分布式各种知识。
  • 基础知识:计算机网络、计算机安全、操作系统(linux)。
  • 深挖项目:项目的亮点。

一、算法题

首先给个安慰:实际考的算法题不会特别难,大概是Leetcode的easy和medium级别,只是我们准备的时候会学习以及做很多难的事情,但是这些事情是有帮助的,例如字节出了5道算法题,我只有3次完全做出来,其他都是给了个思路,写了一半代码,这个思路就是我做了挺多题,总结出一些方法的结果(后面我会附上我的总结文章),没有这些沉淀,你会毫无头绪,不知道从哪里开始思考。闲言少叙,开始正文:

算法题其实应该完整称为:数据结构与算法。

第一步就是要先学习数据结构,比如队列,栈,二叉树。队列和栈就需要掌握添加,删减,插入元素的代码,而二叉树要掌握前序,中序,后序遍历(递归版本和不递归版本都要会,对算法学习有帮助),另外,只需要了解二叉搜索树、平衡二叉搜索树、红黑树、N叉树的区别优缺点,至于他们怎么保证平衡太复杂了,没兴趣可以不学。

第二步学习算法,这里的算法指的是排序算法,请掌握冒泡、堆排、归并、桶排、快排,尤其是归并,归并的思想在后面刷算法题中经常用到,桶排也是如此,空间换时间的思想在算法中很常见。这些排序算法请能够理解并且默写,知道他们的时间和空间复杂度,这些是基础,必须掌握。

第三步真正的算法题,这里的算法题指的是牛客网剑指offer和Leetcode中的题目,这些题目不是单纯的让你排序那么简单,他可能是让你用队列实现一个栈,可能是让你求出二叉树的深度,可能让你算出跳台阶的方法....,里面用到的思想就有,归并,递归,KMP,动态规划等等(我用到的也就这么多...,还有什么广度优先,深度优先...)。

下面是我具体的学习经历

数据结构+排序我推荐B站的小甲鱼课程。看这个视频,简单易懂,具体花了多少时间我不记得了,这个是我很早很早,没转行之前就学过的,一个月应该是可以拿下的,不需要全部看完,就看我第一步、第二步中列举出来的数据结构和排序算法。

算法题,剑指offer和leetcode 50多题是我在职期间,每天晚上10点到11点半学习一个半小时,前前后后花了快4个月的时间学习,才觉得算法题算是没问题了。说实话我真的觉得算法题很难,我看过很多校招的面经,面经中说自己刷了剑指offer好几遍,leetcode几百题,这让每个夜晚被算法折磨的我,深深感觉自己是个弱智,很受打击。我想表达的是,如果你一开始也觉得算法题很难,那么你不孤独,起码我也是这么觉得的。但是这是可以练出来的,起码现在我觉得算法题没有一开始那么难的,关键就是要肯思考,多总结,多练习。

剑指offer可以认为是算法题入门,并不是说它很简单,而是他的解法很常见。建议在牛客网上刷,尽量全部搞定,多刷几遍,有时候可以背一背,看得多了就会突然开窍,我对递归的理解就是这么来的,总结出他的几种模式,然后套用做题,多来几次突然就理解了,对于算法我总结了几篇文章,放在我的微信公众号上,大家可以参考,另外有其他详细疑问的可以留言,我会一一回复的:

Leetcode建议不要全部做,可以先去搜索各个大厂面经,把它们的算法题记下来,然后去Leetcode一个一个去刷,这样针对性是最强的。

另外,因为疫情现在面试都是线上面试,字节就是在牛客网上面试的,牛客网机试编码是没有帮你定义任何东西的,在面试之前一定要花时间熟悉,别到最后刷了n道二叉树的题,结果二叉树定义都写不出来,那就尴尬了。

最后,什么时候学习算法呢?我建议放在准备期间的后半段时间,因为算法题还是需要一些手感的,在求职的时候保持算法手感有一定作用。

二、后端技术

后端技术学什么呢?大家经常会看到许多培训机构类似这样“JAVA架构师一个月带你收割BAT”的广告,别急着删掉,我们可以看看他的课程设置,它的教学质量我不清楚怎么样,但是他的课程内容的确是要会的,而且你会发现每一家的课程内容大部分都是一样的,这就给了我们学习的方向。

那么主要的就是这些技术:大致是springboot、springcloud、dubbo、zookeeper、redis、mysql、kafka、rocketMQ、docker、分布式各种知识、JVM、并发编程。

下面我们一个一个讲:

Springboot和Springcloud我都是直接上手学习项目,因为Springboot其实就是更加灵活的注解开发,相比于Spring的使用,只需要掌握如何使用配置文件,如何使用注解开发就行,至于实现的技术原理,比如Springboot是怎么做到没有配置Tomcat就可以直接启动服务的,怎么解决缓存依赖等等面试常问的问题,我们提前做好准备就行。那么Springcloud我是学习 https://www.bilibili.com/video/av63499215?p=68这个视频的,这个视频几乎包含了目前互联网企业常用的技术,其中必须要会的是redis、eureka、feign、docker、hystrix、zuul。掌握这些使用,应该要学习2个月时间。另外的比如mongDB、es、jekenis可以根据需要进行学习。其次vue可以学习一下,这种前端框架学习之后对理解目前的前端技术是有用的,我就是基于学习vue后,很快就上手了微信小程序的开发,这是我的作品源代码https://github.com/fongfiafia/taxCalculation,欢迎大家看看,扫扫:

dubbo、zookeeper这两个和Springcloud是不同的微服务框架,需要单独学习,https://www.bilibili.com/video/BV1Gb411T7Ha?from=search&seid=10566725200455241329这个视频可以学学,在学习dubbo的时候其实就会涉及到zookeeper的使用,上面的视频比较浅显,深入学习zookeeper推荐看这个https://www.bilibili.com/video/BV1PW411r7iP?from=search&seid=5416528183444084304。这里再次感谢尚硅谷的优质的教程,帮助很大。

redis的话,我是从网盘扒下来的,不知道出处。大家在b站找个播放量高的应该大差不差。主要掌握redis 的基本数据结构、持久化、哨兵、集群、主从复制这几个关键点,另外推荐掌握zset的数据结构底层实现,编码方式,会是一个亮点。

Mysql我也是学习了极客时间的丁奇-mysql45讲,确实讲的精彩,以往的mysql视频都是教学怎么使用,但是这个专栏讲了日志系统、锁原理、索引原理、隔离、主从延时等等,帮助非常大。算是进阶学习。

kafka推荐学习https://www.bilibili.com/video/BV1bt411y72u?p=1

docker推荐https://www.bilibili.com/video/av27122140?from=search&seid=5608847279993314827 ,不用特别精通,知道有docker这样的容器,他的作用是什么,优点是什么就行。

另外我是搞JAVA的,需要单独掌握JVM的知识,包括垃圾回收器的种类、垃圾回收算法、锁的底层实现原理、JMM内存模型.....,另外还要学习并发编程,包括AQS,原生锁,乐观锁、线程池、LOCK、并发工具类....,这些也是我从网盘上扒下来的,不好在这分享。这些内容如果不是搞Java的可以跳过不学。

分布式理论,这部分东西比较杂乱,包括基本的CAP、BASE理论,限流、降级、熔断、主从一致算法(raft,hash一致..)、分布式锁、分布式事务、缓存和数据库一致性问题、选主算法等等,没有固定一个教学视频,都是我东找找,西找找拼凑起来的。大家可以参考在公众号发送关键字“分布式”,查看我的笔记。

最后要说的是,这部分内容学什么要因人而异,我工作的项目微服务涉及较少,所以花了很多时间来掌握这些微服务的知识,如果你目前的公司业务中用到有这里的技术,那其实就可以省略掌握相应的部分。这部分的学习花费了我3-4个月的时间。

三、基础知识

基础知识包括了计算机网络,比如TCP三次握手和四次挥手,五层结构,http报文结构,https请求过程等等;也包括了计算机安全,比如各种网络攻击XSS、跨域攻击、sql注入等等;也包括操作系统,比如内核态用户态的区别、进程怎么通讯、线程和进程的区别、IO的类型、多路复用等等。最后还包括linux的常见命令。这些因为我不是计算机专业所以比较薄弱,花了一两个月时间进行学习,主要就是看面经然后找博客,进而拓展学习。

最后以上三点的内容学习完后,强推用下面的这位同学的总结来检查自己学习的结果,你也可以根据这个总结来反推学习内容。当你能百分百回答上这些问题的时候,就差不多可以去面试了。https://www.nowcoder.com/discuss/472041?channel=1009&source_id=home_feed

四、项目深挖

这个因人而异了,回顾一年的工作,找出最亮眼的工作,亮眼的意思是,你独立完成,或者从无到有,或者提高性能多少,或者排查解决了什么重大生产事故等等。因为面试必会问“你做的最有挑战的一个技术难点是什么?“,你需要准备好。我的求职简历也是基于工作亮点来编写的,你可以关注我的公众号,回复简历获取我的简历模板。

五、写在最后的话

我始终觉得,不管有多大的目标,只要是做好时间规划,内容规划,然后咬牙坚持一步步走下去,最后一定会收获想要的东西。愿大家都能收获自己的果实。