Android 开发面经,历时两月斩获BAT+头条四个公司 Offer

拿了 BAT+头条 四个 offer;同时也在帮公司招聘,筛选简历并面试。对技术面试这回事有一些体会,在此分享。git

 

坦白说,我对我我的在此次求职中的表现并不十分满意,面试前没有作足够充分的准备——数次被面试官出的题目“虐”、应对面试的压力时没能作到沉着冷静、在面试中未能完整地把本身的积累与优点表现出来……因此本篇文章并非一个“成功者”的经验分享,而是一个普通人经历过各类面试后的一个总结与反思。程序员

1、面试前的准备
1.1 简历
在替公司筛选简历时我对同事说,简历是向陌生的招聘方展现本身的第一途径,假如简历都没好好写,那么要么态度不行要么肚子里没货。github

筛选简历时的常态是看到“履历通常、项目经历通常、没亮点”的简历,100 份中大概有 80 份是这样的。而招聘方要把这 80 我的拉过来逐个面试显然不现实,所以假如由于简历没好好写被划分进这 80 我的中,那么最后可否得到面试机会就只能看运气了。面试

我不是有经验的 HR 没法给出“很是漂亮”的简历标准,下面简单说说我我的认知的简历及格线标准:算法

信息完整。姓名、电话、邮箱、在校经历、公司经历、项目介绍等等,其实有不少大神早就写过 N 篇关于简历信息的文章了,我我的比较喜欢 Trinea 大神分享的简历模板《推荐 3 个简历模板及 2 大加分技巧》 。
展现本身的亮点。我明白不是全部人都有好的学校背景、好的公司背景、好的项目经验背书 —— 假如你有,是个优点,但没有的话,聪明的你应该会想办法从其余方面给本身加分。好比长期维护技术博客、博客言之有物,好比参与开源项目,好比作过一些我的项目等等。固然这些非一日之功,须要你平时的努力(不要想着在求职前随便粉饰包装一下,言之无物的博客或 github 反而会留下很差的印象)。个人理解是,其实招聘方也很苦恼,从 80% 的千篇一概的普通简历中想要筛选出能力好的人很是很是难,这时你能用这些亮点做为敲门砖无疑就能脱引而出。(PS: 有好的博客或 github 千万记得写在简历上且能够写在显眼的位置。在筛选简历过程当中曾碰到一我的简历上没写这些,幸亏他是朋友推荐特地给我发来了他的博客地址,不然单看他很是通常的简历他就失去了面试机会)
诚实靠谱。可能有人会问,假如我既没有好的经历也没有亮点怎么办?那就踏踏实实把本身的优点写出来,好比擅长 UI、对网络层有深入理解、有自研 IM 的经历等等。大部分程序员都是靠谱、理性的工科男,简历写得诚恳踏实每每更能获得青睐。不要浮夸甚至造假,踏踏实实把本身基本信息展现出来就好。对写上简历的技术点要有必定了解,简历上写了一堆技术点结果问了却说不熟确定是很减分的。(PS:慎用“精通”)
另外,我我的在写简历时有一个还未作到的点是及时更新简历。对于几年前的项目早就记忆模糊了,几年后再尝试回忆项目细节写进简历其实很难。因此最佳方案是项目结束后及时把收获更新进简历里。小程序

想学习更多Android知识,或者获取相关资料请加入Android技术开发交流2群:862625886。本群可免费获取Gradle、RxJava、小程序、Hybrid、移动架构、NDK、React Native、性能优化等技术教程!安全

1.2 基础复习
对于基础复习我此次最大的感触就是,必定要早点作准备同时也要作全面完整的准备。性能优化

