不是怎么喜欢写开发类的文章,始终认为这些东西不应该由程序员来写,更加倾向于写一些感受以及想法可是慢慢的发现有些东西,你不写是不行的,好吧,那我跟随大局也来谈谈我的面试经验以及各方面的看法吧。
  以下的面试经验主要针对于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的路还很长,还需要好好努力.....
  回来复习的时候,猛然发现一个网站,无论是新的开源技术,还是数据结构算法,已经新的市场行情分析,都感觉蛮不错的,同时也有很多开源项目,对我后来的提升有很大帮助;好东西不敢私藏,在这里分享给大家。