1. 笔试题目选择
关于笔试题的选择,有很多种方式。无论怎么选择,一定要问自己:这个题是否可以把候选人的动手能力体现一二?是否和本岗位的实际研发技能需求贴近?
我了解到,有的面试官经常从公共题库选题,有的面试官从个人题库选题,有的面试官从网上选题,有的面试官长你只用同一道题。无论哪里的题,其实核心是:具体延伸、深挖的考察点,这样可以通过互动提问过程,或者说代码review 交互过程,评估出候选人的动手、思考、交流等软硬件能力
2. 笔试题考察点
1. 需求理解
有的笔试题,非常抽象,然后给一个简单例子。有的笔试题,非常具体,考察的点非常明确。例如案例1: 有N个队列,每个队列有M个数字,求所有队列都出现的数字。例如案例2,求A 和B 字符串的共同出现的最长子串。
一些候选人,上来就开始写代码。这不是最佳的“姿势“。应该先进行需求对齐,需要主动向面试官提问。例如案例1,队列的数字是否有序,队列的数字是否重复,队列的数字类型是否统一等。例如案例2,是直接使用lib,还是自己实现,对时间复杂度有什么要求。
加分点:主动需求沟通、需求对其。这个反应的是工作中,是否“习惯性“对需求发起对齐、确认的”意识“
2. 最佳和最快
有的候选人敲代码前很纠结,这个题是最快、最笨的方法实现,还是弄一个最佳的、需要仔细设计的实现?例如案例1,直接暴力的 for、hash等实现,还是排序队列求交实现?
推荐:先已自己最擅长的方式,或者说最笨的方式,快速实现一个版本。然后在与面试官,讲解代码过程中,提出其他的实现方案,需要“讲“清楚关键数据结构、关机处理逻辑。
3. Code Review
这部分最为关键,尽是细节点。也正是这些“细节”点,反应候选人在写代码过程中的点滴思考和过往经验的“折射”。
一般的考察点如下
1. 可读性、可运维性
体现的点:(1)函数、方法、参数的命名(2)主线逻辑、局部实现逻辑的 “组合“编排 (3)For 循环的深度、If else的 简化、Case switch的简化 (4)基本的注释说明 (5)程序异常了,如何排查定位问题
提问:
- 命名有什么好的经验和选择
- 函数的行数一般多长比较合适,为什么
- 添加新的逻辑,在这段代码哪里改,成本最小
- If else 是否可以精简
- for 循环是否可以 提前退出
- for、do while、while 有什么区别,使用的注意事项是什么
- 注释怎么写比较好?为什么。例如中文注释有什么不足点?
- 有没有GVM 调参的经验
- 程序异常崩溃了,如何排查,一般使用哪些工具排查
- 平时代码部署的服务器有多少台,有没有遇到部署过程中的异常问题,如何排查和解决
- 业务是否出问题怎么识别、怎么定位、怎么解决
。。。
2. 健壮性、基本质量
体现的点:(1)入参数的校验(2)边界条件的处理(3)循环的退出条件 (4)IO资源的关闭(5)日志的输出 (6)单侧的用例覆盖
提问:
- 当前的实现,支持哪些场景、不支持哪些场景的输入
- 边界条件是什么,为什么这么处理
- 循环是否有提前退出的可能,是什么时候
- IO资源关闭,是否存在极端情况的泄漏
- Sytem.out 和 log 输出的差别是什么?什么时候使用system、log
- 代码质量的保障措施有哪些?
- 常见的测试方法有哪些,你平时使用那种方法,有什么优点、不足
- 如果运行过程中,突然断电了会有什么问题发生
- 如何改造,可以在服务器异常下,业务不受影响
- 大型项目,很多同学同时研发,如何保障整体的质量
- Map、HashMap、List、ArrayList、Filter等基础数据结构原理和实现
。。。
3. 复用性、移植性
体现的点:(1)逻辑处理的场景鉴容性 (2)方法抽象定义的内聚、功能单一性 (3)无状态化,减少全局变量的依赖 (4)简单数据结构
提问:
- 具体代码考虑的场景是否充分,例如还其他的输入的影响?
- 结合这个笔试题,用面向对象的概念分析、介绍下?
- 服务器异常,快速从另外一个服务器拉起应用,当前实现是否可行,有什么需要改造的
- 复杂均衡怎么实现
- 限流降级怎么实现
- 切面是否有帮助
- 配置中心是否有帮助,为什么
- 是否可以跑在云端,如何改造
- 做为公共Tool 类,还需要做哪些改造
- 你觉得企业内部代码是否应该全员开放,为什么
- Java、GO、C++、Python等语言的差异是什么,你喜欢哪种语言,为什么
。。。
3. 复杂度优化
体现的点:(1)算法本身的复杂度 (2)分布式实现方案 (3)其他的组合算法实现
提问:
- for循环可否去掉,为什么
- 是否有分布式的实现方案
- 是否可以多算法组合进行优化,怎么做
- 如何控制软件的复杂度?
- 重构是怎么理解的,什么时候需要重构?重构需要避免哪些坑
- 架构设计有什么作用,架构设计和复杂度优化是否有关系,如何通过架构设计降低复杂度
- 复用第三方jar 和自己实现,有什么异同,需要注意什么
。。。
4. 性能优化
体现的点:(1)内存优化 (2)IO优化 (3)网络优化 (4)多线程优化(5)分布式版本实现 (6)GC友好优化 (7)Cache 优化 (8)任务拆分
提问:
- 输入参数非常大,内存装不下,怎么优化
- 频繁的内存、磁盘交换,有什么问题,如何优化
- 多线程原理,本题多线程是否可以实现,如何实现
- 单机并行、分布式并行实现的方案是什么
- 当前算法实现,是否可以直接分布式部署使用,需要怎么改造,可以实现分布式版本
- 当前代码实现,哪些地方可以优化,可以对GC回收友好
- Java GC的原理、常用回收算法
- 其他性能优化,例如cache引入
- 平时了解和使用的cache 算法有哪些,优缺点是什么
- 大型项目,研发如何分工合作
- 当前的实现方法是否可以进一拆解?
- 大任务和小任务,例如大sql 和多个小sql 并行执行,那个更好,为什么?
- 同步和异步的区别是什么
- 消息引入进来,是否有帮助,为什么
- 使用mysql 为何不使用nosql
- 使用其他存储是否有帮助,例如es 为什么有帮助?
。。。