一个6年高级安卓程序员的年终面试总结,含泪亲诉一波三折的工作之旅,让你不再迷茫!

2020-12-09 10:16:23 浏览数 (1)

人生是一个漫长的过程,我们怀有太多的期望,就难免会遭遇失望与挫折。

今天这篇文章是我自己2020的小总结,2020感恩遇见。

一年的遭遇

2020开头就是一个不平凡的一年,疫情来袭,许多互联网公司面临倒闭的风险,而很多程序员则在面临着失业裁员的风险。

而我就是裁员大队中的一员,组织架构调整,进行了人员优化,业务线被解散,被裁员。

然后为了更快的工作, 草草的面试了几家公司最后入职了一家小公司,每天做着没有技术含量重复的工作,刚开始只是想填补被裁员的资金漏洞,但是工作久了还是无法适应,工作都是一些边缘化的内容,自己考虑到没有什么实质性地成长,然后在几个月后裸辞了。

后来开始重视面试,仔细挑选公司投递简历,在面试前也前前后后复习准备了四五个月,后来面试了十几家大小厂,拿到了几个offer,入职了一家大厂,目前工作已经有小几个月,工作氛围很好,干劲满满,2021继续加油!

不放弃,不气馁!

接下来分享一下面试的一些题目,只记录了一部分,因为有些忘了。

字节跳动4轮面试

一面

  • 插件化,启动activity的hook方式,taskAffity
  • 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的原理

四面

  • 适配器和装饰模式各自特点和使用场景
  • 视频编解码是怎么做的
  • 三色球排序

腾讯面试

  • 音视频采集编码播放流程
  • Mediacodec编码内部原理与工作流程(什么状态机之类的),使用Mediacodec时遇到过什么问题,怎么解决的
  • ffmpeg怎样编码和解码的,怎么做视频编辑,添加特效
  • 怎么取一帧视频画面编辑成图片并将二维码合成到图片中,然后进行压缩处理,压缩要保证图片的清晰度不变
  • 平时做过哪些性能优化,怎么做的,已经发布的app怎么监测性能
  • Jetpack会不会,livedata、databinding的使用及原理
  • Kotlin、flutter也提了一下
  • Android中进程通信方式除了aidl,还有什么用的比较多(不包括Linux的)
  • App的启动流程,从点击图标开始
  • 一个算法问题
  • app的启动优化方案有哪些(主要是非常规的那些方法)

滴滴面试

  • 创建线程有哪几种方法
  • 线程池的运行机制
  • 如果有一个任务需要线程池里所有任务执行完以后执行,应该怎么做
  • synchronize和lock有什么区别
  • 如何避免线程锁死
  • 手写单例,如果在不使用锁的情况下创建单例并保证单例安全性
  • handler原理,子线程可以创建Handler吗?
  • 内存泄漏与内存溢出的区别
  • 有没有做过安全性能检测的项目
  • 原生与H5如何交互,传参数?
  • 用过哪些算法?
  • 如何在服务中启动一个耗时操作
  • Activity的启动模式

小米面试

  • 介绍一下binder和原理
  • measure layout draw流程,滑动冲突
  • 常用的多线程工具类。blockingqueue ,concurrenthashmap,信号量,countdownlatch,cyclicbarrier,exchanger等,stringbuffer
  • stringbuilder 和stringbuffer区别
  • lock和syncrognized原理区别,适合什么场景。
  • 实现生产者,消费者
  • handler原理,是如何实现延时的。
  • 一个activity启动另外一个activity的生命周期。

算法题:

  • 反转链表
  • 归并排序
  • 快速排序
  • feiboqiena数列
  • 二分查找
  • 两个队列实现栈
  • 两个栈实现队列
  • 判断链表是否成环,找到成环的交点。

顺丰面试

  • 使用过hook技术吗?谈谈理解。
  • 谈谈对android虚拟机的理解。
  • 有做过推送相关吗?原理有去了解过吗?
  • 谈谈startActivity的流程。
  • 谈谈对自定义View的理解。
  • 谈谈binder的理解。
  • 你知道数据库有哪些,android sqlite存储数据的上限大小是多少?
  • 谈谈TCP与UDP的理解。
  • Java的引用。
  • GC算法
  • 谈谈对android应用的理解。

手百3轮面试

一面

  • 为什么工作一年就想换工作?
  • onTouchEvent/onTouchListenr.onTcouchEvent/onClickListenr
  • hashmap的原理?
  • java的hashcode和equals的区别
  • java的gc了解多少?
  • kt的伴生对象是饿汉模式还是懒汉模式?
  • handler.postDelayed的原理
  • ANR怎么产生?怎么捕捉?
  • 智力题:桌子上有101块饼***拿先手,他拿后手,你需要怎么赢
  • tcp 三次握手/四次挥手, 为什么要三次握手,四次挥手?
  • 内存泄漏是什么?怎么找?
  • 算法题:斐波拉契数列,递归的方式怎么优化?

