前言

年后返工往往伴随着离职大潮,相信有不少程序员朋友都想在金三银四这个招聘黄金期里找到一份更加心仪的工作。优秀的面试技巧往往能让大家事半功倍,了解面试官、公司的需求和提问套路,也是面试者突围而出的关键。还有时间,建议耐心读完全文,充分准备去拿到你的 Dream Offer。

先看一段面试对话,“大面”是一位久经沙场的面试官,小明就是今天的应聘者。一通面试下来,前面的技术问题小明都对答如流,双方相谈甚欢,接下来面试官“大面”先生却话锋一转。

请添加图片描述 面完出来,小明一身轻松,觉得总体不错,所有问题都答上了,而且气氛也不错,接下来等着二面通知吧。可是“大面”却在会议室里摇头:

“这个小明呀,技术还行,可是做事理想化,喜欢中控,跟团队文化不一致,诚信上有疑点,将来培养起来费劲呀。跟后面的人选比较一下再定吧。”

你也许会疑惑,面试官为什么这么理解呀?他是不是鸡蛋里头挑骨头?他到底想要什么样的人呢?

面试官的提问逻辑

问题之间是有逻辑关系的

面试官一旦开始提问,成组的问题之间是有逻辑关系的。下面,我们来仔细看一种问题的逻辑关系:分层。

请添加图片描述 面试提问中的逻辑关系

在这种分层问题模式中,面试官以考查经验或者技能开始,首先问一系列 表层事实,来“扫描”你的知识面和经验范围,而不是马上就想进入细节。比如“你会写 SQL 查询吗?”这层问题的回答,就要简洁精炼,不要有过多的细节,否则你会显得抓不住重点。另外,你可以用技术词汇,体现你的专业性,不用担心对方听不懂。而且,你还可以顺便扩展一下回答的范围,这有利于面试官全面地了解你。对于上面的问题,一个简单的回答可以是:“会,之前做 MySQL 开发时,写过两年的 SQL,还做过数据库调优。” 这是第一层:表层事实。

第二层,深度细节。在面试官基本了解了你的经验面和技能体系之后,就要挑一些职位需要的关键技能问深度细节了。目的有两个,一是判断你的能力高低;二是判断你的潜力和动机。比如:“能说下你做过的数据库调优细节吗?”“还有什么呢?”“这个的复杂性是什么?”“你这个做法有什么创新吗?”

这些问题的一个基本原则是:基于过去的行为(行为面试法)。你也要用经历去作答。一般的回答,是只停留在原则上,而让人眼前一亮的回答,是会用具体事例描述细节的。这样面试官才能了解你真正的做法、想法、质量,而不是认为你在照本宣科。

在细节的描述上,可以使用 STAR 法则,即 Situation(情景)、Task(任务)、Action(行动)和 Result(结果)。情境指要解决的问题和背景;任务指要承担的责任和角色;行动指方案和做法;结果指效果和意义。具体如何回答清楚技术问题,如何回答到位,我在后面的文章中会专门介绍。从这些细节中,面试官可以看出你的能力级别,还能体会到你的潜力和动机。

在这层,面试官可能会用些“小花招”。比如,毫不留情地指出你的错误做法和不良影响,考查你在被挑战的情况下,能否保持冷静、理性作答;他还可能故意装作没听懂或者没记住的样子,让你重新再讲一遍,验证你的表达有没有进步,前后说法是否一致;很多情况下,面试官为了真正测试出你某项技能的极限,会一直问到你回答不上来为止。所以,即使有些问题你没回答上来,并不表示你不合格,这只是正常的能力测试而已。

第三层,在面试官充分了解了某段经历和技能之后,可能会继续问下一层的问题:感受和观点。这也是考查你的潜力和动机,包含事后的总结和改进有没有到位,是否具有成长型思维。比如“这段经历你感觉最折磨人的地方是什么?”“你满意这个方案么?” “你学会了什么?”“为什么你当时要接手这个任务?”“你怎么评价你的队友?”这类问题很难回答。你的回答会包含大量的价值观、性格品质等信息,如果之前没有总结过的话,你的回答可能没有深度,而且如果只是表态的内容(比如“我为了团队愿意做任何事”),没有事例去讲的话,也不会让面试官感动和信服。

这三层问题,从专业或者技术问题入手,层层递进,能覆盖到应聘者素质模型的四层内容。对应关系如上图所示。

