面试官之初体验

Posted 潇潇凤儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试官之初体验相关的知识,希望对你有一定的参考价值。

        找工作难,招人也难,现在的新东家,基本处于稳步向前发展阶段,想扩充队伍,需要大量人员:服务器、测试、androidios、大数据、运营等等。我负责Android这块的,主要面向中高级,应届生或是在校生(实习)也招,只要基础好,觉得可培养。在我看来,招人要求跟大厂应该差不多,要求基础好,会分笔试和面试两部分,笔试至少得及格,再根据简历确定是否需要面试,如果是高工有三轮技术面,如果中级,两轮技术面,一般技术决定要,没有HR面。

1 在校生或是应届生要求

        对于刚毕业的应届生:希望你知道拓扑排序,图的遍历方法,求最短路径,树的非递归遍历(前序后序中序遍历),如果知道红黑球,左旋右旋及使用场景更好。如果学过编译原理,应该知道如何构建一颗语法树。对于线程、进程有一定的了解,java基础知识(比如java8的一些新特性)。

        现在很多学生都缺少自我思考的能力,更多的是死记硬背,稍微换个方式就不会回答了。比如知道java8里接口多了默认方法实现,那多问句“为什么要多这么一个新特性”,有些就答不知道或是有些能答上提供一些方法默认实现,可以减少每个实现接口的类实现相同的方法。那这样就失去了接口的优势,接口就是为了让各自实现类有不同的方法实现,且也违背了多继承特性。“为什么在java8才出现这个新特性,java7及之前不会存在这个问题么”,很多人就直接蒙逼了,直接答不知道。其实再多想一步,为什么java8才出现这个新特性呢,肯定是java8开始有些地方需要用这个新特性吧,每样东西出来肯定有它的原因吧。再多想想,联想到lambda等就算你至少有一定基础,思维较灵活。

2 社招要求

        对于社招:希望你知道:

2.1 JVM相关的

(1) 多线程

比如java内存模型(问的问题可以是java为什么是线程非安全的),什么是线程安全,有哪些方法可以保证线程安全,分别是怎么实现的(实现原理)。synchronized是可重入的么?是公平锁么?可中断么?什么叫可重入锁?后续java版本对synchronized做了哪些优化?volatile是怎么实现线程安全?它能保证线程安全么? 
ReetrantLock怎么实现读写锁?它实现原理知道么?(AQS 原理知道么)它可中断么?可以设置超时时间么?公平的还是非公平的?
怎么实现一个无锁队列?CAS的实现原理
线程池的优点,怎么实现一个线程池,java api提供了四大线程的默认实现,分别是什么,应用场景是什么?

(2) 多进程

IBinder机制是否了解,进程间如果要实现方法异步调用怎么实现,IBinder默认会有几个线程,进程死了怎么监听(两种方法的区别),如果主进程挂了子进程活着的时候怎么监听,进程间数据是怎么传递的等

(3) 垃圾回收

四大引用,被强引用的对象一定会被回收么?怎么判断一个对象会不会被回收,Android 中采用什么方法找到需要回收的对象?对象分配在哪个区域,堆的分代机制了解么?是怎么实现分代的?如果要你自己设计一个垃圾回收框架,你会怎么设计?
Threadlocal的实现原理,Looper线程安全么?

(4) 集合类

hashmap的查找时间复杂度?它是线程安全的么?为什么是非线程安全?jdk1.8做了什么优化?扩容后冲突的元素还会发生冲突么?它的扩容为什么会发生死循环?怎么扩容的,容量为什么是2的n方?concurrenthashmap的实现原理?怎么扩容的?linkedhashmap是怎么实现有序的?lrucache的实现原理?

2.2 网络相关

https的请求过程,http2的特性,各种协议对比,socket/tcp/http三者间关系,tcp建立连接的三次握手和断开连接的四次挥手,https交换证书需要几次握手,httpdns ip直连,http长连接实现,Android 怎么防止抓包?

2.3 Android开源框架

okhttp 它是怎么实现支持http2的,okhttp的缓存策略是怎样的(至少得知道一些response的header里哪些是控制缓存的)、okhttp怎么做DNS解析,自己加代理怎么加,okhttp的连接池有几个(死亡策略),如果这些连接池现在都被占用再发出一个请求okhttp会怎么处理?

