了解算法

算法是基础知识考察的重点。

曾经有候选人问过我,算法在实际的项目中使用的不多,为什么一定要在面试的时候考察呢?我相信,有这种想法的同学,一定不少,而这是一个非常错误的观点。因为,你平时使用的中间件和组件中,包含着大量的算法实现,了解算法可以有效地帮你了解这些中间件和组件的原理。

比如,数据库的索引一般会采用 B+树,那么深入了解了 B+树的原理之后,你才能更清晰地理解数据库索引的原理,在调优时也会更加游刃有余。

另外,在实际工作中,我们也需要用算法来辅助完成系统的设计。比如,在我之前的项目中,需要实现一套视频转码系统。这套系统的核心是实现一个有向无环图,如果对这个数据结构不了解,在设计系统的时候,很可能走一些弯路。而我推荐你通过在
Leetcode 上刷题,提升自己的算法能力。

了解 OS 和网络

操作系统和网络方面的知识也有助于排查问题。

比如,我之前的系统中有一个服务的作用是接收指令,来执行一些定时的任务。它的请求量很低,但是调用它的服务经常会出现 502 的情况。在排除服务本身存在问题之后,我发现这个问题的发生,有一个很有意思的规律,那就是,如果前一次请求发生在 5 秒之前时,会出现问题,但是如果请求不断地到来,却反而不会出现问题。

于是,我怀疑是和 HTTP 协议的 KeepAlive 有关。要知道,在 HTTP1.1 协议中,为了提高请求的效率,客户端和服务端之间是可以保持长连接的。这个长连接如果长时间空闲,就会导致系统资源的浪费,所以一般在服务端会控制这个长连接的超时时间。如果在一段时间之内都没有请求使用这条连接,服务端就会把这条连接关闭。

但是,因为服务端在关闭连接时并不会通知客户端,所以,如果客户端还是使用这条连接来请求服务端的话,就会出现错误了。而 Tomcat 有一个参数 KeepAliveTimeout 正是设置这个超时时间的,在上面的案例中,这个参数被设置为了 5 秒,于是我把这个时间延长,问题果然迎刃而解了。你看,如果你对于 HTTP 协议理解的不深,那么面对这个问题时,就很难能够找到正确的思路。

了解语言特性

比如,我就曾经被问过在 JDK6、7、8 中,字符串在虚拟机中的存储位置有什么不同,而这对排查内存泄漏等问题是有帮助的。再比如,我之前排查过一个启动之后慢请求的问题,在经过 CPU 的 Profle 之后,确认重启后 JVM 的 JIT 线程占用了大量的 CPU 时间。于是,我们制定了重启之后的预热方案,让服务器在重启后处理少量的请求,让 JIT 将热点代码编译之后再放入全量请求,这样就消除了慢请求。如果你不了解 JIT,那么自然也就不会解决这个问题。

其他

结合你的项目经历来考察你的架构设计能力、排查问题解决问题的能力、系统优化能力等等。

如果你参与了一些开源项目的维护,或者在业界的大会中有过主题分享,再或者,你还有维护自己的 Blog,做一些技术方面的总结,那么都可以在简历和面试的过程中提及,这些都是面试中的加分项。

参考