前言
当你准备跳槽面试的时候,明明只是一份15K的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果就是两个字——凉凉!而在如今的市场,什么多线程、高并发、设计模式、程序性能优化、热修复、架构设计等等等等,都可说是Android高级开发求职的必备技能。
而最终的结果……当然是顺利的接到了字节跳动的Offer,定级为2-2资深研发人员。
面试前的准备
老实说,我自己平常没事就会看一些面试题,所以我都是直接去面的。不过我还是要建议大家如果准备面试的话,需要做以下准备
背题: 看一看最近的面经文,了解现在公司都在面什么类型的题,准备一些常见题,开背吧!如果一些基础的都不会那问题就有点大了。
算法: 做一些算法题,leetcode 上面的一二三星就够了,前端算法很简单,基本都是初中数学的难度吧。
项目: 项目回顾,把你做的项目从技术架构到源码都要做到足够了解,至少面试的时候不要被面试官问住了。并且要体现出你在工作中的作用,体现出自驱性(大公司都很看重自驱性)
亮点: 准备亮点,回答问题的时候不用全部回答上来,但是在面试的过程中一定要有亮点(不然你就会得到反馈,面试官说你还行,但是没有过~) 我一般会准备几个点,每个点都保证可以睡上半小时。另外一定要了解得很深入,并且能够用自己的话流畅的表达出来!!(我准备的几点,性能优化、工程化、缓存、http)
内推: 最好找人内推,成功率会提高一些
练手: 先找几家不太想去的公司(规模差不多)练练手,如果第一次面试就去心仪的公司面试,淘汰率会非常高。
心态:心态很重要,面试不过很正常,不证明你不优秀,只是不适合,总结面试经验,为下一次做准备。
答题: 怎么把自己会的问题说好,这个很关键。
逻辑清晰: 一定要逻辑清晰,不然即使你知道这个问题的答案,面试官也不会满意,如果你逻辑清晰,即使这个答案不会,面试官也会给你加分。
独特理解: 现在的面试题大同小异,那么如何体现出你的优势就很重要。结合业务以及你自身的知识储备来讲。
深入思考: 对每个问题一定要有深入的思考,不然就很难进入大公司了,深度上要有一个拔高才能在面试中获得好的成绩。
流畅表达: 面试就是一个表达的过程,一些问题心里明白不行,还要流畅的表述出来,基本上如果面试官觉得你表达的很流畅,当你讲到一半就不会再让你说下去了,证明已经通过了。
刷题绝对是最重要的,于是问了我在阿里的同学要来了一全套他们公司P8整理的系列大厂面试题,刷到天昏地暗,如今既完美收官了,这些面试题还有自己之前收集整理的一份核心架构进阶知识点。存在网盘也没太大的用处,所以在这里免费分享出来给有需要的朋友,可私信我口令【面试】
字节跳动4面(3面技术+1面HR)面试经历
一面
面我的面试官是做 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
同样大致问题是这些,其他的也想不起来了,这块网络操作系统混合双打。
面试官人很棒,会诱导你慢慢回答,而且考虑很周到。
三面
- 自我介绍,介绍了自己实习写的刷新加载的组件
- 问我自己组件里怎么解决的嵌套滑动冲突,三个方面实现完美分发事件
- 说 retrofit 动态这块
- retrofit 动态里面如果传的不是 interface 怎么办,这块我不清楚,我就直接说不太清楚,然后说了 retrofit 关于注解的处理
- 注解生命周期,编译时注解解析
- 你用过 weex,说下weex实现原理,我说我没有看过 weex 源码,但是我实现过一个动态页面渲染框架,说了下我的渲染过程和实现方案。
- 最近想学的技术,说了音视频,但是因为准备春招放下了
- 为什么想学,说了自己之前做一个 APP,里面播放器无法使用没认证的 Https 请求,打算自定义一个播放器,在底层处理证书这块,然后在说了下不知道这样的方案可不可行。
- 使用 https 请求这个不难的, 我说因为我这个是自己签的,就没法认证。
- 那你 okhttp 里面怎么认证的, 说了拦截器
- 还有个 ConcurrentHashMap 同步方案, 然后问了 CAS
- 环状链表
- TCP握手挥手
hr面
1.三轮面试体验
2.期望工作城市
3.期望薪资(懵了,之前没怎么了解过,说了个数hr都觉得太低无语了)
4.还有哪些offer哪些在流程中
5.觉得字节跳动吸引你的地方
6.反问:问了下福利和字节跳动未来的发展策略
7.感觉hr对自家公司认同感很高,最后和我说了十分钟公司的发展、福利相关的,后面还微信发给我公司的整体介绍,感觉我整个人都已经是字节跳动的形状了
最后:分享一波,Android核心架构进阶知识点
面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
《架构师筑基必备技能》
《Android框架体系架构》
《设计思想解读开源框架》
内容颇多,篇幅却有限,这就不在过多的介绍了,大家可根据以上截图自行脑补,不过这份《Android核心架构进阶知识点整理pdf》以及前面P8整理的全套系列大厂面试题皆可免费分享给有需要的你,每位认可的朋友注意啦:free download方式——点赞+私信口令【面试】
而这些也全被整理浓缩到了一份pdf——《Android核心架构进阶知识点整理》,全部都是精华中的精华,本着共赢的心态,好东西自然也是要分享的。
字节跳动2-2Offer
白嫖地址我的GitHub
由于限制网盘链接,需要白嫖这系列学习笔记,查看我的主页简介扫描二维码我免费 分享给你
-
自行下载直达领取链接:【https://links.jianshu.com/go?to=https%3A%2F%2Fjq.qq.com%2F%3F_wv%3D1027%26k%3DBRZhpPkt】
以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,【点这里可以看到全部内容】。