共计 2603 个字符,预计需要花费 7 分钟才能阅读完成。
面试之前先刷几篇面经,或者做几道热门面试题,想必是大家很熟悉的一种复习方式了,就像我们当年经常做五年高考三年模拟一样。但是可不要把面试题和面经当成你的主要复习方式,它只是锦上添花,绝非雪中送炭!
壹面经的意义面经是别人的面试经验,所谓前车之鉴,后事之师。我们可以通过面筋对自己的不足查缺补漏,却不能把这些面试题等同于我们所要掌握的知识点。原因很简单,两篇面经可能会有很多的重复知识点,100 篇面经也无法包含所有知识点,所以在只刷面经的问题就是:重复多、不全面。
其实笔者以前也很喜欢刷面经,在面试前几天把该公司这个岗位的面经刷一遍,面试时还是可以遇到很多类似的问题的。这种做法短期内效果确实好,但是如果从长计议,只刷面经的复习方法实为下策。
作者在春招时才发现问题的严重性,吃了不少亏,简单来说就是:别人的面试题和面试总结看了又忘,忘了又看,本质性的东西没有掌握。
贰你还记得多少面试题
在春招刚刚结束的这段时间,我总结了一下春招面试过程中的一些问题,主要就是:之前学过的东西忘记了很多,特别是那些理解的不够深的知识点,总是特别容易忘记。另外我发现,虽然我在笔记中记录了很多的知识点和面试题,但是往往我只看过一次,不会再去看第二次。
这也意味着,虽然记录的内容很多,但是真正消化吸收的内容很少,脑子里充斥着总是那些零碎的知识点和面试问题,对于完整的知识体系知之甚少。这些问题在春招期间也不断地暴露出来,让我思考了很久。
面对如此窘境,我想做出改变,趁着现在时间充裕,我想要为这些内容做一次减法,并且借此机会,推翻自己原有的知识体系,重建新的知识框架。简单说来,就是重新开始学习 Java 后端,这次我要用一种更高效的方式,避免走之前走的弯路,要用最高效,最合理的方式去复习。由于我之前已经有基础,所以我对完成这一目标有信心,相应地我也为此做出了明确且详细的学习计划。
叁忘掉过去,重拾基础
忘记过去,才能更好地开始。当然,也不是真的要大家忘记以前学过的知识点,只是建议各位把之前学的不扎实的技术重新地学一遍,不要只凭着印象去记忆知识点。
前面提到我在秋招前完成了知识体系重建,那在这里我也想跟大家分享一下我当时大致的知识体系构成。就跟我前面说的一样,我选择重新再学一遍 Java 后端相关的技术内容,因为我知道大致的学习方向,并且有一定的基础,所以看很多文章变得更加得心应手,写文章和做总结也更加有底气了。
首先在 Java 基础方面,我写了 20 多篇原创博客,主要是对 Java 核心技术的解析,比如 ”Java 反射 ”、”Java 序列化和反序列化 ”、”Java 异常体系 ” 等等。
在 Java 集合类方面,我原创了部分文章,另外整合了一些比较好的技术文章,其中最主要的就是关于 hashmap 的文章,当时我整合的文章几乎没有遗漏任何一个知识点。
在 Java 并发编程方面,我主要参考了并发编程网以及一些优质博客的文章,先搞懂了 Java 并发原理,再一步步学习 JUC 并发包的组件,其中重点看了 chm,并发工具类以及阻塞队列等 JDK 源码的解析文章,除此之外,我还会在 IDE 中跑 JUC 相关的 emo,毕竟这方面的内容非常需要实践。
在 Java 网络编程方面,我先从最基础的 socket 入手,再讲到 NIO,AIO,并且加入了几篇对 Linux IO 模型解析的文章,让整个知识体系更加完整(因为 NIO 是基于 Linux Epoll 实现的),接着我又加入了对 Netty 的探讨,以及 Tomcat 中对 NIO 的应用,可以说是把 Java 网络编程一些比较重要的部分都囊括进来了。为了更好理解这部分内容,我也在网上参考了很多客户端和服务端通信的 demo,最后我分别用 Socket,NIO,AIO 以及 Netty 把 C /S 通信的 demo 都写了一遍。
在 JVM 虚拟机方面,我则按照《深入理解 JVM 虚拟机》这本书的行文脉络进行文章的整理。在搞定 JVM 基本原理以后,我着重了解了 JVM 调优和实践中常遇到的问题,并且整理了常用的 JVM 调优工具,场景问题以及调优实践的案例,这也是因为面试中对 JVM 调优实践越来越重视了。
在 JavaWeb 方面,我从 Java Web 相关技术的发展入手,一步步了解了每种技术存在的意义,比如 JSP,Servlet,JDBC,Spring 等等,然后对每种技术进行了比较全面的了解,并且着重地看了 Spring 和 SpringMVC 的源码分析文章,另外一方面,我花了很多时间去研究 Tomcat 的工作原理。除此之外,JavaWeb 项目中常用的 maven,日志组件,甚至是单测试组件,也纳入了我的系列文章里。
在数据库和缓存方面,我主要学习了 MySQL 和 Redis 这两种最常用的数据库。对于 Mysql,我从简单的 sql 开始了解,然后开始了解 sql 优化,MySQL 的存储引擎和索引,事务及锁,还有更复杂的主从复制,分库分表等内容。对于 Redis,我也是从简单的 api 入手,然后去了解每一种数据结构的底层实现原理,接着尝试去学习 Redis 的持久化方式,以及作为缓存常需要考虑的技术点,当然,也包括 Redis 的分布式锁实现,以及它的分布式集群方案。
最后一部分就是分布式相关的理论和技术了,这个也是困扰我很久的一块内容,我主要把这块内容分为两个部分,分别是分布式理论和分布式技术,理论方面,我先了解 CAP,BASE 等基本知识,然后开始学习一致性协议和算法,接着探讨分布式事务。
对于分布式技术,涉及的东西就更多了,例如分布式 session,负载均衡,分布式锁等内容,这些知识点我都会用一到两篇文章去总结,对于分布式缓存,消息队列,以及分布式服务等内容,我会花比较多的时间去全面学习,然后总结出一个系列的文章出来。当然,对于这些技术的学习主要还是停留在理论方面,在自己的项目中能用到的比较少。
至此,我的知识体系基本构建完成,这也是我在秋招中能够成功闯过那么多面试的原因。
微信公众号【程序员江湖】里有什么?1. 作者是收获 BAT 头条等大厂研发 offer 的求职老司机,后台回复“少侠”可以获得我的微信,欢迎和我交流技术学习和求职心得。
2. 每天早上九点分享一篇关于程序员成长与生活的文章,包括但不限于:求职攻略、学习方法、技术干货、成长感悟等方面的内容。
3. 后台回复“资料”即可获得 3T 海量学习资料,资料涵盖各个技术方向,包括 Java、C++、前端、大数据、移动开发等方向。对于每个方向,都包含了基础、进阶、求职等部分内容。