在笔者面试这一个月,看了不少文章,也刷了不少面试题,但真正有深度,适合4年及以上Android高工的内容少之又少

在面试准备阶段,笔者准备了三个月左右的时间,结合相关资料及源码,完成了一系列的深度学习和输出

  • 在系统源码层面,包括系统启动,应用启动,四大组件相关,插件化等;
  • 在并发方面,完成了ConcurrentHashmap,CopyOnWriteArrayList, CountDownLatch等相关源码剖析,及线程协作相关内容输出
  • 在插件化方面,完成了插件化整体方案的总结和输出,及VirtualApk核心源码分析; 具体内容请点这里查看

面试准备技巧

如果说面试准备有什么技巧的话,笔者的经验是,深度为主,广度为辅

如何提升知识的深度?

针对高开面试来讲,哪怕是最简单的问题(比如老生常谈的Handler)也会有超乎寻常的深度问法,而所谓的深度, 即对系统源码的理解程度。因此,对源码的研读是十分重要的

我的学习方法论是,输入 + 输出,如果没有输出,第一是会忘,第二是没有办法内化为自己的知识。可能大家都会去看技术文章,但看过两天后,你还会对那些内容印象深刻吗?大多数情况是不会

因此,不论是自己整理笔记也好,还是写文章分享也罢,输出是很必要的,跟别人交流的过程,也是不断内化和成长的过程

在高工面试中,一般会着重考察面试者对技术问题里理解的深度,我的建议是,在几个点上进行深度学习,比如系统源码,插件化等等

在编写简历时,可以将这些内容放在显眼的位置,暗示面试官这是我的强项,一定记得问我!

如何提升知识的广度?

就广度上来讲,其实主要看平时的积累,但是面试的复习也必不可少

内容上来说,包括性能优化, 多线程并发, JVM虚拟机相关, 算法问题 , 设计模式 ,网络相关知识,等等;

拿性能优化来讲,从整体方案上来说,有一些比较成熟的开源库可以参考,比如腾讯的Matrix, 滴滴的Booster;相关内容点击这里查看

针对具体的优化细节,就涉及到相关的开源库及相关原理,可参考的三方库有:

  • LeakCanary ,内存泄漏监测
  • BlockCanary,UI卡顿监测
  • Glide,对Bitmap内存的优化及防止内存泄漏
  • Jetpack , 官方支持库 ,避免内存泄漏
  • AspectJ , AOP切面编程

不同的岗位方向关注的侧重点也会有些不同,我们在后面的分享中也会涉及到。

在大厂的面试中,也有一些面试官(尤其是一面的时候)会拿一些常见的面试题来进行考察,比如UI绘制 , 自定义view ,触摸事件分发 等高频考点也应该着重复习和掌握。

因此,如果没有面试准备方向,找一份面试题集锦来进行热身复习也可以。

笔者在面试期间我整理了一份面试题,在此也贴出来供大家参考,如有需要全套面试题,点击我就可以了。

如何准备简历?

在跟猎聘网HR聊天的过程中,谈到了他们的简历修改付费项目。其实写简历并不难,难的是如何写出一份适合自己,能突出自身优势的高质量的简历。

这里笔者默认大家已经做完了面试的前期准备工作,而现在我们需要做的,就是把前期准备的比较充分的,有深度有技术含量的点放在我们的简历中。

高效利用简历的黄金区

我们在准备简历的时候要去换位思考,HR(或者招聘部门)是如何审阅一份简历的。

所谓的黄金区,即简历第一页的起始部分,以笔者的经验,一般会用来放个人简介(包括教育背景,个人自述等)及核心技术要点。

我们来看一份样例

赵xx | Android工程师

年龄:xxx | 经验:x年 | 博客:xxxx

电话 / 微信:xxx | 邮箱:xxx

教育背景:xxx(20xx/9--20xx/6)

专业背景:xxx

个人简介

20xx年至今,从事Android开发x年有余,经历过xxx开发,xxx开发,xxx项目研发,xxx方案调研及实现,xxx定制化Android设备应用研发;

积累了一定的项目经验和技术实力,有较强的技术攻关能力和学习能力,对xxx有一定的研究,针对xxx,xxx,xxx相关源码进行过深入的研究和学习

简历的核心关注点

针对HR来讲,最关心的点有以下几个

  • 专业是否符合要求
  • 学历是否符合要求
  • 工作年限是否符合要求(针对高开,专家,资深分别有一定的年限限制)
  • 年龄是否符合

