面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!

面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!_第1张图片

大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助。

最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了…

所以啊,不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流~

字节跳动Android实习面试凉凉经

一面问的 Java 和 Android 基础

1、Jvm虚拟机
2、messageQueue会不会阻塞ui线程
3、对象锁和类锁
4、之字形打印树
5、还有其他的记不清了,主要是我对二面印象太深刻了。

二面问的 Flutter 和 Dart

1、dart是值传递还是引用传递
2、Widget和element和RenderObject之间的关系
3、widget的root节点
4、mixin extends implement之间的关系(除了extends其他的没怎么用过。。)
5、jvm内存模型(感觉这个是面试官可怜我,看我什么都不会才问的=。=)
6、Future和microtask执行顺序
7、dart中..的用法(基本没用过。。)
8、await for(没用过。。)
说实话,第一个、第三个、第六个我准备的话应该能答出来的,但是一个多月没碰Flutter了,忘了都差不多。。。

此外GitHub和博客维护好很重要,像我这种demo随手写,随手删的人直接GG。。

面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!_第2张图片

面试字节跳动需要做哪些准备?

接下来将分:面试前、面试中、面试后 三个部分,解答一些常见的问题。

面试前

如何寻找一个面试机会?

  1. 内推:首先推荐大家走内推途径,内推的简历通过率远高于其他方式;内推的途径有:联系工作的师兄师姐、在论坛上找对应的内推贴、参加校招宣讲会 等
  2. 对应公司招聘官网直接投递:需要大家明确自己想投哪些公司,直接搜索公司的官方招聘官网(大公司普遍都有),找到自己想投的岗位投递
  3. 相关招聘网站投递:在各类招聘网站上HR也会发布对应招聘信息,可以对应的投递

需要为面试做哪些准备?

  1. 一份优秀的简历:要能说明 学校、学历、实习经历、在校期间技术项目经历 等,具体的在姊妹篇《校招啦——来自字节跳动面试官的技术简历指南》,敬请期待。
  2. 了解投递的岗位要求:就是我们常说的JD(Job Description),公司的招聘官网或发布的招聘信息里面会详细描述,如果找不到或公司没写,可以联系HR发邮件说明。
  3. 复习面试岗位相关知识:校招同学需要复习 计算机基础(网络、操作系统、计算机组成原理、数学等)、编码能力(数据结构、算法) 、技术方向基础知识(如前端同学主要看html/css/js)
  4. 整理自己做过的项目:包括实习项目、个人项目、科研学术项目、参与社区开源项目等,在面试时需要做自我介绍,面试官也可能会根据你的简历询问项目内容。
  5. 适当的做一些算法题:前端、测试等一些岗位可能不是特别重视算法,但做一些算法题能训练你的思维、代码能力;常用的刷题网站:LeetCoode、牛客网、各大高校OJ等

面试中

如何自我介绍?

技术面试自我介绍时请focus在技术方向上,有些同学会准备一段华丽的开场白,介绍自己大学期间的学生会、组织活动等经验,这些内容对于技术面试没有太多吸引力,不利于面试官找到对应你的合适问题,有时候反而会在面试官心目中减分(感觉不够专注技术)。 建议是:

  1. 有技术实习经历的同学,重点介绍实习中做过的项目,说明自己在项目中的角色、负责研发了那些部分、使用了什么技术栈、学习到了什么。
  2. 没有实习经历的同学,可以介绍自己在目标岗位的技术方向上学习了哪些内容、有做过什么个人项目 或者一些Demo项目。
  3. ACM等计算机竞赛获奖经历的要说明,加分项。
  4. 参与开源项目或社区建设的,建议说明,加分项。
  5. 学术大牛同学也可以说明自己发表论文、参与会议情况,也是加分项。如果学术方向和工作内容没有太多关系,建议不要滔滔不绝的详细介绍,如果学术方向刚好和岗位match 或 面试官有兴趣,面试官一般会主动继续聊下去。

没有实习经历可以吗?

答案是——可以的。 有技术实习经历当然好事,但是对于校招/实习同学来说,不一定人人都有实习经验,或者实习经验可能与当前岗位不match。所以不用过分担心,一般能过简历参与面试的同学,都是得到了初步的认可的。没有相关实习经验的同学,面试时可以突出自己在其他方面的优势(如:个人项目、开源项目、竞赛、学术,参考上个问题),面试官如果认可你的知识储备、能力、潜力就会通过。

没有 相关实习经历 和 没有相关知识能力 是两回事,有实习经历缺没有积累知识能力的同学,可能最终评价会不如 通过自己学习探索具备相关知识的同学。所以请一定要做好面试前的准备,让自己符合面试岗位的要求,比如投递前端岗位的同学,至少要学习html/css/js相关基础知识,对当前常用前端技术栈有一定的了解,并且有动手实践的经历。

