前言

我毕业于某二线城市一所双非一本学校,现已毕业三年,做了三年安卓开发,从滴滴小实习生到现在阿里P6,虽然比我优秀的大有人在,但是这一路还是很感慨。

从实习说起

前面说了,我就读于一所双非本科院校,当时我自认为我在校期间学习努力,应当配得上大厂的offer,所以我的简历都往大厂投了。

但是简历都石沉大海,很狗血的是就当我要放弃的时候收到了vivo的面试和阿里的内推面试,只是最后都挂了,但是这反而给了我坚持的动力,继续往大厂投,然后收到了滴滴的面试并且成功拿到offer。

一共二面,得亏我学习努力,面试官问的大多是计算机网络、Java基础和一些Android基础,聊的很顺利,但我觉得有一些运气成分在吧,不过也还好我没放弃投简历。

跳槽阿里

我在滴滴待了2年,这2年里无论是工作经验还是技术能力上我都有很大提升,但也许是我的胜负欲作祟,我觉得晋升的速度太慢了,于是我开始准备跳槽。

我其实还是很迷茫,我没有信心以我这2年的经验去拿到更高的职级或者薪资,所以很长一段时间我都在找各种前辈寻求经验以及坚持学习,很感谢他们的帮助。

我做了哪些准备

  • 技术提升

  • 简历优化

  • 面试准备

技术提升

2年的工作经历除了第一年进步非常大之外,后面就趋于稳定了,接触到的技术很单一,但是跳槽还是要掌握得更多才有底气,我就按照安卓的整个技术体系对自己进行查漏补缺:

  • **架构师筑基必备技能:**深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO

  • **Android高级UI与FrameWork源码:**高级UI晋升+Framework内核解析+Android组件内核+数据持久化

  • **360°全方面性能调优:**设计思想与代码质量优化+程序性能优化+开发效率优化

  • **解读开源框架设计思想:**热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack

  • **NDK模块开发:**NDK基础知识体系+底层图片处理+音视频开发

  • **微信小程序:**小程序介绍+UI开发+API操作+微信对接

  • **Hybrid 开发与Flutter:**Html5项目实战+Flutter进阶

说是查漏补缺,但最后还是完整地学习了一遍。有些东西看着觉得自己会,但认真学一遍会发现自己就是个大漏斗,要啥没啥,最典型的就是基础方面。

所以如果你们也有提升的打算,最好还是能够系统学一遍。

简历优化

简历优化方面都是从前辈那里汲取到的经验:

  • 重点放在专业技能和项目经验;

  • 项目经验要突出自己做了什么、遇到了什么问题,提出了什么解决方案,最大程度体现自己的能力;

  • 简历内容就是面试官的考点,要做到诚实,否则问到自己不会的很尴尬,印象也不好;

  • 技术栈最好不要写精通,写了解就行,否则会被面试官追问,最后会怎么样懂的都懂。

面试准备

  • 练习表达能力,其实做到对自己的简历内容烂熟于心就行;

  • 了解安卓前沿技术,面试可能会被问到;

  • 刷面试题,Leecode是个好东西,我这里也整理了一部分:

一、 Java基础

1.1 静态内部类和非静态内部类的比较

  1. 静态内部类和非静态内部类的区别

  2. 扩展:内部类都有哪些?

  3. 局部内部类

  4. 匿名内部类

1.2 多态的理解与应用

  1. 多态概述

  2. 多态中成员的特点

  3. instanceof关键字

  4. 多态的转型

  5. 多态案例

1.3 java方法的多态性理解

  1. 什么是java的多态

  2. 运行时多态

  3. 代码理解

1.4 java中接口和继承的区别

1.5 线程池的好处,详解,单例(绝对好记)

  1. 线程池的好处

  2. 线程池的详解

  3. 线程池的单例

1.6 线程池的优点及其原理

  1. 使用线程池的好处

  2. Executor框架

  3. 线程池大小确定

1.7 线程池的优点(重点)

1.8 为什么不推荐通过Executors直接创建线程池

  1. 缓存队列 LinkedBlockingQueue 没有设置固定容量大小

  2. 最大线程数量是 Integer.MAX_VALUE

  3. 拒绝策略不能自定义(这个不是重点)

  4. 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯(这个不是重点)

1.9 不怕难之BlockingQueue及其实现

  1. 阻塞与非阻塞

  2. LinkedBlockingQueue 源码分析

  3. ArrayBlockingQueue源码分析

1.10 深入理解ReentrantLock与Condition

1.11 Java多线程:线程间通信之Lock

  1. synchronized的缺陷

  2. Lock类接口设计

  3. ReentrantLock可重入锁

  4. ReadWriteLock读写锁

  5. 公平锁

  6. Lock和synchronized的选择

1.12 Synchronized 关键字原理

  1. Synchronized 原理

  2. Synchronized 优化

  3. Synchronized 和 ReenTrantLock 的对比

  4. Synchronized 与 ThreadLocal 的对比

1.13 ReentrantLock原理

