序言
本文主要介绍校招,疫情原因今年的春招持续的时间拉长了,截止到目前我已经面试超过一百位应届生,批改过超过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
- HashMap
- 反射
- 单例
- 饿汉式
- 双重检查模式
- 静态内部类模式
- 线程
- 状态
- 状态控制
- 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
- 线程池
- AsyncTask
- RecyclerView 优化
- Webview
- 基本使用
- WebView
- WebSettings
- WebViewClient
- WebChromeClient
- Webview 加载优化
- 内存泄漏
- 基本使用
答案解析
第三章 Android 扩展知识点汇总
- ART
- ART 功能
- 预先 (AOT) 编译
- 垃圾回收优化
- 开发和调试方面的优化
- ART GC
- ART 功能
- Apk 包体优化
- Apk 组成结构
- 整体优化
- 资源优化
- 代码优化
- .arsc文件优化
- lib目录优化
- Hook
- 基本流程
- 使用示例
- Proguard
- 公共模板
- 常用的自定义混淆规则
- aar中增加独立的混淆配置
- 检查混淆和追踪异常
- 架构
- MVC
- MVP
- MVVM
- Jetpack
- 架构
- 使用示例
- NDK 开发
- JNI 基础
- 数据类型
- String 字符串函数操作
- 常用 JNI 访问 Java 对象方法
- NDK 开发
- 基础开发流程
- System.loadLibrary()
- CMake 构建 NDK 项目
- 常用的 Android NDK 原生 API
- JNI 基础
- 类加载器
- 双亲委托模式
- 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+学习视频+面试文档+知识点笔记】
希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~