应该怎样准备面试

准备是一方面 平时的积累可能更为重要

Posted by ALID on September 20, 2020

Java基础

基础方面我认为主要有几点.

Jdk源码 看源码最好不要只看一些网上的博客, 一定要自己读一遍, 否则问一些细节就闷逼了.

JVM 这一点就一句话, 把《深入理解JVM》看一遍就没问题了.

基础的深入理解 这一点其实很容易有遗漏, 指的是我们Java基础语言特性的实现原理. 例如多态是怎么实现的, 反射为什么慢, 容器为什么不能使用基本类型. 其实都是Jvm相关知识, 但很多时候我们都习以为常忽略了.

其他的一些基础知识 设计模式, 网络, IO, 序列化等. 都是比较基础的知识点, 也不难理解, 直接去查资料学习就行.

对于基础的查漏补缺 可以看这个 Java工程师成神之路

并发

Java的并发问题的原因都可以归纳到, 顺序性/原子性/一致性上, 我们只要解决好这三个问题就可以解决并发问题了.

线程 并发的基础是线程, 线程池就是第一个重点, 一定要自己去看源码. 还有一个是ThreadLocal.

Java内存模型 产生并发问题, 还可以溯源到内层模型上. voilte就是其中的重点.

解决并发问题最简单的思路就是加锁. Synchronized, AQS和Condition, CAS. 就是其中的重点.

并发包的源码 除了刚刚提到的以外. 几个并发工具 CountDownLatch, CyclicBarrier, Semaphore. 以及阻塞队列. 还有Future的实现. 相关的还有ThreadLoacal, ConcurrentHashMap也经常问.

并发/异步的问题 系统设计的时候, 经常会去采用并发和异步的方式解决问题. 但是他们带来了各种问题就是我们需要考虑的了. 需要理解并发编程.

《并发编程实战》 除了撸源码,可以配和这本书来学习。

组件和框架

组件并不是需要都掌握, 但是常用的组件是必须有一定的了解. 如果有时间可以选择其中一两个去深入研究源码. 一般在2年以下对其的要求是看过一些源码, 了解实现即可. 但是3年左右就会上升到组件的设计层面, 需要对其的设计方案有一些思考

这里提到的组件是包括Spring的. Spring的启动过程(包括了ICO)以及AOP相关源码, 我建议认真阅读.

大致方向就是 rpc, mq, redis, zk, docker 等

Mysql

这一点和JVM一样都可以找到很好的资料. 推荐小册极客时间的45讲, 看完就没啥问题了.

算法

刷题大法好, LeetCode刷到200道题基本就问题不大了. 刷题谁都知道, 但是我这里有一些建议. 不要在编译器刷题, 一定要在网页上写. 因为面试的时候是不会让你用编译器的, 习惯了编译器的提示和代码校验, 会让你在网页上写的时候犯很多低级错误; 并且习惯了编译器的调试, 导致很多边界条件和细节处理过于依赖调试.

最重要的是很多时候刷算法, 可能我们的目标是实现就好. 但面试官现场看着写代码, 不仅仅是考察算法能力, 还有代码能力. 我们写算法的时候需要思路清晰, 不要来回改, 并且最好先写注释再写代码. 不要把它仅仅当做一道算法题, 而是用最严格的代码规范去写.

业务

我们的项目介绍是唯一的开卷考题, 一定要好好准备. 主要是以下几点

整体架构 我们要对系统有一个整体的思考. 可以尝试通过系统的基础职责, 以及对系统的要求来入手. 并分析其矛盾点, 矛盾点往往就是系统的核心点.

系统的基础职责是系统要实现的基础功能, 例如学生选课系统, 基础的功能就是实现记录学生选择的课程. 但对系统的要求就会涉及业务具体情况, 例如我们选课的时候可能有抢热门课程的情况, 可以说对其的要求可以看做一个秒杀系统. DB的存储和秒杀的要求就是矛盾点, 也就是说我们不能直接使用DB来完成这个系统, 这样我们就找到了系统的一个核心点.

所以遇到面试官问系统有什么难点的时候, 不要直接去聊难点, 而是先对系统整体分析后再去聊难点, 会让面试官觉得你对自己的系统有整体认识.

其实这也是我们遇到系统设计题的解决思路. 我们需要分析设计系统的基础功能, 以及对其的业务要求. 很容易就可以找到矛盾点, 这也就是我们需要去解决的问题.

方案选项 我们已经说清楚了什么是难点, 解决的方式肯定也不止一种. 为什么选择这种方案我们需要有一定的理解.

优化方案 这里体现了自己对系统的思考, 是否思考过能否有优化点. 这里的优化点不仅仅是可以实现的, 即使业务要求只能使用现在的方法. 业务现阶段不容许的情况我们也要有自己的思考, 我们不能换一个方案来做.

故障处理 系统不可能完全不出问题, 出问题怎么解决的, 以及更重要的怎么防止出问题.

指标参数 系统的qps, P99要求, 数据量. 这些都是能直接体现系统难点的事情, 也就是第一点分析的对于系统的要求.

系统设计

除了刚刚提到的分析方法, 这个只能扩宽眼见, 多看一些东西. 如果自己的系统没有太高的并发量, 可以去了解下公司有并发量系统的设计. 如果没有处理过负责的业务模型也尽量了解一些成熟场景的设计方式. 并且网上也有很多文章多看多想多总结就是这一点最好的学习方法.

对于一些可能会经常问到的系统设计问题也要有一些准备. 例如广告推送, 秒杀场景, 电梯调度, 抢红包等。还有一些常见问题,可以参考这里 互联网 Java 工程师进阶知识完全扫盲

额外的考察

我们有扎实的Java基础, 熟悉自己的业务系统, 精通用过的组件. 其实还不够. 阿里这种大厂会要求去学习业务没用到的东西的自驱力.

问题的引导

除非是非黑即白的问题, 我强烈不建议去说自己不会. 这个问题可能不太清楚, 有没有类似的问题是自己准备了的.