今天去参加2018年的首次面试,面试的是一家P2P金融公司,高级开发工程师职位(面试邮件里只写了面试JAVA)。
下午3点准时到了面试公司,填履历表,然后等了大约5~10分钟的样子面试官来了,因为自身技术深度不足以及广度太显浅,所以面试时间很短,以下是面试官提过的或说过的问题,这里记录一下(问题部分先后顺序)。
1、说一说你有什么比较突出的能力(考验某项或多项技能、框架学习的深度)
2、说说你工作中遇到哪些棘手的问题,如何解决的(考验实际工作中处理问题的能力)
3、如何用redis集群实现消息队列(考验对技术了解的广度)
4、设计模式(只问了一个单例模式)
第一个问题:
这个问题问道我的时候,我很懵逼,这个问题我没有回答上来,以前也有面试官问过类似问题,都忘了怎么回答了,这次要记录一下,算是一种给自己的教训吧,回想工作这么多年,我一直在写业务代码,即使用框架也只是会用,没有研究过原理以及当中的设计思想,这就造成我自以为很牛叉,结果其实只是个会用框架开发以及懂一点点皮毛设计的码农,现在各类编程语言漫天飞,各种框架漫天飞,人的精力有限,能研究透其中一两个就可以了。
第二个问题:
这个问题很多面试官会问到,说实话,因为懒、缺乏挑战的心态,致使我只愿意做自己能做的事,最终导致我这么多年工作经验,还不如有些在高压状态下工作两三年的人(这些人有很好的学习能力以及总结能力),这个问题我回答的也不怎么好,从这个问发现自身在语言组织上差的有点多,没有很好的描述出设计思路,讲完我自己的都懵了,代码好写,但是要给人讲明白其实挺考验人的,之前写过几篇博客,写的都比较潦草,今后还要加强自己语言表达以及组织的能力,要做的到自己学会还能给别人讲明白。
第三个问题:
redis 集群实现消息队列,同样问我的时候我也没有回答上来,就连思路都一点也没有,这个很尴尬,而且面试结束后才想起来没有请教一下面试官如何实现这个,平常用redis也就缓存点登陆信息或者其它不经常改变的信息,没有接触过集群,更别说redis集群消息队列,面试官说过一句不需要主从备份,当时觉得很奇怪,面试过后想想,有些场景即使消息丢了也没有影响吧(可能我想的太简单了),回来百度了一下redis集群消息队列,大多都是理论,没有实际实现过程,之后会再查资料整理一份具体实现过程(目标诗春节前要完成该工作),为之后找工作在遇到类似问题做准备。
第四个问题:
面试官说实现一个懒汉模式的单例对象,以前学习设计模式的时候有点印象这个词,但是想不起来具体区别了,就是按照以往用的单例方式写了一段代码,代码如下,写完代码之后面试官说这就是懒汉模式,问我这个实现有没有问题,我思考半天,只知道 synchronized 这个关键字锁比较重(具体怎么重忘了,一会儿补上为什么)有性能影响,然后面试官又问这个实现还有什么问题,我实在想不起来了,就请教面试官,面试官一提重排序,我想起来了 volatile 关键字,这段代码中静态变量 a 没有加上这个关键字,在多线程高并发环境下静态变量a可能会出现两次实例化(我对这个是有怀疑的,因为有 synchronize关键字在,这个需要实验才能确定,之后会抽时间实验一下),面试官问我一句为什么要用 byte[0] 做为对象锁,支支吾吾说了个占用空间小,我都忘了从哪里学的这么个写法了(经过度娘后找到一篇文章 Object vs byte[0] as Lock)
public class A {
private static A a;
private static byte[] lock = new byte[0];
private A() {
}
public static A getA() {
if (a != null) {
return a;
}
synchronized (lock) {
if (a != null) {
return a;
}
a = new A();
return a;
}
}
}
第四个问题面试完,面试官就说结束了,让我回去查查volatile这个关键字,过一会儿HR来告诉面试结束可以走了,我知道这次面试以失败告终。
对今天的面试做个总结:
1、学东西一定要深入去了解实现方式以及为什么这么实现
2、学东西一定要记录,开始可能会写的比较凌乱,但是写习惯了之后自然而然的就有组织了
3、多看书!多看书!多看书!
4、多看几遍书!多看几遍书!多看几遍书!
5、多交流!多交流!多交流!(QQ群、社区、博客、微信等等)
6、多总结!多总结!多总结!(学完某一个知识后,尝试以自己的观点来解释)