我曾经当过面试官。
小公司,就我一个Android开发,所以赶鸭子上架,让我当面试官。
面试对象:一位近40岁的码农背景:10年工作经验,简历上非常花哨,做过各种Android开发。简介:说实话,当人事把简历递到我面前的时候,我稍稍的惊呆了一下。这个工作经历比我长一倍还多的“大牛”,要知道面试他的是我这么个菜鸟级别的开发,会不会特鄙视我,以至于鄙视我们公司。偶们公司虽然小,但是我还是很有公司荣誉感的一个人。
面试过程:我: 简述Handler消息机制。
“大牛”: 嗯?
我: (一定是问题没描述清楚,怎么上来就这么紧张,嗯,放松)就是说一下Handler发送和接收消息的实现,尤其是Message的消息载体的工作流程。“
大牛”:这个,额,不太清楚。。。
我:(赶紧换一个方向)Service和IntentService有什么区别?
“大牛”: Service和什么?
我: IntentService。
“大牛”: 没用过。。(他开始有点不好意思)
我: (哦,没事,这个可能确实太冷门了)那Service和Activity之间的通讯怎么实现?
“大牛”: 这个,通信,额,你指的是?
我: 就是传值,比如Service里面某个后台任务结束,怎么通知当前活动Activity,并且把结果传递出去?
“大牛”: 哦,这个,啊,想想。。。沉默10s后。。。
我: 额,比如用广播的方式?(我都尴尬的主动给了他一点提示)
“大牛”: 哦,对,广播,Broadcast之类的。
我: 那还有其他方式吗?
“大牛”:嗯,广播,额。。。(又是10s后)比如?
我: 接口回调。。。(算了不纠结这个,他知道广播,那顺便问个这个),那Context 的sendBroadcast和LocalBroadcastManager 的sendBroadcast有什么区别?
“大牛”: 这个没听说过。。。。。。。
后面的问题,我从MVP、MVVM等流行结构框架问到多线程同步,然后再问点击事件分发,到自定义View,再聊动画效果实现,基础的ArrayList、HashMap底层实现,final static关键字用法,进阶的设计模式里面单例模式和观察者模式的实现,java类加载、内存分配,他没有一个问题能确确定定的回答出来,要么“不知道”、“没用过”,要不支支吾吾的说不出个123。
哦,对了,聊的过程中,他反复说自己用过什么什么第三方的库:什么ImageLoader、什么OKgo、什么Pull2RefreshListView等等等等显得自己很能干。
我问他:有没有开源过什么自己写的库? 他说没有。那我问他:读过ImageLoader的源码吗?ImageLoader的本地缓存机制是怎么实现的?他说不知道。我告诉他,你说的所有的库,我都用过,并且绝大部分我都看过源码实现,另外,像ImageLoader、Pull2RefreshListView这种库,我工作两年后就自己实现过简易的版本,还分别做过扩展。
最终最终我确定这个所谓的10年工作经验的“大牛”,就是网上那种“一个经验用了N年而不是有N年经验”的人。
回过头我又仔细看了看他的简历,10年过程中,这个人换了8家公司,最长的一家呆了不到2年,最短的半年就不干了,简历里也没有自己独立完成过的项目,简历上大部分所谓的Android项目,全部都是基础控件的简单罗列,没用过设计模式,没用过分层框架设计,跟我第一年参加工作写出的东西一个鸟样。
上面写了我面试别人的一次经历,谈不上高质量,但是我感觉我的问题应该算是基础并且覆盖面广的了,后期又面试了几个人,说实话都不尽如人意,这些面试者都有一个共同点:任何他们知道的知识点都是停留在知道、用过的层面,具体实现和怎么扩展优化都答不出来。
再想想这两年都在说Android开发饱和,我感觉这个说法有欠缺,饱和的是这种初级安卓开发,会简单的页面实现,但程序可扩展性和维护性,欠缺考虑,框架结构设计缺失。
我感觉我现在依然徘徊在初、中级工程师级别,由于各种原因,比如家庭等等,我学习的时间也感觉比刚工作的时候少了好多,精力也差好多,一想到这些,就有种念头:我可能永远也达不到那种网上动辄能码出10000 star开源库的大牛,或者随手写个深入透彻的解惑答疑的技术博客就有N个评论和转发的神人。所以我又有些动力,努力学习下去,这些人才应该成为自己的目标。