背景经历
当时我工作近4年,明显感觉到了瓶颈期。 具体来说,感觉自己做过一些技术设计、也有过一些产出,但是从技术深度上感觉不足,到后期时做事也没有明显挑战,完全适应了公司节奏,说句不好听的成了老油条,可以每天舒服的混日子(这也有好处,有时间准备面试)。这对于个人成长不利,长此以往可能面临大龄失业。所以我觉得需要痛下决心改变一下现状。我定的目标就是进大厂,因为我觉得小厂做到我目前的程度已经很难有很多的提升了。
先说说面试的问题
一面部分考题:
- 插件化。启动activity的hook方式。
- okhttp支持HTTP2?http2的功能有哪些?tcp方面拥塞控制?tsl的握手和具体的非对称加密算法。非对称名称
- handler的post(Runnable)如何实现的。callback,runnable,msg的执行优先级。阻塞是怎么实现的?为什么不会阻塞主线程?
- 求二叉树中两个节点之间的最大距离。
- 206含义,未修改资源是哪个,302含义,301含义
- 多进程通信问题。binder优势。aidl生成的java类细节。多进程遇到哪些问题?
- 动态代理传入的参数都有哪些?非接口的类能实现动态代理吗?ASM的原理
- Application和Activity在Context的继承树上有何区别?二者使用上有何不同?
- 任意一颗二叉树,求最大节点距离
二面部分考题:
- 设计一个日志系统。
- 内存泄露的分类。怎么查看内存泄露的问题
- touch事件源码问题。
- 组件化的问题。module和app之间的区别。moduler通信是如何实现的。
- native奔溃的日志采集,怎么处理?
- 注解实现一个提示功能:如果int的值大于了3需要提示。
三面部分考题:
- 介绍下flutter的启动流程
- 介绍下flutter与weex的区别
- 组件化介绍一下
- webview中与js通信的手段有哪些?
- 介绍下flutter_boost的原理
- 适配器和装饰模式各自特点和使用场景
- 视频编解码是怎么做的
- 三色球排序
聊聊我对面试的一些准备和心得
面试从哪些方面去准备呢? 例如,不太熟悉的技能要不要写在简历上、要复习哪些Android组件的知识、刷算法题目有没有用,可能在面试前你都会仔细考虑这些问题。 下面我就结合自身的经验和理解,帮你梳理一下关于简历、面试和算法方面需要准备的内容,分享一些我的心得体会。
简历篇
简历在面试过程会起到至关重要的作用,我们需要非常注意简历的撰写。
在面试的过程中,面试官通常会非常关注你简历中的工作经历、项目介绍、技能特长这三部分的内容,如果你面试的公司没有固定题目的话,那很多问题都会围绕你简历里这三部分内容去问。这里需要注意的一点是相关技能的书写,核心思想,想进大厂的简历,要突出自己的特色,写得要生动,能从简历看出你实力不俗。如果简历不过关,很大几率根本没有面试机会。
首先你要让面试官明确你面试的定级是什么。 很多时候一个职位对应了很多个职级,在投简历的时候,你的简历需要让面试官给你一个比较明确的定级,否则面试过程会比较被动,也会影响面试官对你的判断。
因此这部分的内容需要突出自己的特长,也要写一些现在公司相对关心的问题:
- 比如你对插件化、热修复、组件化、性能优化等很熟悉,就可以明确的写上,但如果不是很熟悉那么尽量不要去写。
- 如果你对Android某部分内容很熟悉就可以写得相对详细一些,比如你对Handler、Binder机制很熟悉,就可以写“熟悉Android常见机制,比如Handler、Binder机制等”。
- 而看到你很熟悉这部分内容,面试官可能在问问题时一层层深入,因此你肯定需要提前准备一下这部分内容如何讲解,基本可以从机制的优点、重点、难点三方面去说明。
面试篇
对于Android工程师来说,面试开始的时候都会问一些算法和Android、Java的基础知识。
针对Java的基础知识,我列一下 Java 基础部分要掌握的知识点
- Java序列化、注解,泛型与反射
- 虚拟机底层原理
- Android内存原理
- Java高级并发原理
- JDK高级动态代理
- Java IO操作
对于Android的面试题,大多都是跟系统原理有关的内容,但也有很多没有准确答案的问题,比如四大组件的原理这样的题目,需要你从一个宏观的角度去解释一下四大组件,或者你也可以拆分开一个个去讲解。
关于Android面试高频的问点,这些你是必须要理解清楚的!如果你在准备面试,之前我参考的这个**《Android快速面试指南》,需要可文末里免费领取呢
一些Android经常使用到的组件一定要理解清楚,比如:
- Handler.postDelay的机制
- 触摸事件机制
- 自定义View
- 如何计算View大小
- 容器控件如何对子控件进行布局
- 数据库基本操作
- Binder机制
- LMK机制
还有面试官也可能会问一些开源框架的原理,建议你也要多了解一些:
- 优秀的网络框架
- 图片加载框架
- 日志记录框架
- EventBus
- AAC框架的原理
还有性能优化,最近几年公司对性能优化关注很多, 有的人可能做过专门的性能优化或者自己开发过一些工具总结过一些方法论,这样比较好答一些。但是大部分人可能平时都在关注业务需求开发,性能优化的实战可能并不是很多。
面试的后面大多都会从项目入手,你需要在面试之前针对你的项目做详细的准备。比如面试官会:
- 让你介绍一下你的项目
- 你需要体现出这个项目的难点
- 你在项目中的贡献
- 项目的具体实现等
- 有可能还会问到一些具体的细节,所以建议是实事求是去讲,但一定要对自己的模块非常清晰。
除了技术面试以外,有时还有可能会考察一些软技能,比如面试官会考察你跨部门协作能力、沟通能力、时间管理、任务分配和职业规划等
关于如何复习
对于复习,首先要对自己做一次自我了解, 我是通过画脑图来进行这个过程的,我会整体默想一遍大概的知识体系,画成类似下图。回想每个知识点可能考到的内容,记录下自己模糊的地方,然后去看网上总结的面试题,再对每个题目都做一下回答。这是一个迭代过程。
在你预想的问题都可以回答上来的时候,就需要深入挖掘一下技术细节和深度了, 比如我工作中开发了一个PLT Hook工具,这个工具可能是我参考开源项目并封装修改过来的,但对其中的细节并没有很了解,这个时候你就要对这个开源项目所涉及的内容做一次系统学习了。
算法这一块的话, “临时抱佛脚”对于算法的学习和积累作用不是很大,因此需要我们在平时繁忙的工作中抽出一些时间来复习,你也可以去LeetCode、LintCode上刷刷题。另外,虽然大部分面试的算法题目都是LeetCode上的简单题目,但你同样也需要关注一些中等和困难难度的经典题目。
总结
没有涉及太多具体的面试题,更多侧重的如何准备面试, 而面试的准备其实是在我们平时工作过程中一点一滴积累的,复习只是作为一种在面试前巩固知识的手段。 复习的过程主要是我们对知识点的整理和总结,你可以想一下在面试的时候可能会遇到的问题,以及该如何去表达。
但是我想说,虽然“临时抱佛脚”的准备可能有时有用,但是在短时间内靠“突击”是很难理解到某个知识点更加深度层次的内容, 而且知识面的广度也是需要时间和经验去积累的。所以不管你是否需要面试,在平时工作过程中都需要多思考、多训练、多总结,在有需要的时候可以厚积薄发。