高效的语言学习方法:我是如何4个月拿到大厂Java后端offer

一直挺喜欢杭州这个城市,所以当时是基于杭州这个城市找的工作。先后面了杭州的阿里、网易、海康威视,还有两个中厂忘记叫什么名字了,期间还电话面了北京的IBM、深圳华为,无一失手。最终选择了网易,至于原因我会在最后分享,附上一张网易的offer留证:


如何准备

我之前对于Java是零基础,只是道听途说Java市场需求大、薪资高,便踏上了Java学习之路。完完全全的自学,一开始很迷茫,好在从小到大的学习生涯中潜移默化形成了一套快速学习的方法,得益于这套方法,我大学期间只需要在考试前一天看课本,就可以拿到校级奖学金。这个方法也帮助我后续快速学习了Java后端、Vue、Flink、TiDB,最近正在学习Go(编程语言的Go,不是围棋的Go)。

划定学习范围

首先,划定学习范围。由于没有人教,一开始我并不知道Java后端该学什么,但想到之前准备考试时,总是优先看往届试卷和课后习题,于是照猫画虎,浏览各个大厂发布的岗位要求以及程序员社区里前辈们总结的面试题目,最后根据技术类型列出以下几点:

Java基础、操作系统、计算机网络、数据结构与算法、数据库技术、Linux系统

JVM原理、多线程、Java性能优化、缓存原理、设计模式、数据库优化技术

Spring框架、Maven/Gradle、Mybatis、Redis、Nginx、Git

第1点是基础,如果本科专业是计算机相关的同学大部分知识都会学习到,但对于Java来说,课本上的知识还远远不足,至少还应该弄懂反射、常见类底层原理等,推荐书籍《Java编程思想》。

第2点是重点+难点,是让Java程序上升为Java项目的技术核心,可以从豆瓣书籍、博客上找到相应的推荐读物进行阅读。

第3点是加分项,可以说50%左右面试者前两点中涉及的知识都可以背诵和理解,因为这些知识范围是固定的,考验的是记忆能力和理解能力,但对于第3点,没有付诸实践是很难掌握的,关于如何实践将在下面介绍。

28理论

很多领域的知识都有这样一个特性:20%的知识可以解决这个领域80%的日常问题,Java后端也不例外,你会发现在上一步划分的时候把范围外扩了不少,就拿《计算机网络》来说,实际上面试中常问的无外乎UDP和TCP区别,TCP三次握手、四次挥手、滑动窗口协议、拥塞控制、浏览控制,HTTP协议(如果岗位特殊,如涉及嵌入式、物联网等另当别论),完全没有必要把整本书的内容死记硬背,所以我们接下来要做的是进一步细化知识点,把知识分成重要、普通、略看三个级别,级别不同投入时间也不同。

如何学习

我在学习Java的四个月中每天从起床就抱着iPad看书,用PDF标注App做笔记,定期归纳到word文档中,期间少有中断过,我已经忘了是怎么熬过那段枯燥的时光,但现在回想起来特别佩服以及感谢当时的自己能够坚持下来,原来有些事只有做完了才发现自己真的可以。相信屏幕前的你也可以的,就从读完这篇文章,顺手点个赞开始吧!

制定计划

把学习范围理清之后就制定一个细化到天的计划吧,也许会发现接下来你会在计划还没完成时理所应当的拒绝周围的诱惑,或是在计划完成后感觉到前所未有的全身心每个细胞的放松。

不推荐一开始就制定4个月的计划,把任务分解的小一些,一个月甚至两周都是可以的,这样有助于阶段性自查和灵活调整计划。

学习过程中你可以试试番茄工作法来帮助你提高专注力,虽然我当时没有用这个方法,但在最近的学习过程中我使用了这个方法,确实发现很有效果。具体做法非常简单,学习25分钟休息5分钟,不断循环。学习期间尽可能保持专注不要被任何外物打扰。这样重复三四次之后可以休息的稍微久一些,然后再开始下一轮的番茄任务。

及时归纳

学完一类知识或是一本书后,及时将标注和笔记归纳出来,可以用word文档或是xmind,任何你自己看得懂的便于复习的方式都可以。如果不这么做,你会发现过了一段时间后再想归纳或是复习,对这块的知识理解已经变得模糊了,这时候又要花费时间再阅读原文。

及时归纳同时检测了你对这些知识的理解程度,除了将原文原封不动的摘抄出来之外,建议对于一些重点难点再在其后附上自己的理解。推荐一个好的方法是将知识与之前所学过的类似的知识做一个类比,用已学的知识去理解新的知识往往会让你事半功倍。