针对招聘部门来讲,最关心的点如下

  • 过往项目是否匹配
  • 是否对本部门的项目感兴趣
  • 是否具备一定深度的领域研究和学习能力

因此,在黄金区把这些关注点描述清楚,就是我们的一个目标了。

在上面的Sample中,笔者将年龄,工作年限,教育背景,专业背景都放在了最显眼的位置,就是为了让HR能一眼看到需要了解的信息。

在个人简介中,笔者简单介绍了工作经历,项目经历,以及自身的深入研究领域,这里是为了给用人部门审核时,大致判断是否符合用人部门的需求。

这里要注意的是,突出自己的优势,扬长避短,没有价值(或者简历审核方不关心,或者是自身劣势)的内容尽量不要放在这个区域。

专业技能点

当HR(或用人部门)初步判断该应聘者基本符合要求时,就会去看专业技能点及项目经验了。

针对面试者来说,在面试的过程中,面试官会着重考察简历上的专业技能点,我们在写技能点时,一般会使用了解,熟悉, 精通这样的词语来进行描述。

而在笔者看来,即使对某方面非常精通,也需要用一些较为圆滑的描述来表达,比如针对xxx有较为深刻的理解,针对xxx有自己的理解,针对xxx有一定的实践和独到见解,来避免面试官问的深度过深。

技能点写什么?

具体的技能点到底写什么,大的方向来讲笔者建议分为两大部分 -- Java和Android(如果有native开发经验根据情况编写),具体细节来讲,需要根据前期准备的程度进行填写。

针对高开来讲,所谓的Java基础,已经远不是基础,而是涉及到JVM内存区域,JMM内存模型,多线程并发,封装继承多态及Jvm是何如实现的,为什么要这么实现等等。

而Android基础,也尽量要深挖一些,比如涉及到四大组件,比较常问的一个问题是Activity是如何启动的(或者应用是如何启动的)。

这个问题可深入考察的点非常多:

  • 考察对源码的理解程度
  • AMS是如何跟Zygote通信fork出进程的
  • AMS是如何跟应用层通信的
  • ActivityThread是如何被启动的
  • ActivityThread到底是用来做什么的
  • 主线程Looper如何初始化的
  • AMS是如何绑定ActivityThread的binder对象的
  • binder是如何初始化的,如何完成跨进程调用的,如何跨进程传递数据及传递数据有什么限制等

更多详细内容请点击:面试必备:Android Activity启动流程源码分析

这也是为什么建议大家在准备阶段以深度为主进行准备的原因,如果看过相关系统源码,相信这些问题都可以轻松应对。

针对专业技能点,笔者不可能一一涵盖,这里给出一些技能点,大家可以根据自己的情况进行选择。

Java相关

  • 容器(HashMap、HashSet、LinkedList、ArrayList、数组等)
  • 内存模型
  • 垃圾回收算法(JVM)
  • 垃圾回收机制和调用 System.gc()的区别?
  • 类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要)
  • 反射
  • 多线程和线程池
  • 设计模式(六大基本原则、项目中常用的设计模式、手写单例等)
  • Java 四大引用
  • Java 的泛型
  • final、finally、finalize 的区别
  • 接口、抽象类的区别

Android

  • 自定义 View
  • 事件拦截分发
  • 解决过的一些性能问题,在项目中的实际运用
  • 性能优化工具
  • 性能优化 (讲讲你自己项目中做过的性能优化)
  • Http[s]请求慢的解决办法(DNS、携带数据、直接访问 IP)
  • 缓存自己如何实现(LRUCache 原理)
  • 图形图像相关:OpenGL ES 管线流程、EGL 的认识、Shader 相关
  • SurfaceView、TextureView、GLSurfaceView 区别及使用场景
  • 动画、差值器、估值器(Android中的View动画和属性动画 - 简书、Android 动画 介绍与使用)
  • MVC、MVP、MVVM
  • Handler、ThreadLocal、AsyncTask、IntentService 原理及应用
  • Gradle(Groovy 语法、Gradle 插件开发基础)
  • 热修复、插件化
  • 组件化架构思路
  • 系统打包流程
  • Android 有哪些存储数据的方式。
  • SharedPrefrence 源码和问题点;
  • sqlite 相关
  • AMS 、PMS
  • Activity 启动流程,App 启动流程
  • Binder 机制(IPC、AIDL 的使用)

