面挂了字节跳动、秋招客户端开发岗面经,生而为猿,-我很抱歉!
字节跳动面试总体难度略高于阿里、华为,绝大多数都是在考察技术,对于技术方面的问题问了很多。而阿里偏向于综合素质考察,华为偏向于个人潜力考察。
一面
1. Java的堆和栈区别
2. Java的GC垃圾回收机制
3. 什么是多态
4. 进程和线程的区别
5. 你在项目中做过哪些性能优化
6. 如何优化页面卡顿
6. Handler消息机制
7. Android自定义View
8. 你最常用的开源框架及其原理
9. MVC模式与MVP模式
10. HTTP和HTTPS的区别
11. TCP的三次握手是什么
12. 你用到过的加密算法
二面
1. HTTP常见的请求方式及主要操作
1. Java函数传入值和引用的区别
2. Java中String += “123”
的实现过程
3. String、StringBuffer、StringBuilder的区别
4. Java多线程编程
5. LinearLayout与RelativeLayout对比
2. 使用Fragment和View的对比
3. 你所读过的开源框架及其原理
4. 使用Service的业务场景介绍
2. Service和IntentService的区别
3. 编程实现二叉树深度优先遍历、广度优先遍历
小结
字节跳动的秋招挂在了三面,具体过程不表(十分心痛)。
总得来说面试暴露出个人对于Java的基本概念掌握不够透彻,对于一些Android开发中的可选项没有做深层次的理解(例如:Fragment和View分别应用在什么场景)。
关于本文
最近太多的同学面挂了,现在正好金九银十秋招,迫切希望笔者写一篇关于Android面试的文章,好吧,今天终于兑现承诺了,这篇文章为你们而写。
首先,你们要明白,关于面试每个公司都不一样,甚至同一家公司不同的面试官也不一样,没有一个统一的技巧或者面试流程教你们,但是对于面试是有一些通用的原则的,这些年我大小也面试过有上百人,所以姑且以一个面试官的角度来告诉你们应聘者哪些比较重要!
1. 简历
这里所说的面试应该是通过简历筛选了,并且邀请来公司面谈的环节,关于怎么写简历这里就不再提了,不知道的可以看我之前写过的这篇文章「你真的会写简历么?」。
2. 履历不要造假
这里首先强调大家一点,就是大部分靠谱点的公司都会有背景调查环节,比如你之前的教育经历,工作经历,薪资水平,离职原因等等这些千万不要造假,一旦发现有造假的,肯定不会被录取。而且如 BAT 这类大公司,甚至可能会被拉黑,永久进入黑名单。
所以简历填的各种信息请一定保证真实,当然我见过有不少毕业一年的同学为了提高自己的工作经验,写成2年,因为把实习经验也算上,关于这点可能不算造假,但是严格来说也有嫌疑,有些企业可能会在乎,有些不会在乎,这个因人而异,如果觉得自己能力确实很强,但是担心自己因为工作经验不够被刷掉,不妨是一种手段,但是这里不建议这样做。
3. 基本素质
大部分企业招人都需要面试这个环节,那是因为只有面对面的交谈,才能看出一个人的基本素质。所以在交谈的过程中基本素质这个是默认的指标。这包括哪些呢?着装言谈,态度积极乐观,对待技术要谦逊,不要太浮夸。这点其实大部分人都没问题,但是我见到过有些对前公司特别抱怨,但是自己又没有在前公司付诸过行动去尝试改变。也见过对技术特别自信的,对没有接触过的技术或者知识很蔑视,就给你回复个这技术花点时间学习下不就ok了么?那么这个世界上有什么是花时间学习不了的东西么?还见过来面试的,但是对我们的产品不了解或者对整个公司都不了解的,这样的人,就属于基本素质不过关,不够职业。
4. 基础
根据招聘岗位的不同这个方面有所差别,一般是针对 Android 中级以下的人会问一些基础,对于高级 Android 工程师岗位不会问,而直接聊项目,聊产品。这方面的基础包括 Java 和 Android 的基础,比如 ArrayList 和 LinkedList 的区别,Java 的一些线程用法,Java 的 GC 原理等等,这部分基础网上一大堆关于 Java 的基础面试题,自行搜索就好,但是大多只考Java SE,涉及到 Java EE 方面的知识毕竟跟 Android 开发没多大关系,可以忽略。
然后就是 Android 基础,如四大组件的具体用法,如 Activity、Fragment 的生命周期与四种启动模式,Android 动画,View 的绘制流程,Sqlite 相关,图片加载机制、网络调用等,关于 Android 方面的基础面试题网上也一大堆,这里就不详细罗列了。
5. 深入知识点
如果你面试的是初级岗位,那么基础知识是肯定要问的,如果你要找的是实习岗位,那么基本上只要基础够扎实就差不多了。但是大部分公司都不只问基础知识的,会配合问一些深入点的问题考察下你技术的深度,知道你大概的水平高度。
而深入点的知识对于 Java 如注解原理、反射原理、Java 并发等,最重要的是基本上都会问到设计模式,这个几乎是必问, Effective Java 被认为是进阶必备的书籍,如果把这本书看完了那么对于一些面试问的设计模式也基本不是问题。
对于 Android 深入的点会问一些自定义组件、性能优化,屏幕适配,IPC、Binder的理解,插件化,常用开源库以及原理等等。
需要注意的是,深入的知识点不可能你每个问题都能答对,因为面试官也没奢望问的你都会,如果你是应聘的初级岗位,那么我起码知道你的技术深度到哪里,因为技术同岗位的职位也会选择最优的,如果对于中高级岗位,那么这些深入的知识点就要求高点,起码的70%、80%的知识点都知道或者熟悉吧。
6. 项目经验
俗话说「术业有专攻」,对于我们来说,虽然都是做的 Android 开发,但是不同的方向,意味着每个人擅长的技术领域也不一样。包括我也一样,我很多领域也没接触过,如果我只问你我擅长的领域那显然是不公平的,所以大部分面试官都会结合你的项目经验去聊。其实大部分一些固定的知识点都能答出来,区别就在于聊项目经验这块,这块可能占整个面试过程的70%以上。
而大部分聊的比较深入点的知识都是围绕你的项目经验来问,至于这个项目是不是你亲自做的,一聊就知道,所以如果这个项目是你伪造的,或者是你糊弄过去的,那么面试官一聊就会立马露馅,因为大部分面试官会针对你项目的点去一步步深入下去,以一个对话来举个例子:
我先开始:
「这个项目你主要负责哪部分?」
「图片加载是我主要负责的」
「图片加载是你自己写的么?」
「不是,用的第三方开源项目」
「用的什么?」
「Universal Image Loader」
「恩,那说说你为什么要用它?」
「人家封装的好,使用起来方便」
「那你看过他的源码么?知不知道原理?」
「源码...看过一点」(其实我只是随便一问,但是这里支支吾吾基本就判断他撒谎)
「那说下他的缓存机制?」
「二级缓存嘛,硬盘缓存和内存缓存」
「恩,那硬盘缓存跟内存缓存他们的具体算法是怎样实现的?」
「这个...这个没怎么看,知道有个LRUCache」
「那你看过他什么源码?」
「其实这个项目很早之前看的了,有点忘记了,现在项目都用 Picasso 了」
「那好,那 Picasso 跟 UIL 有什么区别?为什么要换UIL?」
「UIL项目作者不维护了,所以准备换到Picasso...」
「为什么选择Picasso?」
「听别人都说他好,就用了,还有最近 Facebook 还出了个 Fresco ,好像比 Picasso 要好」
「Fresco 跟 Picasso 比好在哪里?原理有什么不同?」
「这个还没时间研究...」
「那最近在研究什么?」
「最近在研究 Retrofit 」
「有在项目中使用么?」
「恩,用起来很方便,比 OkHttp 方便多了」
「Retrofit 跟 OkHttp 的关系是什么?原理上有什么不同?」
「他们都是 Square 公司开源的,在 Retrofit 上可以使用 OkHttp,不过 Retrofit 是基于注解的」
「Retrofit的注解是编译前还是编译后?」
「...」
「看过 Retrofit 的源码么?」
「哦,没有...」(这下聪明了,如果他说看过那我还会接着问下去的,说没有那接下来换个话题)
以上的对话是还原了很多面试的真实场景,其中就是想告诉大家两点:
1. 我会结合你的项目经验来问你问题,而不是凭空的就问你没做过或者没接触过的领域,如果是你真实脚踏实地做过的项目,不出意外都能答出来;
2. 不会或者不擅长的领域不要提,因为大部分面试官会抓住你提到的领域继续深入下去,会就是会,不会就直接说不会,不要企图蒙混过关,这只会减少你的印象分,另外回答的时候如果想要更多的延伸下来体现自己的技术水平,尽量多往你擅长的方向延伸,比如你不懂Freso,那就尽量别主动提,除非面试官主动问你。
总之,项目经验这块是大头,如果你是项目的主程,甚至一个人单枪匹马做的这个项目,那么项目中遇到的问题,解决方法以及技术选型,代码出现的问题等你都会很有印象,这些在面试的过程中都会被问到的,如果是真实的项目经历,这部分完全不是问题。
7. 其他
当然除了根据你的项目经验之外,大部分面试官都会问一些你可能从没基础过的领域,比如问你一些 Service保活、JNI 甚至还会问你一些跟 Android 无关的后端技术,这些你回答不出来不影响大局,毕竟总会有你没接触的领域,这些问题面试官主要是想看下你技术的广度,看下你知识面的广度,答出来了会锦上添花,给你加分,但是答不上,并不会给你减分。
除以上之外,还有代码质量与重构、版本控制Git、是否参与产品、自己未来的规划等可能都会涉及,但是这些都不是硬性条件,综合起来,之前这篇文章有介绍 ,面试时企业最看中你什么能力?,企业最关心的三种能力无外乎「学习能力」、「解决问题的能力」、「团队协作能力」,基础知识体现了你基本的学习能力过不过关,项目经验体现了你解决问题的能力,这个项目如果不是你单枪匹马的话,那么这中间的过程以及版本控制Git的使用等也会体现你的团队协作能力。
8. 总结
面试中不可能完全把一个人的各方面能力都展现出来,企业和面试官也没有那么慧眼,一眼就认准了你,而且面试本身也是企业跟应聘者互选的过程,不要单方面的当做出售自己一样,你需要做的就是注意细节,打牢基础,脚踏实地的做项目,然后在面试中真实的表达自己就足够了!
本文在开源项目:https://github.com/Android-Alvin/Android-LearningNotes 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...