11号去成都参加阿里面试,网上预约的3点,两点半就到了,刚签完到马上就喊去面试。经历了一面二面和HR面。
一面
1.介绍一下你的项目,说一下哪个项目印象最深
答:把简历上的项目说了一遍,重点讲了暑假做的分布式SDN控制器,在纸上画了整个应用的拓扑图,运行流程,说了整个应用设计思路,关键技术选型和核心算法实现。之后他提出了一些问题,我一一给他解释
2.平时有没有写过并发的程序。ConcurrentHashMap实现原理
答:平时项目中没有机会写高并发的程序,不过有写过练手的程序,华为的那个德克萨斯扑克的比赛,虽然没有参加,不过上通信软件实训的时候老师让每人写一个程序,最后PK给成绩,我的算法不是很好就没在算法上下功夫,写了通信协议解析库,写了一个德州扑克程序的框架,框架里定义了这个牌局流程,使用者复写每轮出牌的方法,注册对哪种消息感兴趣,使用阻塞队列达到线程安全,可以并发的进行算法分析。之后他觉得这个例子不够,又问了我ConcurrentHashMap实现原理,并发容器是研究java并发必看的嘛,答的很轻松,就不细说了。
3.平时有没有关注开源项目,有没有源码的习惯
答:开源项目用到的有很多,也研究过几个,之前说的分布式SDN控制器就是在开源控制器基础上进行的修改,然后研究过Spring AOP的源码,这里不仅仅是说用了JDK动态代理或者字节码增强。根据AOP联盟制定的AOP框架模型,整个框架分为3层,在纸上给他细致的分析了每一层是如何实现的。
一面就问了这些问题,大概说了45分钟,面试官对我说的比较满意,当场就说让我等下一面。
二面
1.他看我做过Oath2.0协议,就问了我安全验证方面的问题。说安全传输有三个方面,防篡改,防窃听,和一个英文单词我没听懂,问我如何实现。
答:我当时整个人都懵了,虽然我做过认证系统,但是对理论了解的不深,我回答了防篡改是用签名,防窃听是用加密。他紧接着就问如何进行签名,然后我就说方法请求签名呀,报文签名呀。然后被直接打脸,说我说的不对,又问我签名和摘要的区别,这个我就不知道了。又问了如何实现加密,我说有对称加密和非对称加密,他没听我说完就问密钥如何保存,密钥丢失了怎么办。这些我真的了解的不多。他看我答得不好就没继续问了。
2.问我Servlet,一个请求在容器中是如何处理的。之后又问我如何在Servlet里实现长链接。
答:我说http请求会封装成request对象,根据其中的URI查询URI映射找到Servlet,再进行Servlet的初始化,然后根据请求方法调用doGet等方法,把回复包装成Reponse对象返回。在我回答的时候他多次打断了我,并提出了更多的问题,如http有哪些方法(GET,POST等),有什么不同,如何解析http协议,request对象和reponse对象是不是关联的,容器如何知道对应关系。他问的太多我也有点慌了,答得不是很清晰。接着回答长链接的问题,我不知道如何设计长链接,说了用线程池保存连接,等有消息在进行处理。然后他问Servlet里如何实现,这个我就不知道了。
3.问我红黑树的规则
我对算法的研究不深,只看了平衡树和伸展树,知道红黑树是平衡树的扩展,说出来了3条规则,还有一条没说出来。之后他也没继续问。
4.现在有10个测试线程,需要每个线程同时开始进行测试,如何实现
这个很简单嘛,用CountDownLatch 和CyclicBarrier 都可以实现。然后他说不用类库呢。我说这两个类都使用了AQS同步器,我可以使用AQS实现自己的同步工具,然后他问我如何实现,我在纸上写了实现,他对我写的不是很满意,问我AQS是什么,当场百度了一下,然后问我AQS怎么实现的,我回答封装了一个volatile变量,通过原子操作更改变量。他接着问是不是用到了锁,我说没有呀,他说那怎么进行阻塞,我说AQS是用Locksupport类实现的,他又百度了一下。之后问我用读写锁能不能实现,我说不能,他说可以,他说写锁阻塞10个读锁,当10个线程启动完毕后释放写锁。我想想这样实现也行,只是觉得这个场景不适合读写锁。说实话整个过程很混乱他经常打断我,我也经常打断他,最后终于把这个问题过了。
5.他又问了我安全认证的问题,让我说一下整个认证系统的认证流程,说一下token被窃取有什么方法防止,认证系统如何跟其他系统进行交互
认证流程我在纸上画了图,他对这个流程没有问题,token被窃取在我的实现里只能进行时间检查,有效时间2小时,其他的方式我不知道,他对这个回答不是很满意。问我token过期了怎么办,应用程序何时刷新token,然后我说请求用户信息的时候,这里他指出了如果不请求用户信息是不是可以永远登录下去,我想想也是,这就需要应用进行检查,不过只要跟认证系统进行交互,那就会要求重新刷新。最后他指出了在Oath2.0协议里一个弱token的问题,我做的时候确实没有考虑到。
二面的面试官说话很严肃,语速很快,经常会打断我,而且思维很跳跃,整个气氛都有些紧张。感觉他应该是搞安全或是搞算法的,对这方面了解的很细,问的细节问题我真的没想过。最后我问了他关于学习方法的事,问是学习云计算还是继续业务开发,他说这个看我的兴趣,并指出了我基础比较薄弱,我也说了我不是科班出身,让我加强一下基础。但是觉得的动手能力不错,以后要多思考一下。通过最后的对话感觉这个面试官还是很不错的,对技术很严谨,不聊技术的时候说话就没那么严肃了
HR面
本以为二面会挂,结果刚坐下一会就接到通知参加下一面,HR面没什么可写的,问的问题很活,不涉及技术。问日常开发流程,自己的优缺点,哪件事有挫败感,哪个项目印象最深,如果再读一次高三会选什么专业,哪一次面试印象最深(我说二面)。还有一堆问题记不太清楚了。
总结
感觉这次面试问的问题都在常规范围之内,不过没问我算法,还算幸运。面试时需要对自己的项目很熟悉,找出项目中的亮点。算法与数据结构,多线程,虚拟机,计算机网络这些都很重要。我本人是没研究过操作系统和编译原理的,每次面试问到这方面我都是回答没有深入研究过,面试官也没继续问,不过这还是比较扣分的。对于自己擅长的方面要引诱面试官问,我上个星期刚研究过Spring AOP,这次问我有没有阅读源码的习惯就可以回答上。
作者:MagicWolf