前言
不知不觉2020年已经快要过去了,然而受到疫情影响,之前的公司四月份都没有正式复工,于是只能被迫走上了重新找工作的道路
开篇
在完全没有准备的情况下面了几家公司,由于好几个月没有工作了,基本上以前做过的技术细节都记得不是很清楚了,以至于面试的情况非常不理想。由此,这段时间心情一直起起伏伏,甚至产生了对自己技术能力的怀疑,以及担心自己到底能否找到一份工作了。
从事Android开发也三年有余了,然而在投简历过程中也是遇到了很多问题,比如简历上的经历跟公司需的不匹配;比如自身的技术面过窄,觉得自己学了很多,但是过于理论化而没有落实到实践当中;再比对之前做过的项目细节把握的不好,也没有去深究,都导致了面试当中出现的一系列问题。
然而生活还是要继续,工作也要继续找下去。虽然自己也面临也写生活上的压力,但是这也不是停滞不前的理由和借口。写这个博客的目的也很明确,帮助自己梳理相关的技术,直面自己内心的恐惧,以更好的准备面试,找到一份满意的工作。
准备
1. 简历
在投简历的过程中,跟HR交流有时直接说“经验不匹配”。自我感觉还是简历写的有问题,这种情况下,简历盲投感觉已经不合适了,还是要有针对性的对简历进行定制化,先过简历关。
2. 技术点
既然毫无准备的裸面行不通,那就开始查漏补缺,准备相关的知识点吧。
作为一个三年多的Android研发,自认为还是积累了一定的技术实力和能力的,只是没有系统,深入的整理过自己的项目技术点。
3. 拓展
针对面试中问的一些问题,没有思路去回答的,面试结束后可以针对这些问题去拓展和深挖,避免下次面试再出现相同的情况。
思考
这次的面试目标是「Android高工」,那么要思考的是,这个「高」,究竟高在哪里?我们以一个什么样的工作经验,技术水平,思想深度,才能达到这个高度,这个是要思考的,在面试和准备过程中我也不断的反思和总结。
面试经历
后来复习了三个月左右。7月底开始边投简历边进行复习扫尾、巩固,大大小小的公司投出了大概三四十份简历。收到面试大概20场。下面我挑了几个较好的和一些大厂的真题面经分享一下。
小建议: 面试某家公司前,最好是要先了解你所面试的工作岗位,公司的业务,主要是做哪个方面的,这样可以更加具有针对性的复习和准备。
华润集团下某借贷子公司
一家借贷公司,肯定对APP安全方面比较着重。
- Activity 的启动过程
- Broadcast 注册方式与区别
- 磁盘缓存怎么实现
- 进程间通信原理、Binder 机制原理
- APK加固、dex文件加密实现、原理
- 说一下类加载的过程、机制,为什么要这样设计?
- 谈谈你对安卓签名的理解。
- 对于提高app的安全性,你有哪些建议或方法?
腾讯新闻
大概就是UI、页面流畅度、适配这些方面吧。
- 如何将一个Activity设置成窗口的样式。
- Android中跨进程通讯的几种方式
- 屏幕适配的处理技巧都有哪些?
- ListView卡顿原因及处理
- 广播传输的数据是否有限制,是多少,为什么要限制?
- 如何防止过度绘制
- View的回执流程
- 说说对Context的理解
- 卡顿的一整套解决方案是怎么做的?
某知名外卖APP
布局、页面、高级UI之类的
- View的绘制过程,onMeasure方法中两个参数的含义;
- 你在做布局优化的过程中用到了哪些工具?
- 做完布局优化有哪些成果产出?
- 看过哪些源码
- 混合开发有没有做过
- 大致说一下自己做过最满意的项目吧
字节跳动抖音部
音视频、算法
- 静态注册和动态注册的原理分别说一下吧
- JNI是如何访问java中的方法和字段的?
- JNI规范中定义了哪些引用,区别是什么
- 算法:获取单链表倒数第k个元素
- 单例实现线程的同步的要求?
- LaunchMode应用场景
- 计算一个view的嵌套层级
算法:
某上市公司(母婴类产品)
- 请介绍下ContentProvider是如何实现数据共享的。
- android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。
- 算法:复制含有随机指针节点的链表
- Android系统中GC什么情况下会出现内存泄露呢?
- 三次握手四次挥手说一下吧
- HashMap 、HashTable原理?
- Java 虚拟机&内存结构&GC&类加载&四种引用&动态代理
- 进程保活怎么做
合资外企
- LeakCanary 原理
- OOM 场景及规避
- App 安装过程的怎样的
- ANR是什么?怎样避免和解决ANR
- MVC MVP MVVM原理和区别
- 算法:2000万个整数,找出第五十大的数字?
- App 是如何沙箱化,为什么要这么做?
- flutter用过吗?
- Flutter 如何与 Android iOS 通信?
志安科技
类似于华为海思,对底层很看重。
- HashMap 原理
- andorid的Binder机制是怎么样的
- Linux的原理有了解吗
- 有看过哪些源码,有深入到C 中吗,C 熟练吗?
- 熟悉framework哪些模块的源码,对图像性能优化有了解吗
- 以后的技术发展方向是如何的
阿里巴巴P6岗
- HTTP2.0与3.0的区别
- 项目中常用的设计模式
- https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?
- 了解过Android虚拟机有哪些?
- 对Dalvik、ART虚拟机有什么了解?
- Gradle自动补丁包生成原理
- Hybrid 通信原理是什么,有做研究吗?
- 来介绍下你最成熟的一个项目是哪个?
- 能简单的画一下你这个项目的架构图吗?
- 除了MVP,MVC,MVVM外还有什么其他的架构方式?
- 动态编译和反射相比,除了性能方面外还有什么区别?
- 死锁如何避免、处理?
- Flutter中的Widget、State、Context 的核心概念?是为了解决什么问题?
- 卡顿 {如何检测卡顿,卡顿原理是什么,怎么判断页面响应卡顿还是逻辑处理造成的卡顿} ,BlockCanary 的原理
- 算法:双链表翻转、写出你所知道的排序算法及时空复杂度,稳定性
最后
多余的话就不讲了,接下来将分享我面试之旅的复习过程,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!
这里给大家提供一个方向,进行体系化的学习:
1、看视频进行系统学习
这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
2、进行系统梳理知识,提升储备
客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
系统学习方向:
- 架构师筑基必备技能:深入Java泛型 注解深入浅出 并发编程 数据传输与序列化 Java虚拟机原理 反射与类加载 动态代理 高效IO
- Android高级UI与FrameWork源码:高级UI晋升 Framework内核解析 Android组件内核 数据持久化
- 360°全方面性能调优:设计思想与代码质量优化 程序性能优化 开发效率优化
- 解读开源框架设计思想:热修复设计 插件化框架解读 组件化框架设计 图片加载框架 网络访问框架设计 RXJava响应式编程框架设计 IOC架构设计 Android架构组件Jetpack
- NDK模块开发:NDK基础知识体系 底层图片处理 音视频开发
- 微信小程序:小程序介绍 UI开发 API操作 微信对接
- Hybrid 开发与Flutter:Html5项目实战 Flutter进阶
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
3、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。
4、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三。
总结
改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。
以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。