5月20日,字节跳动创始人张一鸣发布内部全员信,宣布卸任CEO一职。字节跳动联合创始人梁汝波将接任成为新CEO。

对于张一鸣的卸任原因,网友们纷纷猜测。有人根据全员信猜测,是不是去年okr完成得不好被优化了?

也有程序员担忧字节的offer还能不能接?

这个程序员在忧虑这offer能不能接,而我面试字节却惨遭扑街.....简直不要太难受!

面试扑街经历

一面问的 Java 和 Android 基础

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

二面问的 Flutter 和 Dart

  • dart是值传递还是引用传递
  • Widget和element和RenderObject之间的关系
  • widget的root节点
  • mixin extends implement之间的关系(除了extends其他的没怎么用过。。)
  • jvm内存模型(感觉这个是面试官可怜我,看我什么都不会才问的=。=)
  • Future和microtask执行顺序
  • dart中..的用法(基本没用过。。)
  • await for(没用过。。)

说实话,第一个、第三个、第六个我准备的话应该能答出来的,但是一个多月没碰Flutter了,忘了都差不多。。。

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

三面问的Android扩展技术

  • 描述下事件拦截机制
  • hanlder 机制
  • ui卡顿 卡顿的原因 如何监控
  • 热修复的原理是什么
  • 聊聊组件化
  • ndk 有没有写过(肯定没写过啊)
  • sharedperfence原理 commit apply之间的差别 如果写入失败了会怎么样
  • 如何做包体积优化,如果让你做dex包体积优化你会怎么做
  • apt 和gradle transform的差别是什么

apt生成的是java的class,而且不能更改原始的类,而transform这个东西你可以为所欲为,但是毕竟操作的是字节码,风险系数更高,面试官还特地问了我下是不是有classnotfound问题,其实貌似真的发生过,但是想想感觉有些丢人没敢承认,毕竟有点一知半解。

  • .class .java .dex之间的区别是什么

吐了,虚拟机什么的我面试的时候都给忘了。哎,太难了。.java是给开发看的,.class是给机器看的,而.dex是给安卓虚拟机看的。当然这边更多是想问安卓虚拟机相关的,反正答的稀烂

  • okhttp 的拦截器机制 如果让你监控网络请求的耗时你会怎么写

把责任链说了,写了关键字得分了,面试官也没继续往下问,其实还是可以聊聊dispatcher什么的,okhttp的源代码说实话有点深。

  • kotlin 协程和java的线程有什么区别
  • 启动优化是如何做的

我个人拙见哦,启动的东西要么延迟,要换缓存。时间轴总长其实比较难以优化,我们参考的是阿里的starup的任务图模式。

  • 如何只拉起推送进程而不拉起app的进程

死亡题目,完全不知道答案。

  • TraceView 和 Systrace直接的区别

哈哈哈,之前看过,然后忘了,这种东西一阵子不用吧就真的会忘掉。

面试总结:

对于这次的面试我的看法就是真的好难啊。要准备基础还要刷算法题,不仅问Android,还要问jvm虚拟机,顺便问问并发,还要会kotlin,最好还能来个flutter,给各位跪了。

下面是我在这次面试之后做出的一些反思以及对之后面试的一个学习复习方法:

技术储备不够面试被怼

为什么有些程序员就算是开发很多年了,去面试依旧会被怼呢?

大部分原因都来自于:技术储备不够

太多程序员在平时都是做着crud的工作,有些技术都是等到工作上要用到了才去学习,就是因为大家平时用到什么去学习什么,以至于面试的时候面试官问点延伸性或者他需要的人才技术就回答不上了。

简单来说就是:只有当下公司的业务能力,没有解决技术的能力,缺少技术创新的能力。

以至于最后只敢找跟之前公司差不多性质的,缩短了自己的职业规划,工作越找越不满意。

平时应该如何进行技术储备、高效复习呢?

那些底层知识都很枯燥,每次学完就忘,一合上书就忘得差不多了,不知道要怎样学才好了。

其实造成这样的现象最主要的原因是没有掌握系统的学习方法,也没有系统的资料辅助理解和学习。

知识点就是那些,基本上,翻来覆去就是那些换汤不换药的问法。但是现在大家上班要写业务代码,下班又是家庭琐碎,要想自己静下心来好好学习根本不可能,仅仅只是有用信息的筛选就足够麻烦。

1、去学习「自己知道自己不会」的知识

