⾼级技术经理⾯试题_⾦三银四给Java程序员总结出必看的初
级~⾼级技术⾯试题...
本⼈最近⼏年⼀直在做java后端⽅⾯的技术⾯试官,⽽在最近两周,⼜密集了⾯试了⼀些java初级和⾼级开发的候选⼈,在⾯试过程中,我⾃认为⽐较慎重,遇到问题回答不好的候选⼈,我总会再三从不同⽅⾯提问,只有当反复确认能⼒不⾏才会下结论,相反,如果候选⼈给我的印象不错,我也会从多个⾓度来衡量,以免招进会说但不会⼲活的“⼤忽悠”。
其实倒也不是我故意要为难候选⼈,毕竟⼊职后就是同事,但⾯试官的职责使然,⽽且,如果资深的⾯试官⼀般也这样。
写到这⾥,恐怕会吓到⼀些想要⾯试的朋友,能⼒强和能⼒弱都会被多问,那怎么办?
这就是本⽂将要讲到的主题:如何准备Java初级和⾼级的技术⾯试。
1 换位思考下,如果你⾯试官,你会怎么做
1 只能通过简历和⾯试来衡量,别⽆他法。如果某位⼤⽜确认能⼒很⾏,但⾯试时⽆法充分地⾃证能⼒,那对不起了,过不了,现实就这样。
2 如果⾯试官由于能⼒不⾏,招进来⼀个⼤忽悠,那估计会被领导骂。⽽且再也不会被让⾯试了,给
领导的印象就不好了。所以不能评主观印象,⽽是会有些客观标准,具体⽽⾔,就是从多个⽅⾯问些题⽬,答好答坏就看候选⼈的。
其实⼀些题⽬都差不多,但不同能⼒的⾯试官问问题的切⼊点和渐进程度会不同,⽽且有经验的⾯试官会挖掘候选⼈的优势,并能从候选⼈的说辞中判断候选⼈是真懂还是忽悠。
2 总体上说下准备⾯试的⼏个⽅⾯点
记得之前考政治,某个⼤题10分,分5个点,每个点的标准答案不多,也就⼀两句话。⽐较取巧的做法是,涵盖点要全,每个点⽆需多说,但要说到点⼦上。相反,如果在某个点做得再多,其它点没覆盖到,只能拿这个点的分。
同理,在⾯试时,应当综合准备 java Core,数据库,框架,分布式等⽅⾯的题⽬。根据我⾯试的结果,我发现不少候选⼈⾛了弯路,他们或者⼲脆不准备,准备时可能⽅法不到位,单准备⼀个⽅⾯。
⽐如只准备了算法题,在这⽅⾯回答很好,但其它⽅⾯就⼀⽆所知了。
所以说,没有所谓的⼀定能成功的⾯试秘籍,但有可以帮助提升成功率的准备⽅法。
切记,⾯试前⼀定得准备,否则成功的可能性很低,准备时,得综合看各⽅⾯的点。⾄于每个点要到什么程度,后⽂会讲到。
3 架构⽅⾯需要准备的点
初级开发⽽⾔,需要让⾯试官感觉出如下的要点。
1 熟悉SSM架构,⾄少在项⽬⾥做过。
这个的说法是,介绍项⽬时,⽤⼀个业务流程来说spring mvc如何做的。
2 知道Spring MVC中的细节,⽐如@Autowired的⽤法,如何把url映射到Controller上,ModelAndView对象返回的⽅式等。
3 最好结合项⽬的⽤法,说下你是怎么⽤AOP,的,⽐如说可以通过拦截⾮法请求,怎么⽤ AOP输出⽇志等。
4 关于ORM⽅⾯,不限⽤过哪种,但得知道⼀对⼀,⼀多多,多对多等的⽤法,以及cascade和inverse的⽤法。
5 最好知道声明式事务的做法。
如果你要应聘⾼级开发,那在上述基础上,最好了解如下的知识点:
1 Spring Bean的周期
2 最好能通过阅读源代码,说下IOC,AOP以及Spring MVC的⼯作流程数据库的distinct是什么意思
3 最好能结合反射,说下IOC等的实现原理。
4 Spring Boot和Spring Cloud的⼀些知识点。
4 数据库⽅⾯需要准备的点
不少候选⼈会看很多SQL的技巧,⽐如select该怎么写,insert⼜该怎么写,但仅限于此,不会再准备其它的。
这样就很吃亏,因为⾯试官会认为,哪怕是初级开发,SQL语句也该会写,所以这块不会多问,⽽会问如下⽅⾯的问题。
1 索引怎么建的,怎么⽤的?⽐如我建好了⼀个索引,在where 语句⾥写 name like '123%'会不会⾛索引,怎么情况下不该建索引,哪些语句不会⾛索引。
汇编offset指令用法
2 除了索引之外,你有过哪些SQL优化⽅⾯的经验,⽐如分库分表,或通过执⾏计划查看SQL的优化点。这最好是能结合你做的项⽬实际来讲。
这⾥,我⾯试下来,⼤概有70%的候选⼈只知道基本SQL的写法,所以哪怕你是只有理论经验,会说⼀些优化点,也是⾮常有利的。
这块对于⾼级开发⽽⾔,更得了解优化⽅⾯的技能。
5 Java Core⽅⾯需要准备的点
这块是基础,其实很多问的问题,候选⼈⼀定会在项⽬⾥⽤到,但很少能说好说全。
这块主要会从集合,多线程,异常处理流程以及JVM虚拟机这些⽅⾯来问。
集合⽅⾯:
1 hashcode有没有重写过?在什么场景下需要重写。如果可以,结合hash表的算法,说下hashmap的实现原理。
对于⾼级开发⽽⾔,最好通过ConcurrentHashMap来说明下并发⽅⾯的底层实现代码。
2 ArrayList,LinkedList的差别,⽐如⼀个基于数组,⼀个基于链表,它们均是线程不安全的,ArrayList的扩容做法等。
对于⾼级⽽⾔,最好看下底层的代码。
3 Set如何实现防重的,⽐如TreeSet和HashSet等。
4 Collection的⼀些⽅法,⽐如⽐较⽅法,包装成线程安全的⽅法等。
5 可能有些⾯试官会问,如何通过ArrayList实现队列或堆栈,这个可以准备下。
多线程⽅⾯,其实在项⽬⾥不怎么会⽤到,但会问如下的问题:
shadowrockect1 synchronized和可重⼊锁的差别,然后可能会顺便问下信号量等防并发的机制。
2 在线程⾥该如何返回值,其实就是callable runnable 区别。
3 ⼀定得通过ThreadLocal或volatile关键字,来说明线程的内存模型。
4 线程池⽅⾯,会⽤,了解些常⽤参数
线程⽅⾯,可能问得⽐较多的就是并发机制,如果是⾼级开发,可能会问得深些。
虚拟机⽅⾯
1 结构图和流程可以⼤致说下。
2 ⼀定得了解针对堆的垃圾回收机制,具体⽽⾔,可以画个图,说下年轻代年⽼代等。
3 说下垃圾回收的流程,然后针对性地说下如何在代码中优化内存性能。
4 最好说下如果出现了OOM异常,该怎么排查?如何看Dump⽂件。
5 GC的⼀些概念,⽐如强弱软引⽤,finalize⽅法等,这些可以准备下。
6 算法,设计模式等,其实是虚的
这块好准备,不过话说哪怕这些没回答好,但能证明有相关技能的项⽬经验,⼀般也会让过。
不过在这块,不少候选⼈就本末倒置了,⽐如就准备算法,设计模式,刚才提到的框架,数据库和Java Core⽅⾯就不准备了。这样很吃亏,就好⽐考政治只复习了⼀个点,其它⼀点也不准备。
7 我⾯试的感受&听到哪类回答就能证明候选⼈⽐较资深
1 ⼤多数的候选⼈(⼤概7成)直接就来了,不做任何准备。要知道,⾯试和项⽬其实有些脱节,哪怕项⽬做得再好,不做准备照样通不过,只要我确认过这类⼈确实⽆法达标,我拒掉他们没任何⼼理负担,谁让他们不准备?
2 还有些候选⼈态度很好,明显准备过,但没准备到位,⽐如像刚才所说,只准备了算法,或者在Jav
a Core⽅⾯,只看了集合⽅⾯的⾯试题。对于这些同学,哪怕是过了,我也会感到惋惜,毕竟如果⾯试好些的话,⼯资也能更⾼些,⾄于哪些过不了的,我敢说,如果他们准备过,估计就不是这个结果了。
mysql面试题sql优化其实我也知道,⼈⽆完⼈,哪怕我⾃⼰去⾯试,也不可能⾯⾯俱到,所以,我不会要求候选⼈什么问题都能回答出,甚⾄⼤多答错也没关系,只要能证明⾃⼰的能⼒即可通过⾯试。
我也和不少⾯试官交流过,根据我们的经验,如果候选⼈能说出如下的知识点,即能证明他在这个领域⽐较资深了,在这块,我可能就不会过多地问问题了。
架构⽅⾯
ios开发培训指导1 能证明⾃⼰可以⼲活(这不难),同时能结合底层代码说出IOC,AOP或Spring MVC的流程,只要能说出⼀个即可。或者能说出拦截
网页版视频播放器器,Controller等的⾼级⽤法。
2 能证明⾃⼰有Spring Boot或Spring Cloud的经验,⽐如能说出些Spring Cloud组件的⽤法。
3 如果能证明⾃⼰有分布式开发的经验,那最好了,其实这不难证明,⽐如能说出服务的包是放在多台机器上(⼤多数公司其实都这样),⽽且能说出如何部署,如何通过nginx等做到负载均衡。
数据库⽅⾯,其实讲清楚⼀个问题即可:如何进⾏SQL调优,⽐如通过索引,看执⾏计划即可,如果有其它的优化点,说清楚即可。
Java Core⽅⾯,这⾥给出些诀窍:
1 能结合ConcurrentHashMap的源代码,说出final,volatile,transient的⽤法,以及在其中如何⽤Lock对象防⽌写并发。
2 结合⼀个项⽬实际,说下设计模式的实践。
3 多线程⽅⾯,能说出Lock或volatile等⾼级知识点的⽤法。
4 这块最取巧:说下GC的流程,以及如何通过⽇志和Dump⽂件排查OOM异常,如果再⾼级些的话,说下如何在代码中优化内存代码。
诀窍点归结成⼀个:能结合源代码或项⽬实际,说出些⽐较资深的问题。
8 本⽂的侧重点&后⽂预告
本⽂中的⼀些内容在我的其它⽂章⾥出现过(不是⽂字上的复制粘贴,⽽是意思上的重构),但如果⼤家
读下我的⽂章,就会发现其它的⽂章都有侧重点,⽐如有的侧重于数据库⽅⾯⾯试技巧的准备,有些介绍如何在简历中介绍项⽬。
本⽂的侧重点是:1 ⾯试⼀定得准备 (重要的话说三遍,这⾥已经超过3遍了)2 如何全⾯充分地准备。
⾄于为什么要写这个⽂章?我得不停地总结我作为⾯试官的技巧,这样我在⾯试中也能更⾼效更准确地招到合适的⼈才。
欢迎⼯作⼀到五年的Java⼯程师朋友们加⼊Java开发技术进阶互助:524903398
内提供免费的Java架构学习资料(⾥⾯有⾼可⽤、⾼并发、⾼性能及分布式、Jvm性能调优、Spring源
码,MyBatis,Netty,Redis,Kafka,Mysql,Zoopeelr,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利⽤⾃⼰每⼀分每⼀秒的时间来学习提升⾃⼰,不要再⽤"没有时间“来掩饰⾃⼰思想上的懒惰!趁年轻,使劲拼,给未来的⾃⼰⼀个交代!