序言
本文主要介绍校招,疫情原因今年的春招持续的时间拉长了,截止到目前我已经面试超过一百位应届生,批改过超过150份笔试的试卷,因为通过率较低,我也被同事吐槽许多次让我“手下留情”。今天我就想聊一聊,我自己的面试标准。这不是一篇什么攻略文,旨在抛砖引玉,大家一起探讨如何面试更有效率。
需要写在前面的是,“平等“和”高效”一直都是互斥的。信息从一个人传递到另一个人那里,由于表达能力和接收能力的限制,必然产生信息熵,所以花一天的时间好好了解一个人的技术实力和学习能力,自然要比一场半小时的面试要更加的全面。但很可惜的是,现实中没有那么长的时间,所以一个面试官最基本的任务,就是引导面试者在最有限的时间里,最大化展示出自己的能力。
简历原则
最近看到很多技术大牛放出来自己的简历,但就我个人而言,感觉参考意义真的不大——这些大牛不管简历写成啥样,模板用啥,哪怕是TXT格式不做排版,就光看项目内容和技术深度就足够拿到offer了,但是正常人来说并没有这种“底蕴”,看完可能只会觉得“握草牛逼啊”,然后自己写简历时候仍然一脸懵逼。
其实应届生做简历真没那么复杂,能够突出的无非是:
GPA、算法奖项名次、奖学金之类的信息等。
实习经历:在哪里,做了什么,取得了什么成绩,解决了什么问题。有量化标准更好,比如说“降低了10%内存占用”这种。
个人项目、Github等
笔试阅卷原则
很多人好奇,笔试不是都固定答案吗?那有啥可原则不原则的?
是的,有些题是有固定答案,但也有一些问题答案相对开放。比如说这样一个常见的#### 笔试题
简述Activity(或Service,ContentProvider)的使用。
像这样的相对开放的问题,基本上是懂多少答多深,对于这种问题我个人的评分标准是这样的:
基本用法(Manifest配置、生命周期简述、重要API等)介绍没有错的话,至少给到总分85%
特别有介绍到源码层面,或者运行机制之类的,会给到满分。
如果答案中有错误的地方,会反而酌情扣分,所以基本上靠量取胜反而有更大风险,因为错误的内容也可能更多。
这些标准中可能争议比较大的就是“答错内容扣分”这一点,但是我仍然认为这是必要的。比如对于Service,有人会写“由于也是运行在主线程,不能做任何耗时操作”,我认为这是需要扣分的,原因如下:
“Service运行在主线程”是论据,“不能做任何耗时操作”是论点,但中间省略了论证过程,论据怎么推导出论点的?我感觉这是逻辑能力较差的一种表现。
默认运行在应用进程的Service,可不可以指定Service的process将它定义在子进程里?Service在子进程里做耗时操作比如网络请求之类的,为何不可以呢?如果可以,为何要说“不能做任何耗时操作”呢?我个人会感觉这个面试者实际并没有使用过,只是懂得书上的理论知识。
当然,只写一些基本用法拿到85%分的人,可能也有一些逻辑短板,也有一些技术能力不足,但像我上文说的,效率与公正无法兼得,并且隐藏自己短板也算是一种能力。
面试注意点
在面试的过程中,我印象最深的几点感受一定要告知大家:
- 1、回答问题不要过于着急,一定要耐心等待面试官把问题说完
- 2、回答问题要有逻辑、干练简洁
- 3、如果面试官打断你说话,此时一定要谨慎回答,因为很有可能你回答过于繁琐且他对你当下的回答不满意
- 4、一个问题不要纠结很久,尤其是让面试官感受到你在敲键盘.....
- 5、不会的面试题必须干脆利落的回答不会
- 6、面试的时间最好控制在 30 ~ 40 分钟左右,这样互相之间的体验不会很差
- 7、面试是一个挖掘面试者能力和潜力的过程
- 8、面试官不是全能的,面试一定是一个互相学习的过程
- 9、一定要提前准备好自己想要问的问题,最致命的是别人把你安排的明明白白结果你对别人一无所知.....
关于第 2 点还是要说明一下,很多面试者回答问题没有逻辑性,在回答之前可以先思考一下,然后告诉面试官将从 n 个方面进行讲解,首先第 1 个方面是...,其次第 2 个方面是...
友情提示:面试的时候发现大部分的面试者普遍存在 1 和 2 两个问题。如果你的回答没有逻辑还繁琐且没有命中要点,通常面试官对你的印象会非常差。相反,如果你回答问题过于简洁,通常情况下面试官会觉得你没 Get 到他的问题点(当然会怀疑自己的表述有没有问题),一般都会追加更详细的问题描述,毕竟这是一个挖掘的过程。
面试题解析
一般我在面试开始前,会根据应聘者的简历提前准备 8 道左右的面试题(在面试的过程中可能会有调整)。
接下来我会重点讲解一些面试题,面试题解答思路(可从答案解析PDF中找到答案),供大家参考。
第一章 Java 知识点汇总
JVM
- JVM 工作流程
- 运行时数据区(Runtime Data Area)
- 方法指令
- 类加载器
垃圾回收 gc
- 对象存活判断
- 垃圾收集算法
- 垃圾收集器
- 内存模型与回收策略
Object
- equals 方法
- hashCode 方法
- static
- final
- String、StringBuffer、StringBuilder
- 异常处理
内部类
- 匿名内部类
- 多态
- 抽象和接口
集合框架
HashMap
- 结构图
- HashMap 的工作原理
- HashMap 与 HashTable 对比
ConcurrentHashMap
- Base 1.7
- Base 1.8
- ArrayList
- LinkedList
- CopyOnWriteArrayList
- 反射
单例
- 饿汉式
- 双重检查模式
- 静态内部类模式
线程
- 状态
- 状态控制
- volatile
synchronized
- 根据获取的锁分类
- 原理
Lock
锁的分类
- 悲观锁、乐观锁
- 自旋锁、适应性自旋锁
- 死锁
- 引用类型
- 动态代理
- 元注解
答案解析
第二章 Android 知识点汇总
Activity
- 生命周期
- 启动模式
- 启动过程
Fragment
- 特点
- 生命周期
- 与Activity通信
Service
- 启动过程
- 绑定过程
- 生命周期
- 启用前台服务
BroadcastReceiver
- 注册过程
ContentProvider
- 基本使用
- 数据存储
View
- MeasureSpec
- MotionEvent
- VelocityTracker
- GestureDetector
- Scroller
- View 的滑动
- View 的事件分发
- 在 Activity 中获取某个 View 的宽高
- Draw 的基本流程
- 自定义 View
进程
- 进程生命周期
- 多进程
进程存活
- OOM_ADJ
- 进程被杀情况
- 进程保活方案
Parcelable 接口
- 使用示例
- 方法说明
- Parcelable 与 Serializable 对比
IPC
- IPC方式
- Binder
- AIDL 通信
- Messenger
Window / WindowManager
- Window 概念与分类
- Window 的内部机制
Window 的创建过程
- Activity 的 Window 创建过程
- Dialog 的 Window 创建过程
- Toast 的 Window 创建过程
Bitmap
- 配置信息与压缩方式
常用操作
- 裁剪、缩放、旋转、移动
- Bitmap与Drawable转换
- 保存与释放
- 图片压缩
BitmapFactory
- Bitmap创建流程
- Option类
- 基本使用
- 内存回收
屏幕适配
- 单位
- 头条适配方案
- 刘海屏适配
- Context
SharedPreferences
获取方式
- getPreferences
- getDefaultSharedPreferences
- getSharedPreferences
- 架构
- apply / commit
- 注意
消息机制
- Handler 机制
工作原理
- ThreadLocal
- MessageQueue
- Looper
- Handler
线程异步
AsyncTask
- 基本使用
- 工作原理
- HandlerThread
- IntentService
- 线程池
- RecyclerView 优化
Webview
基本使用
- WebView
- WebSettings
- WebViewClient
- WebChromeClient
- Webview 加载优化
- 内存泄漏
答案解析
第三章 Android 扩展知识点汇总
ART
ART 功能
- 预先 (AOT) 编译
- 垃圾回收优化
- 开发和调试方面的优化
- ART GC
Apk 包体优化
- Apk 组成结构
- 整体优化
- 资源优化
- 代码优化
- .arsc文件优化
- lib目录优化
Hook
- 基本流程
- 使用示例
Proguard
- 公共模板
- 常用的自定义混淆规则
- aar中增加独立的混淆配置
- 检查混淆和追踪异常
架构
- MVC
- MVP
- MVVM
Jetpack
- 架构
- 使用示例
NDK 开发
JNI 基础
- 数据类型
- String 字符串函数操作
- 常用 JNI 访问 Java 对象方法
NDK 开发
- 基础开发流程
- System.loadLibrary()
- CMake 构建 NDK 项目
- 常用的 Android NDK 原生 API
类加载器
- 双亲委托模式
- DexPathList
第四章 Android 开源库源码分析
LeakCanary
- 初始化注册
- 引用泄漏观察
- Dump Heap
EventBus
- 自定义注解
- 注册订阅者
- 发送事件
第五章设计模式汇总
- 设计模式分类
- 面向对象六大原则
- 工厂模式
- 单例模式
- 建造者模式
- 原型模式
- 适配器模式
- 观察者模式
- 代理模式
- 责任链模式
- 策略模式
- 备忘录模式
答案解析
第六章计算机网络基础
- 网络体系的分层结构
HTTP 相关
请求报文
- 请求行
- 请求头
- 响应报文
- 常见状态码
- 缓存机制
- Https
- Http 2.0
TCP/IP
- 三次握手
- 四次挥手
- TCP 与 UDP 的区别
Socket
使用示例
**答案解析**
第七章 常见面试算法题汇总
排序
比较排序
- 冒泡排序
- 归并排序
- 快速排序
线性排序
- 计数排序
- 桶排序
二叉树
- 顺序遍历
- 层次遍历
- 左右翻转
- 最大值
- 最大深度
- 最小深度
- 平衡二叉树
链表
- 删除节点
- 翻转链表
- 中间元素
- 判断是否为循环链表
- 合并两个已排序链表
- 链表排序
- 删除倒数第N个节点
- 两个链表是否相交
栈 / 队列
- 带最小值操作的栈
- 有效括号
- 用栈实现队列
- 逆波兰表达式求值
二分
- 二分搜索
- X的平方根
哈希表
- 两数之和
- 连续数组
- 最长无重复字符的子串
- 最多点在一条直线上
堆 / 优先队列
- 前K大的数
- 前K大的数II
- 第K大的数
二叉搜索树
- 验证二叉搜索树
- 第K小的元素
数组 / 双指针
- 加一
- 删除元素
- 删除排序数组中的重复数字
- 我的日程安排表 I
- 合并排序数组
贪心
- 买卖股票的最佳时机
- 买卖股票的最佳时机 II
- 最大子数组
- 主元素
字符串处理
- 生成括号
- Excel表列标题
- 翻转游戏
- 翻转字符串中的单词
- 转换字符串到整数
- 最长公共前缀
- 回文数
动态规划
- 单词拆分
- 爬楼梯
- 打劫房屋
- 编辑距离
- 乘积最大子序列
矩阵
- 螺旋矩阵
- 判断数独是否合法
- 旋转图像
二进制 / 位运算
- 落单的数
- 格雷编码
其他
- 反转整数
LRU缓存策略
**答案解析**
第八章 Kotlin 相关知识点
- from-java-to-kotlin
- kotlin_tips
- 从原理分析Kotlin的延迟初始化: lateinit var和by lazy
- 使用Kotlin Reified 让泛型更简单安全
- Kotlin里的Extension Functions实现原理分析
- Kotlin系列之顶层函数和属性
- Kotlin 兼容 Java 遇到的最大的 “坑”
- Kotlin 的协程用力瞥一眼
- Kotlin 协程「挂起」的本质
- 到底什么是「非阻塞式」挂起?协程真的更轻量级吗?
- 资源混淆是如何影响到Kotlin协程的
- Kotlin Coroutines(协程) 完全解析
答案解析
第九章 Flutter 相关知识点汇总
- Flutter原理与实践
- 揭秘Flutter Hot Reload(原理篇)
- Flutter 动态化探索
- Flutter如何和Native通信-Android视角
- 深入理解Flutter Platform Channel
- Flutter Engine 编译指北
- Flutter Engine 线程模型
- 深入理解Flutter多线程
- Flutter状态管理 - 初探与总结
- Flutter | 状态管理指南篇——Provider
- 深入理解Flutter应用启动
- Flutter渲染机制—UI线程
- Flutter渲染机制—GPU线程
- 深入理解Flutter应用启动
- 深入理解setState更新机制
- 深入理解Flutter消息机制
- 深入理解Flutter动画原理
- Dart虚拟机运行原理
- 源码解读Flutter tools机制
- 源码解读Flutter run机制
答案解析
最后
题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等录播视频免费分享出来。
[Android学习PDF+学习视频+面试文档+知识点笔记] 点击 https://shimo.im/docs/Q6V8xPVxHpkrtRtD 即可免费领取!
希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~