从九月中旬到十月中旬这波总共面试了十三家公司,收到了八家offer,自己主动拒了一个面试,也挂了四个面试。因为年限不够和跳槽频繁等问题(就是菜),大厂大多没给我面试机会。所以这是一份渣渣码农的面试体会,简要谈谈我的心路历程吧。
面试公司经历
我主要谈谈我没回答好的问题。
1.连连支付(悲剧)
一面:
一面很简单,基本属于面试官问一个问题,我回答完就换下一个问题问。。当然里面我有回答的不好的问题:
- https的实现原理
哎,我知道大概是一个非对称加密和对称加密的过程 ,但是我忘记了数字签名的过程,后来也有公司问我这个问题,我还是没有回答上来数字签名的过程。。面试中没把握的问题一定要查漏补缺。。。原理见:
https://mp.weixin.qq.com/s/1ojSrhc9LZV8zlX6YblMtA - http中get和post的区别
我知道body长度不同,但是浏览器的缓存行为也是有些不同的,anyway,这个问题我不觉得很遗憾。。 - 还有其他不好的,但是他好像没发现。。。
二面:
实在话,这是我第一家面试的公司。我主要是想稍微测试下自己的能力水平(感谢帮我内推的大佬),一面结束时要了超高offer,所以就又二面了。。。悲剧现场: - nginx的作用
nginx我只知道一些皮毛,比如七层负载均衡。他问我你们是用nginx做网关吗。。我知道springcloud中的zuul,觉得两者之间还是有区别的。但是他们都有针对请求负载均衡的作用,我就说是吧。。他说你怎么不确定?究其原因是因为我对nginx和网关理解都不深,另一方面我可能面试时是大姨妈心情。。说是不就完了:( - es的相关知识
这个我真不懂,一时也补不过来。“我:是吧是吧是吧。。”知乎上发现不错的原理讲解:
Elasticsearch技术研讨
2.新康众(喜剧)
一面:
- 分布式事务
当然原理网上的博客很多,我也谈到了rocketmq可靠性事务原理和tcc原理。然后他问在创建订单并扣减库存这个场景中,如果用前者有什么问题?我懵逼了,其实前者是保证最终一致性(异步模型),不适合对分布式事务一致性要求高的场景。后者是强一致性(两阶段提交,同步模型),就适合强一致性关键数据的分布式事务场景。
关于扣减库存我发现一篇不错的文章:(大佬的秒杀系统设计)
https://time.geekbang.org/column/article/40743
二面:
因为是电话面试,我回答完面试官隔好久问我下一个,问题记忆不深刻,总之过了。
三面:
过了。
hr面:
新康众是阿里投资比重较大的一家公司,hr也是阿里的。进不了阿里感受了一把阿里hr的“话唠”,其实觉得她还蛮专业的。
3.乐信(喜剧)
一面:
- mysql数据迁移
数据迁移是一个全量数据和增量数据的迁移过程,涉及到双写,状态切换,双读等问题。虽然自己糊弄过去面试官了,但是这个问题很大,我知道我菜。。
二面 : - canal性能瓶颈
秀了一波对canal的disruptor内存队列等原理的理解,问如何解决在我们业务中canal的性能问题?我开始转移话题了,其实这个问题我看到过相关issue讨论的
image.png
回答按照Kafka的设计扩展就可以装逼了。。。
hr面 :
hr听技术老大的建议。下同~
4.云集(喜剧)
笔试 :
手写链表反转,二叉树左旋,有序数组合并三个算法题。我选了前两个,但是链表中Node对象是由value和next指针组成的,我直接用value当Node对象用了,我是傻X,等这波工作确定了就刷leetcode,立好flag。。
一面&二面 :
从源码层面上回答了他们的技术提问,每轮基本十五分钟吧。
5.小赢(喜剧)
一面 :
- 分布式锁
主要靠这两篇文章装逼:
基于Redis的分布式锁到底安全吗(上)?
基于Redis的分布式锁到底安全吗(下)?
然后他让我设计一个用mysql数据库实现的分布式锁功能,利用version乐观锁,redis中加锁和释放锁所涉及的字段以及mysql的事务保证自己磕磕绊绊回答出来了,糊弄过去了。。
二面 : - 共享变量的安全性
举了一个考察线程同步的蹩脚例子,核心就是对共享变量的修改必须通过volatile修饰和临界区互斥执行(如互斥锁)保证的。自己脑子一时短路了,不过扯了一堆volatile的原理,也放过我了。。
三面 :
怼我,妈蛋。知道了我是转行来的就不想面我的感觉。。。 - 配置中心
他:为啥自研配置中心?
我:blabla..(其实我内心知道那只是个玩具。。)
他:阿波罗也可以实现xml的可视化。
我:需求不一样的,blabla..
他:无语。。 - 圆上任意三点构成三角形,求一点落在三角形内的概率
他:数学怎么样?
我:还不错,上学时成绩不错。。
他:如题。。
我:隔了一两分钟,不会。。
他:提示了一点点。。
我:还是没有思路。。
他:无语。。 - 说说你认为工作中最有成就感的经历
我:blabla..
他:这你就有成就感了?
我:blabla..(我也无语了)
他:让我滚蛋了。。
其实还有些我回答的不错的问题,如zab协议。但是他好像马上岔开上个话题接着怼,这我就觉得也有些无语了。。可能他真的是个大佬,但是我面试体验不佳。
次日,说我面试通过了。。我:%¥!#%&?!!!
6.perfma(悲剧)
这是一个厚脸皮找假笨大佬要来的面试机会。。。
一面 :
- https的原理
如上所述,我是傻X。 - m*n方格中从左下角走到右上角的最小路径,每次只能走一步
递归问题,在他的强烈提示下才回答上来。
面试体验极佳,大佬还循循善诱,double kill...就是自己有些悲剧。。。
二面 :电话稍微聊了几句,因为个人时间问题没有约定好下次面试时间,也就不了了之了。(主要还是菜~)
7.蘑菇街(悲剧)
一面 :
- 商品表中spu和sku的设计
如果有spu和sku的概念,应该是会分别设计spu表和sku表的。但是我记得我上上家好像并没有分?我回答的不令他满意。关于业务数据建模这块我确实也不行。 - zookeeper有哪几种节点
我:blabla..
他:这些你都是从书上看的吧
我:(想骂街了,原来你前面问我的zk相关的知识我解释的不行吗)#@¥# - 统计一个城市中售卖电灯的数目
我:有内部和外部数据来源吗
他:没有
我:(艹!!!忘了反问他一句换作你你怎么统计?) - 十个文件内存不足的情况下排序
其实就是归并排序的合并过程,挂了电话马上整理出正确思路了,没回答好。
还有一些其他的问题,面试体验不佳。其实就是我真的狗屎能拿到这个offer,我也不会去的。但是能力不行,无法回怼。。。
8.平安寿险(悲剧)
一面&二面 :
基本hold住了场面,隐约中感受出他们还在用jdk7,而且对分布式的知识也不咋懂,外加知道平安好像最近加班严重,三面鸽了。。
9.酷家乐(喜剧)
一面 :
- 动态配置中的切换问题
可能导致部分请求失败,回答多版本解决。 - 业务扩张导致可能出现的问题
- es懂吗
不懂(不要问了)。。
我:blabla..
二面 : - 业务中的限流措施和背压
我:稍微从业务链路中相关组件上分析了一下组件的保护措施,也简单了设计了一下Kafka consumer到es数据同步这一过程中的背压措施。他觉得还可行,限流降级啥的我小白的。
三面 : - 电影院购买电影票链路中的业务模型设计
我:建了几张表,说了一些查询和创建订单的业务操作。
他:如何优化可能存在的sql性能问题?
我:创建合适的索引,分库分表(但是按照电影ID来做hash取模)
他:你想想这个业务场景,还可以怎么优化?
我:懵逼了,难道我表建的不行?。。。
他:应该冷热数据分离,历史数据基本不会再访问到了,所以按照时间做水平拆分合适。
哎,其实我心里有闪过冷热数据分离这个概念,我也知道有按照时间水平分库的方案。但是一瞬间思维定势的认为冷热数据分离是指宽表的垂直拆分。。。
三次面试的过程中都有类似的体会,提出的一些问题我之前似乎思考过或者见过,就是没回答上来或回答的不好。其实还是自己对业务和技术理解不深刻导致的。面试官们都有较为严谨的逻辑和抓住问题本质思考的能力,面试体验极佳。是我喜欢的一家公司。
(后续:进去工作了几天,业务部门实行敏捷开发,文档很全很清晰,DDD驱动开发,业务代码也写的蛮漂亮。关于微服务rpc调用,服务治理等内部都有二次封装的脚手架之类的。关于devops,云原生也在逐步实施中。业务开发不仅有固定技术分享,还有固定周期对业务的思考输出。每个岗位的同事都很专业,nice。真弹性的工作时间(我们组早10点没啥人,晚8点半也没啥人了),加班不严重。福利也蛮不错。强烈推荐~)
10.yy(喜剧)
一面 :
- jdk8 stream的原理
我之前看过,这篇文章有提到,但是我当时细节忘了,回答的不算好。 - spring ioc和aop的实现细节
这是面试标配了,但是我当时基本忘了具体实现细节了。这个网上参考资料很多。 - es懂吗
不懂(不要问了)。。
二面&三面 :
比较对我胃口,被我带着节奏了。。
hr面 :
hr也很赞,很负责的帮我去争取资源和提前offer审批流程。但是我更想去上面一家,对不住小姑娘了。。
11.海康威视(悲剧)
一面 :
- redis的持久化机制
主要有RDB,AOF, preamble(4.0版本后),介绍的时候忘记说了AOF的重写机制。这种细节看了就会忘,毕竟没有认真看这部分源码。介绍一些分析redis持久化的相关源码文章吧:
https://yq.aliyun.com/articles/193034
https://yq.aliyun.com/articles/177819?spm=5176.100239.blogcont193034.16.bJvNNC
https://youjiali1995.github.io/redis/persistence/
二面 : - Spring Bean的生命周期
我知道Lifecycle接口,框架中需要有生命周期的关键对象通常都会定义init/destroy等接口,当时只回答了单例的bean生命周期由Spring容器。多例的没有回答,其实现在想想就是不把对象放到容器中,所有的强引用都是由用户自己的代码控制,按照垃圾回收策略回收就是了。Spring真的很庞大,源码撸着撸着就撸不动了,具体细节看了忘啊。。。
其实二面基本是我回答完一个问题他们就不追问了,可以感觉出他们比较菜(谁让他们拒了我~)。不过毕竟自己客观条件不太好,自从知道我转行的,谈话就变味了。。海康威视牛逼的也不是做Java后台的,我本来也没打算进去修福报(酸了酸了)。
12.菜鸟网络(喜剧)
阿里不管简历多烂,至少给面试机会啊。。不像那么多大厂。。。
一面 :
过了。
二面 :
- 一个服务端一堆数据,单客户端一次只能取一个,如何从服务端不重复随取取完?
其实服务端就是数组+链表的hashmap存储方式,然后需要处理数据量小的时候的缩容操作。
在他的一步步提示下,我先后回答了数组+hash,hashmap,链表,链表+随机创建链表,hash+数组+链表+缩容的hashmap 存储方式。
其实觉得自己从源码中来来回回接触很多次这几个数据结构了,但是当时不能清晰的经由大脑思考马上回答出来,沮丧,我真的是傻X。
三面 :
- 类加载机制
周志明那本书长长的一段总是背不下来啊...我细节说的不好。但理解这些原理我觉得是很有用的。从类加载机制到类加载器到字节码增强,Java agent等等。不说了,我不懂。 - 对于数字数组:1,9,3,45,56,345排序组成一个最大的数字,其中45,56,345不能拆开。
我知道组成一个最大的数字就是要保证他的每一个高位上是当时排序结果中最大的数字就好,然后就说了暴力破解的方法。他问我怎么优化?我知道这是一个套路题,看数据结构相关视频的时候好像有遇到过,但是并没有刷过算法题,也只是知道一些皮毛。脑海里能想到的就是多次比较时用一些空间换时间,记录相同数字的字符前缀?不知道,等以后刷题时再想吧。。。
四面 :
- 设计一个连接池
其实脑海里是有思路的,回答的时候我类比了线程池,马上被打断了,说是不一样的东西。我面试完整理后的想法就是:
1.volatile的连接池数组(还是要类比线程池的线程数组,哈哈。池化资源就是存着资源数组嘛),同时对连接池的数组修改API是同步安全的。
2.一个连接其实就是一个客户端服务端的socket通信,既然是连接池那么通常就是短连接了,不然没必要搞池化。存在的问题有:连接保活多久?获取连接时连接关闭后的重试?
关于连接保活我知道tcp层面 KeepAlive 机制,在一定时间内(一般时间为 7200s,参数 tcp_keepalive_time)在链路上没有数据传送的情况下,TCP 层将发送相应的 KeepAlive 探针以确定连接可用性,探测失败后重试 10(参数 tcp_keepalive_probes)次,每次间隔时间 75s(参数 tcp_keepalive_intvl),所有探测失败后,才认为当前连接已经不可用。(摘自https://lexburner.github.io/tcp-talk/)
但是如果是短连接的话,服务端或者客户端有权决定何时关闭这个连接,如redis的timeout配置。所以如果服务端没有连接超时时间的话,客户端连接池应该也有类似参数配置。
问题二:如果socket已经被对方关闭或者内核层面关闭了,我觉得应用层面如果不主动调用socket相关API的话,应该是无法感知的(我的理解,应该不是事件通知的设计机制)。所以当使用这个连接时,捕获完连接异常应该有一定重连操作(重新创建新连接或从连接池中取)。
3.负载均衡,服务发现
对于可水平扩展或主从设计的框架,如Kafka/Redis。客户端需要选择数据分片正确的服务端节点与之建立连接,同时当服务端节点崩溃时也需要重连到可用的服务端节点。对应的也就会有负载均衡,服务发现,连接池的内存结构等这些问题。
以上纯属不负责任的yy,毕竟我没有看过开源连接池组件的设计和源码,等以后有机会在看吧。
13.e签宝(喜剧)
这是鲁道大佬给争取的面试福利,很顺利的通过了。除了感谢大佬没啥可说的。
面试体会
面试中主要认识到了自己技术/业务/沟通表达能力上都是有不小提升空间的。
技术方面 :
基础知识肯定还是很欠缺的,稍微有点难度的算法就gg了。下阶段首要任务就是刷算法题。。还有计算机网络/操作系统/数据库等等基础知识,这个是根基,我基本是飘着的。。
服务治理:应该有了一些理解,但是关于性能测试(更别提全链路压测了),分布式事务,链路追踪,限流降级,ES等只知道一些似是而非的皮毛。
业务方面 :
本身经历的项目不算复杂,也没想着好好研究业务,更别提如何用最合适的技术去解决业务问题了,毕竟我还要看动画。。但是我知道能够深刻理解业务,能够运用技术解决业务问题的人都是大佬。首首要任务:熟悉下家业务,思考这方面的问题。希望平稳度过漫长的试用期。。。。
沟通方面 :
语言表达能力一方面是看这个人是否本身足够头脑清晰,思维缜密,另一方面讲话的措辞也是一门艺术。都需要修炼。。。
牛逼的人总是双高(神除外。。。),这么说来又要夸自己菜了。。我觉得我可以尝试做出的改变(flag)就是:
- 有意识培养牛人的思维方式
养成时时刻刻思考的习惯,先找出问题,深刻理解问题,知道了问题的特征和痛点才能对症下药。当然纸上谈兵没个X用,渣渣就是要一步步升级打怪。 - 行动力
迈出第一步时别犹豫,追求有收获进步的快感吧。努力,再努力。锻炼,再锻炼...笨就努力变成小强吧。。。
ps:面试中不知不觉人就被打了鸡血,很积极向上有梦想?。我希望我可以保持下去这个自己。。。
学习过程中好的资料
面试题其实大多是网上的常规题,我觉得我回答的还行的就不扯了,主要是我不咋记得了。。。列举一下我学习过程中觉得蛮不错的资料吧:
- JDK/disruptor
并发包:
part1:《Java并发编程的艺术》,《Java并发编程实战》,小明哥的死磕Java并发系列
这些内容都很有水平,对我这种初级渣渣也很友好。起初的目标只是先看懂实现原理,看了多遍还是会忘。
part2:阅读源码,思考为什么要这么设计,解决了什么问题。(disruptor放在这里是因为是多生产者多消费者模型,可以和同步队列线程池一起对比)关于并发生产者消费者模型等这个公开课我觉得讲的超棒:
计算机操作系统并发
BIO/NIO:
关于这块网上零散的文章很多,我觉得我一点点加深理解的流程大致为:BIO/NIO的区别,简单demo(api的使用),IO通信模型,NIO server的实现(如zk/netty的实现细节)。主要还是网络通信模型,网络知识就看大头书吧,其实我也不行。。理解epoll的话结合epoll的使用和原理相对简单些:
https://www.zfl9.com/c-socket-io-model.html
https://my.oschina.net/editorial-story/blog/3052308
《Effective Java(第三版)》
- JVM
《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》
极客时间-深入拆解Java虚拟机—深入的知识就看不懂。。
R大/你假笨/占小狼的博客
假笨大佬也有perfma的jvm讨论社区,还有一个视频,更加声情并茂的讲了几个jvm问题。
OS 造成的长时间非典型 JVM GC 停顿:深度分析和解决 : 视频拍摄的不太友好,此为配套ppt
网上的相关案例也很多,我只是一个见过猪跑的。。。 - Spring/SpringMVC/Springboot/Mybatis/Netty
艿艿的知识星球中有详细的源码解析,艿艿也整理很多比较优质的博客文章。我觉得可以基本了解原理,蛮划算的。艿艿牛逼。 - Mysql
MySQL 是怎样运行的:从根儿上理解 MySQL
MySQL实战45讲
前者看完基本单机mysql原理就明白了,后者偏实战,会以具体案例分析的方式来讲解原理。我都看了至少三四遍吧,都超级赞。
再深入一些可以看阿里数据库内核月报,当然我是看不下去的。。 - Redis
关于使用我觉得看《Redis开发与运维》和官方文档(超全超赞的),深入些的话《Redis设计与实现》,Redis 深度历险:核心原理与应用实践也不错。
还发现超赞的Redis源码分析系列:
http://zhangtielei.com/posts/blog-redis-how-to-start.html
https://youjiali1995.github.io/categories/#redis
当然有antirez大佬自己的博客,http://antirez.com/latest/0
里面有很多redis设计的解释等等,我也没看过几篇大家自己发现吧。
ps:我在跟着上面各种资源看redis源码前,并不会c语言。。c语言是相对底层的语言,至少需要对操作系统原理有一点了解,期间我也发现了不错的c语言学习系列
- Netty
网上资源很多的,闪电侠/占小狼/艿艿/零度等等都有很多相关源码分析文章。 - Kafka
《深入理解Kafka:核心设计与实践原理》—厮大牛逼。 - Canal
为了看这个框架,我才认真去刷了几遍mysql的相关资料。关于Canal可参考:
田守枝的canal源码分析
官方文档和issue:阿里的框架啊,issue讨论也基本都是中文,看完官方文档和issue再具体去看源码难度会小很多的。
我博客里也写了两篇canal源码分析,可以随便看看。哈哈 - 分布式协调
分布式一致性的原理当然是paxos了,论文我是没看过的,觉得知乎的相关讨论也够小白消化了。
raft的话有相关论文,也有中文翻译,最好还是看作者的视频讲解。(我只是看过一遍,主要尝个鲜吧,并没有很理解他的实现细节,觉得和zab傻傻分不清楚)。
zookeeper的也有相关论文,在学习zookeeper的源码过程中,我还是很依赖《从Paxos到Zookeeper:分布式一致性原理与实践》这本书先大概梳理了主流程。自己也试着写了源码分析,虽然不咋地(因为是我自己第一遍读的时候编写编整理思路,自己再读还是发现一些错误的,欢迎拍砖。。),但是试着写源码分析的好处就是能帮助自己梳理清楚逻辑,发现问题。原来一个框架的实现要考虑这么多可能出现的异常情况啊... - 基础知识
适合我这种无基础小白的科普课:
哈佛大学公开课:计算机科学cs50
Crash Course Computer Science
计算机操作系统
数据结构
趣谈网络协议
Linux性能优化实战
放了这些资料不代表我都懂了,也不代表是最好或者适合你的,这些都是我的主观认识。比如计算机基础课,大牛们的经典书籍啥的肯定更系统全面。仅供稍微参考下吧。
此外我的一点体会是一定要试着深入研究一个较为优秀的框架,辅助这网上众多博客和官方文档等资料,只要下定决心,是可以完成读一个完整框架源码这一步的,当然需要反复阅读,遇到不懂的细节就重新翻翻。然后才会有较为深刻的知识理解,知识理解也是解决问题的第一步吧。
文中有错误或不当的地方欢迎指出。其实道理大家都懂,我也知道自己哪方面薄弱。差了点行动。共勉之。












网友评论