Java / Android 面试中所遇到的那些坑
某度,去了以后才发现是做基于各类SDK的开发,用于行业国际化,后期拓展到整个产品线上的;能力方面:是想找一个架构能力非常强,或者源码分析能力非常强,或者coding能力非常强的一个工程师,第二家公司是想找一个资深架构师或者是项目leader;第三家,朋友所在的公司,同样也是想找个资深程序员......
某度面试知识点整理,(以下只是整理个大致方向,具体内容请自己自行查找):
1、主要是对象创建,堆内存、栈内存,数据引用地址是否发生变化等问题。
2、以及Gc Root的相关概念,以及回收机制内存泄露的检测,考察了内存泄露的所有相关原理,里面包括,单例、内部类、匿名内部类,静态内部类,造成内存泄露的原因和解决方案;内存泄露的检测方案,主要是MAT,以及查看等,另外像图片、网络优化处理方面的优化问题等等;
3、同时还考察了有线程池的ThreadPoolExecutor,底层实现机制,以及在引用线程池,如何实现线程之间的调度机制。
4、java方面考察的比较多的还有hashmap,比如hash碰撞,产生碰撞的原因,如何避免hash碰撞;数组和链表之间的关系,如何实现存储等操作。
5、同时还考察的有Handler实现机制,不是简单的那些被市面问烂的轮询方面内容,包含贯穿整个生命周期的启动机制,至于复杂的内容,自行查找;
6、常用的设计模式,以及设计模式在实战中的应用也是少不了的。
7、另外还有动画的相关内容,主要是view动画以及属性动画的比较,以及动画所引起的泄露问题;还有事件分发机制在实际中的问题等;
8、多线程问题,线程同步问题,以及多线程直接的调度问题;进程直接的通讯方式。
9、项目的架构思路,以及分析解决机制。
10、另外还有常用的三方库,以及三方库的实现机制以及原理。
11、应用的启动机制,activitythread等...
第一家公司
因为个人时间紧急,申请不进行笔试答题,但是手写代码、思路等都是必不可少的,某度前前后后差不多面了两个半小时,除了ThreadPoolExecutor底层实现机制实在是想不起来其他都答出来了,整体来讲没有毛病,不过最后再攀谈的时候,如之前所说的那样,想要一个非常非常突出的人,而不是一个什么都懂,又什么都不精通的人,所以深度是非常的重要,毕竟是面一个高级研发做SDK方面的;一般的能力还是不符合,在面试过程中面试官反复问我你有什么非常擅长的领域没有,也足以看出是想多给我些机会,可惜自己没有把握住,而且这些只是一面,二轮面试是基于sdk架构层面的,更多的是牵涉到架构思路,整个项目的搭建思路、以及各类设计模式的运用方面了,这里就不再诉说了,有兴趣的自行研究下。
第二家公司,回答的内容就比较有趣了,
基本上可以这么说,我把我所能说的都说了,比如我用的最新的Rxjava,retrofit,okhttp,以及现在比较火的,Reactnative,databinding,性能优化,开源架构思路,以及各类开发的模式,mvp,mvc,mvvm等,比较实现等思路,而且自认为深度广度还好,只是在问道内存泄露问题上,关于内部类,静态内部类,匿名内部类造成的内存泄露忽略了;而且最后犯了一个比较重大的严重问题,算法一般的我竟然夸大海口说,算法就是找到规律、找出原理然后用代码表现出来,面试管当场出了一个算法,思考半天,给了一个解答思路,但是效果一般;而且还提问了一些关于gc回收的调度算法,没接触过只能作罢;最后感觉自身能力有限,后面要求再去面试,感觉自身驾驭不了,最后也就不了了之了。
第三家公司
哎,工作这么久,这是最被动的一次;怎么说呢,问的知识很多都是java基础,可能一直沉浸于android的世界,反而把一些基础性知识给忽略了,只知道有这个东西,具体原理都忘记了,而且在面试的时候还发现一个问题,就是一定一定要把你写的知识点一定要讲明白了,我们公司的消息部分是自己做的,但是这部分代码我并没有仔细看过,于是面试管问了消息部分的某个细节问题,当时猛然没有想出来,结果可想而知;还有就是你实现的功能,你单纯会做是不行的,一定要把原理性的内容说出来;
面试官有时候问的一些问题如果跟你的思路不太一样的话,一定要据理力争,不过前提是你要把功能和原理想明白了,保证能够实现的了才可以,不然最后坑爹的肯定是你自己。其中还问的有surfaceview实现机制,因为写过的代码间隔好久了,突然被问起来,竟然大脑短路了...面完后已经知道不行了,基本功不能丢,原理性的东西一定要勤于总结...
综述
上面所说的内容都只是一面,某度面了两个半小时,第二家一个半小时,第三家一个多小时;总的来说,某度的面试官技术实力确实最给力;现在的面试内容确实是比之前要难了好多,无论是架构能力,还是底层实现能力,甚至是基本能力,现在面试单纯知道原理是不太行的,一定要答得非常有深度,非常了解才行;而且基本功这东西可能在日常开发中感觉不出来,不过这些都是潜移默化影响着你,忘记的话一定要补习上来的,就像最后一个面试官问我,一些最常用的基础性的东西怎么可能忘记呢;事实证明当你在面的级别越高时,越是这种最最基本的东西要熟烂于心,与此同时一定要提升自己的深度以及广度,几次面试都是在没有怎么准备的情况进行的,其实,机会就那么多次,你不珍惜,只能怪你自己,要珍惜自己的每一次机会,不能太大意了,这年头你单纯会敲代码是不行的,需要你把原理性的东西,揉碎了,记在自己的脑海里才行。
有人可能会说,我要是面试管,我也能把对方问倒,确实是这样,不过现在你是一个普通的面试者,就不要想太多了。
小建议
最后几个建议,JNI/NDK,这个有兴趣的好好学习学习,好多公司已经开始重视这个,跳槽不要太频繁,通过好多猎头的了解,13年以后毕业的研发工程师,跳槽的频率不是一般的高,而且技术实力跟11年之前的相比,差了不是一两个数量级,还有一个是关于现在的React native,或者是react这只是一个小的方向,不会影响安卓原生大的趋势,就如同一个小语种一样,需要学会,不过不建议投入太大的精力;深度和广度两个都不能丢弃,基础更加是重中之重,设计模式,算法,数据结构也不能丢弃,android的路还很长,还需要好好努力.....
回来复习的时候,猛然发现一个网站,无论是最新的开源技术,还是数据结构算法,已经最新的市场行情分析,都感觉蛮不错的,同时也有很多开源项目,对我后来的提升有很大帮助;好东西不敢私藏,在这里分享给大家。