问题背后的意图

正因为面试官的问题之间是有逻辑关系的,并非孤立和没来由的,所以我们得到一个启示:碰到意外的问题,不要意外,先想下为什么面试官问这个问题。

碰到古怪的或者出乎意料的问题,可以利用前面的问题和自己的表现,分析为什么,以及这个问题的意图是什么。

比如,面试官在你回答完一系列关于项目成果的问题之后,突然问你:“你觉得你的同事能力如何。”你如实回答:“他们比我早进入项目 2 年,经验丰富,能力很强。”然后面试官开始追问你:“那刚才那些项目成果有多少是你独立完成的?”你恍然大悟:刚才在表述成果时,说的都是你做出了什么,面试官怀疑你把别人的功劳说成了你的。如果在回答项目成果时,加上和同事合作的说明,就不至于被面试官追问了。

可以看到,只有了解了问题的意图,才能回答到位。这也是我们这个专栏的目的,后面的文章会就具体的问题类别,给出详细的分析。

应聘者的素质模型

应聘者的素质模型 请添加图片描述

这个模型基于冰山模型,把面试关注的要素划分为四个层次:经验、技能、潜力和动机。下面我们从上往下,逐层了解。

1. 经验(Experience)

经验是指工作经历的对象和产出,体现为专业相关的知识和思维结构(Idea),用来指导思考和行为。

比如“我有 3 年 Java 开发经验,完成了一个 B2C 的线上商城系统”,这是说,在 3 年的经历中,你的工作对象是 Java,产出是 B2C 的线上商城系统,表明你具有 Java 领域的编程经验,和 B2C 类的线上商城系统的开发经验。

但是这不能表明你做得有多好:经验的时长,不一定跟能力强弱直接挂钩,同样的工作内容重复 100 遍,与 10 遍相比,能力增强不了多少。

但是在众多的职位描述中,公司把经验要求写成“至少 3 年的 XXX 经验”,这种写法相当普遍,因为这基于一个普遍认知:一个智力中等的候选人,在一个技术拓展速度适中的工作中,3 年就可以达到独立、熟练工作的程度;如果是“5 年”,那就能带领别人完成工作了。

2. 技能(Skill)

技能是做事的能力,体现一个人的专业性。技能可以让你基于已有的经验,运用新的工具、技术达成产出,形成新的经验。具体到软件产品研发领域,技能有技术、业务、管理等多个方面。技能和经验经常被放在一起谈:“3 年 Java 开发经验”是指经验,“精通 Java 多线程编程”是偏向技能。经验和技能,都是你习得的“现货”,但是技能分高低,表现在

产生 idea 的技能: 针对问题,基于经验,收集、理解、分析和制定新的方案(idea),涉及理解、思考、沟通等过程。

执行 idea 的技能: 运用工具,把方案(idea)应用到实践,从而解决问题。除了用到理解、思考、沟通,还需要协作团队、管理资源,甚至领导和影响他人。

面试官希望,你库存的经验技能,与职位的要求匹配度越高越好,也就是所谓的“对口”。

“库存”不足,自然不能满足工作需求。但假如你的“库存”大过了该职位的问题域,公司需要提供“多余”的薪水,而且如果那部分超出的经验和技能,公司又用不上,就成资历过剩了,这时公司会有两点顾虑:一是公司提高了用人成本,二是员工屈才,工作稳定性不好。

3. 潜力(Potential)

虽然心理学上关于“潜力”“潜能”有很多定义,但术业有专攻,我只在考查应聘者素质的场景下,说一下我的理解。

我这里说的“潜力”,是增长经验和技能的能力。“潜力”在面试中被高频关注,因为当一个应聘者经验和技能不够职位要求时,我们会考虑他的潜力。如果他能很快提升技能达到要求,公司是乐意培养的。

关于潜力,面试官可以通过考察应聘者的学习、创新和精益能力来做判断。“学习”指的是从不会到会,掌握一项技能的过程;“创新”是针对特定场景创造新事物的技能;“精益”是把事情越做越好的技能。

如果你承认潜力,那么就说明你有成长型思维,有成长思维的人认为:技能是可以通过努力获得的,关键是要保持好奇心,平时爱思考、总结、尝试,愿意接受挑战,不怕错误和失败。因此,要在潜力上为自己的面试效果加分,你就需要注意如何在言谈及简历描述中体现这些特质。

