以下文章来源于君哥聊技术 ,作者朱晋君
后端架构师,定期分享技术干货,包括后端开发、分布式、中间件、云原生等。同时也会分享职场心得、程序人生。关注我,一起进阶。
今天分享一个朋友被“毕业”后的求职经历。
我这里就不贴参考答案了,需要参考答案的朋友可以在下面 3 个资料中找到:
下面是正文。
在老东家干了 6 年,发展一般,很想出去,但是一直没有合适的机会,只好一边准备面试一边学习。让我没有想到的是,突然收到了“毕业”通知,当然,不光是我,而是整个团队。
毕业,对于我这样的老员工来说是不错的结果,因为正好我也想出去,而且这次公司还能给不少补贴。
回家住了一段时间后,我开始了疯狂面试,今年的求职环境真的让人头疼,不要说张薪了,平薪都很难。下面介绍我面试过的公司。
首先介绍下个人情况,双非本科,写码 8 年,其中 6 年在金融行业,算是有行业积累,但是核心业务并没有接触到。在金融行业工作,技术的提升是比较小的,好多流行的技术栈没有用过。
上来就是一套笔试卷,下面是其中两套笔试题:
面试心得:
面试心得:
一面 20 分钟结束,挂!基本都能答上一点点,但是思路不清晰,语言组织吞吞吐吐,技术理解不透彻,太久没面试,紧张。
面试心得:一面 20 分钟挂,好几个没答上来!
面试心得:15 分钟结束。等通知(没戏)
面试心得:20 分钟完,问了现在薪资和期望,然后说等通知! 二面被我拒绝了,感觉距离太远,而且行业方向不对口
面试心得:聊了一个小时左右,答的也不是很好。然后过了初试,约了复试时间;公司地址: 北京市朝阳区华腾世纪总部公园 E2 座 3A 层(地铁四惠东站 B 口出,导航至华腾世纪总部公园南 2 门)
面试心得:让我等了 20 分钟才进来,面试问一堆我不会的东西,面试也就问了 20 分钟,没戏等通知。
面试心得:20 分钟完成,答的不好,说等通知没戏!
面试心得:
面试心得:浪费时间,估计就是 hr 忽悠我,不想面试了。
面试心得:50 分钟左右,面试的整个过程,不是很难,一面应该通过了,面试官问了期望薪资,我说期望年 xxx,面试官说现在行情不好给不到这么多,问多久能到岗,同时约了下周三复试时间
面试心得:这边他们只想做一个手机号匹配的,类似用户中心管理系统页面的功能,工资低,18~22k。系统也很简单,这次线上面试我的还是个用户中心的系统用户,都不是技术,还想约线下面试,浪费时间,已拒绝。
面试心得:很多细节不会,有点懵的感觉。面试了一个多小时,一边面试我一边告诉我答案,他们技术用的比较新,jdk 17 + SpringCloudalibaba,等通知!然后过了一会 hr 居然还约了时间二面;
1、你对 g1 收集器了解吗,他的好处知道吗?
回答:用分区弱化了分代的概念,强调 garbage first,需要回收时才回收的优先原则,通过卡表维护记录回收了哪些内存块区域,可以通过 MaxGCPauseTime 控制最大回收时间,提高系统响应时间,系统吞吐量;
又问,那他的 MaxGCPauseMillis 是怎么控制实现了解吗?
没答上;
2、你们用的什么 jdk 版本,你用的收集器是什么?这收集器会有哪些缺点,实际场景中都遇到什么样的 gc 问题,你们 jvm 参数是怎么配置的?
答:用的 jdk1.8 版本,收集器是 CMS+parNew ,讲了一些堆栈参数配置,比如系统内存是 6G,--Xmn 4g ,-Xmx 4g ,-Xss 512k 的设置, -Xmn 和-Xmx 最好设置成一样大,避免内存动态扩展震荡,导致多发生一些不必要 gc 问题,用 cms,会有内存碎片化问题,可以通过两个参数开启内存碎片化整理,多少次 fullgc 后整理一次碎片,gc 中的 Promotion Failed 问题,Concurrent Mode Failure 问题会导致最后用 Serial Old 单线程回收;
还讲了代码编写不规范,比如查询整个表里面数据不分页直接放到 List 集合中,如果条数过多会导致内存溢出,FileInputStream 操作文件流使用后没有在 finally 中释放资源,导致内存泄露;update sql 语句,使用索引不规范导致锁表,其他 update sql 同样表的线程等待释放锁,整个请求链路都变慢,内存无法释放,导致内存溢出的问题;
追问:你们系统内存是 6g,当时设置堆内存大小,比例是怎么考虑的?
没答上;
追问:如果你应用内存过大,或者 cpu 占用过多,你们是怎么排查的?
答:用 top 命令,shift +p/m,可以切换查看使用最大 cpu 或者内存的进程 pid
3、juc 包 concurrenthashmap 里面用过吗,1.8 是怎么实现的,
回答:1.8 升级了,锁的粒度更细,使用 synchronized+cas,synchronized 锁住哈希冲突的数组中头结点;
又问 cas 是用在哪里?你认为 Synchronized 锁住哈希冲突的头结点以后,就不需要 cas 操作了吗?
cas 是用在哪里没答上,然后我说 synchronized 锁住哈希冲突的头结点以后,应该不需要 cas 操作了,因为此时单线程操作安全了;
4、程池中 execute 和 submit 方法有什么区别?
回答:一个是提交 Runnable 参数,一个是提交 Callable 对象参数,其中 Callable 有返回值;在 execute 方法中提交 Runnable 任务时,后台有 RunnableAdapter,其实是把 Runnable 转换成 Callable 执行,这里用到了适配器模式,只不过 execute 方法的返回值为空;还有通过 submit 提交的方法,后续用 Future.get 阻塞获取执行结果,并且异常需要提交任务的线程自己处理;
又追问:submit 方法提交的任务,如果发生异常需要调用者自己处理,这块后台是怎么实现的?
没答上!
5、Redis 分布式锁,你们怎么用的,有哪几个参数需要设置?
回答:五个参数,key 锁名称,requestID 客户端 id,NX(SET_IF_NOT_EXIST),PX(SET_WITH_EXPIRE_TIME),expireTime(超时时间),因为哪个客户端请求的就哪个释放,避免死锁,所以有这几个参数;
又问:你们生产用的什么样的分布式锁?
答:用的 Redisson,因为用 jedis 实现分布式锁,很难解决锁续期的问题,在超时时间内如果 A 客户端没有执行完任务,锁被超时释放了, 次数 B 客户端就获取了锁,那么就会出现问题;
又问:如果你们用 Redisson,在 Master 宕机以后,slave 没有同步到分布式锁,这个问题用什么方案怎么解决?
没答上!
6、MySQL 字段 char 和 varchar 有什么区别?
回答:char 不可变,当字段长度确定固定后,用 char;varchar 可变的,字段长度不确定用 varchar,会多一个字节存储长度
又追问:除了这个,还有其他区别吗?
没答上,此时我反问他:那请问你知道还有什么区别吗?
他回答:当你使用 varchar 时,如果用了 modify column 去把列修改成 char,会产生内存碎片空间
7、你们 mysql 用了集群吗?
回答:没有,我们用的主从同步,master/slave,主库开启 binlog,采用 row 行同步方式,主库一个线程去写入 binlog 里;从库一个线程从主库的 binlog 同步到本地的中继日志,然后再用一个线程从中继日志同步据到本地数据库数;(因为之前其他公司被问到过主从同步用了几个线程,当时回答只有一个线程,答错,后来百度搜了下明白了;也不敢说用过 mysql 集群,因为按照他的提问方式,如果说用了,感觉他会继续问涉及到备份、读写分离、数据一致性问题,怕回答不好露馅)
8、你刚才说到了 binlog,那么 redolog 了解过吗?
答:redolog 好像是用做数据恢复的(答错),面试官纠正,是用来做事务持久化用的;又问:那么为了保持事务和数据一致性,redolog 和 binlog 他俩是怎么做到同步的?没答上,这问题一点不会;
9、你们消息队列用的什么,Kafka 和 RocketMQ 用过吗。你用的 RabbitMQ 是吧,那讲讲怎么保持消息顺序性!
回答:RabbitMQ,生产者是通过交换机塞入 quene 中,你可以用 direct exchange 模式,指定 routingkey 绑定 quene, 生产者往队列里面塞,消费者用单线程消费,消费完一个,给生产者 ack 确认机制以后,再继续消费下一条;又追问,如果消费者端用多线程消费,就没办法保证顺序性了吗?没答上!
10、RabbitMQ 怎么保证不重复消费?
回答:因为有时候由于网络故障,导致了消息重发的问题,队列中可能产生重复的消息;如果消息队列是一个类似 insert 数据库语句的操作,那么可以通过数据库唯一键来保持插入不可重复;如果不是 insert 语句操作,可以通过借助 Redis,消费者端接受到消息的时候,先往 Redis 里面 set key,后续每次消费的时候,都先从 Redis key 里面 get 一下,如果有这个 key 了,那么就不消费了;
11、Rabbitmq 死信队列,你们是怎么处理的?
回答:专门用一个消费者线程,去绑定死信队列 quene,消费死信队列的消息;
12、你们之前的系统,有用过微服务吗,SpringCloud 这块?
回答:用户中心改造过,nacos 用来做注册服务,gateway 用来做登录权鉴,验证 token 的操作。
13、那你们用 SpringBoot 这块,starter 流程是怎么实现的,能讲讲吗?
答:通过@SpringBootApplication 组合注解,run SpringApplication 类启动的;@SpringBootApplication 是组合注解,里面有@EnableAutoConfiguration 和 @Configuration 组合起来的,其中@EnableAutoConfiguration 是开启自动配置,里面还有一个@Import 注解 ,在 AutoConfigurationImportSelector 类里面会调用 loadFactoryNames 方法,加载你 starter 的 jar 下 META-INF/Spring.factories 这个配置,然后这个配置文件里面,配置了一些你这个 starter 需要用到的类,比如很多行 ..* = ... ,然后这些类都被当做组件加载到 Spring 容器中,直接提供给用户使用;
14、分布式事务有了解吗?
答:我知道 Seata 分布式组件,支持 xa 模式和 tcc 模式(答的不全,还支持 AT(默认)、Seaga 模式) 追问:那你们的系统,是分布式的,还是单体多机的模式 回答:用了单体多机模式;
15、我看你简历写了分表处理几千万黑名单数据这个,是用的分库分表吗?
答:只是分表没有分库,按照黑名单数据,里面身份证地区代码开头做区分,往对应不同的表前缀存就行了;
16、那你们的系统都没有用分布式的吧?分库分表这些也没用到?
回答:是的
17、你还有什么想问我的吗?
我问他:你们技术栈:他回答:我们主要用 SpringCloud 微服务这块,中间件 kafka Redis,MySQL 分库分表;
面试心得:问答环节一个小时,前面的问题,80% 还是基于你简历写的技术栈去询问沟通,有些回答上了,有些没回答上;最后问的这两个问题,感觉对方应该主要是分布式微服务这块技术栈,可能经历不太匹配。就我目前了解到的那点微服务的技术,也不敢说自己用过分布式,不然他应该会追问你服务怎么拆分的,分布式场景下的一致性问题等等这些!如果要投,有分布式微服务要求描述这块的岗位,感觉还是得再学一下,再融合到自己项目中去;这次面试,也是说等通知,应该没戏了!
面试心得:二面应该是通过,问的不是很难,之前整理过的问题都答上了,整个过程 20 多分钟,约了下周 HR 三面
面试心得:问了多久能到岗,是否接受驻场,可能双方没有意愿吧,我嘴上接受驻场,但是感觉还是有点不太想去,对面听出我的口气,最后也没给我 offer;
面试心得:30 分钟挂。
面试地点:华腾世纪公园 E2 座 3A 层
1、本来是现场技术总监二面,领导开会让我等了 20 分钟,估计还得等;
2、所以 hrbp 先面了,先聊了一会儿,问到我毕业时间,是不是统招本科,空档期在干嘛,现在有 offer 吗,2011 年毕业,2013 年才参加工作,当时为啥。2013、2015 的时候离职原因是啥?
(我内心:现在不都 2022 年了吗,还问 2013 年离职原因) 问了现在薪资和期望薪资待遇的情况,我说期望多少,她说高了肯定给不到,现在行情也不好;给我介绍了他们公司的几条业务线,消费贷,汽车融资租赁,房抵贷渠道,然后还有自动货柜出售商品业务;公司有上万名员工;(当时我看他们这层楼人都不多,而且办公环境也不好,有点质疑心态)
3、hr 问我上家干了这么多年,有哪些成长;
我:说学了一些新技术,学会了金融业务。我大概讲了一下。她又问我怎么用新技术去解决问题的,我说你懂技术吗?她说懂,让我讲给她听;然后我开始讲生产中处理过的比如内存溢出、宕机,讲到一半说到细节,她听不懂了,被喊停。后来开始聊其他的,聊了几分钟;问我对项目做过哪些复盘,你的整理总结文档输出沉淀有哪些?有没有团队分享?我说我有记录总结博客,需要把博客地址发给你看下吗?hr 还是把刚才的话题谈回来,问我解决过哪些问题,有哪些成长?然后我盯着她(内心:刚才不是给你讲了吗,你不是听不懂还问?), 她就反问我道:我说的不明白吗,问题描述不太清楚吗?(内心很无奈:现在 hr 也这么装吗,是显得在公司做 bp 有更高价值,都开始问候选人技术问题了?) 我继续跟她扯,打算敷衍一下;前面扯完了,说到薪资结构,14 薪,会在 offer 里面体现;然后社保公积金基数,只按照 8k 缴纳;
4、技术总监来了,上来让我自我介绍,让我讲了下上家公司的业务模式、项目流程;
5、你解决过哪些问题?我然后就说了还是刚才内存宕机的问题。
追问:如果你感觉你的系统有内存溢出,但是不用 jmap 命令做 dump 也不用 JVisualVM,怎么去排查?我答不出来。
6、做过哪些优化,我说了 MySQL 查询,一个大表用 limit m ,n 优化的场景方案;
7、MySQL 是不是做的集群,怎么保证高可用;
8、然后给我介绍了他们的系统,说进来以后会干什么,感觉有点含糊,具体到哪个组做什么业务也没说,问用哪些技术栈也回答的很含糊,说什么新系统老系统都有
(内心:技术管理可能混乱,项目杂不规范)
面试心得:
面试心得:20 分钟结束,挂!但是等了两天又通知线上复试。
HR 介绍自己公司待遇。Base*12 + 4 (16 薪),全额五险一金 面试心得:20 分钟结束,等通知(后来询问得知面试挂),应该 是面试薪资要高了,一面的时候,面试官就说过这个问题,觉得技术要求达不到这个阶层吧,而且现在大环境不好,降薪的也很多。
面试心得:20 分钟结束,等通知没戏了。破拉煤物流公司,还玩什么高并发,呵呵哒。
面试心得:50 分钟。问了期望薪资,我说 xx,估计对面嫌高了,又问能否接受加班,我说短期加班可以,长期 996 吃不消。
面试心得:30 分钟。找人内推的,等待通知;
面试心得:50 分钟,主要是业务问题答的不好。HR 晚上通知挂。
面试心得:面试聊了 40 分钟左右,说薪资只能跟之前持平,不能涨薪这样子。
面试心得:面试聊了 30 分钟左右,咨询内推人员,一面通过,等待银行内部员工进行二面复试。
下午 17:00 技术经理开始面试:
面试心得:搞笑 hr,灵魂拷问呢,工资低,加班也不少。
面试心得:面试聊了 30 分钟左右,一面通过,说等待一周内会进行二面复试。
这里就不贴参考答案了,需要参考答案的朋友可以在下面 3 个资料中找到:
在没有同行业经验的情况下,面试官基本会死磕技术,因为讲业务他听不懂。所以建议技术人在 30 岁以后最好立足于一个行业,不然面试真心太难了。
········· END ··············
👉 欢迎准备 Java 面试以及学习 Java 的同学加入我的知识星球,干货很多!收费虽然是白菜价,但星球里的内容或许比你参加上万的培训班质量还要高。
👉 《Java 面试指北》持续更新完善中!这是一份教你如何更高效地准备面试的小册,涵盖常见八股文(系统设计、常见框架、分布式、高并发 ......)、优质面经等内容。
近期文章精选 :
👉 如果本文对你有帮助的话,欢迎 点赞&在看&分享 ,这对我继续分享&创作优质文章非常重要。非常感谢!