去大厂是每一个菜鸡的心愿,奈何大学水了四年,校招无缘。笔者从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. 面试情况复盘
刚开始会着意记录一些公司的面试题目和过程,但是后来没有坚持下来,有很多题目记不清了,只把一些想起来的补充出来。还有许多问题是基于项目来问的,没办法整理。另有一些公司的面试题都是重复的,所以只整理了一些有代表性的面试。
贝贝网
贝贝网 电面 + 技术一面 + 技术二面 + 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的时候等了很久,心力交瘁,没有退路。
- 功夫下在平时,技术人员的内功在面试时是装不出来的, 面试官会着重考察。知识点繁多,任何一点扩展开去都需要很多时间才能掌握。临时抱佛脚很难通过。
可关注本人公众号,稍后会同步一些个人学习总结和头条的技术实现。
qrcode_for_gh_7f36612218f0_258.jpg
网友评论