不要依赖于网上的知识归纳来代替你阅读和理解原书,这会让你对很多知识点产生片面的理解或是出现理解偏差,非常不利于入门的学习,但可以在自己归纳后去看一下别人的归纳来查缺补漏。

如何实践

现在面试中充斥着大部分模板式的项目,最恶名昭著的应该就是“秒杀式商城”,不论是线上课程还是培训班都会用到这类项目来填补学员的项目空白。所以,如果你想让面试官听完你的项目介绍后耳目一新,而不是在评价里写一个“待定”的话,尽可能自己去实现一个有技术含量的项目。当然这对于初学者来说并不简单,我的4个月自学过程中,花了3个月在基础知识上,1个月在自己动手做项目上,接下来我分情况讲讲项目经验可以怎么做。

如果你的时间富裕

报名比赛,并且把所学的知识尽可能的用上(设计模式、数据库优化、Spring、Redis、Git等等),有限的比赛准备时间会压榨出你无穷的潜力,你会发现之前所学的理论知识在此时通通涌现眼前(如:这块代码这么写会不会有多线程问题、这里该不该加锁、项目可以支撑多少并发用户等等)。有了自己的项目经验,在面试的时候面对对方的提问,你就不再只是简单背诵答案,而是会自然而然地联系应用场景,分析不同的可能性,这样你离offer就会更进一步。

一定要做好项目笔记,这将是在项目面时非常重要的谈资。主要记录下项目实现过程中碰到过什么问题,最后怎么解决;过程中又学习了哪些新知识,应用在哪些地方,带来什么性能提升;选择某个技术的时候(比如登录认证框架主要有Spring Security和shiro)为什么选了A不选B,他们有什么优缺点等。

最好能将项目放上Github或是Gitee(如果你对Git目前还不了解就先记下这一点吧,等学完Git再付诸实践)。这么做可以让你在简历中就体现出可视化的项目经验。同样地,项目笔记也可以写到博客里,将博客放进简历,让面试官在遇见你之前就可以提前对你留下一个与众不同的印象。

如果你的时间不足

那还是套用网上现成的项目吧,最好是作者有认真分析技术要点的项目,并且不要太复杂(也不是说越简单越好,起码要涉及数据库、缓存、用户认证授权的使用)。把源代码下载下来认真分析几遍,至少要能说服自己这个项目自己的水平也能做。

非常重要的是要整理出项目中的重点、难点,有哪些技术问题是可以让你在面试官面前夸夸其谈的,最好是能引导到你自信的知识区(例如你对缓存非常熟悉,那么你可以重点关注项目中实现缓存的代码,也许面试官会进一步问你缓存算法,甚至让你当场手写一个LFU或LRU的代码)。再有就是技术选型,项目的作者也许不会告诉为什么用到A不用B,那么你就要自己去了解了,有哪些主流方案可以实现这一技术,他们的优缺点分别是什么、适用场景有哪些。

如何面试

网上目前有大量的面经,了解面试过程是非常有必要的,至于笔试、技术面、项目面、HR面我在这就不一一赘述其内容和要点了。面试前要做的就是打开你之前归纳的知识笔记和项目笔记,好好复习一下,再看看自己即将面试的公司有没前人分享面试经验在网上,检查一下别人被问过的问题所涉及的知识点自己是否已经掌握。最后要注意的是面试技巧,特别是HR面的。

选择公司

对于应届生,强烈建议选择大公司。大公司的项目所涉及的运营方式和技术内容可以帮助你清晰地构建这个行业的知识地图。在大公司你可以见识到行业中最先进的架构、最流行的技术框架,还可以有机会参加许多优秀大佬的技术分享沙龙,使用非常完善的、中小公司根本负担不起的项目运维系统等等。这些经验对你将来不管是换公司还是创业都有极大帮助。

最后我说一下我面试的几家公司的感受。阿里整体侧重技术,技术面问得深且细,交叉面一般问项目和“智力题”。网易技术和项目五五开,线下面试,氛围很好(线下面试可以有更好的准备,电话面太猝不及防,有的时候在马桶上正努力面试电话就来了)。深圳的华为一上来就问项目,我还主动问什么时候技术面对方说没有技术面,两面都是项目(这可能跟部门有关系吧)。

最后选择网易的主要原因:伙食好、加班少。当然这和部门有关,网易的很多游戏部门到十一二点整层楼灯还亮着(当时阿里园区在我们园区对面,更夸张,是整栋楼灯亮着)。想进网易的同学可以联系我内推,虽然我现在离职创业了但还有和几位要好的同事保持联系。

如果你喜欢我的分享,点个赞告诉我吧。

有任何问题想要和我讨论欢迎留言,我一定知无不言言无不尽!

你可能感兴趣的:(高效的语言学习方法:我是如何4个月拿到大厂Java后端offer)