今年疫情,说起来真的挺幸运的,因为不用去学校,也没老师管,给了非常多的时间可以自由学习。我是从4月底开始正式准备的,说早不早,说晚也不晚,我认识的同学有的从寒假就开始准备了,很强。我是因为过完年后写了师兄布置的国家自然科学基金的一部分,后面又接着准备开题,所以拖了很久。如果大家可以的话,还是越早准备越好。甚至可以春招就开始投,练练面试的感觉。

当时一开始的话,就准备的是java后端开发方向,虽然过程中也学过一点前端的知识,但是主要精力还是java基础以及后端。之所以选择java,还是觉得市场的需求比较多,机会比较大吧,但是对于后来者,我却不是很推荐这个,因为我觉得java现在真的是“内卷”太严重了,而且以后只会越来越卷,原因很简单,因为java用起来比C++简单很多,虽然后端的内容和知识点一点都不比C++相关的工作少,甚至多很多,但是单纯就java的使用来说,确实是简单了很多,举几个简单的例子,首先java里面是没有指针的,但是指针的操作在C++里面,绝对是一个难点和重点,另外java也不需要使用者自己申请和释放内存,这都是java自己内部完成的,但是C++却需要程序员自己完成这些活,还有很多类似的例子。而一个语言越简单,就导致他入门的门槛就越低,越多人会去选择使用它,所以导致java现在的使用率这么高。但是,你简单,别人也简单啊,别忘了,现在网上各种java辅导班,一大堆,所以竞争非常激烈。因此,如果大家找工作之前用的C++,那么我还是推荐找C++开发相关的工作,首先岗位较多,虽然没有java那么多,但是也不少,另外“内卷”程度,远远比不上java。

聊走题了,我当时看的第一本书是《java程序员面试宝典》,这是一本面向面试的总结类书籍,为什么选他,因为java语言我在本科的时候就用过,当时毕业设计使用java自己开发了一个安卓的app,所以我觉得对我来说java并不需要从头学起,太浪费时间了。然而上来就看这本书,最终的效果其实不好,首先因为安卓编程用到的java知识比较少,第二这本书已经比较过时了,里面讲的java web相关的知识,比如jsp,struts什么的,其实都是古董了,现在根本没什么公司还用这些东西了,面试根本不会问这些(反正就我的面试经历来说,从来没问过)。并且如果你没有接触过java web项目,直接看这些,就跟天书一样,根本看不懂,所以当时第一步走的,回过头来看,并不正确。另外,当时还做了一个比较错误的选择,那就是:一开始没有刷算法题,而是选择了刷选择题(??),而且刷了一个月,刷了800多个选择题,沃日,,,我都没搞懂我当时脑子里在想啥,,,,所以我大概耽搁了一个月在这两个回头看来一点用都没有的事情上面。


因此,这给大家两个教训:

  1. 选择题没有任何必要去刷,直接刷算法
  2. 《java程序员面试宝典》这本书现在来看并不推荐,看也只要看第四章,java基础知识

后面我看完了《java程序员面试宝典》发现好像还是学的不太懂,所以又准备再去看看java基础,万幸,找到了一个网站,how2j(不是广告啊,我啥都不贴了,自己搜去吧),又把java基础跟着这个网站学了一遍,感觉比第一轮好多了。同时,我还买回来几本经典的java并发相关的书:《Java并发编程的艺术》,《深入理解Java虚拟机》第三版,《深入理解Java虚拟机》这本书好厚一本,我都没想到我能啃完,每天就带着看,内容讲的也是相当的好,非常的细致,秋招最后,JVM应该是我掌握最好的一门知识点了,只要问道里面的知识点:垃圾收集器,各种锁及优化,volatile和synchronized什么的,我都能跟面试官扯个10几分钟,所以这本书必看!!!《Java并发编程的艺术》也是必看的,多线程相关的知识,以及线程池,并发容器等等知识点,都非常重要,这里面讲的也都很好。

学习完了java基础,我们还要继续补完java技术栈,接下来还需要了解计算机网络相关的知识,因此,我买了《计算机网络(第七版)》,也是非常厚的一本书,但是从网上的面经来看,其实重点就是那几章节,比如第一章,然后网络层,运输层,应用层,和网络安全等等,此外还买了一本《图解http》,一个从日文翻译过来的书籍,里面内容比较基础,适合入门理解,但是感觉用处不是非常大。我觉得计算机网络相关的知识点还是比较集中的,主要还是靠面经总结+看书。