需要对业务了解吗?

校招/实习 来说,并不强求对业务的了解,一般来说在校同学也很难对业务有深入的理解,有相关经验了解当然是加分项。

面试整体流程

通常来说,一次完整的面试包括:笔试、技术面试、岗位match、HR面试。

笔试:可能是线上笔试 或 当场笔试,校招笔试题目范围较宽,会涉及计算机基础知识、面试方向的知识技能、代码coding、数据结构 & 算法 等。

技术面试:以字节跳动为例,校招一般是2-3轮交叉技术面试,实习一般是1-2轮,考察 计算机基础、编码能力 、技术方向基础知识以及技术深度、系统设计能力、抽象能力和工程化能力、软素质 等。一面更偏向基础知识、技术广度,二三面偏向技术深度、进阶能力。

岗位match:一般是通过技术面试后,由业务部门负责人面试,偏向软素质、专业能力、个人发展与规划等。

HR面试:通常是最后一轮面试,主要聊一下职业规划、个人诉求、面试过程中的一些问题、入职相关信息(如可入职时间、实习时间、工作地点等)

遇到不会的问题如何处理?

首先要明确——谁都会有不会的问题。即便是工作多年的社招同学也会有知识盲区,有部分不会的问题并不会影响你的整个面试评价。所以,千万不要不懂装懂,这样反而会留下负面印象。 确实不会的问题请直接和面试官说明,可以让面试官给一些提示,或者征询面试官意见看能否现场查阅相关资料(一定要在面试官许可下查询,否则容易被算作作弊)。如果在提示或查询资料后,解决了原本不会的问题,也是加分项——说明学习能力、应变能力、抗压能力不错。

面试时可以问面试官什么问题?

在一轮面试结束后,面试官可能会说:“你有什么问题想问的吗?” —— 注意,这个可能也是一道面试题,面试官想通过你的问题,了解到你的职业诉求、个人规划、学习能力等,所以要慎重的选择自己的问题。 技术面试环节不建议问一些与当前面试无关、涉及公司机密、个人隐私的问题,如:加班多少/工资待遇(这个在HR面试环节可问)、公司当前收益情况、业务线具体使用的核心技术、面试官联系方式等 可以问一些与自己相关的技术方向问题,如:如果通过面试需要学习哪些内容做准备、面试官对你本轮的评价和建议(如果面试官不方便说,也不要追问)、面试过程中某个困惑问题的解决方法(时间限制面试官可能只能给出思路)等。

面试后

长时间没有得到回应如何处理?

面试后请注意查收自己的邮箱、保持电话畅通,如果长时间(3-5天)没有得到回应,建议和HR联系。校招的同学通常比较畏惧与HR交流,担心本身“薛定谔的猫”状态的结果在自己联系HR后就变得负向了,这个心理一定要克服,及时的确认面试结果才有利于安排之后的面试/offer选择。 如果真的得到了不好的结果,也可尝试问一下HR面试评价中自己的问题,不一定能得到答复,但如果HR能告诉你也利于你及时发现、解决自己的不足,为下一次面试打基础。

面试没有通过可以再次投递吗?

有的公司有面试不通过锁简历机制(一段时间内投递无效),这个也可以和HR问清楚。 我司(字节跳动)是不锁简历的,某一岗位面试不通过任然可以继续投递。但是建议大家每次投递都认真准备,你的每一次投递、面试都可能被记录,如果多次面试、投递没有体现出成长,也还是会影响后续的简历筛选与面试。

面试后可以在分享面试题吗?

可以自己记录面试相关题目、经验,为自己未来的面试做准备资料,但不建议立即分享(包括分享再网络上和分享给其他同学),有些公司笔试、面试时时会签署协议的,如果发现分享最新面试、笔试题目,可能会直接取消录用资格。

面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!_第3张图片

面试字节跳动需要储备哪些知识?

很多人准备面试的时候,大多数就会这样的,打开百度,输入 “Android 面试题”,找几个多的开始看。

这虽然看起来很自然,但是并不是一种 健康的方式,面试题的作用应当是查缺补漏,上学的时候也不是直接发习题册然后对着答案学习吧?

知乎上有个问题,叫做 如何高效学习,里面有一个回答我觉得很符合我自己的观点,就是 建立起自己的知识体系,建立知识体系的目的在于:

  • 巩固记忆。
  • 认识自己,找到自己的优势及不足。
  • 把握复习的进度。
  • 经验总结。

目前我自己的总结的会分为以下几个大点:

