周四在我的QQ群里,谈到了昨天面试的事情,引发了我后续的一些思考,所以写此文章。文中内容仅代表我此刻观点,也许并不成熟,浅薄之见权当抛砖引玉。
在这场面试中,我的角色是面试官,面试通过电话进行。作为一个客串面试官的程序员,其实电话面试对我来说很难,无法通过面对面观察到更多的细节,一切只能通过声音去了解,并且不得不非常专注,以免不能马上理解对方的话并进行答复或进一步提问。
面试的整个过程我就不细说了,本文主要谈谈面试后自己的一些感想。
首先说一下我对于面试的一些看法。在我看来,面试并不是为了出一些问题来为难对方或显示出自己的水平有多么高超,而是希望在尽可能短的时间内,尽可能多地了解到对方与公司相切合的技能的掌握程度以判断是否符合要求,以及对方与团队是否合适及发展潜力如何等。因此,在通过了简历筛选之后,除了几个必须了解的问题之外,在面试时我都会尽量把问题聚焦于简历之上,从简历的内容来引出问题并把问题进行发散从而更进一步地提出其他关联问题来探究对方的技能深度。至于所谓面试宝典,我没有看过,也不想去网上找所谓的面试题。而这次要招的只是应用开发工程师,不需要对Framework有多深入的了解也能胜任开发。所以我基本上不会去问过多看起来很底层或很深入但实际开发中基本用不到的知识。
所面试的人毕业时间与我相同,在面试前我访问了其个人博客,内容广泛,涉及广度远胜于我,而从事Android开发的时间也与我相差无几,我猜想其技术水平应该与我相近,故更为期待。只是面试下来,结果并没有让我惊喜。对方所提到的组件化,并没有涉及到细节问题,比如使用哪种组件化方案,如何处理资源依赖等问题,听起来只是普通的分模块开发。后来从模块引到了依赖,但从回来的内容听来对方对Gradle也没有较多的了解,作为一个从事Android开发工作近六年的人,这点让我较为意外。
我在提问过程中,也一边思索,是否我的提问方式有问题,所以问不出实际的水平。但回顾我所提的几个问题,也未发现其中有什么不妥。
我后面又提了两个问题。
一个是让他描述使用MVP模式实现登录时,那些方法的调用流程。一般在简历中提到熟悉MVP时,我都会问到类似的问题。以前我可能会问MVP与MVC有什么不同,或者对MVP有什么理解。后来我发现,这样问其实对于大多数人来说,我还是难以知道他们的水平。因为这样的答案很通用并且很抽象,并且回答出来也不代表他们能够熟练地使用,可能只是这种问题的答案。后来在朋友的启发下,我改为用具体的例子来提问。而以登录为例子,也是网上关于MVP的教程就数登录的例子多,它业务简单好理解,沟通起来成本低。这样的问题我个人觉得比较轻松,只要把自己如何实现MVP的过程描述清楚了,也就说明在写代码的时候自己是理解这种架构模式的,那就没什么问题了。讲完如果能再稍微谈自己对MVP的一些见解那就更好了,对错不重要,关键是能有自己的思考。
另一个问题是一个很开放的问题,问这个问题主要是看想了解对方所熟悉的领域的深度,只是对方的回答反而暴露出了一些基础知识的不足——我认为强引用、弱引用、软引用这些概念对于一个不低于三年经验的Android程序员来说应该可以算是基础。
不谈最终结果。说一下在群里的讨论。
我一般不会在面试当中去问一些AMS之类的问题。首先,如前面所说,这样的知识,在公司实际的应用开发中,不会用到。其次,这种看起来面试必问的问题,可能会有些人去背答案,所以即便对方能答出来了你也不清楚他是真的水平到了那个程度还是仅仅背过,毕竟水平到了一定层次去深究源码了解一个知识点,和直接囫囵吞枣地背诵一个知识点,这之间的区别是不言而喻的。当然,如果是应聘高级、资深工程师的话,我想这样的问题就是必须得掌握的了吧。
说到背面试题,我想起了几年前的一次面试。那时面试别人的经验更贫匮,我如之前一样提了一个Handler的机制的问题,结果对方不假思索地就把关键点都答了出来,Handler, Looper, MessageQueue,像念经一般。我听着他讲,总感觉哪里不对,但他的答案听来又十分完美。于是我问了一个我觉得不难的延伸问题:如果我想让主线程,向子线程发送一个消息让子线程去执行,应该怎么做呢?结果一个把Handler原理讲得那么清晰的人就这样被问住了。然后我明白了,这是背过的。
后来在面试过程中,我发现,一些基础而具体的问题反而更能表现一个人的水平是否合格。基础答得好的,水平都差不到哪里去,而且入职后水平提升也很快。所以在面试中,我总是更多地问一些基础而具体的问题。除非简历或交谈中有涉及到更深或更广的内容,我才会进一步深入以触探对方的知识深度。
话说回来,周五的时候,有人问我关于Handler的问题,这让我想到关于Handler的另一种问法,不知道是否有其他人问过:请以设计的角度,谈谈你对Handler的理解。或者说,讲讲Handler为什么要这样实现。又或者是,如果是你,对于这样的需求,你会如何去实现。
对此,你的答案是什么呢?