前言
金九银十已来临,打响九月第一战!开启中长线布局策略。
想必现在有许多朋友,都在为即将到来的金三银四做准备,不知道各位朋友是否十足的把握能拿到自己心仪的Offer呢?
下面无偿分享一些我多年面试和工作经验给你们,希望对你们的面试有一点帮助。
如何在大厂面试一击而中?
如何准备Android的面试,结合我之前面试和面试官的经验,目前我梳理了一些基本的知识和准备。
首先,自己要对整个面试要考察的内容要有比较清晰的结构。
我们主要分为2大块:
1.基础知识
基础知识主要包括
1.Java,Kotlin的基本语言
- 面向对象的基本思想
- 内部类:内部类的分类、应用场景、内部类编译成
class
后是怎么样的。 - 抽象类 & 接口:区别、应用场景。
- 注解:注解的基本概念、分类、编译时注解 & 运行时注解。
- 内存模型。
- 垃圾回收。
- 类加载的过程。
- 泛型:分类、通配符 & 上下边界、泛型擦除。
- 反射:使用。
- 多线程,线程池。
- Kotlin的优点,协程。
2.Android基础知识
Dalvik
、Art
虚拟机Activity
:生命周期、launchMode
。Fragment
:生命周期、懒加载、两种Adapter
之间的区别。BroadcastReceiver
:基本概念、广播分类、权限。Service
:生命周期、onStartCommand
的返回值、startService
和bindService
的区别、相同进程 & 不同进程的交互、IntentService
实现原理。- 重要的工具类 & 源码实现:
AsyncTask
、HandlerThread
、Handler
、IntentService
、LruCache
、LinkedHashMap
、SparseArray
。 RecyclerView
:缓存原理、和ListView
的对比、Adapter
如何适配多种layout
。- 存储:数据库升级 & 优化、
ContentProvider
,SharePreference
。 SDK
版本升级的兼容问题。Android
的权限管理机制。
3.数据结构
- 数组,链表
- 栈 Stack
- 队列 Queue
- 链表 Linked List
- 数组 Array
- 哈希表 Hash Table
- 二叉树 Binary Tree
- 堆 Heap
- 并查集 Union Find
- 字典树 Trie
4.算法
- 二分搜索 Binary Search
- 分治 Divide Conquer
- 宽度优先搜索 Breadth First Search
- 深度优先搜索 Depth First Search
- 回溯法 Backtracking
- 双指针 Two Pointers
- 动态规划 Dynamic Programming
- 扫描线 Scan-line algorithm
- 快排 Quick Sort
leetCode,剑指Offer里刷题
5.网络
网络分层模型,TCP/UDP,HTTP/HTTPS
6.设计模式
按照23
种网络模型、三个分类进行总结,每种设计模式包含以下三个方面,至少要准备常用的几个:
- 基本概念:
UML
图、简单例子、应用场景、优势 & 劣势。 Android
源码中的实现- 项目中的应用
7.其他
- 跨平台:RN,Weex,Flutter
- 开源库:OKHttp,Retrofit,Glide
- 组件化,插件化,Gradle
2.项目经验
1.自我介绍
- 通常面试一开始,面试官就会让我们先自我介绍。
- 自我介绍这部分,逻辑清晰,有条理最重要。
- 之前工作的公司、岗位及工作方向。
- 团队构成,在团队中的位置及承担的责任。
- 为团队做出的主要贡献,对于这部分涉及到的 项目经历以及延伸出的知识点 一定要重点准备。
2.项目经验
把觉得做的有亮点的东西挑出来,从四个方面来准备:
- 功能模块的实现
- 达到了什么效果
- 遇到了什么问题,是如何解决的
- 涉及到的相关知识点
项目经验和知识点 其实是一个双向的过程,要 试图去找到它们之间的联系:
- 谈到项目经验的时候,可以说:做完 xx 之后,我还去了解了一下 yy 背后的原理,xxx,这里体现的是 你是否有求知欲 。
- 谈到知识点的时候,可以说:yy 的原理是这样的,在 xx 项目中我是如何应用它来解决问题的,这里体现的是 你是否具备把知识付诸实践的能力。
3.解决问题
通常面试官会问你在平时开发过程中有遇到什么比较棘手的问题么,以及如何去解决的
- 遇到问题
- 分析过程
- 解决方案
- 结果
上面内容和答案解析已经整理成了一个文档,《2256页一线大厂面试笔记资料包》点击我的GitHub可以看到全部内容。
那么你和大厂里的大佬存在哪些差距呢?又该怎么提升进大厂呢?下面来详细讲一讲:
六种差异造成你和大佬之间的差距
很多人都好奇自己和那些大神的区别到底在哪里,厉害在哪里,是知识储量和实际操作水平吗?
今天从多个角度带大家分析一下普通程序员和大神级程序员的区别差距(顺便给一些普通程序员一些学习建议):
一、知识差异
Android小白可能不知道在手机上显示一个图片用什么组件、什么标签,而熟练的Android开发者一定知道,并且能噼啪几下敲出来。
这是知识储备的差距。
知识和信息是你分析问题时的大变量,当你的知识储备量很小时,你往往是两眼一抹黑,不知道从何说起。
所以,知识差距,是不同层次的开发者之间最显著的差距。
二、技能差异
一个普通的Android开发者,刚刚入门,会用 一些基础的技术,而现在有一个新的项目启动,你让他负责这个项目前端模块的架构和设计,他大概率做不出来。
因为他还不具备胜任这类工作的架构能力、设计能力以及抽象能力,缺乏相应的技能。当你没有相关技能时,就不具备搞定复杂问题的基础条件。
不同层次的开发者之间,在技能层面存在显著差异,层级高的人拥有一个“工具房”,而层级低的开发者,手里往往只有一把螺丝刀。
三、动机差异
如果你留意观察身边的同事,就会发现:
有的人积极主动,什么都愿意做,做什么都津津有味,都能快速学习、迅速行动并做出符合预期的结果。
有的人你每次安排任务给他,就算是他可以搞定的,他也推三阻四,不情不愿这就是动机差距。
当你一个人知道如何去做,但是却选择不做一件事时,往往是缺乏做这件事的动机;当你不想做一件事时,总是能够找到千万个理由来拒绝。
不管哪种原因,你不做一件事,就少一次磨练和收获的机会,久而久之,别人在行动中成长起来了,你还在原地踏步。
四、行动差异
两个人都在不断做事,结果仍然可能不同:有的人三年精通某个技术栈,成为团队内的核心骨干;而有人的,做开发五年还只能写写静态页面。
你是遵循一定的方法和流程来开发,比如先完成设计、编写测试代码、再编码、跑单元测试,还是拿到需求就立马开始编码、边写边发现代码不符合需求不断推倒重来……
你是每次都给自己设定目标,希望这次任务用到的知识和技术点不同于上次,希望这次的代码设计和上次不同,还是根本不管这些,先写,能 Run ,完成任务交差……
这都些做事方法上的差异,会让同一件事有不同的结果让做同样事情的人有不同的收获。
五、习惯差异
有的开发者每天早上都琢磨下今天要做的事情,每天晚上都回顾下今天完成了什么事情、什么事情没完成、什么事情还没开始做,早计划晚回顾;有的开发者每天到了单位,开机,刷新闻,来两把游戏,然后喝茶,找人聊天,下班了吃个饭,打两局游戏……
有的开发者,每周都回顾总结,写周报,发给直属上司;有的开发者,经理强调一百遍“每周五要发周报”也充耳不闻……
有的开发者,遇见测试提 Bug ,就高叫“不可能”;有的开发者,则会说“我看看”……
有的开发者,遇见困难的问题或者难搞的醒目,会说“让我试试”;有的开发者遇见难题,两手一摊,“这太难了,我搞不定”……
在做项目时,有的开发者会把自己手上的任务按重要性、优先级排序,先做优先级高的、难度大的;有的开发者会每次都挑难度低的事情先做……
积行成习,积习成性,积性成命。
好的习惯,大概率产生好的结果;不良习惯,大概率导致不如意的结果。
你的将来,由你的习惯决定。所以,请看看自己身上,有哪些习惯会让自己积累越来越多的能力,巩固它们;有哪些习惯会让自己越来越 low ,弱化它们,扬弃它们。
六、环境差异
环境会在某种程度上塑造人,你会成为你身边人的平均数。你在一个技术氛围浓厚、优秀开发者众多的团队里,就有大概率更快地成长。
环境是可以选择的:你不幸进了处于衰退期的行业,可以转身去朝阳行业;你进了无所事事的、靠关系拿订单的传统软件企业,可以考虑去互联网领域的快节奏单位;你所在的项目组没什么技术氛围,你可以离开,找一个崇尚技术的团队。
提升建议及路线分享
不管你是为了缩减和大神之间的差距还是为了在大厂中的面试一击而中,技能提升都是现在你需要做的最重要的事情。
1、培养编程思想
高级程序员在看到一个需求的时候,总是能够快速在大脑里生成这个需求在现实生活中的映射。
聪明的人在项目经理说完以后,总会自己去对着需求文档去思考项目经理为什么要这么做,还有一部分人闷着头就去开发了。很多工作四五年的程序员,工作经验一大堆,让他真的说出些什么,他却说不出来。不懂得在工作中思考,工作十年也只是一个普通程序员。
所以说要去培养自己的编程思想。
但编程思想这个东西,不是说工作的久了就能有的,而是在学习和工作中要去思考。思想思想,肯定要先思而后想,这样才能拥有思想。建议是大家可以针对项目中一些简单的功能去思考,如果让你来从头开发这个功能,你需要对数据库进行哪些操作,需要提供什么接口,需要什么类型的数据,数据需要进行哪些必要的验证,数据库的字段类型以及长度。
用笔在纸上把内容都列举出来,写完以后再看几遍,有没有哪些可以做的更好的地方。然后去看项目里原来的设计,是不是跟你的类似,如果不如你设计的可以在后面的优化中改进它,如果比你的好,那就去思考别人为什么要这么做。久而久之,遇到复杂的需求也能快速拆分成一个个的小需求,那个时候你离项目经理就不远了。
2、制定学习路线
普通程序员在学完基本的知识以后,后续就不知道该学什么了,没有一条属于自己的进阶路线。高级程序员不同,他们在学完基本工作知识以后,会思考下一步自己该如何提升,他们会拥有自己的选择。知识是永无止境的,学完语言基础跟UI界面后,还有性能优化,还有framework层源码解析的了解,组件化、插件化等开源框架的了解,以及各种架构设计,最后还有NDK音视频的涉猎都是需要一步步掌握。制定一条属于自己的学习路线,是非常有必要的。
因为大家的方向不同,有的人是前端,有的人是后端,学习的语言也不同。因为我本人Android开发有八年多了,在这里就针对Android提一些建议。
掌握下面这个提升路径,你的Android进阶之路至少缩短5年。
最后我想说,没有一蹴而就的事情,很多事情都是水滴石穿,建议大家工作之余还是要保持学习的状态,比如关注一些知名的技术公众号,了解业界最新动态,时刻准备着。
如果你觉得自己学习效率低,缺乏正确的指导,可以参考下下面分享我多年工作以来收集整理的学习路线,给大家做个参考:
确定好方向,梳理成长路线图
不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。
关于这一点,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。
知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。
学习一线大厂的各项技术:
1.2020大厂面试高频知识点
- 图片
- 网络和安全机制
- 数据库
- 插件化、模块化、组件化、热修复、增量更新、Gradle
- 架构设计和设计模式
- 性能优化
- Android Framework
- Android优秀三方库源码
2.Jetpack架构组件从入门到精通
- Android Jetpack - Navigation
- Android Jetpack - Data Binding
- Android Jetpack - ViewModel & LiveData
- Android Jetpack - Room
- Android Jetpack - Paging
- Android Jetpack - WorkManger
- Android Jetpack架构组件之Lifecycle
- Android Jetpack Compose 最全上手指南
3.Framework精编内核解析
主要内容包含:
- 深入解析Binder
- 深入解析Handler
- Dalvik VM 进程系统
- 深入解析 WMS
- PackagerManagerService
4.Kotlin强化实战(附Demo)
- 第一章 Kotlin入门教程
- 第二章 Kotlin 实战避坑指南
- 第三章 项目实战《Kotlin Jetpack 实战》
- 从一个膜拜大神的 Demo 开始
- Kotlin 写 Gradle 脚本是一种什么体验?
- Kotlin 编程的三重境界
- Kotlin 高阶函数
- Kotlin 泛型
- Kotlin 扩展
- Kotlin 委托
- 协程“不为人知”的调试技巧
- 图解协程:suspend
5.Android设计思想解读开源框架
- 热修复
- 插件化
- 组件化框架设计
- 图片加载框架
- 网络请求框架
- RXJava 响应式编程框架设计
- IOC 架构设计
- Android架构组件Jetpack
6.NDK模块开发
- NDK 模块开发
- JNI 模块
- Native 开发工具
- Linux 编程
- 底层图片处理
- 音视频开发
- 机器学习
看视频进行系统学习
前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。
简历准备充分
可以去知乎上面搜搜别人写的有关简历的帖子,怎么准备,吸引hr, 突出自己的优点和能力,或者让朋友帮你看看简历有没有问题,比如过于简单或者浮夸,没有重点等。
尽量把你的亮点总结成一句简练的话,再加上数字来说明它的影响和意义。
其次在简历里中加入了可交互、可展示的内容,更能显出你的能力与众不同。
定期面试:
光学习了大厂的技术还不够,如何了解当下Android市场需要哪些技术呢?
定期的面试足以让你了解当下市场需要哪些技术,也更加容易确定自身的短板在哪,同时,也可以督促自己学习提升(小伙子,你了解的技术有点落伍了呀…)
万一拿到了高薪Offer,岂不是更赚?
多看大佬的学习笔记,学习大佬的设计思想:
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
以上这些资料都已打包整理完毕,点击我的GitHub可以看到全部内容。或者点击 【这里】 查看获取方式。
对于Android开发者,无论是对于鸿蒙开发的研究,还是jetpack compose新技术的探讨,以及kotlin语言的更新迭代,更多的还有flutter与原生开发的碰撞学习等,都是程序员需要额外充实自己的发展方向。另外像算法,设计模式和数据结构等也是需要时刻学习,这样你离大厂开发需求就更近了一步,作为技术开发者要注意自己的知识广度的一个长线发展。 只有阅尽千帆的人,才能像大海一样睿智。 愿大家都能在编程这条路,越走越远。