举个例子, Java 中很是基础的的四大引用。对 Android 开发来讲平时可能用弱引用比较多,但真正做为面试题来问时面试官但愿你能立刻回答出四大引用分别是什么以及各自的使用场景。假如你能立刻回答出四大引用的特色及使用场景固然是合格的回答,假如你不止回答出四大引用的特色还能联系到 ReferenceQueue,继而延伸到在 leakcanary 的使用,那就是优秀的回答了 —— 但假如你被提问后一脸懵逼,说本身只记得弱引用,就会比较尬(固然就这个知识点而言,我做为面试官的角色时还会尝试“抢救一下”,由弱引用的使用延伸到内存泄露去,不会直接断定应聘者)。网络

由于在“面试”这个场景里,面试官会默认你作了足够的准备,对于一些中高端职位基础题实际上是做为送分题问的,固然但愿你能快速反应、快速回答。而人不是机器,许久没用或者没复习的技术点想要在短期内回忆起来并概括成 N 个点说出来难度很是大。 因此基础技术的面试其实就跟应试同样,任你功力再高,也有必要好好复习一下。毕竟“武功再高,也怕菜刀”嘛(不恰当的比喻,哈哈)。数据结构

基础复习能够分为两大块,一块是 Android 和 Java 基础,另外一块是计算机基础,也就是算法、计算机网络、计算机原理等。对于前一块,经验丰富的你通常花半个月就能够搞定;但对于后一块,时间上就很差估计了(网上有很是完整的各类面经和题库,聪明的你确定具有最基本的信息检索能力,这里我就不贴连接了)。

这里我把我本身做为反面教材:因为前期对是否要跳槽犹豫不决,因此没能早点进行充分的准备,致使后面碰壁后须要在短时间内急急忙忙去复习,其中的压力可想而知。

我的认为比较舒服的姿式是,无论跳槽与否,一些基础的东西在平时就能够有计划地复习,特别是刷算法题 —— 任你算法功力再高,没有通过必定的训练想要在面试这种场景下快速手写出 bug free 的代码也几乎不可能。

1.3 项目复习
社招跟校招的一大差异是,社招中的基础题部分只是前菜,招聘方会很是重视你的项目经历,经过询问项目经历会扩展到对技术、学习能力、沟通能力等的考察。

关于如何复习项目,从面试状况看,能够从整体架构、项目细节、项目亮点、碰到的问题以及场景复述等方面入手。

整体架构和项目细节不用过多解释,前者是从宏观角度向对方介绍你的项目的架构,用最短的时间让对方理解项目经过哪些模块或组件间的协做去实现功能的;后者是对方可能会提出一些感兴趣的点询问你项目细节 —— 因此千万记得认真掌握项目关键细节,不然答不出来会很尴尬。

项目亮点和难题则是面试必备,基本大部分面试都会问到这块,无他,对方不了解你的项目的状况下确定但愿你能展现出能够为本身加分的点。

1.4 简历投递
准备得差很少后就能够开始进入简历投递环节了,我以为简历投递的途径的优先级是这样的:熟人内推 > 优秀猎头推荐 > 普通网友内推 > 普通猎头推荐 > 官网投递。

假如你的简历光芒闪闪,阿里星那种级别,那随便投递均可以很快有响应,不然投递的途径仍是很重要的。

熟人内推固然是第一选择,经过熟人你不止能够知道部门内部的业务发展、晋升、加班等状况,在走流程时也能够经过他直接接触到你的将来 leader。而为何优秀猎头的内推会比普通网友内推要好呢?我我的的感觉是优秀猎头会比普通网友更了解招聘状况且能更积极得帮你催流程,而真正优秀的猎头,在对公司总体信息的掌握上是高于普通员工的。

2、面试中常见的考察方向
面试中要沉着冷静、面试前要确认面试时间并提早到……这些啰嗦的小 Tip 我就不说了,聪明的你必定能注意。这里我尝试总结一下碰到过的常见的考察方向(或者说“题型”)。

2.1 算法
对于算法的考察,从我的有限的经验上看,貌似难度都是适中的。特别是对于咱们客户端开发而言,考察的算法都比较常规。(呃,某些很注重这块的公司除外 —— 固然注重这块也是好事,咱们只能去适应公司的风格而不能要求公司适应咱们)