1.14 HashMap中的Hash冲突解决和扩容机制

  1. 关于HashMap

  2. 关于Hash算法和Hash冲突

  3. HashMap中的处理冲突

  4. HashMap中的扩容机制

1.14 Java并发

1.15 Java虚拟机

1.16 JVM常见面试题

  1. Java内存区域

  2. HotSpot虚拟机对象探秘

  3. 内存溢出异常

  4. 垃圾收集器

  5. 内存分配策略

  6. 虚拟机类加载机制

  7. JVM调优

  8. 类加载

  9. JVM内存模型

  10. Java中一个对象从创建到销毁的过程和JVM类加载过程

1.17 JVM内存结构

  1. JVM内存结构【方法区+虚拟机栈+本地方法栈+程序计数器+堆】

  2. Java中的对象一定在堆上分配吗?

1.18 类加载机制/双亲委托

  1. java类加载机制和类加载器以及双亲委派原则解析

二、 Android基础

2.1 Activity知识点(必问)

  1. Activity启动过程全解析

  2. 启动模式以及使用场景

  3. onSaveInstanceState以及onRestoreInstanceState使用

  4. onConfigurationChanged使用以及问题解决

2.2 Fragment知识点

  1. Fragment的通信问题, 新建Fragment为何不要在构造方法中传递参数

  2. 为什么官方推荐Fragment.setArguments(Bundle bundle)这种方式来传递参数,而不推荐通过构造方法直接来传递参数呢?

  3. Androidx 下 Fragment 懒加载的新实现

  4. Fragment全解析系列(一):那些年踩过的坑

  5. Google-Fragment概览

  6. Google-与其他Fragment通信

2.3 Service知识点

  1. Handler知识点(必问)

  2. Android主线程阻塞处理及优化

  3. 深入聊聊Android消息机制中的消息队列的设计

  4. 深入理解MessageQueue

  5. 你真的懂Handler.postDelayed()的原理吗?

  6. Handler.postDelayed()是如何精确延迟指定时间的

  7. Handler延迟消息执行机制,会阻塞吗?

2.4 Intent知识点

  1. Android跨进程传递大内存数据

2.5 数据存储

三、UI控件篇

3.1 屏幕适配

  1. Android屏幕适配和方案【整理】

  2. Android 目前稳定高效的UI适配方案

3.2 主要控件优化

  1. RecyclerView优化

3.3 事件分发与嵌套滚动

  1. 一篇文章让你轻松弄懂NestedScrollingParent & NestedScrollingChild

3.4 动态化页面构建方案

  1. Android | Tangram动态页面之路(二)介绍

  2. Android动态界面开发框架Tangram使用完整教程

四、网络通信篇

4.1 网络协议

  1. 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)

五、架构设计篇

5.1 MVP架构设计

  1. 高级MVP架构封装演变全过程

  2. Android---我所理解的MVP模式

5.2 组件化架构

  1. Android为什么要用组件化?

六、性能优化篇

6.1 启动优化

  1. Activity启动流程

  2. Android性能优化--启动优化

6.2 内存优化

  1. Android性能优化:这是一份全面&详细的内存优化指南

  2. Android性能优化:手把手带你全面了解 内存泄露 & 解决方案

  3. Android内存优化(使用SparseArray和ArrayMap代替HashMap)

6.3 绘制优化

  1. Android性能优化:那些不可忽略的绘制优化

6.4 安装包优化

  1. Android 安装包优化--减小安装包体积

七、源码流程篇

7.1 开源库源码分析

7.2 Glide源码分析

  1. Android面试题:Glide

7.3 day 20 面试题:Glide面试题

  1. Glide的优点

  2. 生命周期绑定原理

  3. 缓存原理

7.4 聊一聊关于Glide在面试中的那些事

  1. 来简单介绍下Glide的缓存

  2. 具体说一说Glide的三级缓存原理

  3. Glide加载一个一兆的图片(100 * 100),是否会压缩后再加载,放到一个300 * 300的view上会怎样,800*800呢,图片会很模糊,怎么处理?

  4. 简单说一下内存泄漏的场景,如果在一个页面中使用Glide加载了一张图片,图片正在获取中,如果突然关闭页面,这个页面会造成内存泄漏吗?

  5. 如何设计一个大图加载框架

7.5 面试官:简历上如果写Glide,请注意以下几点...

  1. 谈谈Glide

  2. 假如让你自己写个图片加载框架,你会考虑哪些问题?

7.6 Glide OOM问题解决方法汇总

7.7 LeakCanary源码分析

7.8 OkHttp源码分析

  1. OkHttp源码解析

  2. Okhttp面试简答

  3. okhttp面试题----拦截器interceptor

  4. Okhttp3 总结研究 (面试)

7.9 okhttp连接池复用机制

  1. 概述

  2. 连接池的使用

7.10 okhttp 流程和优化的实现

  1. 概述

  2. 异步流程的实现

  3. okhttp 中有哪些优化,优化是怎么实现的

  4. okhttp 中用到了哪些设计模式

7.11 一篇让你受用的okhttp分析