后面就是java开发里面的又一个重头戏了,那就是数据库,现在用得比较多的还是MySQL数据库,我买了都很推荐的《MySQL必知必会》,这本书其实是对SQL语言的一个入门介绍,非常适合MySQL入门了解,写的非常好,然而面试基本没问到,,,然后就是买了《高性能MySQL》,这本书非常多人推荐,然而我总感觉里面的语句读起来不是很通顺,可能是因为翻译过来的吧,读起来的感觉不是很好,也只读过前面几章,主要是第一章的锁,事务,以及MVCC,还有第五章介绍各种索引。这里告诉大家一些看书的窍门,因为有些知识点的书籍,内容实在是太多,就比如《高性能MySQL》,非常非常厚的一般书,基本不可能在这么短的时间内看完,只能挑重点看,那怎么挑重点呢,很简单,看面经,看面试官经常问的,你看的多了,就知道大家问的重点在哪,着重去理解记忆即可。在后期,我还买了《MySQL技术内幕InnoDB存储引擎》这本书,这本书是国人写的,因此读起来感觉就比《高性能MySQL》要好很多,非常流畅,而且讲的也很深入,十分推荐。最后就是《Redis设计与实现》,这本书基本上你学习Redis就一定得买,因为讲的真的是太棒啦,各种底层原理利用代码以及示意图的形式,让你非常快速地就能去理解,这本书我也是看了60%~70%的样子,前面的关于Redis底层的数据结构的内容是一定得看的,面试被问道好几次,另外关于持久化的内容也必须要看。

最后,也是最重要的,那就是算法,算法这个问题大家一定得重视,因为短时间内很难提升,必须得靠大量刷题才行,而且刷一遍还不行,得刷2~3遍,其实大家后面会发现,写算法题的时候,编程根本不是问题,编程上的技巧不多,也就是各种map,set,各种排序方法,以及各种循环等等,难的就是一个思路,或者说是思路里面的某一个点,这个点一打通,就豁然开朗了,但是思路里面的这个难点,大多数人第一次做这道题的时候,很难想到,即使想到,也是因为曾经遇到过类似的问题。另外,我们从一个很功利的角度来看,当面试时遇到相同的题目时,你能不能再写出来?我觉得很多人还是会卡在第一次被卡的地方,这怎么解决?我觉得短期之内只能反复刷,增强记忆。

因此,我在这里结合我的学习路线,给大家一个入门算法的建议路线,首先,算法里面最基础的就是计算时间复杂度以及各种排序算法,二叉树等等,这部分比较基础的内容,你别看他基础,在初期理解起来也是非常不容易的,因此我不是很推荐一上来就看算法书,或者直接刷leetcode,我觉得这样的学习曲线太陡峭了,因此,我比较推荐看看一些算法的基础班视频,至于怎么选,大家随意,我自己看的是左神的算法基础班,我觉得他真的讲的非常非常非常非常细致了,但是看视频这个过程是真的难熬啊,我看的视频一集3个小时,看了快10集吧,每天带着看一点。

看完基础班之后,你对算法已经有了一个很基础并且很肤浅的认识,包括算法里面关于二叉树的各种问题,各种排序算法,贪心算法,以及动态规划等等。后面就要加深理解了,我在当时选择的是继续看左神的进阶班,但是回头来看,对于我自己来说,我觉得可以有更好的选择,原因有二:

  1. 进阶班难度较高,看视频的速度会进一步减慢,耗费时间较多,对于时间紧张者不建议
  2. 就我面试的经验来说,进阶班题目遇到的频率较低,也可能是我是非科班出生,所以面试官的题目不会太难

因此,对于和我一样的非科班的后来者,我的建议是有选择的看进阶班视频,如果时间紧就跳过,就比如进阶班里面的KMP算法,manacher算法,现在想起来都还是我的噩梦啊,套路性极高。因此我的建议是,看完基础班就可以刷一些简单的算法了,因此可以去刷《剑指offer》,网上有java版本的答案,可以搜一下。剑指offer里面的难度我觉得还是比较简单的,但是面试考的频率还是很高的,因此非常适合已经有了一些算法基础的人,去加深一下难度,拓展一下知识面的广度。当刷完剑指offer之后,就可以刷leetcode了,直接刷高频100题,同时带着看看前面的基础班题目以及《剑指offer》的题目,保证不会因隔了太久导致忘记。

最后,关于算法,还有一点建议,leetcode的解答区的有个叫labuladong的作者,我觉得他的解答写的也很不错,他自己有个主页,上面根据题目的类型,把一些相似题都归类到了一起,这些题目的解法也很相似,可以跟着他的归类来刷,这样效率会提高很多。

此外,我当时看面经的时候,还看到有人被问到了Spring框架相关的知识,并且还看到有的面经的作者,各种看Spring的源码,然后面试的时候,直接当面手撕Spring,,,,但是就我来说,好像被问到Spring相关的知识点非常少,就问到过一两次好像,也不深,当时也买了《看透Spring MVC源码分析与实践》,看了七七八八,讲得不错,然而根本没有被问到过,当时看了这个面经作者把Spring当做自己的一个核心竞争力,因为一旦面试官问道这个,他可以跟面试官扯10几分钟(这里提一个小技巧:你自己说的多,面试官自然就问的少了,比较时间就那么多,还得做算法,是不?)我又去买了一本《Spring 解密》,老厚的一本书,最后一页都没看过,,,,因此Spring相关知识点,我觉得大家不需要花太多的时间。有时间的话,另当别论。

最后,除了看上面的一些书籍之外,我还经常关注一些微信公众号,java之道,三***敖丙,好好学java等等,这些公众号上也会经常发一些面试问题以及技术问题,里面的答案只要你理解了都可以作为你的回答的模板。

因此,总结一下,java后端开发主要需要了解的知识点包括但不限于:JVM,java基础,java并发,MySQL数据库,Redis,算法等等。

更多推荐

非科班java秋招总结和学习路线建议