当你准备跳槽面试的时候,明明只是一份15K的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果就是两个字——凉凉!而在如今的市场,什么多线程、高并发、设计模式、程序性能优化、热修复、架构设计等等等等,都可说是Android高级开发求职的必备技能。
而最终的结果……当然是顺利的接到了字节跳动的Offer,定级为2-2资深研发人员。
老实说,我自己平常没事就会看一些面试题,所以我都是直接去面的。不过我还是要建议大家如果准备面试的话,需要做以下准备
背题: 看一看最近的面经文,了解现在公司都在面什么类型的题,准备一些常见题,开背吧!如果一些基础的都不会那问题就有点大了。
算法: 做一些算法题,leetcode 上面的一二三星就够了,前端算法很简单,基本都是初中数学的难度吧。
项目: 项目回顾,把你做的项目从技术架构到源码都要做到足够了解,至少面试的时候不要被面试官问住了。并且要体现出你在工作中的作用,体现出自驱性(大公司都很看重自驱性)
亮点: 准备亮点,回答问题的时候不用全部回答上来,但是在面试的过程中一定要有亮点(不然你就会得到反馈,面试官说你还行,但是没有过~) 我一般会准备几个点,每个点都保证可以睡上半小时。另外一定要了解得很深入,并且能够用自己的话流畅的表达出来!!(我准备的几点,性能优化、工程化、缓存、http)
内推: 最好找人内推,成功率会提高一些
练手: 先找几家不太想去的公司(规模差不多)练练手,如果第一次面试就去心仪的公司面试,淘汰率会非常高。
心态:心态很重要,面试不过很正常,不证明你不优秀,只是不适合,总结面试经验,为下一次做准备。
答题: 怎么把自己会的问题说好,这个很关键。
逻辑清晰: 一定要逻辑清晰,不然即使你知道这个问题的答案,面试官也不会满意,如果你逻辑清晰,即使这个答案不会,面试官也会给你加分。
独特理解: 现在的面试题大同小异,那么如何体现出你的优势就很重要。结合业务以及你自身的知识储备来讲。
深入思考: 对每个问题一定要有深入的思考,不然就很难进入大公司了,深度上要有一个拔高才能在面试中获得好的成绩。
流畅表达: 面试就是一个表达的过程,一些问题心里明白不行,还要流畅的表述出来,基本上如果面试官觉得你表达的很流畅,当你讲到一半就不会再让你说下去了,证明已经通过了。
刷题绝对是最重要的,于是问了我在阿里的同学要来了一全套他们公司P8整理的系列大厂面试题,刷到天昏地暗,如今既完美收官了,这些面试题还有自己之前收集整理的一份核心架构进阶知识点。存在网盘也没太大的用处,所以在这里免费分享出来给有需要的朋友,可私信我口令【面试】
面我的面试官是做 iOS 的,就没问我 Android 的。
1、ipv6 答不上来
2、http 状态码
3、http 请求
4、https 请求过程
5、传送大图到服务器,进度功能实现: 这里扯了很多,一开始我理解成断点续传了,后面就是给的方案是 http 每次传一部分,根据状态码是否成功来处理,后面面试官觉得这个答案不行,让我从 TCP UDP Socket 这些角度去想,我说这些实现起来就更简单了,比如TCP就双向通信之类的。。
6、gc
7、数据库索引,b tree b+ tree
8、设计模式
9、进程间通信,我说了几个,面试官说可以说 Android 的,好得!
10、算法: 字符串匹配,返回对应 index, 我用的 HashMap 实现。
大多数都是问的网络,网络不是我擅长的领域,有些别的想不起了。。。
不止是题目,面试官会深入进去怼的,别问我怼啥,被怼的忘光了都!
面试官人很好,还强调了他低头是写面试评价。
面试官依旧很 OK,可惜网络状态不佳。
面试官:我看上一面问了你网络层面比较多的问题,那我接着问了
我:。。。好。
先自我介绍
1、Http1.1 和 Http 1.0 区别
2、keepalive 作用
3、keepalive 底层实现,这块我是不清楚的,我就猜测了下给了他一个答案。
4、操作系统怎么在堆上和栈上分配内存,我不太清楚,就说了 Java 虚拟机是咋分配的,结果问了我 Java 虚拟机是咋在操作系统上分配的,对不起我不知道!(后面强调了 c 的 api,我还是母鸡啊!)
5、操作系统进程和线程
6、虚拟内存
7、虚拟内存的缓存,我不清楚,依旧给了个猜测
8、手写单例,写了双重检索的,后面问我有别的吗,我说了静态内部类实现的,问我为啥静态内部类安全。
9、Android Framework,我问是 AMS 那些的吗,面试官说那太复杂了,你说下 handler , loop吧,然后问了一些相关的问题。(感动啊)
10、广播和本地广播的区别,实现原理
11、你用 map 写个 lru 吧,我说能用 LinkedHashMap 吗,不能, 后面我说了个思路,面试官觉得不行,然后说了 LruCache 怎么实现的, LinkedHashMap 怎么实现的,我说 LinkedHashMap 是用了 HashMap,在里面维护了一个双向链表,每次访问数据的时候修改链表。后面我就打算仿写一个 LinkedHashMap 来实现,多亏面试官即使打断,这个太费时间了,就不用写了。
12、手写生产者消费者,这里面试官一边看代码一边提问题,我跟着问题修改代码,其实就是把一个比较low 的生产者消费者优化成了面试官想要的样子(面试官在这里终于笑了)。
13、问问题环节
Q:我想了解下相关的业务
A:这个职位是最后统一定的,我不能告诉你
Q: 问评价
A: 还是不能告诉你。
over
同样大致问题是这些,其他的也想不起来了,这块网络操作系统混合双打。
面试官人很棒,会诱导你慢慢回答,而且考虑很周到。
1.三轮面试体验
2.期望工作城市
3.期望薪资(懵了,之前没怎么了解过,说了个数hr都觉得太低无语了)
4.还有哪些offer哪些在流程中
5.觉得字节跳动吸引你的地方
6.反问:问了下福利和字节跳动未来的发展策略
7.感觉hr对自家公司认同感很高,最后和我说了十分钟公司的发展、福利相关的,后面还微信发给我公司的整体介绍,感觉我整个人都已经是字节跳动的形状了
面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
而这些也全被整理浓缩到了一份pdf——《Android核心架构进阶知识点整理》,全部都是精华中的精华,本着共赢的心态,好东西自然也是要分享的。
需要相关知识点可以查看我的【GitHub】,对于已经掌握的可以忽略以节省时间。