说好的博客,终于要来了。
这篇文章写一下面试时我自己一般是如何展示自己技术水平的。
我是一名做Android的攻城狮,自己的面试经验还算不错,作为求职者自己的面试成功率比较高,而技术关我从来还没遇到不通过的。我面试的时候喜欢先自己展现下自己的技术,然后再是面试官提问;这样让面试官能全面充分的了解我的技术层次,接下来谈薪水待遇自己的话语权就会多一些。
首先声明一点:我不喜欢在面试的时候多谈业务逻辑、多谈项目经验、多去展示自己对具体Api的记忆之类的行为。因为你所谈的项目和业务逻辑,都是需要和别人配合才确定下来的,而具体的业务、实施场景又是受到各种需求方、提供方的限定、干扰,所以我认为谈这些就是耍赖皮。就好比你给我说:我写的程序,效率都特别高!!可是,空口无凭,我怎么相信你?所以我都会和面试官说简单的介绍下项目,希望更多的去探讨Android标准的机制。
进入正题:
我一般会从一个控件引入,然后扩展到自己的知识结构;这个控件可以是ListView或者是自定义的瀑布流等等。
这里就以ListView为例:
谈到ListView首先可以谈谈它的基础使用,比如复用ConvertView,使用ViewHolder,以及最简洁的ViewHolder写法,以及不同方式之间的一个效率比等;还有以ListView为代表的Android里的MVC思想;以及Android5.0之后出的RecycleView的设计思想及使用,RecycleView在易用性方面能否直接替代以ListView为代表的AdapterView?ListView中的数据更新使用notifyDataSetChanged()方法,内部实现是什么?使用了哪种设计模式?自己如何模拟实现这种设计模式?
然后谈对ListView的优化:小的方面可以是分页、分批(实质一样)加载数据;哪些常见的实现方式?
大的方面谈ListView的优化的话可以说分为两类:①线程优化;②内存优化。
线程优化可以谈到Android的异步任务机制和消息处理机制;Looper、Handler、MessageQueue内部实现,TLS(ThreadLocalStroage)在其中的作用;AsyncTask内部实现,优缺点,基于AsyncTask的缺点如何实现定制AsyncTask等;还可以扩展谈一下四种Java线程池的区别及使用场景;如何自己模拟实现线程池的结构?
内存优化的话可以谈到Android、Java内存管理机制,进程分类,提升进程优先级等;以及对Bitmap的处理:加载、缩放、缓存,常用或自定义图片缓存算法,如何避免OOM,发生OOM时处理,全局低内存状态、全局异常处理等,开源图片加载库UniversalImageLoader图片缓存的策略、处理,如果是自己写一个图片加载库的话需要制定怎样的缓存策略,考虑哪些问题,保证简单易用、高效、健壮、强扩展性;还可以谈到UI布局的优化;网络访问的优化;如何避免、定位内存泄露;以及加上各种别的细节:例如对各种流、游标的关闭、传感器的适时注销等的处理就可以上升到整体的Android性能优化。
还可以从ListView每一个Item的布局、或者是自定义一个增强型的ListView(条目可侧滑或自带下拉刷新等)这个角度谈Android中的View测量、布局、绘制、重绘等过程、机制,不同窗体的内部创建过程(Dialog、PopupWindow、Toast等的创建有何区别);或者自定义一个控件需要从哪些方面入手,需要覆写哪些方法,各自在哪个阶段生效等。
谈到View的绘制流程涉及到一个View树的概念,然后可以联想到Android的事件分发树:点击、触摸事件分发、处理、拦截等,View与ViewGroup之间不同的事件处理。以及这两个树之间的异同点。
ListView条目的点击又可以联想到IPC进程间通信:IBinder架构的重要性,服务端接口、客户端接口、以及IBinder驱动层的实现方式;
Activity:可以涉及Android应用的启动过程、Intent的匹配过程、AMS(ActivityManagerService)内部原理等;
Service:IBinder架构、获取IBinder对象实例方式、ServiceManager等;
ContentProvider:设计理念;关于数据库操作的:数据库实现、设计、原理。CRUD操作数据库中是如何操作的?通过注解、反射、泛型实现的ORM如何实现?
Broadcast:发送广播过程、接受广播匹配过程。
你还可以再谈谈Android组件设计的哲学,其中能体现出的设计模式等。
谈以上很多机制的时候如果能结合Android源码、从源码角度,或者说参照Android源码实现机制说的话,就更好了:侧面告诉面试官自己喜爱钻研。
以上的这些基本上就是我面试的时候自己会主动谈的技能点,整个一套下来的话大概能谈快一个小时了,面试官就知道你的水平还不错。限于篇幅有限,我写的并不详细,只是写了个名字简单的提及而已,如果详细谈的话这篇文章就太长了。
遇到的面试官不一样,所以技术面试侧重点就不一样,很多的知识都是靠自己平时积累,做到广撒网,多捕鱼;还有就是要打磨自己,让自己的心智成熟,能和不同的面试官聊到一块儿,不能因为技术分歧而闹不愉快。
一个好的心态、踏实的技术态度,都会给自己帮助很多!
明天就是中秋节了,祝大家中秋快乐!!O(∩_∩)O