算法这块我也是“低手”(这块强的同窗能够留言教授一下比较好的学习方案),多学习多练习吧。

此次求职中,比较高频的题目是"第 TopK 大的数"(快排思想、能提到线性查找算法 BFPAT 更佳) 和 “前 TopN 个数” (堆排序、先分治再堆排序)。

2.2 技术基础
就像面试前咱们准备的,基础题基本是必问的,就算不深究 Android 的基础,问你一些计算机网络的东西不为过吧。这块咱们必须拿出校招时的劲头来,老老实实复习。至于具体的题目什么的我就不罗列了,网上有一堆面经,github 上也有不少整理好的题库。

对 Android 开发来讲,能够分红两块,第一块是 Android 相关基础。跟初级开发的面试不一样的是,这里的基础不会是简单的“四大组件是哪些”,而是会问你具体的使用和碰到的问题。好比四大组件的考察会结合 ANR(四大组件是否都会产生 ANR、时间是多少等)、进程优先级、启动模式 等等一块儿问。网上的面经和题库命中几率仍是蛮高的,大部分题目都似曾相识,毕竟 Android 经常使用知识点也就这些。固然不要所以掉以轻心,优秀的面试官是会针对细节深刻挖掘的,因此不止要“知道”,还要“理解和掌握”。

另外一块是计算机网络、计算机原理等。对客户端开发来讲,计算机网络的考察会比较多,TCP 和 UDP 的区别、TCP 的拥塞控制、TCP 的握手与挥手流程、HTTP 与 HTTPS 的差异等等。基本面的全部公司都问到这块了。

这块须要特别注意的点就是你的覆盖面是否足够,由于不一样公司的不一样部门的不一样面试官均可能会有不一样的提问姿式。你不完整系统得把基础过一遍,真不能保证你能信心十足(一两个问题被问倒其实没什么,但能不被问倒更好不是)。

我能够举几个例子,好比在问大图加载时顺口问一下“同一个文件,放到 drawable 目录下和放到 SD 卡中,加载到内存时内存占用同样么” (这里涉及到了 Bitmap decode 时的过程以及 Bitmap 内存占用的计算),好比 HashMap put 方法调用时内部的流程是怎样(方法内部的流程、HashMap 的扩容等),好比 Http 1.1 和 2.0 的特色和区别 —— 这些例子都是我或者我朋友真实碰到的面试题,在没通过充分的面试准备以前,你能答出多少呢?

2.3 技术原理
通常这类问题是在问基础题时顺势往底层问,或者是你本身在回答时顺便带出来,好比屏幕绘制原理、几种动画的原理、布局加载原理等等,是体现我的的技术深度的。

我以为这类题目不是死记硬背能够解决的,做为面试官,天然有办法考察出你是“了解”仍是“理解”。

其实系统地复习这些内容自己也是挺有趣的,你会很容易发现技术背后的实现存在深层的联系。因此这块不仅是面试题那么简单,它也是咱们之后往“资深开发者”走的一个方向。

回答这类问题,主动比被动更好。通常面试官问你很基础的问题时,你固然能够惜字如金只回答对应的答案,但假如你能主动扩展到原理层面、甚至隐晦地表示你看过源码,要我是面试官也会喜欢你(斜眼笑)。

2.4 项目架构和模块设计
我一开始也没有经验,面爱奇艺时让我介绍项目我就简单介绍了下项目需求是怎样,能够看出面试官并不满意。后面专门向一个牛逼的前同事请教了这个,他的建议是注意介绍项目架构,后面面其余家时,果真感受轻松了一些。

无论是作业务开发仍是作基础技术开发,对于整个项目的架构必定要了解。比较常见的状况是面试官会让你画出架构图。固然,就算面试官只是让你介绍项目,你也能够主动介绍项目的架构 —— 这能够体现出你对架构设计的关注。

