原文:面试记录:Android 架构岗,一次4小时4面的体会

此次面试总共4面4小时,中心只有几分钟间隔。对继续的面试状况检测仍是蛮大的。

关于面试的心态,坚持失望的达观主义心态比较好。面前做面试预备时坚持失望,尽或许的做足预备。面后活跃做复盘,达观的承受终究成果。

切忌急于下结论,哪怕面试当场显着感觉好或不好。快思考时我常会扩大活跃面信息而缩小负面影响,导致做了过于达观的选择,回来后或许隔一天以后再思考,这时分能够做到慢思考,经过复盘来下一个更为理智的决断。

善意提示:如果恰好部分内容你觉得有价值,那么我很开心,但切勿直接作为架构岗位才能要求的一般性标准

JD

  • 1.担任App中心架构设计,涉及组件化结构、APM、DevOps、热修正等
  • 2.担任App功能优化,设计发动、内存、卡顿 Crash等App功能指标
  • 3.了解事务,运用技能来驱动事务架构的晋级与迭代
  • 4.担任研制效能体系建造,提升研制流程功率建造
  • 5.担任规划Android架构的技能方向以及重难点霸占 岗位要求
  • 6.8年以上Android经历以及至少两年以上Android架构经历
  • 7.具有丰厚的安卓端功能优化的项目经历以及APM建造经历
  • 8.了解Gradle插件开发以及插桩相关的逻辑
  • 9.了解热修正、插件化等相关技能
  • 10.有Flutter开发经历优先,有办理经历优先,有业内影响力的开源作品优先

JD拆解

这儿省略了,都是一些自己的模仿自问,可在原文中查看:面试记录:Android 架构岗,一次4小时4面的体会

一面:基础技能(JVM,多线程偏多)

  • 说一下JVM的结构

说了堆,办法区,线程栈三个块的介绍。这儿漏掉了说太快漏掉了程序计数器跟本地办法栈,但在面试官特地的问的时分也正确答复了效果。

  • volatile 的效果与完结原理

用于变量修正时在多线程场景下坚持修正的可见性,但并不能彻底解决多线程并发修正的问题。举例了两个线程拜访 i++的比方。

  • 那介绍一下为什么说 i++是两步操作

介绍了i++字节码指令履行次序以及办法栈履行细节

  • Volatile 润饰的变量在修正时详细怎么完结可见性的

这一步我直接回复不知道了,没有特地看过 volatile 润饰的字节码,不瞎说。面试官便给我进行了简单的介绍,我当时就想着回来一定要自己也看一看,之前为啥没看,哎。

首先在字节码中 针对Volatile润饰的变量会有一个 ACC_VOLATILE 标志:

  • 可见性:当时线程修正后其他线程堆修正后的值立即可见,线程修正值之后立即写入到主存区,不必比及线程出栈的时分才同步到主存区。(线程作业区内存中保存的值要等待线程出栈时才写回主存区,在此之前其他线程对修正是不可见的)
  • 次序性:即读写的次序性,而不会出现 读的进程中写入,或写入进程中被读取
  • 不确保原子性:比方i++
// 读-写次序性,假设有一个被 ACC_VOLATILE 标志润饰的 volatile 字段 v
// 线程 1
getfield v    // 读取字段 v 的值
iconst_2      // 将常量值 2 压入操作数栈
putfield v    // 将操作数栈顶的值存入字段 v 中
// 线程 2
getfield v    // 读取字段 v 的值
//写-读次序性,假设有一个被 ACC_VOLATILE 标志润饰的 volatile 字段 v
// 线程 1
iconst_1      // 将常量值 1 压入操作数栈
putfield v    // 将操作数栈顶的值存入字段 v 中
// 线程 2
getfield v    // 读取字段 v 的值
  • 那怎么确保原子性

加锁跟运用Atomic类

  • Atomic 是怎么确保原子性的,或许说怎么完结CAS的

这儿太久没碰这块代码,听到CAS蒙了,问了一下原来是说CompareAndSet。不过这儿依然是没预备,直接答复了未深化研究。

gpt:CAS底层选用CPU原子指令或锁机制来完结,多数状况选用cpu原子指令,经过硬件级别的操作来完结对一个内存位置的读写比较。