以上内容均放在了开源项目【GitHub】,免费分享,有需要的朋友自取。

如何应对面试?

前面我们聊了如何准备面试和投递简历,下面我们从面试本身出发,介绍面试中有哪些应对技巧。

对技术面试来说,可能有的人并不会注重所谓的技巧;笔者在这里说的技巧,并不是什么奇技淫巧,而是在前面的准备部分都已经比较完备的情况下,如何在面试中更好的体现自己的技术实力。

如何更好的跟面试官沟通?

一般而言,大公司的一面二面会在线上进行面试,尤其是现在疫情的情况,可能我们更多的面对的是线上面试。

下面我将从线上和线下两个角度来讲一些面试技巧。

线上面试

线上面试的过程中,可能出现各种各样的问题,比如网络不稳定,与面试官沟通不顺畅等等。

针对线上,我们应该做好以下准备:

  • 准备好水 线上面试一般会持续1-3个小时(一面加二面),因此准备好饮用水是非常重要的,试想不喝一滴水,口如悬河讲2个小时是什么感受!

  • 尽量争取线下面试 线上面试有各种的不便,为了更好的表现出自己的技术能力,可以尽量跟HR/面试官约线下面试。

  • 提前与面试官沟通 不同的面试官面试风格迥异,有的偏好打断面试者,有的偏好听面试者讲完再提问。在线上面试这种环境下,更加剧的沟通的不便,因此我们应该提前跟面试官沟通,更顺畅的完成面试过程;笔者在面试前会先告诉面试官,如果我有哪些地方没有讲清楚,请打断我向我提问。

  • 提前调试好网络,进入面试间 笔者在线上面试时,都会提前半小时进入面试间等待面试官,一来让自己以一个更好的状态来应对面试,二来可以提前进行网络的测试。

  • 网络质量差时,改为语音面试 网络质量差有可能是面试官的原因,也有可能是面试者的原因,这个是不可控的;在实在无法解决网络质量差的问题时,可以切换为仅使用语音面试。

线下面试

现场面试基本上解决了以上的各种问题,因此在能约现场面试时,一定要优先考虑现场面试。

线下面试也要注意一些细节问题:

  • 提前到面试现场 一来我们可以有更多的缓冲时间来应对路上的异常情况 二来到面试现场后,可以调整下自己的状态,看看技术文章,或者自己的面试总结。

  • 提前10分钟与HR/面试官联系 尽管我们提前到了面试现场,也不要过早进去面试,一般大公司都需要预约会议室进行面试,面试官在预约的时间外也会有自己的其他工作要做。

如何引导面试官提问?

引导面试官提问,一是在简历上做文章,把自己准备的比较有深度的内容放在显眼的位置,加上对xxx有深入理解等描述词;二是在回答面试官的其他技术问题时,尽量多提及一些相关的,自己准备的比较好的内容。

如何应对不了解/不会的问题?

我们在前面准备了很多有技术深度的技能点,比如插件化,多线程,多进程,Android系统源码等等,但面试中我们遇到的问题是千奇百怪的,因为不同岗位有不同的要求。

就拿Android系统源码来讲,源码之多之复杂,决定了我们只能找某几个方向与应用关联比较密切的额方向去进行研究,比如四大组件,应用启动等;但在笔者面试一家做安全的公司时,面试官看我在简历上写了对Android系统源码有一定深度的研究,说那你讲一下Android系统中应用的安装流程吧。

这方面的问题笔者完全没有准备,也没看过这方面的源码,针对这种情况,有两种应答思路:

  • 在问题的基础上进行思维拓展回答 这里主要是看这个问题的类型,如果考察代码的理解能力和设计能力,可以做拓展性的回答

  • 坦言这一块了解的比较少 如果是考察比较固定的技术点,没有拓展空间的话,可以告诉面试官自己在哪些地方进行了深度的学习,引导面试官进行提问

最后

如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。

如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。