二面

  • 手淘这种大型app是怎么迭代起来的?
  • 你对小程序的原理了解么?
  • v8binding怎么做?
  • 你项目的价值是什么?
  • 图片缓存怎么做?你要设计一个图片缓存框架怎么搞?
  • lrucache怎么实现?为什么是o(1)的时间复杂度?
  • voliate 关键字解释下?
  • voliate 关键字不能实现什么?
  • https解释下
  • 常见的对称加密算法和非对称加密算法有哪些?
  • 让你设计一个打点系统怎么做?
  • 如果进程被杀死或者切换后台,数据如何保存丢失?
  • 你怎么设计埋点系统一个线程模型?
  • 快速排序?快速排序是稳定的么?
  • 如何实现一个快速排序的稳定性?
  • minstack怎么设计?
  • kotlin和java混用有哪些问题?
  • 设计一个数据结构,微博里面有人发了文章怎么实现?关注怎么实现?
  • 微博里面有人发了文章,关注的人如何获取最新的10条?如何获取关注的人的文章的最新1000条?设计一个高效的算法

三面

  • 你为什么选择换工作?
  • 你组里面的人都怎么样?
  • 你怎么解决项目中的难点?
  • 你有工作中遇到过哪些比较麻烦的地方?
  • 你平时怎么学习的啊?
  • 你除去学习之外都看什么书?

网易2轮面试

一面

  • HashMap扩容原理,为什么要2的指数幂容量,如果输入17会是多少容量?

跟HashCode有关系,如果输入17,会向后达到2的指数幂,32。

  • CurrentHashMap 读写锁是如何实现的?

如果没有hash冲突的情况下,使用CAS进行插入,如果有hash冲突,使用synchronized加锁进行插入。当链表长度大于8且数据长度>=64时,会使用红黑树替代链表。

ReentrantReadWriteLock类中有readLock()和writeLock()方法可以分别获取WriteLock和ReadLock对象,调用他们的lock方法,就可以实现读写锁。实现原理就是AQS的acquire和acquireShared方法。

  • List加锁要如何加?

二面

  • app优化 内存优化 cpu使用率优化
  • 如何设计一个类似于微信朋友圈的首页的功能,UI 数据等方面
  • 如何设计一个无限数据的气泡显示聊天内容
  • 5个G数据,如何在500M内存的情况下实现排序
  • 大文件在传输过程中要考虑哪些问题,如何保证大文件的一致性
  • JSbridge 是如何实现js和native联通的
  • 如何做到单个信号源,多个页面响应
一些高频重点问题
  • APP性能优化 内存优化 cpu占用率 流畅性等,考虑一下如何评价一款app的性能,如何监控线上app的性能问题
  • 多线程同步Sync和Lock实现原理
  • HashMap ConcurrentHashMap实现原理 链表转红黑树的条件,扩容原理,ConcurrentHashMap线程安全原理、如何做到性能好

面试总结

讲一下大厂面试一些必备的技能

1. 一般情况下第一轮都是基础面试,需要扎实的基础

  • 最常用的Android 基础知识
  • Java 基础知识
  • 了解一些 常用东西的原理,例如:handler, thread 等
  • 项目中的技术点

2. 第二轮的时候需要了解更深层次的东西

  • Android 事件分发机制原理
  • Android 绘图机制原理
  • WindowManager 的相关知识
  • 进程间传输方式
  • Java 内存管理机制

3. 能进入第三轮基本没什么问题,但是要注意以下问题

  • 该轮一般是 老大或者部门负责人,问的问题一般都看 深度与广度
  • 当问及薪水的时候,要说一个合适的,小公司随意,大公司一定要慎重,当心里没底的时候,可以告诉对方,让对方给一个合理的薪资。一般都是在原工资基础之上增长,听猎头说一般涨幅都在15%-30%,超 NB 的可以要30%及以上,如果感觉自己还不错的,挺厉害的,建议最高20%,一般人就定在15% 左右最靠谱。公司内部一般有一套机制,根据公司情况而定。
  • 我们的面试原则就是拿到合理薪资,得到 offer
  • 个人发展情况,这个问题很难回答,如果和公司方向不符合,极有可能和公司无缘。建议多试探性的问问公司缺少什么,你能否给予公司对应的东西。当然对于有自我追求的人,那可以放心大胆的提。我的方向就是架构师,哈哈哈,挺极端的,别学我哦。我感觉选择都是双向的,因此我知道自己需要的是什么。
  • 你最擅长什么UI 还是其他什么?这个问题更不好回答。你要说你擅长 UI,是不是意味着你其他能力就不行?虽然我不知道面试官的用意,但是我能感觉到,这个问题不是那么好回答,我会回答说自己都行,来什么业务接什么需求。可能回答不太好,总之和公司的职位吻合就行,这样总不至于出错吧。

最后

其实客户端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2020BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 诸多细节。

还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

以上内容均放在了开源项目:【github】 中已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

3.项目复盘

实际上,面试的一二轮所问到的技术问题,很多都是围绕着你的项目展开,因此在面试前最后要做好的一件事情就是项目复盘。关于项目复盘,我个人的思路如下,可供参考:

  • 你在这个项目中承担了什么样的角色?
  • 这个项目的背景是什么,如果是技术项目,为什么要做?
  • 有哪些技术难点,是怎么解决的,是否还有更好的方案?
  • 你认为项目中是否有可以改进的点?
  • 这个项目解决了什么问题,最好用数据说话,这个数据又是怎么得出来的?

提前把思路捋一捋,上面这些问题好好思考或准备一下,做到心中有谱以后,自然能够面试官聊得融洽,保持一个好的心态,通过的几率就会更大一些。

0 人点赞