其实在开发过程中,总有一些自己想学但是因为项目压力或者其他原因,然后自己打算放在以后 再学的东西,也就是所谓「自己知道自己不会」的知识。

例如:

  • 比较常用的一些框架,比如客户端的网络请求、图片加载框架

  • 常用的一些类和集合的源码,比如 ArrayList、LinkedList、HashMap(面试必问)

  • 觉得自己无法清晰表达出来的概念,如「内存泄露」、「Java 并发」

这个阶段是一个对自己当前知识体系查漏补缺的一个阶段,你要做的,就是把自己不会的东西完 整的列出来,然后逐个击破。

2、全方位的学习,构建自己的「知识体系」

其实很多人在平时学习技术和日常开发过程中,学了非常多的东西,但很少有人会去系统地复习,从而构建自己的知识体系,导致自己学到的很多知识点没办法更好的产生联系,而且可能会 导致学了某个知识点没过多久就忘了。

那如何构建我们的「知识体系」呢?

Android 里面所谓的「知识体系」,我认为主要包含这几个部分:

  • Java 和 Anroid 基础
  • 计算机网络
  • 操作系统
  • 设计模式
  • 数据结构和算法

也就是说我们需要将这几个部分逐步击破,慢慢完善我们的知识体系,这个阶段是最花时间和精力的,但是坚持下来会让我们的基础变得更加扎实,而且能最大限度的构建我们的知识体系。

3、学习「自己不知道自己不会」的知识

这时候面试题的作用就出来了,「面向面试题编程」其实是一个查漏补缺、增强自己编程基础的非常好的方式。

在做面试题的时候,你会遇到很多奇奇怪怪的问题,很多都是你「之前没有接触过」或者「有接触过却没有往那方面想」的问题。

刚开始遇到这些面试题确实很让人很不舒服,但是这些面试题也确实能够最大限度地提升我们对知识之间联系的理解以及引发我们对一些具体使用场景的思考。

当然更重要的是我们可以通过刷往年各大互联网公司的面试题,让我们对于公司面试题有一个大致的认识而且也能提前了解到面试官面试时候的一些套路和做法。

遇到不懂的面试题直接回答不懂,但最好能将面试官的思路往我们会的东西带。

在面试的时候,切勿不懂装懂

我们面试的是技术岗位,有几斤几两,面试官问几个问题就知道 了,如果面试官问到的某个知识点,你只是有点印象或者没多少了解的话,直接回答这个知识不是很熟就行了。不然被面试官针对这个知识点追加几个问题的话,分分钟打你脸。

当然,在说对这个知识不是很熟之后,可以试着将面试官的面试思路往我们会的东西带,例如我 在阿里二面的时候,面试官问我有没有用过 B 树,因为我对 B 树不是很熟,所以我当时是这么讲 的:“对于 B 树不是很熟悉,但之前在看 HashMap 源码的时候,有研究过红黑树,对红黑树比较熟。” 然后成功地将面试官的问题转向了我熟悉的红黑树和 HashMap 的源码上面。

总结

想要拿到满意的 offer,「坚持」是最重要的,抛开了努力和坚持,其他的一切方法论都毫无用处。

任何一个行业都是不容易的,唯有持续的「有效」努力,才能走得更远。 以上便是我对于面试的一些经验和体会,希望能对大家有所帮助。

最后很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,下面的学习路线帮你解决问题!

知己知彼才能突破难关,所以这里分享我整理的这份10+家大厂面试真题送给大家:

  • Android学习路线图

首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式,总之希望能够帮到你们!

  • 模块化学习资源

接下来是每个模块我整理出来的文档学习资料,帮助大家更细致化的学习。

《Android汇总复习资料—Java》

《Android汇总复习资料—Android》

《Android汇总复习资料—Android扩展》

《Android汇总复习资料—Kotlin》

《Android汇总复习资料—Flutter》

《Android汇总复习资料—算法》

除了上面的学习路线,还可以额外的配合以下方式学习,效果翻倍~

Android进阶学习

①看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。

②读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

③面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

④2020大厂面试高频知识点

  • 图片
  • 网络和安全机制
  • 数据库
  • 插件化、模块化、组件化、热修复、增量更新、Gradle
  • 架构设计和设计模式
  • 性能优化
  • Android Framework
  • Android优秀三方库源码

以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者点击 【这里】 查看获取方式。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