注:文章没有花过多心思打磨,记录为主,因此语句比较粗糙。
背景:本文纯粹是记录自己面试经历,如果你有着和我一样的背景、一样的工作经验,那么这篇文章说不定对你也有点用。
一、简单介绍一下自己
我是小猪,是名毕业不久的沪漂人员,当下在一家上市公司担任软件工程师一职(俗称:码农),你可能知道现在咱国家把咱定义成新型农民工,迄今为止算上实习也有近两年经验。
二、这一次跳槽的几家公司介绍
这次面试了四家公司,分别是某某买菜、某物、某通、某旗。
2.1 某某买菜
XX买菜是一家快速成长型公司,业务营收应该主要靠一线城市。
公司比较青睐具有互联网经验的童鞋,比如你对用户(会员)、支付、商品、各类满减活动、库存(各类模型)等业务比较熟知。
总之一句话,如果你工作年限较短(三年内)或者没有电商经验,那么你可能不是他的首选,这也就是这家公司为啥从不校招的原因。
2.2 某物
某物和某某买菜差不多,都是快速成长公司,属于电商范畴。
某物和字节类似,分大小周,加班文化严重,但是年终非常多,据我所知基本上年终为六个月。
2.3 某通
某通的业务处于国内市场占有率第一。数据量也是越来越庞大,据说现在的日订单量已经突破1亿。应该是红利期的到来。
2.4 某旗
某旗为世界五百强企业,属于外企,金融板块。
但出乎我意料的是,某旗居然一轮面就结束了,HR面就是电话沟通进行双方了解。
上班地点在外滩,有独立的大楼,可谓财气十足,据说某旗几乎不太加班、甚至可以弹性上下班、协助办理居转户。你懂的,就是各类外企福利。如果想一直干下去,或者想找份轻松的工作,可以考虑。但技术可能相较于其他公司会稍显老旧一点。
以上的感受主要来自于面试难度与网络评论。
三、每家公司面试流程
3.1 某某买菜
3.1.1 面试流程
一共三轮面试。
一轮面试重基础,面试官就MySQL问的最多,基本上占整个一面大半时间,包括MVCC、事物、引擎、SQL优化、各类锁、文件、底层原理、索引结构。
二轮面试为现场面试,考察了一道动态规划算法、Java知识、各类场景题与设计能力。
三轮面试是跟在二轮面试之后,主要看个人的抗压能力,会告知你公司在快速成长中,加班较多等等这些,如果你个人有东西不熟悉,在短时间内完不成,你会怎么做... ...
3.1.2 面试感受
面试官都很Nice,你有答不出来的场景,可以直接反向咨询,他们会毫不吝啬的告知他们的解决方案。
3.2 某物
3.2.1 面试流程
一共两轮面试。
一轮面试重基础,一道算法题,TCP协议与HTTP协议中报文字段解释、有没有抓过网络包、Java基础知识
二轮面试,多为一些场景题,比如在生产环境中如何监听Kafka的消息是否有出现丢失等情况。
3.2.2 面试感受
面试官也都很和蔼,还是那句话,不会的东西反向咨询。
3.3 某通
3.3.1 面试流程
一共三轮面试。
因为路途比较远,我选择了直接去现场,一天面完。
一轮面试有基础也有场景题,比如Java基础啊,服务压力大如何解决,分库分表的ID生成问题,数据库、缓存这些,写出HashMap1.7中Hash算法hash(key) % (length -1)
,包括为什么这样设计、一致性算法、数据库。
二轮面试是架构与HR一起面我,不得不说,架构还是架构,确实有难度了。各类场景、分库分表各个注意事项、RPC、底层原理这些、平衡二叉树、红黑树的左旋、右旋伪代码。
三轮面试是HR单独面试,问了离职原因,包括期望薪资这些。
3.3.2 面试感受
面试官也都很和蔼,还是那句话,不会的东西反向咨询。
3.4 某旗
3.4.1 面试流程
一轮面即过。
技术面试官也很和蔼,人很nice,面试一开始是英文面试,问了六个题目,要求英语回答,但难度不是特别大,英语六级足够应付了。然后就是一些基础题目包括Java与Spring等,但是没有算法题与复杂的场景题目,面试较轻松。
HR面:通过电话沟通。
3.4.2 面试感受
HR很负责也很专业,整个面试响应都非常快速。
四、面试题整理
我整理一下这些公司面的题目,我就不分公司整理了,各个公司大抵相似。
1.五子棋算法题
算法描述:
现有一个五子棋盘,格子中白子用1表示,黑子用0表示,现在黑、白都走了若干步,现在黑子再下一颗子,试问,黑子能赢吗?
2.Java方法重载
3.Java启动命令中添加Agent参数的作用
4.数据库索引的理解
5.HTTP报文
6.有没有抓过包
7.HTTPS相比HTTP以往版本的区别
8.做过的项目
9.你做的数据同步,为什么同步的原表不使用binlog这些归档日志,再使用Cannal等框架监听,以达到实时性?
10.你做的实时区如何保证生产数据的一致性,至少kafka不能丢数据吧,有什么监控工具吗,包括数据一致性如何保证的?
11.Java HashMap在1.7与1.8的区别
12.ConcurrentHashMap在1.7与1.8的区别
13.CAS的过程
14.如果线上Java进程有异常了,那么可以通过什么样的工具去进行排查
15. 创建索引的注意点
1. 比如需要查询A、B、C、D都需要索引,该如何创建,组合索引还是分开创建
2. 比如select a,b from table1 where a = 1, b = 2 group by c, order by d
16. 索引创建过多会有什么样的问题
17. 建立索引需要注意什么,或者什么样的字段适合创建索引
18. group by的底层原理
19. 你SQL优化的一个思路是什么样
20. Explain查看执行计划需要看哪些字段、以及Type的一个排序、正常SQL最好要达到什么样的级别
21. 如何在一张已经存在的表中添加添加组合索引,说出SQL语句
22. 聚簇索引和非聚簇索引的区别
23. 不同引擎内部存储数据文件的格式
24. HashMap 1.7 VS 1.8的具体区别
25. HashMap与HashTable这两个类分别继承了什么类与实现了什么接口
26. ConcurrentHashMap
27. 设计模式,比如这些模式在Spring或者MyBatis中结合具体的场景说一下,最后问了一个策略模式,用场景描述一下
28.算法题:爬楼梯算法,现在一共有N级楼梯,每次只能爬一步或者两步,现在问你一共有多少种爬法
29.Java锁包括JVM关键字锁与Lock锁、CAS锁、锁升级的过程
30.TCP如何保证消费顺序性
31.TCP的粘包、拆包如何解决,以及什么情况会出现粘包、拆包
32.一道场景题目:Redis中某个Key是热点数据(先不考虑缓存的三大问题),单台Redis实例的QPS为10w,但是此时的流量已经远远大于10w,该如何解决?
两个思路:
> 在业务层通过本地缓存去做一部分流量的缓冲
> 因为在Redis集群分片中,一个Key会被一致Hash到某个Redis实例,那么我们在存储的时候,可以通过在Key的后面添加数字后缀,让这个key可以打到多个Redis实例中,在查询的时候,通过在后面添加随机数,从而让key随机达到任意一个Redis实例,以达到流量分摊的作用。
33.英文自我介绍
34.为什么在你毕业之前就去工作了
35.为什么现在要考虑换工作
36.在之前的公司与现在的公司是属于什么职位?
37.聊一下Java集合类,考虑一个场景因为ArrayList删除元素回涉及到移动,考虑一下在只能有一个ArrayList对象如何删除偶数位的数据
38.JVM聊一下
39.程序计数器
40.数据库
41.Spring的启动流程
42.HashMap 1.7 VS 1.8
43.HashMap 1.7中如何计算hash桶,hash桶扩容为何要满足2的n次幂
44.分布式锁 ZK 与Redis的两种方式
45.mysql 字符集utf-8与utf-8mb4
46.一致性Hash算法
47.分库分表的概念
48.Dubbo
49.在分库分表的背景下,生成订单ID的服务是供给多个业务服务的,那么如何解决订单服务的压力
50.mysql索引
51.Java锁
52.Kafka消费端在大压力情况下,因为处理一些消息的过程中,可能涉及到很多下游的服务,那么此刻如何处理,比如下游服务下线了,那么如果消费者一直进行重试,势必会造成Lag的激增
53.分布式锁,包括ZK与Redis、ZK可以实现哪几种分布式锁
54.聊一下项目
55.MySQL聚簇与非聚簇索引的区别
56.说一下SQL如何进行优化,对慢SQL而言
57.HashMap
58.平衡二叉树的优点
59.红黑树的右旋操作的伪代码
60.Spring @Value的作用,与Java启动类中的参数对比,与谁的优先级更高
61.Dubbo
62.分库分表的注意点
63.Java深拷贝与浅拷贝的区别
64.hashcode与equals的联系
65.Java双亲委派机制以及带来的优点
五、个人最后的感受包括个人的前期准备
面试前还是需要准备一下的,八股文该了解的还是得了解,其实你了解了这些原理之后也并不是没用,这可以帮助你快速定位问题,甚至看到好的思路可以用在自己的代码中,就比如JDK1.8里很多异步工具,这些工具里面有很多巧妙设计可以用在你项目的线程模型中。
八股文的东西都了解了,剩下就是你负责的项目亮点,你得找出你项目中的亮点,亮点不够多的话,那么二面三面就没太多聊的。面试官如果想招聘一个熟练工,那你可能就被淘汰了。项目中如果有一些高并发、一致性的问题最好不过了。
最后算法还是需要持续准备,这对面试有用,对你个人写代码也有帮助。
面试时的技巧,尽可能让面试官能够更多的挖掘出你的能力,这一次我做的有点不到位,Java的BIO、NIO、AIO的编程模型包括使用Netty搭建的路由中间件没有表达的足够好,因此没能抓住面试官的兴趣。
如果你有兴趣,可以查看我的路由中间件的仓库哦:https://gitee.com/zhuchaoyang1/router-parallel.git
总之一句话:基础原理、项目一定有亮点、算法。
最后如果你想去互联网的话,还是尽早一丢丢打算比较好。