字节跳动面试官一招差点KO我,一共面试了3轮(5年经验),艰难拿下2-2职级offer!

前言

我从大学毕业开始做Android开发,现在已经五年时间了,现在在山东老家济南做Android开发。这三年里面,也只是一心在做Android开发,其他语言接触的并不多,了解点JS之类的。现在感觉Android开始不像以前那样好做了,也可能是现在年纪慢慢大了,要考虑的事情变多了的缘故吧。

不知道以后应该何去何从,总是感觉做Android或者说做程序员一直处在一种不稳定之中,在一些中小公司里面,可能工作一年两年就因为各种各样的原因而离职。马上就要结婚了,该买房了。济南的房价一直在涨,而自己的收入还是这么不温不火的,加上这不稳定的工作,让人对于前途实在是乐观不起来。

再加上今年的大环境非常差,互联网企业裁员的现象比往年更严重了,可今年刚好是我的第一个“五年计划”截止的时间点,说什么也不能够耽搁了,所以早早准备的跳槽也在疫情好转之后开始进行了。但是,不得不说,这次字节的面试真的太难为我了,可以说是和面试官大战了3个回合,不过好在最后给了offer。

我个人情况是5年Android开发经验,字节跳动定级2-2(年薪是50-100w左右含加班费和股票折现,不含车餐房补)的样子,我是拿到了年薪60w+,13薪。下面是我的面试经历,与学习经验分享,希望能带来一些不一样的启发和帮助。

我与字节跳动面试官“大战”3回合,胜!

我的学习经验

1—4年大学

  • Java

无论什么级别的Android从业者,Java作为Android开发基础语言。不管是工作还是面试中,Java都是必考题。如果不懂Java的话,薪酬会非常吃亏(美团尤为重视Java基础)

详细介绍了Java泛型、注解、并发编程、数据传输与序列化、高效IO、容器集合、反射与类加载以及JVM重点知识线程、内存模型、JVM运行时内存、垃圾回收与算法、Java中四种引用类型、GC 分代收集算法 VS 分区收集算法、GC 垃圾收集器、JAVA IO/NIO 、JVM 类加载机制的各大知识点。


  • 筑基必备

Android架构师筑基包括哪些内容呢:
1.深入 Java 泛型.
2.解深入浅出
3.并发编程
4.数据传输与序列化
5.Java 虚拟机原理
6.反射与类加载
7.高效 IO
8.Kotlin项目实战

大学1-4年 架构师筑基必备

  • 学习笔记整理
    架构师筑基必备 目录

    架构师筑基必备第一章

自己工作1-3年,3-5年规划

我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人。 这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本上的内容迈向真正的企业级开发。我们知道如何团队协作、如何使用项目管理工具、项目版本如何控制、我们写的代码如何测试如何在线上运行等等,积累了一定的开发经验,也对代码有了一定深入的认识,是一个比较纯粹的Coder的阶段。

工作1-3年需要哪些知识呢?
◆ AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的区别;
◆ Binder:从Java层大概理解Binder的工作原理,懂Parcel对象的使用;
◆ 多进程:熟练掌握多进程的运行机制,懂Messenger、Socket等;
◆ 事件分发:弹性滑动、滑动冲突等;
◆ 玩转View:View的绘制原理、各种自定义View;
◆ 动画系列:熟悉View动画和属性动画的不同点,懂属性动画的工作原理;
◆ 懂性能优化、熟悉mat等工具
◆ 懂点常见的设计模式

这个阶段须掌握图中“Android核心高级技术”;还要多阅读Android源码,阅读官方文档并尝试写技术文章,需要有一定技术深度和自我思考。在这个阶段的学习过程中,有2个点是比较困扰大家的,一个是阅读源码,另一个是自定义View以及滑动冲突。

如何阅读源码呢?阅读源码的时候不要深入代码细节不可自拔,要关注代码的流程并尽量挖掘出对应用层开发有用的结论。另外仔细阅读源码中对一个类或者方法的注释,在看不懂源码时,源码中的注释可以帮你更好地了解源码中的工作原理,这个过程虽然艰苦,但是别无他法,然而这个过程的收获也是其他学习方式不可替补的。

◆ PS:我这里也是整理了一份源码笔记,有需要的可以在我的【GitHub】里查看!

工作3-5年规划

