前言
马上就要开始春招了,不知道各位小伙伴有没有找到自己心仪的工作呢。
最近这两年移动开发遭遇寒冬,再加上培训机构以及很多应届生的加入,很多从事Android和IOS开发的同学,都出现了工作难找的情况。基于此种情况下,这段时间基于以下疑虑打算去外面看看:
1、了解Android的互联网市场到底如何?
2、了解当前的互联网公司更需要哪方面的热门技术?
3、面对移动互联网的滑铁卢,该何去何从?
基于以上问题,打算面试数家公司,一方面了解目前的Android市场情况,一方面提升自己的面试技术,从这些面试中学得更多的知识和技能,还有把此经历分享出来,希望大家多多交流。
No.1:金蝶(云之家)
面试结果:21K,15薪,公积金缴纳比例12个点,缴纳基数20k
面试过程:面试流程总的有三面,因为当时比较忙,所以约的电面,面试的是当时的技术经理,然后约的周六技术总监面试,最后人事面。
一面:Android技术经理
旁白:百分之90的面试第一句都是来自我介绍,所以这个时候把自己的项目经历准备充分就好,这方面需要在简历里面下功夫。
面试官问:App的性能指标有哪些?
我答:App的性能指标涉及的范围比较广,比如Crash率、卡顿、内存、CPU、网络流量、耗电等等。接下来面试官有问到Android里面的奔溃率多少合适,当时具体多少我没说,我讲到了在实际开发中可以集成腾讯的Bugly来解决和统计奔溃率的问题。然后,谈到了App卡顿优化,在这块我先谈App 卡顿的一些场景,像列表(RecycleView)滚动时的卡顿问题、频繁IO导致的卡顿、主线程做耗时操作、复杂的布局设计等几种情况进行讲解,在开发中怎么注意卡顿的问题,然后讲解了怎么使用工具来定位卡顿问题,如BlockCannary、TraceView,然后稍微说了下线上卡顿的定位,可以自建APM平台收集卡顿日志,以及第三方平台听云的使用。因为时间有限,其它性能指标就没有在谈及。
面试官问:Android组件化是怎么通信的?
我答:Android组件化的通信有多种方式,比如Activity的跳转可以使用路由机制,像Arouter框架或者自己根据uri机制来实现一套路由。还有组件之间的数据通信,可以使用LocalBroadcast、AIDL等来进行通信。
面试官问:了解Socket通信吗?
我答:Socket这块聊到了TCP协议以及三次握手,还有我以前参与过的一个车载系统的APP,使用了TCP通信来采集GPS、数据流量等信息,还有TCP长连接的保活机制。因为这个项目不是我负责的哈,所以这块讲的比较浅,当时面试官提到我们项目中的TCP通信协议怎么定义的,这块没有说上来。
面试官问:Android中的进程间通信有哪些?
我答:Android进程间通信包括Binder通信、Socket通信、广播、内容提供者等等,其实,Android里面的四大组件都涉及到了进程间通信。
面试官问:我的问题问得差不多,你有什么需要了解的吗?
我答:公司目前的Android团队是怎样的?这个职位将来要负责什么项目?
面试官答:目前这边项目组Android有3个,我是这边的Android技术经理,这个职位负责的是云之家APP。然后,我问了下上班时间这些。
最后,面试结束,面试官叫我等待通知。然后,下午,人事约我复试,复试的是项目组的总监,这次我约的是下班后7点钟。
二面:技术总监
面试官问:谈谈你对Android开发中架构的理解?
我答:Android项目中的架构是与业务有关,不同的业务场景需要不同的架构支持,我谈谈之前开发过的旅游APP的架构演进:
(1)快速开发:项目初期,业务量少,这个时候使用短平快的MVC模式,可以适应快速开发的节奏。然后,顺便说到了MVP和MVVM的区别和理解。
(2)模块化:随着业务量的增长,可以把项目中的功能按照模块进行划分,模块之间的通信可以使用EventBus,并且把一些基本的功能抽成一个CommonLib模块,包含utils(工具类)、自定义控件、功能组件。
(3)组件化:项目规模越来越大之后,可以对项目进行组件化,把项目按照业务模块进行拆分,拆分出一个一个的业务组件。组件化之后,业务模块之间更加独立了。这个时候,可以很方便的把一个业务组件独立出来,成为一个独立APP。
(4)插件化:随着业务进一步的发展,有的时候需要接入合作方的APP,作为项目中的一个模块。当时,我们的旅游APP,需要把合作方的酒店APP接入进来,作为我们旅游APP的一个模块,这个时候使用插件化,把酒店APP作为一个插件接入就可以了。当然,还有一些情况,使用插件化后,可以动态升级某个功能模块以及实现功能模块的按需加载。
面试官问:谈谈你对Android性能优化的理解?
我答:性能优化这块涉及到的话题很广,可以从内存、卡顿、网络、布局、启动等方面来说,我先说说Android中的卡顿优化吧。卡顿性能优化可以分为三个过程:开发期,测试期以及线上。
(1)开发期:一方面,需要开发注意平时的代码设计,多多关注哪些方面容易出现卡顿,如ListView卡顿优化、频繁IO等。另一方面,我们可以集成一些工具来自动检测卡顿的地方,如BlockCanary。
(2)测试期:测试的同学可以把卡顿列为一个测试指标,在测试时遇到卡顿反馈给开发人员,还有我们集成多工具BlockCanary也可以在测试期检测到。
(3)线上:如果需要线上检测,那么自己可以搭建一个APM平台,来收集卡顿相关的数据然后来进行卡顿优化。当然,我们也可以使用第三方平台,如听云、OneAPM平台。
讲完卡顿性能优化后,技术总监聊了点java基础,涉及点内容没有深入,然后,问了几个非技术性问题。
面试官问:说说你的几个与工作相关的优缺点?
这个问题很多面试官都喜欢问,这个每个人的情况不同。举个例子,如英文不错,看英文的技术文档无障碍;工作认真负责;热爱新技术;喜欢研究一些深入的技术等等。缺点如,执行力有的时候不够,安排好的事情没能及时完成;做工作的时候有的时候比较专注于一些疑难问题,从而忘记了工作进度,这个时候加加班处理下没多大问题的。
ps:这个有缺点的问题尽量都能答上,如果答得不好,会大大减分,因而失去一个offer。
最后,面试官问:你还有什么问题需要问的吗?
我答:您这边项目组情况是怎么样的?有多少个Android开发的?工作时间是怎样的?
ps:面试快结束的时候,一般面试官都会这么问,当面试官提这个问题的时候最好别什么都不问,这样的话会大大减分,面试官会觉得你对他们公司不关心。但问问题的时候也不要随便问,根据不同的情况,如面试官是做技术的,我们一般可以问问技术团队是怎样,大概要做一个怎样的项目,然后,这个项目有什么规划。如果是HR,我们可以问项目情况,团队情况,上班时间等等。还有一个问题,最好问下,“贵公司对该职位有什么期望?”,这样可以了解这个职位和自己的契合度,方便以后入职。
三面:人事
人事这块问的非常详细,像上家公司做的每个项目,项目开发周期,团队多少人等等。这块根据自己以往的项目经验来说就行。一般正常来说,面到人事,差不多offer就快到手了。但是,也不是绝对,有的公司人事把关比较严格,在人事这块面挂的也出现过两次。这里来段小插曲,当时,人事问了一个问题,“你开发中遇到的技术难点是什么?”,人事问这个,当时,脑袋卡壳了,一时不知道怎么回答,不过后来缓过神来,既然是人事问题,那我就把抓着某个技术说就可以了,人事就没继续往下问。如果是技术人员问到这块,遇到脑袋卡壳,基本是挂了。在面试中,我遇到过一次,在后面的连载中继续分享。
怎个面试结束下来,就是谈offer了,我跟人事谈期望22K,不过一直没谈下来哈。
最后,说下最近的面试成果,目前拿到了多家公司的offer,知名点的如OPPO、魅族、金蝶、珍爱网等等,还有一些不太知名点的公司,如岩心、ECAR等,谈到的薪资分布在16k到30K,最高的达到30k,百分之九十分布在20k以上,当然,也有些公司没有面到最后,后续也都分享出来,希望读到的朋友们多多指教。
下面是整理的一些面试过程中Android高级知识点:
Android高级知识点
一、Android性能优化
1.描述一下android的系统架构? 2.Android线程间通信有哪几种方式 3. 如何避免OOM异常 4.Android程序运行时权限与文件系统权限的区别? 5.Hybrid 通信原理是什么,有做研究吗? 6.Framework工作方式及原理,Activity是如何生成一个view的,机制是什么 7.ANR是什么?怎样避免和解决ANR 8.Devik进程,linux进程,线程的区别 9.卡顿 {如何检测卡顿,卡顿原理是什么,怎么判断页面响应卡顿还是逻辑处理造成的卡顿} ,BlockCanary 的原理
二、Android热修复、插件化、组件化
1.谈谈对 ClassLoader 的理解 2.自定义 ClassLoader 3.插件化为什么会出现,如何代码加载,资源加载,代理 Hook) 4.如何从一个老项目一步步实现组件化,主要问思路,考察架构能力和思考能力。(需要考虑很多,每一步做什么,顺序很重要) 5.组件化和模块化的理解与区别? 6.class文件加载Dex原理 7.Gradle自动补丁包生成原理
三、Android Framework、 ROM定制、Ubuntu、Linux之类的问题
1.Binder 机制(IPC、AIDL 的使用) 2.Activity 启动流程,App 启动流程 3.Android 图像显示相关流程,Vsync 信号等 4.为什么使用 Parcelable,好处是什么 5.AMS 、PMS 6.类加载机制 7.Ubuntu编译安卓系统 8.对Dalvik、ART虚拟机有什么了解? 9.JVM内存区域,开线程影响哪块内存
四、架构设计和设计模式
1.MVC MVP MVVM原理和区别 2.项目中常用的设计模式 3.说说EventBus作用,实现方式,代替EventBus的方式 4.Fragment如果在Adapter中使用应该如何解耦? 5.实现一个Json解析器(可以通过正则提高速度) 6.从0设计一款App整体架构,如何去做? 7.Fragment如果在Adapter中使用应该如何解耦? 8.谈谈你对Android设计模式的理解
五、算法
1.手写一个冒泡排序 2.快速排序的过程、时间复杂度、空间复杂度 3.蚁群算法与蒙特卡洛算法 4.两个不重复的数组集合中,求共同的元素。 5.2000万个整数,找出第五十大的数字? 6.求1000以内的水仙花数以及40亿以内的水仙花数 7.写出你所知道的排序算法及时空复杂度,稳定性 8.二叉树给出根节点和目标节点,找出从根节点到目标节点的路径
六、网络和安全机制
1.TCP的3次握手和四次挥手 2.HTTP与HTTPS的区别以及如何实现安全性 3.App 是如何沙箱化,为什么要这么做? 4.谈谈你对WebSocket的理解 5.请解释安卓为啥要加签名机制? 6.HTTP1.0与2.0的区别 7.视频加密传输 8.https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?
七、Flutter相关
1.Flutter 中的生命周期 2.Widget 和 element 和 RenderObject 之间的关系? 3.Flutter中的Widget、State、Context 的核心概念?是为了解决什么问题? 4.State 对象的初始化流程? 5.讲一下flutter的几个特点/优缺点 6.Flutter 如何与 Android iOS 通信? 7.说一下什么是状态管理,为什么需要它? 8.说一下 BLoC 模式?
面试系统复习路线
有时候,选择比努力更加重要,机遇比奋斗更加重要。但是,机会只留给有准备的人。我们只有时刻准备着,才能在机会到来的时候,去抓住它。
这里给大家分享一下我的面试复习路线,有需要的朋友可以参考一下:
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、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
4、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三。
以上内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。