美文网首页Android开发Android开发经验谈Android技术知识
面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术

面试字节两轮后被完虐,一份字节跳动面试官给你的Android技术

作者: Android_until | 来源:发表于2020-10-13 16:17 被阅读0次

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

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

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

    字节跳动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。。

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

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

    面试前

    如何寻找一个面试机会?

    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 面试题”,找几个多的开始看。

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

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

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

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

    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技术

        本文链接:https://www.haomeiwen.com/subject/shpvpktx.html