查看原文
其他

211 渣硕菜鸟的秋招之路!

The following article is from 石杉的架构笔记 Author SQL

本文是公众号读者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线程带来的导致服务不可用问题。断路器提供了对系统等保护,保证了我们接口的响应耗时。


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


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


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


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


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


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


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


比如“浏览器输入网址按回车的过程发生了哪些事?”这个问题,在面试初期我仅仅是从网络协议角度和单机执行业务的流程来描述


直到在一次面试中面试官引出DNS解析得到的应该是反向代理服务器的IP,让我联想到还可以结合微服务(服务发现,负载均衡,NIO,序列号协议,限流,熔断)和分库分表那些知识点来描述(更符合真实的业务场景)


这样就能引出很多知识点,然后面试官会有选择的展开提问,记得一次面试过程中这个问题只说了一半就让我停住了。


此外,针对不会的问题,可以多思考是否用哪些技术可以解决,说错其实也无妨,重要的还是考察应试者的思维方式。


另外,没有太拿得出手的项目就好好准备基础知识(计算机素养很重要),多学习具体场景的技术解决方案。


HR面:

其实校招的HR面一般是不刷人的,常见的问题有你的优缺点是什么?(优缺点要有体现于工作,将缺点从某种角度转化为优点)


你的职业发展规划?(我都是从1-3年,3-5年比较长远的角度说,突出自己有带团队的想法)


如何看待加班的问题?(欲戴皇冠必承其重哈哈哈),目前有哪些机会?


期望的薪资?(我都是实话实说的),如果你和你的leader发生冲突了怎么办?(技术评审,私下讨论解决争端,必要时妥协让步牺牲小我)。


小结:

在秋招的初期,经历了一些失败,分析自己的问题。面试过程中,也会经常被问到不会的问题,常常也是临场思考答案,因此确实答错过好多问题。


面试失败的公司:阿里(对自己项目的理解不够,项目隐含的问题,存在优化的点,欠缺了很多思考),贝壳(基础知识掌握的太浅,不够自信),字节跳动(算法准备不充分,没想起来最优解法)。所以在秋招面试中,千万要做好充分的准备。


最后,在offer选择上,我听取了石杉老师的建议,以大局为重目光长远,选择了更有提升空间的部门,应届生真没必要在意那一两个月的工资!


END

如有收获,请划至底部,点击“在看”,谢



近期热门推荐👇


1.我写了个 Chrome 插件,一键下载 Pornhub 视频!

2.如何去写一手好SQL ?

3.从一个程序员的角度告诉你:12306有多牛逼?

4.程序员除了会CRUD之外,还要知道CQRS!

5.2018年所有精华文章汇总,错过了血亏!


关注公众号,回复“BAT”
送进军BAT超全优质视频资源


点赞是最大的支持 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存