前不久,我们技术交流群里的一个小学弟说遇到了一件让他很难受的事情,希望老皮能够给他点意见。
一开始我还以为是什么感情纠纷啥的,就比如:我喜欢A,而A却喜欢B,B却是我的好兄弟这种狗血剧情,于是我耐心地等待下文,却没想到…
就这?就这?就这?这对于工作了两到三年安卓开发者来说不是有手就行吗?(不要打我,我带了头盔,怕伤着宝)
咳咳咳,当然玩笑话就到这吧,相信大多数人对于进大厂都会带有一丝紧张的行李,觉得自己是否合格,话不多说,接下来老皮就给你们讲讲如何在面试中拿下offer。
今天我们从面试本身出发,一来介绍面试中有哪些应对技巧,二来将对重要的技术问题进行分析讲解
下面,Music起!
面试有什么技巧?
对技术面试来说,可能有的人并不会注重所谓的技巧
;笔者在这里说的技巧,并不是什么奇技淫巧,而是在前面的准备部分都已经比较完备的情况下,如何在面试中更好的体现自己的技术实力
如何更好的跟面试官沟通?
一般而言,大公司的一面二面会在线上进行面试,尤其是现在疫情的情况,可能我们更多的面对的是线上面试
下面我将从线上和线下两个角度来讲一些面试技巧
线上面试
线上面试的过程中,可能出现各种各样的问题,比如网络不稳定,与面试官沟通不顺畅等等
针对线上,我们应该做好以下准备
-
准备好水
线上面试一般会持续1-3个小时(一面加二面),因此准备好饮用水是非常重要的,试想不喝一滴水,口如悬河讲2个小时是什么感受!
-
尽量争取线下面试
线上面试有各种的不便,为了更好的表现出自己的技术能力,可以尽量跟HR/面试官约线下面试
-
提前与面试官沟通
不同的面试官面试风格迥异,有的偏好打断面试者,有的偏好听面试者讲完再提问。在线上面试这种环境下,更加剧的沟通的不便,因此我们应该提前跟面试官沟通,更顺畅的完成面试过程;笔者在面试前会先告诉面试官,如果我有哪些地方没有讲清楚,请打断我向我提问
-
提前调试好网络,进入面试间
笔者在线上面试时,都会提前半小时进入面试间等待面试官,一来让自己以一个更好的状态来应对面试,二来可以提前进行网络的测试
-
网络质量差时,改为语音面试
网络质量差有可能是面试官的原因,也有可能是面试者的原因,这个是不可控的;在实在无法解决网络质量差的问题时,可以切换为仅使用语音面试
线下面试
现场面试基本上解决了以上的各种问题,因此在能约现场面试时,一定要优先考虑现场面试
线下面试也要注意一些细节问题
-
提前到面试现场
一来我们可以有更多的缓冲时间来应对路上的异常情况
二来到面试现场后,可以调整下自己的状态,看看技术文章,或者自己的面试总结
-
提前10分钟与HR/面试官联系
尽管我们提前到了面试现场,也不要过早进去面试,一般大公司都需要预约会议室进行面试,面试官在预约的时间外也会有自己的其他工作要做
如何引导面试官提问?
引导面试官提问,一是在简历上做文章,把自己准备的比较有深度的内容放在显眼的位置,加上对xxx有深入理解
等描述词;二是在回答面试官的其他技术问题时,尽量多提及一些相关的,自己准备的比较好的内容
如何应对不了解/不会的问题?
我们在前面准备了很多有技术深度的技能点,比如插件化,多线程,多进程,Android系统源码等等,但面试中我们遇到的问题是千奇百怪的,因为不同岗位有不同的要求
就拿Android系统源码来讲,源码之多之复杂,决定了我们只能找某几个方向与应用关联比较密切的额方向去进行研究,比如四大组件,应用启动等;但在笔者面试一家做安全的公司时,面试官看我在简历上写了对Android系统源码有一定深度的研究
,说那你讲一下Android系统中应用的安装流程
吧
这方面的问题笔者完全没有准备,也没看过这方面的源码,针对这种情况,有两种应答思路
-
在问题的基础上进行思维拓展回答
这里主要是看这个问题的类型,如果考察代码的理解能力和设计能力,可以做拓展性的回答
-
坦言这一块了解的比较少
如果是考察比较固定的技术点,没有拓展空间的话,可以告诉面试官自己在哪些地方进行了深度的学习,引导面试官进行提问
面试重点问题解析
以上就面试中的一些技巧
进行了一些总结,下面我们就面试中的重点技术问题进行一些分析,这里我会着重介绍在面试中如何讲述相关技术要点,以下面试题来自各大厂的面试题,想直接看面试题目的同学可以直接看最后的附录部分。
一面
- 插件化: 插件化探索:插件Activity是如何启动的?
- 如何解决资源固化和资源冲突(方案一:appt修改id段;方案二:appt2支持)
- 为什么不使用现有的插件化框架?市面上有哪些成熟的插件化方案?
- 为什么看系统源码?你是做ROM的吗?
- 卡顿优化是怎么做的?市面上有什么成熟的方案?(笔者主要介绍了LayoutInflater的异步加载方案和相关原理以及X2C框架)
- 异步加载方案和Activity的声明周期有什么关联?会不会受影响?针对业务的写法有没有影响?
- 异步加载方案优化效果有多少?
- UI的绘制卡顿如何监控和优化?(笔者介绍了BlockCananry的监控原理及Chorgphoer的vsync回调监控)
- FPS和UI的绘制时间有什么关系?跟一个Vync时钟周期的时间又是什么关系?(此处涉及到vync信号的分发机制,Chorographer,FrameDisplayEventReceiver,SurfaceFlinger等之间的关系)
- 高刷屏和普通屏的刷新率有什么区别?vsync时钟周期会改变吗?帧率是如何计算的?
- 针对UI卡顿,什么叫冻屏?
- 应用启动优化是怎么做的?
- 如何进行内存优化?如何避免OOM问题?如何检测和避免内存泄漏?
- Bitmap是占用的哪部分的内存?Java还是native?(跟Android系统版本有关)
- 如何解决内存问题?有什么措施?
- 如果确实需要这么多内存资源,如何解决这个问题?(笔者介绍了largeHeap,以及多进程)
- 在内存收紧的时候,怎么知道应该回收哪些内存?(笔者介绍的策略是用时申请,闲时释放)
- 图片加载库里针对内存做了哪些优化?
- 如何获取应用能申请的最大内存大小?
- 有没有遇到过线程超限导致的OOM?(笔者这里介绍了线程池对线程的管理)
- MVC和MVP最主要的区别是什么?MVP有什么缺陷,如何改进?
- 你对AOP是怎么理解的?(笔者介绍了各种AOP方案,以及对应的应用场景)
- 除了Android原生开发,有没有接触过其他的技术栈?(指插件化的构建服务,groovy之类的)
- 1亿个数如何找到最大的数?(笔者介绍了快排思想 + 二分的思路)
- 按Z字形顺序打印一个二叉树
- 对新的技术,比如Kotlin,Flutter有没有过了解和研究?(笔者说的是更关注framework层,所以了解比较少)
- 除了Java还会哪些其他语言?
- 对Xposed有没有有过了解和研究?它的原理是什么?
- 如何Hook Java代码和native代码?
二面
- 对classloader的加载有什么了解?什么是双亲委派?
- 插件化中是如何加载dex的?如何解决类重复的问题?Classloader是如何使用的?混合方式和独立方式有什么区别?
- 插件化中是如何加载resource的?如何解决资源ID重复的问题?
- 讲一下Activity的启动流程
- 静态内部类与内部类有什么区别?
- 算法题:找到链表的倒数第K个节点
- 数据结构题:什么是平衡二叉树
- 多线程:讲一下生产者消费者模式?使用的什么锁,是如何对数据进行操作的
- 如何保证线程安全?synchronized,volatile各有什么作用?
有需要的朋友可以直接扫【下方的二维码】找我免费获取文中面试题资料。
↓↓↓↓↓
结尾
祝愿大家都能收获满满的Offer,赚更多的钱,,谢谢大家,喜欢的同学记得不要忘记点赞+关注哦。