Android面试大揭秘!从技术面被“虐”到征服CTO,全凭这份强到离谱的pdf的更多相关文章

  1. 程序员面试大揭秘——应聘微软、亚马逊、谷歌、苹果等IT公司你都要做什么准备?

    对于多数求职者而言,面试好似一个迷局.你去了,见了几个面试官,答了一堆问题,然后,或两手空空离开,或幸运地拿到录用通知. 你有没有想过: 面试结果是怎么得出的? 面试官会不会互相交流? 公司最看重哪些 ...

  2. 自动化测试面试官:登录或注册时有验证码怎么处理?OCR图像识别技术大揭秘!

    本节大纲 读取cookie实现免登陆 pytesseract+tesseract-ocr实现图像识别 Pillow库对验证码截图 API接口实现图像识别 今天的这个技术点,为什么要给大家分享一下呢? ...

  3. 【Android面试揭秘】面试官说“回去等通知”,我到底会不会等来通知?

    前言 大部分情况下,面试结束后,面试官都会跟你说:我们会在1-2个工作日内通知你面试结果. 许多人认为:所谓「等通知」其实是面试官委婉地给你「发拒信」.但是,这不是「等通知」的全部真相. 这篇文章,我 ...

  4. Android开发如何准备技术面试(含Android面试押题)

    今年毋庸置疑是找工作的寒冬,每一个出来找工作的同学都是值得尊敬的.现在找工作,虽然略难,但是反过来看也会逼迫我们成为更加优秀的自己. 但是不管是旺季还是寒冬,有一些优秀的同学找工作还是挺顺利的.所以说 ...

  5. Android面试一天一题(1Day)

    写在前面 该博客思路源于在简书看到goeasyway博主写的Android面试一天一题系列,无copy之意,仅为让自己总结知识点,成长一点点.先感谢各位大神的无私分享~! 关于题目,大部分则出自And ...

  6. 【腾讯Bugly干货分享】iOS黑客技术大揭秘

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5791da152168f2690e72daa4 “8小时内拼工作,8小时外拼成长 ...

  7. Android面试总结 (转)

    1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在指 ...

  8. Android面试题目及其答案

    转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...

  9. Android面试题目2

    1. 请描述下Activity的声明周期. onCreate->onStart->onRemuse->onPause->onStop->onRestart->onD ...

随机推荐

  1. COURSES 赤裸裸的二分匹配大水题

    COURSES 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include ...

  2. Redis 底层数据结构之链表

    文章参考:<Redis设计与实现>黄建宏 链表 链表提供了高效的节点重排能力,以及可以顺序访问,也可以通过增删节点灵活调整链表长度,Redis中的列表.发布订阅.慢查询.监视器等功能均用到 ...

  3. Docker:部署PXC8.0集群时,启动容器报错New joining cluster node didn‘t find all needed SSL artifacts

    使用docker部署mysql PXC集群8.0版本,启动第二个节点的时候遇到报错,New joining cluster node didn't find all needed SSL artifa ...

  4. 2shell中处理字符串,字符串的截取、替换

    0.字符串的小知识点 1.字符串的截取 1.1从指定位置开始截取 1.2 从指定字符(子字符串)开始截取 1.3字符串截取的总结 1.4 按指定要求截取 2.字符串的拼接 3.字符串的替换 0.字符串 ...

  5. Swoole异步投递task任务

    [使用场景] Swoole的task模块可以用来做一些异步的慢速任务.耗时场景.如webim中发广播,发送邮件等,把这些任务丢给task进程之后,worker进程可以继续处理新的数据请求,任务完成后会 ...

  6. 剑指 Offer 12. 矩阵中的路径

    题目描述 是一道很常见的深搜题目,不过里面要考虑一些边界问题,比如走过的路径是不能再次走入的,所以我这里我自己的 代码想到是利用一个新的二维的数组,记录走过的路径,不过题解的直接将原二维数组中的路径隐 ...

  7. 深入浅出图神经网络 GCN代码实战

    GCN代码实战 书中5.6节的GCN代码实战做的是最经典Cora数据集上的分类,恰当又不恰当的类比Cora之于GNN就相当于MNIST之于机器学习. 有关Cora的介绍网上一搜一大把我就不赘述了,这里 ...

  8. 如何处理RabbitMQ 消息堆积和消息丢失问题

    消息堆积 解决方案: 增加消费者或后台相关组件的吞吐能力 增加消费的多线程处理 根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务 默认情况下,RabbitMQ消费者为单线程串行消费,设置并行消 ...

  9. php-18个魔法函数

    目录 php魔法函数 介绍 范例 1.__construct() 2.__destruct() 3.__call() 4.__callStatic 5.__get() 6.__set() 7.__is ...

  10. excel带格式复制python

    openpyxl 复制cell单元格包括所有样式 target_cell.data_type = source_cell.data_type target_cell.fill = copy(sourc ...