专栏名称: 石杉的架构笔记
专注原创、用心雕琢!十余年BAT一线大厂架构经验倾囊相授
目录
相关文章推荐
新浪科技  ·  【#DeepSeek下周开源5个代码库#,每 ... ·  3 天前  
腾讯研究院  ·  腾讯研究院AI速递 20250221 ·  3 天前  
51好读  ›  专栏  ›  石杉的架构笔记

211 渣硕菜鸟的秋招之路!

石杉的架构笔记  · 公众号  ·  · 2019-11-14 09:35

正文


扫描下方海报 试读


本文是公众号读者SQL的投稿

感谢SQL同学的面试分享



本人方向Java后台开发,经过了秋招初期的0offer后,屡败屡战越挫越勇之后终获offer, 结果还算是差强人意。


从10月陆续得到的offer有瓜子二手车、小米、京东、度小满、新 浪微博、58同城,就面试通过率来说我还是比较满意的(哈哈哈,安慰自己一波)!


顺利上岸之后,希望回馈大家给予的帮助,所以在这里整理一份面经分享自己的秋招经历。


我的备战期主要在8、9两个月里,期间没有做特别系统的复习,仅仅针对之前的知识的重复学习加深理解。


不论是知识点也好算法题也好,真的特别容易忘,有些东西看过一遍还真就是相当于没看过,因此我后期更求质量(深度)不求数量(广度)。


这里关于秋招的笔试我没有太好的方法,就是多刷刷题LeetCode各种常见题型(DP、贪心、回溯、分治等)刷到吐!在每家公司面试的问题其实有些记不清,所以就把比较有代表性的问题汇总一下。


自我介绍:

我个人不太喜欢做太冗长的描述,其他一些无关紧要的(成绩,研究课题)都不提,主要针对项目经历的介绍


这部分时间不会太长,简单的自己项目的背景,自己负责的模块,在项目中担任的角色,可以捎带一些用到的技术点但不用展开,后面面试官会有选择性的提问。


项目介绍更重要的是让面试官了解你项目的背景,完成了哪些功能,用到了哪些核心技术,核心链路是怎样的。


基础知识篇:

Java基础:这部分问的最多的就是并发、多线程编程。


常见问题有:乐观锁(CAS)和悲观锁(Lock、synchronized)区别以及实现方式(提到Lock的时候会把AQS带出来,讲一下AQS的设计模式,设计原理等)


volatile关键字和synchronized关键字的区别,sleep、wait和yield的区别,多个线程顺序打印的代码实现(考察线程通信和线程api的使用,用concurrent包的组件实现更简单如Semaphore)。


面试官对JVM的考察频率还是很高的,经常第一个问题就是介绍一下内存模型或垃圾收集器(CMS和G1)


所以对GC的过程是要很熟悉的,最好对JVM的参数有所了解,这样可以体现出你从理论到实践的学习过程,这部分在秋招中应该也算个加分项吧。


Spring依赖注入,循环依赖怎么解决的,Spring AOP,SpringMVC原理。


最后关于Java容器这部分就被问的很少了,HashMap和ConcurrentHashMap会偶尔问,可能面试官觉得大家都熟悉容器这部分。


数据库:

数据库索引是必问的,索引失效、组合索引、覆盖索引以及数据结构都是经常问到的


一般会给你三列a,b,c建组合索引问你哪种查询会失效哪种会命中索引,或者问你怎样的场景下适合建索引,慢查询的优化等。


其次是InnoDB和MyISAM两种引擎的问题,主要有他们区别是什么,会带出事务的隔离级别和实现隔离界别的方式(例如可重复读的实现MVCC和锁)等一些问题。


计算机网络:

最最最常问的就是TCP协议了,介绍一下三次握手加四次挥手的过程以及每个阶段的状态。


为什么一定要三次握手?为什么一定要四次挥手?如果ACK没收到怎么办?大量timewait连接怎么办?


另外还会问TCP的拥塞控制、滑动窗口、重传等机制,这部分越细节越好,可以体现出面试者具有更高的计算机基础素养。


基本上计算机网络就是问协议,TCP、UDP、HTTP是最常问的。HTTP的结构,头信息,状态码301和302的区别,HTTP1.0、HTTP1.1、 HTTP2.0和HTTPS三者的区别。


操作系统:

进程线程的区别及优缺点、内存管理(虚拟内存,段页式等)、32位操作系统进程内存大小、linux多路复用select,poll和epoll的数据结构等、考察linux的常用的命令(进程端口号,进程ID,内存CPU利用率,vim的一些操作)。


操作系统这部分的确不太熟,提这里的时候我会主动告诉面试官对操作系统了解有限,之后就不再深问了。


算法:

大多为leetcode的中等题,链表、字符串、数组都是常见的题型,我觉得链表和树 是写起来最舒服的题型了,通常代码量小,也不用想太多。


具体题目有:

  • 最大子序和 (leetcode53)

  • 无重复字符的最长字串(leetcode3)

  • 三数之和(leetcode15,这道题当 时字节跳动三面时被问到了,题目忘记了最优解法导致最后挂)

  • 合并两个有序链表 (leetcode21)

  • 全排列(leetcode46,47)

  • 二叉树中序后序的非递归

  • 股票买卖的最佳时 机(leetcode121,122)

  • LRU缓存(leetcode146)

  • k个一组反转链表(leetcode25)

  • 队列实现栈(leetcode225,232)

  • 岛屿数量(leetcode200)


