写在最后
作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?
就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。
最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“Java经典面试问题(含答案解析).pdf和一份网上搜集的“Java程序员面试笔试真题库.pdf”(实际上比预期多花了不少精力),包含分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货!
由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图!
Java经典面试问题(含答案解析)
阿里巴巴技术笔试心得
但是我在面试过程中发现,不少候选人往往只会从技术本身准备面试,比如对Netty,Redis等组件,能准备到底层源码级别,但却不准备该技术和项目结合的说辞。这样在面试准备过程中,就犯了方向性的错误。
就拿最常问的Spring Boot方面的问题来举例。
第一层问基本概念,比如Spring Boot的常用注解,Spring Boot项目的大致结构。
第二层问细节,比如Spring Boot的启动流程,关键注解的细节源码等。
请注意,问到这层,仅仅是提问技术,还没有问该技术在项目里的用法,所以只要是候选人在面试前背题,一般都能过。
有时候我甚至技术问题方面问得很浅,让候选人能放松下来,更好地回答后面的问题。在此基础上我会问,在你们项目里,Spring Boot框架整合了哪些组件?比如Junit,Swagger等等,请候选人大致说明下。在候选人告诉我用过的组件后,我再细节该组件与Spring Boot框架的整合方式和相关语法。
可以这样说,只要是做过Spring Boot方面的商业项目,即这个项目不是自学的,也不是培训班里得到的,一般多少都会整合组件,而且知道怎么个整合法。通过这层提问,我能明确候选人是真的在商业项目里用过Spring Boot,还是仅仅知道理论,或者只是在学习项目里用过。
针对其他的技术或组件,基本上也都采用这种层层递进的问法,第一层问概念,第二层问(框架、源码或其它细节),第三层问在项目里怎么用的,在此基础上再顺着候选人的回答,深入提问些该技术在项目里的用法。
**但是不少候选人,顶多只准备到第二层,即深入到各框架各组件的源码,说明该技术的细节。或者说,不少候选人只知道该准备到这一层。**比方说,我见过不少候选人,在说Redis时,很全面地说了Redis的细节,比如集群,失效转移以及选举算法等能很好地说,但当我结合项目提问,比如问你们项目为什么要用Redis,以及根据你们项目的数据量,为什么要用redis集群等项目相关问题,就基本说不上了。这样就无法很好地证明自己在项目里用过Redis。
只要面试官资深些,一定不会只停留在单问技术层面,也就是说,你认为准备过的被深挖的点,可能充其量只停留在技术层面,其实还没达到面试官会深挖的“技术结合项目”层面。
道理一说就明白,所以在下文里,我不讲如何在技术层面深挖提问的方法,因为这些问题网上太多,这些知识点大家可以自行查阅。但是我讲下很容易被疏忽的深挖技术结合项目的问法。
1 问该技术的使用必要性。比如你项目数据库压力是多少?在这个情况下是否该用Redis?或者你们项目为什么要用Dubbo?而不用传统的基于Http的服务调用方式?
总之,只要你简历上写的,面试时说的值钱技术,我都会问使用必要性。我不在乎这个问题听到什么答案,但我关心候选人关于必要性的说辞是否合理。如果不合理,那对不起了,这个项目疑似学习项目或培训班项目。
2 既然在项目里用到这个技术,那么就需要解决某个痛点问题,比如使用了MyCAT,拿就需要解决数据库压力大的问题。接下来我就问,怎么解决的?你可以从配置文件,框架,Java语法等方面来说明。
这里请注意,我不仅仅关心纯粹的语法,比如我不仅仅关心MyCAT组件通过配置文件实现分库分表的做法,我更关心该技术该组件和你项目整合的方式。比如你项目里用到MyCAT,那我更关心针对哪个大表实现分库,拆分成多少个表,引入MyCAT后如果再遇到全局性的访问表语句怎么办?
在问相关问题时,如果候选人在项目里没用过,那么往往就说不上,或者如果是现编,我多从几个角度提问时,往往就会穿帮。但话说回来,其实我问的点是比较普通的,只要候选人用过,那一定能说得上。
3 再提问候选人,在使用(Redis或Dubbo或其它技术)时,遇到过哪些线上问题,是怎么发现的,怎么解决的?
其实这个问题是加分项,候选人只要通过前面的回答证明自己在项目里用过,哪怕这个问题说不上也不要紧,但如果回答出了,就能证明自己在这方面能力很资深。
4 再串起来问。这是什么意思呢?比如候选人说用了某个技术或组件,总是会解决一类问题。比如用了Redis是解决数据库压力大或高并发的问题,但解决此类问题不大可能只用一个技术或组件,往往会综合使用若干组件,同时引入(监控告警等)各种机制。
那我就围绕一个需求点,串起来问这些组件技术和机制的用法。这些问题看上去很高深,但如果候选人真用过,哪怕候选人本身只是初级开发,但多少能说出一点。
我在通过上述问题确认候选人是否在项目中用到某些技术时,其实对不同级别的候选人期望是不同的。对于初级开发,我只要求能说出大致的API用法或者文字性描述。对于高级开发,我要求多少知道点技术结合项目的细节。对于架构师,我就期望能说些解决过的实际问题。
但是不管怎么说,如果候选人在被问及上述问题时,无法很好地证明自己在项目里用过某些技术,那么我会质疑候选人项目的真实性,进而甚至会质疑候选人整体能力的真实性。一旦面试官有这些质疑后,那么后面的问题就会比较麻烦了。
如果大家就遇到只问技术的面试官,哪怕问得再深,都应当感到幸运,毕竟技术问题好准备,网上都有现有的答案。而且Java技术问题该准备哪些方面,比如准备JVM,安全管理等等方面,如果你不知道,多参加几次面试后也能知道。
也就是说,准备面试,技术问题好准备,但做到能结合项目证明自己用过该技术,有该技术的(资深)实践经验,这相对来说就不容易了,甚至有些候选人在面试前还会忽略这方面的准备。下面就说下,如何结合项目说明技术的方法,因为如果这方面说好了,面试就能达到事半功倍的效果。
最后
我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。
orums/4f45ff00ff254613a03fab5e56a57acb)收录**