本人2017年985院校软件工程毕业后正式转型java后台开发,2018年4月跳槽一次。下面是2019年9月跳槽的经历。仅供参考。 很多题目没有给参考答案,后续补充。
一、求职是一种修行
2018年入冬后,互联网行业发生了一系列降薪、裁员事件,初步感受到了一丝寒意。2019年互联网行业每况愈下。在脉脉上经常看到失业三四个月的脉友发牢骚,找工作难度相较于去年有很大的提升。不管行业环境如何恶化,我始终是保持一种乐观的心态:坚信自己即使离职,也能尽快找到下一份工作。
七月上旬,向leader提出了离职申请,之后的一个多月里我对工作中的设计文档、技术分享文档、开发规范文档、模块代码、业务进行归纳整理;学习java8的新特性。感谢老大给我休息和学习的时间,真的不好意思再这么闲着不干活,所以在8月23号办理了离职手续。回到家后整理家务时恍然发现租的房子9月9号合同到期,房东几个月前就已明确声明不让续租。在离职前也没有刷面试题,半个月的时间用来复习、找工作、搬家确实太赶,压力顿时爆表。
boss直聘上的猎头各种联系、要给我内推,自己确实也想在房子到期前找到工作,没控制好投简历的节奏,一下子收到很多面试邀约。最初我面了58集团和跟谁学,被刷了,其中58的二面官说我拿58练手(无辜脸)。后面安排的面试统统改约时间,先复习一下再说。早上6点就起床,晚上11点结束战斗,白天偶尔外出面试一下,提升面试经验和表达能力。面试遇到不会的知识点,事后都及时进行了针对性复习。好在9月初终于征得房东的同意,可以多住到9月底,可以完全投入复习了,感激业主的支持。
中秋节给自己放了一天假。节后,头条、滴滴、美团的面试变得很顺利,我感觉到了offer在向我招手。后来从猎头哪里得知,头条和滴滴都挂了,业务方向不匹配、面试表现一般等因素。从美团HR电话面试到第一次谈薪酬,我等了一周,HR给的待遇和预期的值相差很大,我知道,还会有第二轮谈判,4天后,HR给了最终的结论。可以过一个愉快的国庆节了。
二、推荐阅读
推荐几本书,里面包含了很多面试题;另外谈薪酬是比较伤脑筋的一件事,需要有自己的底线和谈判技巧。
- 《高性能MySQL》,MySQL进阶读物,面试题都在这本书里。
- 《程序员代码面试指南-IT名企算法与数据结构题目最优解》 - 左程云著。这本书我看了2遍,看一遍记不住,根据自己的理解在电脑里又敲了一遍代码。看完这本书,能够解决大多数算法题,但LeetCode中的热门题目最好还是刷一刷,很惭愧现在才刷35个,哎
- 《深入理解Java虚拟机》面试官就想知道我们对java掌握的深度,有没有一些JVM的调优、内存泄露排查手段。
- 《Java高并发编程详解:多线程与架构设计》(汪文君 著) 和《Java并发编程的艺术》。高并发的知识面试必问,而这两本书讲解详细,一定看一遍。
- 面试时,如何向公司提问?
- 如何面试程序员?文末的评论区也不乏高论。
- 面试时如何谈薪酬?
- 面试中如何谈及薪资才能让自己不后悔?
- 跳槽如何谈薪资?这些套路你要知道
- 候选人觉得薪酬太低,HR该怎么进行谈判?
- HR最需要的20个薪酬谈判方法
三、遭遇的面试题(不完全统计)
①项目相关
1. 你们的秒杀是如何做的?如果让你自己设计一个秒杀,你如何做?(58)
- 前端页面按钮置灰(避免用户重复请求):Js可控制在一段时间内只能触发一次。也可以让用户回答问题、填写验证码、移动图像等等,防止或者减少有机器人来恶意请求。
- 动静分离:把一些静态资源,如图片等缓存在CDN,APP上也可以缓存一些资源。
- 限频:通过userID限制访问频率,再比如在nginx层对同一个ip源的请求次数做限制,防止机器人来申请。
- 服务把请求队列处理,分批放行;
- 数据库(MySQL、Redis):读写分离,分库分表,数据库集群。(把热点数据分离,降低单库压力)
- 用乐观锁CAS(check and set)修改库存。伪代码如下:
// 基于memcache
Item item = client.get(key);
Integer restNum = item.getNum();//获取库存
if( restNum < buys) {
return false;
}
if(client.cas(key, restNum – buys, item.getCasunique())){
return true;
}
//基于数据库
update table_name
set amount = amount - #{buys}
where code = #{code} and amount >= #{buys}
2. 你们系统里有哪些容灾策略(58)
- 答:数据库主从;主备机房;各种手动开关;服务都是基于分布式的高可用服务;限流策略;降级策略。
3. 分库分表了解么(58)
- 答:写过数据库跑批任务,数据库通过shading-jdbc分表。
4. 数据迁移过程,如何保证数据一致性(58)(阿里电面)
5. 你们限量是如何做的,如何防止超卖?(Opay)
6. 挑选一个你最熟悉的项目说一下。(不是自己做的最好别说)
7. 规则引擎相关(美团公交业务组、滴滴)
8. 充值业务也涉及到营销,怎么用你们的营销中台呀?(美团公交业务组)
9. 为什么用MongoDB而不是elasticsearch?(美团公交业务组、配送)
- 考察技术选型问题。
②算法相关
-
有序数组,输出和为m的所有不重复的数对。
-
两个数组一样长,交替打印出来。(synchronized、wait、notify控制实现) (跟谁学)
-
一个String串,找出最长不含重复元素的字串。(跟谁学)
-
Peeking Iterator顶端迭代器的实现。(小米一面,LeetCode 284)参考答案
-
动态规划障碍路径。(小米二面, leetcode 63)
-
经典3Sum问题。(探探,leetcode 15)
-
转圈打印矩阵。(探探)
-
在有序数组中搜索大于等于x的数的最大下标。(二分查找)(美团闪购)
-
2个有序单链表合并,不能创建新的链表,仅仅改节点的引用。(美团闪购)
升级: 如何两个链表相交呢?
再升级: 多个链表,每个链表都很长,内存都装不下,如何合并? -
2个有序大数组,找出其中的交集. (Boss直聘)
public static int[] retainall( int[] array1, int[] array2)
- 给定的两个字符数组中,除了一个字符不同,其余字母的值和顺序都相同,假如第一个数组比第二个数组多一个字符,如何高效的找到这个字符。(Boss直聘)
public static char find(char[] chars1, char[] chars2)
- 写一段多线程的程序,要求产生死锁。(Boss直聘)
- 用synchronized关键字实现了代码。问synchronized实现原理,答monitor锁,面试官说回答的太粗了。如何优化synchronized的性能?
- 蛇形打印二叉树。(今日头条1面)参考答案
- 数组不相邻元素之和的最大值。(今日头条1面)参考答案
- 在数组中,找左边都比其小右边都比其大的元素。(今日头条2面)
- KMP算法是否了解(58)
- 不含重复元素,先递增后递减的数组中找最大值(美团公交业务组)
③java相关
- Wait和sleep的区别(中信银行)——注意:wait只能在同步方法内用
- ThreadLocal(美团公交业务组)(美团火车票)——要考虑内存泄露的情况
- 线程池执行顺序(美团公交业务组)——复习线程池ThreadPoolExecutor
- Executors构造相关(美团公交业务组)
- 线程池队列有哪些,你们线上用的是哪种?为什么不用无界队列?拒绝策略有哪几种?
- ConcurrentHashMap底层是如何实现的 和HashMap的区别是什么? (今日头条)(美团火车票) 如果让你设计一个Map你会设计哪些方法?(滴滴打车)
- 为什么你选择使用java,而不是其他语言?java的优势是什么?(马蜂窝)
- Java8的新特性了解吧?答:lambda、流处理、还是时间类型。进一步问:为什么增加了对lambda语法的支持呢?(马蜂窝)
- Java中你最熟的知识点,介绍几个? 然后面试官会继续追问。
- JVM存储模型,垃圾回收算法,CMS和G1垃圾回收器比较。
- 高并发包中lock实现原理
- volatile关键字的作用。参考博文
- JVM内存如何调优
- 排查过内存溢出、内存泄露的问题么?
④MySQL相关
看一遍《高性能MySQL》,就可以回答下面的问题。
- MySQL某表建了多个单索引,查询多个条件时如何走索引?(跟谁学)
- MySQL的行锁是如何实现的?(跟谁学)
- MySQL走索引的情况考察。(很多博客都太老了,MySQL版本升级后,原本不走索引的,现在可能走索引) (Opay)
- 数据库事务。事务特性ACID、隔离级别、事务并发问题小结
- 分布式事务相关。(Opay) 分布式事务一致性解决方案
- 考察B+树,如画一画B+树索引结构(探探)(58)
- mysql索引,底层存储结构,聚簇索引和非聚簇索引,B+树高度。(什么是索引、分类、B+Tree特点、面试题)
- 4MySQL中一个char类型占多大空间(Boss直聘)?
- char和varchar的区别,适用场景是什么?(Boss直聘)
- order by字句走索引,需要注意哪些事项?(Boss直聘)
- 考察select → \rightarrow →from → \rightarrow →where → \rightarrow →group by → \rightarrow →having → \rightarrow →order by顺序。(Boss直聘)
- 查看数据库状态,排查数据库问题的命令有哪些?(中信银行)
⑤Redis相关
- redis key过期清除策略(探探)(美团)
定期删除、惰性删除、定期删除。 - redis持久化方式(探探)
- Redis热数据、热key
- redis缓存穿透
- Redis分片和一致性哈希(美团公交业务组)
- Redis中zset如何实现的?(跟谁学)——跳表
- Redis为什么是单线程的?(58)
- LRU算法(58) ——考察内存不够用时,redis内存淘汰策略
⑥其他
- HTTP长连接为什么更高效,keep-alive(探探)。答案:《HTTP 协议入门》-阮一峰
- HTTP协议为什么是无状态的呀?(美团)
- Get、post请求的区别?为什么post请求更安全?(滴滴)
- http和dubbo比较,后端服务为什么选择用dubbo(美团公交业务组)
- 多层级关系的表设计(如文件系统,层级数未知,主子表肯定不行)(探探)
- 查看内存 、CPU占用率、网络的命令是什么?(Boss直聘)
- 系统负载是怎么算的,什么范围比较正常?(Boss直聘)
- 操作系统为什么需要文件系统?(马蜂窝)
- RocketMq相关(topic、tag、group、nameserver) (Opay)
- 遇到过什么dubbo错误,如何解决的。(Opay) 参考dubbo报错总结
- dubbo服务注册和发现、负载策略
- zookeeper选主的过程(美团)。 参考Zookeeper选主流程
- 离职、跳槽的原因
这几乎是每个技术面试官和HR必问的问题,每个人都问我这个问题,怎么又是这个问题。。。简而言之,每日优鲜终究只是提升自我、打怪升级经过的一站。只要离开的原因不是情绪化、不稳定、不靠谱等不成熟因素就可以。 - 对下一份工作的规划
这也几乎是每个技术面试官和HR必问的问题。未来无法预测,择业考虑的无外乎5个因素:平台、业务方向、工作氛围(决定了做事情的心情)、职级、薪酬待遇。我把它们按优先级排列如下。围绕这几个方面,说一下内心的想法即可。
- 平台;
- 工作氛围(包容的氛围)
- 业务方向(跨度小些,降低学习业务的成本)
- 职级
- 薪酬待遇
四、一些建议
- 应聘者要么具备扎实的技术,最起码要表现出足够的潜力。一个人的潜力表现在几个方面:第一、是否有干劲、做事情的意愿是否强烈;第二、快速学习的能力、专研的能力、毅力等;第三、面对压力时的态度、做事格局等。关于潜力的文章,网上有很多,可以参考一下这篇。作为HR,我是如何评估一个员工的潜力的?
- 面试的二面官一般是今后入职的leader,所以面试时留一个好印象很重要。表现出优势、特质或潜力。
- 面试官更关注候选人在实际工作中遇到了什么问题,是如何思考的,如何解决的,如果再做一次的话可以在哪些方面做出优化和调整。经常做项目复盘的话,回答这种问题应该没什么问题。
- 回答问题时,最好采用总分结构,结论先行,结构化的回答问题,不需要太细,少说废话。
end