40K 成功入职:六年开发终获小米 Offer(附面经 + 面试题 + 答案详解)
前言
从面试到现在已有一个多月了,面试的问题还记得八九成。端午节前刚从上家离职趁着假期有空把面试问题总结一下。主要是记录一下问题,答案三言两语写不完,网上有蛮多文章讲的挺好所以本文不再展开。
技术栈
java, golang, js, python 主要是前面两个。
面试总结
其他 Java 团队 leader 面
其他 Golang 团队 leader 面
本团队 leader 面
总监面
之所以把面试总结放前面是因为头一次写文章没经验下面排版太朴素了,怕大家看不下去所以先简单几句话概况。面试总共 4 小时,4 轮。回忆了一下大概回答了 90~95%左右,总体感觉还可以。给我的印象这几个面试官都很专业,问题质量也挺高,人也很 nice。
这次面试像是照镜子知道了自身的不足,接下来还需扎实沉淀技术。加强算法能力。理解源码。努力不负每次机会。
2 年前从 sz 回到 wh 然后才感受到 sz 的好。属于后知后觉类型。看着以前用友的同事们一个个跳的都挺棒(阿里、腾讯、阿里、百度、京东、美团、网易等等)自己再看下自己感觉在荒野求生。
没啥爱好这几年除了玩玩游戏就是看看技术,也没考虑过人生追求,但是最近半年思考了一下人生突然知道了自己想要什么(都二十八九岁马上奔三了这也太后知后觉了)
统计下数据算个帐
19 年 wh 投了 50+ 面了 4 个 拿到 2 个。。大部分是不回复。
17 年 wh 投了 10 多个 面了 7 个 拿到 4 个。(后来某种原因拒绝了讯飞的 offer、选择了某公司)
12~16 年 sz 数据不记得了。虽然自己是个弱鸡但是感觉工作挺好找。(16 年用友)
所以 19 年 wh 真是神奇,我一度怀疑是简历太水了,发给 sz、hz 朋友看他们说还好啊没问题。难道是特朗普贸易战搞的招聘困难?【微笑】
本文标题怎讲
讲个真实的笑话,前一阵子在 wh 面一家小公司架构师职位 场景:4 个人同时面我,一个大桌子,总经理办公室
总经理:你要不要做销售啊 以前做过销售吗?
我:尴尬的说做销售太难了我没这个能力。(【黑人问号】为啥一开始就跟我聊这个,难道我看起来这么没有技术含量?我投了几十个简历了兴奋的来这里你跟我说这?这对的起我认真的态度吗?)
总经理:哦!你公司做硬件产品的啊!(我简历里有写 NLP 机器人项目)
我:“这是个软件产品”(what the f**k,大哥哥你对我有严重的误解。)
总经理:那就让技术总监来面一下吧(估计是让他没面子了)
开始技术面
他: 介绍一下你做的项目
我: 介绍某个项目的背景,说了下项目是干啥用的,简单提了一下技术栈 大概 5~6 分钟 因为要互动所以不能一个人说太久
他:GRPC 是干什么用的,你们为什么不用 http restful 来做呢
我:远程调用 基于 http2 有 4 中调用方式 序列化协议采用 protobuf(心里想这么多内容了你一个个的问吧)
他:好的,我技术面完了
总经理补了几句总结性的客套话 面试结束
【WTF 这就结束了?】这才 15 分钟不到?我就这样被淘汰了?嗯是的【微笑】
ok 综上所述 抱着终于得到了一次技术面的心情写下这个题目。
一面 Java
主要是 Java 基础 框架原理
详述线程池构造方法有哪些各有什么用、ctl、allowCoreThreadTimeOut 变量的作用,初始化阶段、大量提交任务阶段、执行完所有任务阶段这写过程。(addWorker 过程和其它部分回答得不错 runWorker getTask 的一些细节回答的不好。线程池是 Java 躲不开的问题 网上有很多答案不再细说。)
HashMap 数据结构,resize 过程,如果多线程去操作会出现哪些问题,1.7 和 1.8 有什么变化,既然提到了红黑树那么来聊聊它和 BST、AVL 各自有啥特点有啥区别,说一下平衡过程(ok。这个是基础内容网上一大把答案不再细说)
接下来聊聊 concurrenthashmap 怎样保证线程安全的 1.7 和 1.8 区别(ok)
线程有几种状态,sleep wait 区别(ok)
synchronized Lock 区别,synchronized 工作原理对象头、JVM 中锁的优化,再聊聊并发包的 AQS、公平锁非公平锁 读写锁、CAS 和底层的 unsafe(ok)
JVM 内存结构,堆的内存结构哪些是线程共享的呢,使用过 javap 命令吗结合这个命令你个谈谈对 JVM 内存各个区的理解。调优相关。(ok)
聊一下 GC,可达性分析算法、哪些对象可以作为 GC ROOT,根据新生代老年代特点的不同来说一下他们适合使用哪些垃圾回收算法。对比一下标记清除和标记整理。(ok)
类加载器,双亲委派,安全沙箱机制(ok)
聊聊 IO 吧,BIO、NIO,IO 模型,jvm 怎样实现 NIO 的呢(ok。还好之前略看了一下 JVM 这一块的 c c++代码。多路复用 非阻塞之类的就不细说了。说几个关键点,IO 模型参照《unix 网络编程》。select、poll、epoll。fcntl)
巴拉巴拉聊项目牵扯出一堆问题 一致性 hash 算法、分布式事物、Service Mesh 实践、rabbitmq(基本 ok)
TCP 滑动窗口 ACK 机制。(ok)
zuul、hystrix、feign 工作原理,springmvc 工作原理(ok)
举例说明 spring 中使用到的设计模式(ok,掘金有这个文章)
git 使用规范、gitflow(ok)
dubbo 相关问题(ok)
二面 golang
Golang 的并发模型(回答的一般 M、P、G)
聊聊 gin 源码 路由、group、middleware &设计模式(路由的实现用到了前缀树这个回答得不好 ,其它 ok)
grpc4 种调用方式,你看过 grpc golang 版源码 client --> server 这个过程你讲一下。protobuf 协议 GRPC 性能优化,http2 (ok,这个印象深刻在上家公司时候还做过分享)
cap 原理,注册中心选型 AP or CP。
etcd 是 CAP 的哪种?etcd 数据一致性算法是?详述 raft 协议,发生分区隔离之后会怎样,隔离恢复之后怎样保证数据一致性?(ok,说 raft 之前先说了一下 Paxos 后来引出了 Raft 对比一下,然后开始讲 raft 各种情况 极力推荐去这里看看 raft.github.io/)
你说看过源码那聊一下 gomicro 吧(说了一下各种组件每种适合做什么事,讲了一下我们的项目中微服务用到了哪些,上家公司 gomicro 技术栈是我推动的所以这里回答得还可以。)
聊一下你们没有采用 gomicro 的时候你们的微服务是怎样实践的(注册中心发现用的 etcd,lease 续期、服务降级、限流、熔断、缓存、一致性 hash 等负载均衡策略实现,GRPC,golang 版 rabbitmq 客户端 &断网重连。不像 spring cloud 或 gomicro 很多现成的可以用这些都是手撸 当然这是我的团队共同完成的,这过程中收获蛮多所以不要排斥学习另一门语言或者技术栈 往往会对自己打开一扇窗)
golang 压测 pprof,火焰图,结合项目讲一下架构推演 性能提升点(OK)
你们项目结构和依赖管理(OK,这里不得不吐槽一下 godep、glide 真的不如 maven 好用)
遇到过哪些坑(使用 etcd 过程中遇到的坑,使用不当造成的协程泄露以及如何避免的,watch、lease、空间压缩、等)
使用 golang 你印象深刻的是啥(协程,chan、select 这是绝壁是巨好用的,defer,panic&reverse)
golang 编码规范、日志规范(这里要提一句规范很重要,架构演进的时候做重构深有体会,然而并没有很统一的规范像 Java 阿里规范那种,对于分包官方并没有给出一个推荐的目录划分方式 所以 google 然后根据自身体会制定了一个团队内部规范 后来发现掘金有一篇文章有所共鸣并严重赞同 draveness.me/golang-101 日志框架并没有 Java 直接采用 slf4j 下面用 log4j2 或 logback 那么果断,选之又选决定用 logrus,团队的 QL 同学根据需求定制了)
三面 综合
kafka 工作原理、零拷贝、分组协调器工作原理、offset 相关问题
链路追踪 SkyWalking、zipkin 各自特点和实现原理,Java 探针
mysql 锁、索引、事务,大数据量优化 分表分库方案
redis 线程模型 skiplist ziplist 数据结构,持久化方案 rdb 快照备份的过程(copy-on-write 这个回答的不好 我只知道 Java 的 copyonwrite ,Linux fork 进程具体操作不清楚)。淘汰策略,缓存穿透 大规模失效解决方案
手写代码算法题 假设有两种操作符*和- *代表×2 -代表减一,给你两个数 a,b 要求计算出从 a 经过这两种运算得到 b 最少多少步 (ok,算法不是我强项,这题刷算法的时候也没做过还好给的比较简单,大概 10 多秒有思路 几分钟写了一下不太完整 让我讲了讲思路 使用二叉树去做)
聊一聊感兴趣的技术 未来发展方向(技术方面)
四面 总监
不详述了 就是以下这些问题
职业规划、为什么跳槽、兴趣爱好、了解一下性格、自我评价上一份工作经历等,我也问了一些问题互动了一下。
面试结束,回去等 HR 通知。
最终拿到 offer
这两年的经历一句话概括。
对就是这样,不要看轻一个人。
读者福利:
大家有什么疑问希望大家踊跃留言,觉得老詹写的还不错的烦请各位转发+关注一波,各位的支持就是老詹最大的动力,老詹根据自己的面试经验总结了一下的面试题与答案详解,需要的朋友戳此传送门获取
评论