我我的由于经历独特,因此有机会在公司接触几个项目的架构,同时能在从零到一的新项目中尝试本身设计架构并做出各类调整和优化。但没有这方面经历的同窗也没伤心,就算是只作很小的业务,你也能够主动去了解整个项目的架构,思考优缺点并考虑改进。个人理解是,对架构有思考的同窗比单纯作业务熟练工会更受欢迎。

另外一块是模块设计能力。我记得在面百度时有个面试官是为架构组招人,当场让设计一个线程安全的高效的数据处理模块(当时没答好,惭愧);后面在面蚂蚁时也有让设计一些模块。这块我以为就是多积累,多看开源项目。目前我也没作得很好,后面会花精力去专门研究。

2.5 项目优化
我上一次正儿八经面试仍是找实习时,因此刚开始我对面试的理解仍是停留在展示本身“能作事、能力强”,而此次求职给个人收获是,基本全部公司都会考察项目优化能力以区分普通开发和注重项目质量的开发。

项目优化能够是架构重构,也能够是内存、卡顿优化、电量优化等细节优化,还能够是开发效率的优化等等。

这块的博客不少,好比胡凯大神的《Android性能优化典范》等,光了解不够,要实操,要有具体的场景和优化后的结果。

3、各大公司的面试
我有一个习惯是,每面完一家公司后都会把具体的问题记录下来,把不会的题目当天解决 —— 你还别说,后续的面试还真让我碰上了以前的题目。固然我不会事无巨细,主要是记录本身不大确定或不会的问题。

下面我简单介绍一下经历过的几大公司的面试过程。

3.1 爱奇艺
爱奇艺是现场面的,效率很高,当天面完全部流程。算了下大概有四面技术面 + 一面 HR 面。

一面是 Java 和 Android 基础,面试官多是 Java 开发出身,对 Java 方面的东西问得很细,好比堆和栈的区别、栈帧里记录了哪些信息等等。Android 方面的问题比较常规。

后面几面比较注重项目,大概流程是先问了不少项目细节,中途穿插了一些算法、计算机网络的题目。

3.2 滴滴
滴滴一面主要是技术基础,问得很是细。好比会问到 git cherry-pick 和 git hook,还问到 inSampleSize 为何是 2 的幂等等。

二面和三面是去的现场面,主要是项目相关,以及一些视频相关的优化。

3.3 百度
百度总体求职体验很好,面试官的问题以及沟通都很 nice,就是从住处去张江面试实在太远了。。。

一面是 Android 基础,二面会比较注重项目优化,三面是问了项目的架构设计并当场给了一道模块设计题目,四面主要是项目相关。

我在上文的反思中有不少都是来自在百度这里踩的坑,面试官会比较注重项目优化、注重架构和模块设计能力,发现了个人知识体系上很多漏洞,很是感谢那几个面试官。

3.4 蚂蚁
蚂蚁总体流程是一周一面的节奏,会有三到四面技术面 + 一面 HR 面。

蚂蚁面试的特色是会偏业务一点,但接触过的几个面试官中你能感觉到对方思惟敏捷、很聪明。好比在让你介绍项目时,会在询问细节的同时忽然给你一个相关的场景让你作一个模块设计。好比在你絮絮不休说一堆时能及时发现你的回答不许确。

而 HR 面的过程比较专业,除了一些常规的问题外还会问你以前工做的一些细节等。

考察的内容主要是项目、基础,有些面试官会问计算机网络的问题,或者一些常规算法题。

3.5 腾讯
腾讯的面试过程是很舒心,也是一周一面,但全程会有 HR 短信通知,总体很人性化。

大概是三面技术面和一面 HR 面。一面和二面都是技术基础,有很多计算机网络和算法题(固然也是比较常规的算法题),后面的 GM 面试则是不拘泥于 Android 范畴,会问“你的优点是什么”,“对来深圳工做有什么难处”等等。

