赞
踩
现在正是金三银四的旺季,很多有求职、跳槽打算的人最近都在完善更新自己的简历,打算趁此机会换到心仪的环境。
但是程序员相较其它工作岗位略有不同,最注重的就是技术。但是很多程序员会产生一个误区,觉得简历包装的好了,自然能有很多面试,反而不太重视自己的技术深度了,对自己的技术认知也不够。
结果简历发出去,面试邀请寥寥无几,只恨自己怀才不遇。
如今面试已经不是多年以前了,准备过程中一定要准备回答各种深入的理解、扩展。
但凡只要是你简历上写到的技术,你最起码要准备好回答以下这些问题:
1.该技术原理是?
2.做过哪些针对某些场景的优化?
3.哪些模块可以根据场景扩展?
如果你连原理都没掌握好,那这个技术点最好不要写到简历上。
所以,现在做面试准备,对于一些技术点,可以按照以下方式对自己进行考察:
1.该库的常见API使用;
2.该库在API层级的扩展,比如okhttp可以通过添加拦截器做一些事情;
3.该库的原理,可以考虑分哪些模块,每个模块具体行为;
4.该库的原理层级的优化,这方面很多优化都是根据特定场景的,从大的面上肯定该库做的已经够好了;
5.该库的原理层级扩展,比如修改某个模块替换实现;比如cache模块修改为DiskLruCache等。
一般最少能完成到第三点,最好能够完成第四点。
就我之前的工作经验来说,一个具有如下特征的Android程序员是公司所需要的:
在上面的四条中,其中第3条是最为重要的,即技术,技术是决定能否通过面试的最重要最直接的原因。一般来说,越是大公司,其对技术的要求就越高,尽管部分岗位并不需要那么好的技术,但是为了对候选者做出区分,其面试过程仍然会面试一些稍微深入的话题,相信大家都有所体会。
这里做下总结,理想的候选者应该是这样的:
由此可见,技术是面试结果的决定因素。那么到底技术掌握到什么程度才能比较轻松地通过面试呢?说了那么多,好像和Android没有一点关系,下面就开始以Android为例来分析下面试过程所需的技术。
一场面试都有一个流程,拿Android面试来说,面试内容不可能全是Android问题,里面应该会有编程基础相关的问题。我对Android面试中的问题做了下分类,如下所示:
一般来说,一个Android应用开发岗位是不需要太强的数据结构和算法的,但是这并不意味着候选者可以完全不懂数据结构和算法,所以数据结构和算法大家还是要稍微了解下,由于它不是必须的,所以就算面试过程中回答的不好也没关系,只要后面的Java、Android相关的问题能够完美回答就好。
接下来主要描述下面试过程中对Android技术的要求。在我对Android的理解这篇文章中,我对Android的技术类别做了一下划分,如下所示:
对于大部分面试者来说,大家的目标岗位应该是中高级,
中级岗位(T4)需要掌握的知识点是:基本知识点、深入知识点;
高级岗位(T5)需要掌握的知识点是:基本知识点、深入知识点、基本知识点的细节和系统核心机制。
Android面试需要准备内容的大致划分:(括号内为重要程度,最多5颗星)
Android相关知识、Java相关知识、设计模式(5)
算法、数据结构(5)
如何写简历、如何面试(4)
项目、比赛获奖(4)
操作系统、网络、数据库(3)
细分:
以下细分内容,网络等计算机基础方面还不是很全面,持续更新中。
我会逐步更新各个知识点相关博客或资源,如果需要,建议关注。
Android
Context的理解
Activity生命周期、启动模式、IntentFilter匹配规则
IPC:Serialzable、Parcelable、Binder、Socket
View事件体系
View绘制流程
RemoteViews(不重要)
Drawable(不重要)
动画、绘图
window、wm、wms
四大组件启动、工作流程(Activity至少看一下,AMS)
消息机制:looper、handler、MQ
线程、线程池、多线程
bitmap加载、缓存:LRUCache、DiskLruCache、LinkHashMap
CrashHandler(一般)
multidex(一般)
Fragment、Service、SQLite、Webview
Android内存泄漏场景及解决方法
ANR的原因、解决方法
开源库(一般要求看过源码,知道原理):Retrofit、RxAndroid、EventBus、Picasso(优点)、OKhttp3
持续集成Jenkins(不重要)
单元测试、测试用例(一般)
插件化:Atlas、OSGI(一般)
Java
Java基础:比如接口和抽象类的区别等
Java内存管理:工作内存和主内存等
垃圾回收:回收算法、如何判断对象可以回收、新生代老年代等
并发
锁:sychronized、lock(CAS);volatile;并发集合:CopyOnWriteArrayList、ConcurrentHashMap、RemoteCallbackList(Android的IPC用到)、LinkedHashMap;
集合
Map、Set、List
Queue、Stack
HashMap、HashTable、ConcurrentHashMap:实现原理,区别等
LinkedHashMap
设计模式(六大原则:SOLID + 迪米特)
单例模式:获取各种service
工厂方法:activity、service(onStart)
责任链:Android事件分发
builder:dialog、Picasso
观察者:listview更新、EventBus
适配器:listview adapter
算法、数据结构
排序
冒泡排序
选择排序
归并
堆排序
插入排序
快速排序
希尔排序
桶排序
基数排序
字符匹配:KMP算法
二分查找
二叉树遍历、翻转、重构;二叉查找树
红黑树
AVL树、哈夫曼树、B树(一般)
网络
基本是围绕OSI七层模型展开,首先是各层的功能、每层有哪些协议。
深入主要考察应用层和传输层:
应用层:
HTTP报文格式、头部有哪些字段
HTTP状态码
HTTP和HTTPS的区别
HTTPS中SSL/TLS加密的握手过程
HTTP一次连接的具体过程
GET、POST的区别
DNS解析过程
Cookie、Session原理
传输层:
TCP/IP四层模型(和OSI的层次对应关系)
TCP三次握手、四次握手的过程,状态变化和原因
TCP、UDP区别
TCP拥控、流控原理
Socket原理
操作系统、数据库
线程状态及其切换
线程、进程区别
(数据库重要程度相对低一些,正在整理中,后续会更新)
大家结合自己对Android的学习过程以及面试经验,在面试中遇到的问题是不是都是包含在上面的5个分类之中呢?对于1和5相信所有人都没有问题,但是对比2、3、4中的内容,大家是不是都能很好地Cover呢?换句话说,如果2、3、4中的内容大家都能很好地掌握,面试中的问题还能难倒我们吗?在前面的分析中提到,技术是觉得面试是否成功的关键因素,那么在面试前要做的就是把技术搞好,同时注意沟通和态度,这样的话通过面试岂不是很简单的事?
这里主要是指上面2、3和4这三个类别中的技术,说实话,这并不是一件很简单的事。
那么到底如何学习呢?
可以自己去网上找一些博客、书籍,进行各个知识点的突破,要有耐心,找到一个心仪的工作非一日之功。
首先要阅读源码,因为面试中的很多问题需要从源码中找答案。
其次要主动学习平时工作中遇不到的一些技术,由于项目的原因,我们不可能通过公司的项目来解除到Android中所有的重要技术,尤其是一些规模不大的项目来说,这个时候要主动去学习。也许有人要问:”我怎么知道哪些东西是需要主动学习的呢?“这的确是个问题,但是我在前面的分类中做了一些举例,大家可以先尝试学习下那些技术,它们都是很重要且时常在面试中出现的技术问题。
另外学习的过程中要注意积累,比如写博客、记笔记都是可以的,同时在Github上做开源也是不错的选择。
另外,为了更好更快地学习Android面试中所需的技术,大家可以先去阅读一下《Android开发艺术探索》,书中对前面的2、3和4类别中的技术细节做了详细深入的讲解,通过这本书可以达到立竿见影的效果。(而且这本书的内容也很适合面试)
下面我先提出几点重点,是面试官基本必问的问题,请一定要去了解!
系统化其实就是当你把一整个相关的知识都看过看懂之后,进行总结和建立各模块之间关系的过程。
每个人大脑“操作系统”是由概念和概念之间的联系的过程。系统化一方面可以加深知识的记忆,另一方面提供了另一个角度去理解这些概念,加大了概念的深入程度。
建议多做记录、总结,多在各模块、各学科之间建立联系,抽取统一适用的知识和智慧。
一点建议:
别老问寒冬不寒冬?你先问自己技术到位不到位?
面试一家公司之前,尽可能的准备充分,上面所有的这些总结都会反馈给猎头,而恰恰同一个猎头推荐的候选人会在同一个问题上翻车!所以,如果是猎头推荐,多问下其他面试者的反馈,相信猎头们不会吝啬的。
简历上的除非真精通,不然不要写精通,你写个了解熟悉,然后深入谈下去发现你好像特别熟悉,好感度会提高很多。
简历上不会的千万不要写,除非你觉得你今天人品爆表,面试官这个一定不会问!
简历上越熟悉越擅长的写在越前面。ok,面试官一般会从一个问题入手,衍生其他问题,越前面越有机会进入你自己熟悉的话题。(至少我是这样)!
带上自己得意的作品!带上自己吃饭的家伙,自己项目的代码,你已经赢了一半了。(至少我之前面试就这么干,你要看什么功能?你要实现什么?有什么问题?我当你面解决这个问题。什么?你觉得我说得不对?来来来,咱们直接看源码,主动权在自己手里!)
该有的礼貌要有,该低调还是要低调。这个是对极少数人的建议,你技术再好,一副老子天下第一的样子,那不好意思,请另谋高就。
做好有自己的积累,github,博客文章,不仅仅能提升自己的写作能力,积累经验,也是面试过程中别人了解你的绝佳途径。
最后平时学习不知道怎么建立体系的,可以参考下我下面提供的面试复习路线:
其实,对于学历普通也没有耀眼光环的人来说,进大厂就靠一条,那就是:技术实力。但是很多人在小厂待习惯了,总是用小厂的标准来衡量大厂的要求,屡次面试受挫,于是得出了一个结论:面试造飞机,入职拧螺丝钉。
接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用。
帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。
这里给大家提供一个方向,进行体系化的学习:
首先是超级详细得不能再详细的Android开发学习思维导图,因为图片实在是太大了,所以我就只把二级目录的内容放出来,更加详细的你们可以点击这里。
接下来就需要梳理知识,提升储备了!
1、看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
2、进行系统梳理知识,提升储备
客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
系统学习方向:
架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化
360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化
解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发
微信小程序:小程序介绍+UI开发+API操作+微信对接
Hybrid 开发与Flutter:Html5项目实战+Flutter进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
3、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
4、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
还有耗时一年多整理的一系列Android学习资源:Android源码解析、Android第三方库源码笔记、Android进阶架构师七大专题学习、历年BAT面试题解析包、Android大佬学习笔记
等等。
以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者点击 【这里】 查看获取方式。
大家都有了以上相同的教程,但是人和人之间的区别在于:别人有颗更强大的内心,可怕的是比你聪明的人比你还要更努力!!
当你下定决心,准备前行的时候,剩下的只有坚持了。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。