大概被问到这些,总之刷题 很重要,算法写不出来直接就挂了!


redis:

用过哪些redis的数据结构?场景是咋样的?底层的数据结构怎么实现的了解吗?


内存淘汰策略有哪些?redis的持久化介绍一下,AOF的重写了解吗?


主从模式是怎么做的,数据是怎么同步的,master的选举算法介绍一下?


redis的sentinel介绍一下?redis集群模式寻址问题(一致性哈希,hash槽,优缺点,解决了怎样的问题)介绍一下?


用redis做分布式锁需要考虑哪些问题,写一下redis命令。redis这部分没有问偏工程的问题(大key,热key),比较常规。


微服务:

简历上写了熟悉dubbo和springcloud,dubbo这部分是通过线上专栏学习的,熟悉了dubbo的整个架构在秋招面试中还是吃得开的(毕竟应届生不会太难为你)。


springcloud被问最多的是hystrix(线程池,信号量,断路器,怎么做隔离的,为什么这么做)。



项目篇:

由于时间关系,面试官通常让你挑一个项目来聊


首先是介绍项目的背景,提供了哪些功能服务于哪些系统?


最好以画图的方式详细说明每个服务的核心链路调用,用到的技术(本地缓存,分布式缓存,熔断),服务部署的情况等。


下面还原一下面试场景。


面试官: 介绍一个你最熟悉的项目。


我: 那就说说我实习期间负责的热搜词服务吧,这个服务的上游是大数据组的实时计算接口,通过http接口调用,返回结果为热度最高的topK个热搜词,按不同类型划分,每个类型的数量可能有倾斜。


服务的下游为客户端后台,进入搜索栏中间页的时候客户端后台将热搜词数据返回到前台去。


本接口做的是启动定时任务得到大数据组的全量热搜词,做黑名单过滤以及相似内容去重,最终将结果集(每个分类都为定量的10个热搜词)放入本地缓存以及同步到redis中,由下游调用。


面试官: 你这个热搜词服务里,redis是怎么用的?


我: redis主要为了做历史数据的备份,由于每个批次过滤得到的热搜词结果的数量可能会数据不足,因此需要做一份历史存留,也就是用上个批次的数据补足到当前批次。


面试官: 如果你这个redis数据也不足怎么办?


我: 本地有一份静态词哦,redis也不足的情况从本地补全。


面试官: 你这个服务是部署多台机器吧?那岂不是每一台执行的逻辑都一样,都要更新redis?如果我只要redis更新一次怎么做?


我: (其实这确实是存在的问题,不过当时已经知道面试官考察哪个知识点了,多节点的通信用分布式锁是比较好实现的),答曰:“给加一把锁,多台节点去竞争锁,只有拿到锁的节点可以写数据到redis。


面试官怒: 什么锁?用什么实现?怎么个加法?


我: 分布式锁,redis可以做,具体为setkeyvaluenxex/px,然后具体巴拉了一顿。


面试官: 行吧。下一个问题,你去重怎么做的?


我: 用分词器将热搜词切分成多个名词,按名词出现做的Set去重过滤(其实这部分做的很简单,没什么技术点)。


面试官: 你用Set做的去重?有没有其他做法?


我: (完全没有头绪,不知如何是好)


面试官: 你知道布隆过滤器吗?


知道呃,巴拉了一顿。


面试官: 那怎么没有用到呢?


我: (心里一想,哦确实,的确可优化),但还是找了个理由说“其实去重那部分的数据量不大,用Set实现起来比较简单而且不会太浪费空间”


面试官: 哦,那会不会有效率问题呢?


我: 不会的!因为Set那部分也是做了本地缓存的哦。


面试官: 看你项目里用了Thrift,为什么用?


我: 因为搜索这部分包含多个模块,有一部分搜索结果是c++接口做的,通过Thrift来做的java与c++的跨语言的通信(主要还是考察对技术的优缺点是否了解,面试官也没再深问)


面试官: Hystrix怎么用的?为什么用?远离了解吗?


我: 对每个跨网络的调用都做了一层熔断,在调用超时或异常时走降级策略,使用线程池技术隔壁tomcat线程和外部接口调用线程,不会因为某些接口的调用阻塞耗尽tomcat线程带来的导致服务不可用问题。断路器提供了对系统等保护,保证了我们接口的响应耗时。


面试官: 再问你个问题,同步和异步是?分别适用于怎样的场景?


我: (巴拉一顿解释同步异步),然后同步更快但会阻塞可能会导致超时等问题,异步可以减少整个接口的响应时间,带来更好的用户体验。


面试官: 那异步的缺点呢?


我: (一时没想出来呢,面试官开始引导,但忘了怎么说的了)


我: 哦,回滚起来会特别麻烦。


面试官: 差不多了,异步要比同步实现起来更麻烦,考虑更多问题。


其实不论是在项目提问还是基础知识环节,总是要给自己加戏的(通过不断引出你擅长的技术,来让面试官有侧重点的提问,反而这样不容易被问住)。







请到「今天看啥」查看全文