Android-开发面经,历时两月斩获BAT,2021程序员进阶宝典
2021/9/6 14:08:55
本文主要是介绍Android-开发面经,历时两月斩获BAT,2021程序员进阶宝典,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
我不是有经验的 HR 无法给出“非常漂亮”的简历标准,下面简单说说我个人认知的简历及格线标准:
- 信息完整。姓名、电话、邮箱、在校经历、公司经历、项目介绍等等,其实有很多大神早就写过 N 篇关于简历信息的文章了,我个人比较喜欢 Trinea 大神分享的简历模板《推荐 3 个简历模板及 2 大加分技巧》 。
- 展示自己的亮点。我明白不是所有人都有好的学校背景、好的公司背景、好的项目经验背书 —— 假如你有,是个优势,**但没有的话,聪明的你应该会想办法从其他方面给自己加分。**比如长期维护技术博客、博客言之有物,比如参与开源项目,比如做过一些个人项目等等。当然这些非一日之功,需要你平时的努力(不要想着在求职前随便粉饰包装一下,言之无物的博客或 github 反而会留下不好的印象)。我的理解是,其实招聘方也很苦恼,从 80% 的千篇一律的普通简历中想要筛选出能力好的人非常非常难,这时你能用这些亮点作为敲门砖无疑就能脱引而出。(PS: 有好的博客或 github 千万记得写在简历上且可以写在显眼的位置。在筛选简历过程中曾碰到一个人简历上没写这些,幸好他是朋友推荐特意给我发来了他的博客地址,否则单看他非常一般的简历他就失去了面试机会)
- 诚实靠谱。可能有人会问,假如我既没有好的经历也没有亮点怎么办?那就踏踏实实把自己的优势写出来,比如擅长 UI、对网络层有深刻理解、有自研 IM 的经历等等。大部分程序员都是靠谱、理性的工科男,简历写得诚恳踏实往往更能得到青睐。不要浮夸甚至造假,踏踏实实把自己基本信息展示出来就好。对写上简历的技术点要有一定了解,简历上写了一堆技术点结果问了却说不熟肯定是很减分的。(PS:慎用“精通”)
另外,我个人在写简历时有一个还未做到的点是及时更新简历。对于几年前的项目早就记忆模糊了,几年后再尝试回忆项目细节写进简历其实很难。所以最佳方案是项目结束后及时把收获更新进简历里。
如果喜欢我的文章,想与一群资深开发者一起交流学习的话,获取更多相关大厂面试咨询和指导,欢迎加入我的合作群Android Senior Engineer技术交流群:925019412
1.2 基础复习
对于基础复习我这次最大的感触就是,一定要早点做准备同时也要做全面完整的准备。
举个例子, Java 中非常基础的的四大引用。对 Android 开发来说平时可能用弱引用比较多,但真正作为面试题来问时面试官希望你能马上回答出四大引用分别是什么以及各自的使用场景。假如你能马上回答出四大引用的特点及使用场景当然是合格的回答,假如你不止回答出四大引用的特点还能联系到 ReferenceQueue,继而延伸到在 leakcanary 的使用,那就是优秀的回答了 —— 但假如你被提问后一脸懵逼,说自己只记得弱引用,就会比较尬(当然就这个知识点而言,我作为面试官的角色时还会尝试“抢救一下”,由弱引用的使用延伸到内存泄露去,不会直接判定应聘者)。
因为在“面试”这个场景里,面试官会默认你做了足够的准备,对于一些中高端职位基础题其实是作为送分题问的,当然希望你能快速反应、快速回答。而人不是机器,许久没用或者没复习的技术点想要在短时间内回忆起来并归纳成 N 个点说出来难度非常大。 所以基础技术的面试其实就跟应试一样,任你功力再高,也有必要好好复习一下。毕竟“武功再高,也怕菜刀”嘛(不恰当的比喻,哈哈)。
基础复习可以分为两大块,一块是 Android 和 Java 基础,另一块是计算机基础,也就是算法、计算机网络、计算机原理等。对于前一块,经验丰富的你一般花半个月就可以搞定;但对于后一块,时间上就不好估计了(网上有非常完整的各种面经和题库,聪明的你肯定具备最基本的信息检索能力,这里我就不贴链接了)。
这里我把我自己作为反面教材:由于前期对是否要跳槽犹豫不决,所以没能早点进行充分的准备,导致后面碰壁后需要在短期内急急忙忙去复习,其中的压力可想而知。
个人认为比较舒服的姿势是,不管跳槽与否,一些基础的东西在平时就可以有计划地复习,特别是刷算法题 —— 任你算法功力再高,没有经过一定的训练想要在面试这种场景下快速手写出 bug free 的代码也几乎不可能。
1.3 项目复习
社招跟校招的一大差别是,社招中的基础题部分只是前菜,招聘方会非常重视你的项目经历,通过询问项目经历会扩展到对技术、学习能力、沟通能力等的考察。
关于如何复习项目,从面试情况看,可以从总体架构、项目细节、项目亮点、碰到的问题以及场景复述等方面入手。
总体架构和项目细节不用过多解释,前者是从宏观角度向对方介绍你的项目的架构,用最短的时间让对方理解项目通过哪些模块或组件间的协作去实现功能的;后者是对方可能会提出一些感兴趣的点询问你项目细节 —— 所以千万记得认真掌握项目关键细节,否则答不出来会很尴尬。
项目亮点和难题则是面试必备,基本大部分面试都会问到这块,无他,对方不了解你的项目的情况下肯定希望你能展示出可以为自己加分的点。
1.4 简历投递
准备得差不多后就可以开始进入简历投递环节了,我觉得简历投递的途径的优先级是这样的:熟人内推 > 优秀猎头推荐 > 普通网友内推 > 普通猎头推荐 > 官网投递。
假如你的简历光芒闪闪,阿里星那种级别,那随便投递都可以很快有响应,否则投递的途径还是很重要的。
熟人内推当然是第一选择,通过熟人你不止可以知道部门内部的业务发展、晋升、加班等情况,在走流程时也可以通过他直接接触到你的未来 leader。而为什么优秀猎头的内推会比普通网友内推要好呢?我个人的感受是优秀猎头会比普通网友更了解招聘情况且能更积极得帮你催流程,而真正优秀的猎头,在对公司整体信息的掌握上是高于普通员工的。
二、面试中常见的考察方向
面试中要沉着冷静、面试前要确认面试时间并提前到……这些啰嗦的小 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.1 爱奇艺
爱奇艺是现场面的,效率很高,当天面完所有流程。算了下大概有四面技术面 + 一面 HR 面。
一面是 Java 和 Android 基础,面试官可能是 Java 开发出身,对 Java 方面的东西问得很细,比如堆和栈的区别、栈帧里记录了哪些信息等等。Android 方面的问题比较常规。
后面几面比较注重项目,大概流程是先问了很多项目细节,中途穿插了一些算法、计算机网络的题目。
3.2 滴滴
滴滴一面主要是技术基础,问得非常细。比如会问到 git cherry-pick
和 git hook
,还问到 inSampleSize
为什么是 2 的幂等等。
二面和三面是去的现场面,主要是项目相关,以及一些视频相关的优化。
最后
下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。希望能够帮助到大家提升技术
CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
- 以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,【点CodeChina可以看到全部内容】。
65955)]
- 以上进阶BATJ大厂学习资料可以免费分享给大家,需要完整版的朋友,【点CodeChina可以看到全部内容】。
这篇关于Android-开发面经,历时两月斩获BAT,2021程序员进阶宝典的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-18android.permission.read_media_video
- 2024-01-18android_getaddrinfo failed eai_nodata
- 2024-01-18androidmo
- 2024-01-15Android下三种离屏渲染技术
- 2024-01-09Android 蓝牙使用
- 2024-01-06Android对接华为AI - 文本识别
- 2023-11-15代码安全之代码混淆及加固(Android)
- 2023-11-10简述Android语音播报TTS
- 2023-11-06Android WiFi工具类
- 2023-07-22Android开发未来的出路