4. 动机(Motivation)

最下层是“动机”,指的是做事情的内心目标、意愿和态度。很多事情我们不是没有能力做,而是被不想做、觉得困难等心理因素扯了后腿,这就是动机不足。

因此,要想做成事儿,动机的作用非常重要。而且,“动机”决定着应聘者的潜力发挥、技能习得和经验形成,也就是说,动机决定着素质模型上面的三层。

动机的表现是什么呢?日本著名的企业家稻盛和夫在《干法》一书中,按动机区分了三类员工:

自燃型,也就是自我驱动的员工,他们做事动机强烈,目标明确,明白任务的意义,甚至自己寻找有意义的事,满怀激情地投入,往往超出自己的工作范围,去推动进展,取得成果,然后又奔向下一个目标。“鸡血”满满有木有?

点燃型,这类员工需要一定的激励,需要他人帮助才能找到目标和意义,一旦“激活”就能像自燃型员工一样奋力工作。

阻燃型,这类员工当一天和尚撞一天钟,给多少钱,干多少活,按工作的最低标准和最后完成时间递交任务,跟同事合作差,不乐意分享,自我保护。

很明显,公司当然喜欢自燃型员工,可是那些面试中慷慨激昂、热血沸腾的应聘者,就一定是自燃型员工吗?不一定。自嗨不是自燃,面试官得拨开现象看本质,了解是什么因素决定动机。有什么因素呢?

人格品质,比如诚实守信、认真负责、坚毅勇敢等。这些从底层决定我们的做事动机。

职业价值观,就是在工作中区分是非、明确轻重的观念。比如,有人喜欢轻松安稳的工作,有人喜欢冒险和竞争;有人喜欢照章办事,有人则喜欢灵活自主;有人追求个人利益,有人则喜欢分享和帮助他人。

小提示:不同的企业文化,对员工的职业价值观要求也不同。面试官希望你的职业价值观和团队文化一致,即所谓的“味道”相投。大家有相同的信条,才可以合作共事。

职业性格,是长久的思维和行为习惯,受环境影响固化成的心态“定势”,比如内向、感性等。面试官希望性格多样,但要与职位性质相契合。举个例子,内向的人做销售恐怕不适合。(MBTI 是一个主流的职业性格模型,这里就不细讲了。)不过,一个团队包含多种职位,职业性格最好多样化,这样大家工作在一起才能碰撞出火花,进而互相补充,共同进步。

只通过面试,来了解一个人的人品、职业价值观和职业性格,谈何容易。但是寻找“志同道合”者又非常重要。除了问你“为什么要跳槽”“为什么选择我们公司”等直白的问题,很多情况下面试官不仅要听你的“表白”,更要从你的一言一行中寻找蛛丝马迹。

总体来说,在应聘者的素质模型中,经验、技能、潜力和动机是下层决定上层的关系。技能形成经验,潜力决定技能增长速度,动机又决定潜力、技能和经验的发挥。面试中对这四层的要求,因职位要求不同而不同。

如果是招有经验的人选,希望他入职后就能快速接手工作,会较多关注他的经验和技能层面。而对于校园招聘,因为学生普遍缺乏经验和技能,对其动机和潜力等基本素质的考查就成了重点。

如何进入大厂,我总结下来就是:

  • 脱离小厂思维,按照大厂的技术标准来要求自己
  • 整理核心技能树
  • 潜心修炼一

下面分享一下各个公司的面试题目

接下来是面试题:

公司一

1.组件化和arouter原理 2.recyclerview和listview区别

  1. glide流程,缓存前压缩,缓存命中 4.APP性能优化,内存优化,布局优化,绘制优化,内存泄漏 5.Http和Https区别 6.socket心跳包
  2. jvm虚拟机,堆和栈的结构
  3. 8.activity启动模式,有哪些不同
  4. 9.stack栈的特点,自定义stack结构10.kotlin优劣势

公司二

1.自定义view,中英文字符串宽高测量显示,测量算法,可扩展性 2.事件分发机制 3.Activity,view,window联系4.热修复和插件化原理 5.Synchronized底层原理,java锁机制

  1. java容器,hashmap和hashtable区别,hashmap原理,扩容流程,扰动算法的优势 7.ArrayList和LinkendList区别,List泛型擦除,为什么反射能够在ArrayList< String >中添加int类型 8.Http和Https区别,SSL/TLS过程 9.Android性能优化
  2. jvm虚拟机,堆和栈的结构,栈帧,JMM11.组件化注意点,组件间通信机制 12.线程安全的单例模式有哪几种13.熟悉的设计模式