这个快的确深啊,并且这种信息不太简单记忆。作为一个了解性内容吧。并不会产生二次开发所以运用比原理要重要。

  • 你刚讲到了堆,锁,那你了解过方针的markword吗,它里边有什么信息

markword有了解,可是没有特别深。记得比较清楚的是有age 用于废物收回判断,有锁的符号位。

  • 那关于倾向锁是怎么转到轻量锁的

坦白了一下想不起来,这儿我自己虽然学习过,可是没作为重点常识预备。

markword中32位中会有几位来符号锁信息,其间包含当时持锁的线程ID

分为 无锁状况(方针无锁),倾向锁(单线程拜访有锁方针),轻量锁(多线程拜访有锁方针),重量级锁(轻量级锁无法解决竞赛问题时上升到重量级锁,借助操作体系完结锁机制)。这儿又能打开,锁竞赛原理,锁开支不同的原因。在竞赛锁时,为获取到锁的线程会进行Spin(自旋,最大10次),在无阻塞状况下测验获取锁,超越次数阈值后,胀大为重量级锁,依据操作体系的锁机制,进行阻塞式等待锁的开释,削减自旋开支(开支详细是什么?不想挖了)

运用到代码里完结常识从了解到运用的闭环:

运用synchronized 润饰办法,类来设置轻量级锁
运用 object.lock()或许可重用锁,读写别离锁,都是重量级锁
  • 说说 age在废物收回中怎么运用

这儿答复比较清晰,从废物收回分区到age增长到方针换内存区

  • 别的还问了handler消息机制

这部分主要是讲了ThreadLocal的特性,以及结合它怎么完结多线程通讯的。包含messageQueue的消息取出与履行方法。关于native层nativePollOnce机制直接回复了未深化。我也不打算深化,集中在运用层的运用上收益比较大。

  • 问了app发动流程,与发动优化

