经典的问题比如:
-
触摸事件一定是先传递到Activity然后才传递给View的么?
-
如果要在Application的onCreate生命周期之前执行一些逻辑,可以放在哪里?
-
draw、onDraw、dispatchDraw执行的顺序如何?
-
View真正显示是在onResume之前还是之后?
-
Activity中嵌套有一个Fragment,startActivity之后,Activity和Fragment的生命周期顺序是如何的?
这些问题可能在不同的面试官会有不同的变形,只有亲自读懂了源码才可以应付这些问题,切忌从一些博客上看到只言片语就以为准备万全了,博客只能作为参考。最重要是源码,源码,源码!
数据结构与算法:
这部分在客户端开发中考察的比例会小一些,不过也有很多公司非常重视手写代码。经常碰到的问题有二叉树遍历、有序二维数组查找,排序等,基本上以《剑指offer》或者《编程之美》为准就可以了。
计算机基础:
这部分涵盖的比较杂,比如计算机网络(7层网络模型、Http和Https)、git工作流和命令、计算机缓存策略、UML、信息安全等等。
设计模式:
在自己的项目中一定要多总结和使用设计模式,面试官问你使用过什么设计模式的时候,如果能回答出比如状态模式、责任链、装饰等等,肯定会加分不少。如果只是回答单例和建造者模式,那就会逊色多了。这部分推荐看《研磨设计模式》。
开源项目:
这个也是必问的环节之一,建议从自己项目使用的开源项目入手,跟着代码,画一遍流程图和架构图,仔细体会这里面设计的优点和缺点。比如OkHttp、LeakCanery等等,这些都可以。开源项目根据面试官的个人经验不同,问的深入程度也不一样,这时候就需要你个人的一些引导技巧,比如面试官可能不是很熟悉这个框架,这时候你能主动表达出这里面设计的一些细节,也能给面试官留下不错的印象。切忌在简历上写只是用过但是没看过源码的框架。
一些不错的博客推荐
基础知识梳理:泽毛
https://www.jianshu.com/u/37baa8a86582
开源框架鉴赏系列:苏策
https://juejin.im/user/5886d699128fe1006c455fb6/posts
系统源码介绍:袁辉辉大佬
http://gityuan.com/page4/
一些面经面试题整理:
https://www.jianshu.com/p/20754b1adb4d
重点项目经历
小厂的项目往往追求业务快速迭代上线,相对比较能容忍一些技术难点,但是这些技术难点往往是能体现一个人技术能力的。
所以你如果在小厂,就不能过分陷入到业务中,必须跳出来找一些有亮点的技术点,做好做精。这些技术点才是一个程序员安身立命的本钱,否则公司业务陷入困境了,你的价值也就不复存在了。在如何准备面试中项目这部分,笔者有几点心得:
-
分成三部分:为什么要做这个点,考虑了什么因素并且是如何做的,取得了什么效果(比如启动速度从1000ms降到200ms,这种具体的数据)
-
可以把几个小点串起来,这样可以显得更系统和全面一些,比如代码优化和性能优化结合在一起讲。
-
小厂的一些优化点往往只能做性价比最高的一部分,这时候还可以讲一下业界还有哪些更优的方案
-
最好再准备一下“如果你没有离职项目中还有有什么不足和可以优化的地方?”(笔者面试中碰到过几次这样的问题)
小厂跳大厂,技术基础可以准备得很充分,但是项目绝对是一个弱项。大厂一个App可能就有几十上百人在做,小厂很多所谓的优化在大厂的面试官眼中可能都是他们很早就做过了,这时候项目本身做了哪些东西并不是太重要,需要着重体现你解决问题的思路以及你是一个有追求的程序员,至少你要能做到业界的平均水平,这样才能有机会通过面试。
开放式设计思路
开放式的设计问题需要融会贯通数据结构、设计模式和架构设计等方面的知识,这部分没有固定的答案,笔者总结了一下这些问题可以套用的几个解决问题的思路:
分治法
分治法是现代程序设计中非常重要的一个原则,主要是把大问题化解成小问题,再在小问题中去解决各自的问题。
分层法
把一个大的系统进行分层,比如View层-Controller层-Model层。把一个大的问题,划分成几个层次,每个层次的职责和层次之间之间数据流定义清楚,然后再在各个层次中去实现。
套用常见的模型
比如生产者消费者模型,“池”的模型(例如线程池、对象池)、缓存模型(LRU)等。
比较常见的开放式设计思路问题有如何设计一个网络图片加载框架、如何设计一个文件下载系统、如何设计一个IM组件等等。
这些问题都是非常大的问题,比如图片加载框架就可以套用分层法去化解,参考fresco的设计,划分成View-Controler-DataSource这样的层次。大量文件的下载系统可以套用线程池的模型去设计,这里就不再展开讲了。
技术以外的东西
大厂面试中技术以外的部分也是非常重要的一部分,这部分大多是一些软技能:
自我驱动和追求
这部分主要是在平时工作中的一些自我驱动学习和自主追求一些技术能力,而不仅仅是完成需求就可以了,这样才能体现出你个人的成长性和潜力。
沟通和协作
这部分会评估你未来在团队的融入程度以及跟团队跨团队协作和沟通的能力。比如你在工作中是否能正确看待和解决一些跨部门沟通的问题。
下面是我个人整理的整个面试的一些知识图谱,这上面的知识点基本上都是面试过程中问到的,属于必知必会的知识点。
与面试官聊天的收获
虽然很多面试都是在问问题和答问题中度过的,但是还是有一些面试官在面试完成后会对我的面试结果做一些总结和评价,这里面也收获颇多,跟大家分享一下。
1、大厂和小厂的选择
很多刚进入职场以及学生会有这方面的困惑,不过我还是简单粗暴地回答一下这个问题吧,建议去大厂。因为这几个方面的原因:
-
大厂周围的小伙伴大概率更优秀。
-
几年后小厂和大厂的程序员市场溢价不同。同样工作年限的程序员,大厂天然要比小厂的溢价高很多。
-
小厂更强调业务的快跑,忽视人的成长。很多小厂会在不同的业务方向上投几个人做出一个App出来试试市场反应,很多人就不得
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
不重复做之前已经会的一些功能,而且很多小厂用户量很小,并不关心所谓的性能架构,因为优化了一个性能,能受益的用户也非常少,还要占用开发业务的时间,你的老板和业务部门也是非常不乐意的,这对于一个程序员的成长是非常不利的。如果一个小厂宣称自己的团队主要成员主要来自百度、新浪、网易等大厂的时候,你需要格外注意一下,这并不代表你进入这个团队后能成长成百度的标准。
2、5年左右的开发的标准
这里说一个标准,5年左右开发经验的工程师,应该在某个或者某几个方向上是整个公司的专家和标杆。
比如设计能力、网络优化、性能优化、音视频等等,5年左右的开发不应该仅仅满足于实现一些业务需求,应该更深入了解底层的原理和技术,这样在未来的跳槽中才能有更高的溢价,比如从抖音出来的音视频工程师就能在市场上享受非常高的溢价。
3、关于成长和职级
主动去承担高一个职级的事情,自然而然你的职级也会跟着提升。
些业务需求,应该更深入了解底层的原理和技术,这样在未来的跳槽中才能有更高的溢价,比如从抖音出来的音视频工程师就能在市场上享受非常高的溢价。
3、关于成长和职级
主动去承担高一个职级的事情,自然而然你的职级也会跟着提升。