去大厂是每一个菜鸡的心愿,奈何大学水了四年,校招无缘。笔者从18年下半年开始准备社招,过程复杂坎坷,从18.12到19.3,面了很多公司,天幸最后被头条收了。 如今对之前的整个历程做一个复盘,希望可以归纳出点收获,也能对各位有所帮助。(部分面试相隔既久,题目不全,还望见谅)
-
总纲
- 准备过程与学习路线
- Android常见考点和复习重难点
- 1-3年阶段的技术要求与准备策略
- 面试情况复盘
- 常见问题踩坑指南。
1. 准备过程与学习路线
去年年中,本人搜集了boss,拉钩上BAT TMD相关的JD要求,混迹于各种面经帖,对相关要求进行了简单归纳,在1-3年这个阶段,基础还是要夯实的,以前欠下的债该补的还是得补,绕不过去。整体来看,也是大家都能想到的几块知识。
- java基础
- 数据结构与算法。
- Android主体知识
- 常见框架源码了解。
- 网络基础。
- 学习方法的问题,平时也不断摸索了一些,事半功倍是不切实际的,做技术还是得踏下心来用做学问的态度,看书,写代码,看源码。别无他法。 现在网上很多视频资源,进阶类的也不少,但是我不喜欢看。视频的学习方式比较被动,进度是别人把控的,也会抑制自身的思考过程。短期感觉走了近路,但是很难达到预期效果。 一套视频看下来n个小时,不管吸收多少,n个小时是浪费进去了。但是看书可以很快跳前跳后,内容衔接,知识量也更充足。 作为程序员,学知识还是要硬刚,放弃捷径执念。
- 学习路线。像我这种学渣流,之前学校打的基础不够好,我建议第一步先从基础做起。
- 第一步,计算机网络+java基础+数据结构。 进行完本轮复习后,对后面学习网络框架,看第三方源码,系统源码路会顺利很多。我们平时觉得用不到的东西,在源码里会频繁出现。
- 第二步,Android主体+ 常见框架源码。
- 第三步,算法。 算法之所以放在第三步,原因在于就客户端社招而言很多公司不着重考察算法,如果时间紧张可以灵活把握。 另一方面最后复习算法,能最大程度上趁热打铁,练完即上阵。
-
推荐书目
-
计算机网络。《计算机网络原理》 正常强度复习一遍课本即可达到要求。
-
java基础。
- 《java编程原理》刷一遍即可,对一些java层面的东西会有豁然开朗的感觉。
- 《java并发编程艺术》并发相关的技术原理,面试考察不突出,但是对知识体系的形成很有帮助。
- 《深入理解JVM虚拟机》面试常客,垃圾回收算法,垃圾收集器要足
够熟练。 - 《Effective java》
-
数据结构 《数据结构与算法(java语言描述)》 着重了解java语言中的各种集合类型,以及常见的数据结构的概念。
-
Android主体知识
- 《Android内核剖析》 基于Android2.3版本,其特点在于剖析了framework层的主要流程,提纲挈领,利于建立整体的把握。
- 《深入理解Android内核》与上类同,但是不如内核剖析讲的系统。可以对照来看。
- 《Android开发艺术探索》 这本比较有名。就不多说了。书好在对知识点的把握和提炼的比较好。但是深度上不应作为我们的目标。
- 《Android插件化开发指南》包建强。 可以根据书中的插件化的具体场景加深对framework层原理的理解。
- 《Android源码设计模式》设计模式方面这一本就够了。如果对源码情景比较熟悉,可以速读。
-
算法知识
本人一开始是通过《数据结构与算法(java语言)描述》来学习的,但是一大堆算法推导公式看的头昏脑胀,感觉效率并不高,本人建议直接leetcode刷题,leetcode上有专门针对各大厂的算法题集锦,可以有针对性地分类型刷题。 基本上刷上二三十道,临场再发挥一下就足够应付大厂面试了,但是一定要坚持手写代码培养感觉。
-
2. Android常见考点和复习重难点
下面是本人觉得比较重要的,必须要专门突破的考察重点。建议不只要当作题目去准备,前期可以当作专题,去准备一整块的知识,越细越好。
- Handler原理, 对Handler,Message,Looper源码足够熟悉,ThreadLocal,Message缓存池的原理,线程间通信的底层实现,延伸到HandlerThread,IntentService等异步实现的比较。
- Binder原理, Binder的实现原理,不同IPC方式的比较。
- JVM虚拟机垃圾回收机制,不同的回收算法的使用场景,不同的垃圾回收器的特点。
- 类加载机制,双亲委派机制。
- Android性能优化,启动优化,view优化,内存优化,需要达到足够的深度。而不是简单了解,准备一些具体项目中的应用场景。
- MVC,MVP,MVVM架构各自的特点和在项目中的应用,最好延伸到Google官方的框架,并提前做一些预研。
- 几个场景的代码流程,复述出其过程和原理。
- activity的启动过程。两个Activity生命周期的切换,ActivityThread与AMS的通信过程,线程,进程,View的准备。Activity状态保存的时机和原理。 横竖屏切换的过程。
- 应用的编译打包过程。
- apk的安装过程,冷启动和热启动过程。
- java中new一个对象,其具体的流程细节。
- view的绘制过程。
- Android事件分发机制
- 自定义View
- 各种动画的实现原理。
- ListView 的源码实现和缓存机制。 RecyclerView的局部刷新和缓存机制。
- 四种线程池和四种引用,各自的原理和应用场景。
- 两种序列化方式及其原理。需要深入理解。
- 网络原理,Http和Https的区别,UDP和TCP的区别。三次握手和四次挥手。 断点续传。Http报文结构和状态码。
- LRU算法的具体应用。
- ArrayList,HashMap,LinkedList,ConcurrentHashMap, SparseArray,HashSet,TreeSet,以上集合需要达到熟练程度。其他的自行了解。
- 推送,进程保活。进程的优先级。
其他零碎的知识点不再列举,以上是面试常问的点,建议不要看成题目去准备,而应该以点带面,深入挖掘。
3. 毕业1-3年候选人的技术要求和准备策略。
之前在网上也搜过具体资料,相对而言,中小型公司1-3年的员工可能作为搬砖主力在用,而大厂更多在意的是这个阶段的候选人的技术潜力,更倾向于寻找高潜选手。 那么对于我们,努力的方向就是如何建立自己的高潜人设。
- 学历,学历不代表能力,但是是能力的证明。但是这个已无法改变。可以忽略。
- 技术博客,GitHub。 这方面的意识越早越好,技术博客既是自身知识的重塑输出,另一方面也是自己的牌面。当时如果目前写的不咋滴还是不建议拿出来。 其实不需要输出太高深的东西,只要总结的好,有自己的见解和加工。也能侧面反映出一个人的实力。
- 项目复杂度 这个方面可能会被忽视,很多人在公司写业务,但是真到用的时候发现公司项目乏善可陈,简单的有点拿不出手。 这方面要及早布局,简历上需要有个复杂度足够的拳头项目,能代表你的技术最高水平。可以是自研的,也可以是公司的,甚至可以是公司里别人的。只要你能百分百吸收为自己的东西。
- 技术广度, 高潜的另一个特点是好奇心和求知欲。具体表现出来就是一个人的技术广度,这需要平时的广泛涉猎,掌握程度达到了解-熟悉即可。
即知识面足够的情况下,有自己的拳头项目,在某一个方向达到一定深度即可。 - 基础 有些情况下,面试官会无意间考察你的基础功底,社招不会着意去检验,但是某些地方可以很简单判断出一个人的功底如何。平时一些东西还是要慢慢去啃,有害无益。
4. 面试情况复盘
刚开始会着意记录一些公司的面试题目和过程,但是后来没有坚持下来,有很多题目记不清了,只把一些想起来的补充出来。还有许多问题是基于项目来问的,没办法整理。另有一些公司的面试题都是重复的,所以只整理了一些有代表性的面试。
文末会给大家分享我整理的Android面试专题及答案(这些题我基本都刷了三遍以上,毕竟年前那波突然被裁心里是有点迷)
贝贝网
贝贝网 电面 + 技术一面 + 技术二面 + leader 一面 + leader 二面 + Hr 面
贝贝网面数比较多,晚上下班跑过去面的,一直面到晚上十点多,效率很高,面试官比较nice,但是感觉整体气氛上有点压抑。效率很高,薪资上也还可以。第二天就给了offer。但是为了等后面更好的机会,offer没有接。
具体面试题;
- 做一下自我介绍
- activity 启动时View的流程
- resume时activity 是否完成了渲染
- 介绍一个组件化架构
- arouter的实现原理
- 垃圾回收机制。一个变量不用了什么时候被回收。
- 双亲委托机制,如何打破双亲委托机制。
- 简述handler机制,为什么while循环不会造成oom。
- glide实现原理,有什么出彩的点
- 是否看过源码,如何学习
- hashmap的扩容因子是做什么的,每次扩容多少
- popwindow和dialog区别是什么
- https的握手过程
- 如何看待公司加班的。
- 链表成环的判断,手写一下伪代码。
- java虚拟机垃圾回收算法。为什么要进行分代回收。
有赞
有赞之前因为996搞得沸沸扬扬,但是本着学技术的态度,还是投了一下,年前投的,可能因为之前招聘已停,直到年后才开始约面。整体感觉还比较nice,面试官比较负责认真。同样晚上面,本来预计分两次面完,但是面完之后觉得时间还早就一次性搞定了。
电面 + 技术一面 + 主管二面 + HR面
- 类加载机制简述,
- 对象初始化过程
- webview的内存泄漏是否了解。
- Js与原生之间的交互有几种,有什么不同和优缺点。Js在之前版本的安全漏洞是否了解,如何避免,为什么会有这个漏洞。
- 如何判读链表成环,如何找到入环的点。
- 不同线程之间是如何进行同步的。
- 最熟悉哪个框架,简单讲一下你对okHttp理解。
- 双亲加载机制,有什么办法可以打破
- activity切换时,两个activity的生命周期变化,
- 项目的整体结构,组件间通信如何实现,Arouter原理
- 组件间通信除了Arouter还有什么其他实现方式,如何实现互相调用。
- 项目中组件间的依赖关系是如何演进的。
- gradle分渠道打包是否熟悉。
- HashMap原理,如何解决hash冲突,除了这种方式还有其他的方式吗。
- SparseArray与HashMap区别,他的优点是什么。
- LinkedList和ArrayList区别。各自的优缺点。迭代器实现筛选。
- 项目中用的是哪种序列化方式,为什么要用这一种,除了他们的原理不同,还有哪些考量。
今日头条
头条的面试比较偶然,本来准备试一下其他的几个大厂,但是今年裁员比较严重,大厂社招的title也比较高,1.5年的菜鸡基本没给啥机会。头条相对来讲还是比较喜欢年轻人的。 一个猎头朋友介绍的机会,没想到竟然意外约面并拿到了offer,如梦一般。
技术一面 + 二面 + 三面 + Hr面(题目排序不分先后,想到哪个写哪个)
- 说一下对MVC MVP MVVM的理解,以及MVVM的实现方式有哪些。
- Retrofit是否有过了解,是否了解其动态代理的实现。
- 项目中用的代理是如何实现的,只能在java层做代理吗。
- 目前Android中常见的应用双开,系统是如何实现的。
- 目前Android中常见的双系统,是如何实现的。 又没有了解过。
- Android中一屏展示两个应用,那实现这个效果,你觉得framework层需要做哪些修改。
- 假如让你设计Binder机制中两个进程的通信协议,你有什么思路吗。
- 如果让你用代码实现.9图的伸缩过程,你有什么思路。
- HashMap版本变化和原理。hashcode的实现方式,hash冲突如何解决,查询时如何查询的。
- java中常见的ArrayList是否线程安全,如何让它变的线程安全。系统提供的方法实现线程安全本质上是如何做到的。
- 简述Java的内存模型
- JVM内存回收时有没有办法监听,如何解救,解救过后finalize方法是否每次都会调用。
- 你在项目中做了哪些性能优化。
- 当时做这个框架时是基于哪些考虑。 有没有去做具体的技术选型和其他技术方案的参考。
- Application可以做Activity生命周期的回调,为什么还要通过反射去实现,如何考量的。
- 自定义view时draw()和onDraw()方法有什么区别。
- 是否了解onSavedInstanceState方法,灭屏时是否会触发。 OnRestoreInstanceState与其总是成对出现的吗,说一下你的理解。
- 讲一下Android的动画原理。
- rxjava是否了解,说一下你的理解,你在项目中用到的哪些比较多。floatMap和Map呢。线程切换的原理是否了解。
- ConcurrentHashMap的原理是什么。
- View的绘制流程。
- 你觉得上一面面试怎么样,有哪些没有答好
- 面试中的算法题,每面最后都要进行1-2个手写算法。
- 完全二叉树的遍历,每一行从左到右遍历的。变种,波浪形遍历,在原来的基础上修改最少的代码实现。
- 2.被旋转过的有序数组,给你一个数,返回在数组中的位置。
- 一副牌,用最快的速度将他们打乱顺序,要求随机。你能否想出尽可能多的策略。
- 一个无序数组,负数正数和0,寻找其中两个数,使之和的绝对值最小。
- 4.在一群人中两两互不认识,但是都认识明星,找出哪一个是明星。
5. 常见问题踩坑指南
- 关于为什么离职,最稳妥的方式是说为了技术发展。当然面大厂的话,不需要理由的,人人都想去大厂。 但是其他的理由能不扯还是尽量不扯。
- 跟HR谈薪不可太急。大厂走流程一般计较慢,有几家公司笔者因为心里没底,问的太频繁,被HR压价。只要拿到口头offer,一般不会出什么问题,一定要端着。
- 留好下家,虽然理论上拿到口头 offer,被放鸽子的概率比较低,但是对于HR的话是不可信的,一切以书面为准,对于备用offer,能拖则拖,不能拖先入职也可。笔者以为拖黄了,导致在等头条offer的时候等了很久,心力交瘁,没有退路。
- 功夫下在平时,技术人员的内功在面试时是装不出来的, 面试官会着重考察。知识点繁多,任何一点扩展开去都需要很多时间才能掌握。临时抱佛脚很难通过。
END
好了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个学习思路方向及大厂面试专题及答案,需要的参照下面的领取方式。从事互联网开发,毕竟最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的加群 Android IOC架构设计免费获取。
群内还有免费的高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。
网友评论