
面试时,面试官应该了解每个人的经历和擅长方向是不同的,因此不应只停留在某个擅长领域进行深入提问。我的面试流程通常是两步:首先询问应聘者的工作经历,如果有具体项目的话,可以查看成品;其次,根据其经历提出问题,问题可以涉及界面实现、bug排除、原理分析等。
举个例子,在一次面试中,我首先问:“你简历上投过来的那份是不是一样的?”得到肯定回答后,我问:“你在之前的团队中担任什么角色?”应聘者回答:“中高级。”我又问:“具体的工作内容是什么?”回答是:“编写框架,让新人更容易上手,能够轻松工作。”接下来,我问:“你的框架具体包括什么?”应聘者回答:“一些共同的东西,可以让新人即便刚来也能很好地完成工作。”
我继续追问:“你们的联网功能是封装的吗?”应聘者回答:“是的。”我接着问:“你们使用的是什么?”回答是:“安卓自带的HttpClient。”我又问:“直接使用了吗?”得到肯定回答后,我继续提问:“你们的网络请求是如何实现异步的?”应聘者回答:“我们用Handler和AsyncTask。”我追问:“能否详细说明一下?”应聘者回答得支支吾吾。
我接着提问:“使用Handler和AsyncTask有什么区别?谷歌为什么要设计两个而不是一个?”应聘者回答:“区别肯定是有的,不然谷歌不会设计两个。但是……”面试到这里可以结束了,我评分减一分。
随后,我问:“你在简历中提到熟悉大图片加载,能详细说一下大图片加载时需要注意什么吗?”应聘者回答:“缓存。”我追问:“缓存?”应聘者回答:“大图片加载不就是ListView中的大图片加载吗?要防止内存溢出。”我继续追问:“ListView中一定是大图吗?”应聘者回答:“嗯……”
我接着问:“那么ListView中的图片缓存是如何实现的?”应聘者回答:“三级缓存。”我问:“哪三级?”应聘者回答:“如果内存中有,就用内存中的;如果没有就用本地的;如果本地也没有就从网络上取。三级。”我又问:“网络上的也叫缓存吗?”应聘者回答:“啊,你可以把它看作缓存,也可以不看作缓存。”
我继续追问:“内存缓存是如何实现的?”应聘者回答:“用了一个HashMap。”我又问:“直接用HashMap吗?”应聘者回答:“嗯……嗯。”我接着问:“直接用HashMap的话,怎么防止内存溢出?”应聘者回答:“你可以用软引用。”
我追问:“软引用就能防止内存溢出吗?”应聘者回答:“还有……还有谷歌出的一个叫LRUCache的。”我继续追问:“软引用能防止内存溢出吗?”应聘者回答:“还有……还有谷歌出的一个叫LRUCache的。”
从这次面试中可以看出,只需简单提问并深入探讨,就可以全面了解应聘者的能力。对于初级和中级工程师,我更倾向于考察其学习能力,即对方对自己做过的事情是否足够了解。每个人的经历和擅长方向都不同,因此不应苛求其在所有方面都强。