公司三

1.MVC,MVP,MVVM 2.Activity和fragment生命周期区别,fragment正常添加和viewpager添加的区别, fragment 懒加载原理,FragmentPagerAdapter和FragmentStatePagerAdapter 3.热修复和插件化 4.友盟bug统计,混淆后怎么定位bug。没接入热修复的APP中,上线后遇到bug怎么解决 5.view绘制原理(可以先说下基本view绘制,然后再说下屏幕刷新机制)6.使用Analyze减少APK体积,原理 7.Android 版本差异

公司四

1.基础类型字节,汉字占几个字节,线程和进程 2.四大组件,fileprovider和Contentprovide区别,activity启动流程 3.MVC,MVP,MVVM 4.TCP三次握手,四次挥手 5.Eventbus,glide原理 6.性能优化,内存抖动,内存泄漏,内存溢出, handler机制,lntentService和handlerThread,子线程更新view内容的方法 7.GC回收算法 8.recyclerview和listview区别 9.组件化,模块化,插件化,热修复 10.工作中遇到的难题怎么解决的 11.Kotlin Java优缺点,kotlin什么时候用分号,run,with,apply,内联函数, 高阶函数 12.APK体积优化13.进程间通信 14.单例模式,哪些是安全的15.retrofit设计模式 16.自定义view 17.是否做过音视频和IM? 18.APK性能优化 19.CurrentHashMap1.7和1.8区别 20.volatile关键字的作用,怎么保证原子性呢? 23.java泛型,协变和逆变

公司五

1.HTTPS具体步骤 2.常用的设计模式,代理模式和装饰者模式区别 3.服务端返回错误的json数据,客户端怎么自定义model,避免出错 4.Hook技术 5.kotlin了解,协程 6.屏幕适配 7.抓包工具使用和原理 8.网络优化 9.未来期望,对公司的了解 10.Okhttp,rxjava,glide,retrofit等原理,okhttp底层数据传输原理,http 报文体结构 11.APK体积优化 12.Android jetpack使用和原理,新技术看法 13.crashHandler获取应用crash信息 14.recyclerview和listview缓存区别 15.Android常见崩溃问题分析及一般的解决方案 16.NestedScrollView触摸机制,AOP相关知识 17.设计APP,整体架构选型 18.Android沙盒和底层Linux通信 19.ACTION_CANCLE什么时候触发 20.线程池原理

公司六

1.组件化,arouter,组件化UI,还有哪些路由框架。AS调试方法 2.MVC,MVP,MVVM,Jetpack 3.JVM,JMM,java加载对象的步骤,classLoader,GC回收算法 4.插件化和热修复 5.唯一安卓ID,安卓安全的知识,加密算法,判断activity前台进程 6.TCP三次握手和四次挥手 7.hash算法,hashmap,怎么解决hash冲突 8.加载大图,glide缓存机制,设计模式,双重检测的单例模式为什么要检查两次,自己设计图片加载框架思路 9.启动未注册的Activity 10.AOP,蓝牙开发,IOT

  1. glide缓存清除: Irucache算法 12.glide缓存文件太大,查找效率慢怎么优化? glide下载高清图片优化 13.最近研究的技术,遇到最难的事,对公司的期望

公司七

1.组件化, arouter优缺点 2.MVC,MVP,MVVM 3.项目中的亮点,对架构的理解 4.handler原理及相关知识点,message回收策略

  1. hashmap原理,arraymap原理,对比性能。
  2. hashmap为什么大于8才转化为红黑树,加载因子为什么是0.75
  3. Synchronized底层原理,java锁机制 8.服务和广播 9.activity启动模式(给例子具体分析,A(标准)-》B(单例)-》C(singleTop)-》D(singleTask),分析有几个栈,每个栈内的activity) 10.常用设计模式,线程安全的单例模式

公司八