这部分比较熟,答复也还能够。之前刚整理了:Android Framework源码阅览笔记(继续更新 ,所以浮光掠影,一起本身对app 发动优化经历也比较足。

  • TLS/TCP的 部分里拥塞控制跟流量控制部分没有答复上来

了解DNS/TCP/IP/Link对前端开发者的意义

传输数据时数据包是被切成小块的(削减重传次数),切多大则是依据下面的两个战略进行平衡的。

这在承受数据方,这部分是因为在做面试预备的时分没有刻意看,导致面试的时分没有结构化的进行表述。全体能够总结为在做数据传输时,每一个tcp链接都有窗口巨细平衡每个tcp的的传输速率(分配到的带宽窗口),窗口巨细自然是动态的,经过控制窗口巨细防止单个tcp占用过大带宽,导致传输拥塞。

发送方会依据接收方允许的窗口巨细,调整自己发送的数据包巨细,防止拥塞,这一步则是流量控制。

日常开发中针对这个优化则是降低接口数据体量,做接口拆分,分批次请求等等。

  • Retrofit用过吧,说下他动态代理的完结原理

这儿的确很深,我简单说了下自己学习把握的原理概论与一些API与运用 ,因为这个要获取运转时字节码才能够搞明白。

面试官为我大方讲解了一些细节,没太记清楚,但我自己关于字节码了解还行,所以相对的给力一些临场反馈,全当学习了。当然,非常感谢他与我共享。就冲着些,这波面试现已不算白来了。

二面:TL

  • 问了组件化经历,完结方法
  • DevOps建立思路

这部分其实是在我的才能与他们现在需求最契合的部分,我也没有卖关子。直接用ipad连画带将,整个共享了一下。对便是共享了一下,结合团队技能才能,资源把握状况,项目阶段等等给出全体的建造节奏。

  • 发动优化
  • 字节码插桩
  • APP 打包流程
    这儿全体流程没有少说,可是次序是在面试官的提示下纠正下调整的。不过我也先袒露了资源文件兼并跟javac编译的次序或许记错了。
  • 线程池的的运转原理

这儿的确粗心了,中心线程,非中心线程,任务队列三个之间的扭转联系。其实很简单便是先入队再分配履行。

一个是之前学习是更多的是关注针对事务场景做配置,可是没有深化到源码去看。

  • 对IOS的了解程度,主要是CI部分

全体上仍是坚持坦白谦虚的情绪。

  • 动态Dex加载(插件化部分),问加载Dex的类叫啥

整个面试里最尴尬的就这,我忘了!彻底忘了,前两天才还开源的相关代码:时隔2年总算开源了依据RecyclerView的阅览器计划 ,就一个 DexClassLoader 愣是没想起来。

  • 分代废物收回的不同算法
  • 什么方针会被收回

其实便是GCRoot,这儿没答复特别好,忘了1-2个比较重要的。

首先是存活的线程,被存活的线程引证的方针。其次还有体系Class,被线程拜访的办法内的局部变量,被当作锁或在履行wait或notify的方针。还有一些其他的记不住那么多了,主要是用太少了。

  • 怎么完结Lint二开的,完结了那些功能

三面:HRD

  • 询问了离任原因
  • 询问我对前两轮的面试表现自我点评怎么

他们两位在各自的领域展现的才能都非常超卓,我对自己的全体点评不是特别好。但跟他们聊得蛮好,现已学到了很多常识,并且在后续沟通中对一些技能计划做了交流性讨论,这感觉非常好。

  • 我咨询了公司文明,公司前史。日常作业流程准则,绩效考核等信息。

这块相互交流了一些作业方法办法,大概了解公司现在的协作流程准则,或许是她很忙所以薪资部分还没聊就到下一面了。

四面:部门BOSS(办理技能与解决问题的闭环才能)

  • 怎么做团队人员建造
  • 参与极限开发时怎么做办理,确保项目准时交给
  • 从用户体会角度怎么优化提及类型接口长期的loading
  • DevOps是怎么建立的,做了哪些计划与组织
  • 薪资希望(坦白自己的一些预估,也表示乐意再聊,因为在现在这个薪资包范围下,小起浮我是不太在乎的)

这部分答复全体都没啥问题,本身也是我较为擅长的部分,几乎不必做太多预备。

别的延伸聊到了通勤时刻看书功率低,都喜爱看纸质书,公司同事周边租房的一些现状。

最终面试官送我到了电梯口,帮我按了电梯,我便自动握手告别,算是完毕了今日长达4小时的4轮面试。


次日补充,昨天仍是写得过于达观轻飘了。

这部分答复虽然是开放式的,但从一个办理问题出发,应该放在办理框架中体系性的进行回复,这样才能展现自己完好的办理经历。

团队scope要说清楚,以成果为导向的方针办理团队文明基调也应该打开说是怎么建立起来的

人才盘点,依据什么盘点,怎么承认招聘方针,招聘组织,面试组织,试用期组织,这都是自己做过的完好的流程

日常办理,人员组织,从知人善用出发,选用绩效考核,训练共享,以及自己在团队变大后的角色改变,团队成员单面才能超越我,我怎么辅佐他们做的更好,比方选拔为单方向担任人

项目办理,灵敏开发形式,需求评定,技能预研,工时审核,deadline形式下的区别办理

这中心会涉及到研制流程,CI等等,都能够提一下,有兴趣面试官自然会细问

自己在这个进程中做得比较好的便是带领团队全体完结从进程办理到方针办理的改变,取消了日报,改为了早晨共享今日todolist,完结方针办理方法落地

最终引出自己的底层办理思想:为团队成员服务,削减成员作业的干扰,建立团队与公司方针的链接,最终经过团队去拿成果

总结:达观承受

  • java侧针对基础技能仍是要做为重点预备,对预备的每个点做做自我穷问,能有用发现自己那块儿忘记深化。
  • Android侧 运用层常识不多,不需求花太多功夫,看看之前整理的文章就行
  • 在DevOps侧要突出表现一些,多引导面试官了解这部分内容,本身自己对这块兴趣最大,思路比较完好。

虽然不一定100%能拿offer,但这次面试非常值,远超来回100多的车费了。

可是全体面下来节奏自己把握的还不错,自己把握的东西基本都引导面试官进行了了解。针对面试没答上来的问题整理下,觉得需求深化学的现已学习了,不需求深化学的暂时也不应花精力扎进去。

依然坚持做一个失望的达观主义者吧~


阅读橘子树其他文章:橘子树的个人写作记录