大家好,我是R哥。
作为一名资深的 Java 程序员、面试官,同时也做后端面试辅导,面试过许多人,也见过不少神奇的面试经历。
但昨晚的一次模拟面试,真的让我哭笑不得。
这兄弟来自 92 名校,毕业 7 年,干了几个中厂,想冲大厂,目标:40K,于是想模拟面试一下,体验下我们导师的实力。
模拟面试之前,说自己八股文准备好了,面试完,竟然连许多常见的八股文都答不上来,而且他还很疑惑地问我:“你们的面试题是哪来的?怎么和我背的面试题完全不一样?”。
这……难道现在的 Java 程序员,已经盲目自信到这种程度了,梁静茹给他的勇气吗?
为了让大家少走弯路,今天就给大家复盘一下这次哭笑不得的模拟面试,看看你能答出几道,尤其是准备最近面试的同学,千万不要盲目自信。
下面是不完整面试记录(没有录音,全靠回忆)
小A: 老师,问问我八股文吧,八股文我准备得差不多了,看了个把星期了。八股文不用你们帮我准备,如果连八股文还要老师帮我准备,那也太。。。
导师: 好好,行,我先问你点 MySQL 的吧。
导师: MySQL 中的 Change Buffer 是什么?
小A: 什么 Ch.. ?(反问)
导师: Change Buffer,Change,改变。
小A: 不知道,没听说过。
导师: MySQL 中的 Buffer Pool 是什么?
小A: em... 什么..没听过。
导师: MySQL 中的几种表连接算法你清楚吗?
小A: 清楚,left join, right join ... 是指这些吗?
导师: 不是,这些是连接方式,不是连接算法。
小A: 哦哦,那我不知道了。
小A: 不对,老师,你这问的问题怎么和我背的八股文都不一样啊,我都没见过,我背的还是博主 XX 畅销的八股文。
导师: 哦哦,我知道他。
导师: 我问你的都是我们复盘面试录音时,面试官问到的面试题,这都是很常见的问题,我问你的并不难。(PS:我们复盘了上千场面试录音,知道面试官会问什么。)
这兄弟还是知识面太窄了,其实这些题在我们的《Java面试库》微信小程序中都能找到答案。
导师: Redis 熟吗?问你点 Redis 的吧。
小A: 还行,你问吧。
导师: Redis 字符串底层是怎么实现的?为什么要那样实现?
小A: Redis 中的实现和 C 中的实现不同,底层也虽然也使用了 char,但 Redis 中的实现可以存储以 \0
结尾的字符,而 C 语言中的不行。
导师: 没答到重点,它主要解决了什么问题?
小A: 解决了在 C 语言中不能存储以 \0
结尾的字符的问题。
导师: 不对,内存预分配和惰性释放你清楚吗?
小A: 不太清楚。
导师: Redis 中的 zset 底层是怎么实现的?
小A: 使用了那个什么压缩的列表,还有...(具体我忘了)
导师: 其实它是要分版本的,...
导师: Redis 中的近似 LRU 算法是怎么实现的?
小A: 近似...什么 U?(反问)
导师: 近似 LRU,L..R..U。
小A: 不知道,这是干什么的?
导师: ...
导师: 消息队列用过吗?
小A: 用过。
导师: Kafka、RabbitMQ、RocketMQ,你熟悉哪个呢?
小A: 都行,你问吧。
导师: 那行,那我问一点通用性的问题吧。
导师: 消息积压问题怎么处理?
小A: em...消息积压肯定是消费者消费不过来了,消费者端可以使用多线程来处理。
导师: 如果多线程也解决不了问题呢?你有没有想过会出现什么问题?
小A: em...确实,可能会造成服务 CPU 占用升高,...
小A: em... 那老师,我问你,如果是你,你会怎么解决?
导师: 第一,考虑扩容(包括 Broker、主题分区、消费者),第二,消费者使用多线程并行执行任务,第三,如果以上都不行,就得排查是否有单点故障问题 case by case 去解决了,比如数据库是否有性能问题。
小A: ... (开始讨论起来)
导师: 刚开始你说到了 “最大努力通知”,那你说说分布式事务有哪些解决方案?它们各自的应用场景是什么?
小A: em..什么什么(又开始反问),分布式事务可以用阿里的 Seata 框架,它有 AT、TCC 两种模式,但是我们项目中一般使用消息队列来解决,...(说半天也不清楚)
导师: ES 熟悉吗?
小A: 嗯,你问吧,问吧(这里就感觉他有点心虚)。
导师: ES 一条数据从存储到检索需要多长时间?
小A: em...这个我不清楚。
导师: ES 中的 TransLog 是干嘛用的?
小A: em...什么 log,这个我不清楚。
导师: 好吧,看来你 ES 也不怎么清楚啊。
导师: 那我问你点开放性的问题吧。
导师: 如果把你们系统的 QPS 或者数据量放大 10 倍、100 倍,你会怎么处理?
小A: em...那就加机器呀!如果是数据量放大那就分库分表呀!
导师: 你都不知道系统的瓶颈点在哪就加机器吗?如果加机器也不能解决问题呢?
小A: em...(想半天也说不出个啥)
导师: 其实这是个开放性的问题,没有参考答案,考验你的逻辑思维能力,在我看来,QPS 放大这么多,是不是要先进行压测找系统的瓶颈点在哪,再决定怎么处理呢? ...
小A: em...(又开始讨论起来)
...
聊了 40 分钟,会议到了时间自动结束了。
面试下来,给我的感觉是,他有点急于求成了,事前说八股文准备好了,结果连很多问题都听不懂,大部分问题都 get 不到点,要反复问问题,导师强调问题才行。
其实,导师问的这些面试题真的不算太难,在我们的《Java面试库》微信小程序中大多都能找到答案,问的这些都是冰山一角,不要再看网上那些过时的面试题了,都烂大街了,面试官都不会问了。
我和他说,导师还没问什么高难度的场景题、微服务、架构相关的复杂问题,你离面大厂还有不小的差距,提升空间非常大,他也承认他很菜。
面试,考察的是思维能力,而不是死记硬背。
这次模拟面试给了我一个很深的感触:很多人工作了 5 年、7 年,甚至 10 年,但他们的技术深度可能远远不如一个 3 年经验的程序员!
为什么?
这反映了一个真实的现象:很多人在工作中并不是在成长,而是在混日子。
大多数程序员的日常工作只是增删改查,写了一堆业务代码,却从来没有深入研究底层原理,没有深入积累,结果到了面试的时候,只能靠背题,然而一旦面试官换个角度提问,立马就露馅了。
所以,我在这里给大家几个建议:
1、不要死记硬背,要理解原理
面试考察的不是你会不会背题,而是你的思维能力和技术深度。背面试题,最多只能让你通过初筛,但真正的面试,考察的是你的实际技术功底。
2、多思考业务背后的技术点
在工作中,不要只是写业务代码,而是要多去思考 为什么这么设计?底层是怎么实现的?有没有更好的优化方案? 只有这样,你的技术水平才能不断提升。
3、做个真正的技术人,而不是 CRUD Boy
如果你只会增删改查,那你在 7 年后、10 年后,依然只是个普通的程序员。而如果你愿意钻研技术,深入理解技术背后的底层逻辑,那么你的职业发展一定会比别人走得更远。
所以,如果你真的想成为一名优秀的程序员,不要再沉迷于背面试题,而是要多去研究技术本质,真正提升自己的项目和技术能力。
毕竟,面试不是背题比赛,而是技术能力的验证!
最后,也欢迎加入我们的《面试辅导》,专注做后端面试辅导,已经帮助许多小伙伴成功上岸,连外包履历进国企、大厂的都有,全面武装自己,每个人都有无限可能。
版权声明: 本文系公众号 "Java技术栈" 原创,转载、引用本文内容请注明出处,抄袭、洗稿一律投诉侵权,后果自负,并保留追究其法律责任的权利。
更多文章推荐:
觉得不错,别忘了随手点赞+转发哦!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。