马上自己要去网易入职了,机会挺难得的,自己也很珍惜,希望可以把握好这次机会。在此特意记录下个人的一些面试经验,给大家参考。
先给大家推荐几本书:
1、《Android开发艺术探索》—— 高级Android开发进阶必备
2、《剑指offer》—— 基础必备
一般外地的面试,前几轮都会选择电话面试的方式。所以大家约好时间后,请记得到时候一定要腾出时间,找个安静的地方,放松心情专心接面试的电话,耐心的听完面试官的问题,快速仔细的分析题目想考的知识点,再结合自己的理解回答面试官的问题。
在面试前,需要给自己定制一个学习计划,一些基础的必问的知识点需要牢牢的记住,我稍微例举下一些常考的问题:
1、网络通信方面,一些基础的协议概念。比如TCP的握手挥手问题,Http和Https的区别以及Https传输过程中用到的加密方式,Http1.0、Http2.0和SPDY之间的区别,Http2.0做了哪些优化等。
2、Java方面的一些基础问题,比如HashMap的原理以及HashTable的区别、Android方面的SparseArray的实现、ArrayList和LinkedList的实现原理等等。
3、线程方面的,比如线程的同步机制、线程的几种状态、锁和volatile、线程池的使用和管理、甚至到AsyncTask的源码以及在不同版本的变化。
4、Jvm虚拟机这一块的内容,比如执行过程、JMM模型、java的Gc回收原理、类加载器等等。
5、数据结构和算法方面,这个没什么好讲的,就是拼基础,把基本的数据结构和数组字符串方面的算法多刷一刷,毕竟面试一般面不到太难的,强烈推荐去leetCode刷题,每天限定任务必须完成多少。
6、Android方面基础知识点,就是四大组件。关于Activity的启动流程和启动模式可以说是必须掌握的,中间牵扯到进程间通信,所以关于binder跨进程通信这方面的知识点也是需要深入了解。
7、Android的Handler可以说是Android通信的核心,所以关于这块的原理简直是基础必备。但是需要注意的是Handler中有牵扯到ThreadLocal的使用,所以关于ThreadLocal也需要看和理解下。还有HandlerThread和IntentService的使用等等。
8、对于系统服务的了解,比如ActivityManagerService、WindowManagerService和其他各种系统服务的过程,多了解多加分。关于跨进程通信binder这块的知识点建立在理论上的会比较多,但是别担心,可以在理解了一遍之后去看AIDL服务,根据AIDL可以更好的理解binder的使用。
9、还有就是关于View,比如自定义View的绘制,SurfaceView的原理,view的onMeasure、onLayout和onDraw的方法执行意义等。还有关于手势事件的分发机制和滑动冲突的处理。其他的一些系统常用控件的源码分析也很必要,比如ListView和RecyclerView的区别缓存机制、viewPager的页数缓存实现原理等等。
10、剩下的基本功就是性能优化方面了,各种死丢丢(AS)工具的使用比如Android Profiler, Lint,查看ViewTree啊,还有MAT啊,LeakCanary啊(这个的实现原理能搞懂最好)等等。布局的优化和内存泄露的查找,大图片的处理。对了,还有图片的处理和图片框架的缓存原理包括LruCache的实现原理,和DiskLruCache、列表的优化方案等等。
11、然后就是关于你项目中使用到的一些开源库,关于你用到的开源库,一定要深入到源码去理解其中的实现方案。我拿Retrofit打比方,大概需要掌握到的深度是Retrofit的设计风格、Restful Api的概念、Retrofit核心实现方式动态代理,优缺点(比如动态代理不能代理抽象类,和用到了反射),如何优化(比如CgLib,和依赖注入的方案)。这个其实就是考核你对技术的研究深度到底到什么程度。所以你项目中使用到的技术一定要深入了解,大厂是不需要知其然不知其所以然的人。
12、关于数据库,分享一个失败的案例,就是我个人曾经把ORM的概念搞混淆导致被刷掉,这个是人生中的奇耻大辱,特此记录。
13、关于项目开发的整体架构的理解,比如MVC、MVP和MVVM。关于市面上主流的插件化和组件化开发的设计思想和实现方案的理解等。
14、此外,如果你会一些其他的开发方式或语言也会加分不少。比如Kotlin,Js,ReactNative或者Weex等等。
一般面试官都会让你先来个自我介绍,可以介绍下自己的学习经历和工作经历。在项目中担任的角色和从事的工作。然后会侧重点让你讲一个你的代表作和用到的技术,然后根据你讲的技术对你深挖。也会问到你项目中碰到的难题和问题是如何解决的,这个就是考验你解决问题的能力。最好可以提前准备好一两个经典的案例到时候好有的讲。
其次就是沟通过程中不要太紧张,尽量让自己充分的思考,把自己所会的和能联想到的用较好的表达方式告诉面试官,让面试官可以走进你的思考方式中。一个拥有好的沟通和表达的程序员会更加受到面试官的喜爱。
如果你的职业技能满足了面试岗位的需求,剩下的面试官会关注你对自己的职业规划和想法。切记不要好高骛远,一山更比一山高。
我觉得低调做人高调做事更符合我们程序员的性格,对技术的渴望和追求不断提升自我才可以让你在这个专业领域走的更远。最后衷心祝福大家找到好的归宿。
1.梳理知识
一般的面试,会被问到JVM原理、Android基础、四大组件和热修复等内容,这都是一名普通Android开发人员的知识结构,那么肯定是需要具备更多的知识树,需要掌握更全面的知识体系,所以就需要对知识进行一个系统的梳理了。
一、基础技能:
二、Android框架体系架构
三、360全方面性能调优
..........
2.复习知识
工作这么久要重新再去面试肯定是要将自己的知识储备重新拿出来,要把各个知识点复习到位,需要通过各个方式,选择自己最习惯的。无论是读电子书籍还是观看视频都是可以的,但要记得做好自己的学习笔记,能够起到总结的作用,再去复习起来就特别清晰了。
电子书籍
学习笔记
学习视频
3.刷面试题
工作5年,虽然清楚现在流行什么技术,但对于互联网大公司会面试一些什么还真是不太清楚,所以面试之前刷一刷面试题还是很有必要的,能够做到举一反三。一线互联网的面试题,我整理了近三年的,内容还真不少。
【Android超硬核面试资料】
希望大家都能够有自己清晰的发展路线,希望大家都能顺利拿下offer,进入理想的公司,共勉!后续会更多的写一些针对性的技术文章,谢谢。