LeakCanery是怎么检测内存泄漏的,线上的内存泄漏怎么捕获,怎么找到ndk层的内存泄漏?

Retrofit用了哪些设计模式,calladapter converter 用来做什么的?想添加xml解析怎么添加?

Glide:有几级缓存,怎么做的缓存,有几级?怎么和应用或是页面生命周期绑定?glide4.0做了哪些优化

Fresco:怎么做的缓存,加载时为什么图片要写固定宽高,有没有对它进行优化或封装,怎么实现圆角?

RxJava:怎么实现异步调用,怎么实现线程切换的,数据过滤、数据转换怎么实现,背压式怎么实现的?

2.4 其他Android相关

Android 中的消息机制:来了一条消息按怎么插入队列的?取消息的过程,消息队列是阻塞还是非阻塞队列。如果是阻塞队列,为什么UI线程不会被阻塞?java中阻塞队列有哪些,非阻塞队列有哪些

ANR 怎么定位anr,native层的anr怎么定位?线上应用的anr怎么获取到日志

性能优化:应用耗电检测,应用内存、流畅度、线程优化,包体积压缩

2.5 算法方面


数组类:斜行打印矩阵
字符串:字符串匹配kmp算法
链表:逆序,判断是否有环
:非递归后序遍历,查找树每层的第一个或最后一个节点

等等等等

2.6 软问题

项目中遇到了什么难点问题,是怎么解决的?对团队的贡献
自己最擅长哪方面:(即有什么优点比较突出,我们为什么要录用你)

如要说善长写UI(给一个信息流列表,现在滑动比较卡,需要优化,怎么优化)(抽屉页里长按应用删除时的动画是怎么实现的);

如果说性能优化(应用流畅度怎么判断?怎么优化,这样做的优点和缺点);

如果说架构搭建(设计一个IM及时聊天工具怎么设计?需要包含技术选型(XMPP、MQTT等)、数据库表的设计(成员表、消息表、摘要表等)、mvp架构、和服务器通信、消息推送处理等);

如果说善长与服务器交互(数据库的升降级,怎么合并请求,延时请求,线程池设计等)

当然面试肯定不只有这些问题,具体人员问题也是千差万别,我只是抛砖引玉,也有可能上面一个问题都没有问,看你简历上写的技能点或是项目经历,自己所做的事来展开,所以自己简历上的东西,也要各个击破。还有很多东西要多问自己几个为什么,为什么要这么设计,这么设计有什么好处,还有没有其他改善的地方。

最后想说的话:

面试是可以准备出来的,只要你用心准备,最后就准备收割offer吧。至于是想去大厂还是小厂,个人感觉差别不大(我也是百度、新浪、IBM待过的人),最后发现自己所在的组内就这么多人(10多个吧,每天打照面的就这些,最多还会跟设计、测试、后端的人打交道,哪都一样的)。大厂光环也保不了你多久,年纪大了,还是一线程序员,且没有很强的技术能力,在哪都不吃香。这几天也面了几个85年左右被大厂优化出来的人,发现能力一般,没有优势,要说加班估计也是加不动。

其实只要觉得自己有成长空间,钱给到位,团队比较友好,个人觉得比什么都强。能力有了,到哪都吃香。说的好听点工作是事业,work is profession, not a job,说得不好听点就是花时间换钱,在哪都是早出晚归,待得开心最重要。毕竟人生苦短,不要太委屈自己。

还有这几天老大看我手头工作做完了,会给安排新活,或者说你看看别人写的代码,评估下这么写合不合理,预测下可能会出什么问题,哪哪哪他觉得不大好的,让我出个方案。我给LG说的时候,就被LG吐嘈了,我工作站在一线开发人员的角度,屁股决定脑袋,不会站在管理者的角度去想问题,只管自己一亩三分田。教训得好,以后要操着老板的心,这样才有成长。

以上是关于面试官之初体验的主要内容,如果未能解决你的问题,请参考以下文章

按在地上摩擦面试官之mysql事务(精讲)

按在地上摩擦面试官之mysql事务(精讲)

吊打面试官之ConcurrentHashMap和Hashtable

Java 转 Go 之初体验

对线面试官之MySQL索引篇

吊打面试官之消息队列基础