Android程序员面试中所遇到的那些坑(希望大家能有启发)

不是怎么喜欢写开发类的文章,始终认为这些东西不应该由程序员来写,更加倾向于写一些感受以及想法可是慢慢的发现有些东西,你不写是不行的,好吧,那我就跟随大局也来谈谈我的面试经验以及各方面的看法吧。

以下的面试经验主要针对于3年~5年左右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的路还很长,还需要好好努力.....

image

然后我自己这边呢有一些面试资料,我免费送给大家,私信我【资料】就行了。

你可能感兴趣的:(Android程序员面试中所遇到的那些坑(希望大家能有启发))