本文主要是美团的Android技术专家 laberat 对大家面试或者是工作中遇到的一些疑惑提问的回答分享。
话题起因是有些同学聊到“我一直做小项目,接触的技术比较少,经验也比较缺乏,想进大厂完成职业生涯升级该如何进阶?往哪个方向努力?”
laberat:先避开你的问题,那我们面试关注的两个点来说,无论中级还是高级,有两个点我是面试中非常关注的,一曰基础二曰学习能力和探索兴趣,这两项都不依赖于项目大小,从自身角度出发 多写多改多思考是避不开的。从面试和职场的角度考虑 还要思考一下匹配度的问题 也就是“需求”,高级工程师是要求项目经验的 因为有些经验就是不断踩坑踩出来的啊……说到底不就是写得多经验就多么……
比如你工程化能力特别强 gradle 脚本玩的跟花似的 基本上肯定能进大公司。
L: 工作几年了,一直在公司做小项目如何提升?
laberat:其实这个问题,如果你仔细思考、付诸实践,面试的时候把这类问题讲明白,也是会有好的印象的;这本身就是在解决问题。
null:我就是一直做小项目,工作了5年一共就只做了 4个 APP。我看了很多面试题,基本上都是项目里面用到的,但是让我回答只能回答个表面,往深了就不行,就需要你自己总结了
laberat:这就涉及到我面试的时候考察的第二个点,你的学习兴趣和探索欲望在哪里?如果公司的项目都是小项目,是不是可以从开源项目上动动手?简单说 一个图片加载框架 就足够说很多东西了 但是我们是否自己去尝试写或者总结图片加载框架呢?
寂小桦:我不说实力部分,大佬们都说了,我就想说说如何获得大厂面试机会吧,小项目的经验往往根本就过不了大厂 HR 那一关,过了,用人部门一看也不会想约着面试的,这个问题怎么解决?
laberat:我刚刚是说了最核心一句话,项目经验证明不了你优秀,那么你用其他的证明啊,比如说:
1、你做个不错的开源项目,广受大家好评,用人部门自动问你要不要换工作,你信不信吧?
2、你技术博客写的勤快,且有深度,很多人看,可能遇到大厂的朋友看到了话,他们会给引荐。然后你说你项目根本用不上一些新技术,怎么可能写出好文章嘛?那可以关注前沿技术呀,刚刚我说的好奇心,对技术的热情,你用这些文章表达出来啊。
3、多跟大神交流,比如某大神技术分析、分享,你可以留言表达观点呀,其实大家写的文章认真讨论的没几个人,你认真一下,就容易被注意了。
这些都是小技巧,操作起来还是很费时间费功夫的。另外,我想拿我的一个朋友举例,他去YY前应该是个小公司,但是他技术文章写的很棒,很快他去了YY。我相信写技术文章对他帮助是蛮大的。
胖大海(乾三):@laberat 能讲下面试中Android基础的考察点吗?
laberat:
要想拿到大厂的offer,你也应该知道基础好是一个硬性条件,对于计算机相关专业毕业的同学来说,这些基础就是你大学所学的课程,如果不是计算机相关专业毕业的同学,那么就需要在基础知识这个方面下足功夫了,具体来说下面的东西必须掌握:
- 操作系统原理(里面有一些计算机组成原理的知识需要简单掌握)
- 网络原理
如果你没有掌握这些知识,或者之前学过,但是忘了怎么办?学啊!怎么学呢?去网上找一些计算机原理的公开课啊,去找一些计算机的书籍看啊,可能大家会有疑问,面试会问这些知识吗?直接问的很少,但是只有你了解了这些知识,才能更深入的了解一些技术和知识。举两个例子:
-
第一个,如果要做Android里的网络优化,你不知道网络里面的一些原理,你怎么知道怎么优化?如果你不知道UDP和TCP的详细区别,技术选择时,你怎么知道选择哪一个作为你通讯的协议?关于网络还有一个出现概率很高的问题就是TCP的三次握手和四次握手,其实它就是网络原理里面的知识。
-
第二个,操作系统中,内存是发挥什么作用的,又是怎么工作的,知道这些,你再去了解Android的内存管理就信手拈来了。
数据结构和算法
数据结构和算法其实是分开的东西,我们需要先掌握各种数据结构,再去加深算法,数据结构和算法其实也属于基础,但是它现在越来越重要,所以我就单独拿出来说了。
至于算法,首先要做的就是动手,翻资料+LeetCode上直接干你觉得还不行吗?第二阶段就是要总结各种算法的思想和套路,像递归、动态规划等这些算法都是有套路的,在LeetCode上也有按数据结构和算法分类的筛选,大家可以针对性练习和总结。
当然,对于一个Android程序员,能做到每天在LeetCode上刷题就非常不错了,所以一定要坚持,等你坚持到一定的时间,你会发现你越来越游刃有余。
这里我把《数据结构与算法常见面试题》总结成了PDF,共计341页(实际上比预期多花了不少精力)。包含很多的知识脉络 + 诸多细节,由于简书篇幅有限,这里以图片的形式给大家展示一部分。需要获取高清完整版PDF的朋友————可以去我的【Github】下载免费获取。
设计模式
设计模式中包括了设计原则,其实对于Android开发人员来说,设计模式就那23种,知道并了解这些设计模式是第一个阶段,仅仅是到这个阶段是不够的,一般面试也不会问你某个设计模式的概念,而会让你具体的说说你对某一种设计模式的深入了解和使用,它的优缺点,所以,第二阶段就是要运用它们,其次要和Android源码中运用到设计模式地方进行结合学习。
例如建造者模式,Andoird中的Dialog创建就使用到了,还有像单例模式、适配器模式、观察者模式等等都是在Android中非常常用的设计模式,也是在面试中出现频率很高的。
Java
Java我就来直接一点了,如下:
- Java集合(HashMap一般必考,通读源码很有必要)
- 反射
- 多线程
- IO、NIO(可选)
- 泛型
- JVM相关,如内存的管理、内存的回收、类的的加载等等
- Java异常
大家可能觉得这些自己多多少少都了解,但是当问到细节就不知道了,所以对于上面的知识还是需要系统的认知,项目中没有机会深入就自己一个一个突破,比如Java集合,首先对集合要有一个宏观的认知,这是我之前总结的一张关于Java集合的图:
它就是我通过查看集合的源码一步一步画出来的,等我画完,我脑袋里也有了一个清晰的认识。然后从常见类的源码开始动手,如HashMap,循序渐进,逐个击破。
从这点也可以看出,我们对每一类知识一定要深入的了解,而不是泛泛的知道,比如Android的一些热修复框架,其中就是JVM中类加载和反射等技术。又比如并发中,线程池和ThreadLocal这些都是必要掌握和熟练使用的知识,也是面试经常会被问到的。
Android
Android其实要说的不多,对于一个有工作经验的Android程序员来说,基础的一些Android技术大家都是掌握了的,而如果要做一个加分的Android程序员,下面的Android技术就需要深入了解了:
- Android View的绘制和流程
- Android触摸事件分发机制
- 性能优化(网络、内存、电量、UI)
- 常见Android源码,如Handler、AsyncTask等等
- 熟悉Binder原理
- 了解一些Framework常见知识,如AMS
- Framework
- Jetpack
- Flutter
- NDK/音视频技术
- Kotlin
这里我也把Android实战核心技术总结成了PDF,共计837页,需要获取高清完整版PDF的朋友————可以去我的【Github】下载免费获取。
总结
总之,每个面试官问的技术考察点都不一样,用一个人的力量是很难记住那些千变万化的面试题的,想要全部熟悉这是奢望而且不切实际的。
而底层的东西从来都没怎么变,只有把更底层的原理搞通透,面试的时候才是你最大的竞争力,有根了才能对面试官提出的各种问题有一个相应的解决办法,这样才不会让自己的学到的东西像断了线的风筝一样,再脑海里就像一个过客,越飘越远,因为这些风筝们都没有一条线是能够连着你的根~
网友评论