Java 基础知识

  • 面向对象的基本思想
  • Object类相关:Object类的几个关键函数、String涉及到的常量池概念,序列化 & 反序列化。
  • 重要关键字:finalstatic
  • 内部类:内部类的分类、应用场景、内部类编译成class后是怎么样的。
  • 抽象类 & 接口:区别、应用场景。
  • 编码:编码的目的、分类。
  • 异常:异常体系、自定义异常。
  • 注解:注解的基本概念、分类、编译时注解 & 运行时注解。
  • 容器:重要容器的内部实现、容器间的对比。
  • 内存模型。
  • 垃圾回收。
  • 类加载的过程。
  • 泛型:分类、通配符 & 上下边界、泛型擦除。
  • 反射:使用。

Android 基础知识

  • DalvikArt虚拟机
  • Activity:生命周期、launchMode
  • Fragment:生命周期、懒加载、两种Adapter之间的区别。
  • BroadcastReceiver:基本概念、广播分类、权限。
  • Service:生命周期、onStartCommand的返回值、startServicebindService的区别、相同进程 & 不同进程的交互、IntentService实现原理。
  • 重要的工具类 & 源码实现:AsyncTaskHandlerThreadHandlerIntentServiceLruCacheLinkedHashMapSparseArray
  • RecyclerView:缓存原理、和ListView的对比、Adapter如何适配多种layout
  • 存储:数据库升级 & 优化、ContentProviderSharePreference
  • SDK版本升级的兼容问题。
  • Android的权限管理机制。

图片

  • Bitmap相关:Bitmap的大小计算、质量、inJustDecodeBoundsinBitmap
  • 几种图片格式的对比、压缩。
  • 大图加载:BitmapRegionDecoder

算法

  • 别无捷径,刷题,但是刷题的时候,要按照题的类型去总结。

开源框架

  • RxJava:操作符的应用场景、重点操作符的内部实现、和RxJava的对比。
  • Glide:流程、缓存相关的实现。
  • Retrofit:流程、动态代理 & 注解解析。
  • OkHttp:流程、队列实现、缓存实现。

性能

  • 性能优化技巧:启动速度优化、布局优化、内存优化、电量优化、APK大小优化、列表滑动优化。
  • 性能优化工具:TraceViewSystrace、调试GPU过度绘制 & GPU呈现模式分析、Hierarchy ViewerMATMemory Monitor & Heap Viewer & Allocation TrackerLeakCanaryLint
  • ANR
    • ANR原因
    • ANR产生过程源码分析
    • 信息收集过程
    • trace文件分析
    • 分析基本流程
    • 具体示例
    • 如何避免产生ANR
  • 性能实践:解决过的性能问题,从 遇到问题、分析问题、解决问题、结果 四个点进行阐述。

View

  • 绘制流程:measurelayoutdraw三个关键流程。
  • 事件分发:事件分发的原理、处理过的滑动冲突问题。
  • 自定义ViewCanvas & Path,实现过的比较复杂的自定义View

架构

  • MVPMVP的思想 & 优劣势、在项目中的应用、

源码

  • AMS
  • WMS
  • Binder
  • 应用启动流程
  • APK相关知识点
    • APK构成:resources.arsc组成、AndroidManifest.xmlaapt作用及原理
    • APK打包过程
    • APK安装过程
    • APK签名 & 校验原理
    • dexopt原理

网络

  • 基础知识:看一下对于 <<计算机网络>> ,重点是网络分层模型、TCP/UDPHTTP/HTTPS

设计模式

按照23种网络模型、三个分类进行总结,每种设计模式包含以下三个方面,至少要准备常用的几个:

  • 基本概念:UML图、简单例子、应用场景、优势 & 劣势。
  • Android源码中的实现
  • 项目中的应用

多线程

  • 看并发编程的艺术,这本书的目录就是多线程最好的知识体系。
  • 遇到过的多线程问题、怎么解决的。

Gradle

  • 常用配置。
  • 多渠道打包。

插件化

  • 插件化的核心思想。
  • 几种插件化框架实现的原理。

组件化

  • 组件化的优势。
  • Arouter:使用方式、实现原理。

Kotlin

  • 有用到的可以看看。

多媒体

  • 音频、视频播放。

大前端

  • ReactNativeFlutter:没学过的可以了解一下思想。

JNI

  • 调用实现方式。

最后,面试前该准备哪些资源复习?

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一下我面试期间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

《Android开发七大模块核心知识笔记》

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,以上资源均免费分享,以上内容均放在了开源项目:github 中已收录,大家可以自行获取(或者关注主页扫描加微信获取)。

你可能感兴趣的:(面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术面试指南,请查收!)