7.12 OkHttp面试之--OkHttp的整个异步请求流程

7.13 OkHttp面试之--HttpEngine中的sendRequest方法详解

7.14 OkHttp解析大总结

7.15 Okhttp任务队列工作原理

  1. 概述

  2. 线程池的复用和管理

7.16 Android高频面试专题 - 架构篇(二)okhttp面试必知必会

  1. HTTP报文结构

  2. HTTP发展历史

  3. okhttp有哪些优势

  4. okhttp使用

  5. 看过okhttp源码吗?简单介绍一下

  6. 同步请求详细源码解读

  7. 异步请求详细源码解读

  8. okhttp实现网络请求的方法

  9. okhttp实现带进度上传下载

  10. 为什么response.body().string() 只能调用一次

  11. okhttp运用的设计模式

7.17 Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成

  1. DNS 和 HTTPDNS

  2. OKHttp 接入 HTTPDNS

7.18 Retrofit源码分析

  1. Android:手把手带你深入读懂Retrofit 2.0源码

7.19 RxJava源码分析

  1. RxJava操作符之创建操作符(三)

  2. RxJava操作符之转换操作符(四)

  3. RxJava操作符之过滤操作符(五)

  4. RxJava操作符之组合操作符(六)

7.20 RxJava原理与源码分析

  1. RxJava的消息订阅和线程切换原理

7.21 RxJava如何进行线程切换的?

  1. RxJava 是如何实现线程切换的(上)

  2. RxJava 线程切换原理

  3. RxJava2线程切换原理分析

7.22 Rxjava内存泄漏防止方案——RxLifecycle,AutoDispose,RxLife框架

  1. Android 使用RxLifecycle解决RxJava内存泄漏

  2. 解决RxJava内存泄漏(前篇):RxLifecycle详解及原理分析

  3. RxLifecycle详细解析

  4. 使用Rxjava2导致的内存泄露问题

  5. Rxjava解除订阅②:AutoDispose

7.23 Tinker源码分析

7.24 ARouter源码分析

  1. ARouter原理剖析及手动实现

  2. ARouter组件化框架原理分析

  3. Android之ARouter使用和原理解析

  4. 手动实现一个路由框架EasyRouter

  5. Arouter核心思路和源码详解

  6. ARouter源码分析(四)—— 缓存与优化

  7. 我所理解的Android组件化之通信机制

  8. ARouter系列三:依赖注入暴露服务

  9. ARouter系列一:Activity跳转原理详解

7.25 Android框架层源码解析

  1. Java层源码解析

7.26 算法设计

  1. 时间复杂度

  2. 数据结构

  3. 浅谈单链表与双链表的区别

八、新技术篇

8.1 实战问题篇

  1. Android工程中方法数超过65536解决方法

九、面试篇

9.1 开源文档

9.2 面试文献

  1. Android 面试题积累 (高阶)

面试说白了是一个回答问题的过程,准备的越充分就越容易顺利通过面试。

总结

能够顺利的达到自己目标,就凭上面的内容远远不够,它们只是一些必须要掌握的东西,核心的东西还是自己的态度和方法。

1.要有编程思想

很多人都会在看到一个需求的时候,不知道该怎么做,这就是缺乏编程思想。平时可以针对项目中一些简单的功能去思考,如果让你来从头开发这个功能,你需要对数据库进行哪些操作,需要提供什么接口,需要什么类型的数据,数据需要进行哪些必要的验证,数据库的字段类型以及长度,久而久之就不会在面对需求的时候一头雾水了。

2.制定成长路线

我从很多前辈那里得到的最重要的经验就是每个人都应该有一条属于自己的进阶路线,否则你学完基本的知识以后,后续就不知道该学什么了,想要瞎猫碰上死耗子不知道要花多大的运气。

我个人的进阶路线就是上面提到的安卓体系,这个体系是针对阿里P7制定的,我现在P6还需要努力:

  • **架构师筑基必备技能:**深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO

  • **Android高级UI与FrameWork源码:**高级UI晋升+Framework内核解析+Android组件内核+数据持久化

  • **360°全方面性能调优:**设计思想与代码质量优化+程序性能优化+开发效率优化

  • **解读开源框架设计思想:**热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack

  • **NDK模块开发:**NDK基础知识体系+底层图片处理+音视频开发

  • **微信小程序:**小程序介绍+UI开发+API操作+微信对接

  • **Hybrid 开发与Flutter:**Html5项目实战+Flutter进阶

有了一条明确的进阶路线之后才能有方向有目标的去进行技术提升。

3.个人的态度和行动

光说不做假把式,像我是在大二的时候就想过要进大厂,所以在学校的时候就已经做了很多准备,很多人可能又会说当时年轻努力还有用,但是我想说只要你越早开始做你努力的结果就会越早到来。

相关视频推荐

Android(安卓)开发零基础从入门到精通

Android大厂精选高频面试题详细解析

2022FrameWork必问:WMS/AMS/Handler/Binder/事件分发机制/屏幕适配/插件化