五年又是区分程序员的第二个门槛。 有些人在三年里,除了完成工作,在空余时间基本不会研究别的东西, 热衷于研究各种技术实现细节、看了N多好书、写一些博客、在Github上分享技术。
这些人在五年后必然具备在技术上独当一面的能力并且清楚自己未来的发展方向,从一个Coder逐步走向系统分析师或是架构师,成为项目组中不可或缺的人物。

◆ 继续加深理解“稍微深入的知识点“中所定义的内容

◆ 了解系统核心机制:

  1. 了解SystemServer的启动过程

  2. 了解主线程的消息循环模型

  3. 了解AMS和PMS的工作原理

  4. 能够回答问题”一个应用存在多少个Window?“

  5. 了解四大组件的大概工作流程

◆ 基本知识点的细节:

  1. Activity的启动模式以及异常情况下不同Activity的表现

  2. Service的onBind和onReBind的关联

  3. onServiceDisconnected(ComponentName className)和binderDied()的区别

  4. AsyncTask在不同版本上的表现细节

  5. 线程池的细节和参数配置

◆ 熟悉设计模式(常用设计模式)架构意识。

工作3-5年规划

学习笔记内容
热修复设计、插件化框架设计、组件化框架设计、图片加载框架、网络访问框架设计、RXJava响应式编程框架设计


字节跳动面试经历

第一轮:

  • 起手式:自我介绍
  • 介绍下简历上的项目
  • 线程池的使用,线程池如何实现的,线程池的原理
  • Thread 的join 函数的作用
  • java 线程间通信的方法有哪些
  • Android handler 机制,源代码
  • juc atomicInteger 类为什么能保持线程安全,普通的变量为什么不能保证线程安全
  • java 内存模型(问了我有没有阅读过JSR 133的官方文档?并没有,很惭愧,感觉学的路子有点野)
  • java 内存分区
  • concurrentHashMap 的原理
  • 100以内,10万以内,10万到无穷个数,三种情况排序,选择排序算法
  • 你有什么要问我的?(问了一些技术相关的问题)

第二轮:

  • 愿意不愿意来杭州
  • 自我介绍
  • java的gc(gc工作原理,gc回收机制,gc内存分配)
  • http和https区别
  • http报文结构
  • http 报文头部含有什么
  • 你最拿手的项目是什么(回答了和同学做的开源项目,并且介绍了如何做的)
  • 手写代码:跳台阶问题
  • 你有什么问题要问我吗?

第三轮:

  • 你对字节面试官的印象如何?你从面试官上学到了哪些东西
  • 你每天的生活安排是什么样子的?
  • 你为什么选择来阿里?
  • 字节的开源框架用了哪些呢?说说weex?
  • 你以后的技术规划是什么样的?
  • 你最有成就的项目是哪个?
  • 为什么选择android开发?
  • 为什么选择nodejs开发作为第二条技术路线?
  • 你有什么要问我的吗?(问了面试官入职培训)

如果你过五关斩六将,成功地通过了所有的技术面,那么恭喜你,你离升职加薪、出任CEO、迎娶白富美、走向人生巅峰又进了一步。但是还没有到谈薪资待遇的时候,最后还有一个考验:HR面试。基本所有的大公司都有这一轮的面试,不要小看HR面试,很多公司的HR对于面试者都有一票否决权的----即使前面的面试对你的评价再高。

所以,这轮的面试也必须重视起来,HR面试主要问的是几点:

  • 简历中写的过去工作经历的离职原因
  • 当前公司薪资待遇
  • 期望能到怎样的一家公司
  • 个人未来的发展方向

我专门提一下第2点。可能有人比较排斥也不想说这个,我个人倒是持开放状态,问了就说了,当然一些的夸大还是必要的,当前公司薪资待遇多报个一千块钱完全没问题(毕竟是一家互联网公司总多多少少有些补贴啊什么的嘛)。

因为这和你在新公司能拿到的薪水关系不大,新公司能拿到的薪水的决定因素是整个公司的薪资情况以及根据你的面试情况在公司的定位,都是有固定的薪资范围的。HR问这个主要也就是心里有个数并且看你是否诚信----有些公司入职时会要求你提供最近一家单位的银行流水号。

HR面试就说到这里了,总结起来其实就是四个字:滴水不漏。整个面试过程态度积极向上,不要有任何悲观消极的态度(尤其在谈到以前公司情况的时候,即使有再多的不满),就不会有问题。

整理的面试题合集,有需要的可以点击【面试】查看获取!

推荐阅读更多精彩内容