3.6 字节跳动
字节跳动是三面技术面 + 一面 HR 面,有趣的是三面都是视频面试,虽然应聘的部门就在上海,但不须要赶过去现场面。

并且总体流程很是专业:面试前会有专人打电话约时间、面试后会及时通知你面试结果并约下一面的时间、面试中是在牛客网上视频面试(网站上配置有白板能够写代码)。

再说面试内容,字节跳动或者说咱们熟悉的“头条”的特色的确是面试过程当中算法比重很高,但面试官毫不是无脑问算法题。好比一面问的算法题是线段树 —— 这个数据结构个人确不熟悉,但面试官在提问过程当中不断引导和考察其余方面的东西,我能比较好得回答出来,最后虽然没有命中最优解“线段树”,但仍是让我过了。

最后再强调一下,我没有把全部面试题所有罗列出来是由于这几个公司的面试题都算比较常规,只要你按照我上问说的那些踏踏实实去准备了,基本绝大多数均可以命中。

4、面试后的感觉
先来谈谈招聘行情。这几天恰好有传言称华为冻结 HC,也有说阿里也准备不放 HC 了 —— 都是传言,真假有待考证。无论真假吧,在各类互联网寒冬的论调络绎不绝的当下的确会影响不少人对行情的判断。而“Android 将死”的文章反复出现更是让人有些慌张。

但就我求职时的感觉看,客户端招聘行情不是变坏,而是变好。在招聘热度很高的七八月份时,打开 V2EX、打开行业交流群、打开领英,有很大部分都是客户端职位;字节跳动校招时甚至特地发了公开信劝说应届生投递客户端岗位,并给了三个月签字费的奖励。整体看客户端岗位是供少于求的,跟同行讨论,“招人难”的状况远大于“求职难”。 因此我以为后续不用太悲观。

而后说说这些面试的感觉,从结果看,此次求职经历彷佛不错,但只有我本身知道过程有多煎熬……因此我写了这篇文章,好好复盘一下。

别看我上面几节说得头头是道,其实这些都是创建在我血和泪的教训上的反思和总结啊。(便宜读者了,哈哈)

如今想来,此次面试经历收获良多。在准备面试时你会发现有多少知识点你是没有十足把握的、在被面试官“教作人”时你会发现你我的的知识体系存在很多漏洞、在面试事后你也能够得知外部的环境中你的价值几何 —— 不是在“教唆”跳槽哈,跳槽必须是通过深思熟虑的,而面试,你能够做为一个自我检验的过程(固然面一个公司前请思考是否有去入职的可能性,不要轻易去面试,对方公司招聘也是有成本的)。

检阅本身以后我会作一些学习计划以补上本身的短板:

算法这块每次急急忙忙去复习太难过了,后续准备先花必定时间把全部常规算法系统学习和复习一遍,同时计划按期练习算法题保持“手感”。
技术基础与技术原理。虽然经常使用的技术点就那些,但未用到却重要的技术点是无穷尽的,特别是技术原理这块比较系统的文章不多、很是少(后续准备写一系列基础和原理相关的博客,这里算是立下 flag)。
架构设计和模块设计,这块很少说,是全部中高级开发必学的东西。
以及一些还未十足掌握的点,好比客户端中比较少碰到的复杂环境下的线程安全问题。
目标就是一个,未雨绸缪,把本身没有十足把握的技术点练到有充沛的信心为止,后续会写相关的博客更新在我的博客里。“自信”这东西过重要了,在面试这种场景里,稍微有点露怯会就会让你变得紧张、不自信,连锁的反应是后续的交谈也会不畅(固然也多是我心理素质通常吧)。

想学习更多Android知识,或者获取以上相关资料你们能够跟我一块儿探讨,欢迎加群探讨,有flutter—性能优化—移动架构—资深UI工程师 —NDK相关专业人员和视频教学资料
群号:925019412

相关文章
相关标签/搜索