1.static、final;继承与多态 2.组件化, arouter优缺点 3.context相关知识点 4.handler原理及相关知识点,handler缓存池大小。5.性能优化,启动速度优化,架构 6.java虚拟机与Dalvik和ART区别 7.Kotlin协程,扩展函数和属性以及伴生对象 8.电商APP的首页,怎么设计一个APP架构 9.MVP中数据请求为什么要和M一起,答:网络请求和javabean都是数据 模型相关 10.Glide的存储EngineKey是怎么保证唯一的。面试官答:有个队列会将 EngineKey存储起来,每次生成后进行对比存储。这个我在源码中没找对位置,如果知道的同学,麻烦帮忙解释下。 11.retrofit是怎么将service接口转化为我们需要的javabean的?12.怎么做管理,新技术学习

公司九

1.SqLite与contentProvider区别 2. fragment周期,两个fragment切换周期变化,fragment通信

  1. https证书校验,加密相关,网络请求框架
  2. glide加载流程,大图显示,图片大小计算
  3. view绘制(从onSync()开始) 6.线程内存模型,线程间通信 7.获取view的宽高,更新view的方式,主线程消息机制 8.OOM,内存泄漏,内存溢出,java引用类型,ANR分析 9.APP性能优化,webview相关,webview优化,webview中Android与js互调 10.插件化和热修复

第一章 Java基础

  • 静态内部类和非静态内部类的比较
  • 多态的理解与应用
  • java方法的多态性理解
  • java中接口和继承的区别
  • 线程池的好处,详解,单例(绝对好记)
  • 线程池的优点及其原理
  • 线程池的优点(重点)
  • 为什么不推荐通过Executors直接创建线程池
  • 不怕难之BlockingQueue及其实现
  • 深入理解ReentrantLock与Condition
  • Java多线程:线程间通信之Lock
  • Synchronized 关键字原理
  • ReentrantLock原理
  • HashMap中的Hash冲突解决和扩容机制
  • JVM常见面试题
  • JVM内存结构 在这里插入图片描述

第二章 Android基础

  • Activity知识点(必问)
  • Fragment知识点
  • Service知识点
  • Intent知识点 在这里插入图片描述

第三章 UI控件篇

  • 屏幕适配
  • 主要控件优化
  • 事件分发与嵌套滚动 在这里插入图片描述

第四章 网络通信篇

  • 网络协议 在这里插入图片描述

第五章 架构设计篇

  • MVP架构设计
  • 组件化架构 在这里插入图片描述

第六章 性能优化篇

  • 启动优化
  • 内存优化
  • 绘制优化
  • 安装包优化 在这里插入图片描述

第七章 源码流程篇

  • 开源库源码分析
  • Glide源码分析
  • Android面试题:Glide
  • day 20 面试题:Glide面试题
  • 聊一聊关于Glide在面试中的那些事
  • 面试官:简历上如果写Glide,请注意以下几点…
  • Glide OOM问题解决方法汇总
  • OkHttp源码分析
  • Okhttp连接池复用机制
  • Okhttp 流程和优化的实现
  • 一篇让你受用的okhttp分析
  • OkHttp面试之–OkHttp的整个异步请求流
  • OkHttp面试之–HttpEngine中的sendRequest方法详解
  • OkHttp解析大总结
  • Okhttp任务队列工作原理
  • Android高频面试专题 - 架构篇(二)okhttp面试必知必会
  • Android 网络优化,使用 HTTPDNS优化 DNS,从原理到 OkHttp 集成
  • Retrofit源码分析
  • RxJava源码分析
  • RxJava原理与源码分析 在这里插入图片描述

第八章 新技术篇

  • 实战问题篇 在这里插入图片描述

第九章 面试篇

  • 开源文档
  • 面试题合集 在这里插入图片描述 由于文章篇幅有限,文档资料内容较多,需要 Flutter资料、《2022最新Android面试真题+解析》、数据结构与算法面试题、Java 面试题、Android四大组件、Android 面试题、UI控件篇、网络通信篇、架构设计篇、性能优化篇、源码流程篇、 Kotlin方面、第三方框架、大厂面经,可以【点击这里免费获取】,希望能够共同进步,共同学习,共勉!

总结

简历上写的东西,一定要先搞懂,特别是简历上的专业技能。这次面试收到的最多反馈就是:基础知识不够扎实,技术深度不够。现在Android开发大部分需要懂点C++和Linux知识,大厂也需要刷算法面试题,在后面的学习过程中,我将从以上几个方面着手。当然也必须把基础知识学牢固,技术深度搞深入点。 最后祝大家都能拿到心仪的offer!