【本人秃顶程序员】三年半 Java 后端鹅厂面试经历

←←←←←←←←←←←← 快!点关注程序员

通过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于开始重拾面试信心,再次出征。web

鹅厂

面试职位:go后端开发工程师,接受从Java转语言。面试

都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言,以前面试Java的公司侧重仍是在数据结构、网络、框架、数据库和分布式。因此OS这块吃的亏比较大。redis

一面基础技术面

电话面试,随便问了些技术问题,最后还问了个LeetCode里面medium级别的算法题,偏简单。算法

一、redis有没有用过,经常使用的数据结构以及在业务中使用的场景,redis的hash怎么实现的,rehash过程讲一下和JavaHashMap的rehash有什么区别?redis cluster有没有了解过,怎么作到高可用的?redis的持久化机制,为啥不能用redis作专门的持久化数据库存储?数据库

二、了不了解tcp/udp,说下二者的定义,tcp为何要三次握手和四次挥手?tcp怎么保证有序传输的,讲下tcp的快速重传和拥塞机制,知不知道time_wait状态,这个状态出如今什么地方,有什么用(参考quic)?后端

三、知道udp是不可靠的传输,若是你来设计一个基于udp差很少可靠的算法,怎么设计?数组

四、http与https有啥区别?说下https解决了什么问题,怎么解决的?说下https的握手过程。缓存

五、看你项目里面用了etcd,讲解下etcd干什么用的,怎么保证高可用和一致性?服务器

六、既然你提到了raft算法,讲下raft算法的基本流程?raft算法里面若是出现脑裂怎么处理?有没有了解过paxos和zookeeper的zab算法,他们以前有啥区别?

七、大家后端用什么数据库作持久化的?有没有用到分库分表,怎么作的?

八、索引的常见实现方式有哪些,有哪些区别?MySQL的存储引擎有哪些,有哪些区别?InnoDB使用的是什么方式实现索引,怎么实现的?说下聚簇索引和非聚簇索引的区别?

九、有没有了解过协程?说下协程和线程的区别?

十、算法题一个,剑指offer第51题,数组中的重复数字?

本身的回答状况,redis这块没啥问题,具体rehash有印象是渐进式的,可是具体原理可能答的有点出入。tcp的time_wait这块答的不是很好,以前没有了解过quic机制的实现,因此问可靠性udp的时候,基本上脑子里就照着tcp的实如今说。https这块没啥说的,以前项目里面有用到相似的东西,研究的比较清楚了。raft算法这个由于恰好在刷6.824(才刷到lab2。。。),答的也凑合,不过paxos和zab算法确实不熟悉,直接说不会。MySQL这块很熟了,包括索引,锁,事务机制以及mvcc等等,没啥说的,都已经补齐了。协程和线程,主要说了go程和Java线程的区别以及go程的调度模型。面试官提示没有提到线程的有内核态的切换,go程只在用户态调度。最后一个算法题,首先说使用HashMap来作,说空间复杂度能不能降到O(1),后面想了大概5min才想出来原地置换的思路。

欢迎你们加入粉丝群:963944895,群内免费分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思惟导图

二面项目技术面

一、主要针对本身最熟悉的项目,画出项目的架构图,主要的数据表结构,项目中使用到的技术点,项目的总峰值qps,时延,以及有没有分析过期延出现的耗时分别出如今什么地方,项目有啥改进的地方没有?

二、若是请求出现问题没有响应,如何定位问题,说下思路?

三、tcp 粘包问题怎么处理?

四、问了下缓存更新的模式,以及会出现的问题和应对思路?

五、除了公司项目以外,业务有没有研究过知名项目或作出过贡献?

基本都没有啥问题,除了面试官说项目经验稍弱以外,其他还不错。

三面综合技术面

这面面的是阵脚大乱,面试官采用刨根问底的方式提问,终究是面试经验不
够,致使面试的节奏有点乱。 举个例子,其中有个题是:go程和线程有什么区别?

答:起一个go程大概只须要4kb的内存,起一个Java线程须要1.5MB的内存;go程的调度在用户态很是轻量,Java线程的切换成本比较高。接着问为啥成本比较高?由于Java线程的调度须要在用户态和内核态切换因此成本高?为啥在用户态和内核态之间切换调度成本比较高?简单说了下内核态和用户态的定义。接着问,仍是没有明白为啥成本高?内心瞬间崩溃,没完没了了呀,OS这块依旧是痛呀,支支吾吾半天放弃了。

后面全部的提问都是这种模式,结果回答的节奏全无,感受被套路了。大多度都能回答个一二甚至是一二三,可是再日后或者再深刻的OS层面就GG了。

后面问了下项目过程当中遇到的最大的挑战,以及时怎么解决的?

后面还问了一个问题定位的问题,服务器CPU 100%怎么定位?多是因为平时定位业务问题的思惟定势,加之处于蒙蔽状态,随口就是:先查看监控面板看有无突发流量异常,接着查看业务日志是否有异常,针对CPU100%那个时间段,取一个典型业务流程的日志查看。最后才提到使用 top命令来监控看是哪一个进程占用到100%。果真阵脚大乱,张口就来,捂脸。。。 原本正确的思路应该是先用 top定位出问题的进程,再用 top定位到出问题的线程,再打印线程堆栈查看运行状况,这个流程换平时确定能答出来,可是,可是没有可是。仍是得好好总结。

最后问了一个系统设计题目(朋友圈的设计),白板上面画出系统的架构图,主要的表结构和讲解主要的业务流程,若是用户变多流量变大,架构将怎么扩展,怎样应对?这个答的也有点乱,直接上来自顾自的用了一个通用的架构,感受毫无亮点。后面反思应该先定位业务的特色,这个业务明显是读多写少,而后和面试官沟通一期刚开始的方案的用户量,性能要求,单机目标qps是什么等等?在明确系统的特色和约束以后再来设计,而不是一开始就是用典型互联网的那种通用架构自顾本身搞本身的方案。

总结

一、tcp/udp,http和https还有网络这块(各类网络模型,已经select,poll和epoll)必定要很是熟悉。

二、必定要有拿的出手的项目经验,并且要可以讲清楚,讲清楚项目中取舍,设计模型和数据表。

三、分布式要很是熟悉。

四、常见问题定位必定要有思路。

五、操做系统,仍是操做系统,重要的事情说三遍。

六、系统设计,思路,思路,思路,必定要思路清晰,必定要总结下系统设计的流程。

七、一点很重要的心得,平时blog和专栏看的再多,若是没有本身的思考不过是过眼云烟,根本不会成为本身的东西,就像内核态和用户态,日常也看过,可是没细想,忽然要本身说,还真说不出来,这就很尴尬了。勿以浮沙筑高台,基础这种东西仍是须要时间去慢慢打牢,多去思考和总结。

欢迎你们加入粉丝群:963944895,群内免费分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思惟导图

写在最后:

秃顶程序员的不易,看到这里,点了关注吧! 点关注,不迷路,持续更新!!!