准备过程 我自己是本科毕业后在老东家干了两年多,老东家算是一家”小公司”(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找坑的时候是非常非常虚的。迫于心慌,我好好思考了一阵来给自己打气,当时真正找坑和准备面试的过程大概分为这几个阶段:
- 反思:自己是不是真的要离职,假如不离职,在老东家接下来应该做什么才能继续提升?
- 定位:我在硬性技能(编码、架构)上的长处在哪?我在软技能(沟通,团队)上的长处在哪?这步顺带写了简历
- 寻找平台:哪些平台能同时满足:1、有挑战有上升空间;2、符合我的定位方向;3、团队氛围和老东家一样好(或更好)
- 找人内推:基本都是在 v2 上找的(诚挚感谢各位帮助我内推的大佬)
- 面试谈 offer
然后把学习能力强,喜欢沟通合作,渴望挑战作为我的”软招牌”,最后把自己定位成一个”在过往经历中展现出了过人学习能力和钻研能力,同时渴望挑战,不愿意呆在舒适区”的形象。
这个过程中,我的方法论是”换位思考”。自己过去也面试过不少人(所以平时公司让我去面试,虽然累点苦点,但也都是积累呀),并且也和 HR 以及放出 HC 的业务方聊过我们希望放什么样的人进来。因此全程都在以面试官的心态来考察自己:
假如我是面试官,我会招怎样的人进来做我的同事?举几个例子,下面都是我在这个过程中考虑过的问题(当然只是我自己的喜好):
- 对于一个毕业两年多的人,我最希望他有什么特质?这个阶段的人其实还是”空杯”,我希望他有很强的学习能力和进取心,给自己部门培养出一个超级生产力;
- 什么样的行为会让我”讨厌一份简历”:把每个项目都大写特写,尤其是陈述细节没有重点;罗列框架当能力,用过了一类场景的框架就觉得能解决一类业务诸如此类;
- 面试的时候我会偏向于问哪些问题?一是简历上写了”理解”或”精通”的语言与中间件;二是简历上写得比较有趣,又没有完全交代清楚的项目;
简历投递出去之后,我着重把简历里”埋的几个坑”,也就是自己写了”理解并掌握”的语言与中间件以及专门用来勾引面试官问的项目好好复习了一遍。事后发现这一步还挺关键的,很多知识性的内容要是不复习一下真就全忘了,这也算临阵磨枪,不快也光了吧。
面试前 PingCAP 的简历响应是最快的,内推之后第二天 HR 小姐姐就联系了我。电话接通之后先是简单聊了一下人生,然后就是社招三问 [”为啥离职啊?”,”现在待遇咋样啊?”,”期望待遇咋样啊?”],之前还完全没有准备过类似的问题,只能稀里哗啦用[”现在自己的技术成长有点碰到瓶颈,加上一直对您公司钦慕有加”,”我现在待遇是xxx但我司除了base之外还有xxx以及我马上要提薪了”,”其实比起待遇我更看重平台和挑战,但是基本的薪资需求我还是希望能xxx”]这样和稀泥应付过去。内心稍稍平静之后小姐姐跟我讲了讲我意向部门的结构和主体业务,然后交代了一下接下来的面试流程,约了”一面”并且加了微信。
“一面”加了引号,这是因为”一面”其实是在微信上布置了一个小项目,然后约定好时间验收。
这里要特别感谢一下 PingCAP 的 HR 小姐姐,加了微信之后全程帮助我协调面试时间并不厌其烦地回答我各种奇奇怪怪的问题,最后谈 offer 的时候还给我准备了一个惊喜。面试体验直接满星<3!
一面 早就听说 PingCAP 一面要写小项目,我自己心里其实是跃跃欲试的。面试官给的项目要求大体是这样:
K8S 容器化之后应用容器里几乎没有什么可用的调试工具,可以利用容器 Namespace 共享的思路,启动一个包含各种调试工具(比如 netstat, gdb)的容器,加入到 pod 的 pid、net 等 namespace 中, 实现对任意 pod 的 debug 功能。现在希望利用 kubectl plugin 机制实现一个插件,用于 debug 任意一个 pod 里的容器,达到 kubectl exec 的使用体验。
当时因为工作日抽不出时间,就隔了几天到周五晚上开始写,周六晚上写完并且把 项目地址 分享到了 Reddit 上。没想到运气不错收了 100 多个 star,这下我就觉得”哦豁,这轮应该稳了吧!”(结果后来发现这几乎是我唯一一把觉得自己”稳了的”面试…)
二面 二面是一位 Cloud 方向的前辈面我,全程大概微信语音聊了50多分钟:
- 问项目经历,聊了两个项目
- 对 Kubernetes 了解怎么样,看过源码吗?
- k8s 的代码我以前其实只看过 kubelet,临阵磨枪的时候把apiserver、scheduler、controller-manager 都看了一遍,笑容渐渐出现。
- Kubernetes 的 Service 是什么概念,怎么实现的?
- 你刚说到 Informer,Informer 是怎么实现的,有什么作用?
- StatefulSet 用过吗?有什么特点?
- StatefulSet 的滚动升级是如何实现的?
- 现在我们希望只升级 StatefulSet 中的任意个节点进行测试, 可以怎么做? 这题没有思路,只好强答用”两个StatefulSet”,后来一想起一个新的 StatefulSet 那 PV 里的数据就丢了,其实正确办法是利用 partition机制,笑容渐渐消失。
- Kubernetes 的所有资源约定了版本号,为什么要这么做?第二个拿不准的问题,我面试前就反复告诉自己”不要强答“以及”不知道的题就讲思路“,于是就说这块代码确实没看过,但是根据微服务API 的设计理念,版本号的作用有巴拉巴拉。答完似乎面试官还算满意,于是又往下挖了一句:
- 假如有多几个版本号并存, 那么 K8S 服务端需要维护几套代码?这题完全不知道,内心逐渐焦灼,立马走老套路”这我没看过 k8s代码怎么写的无法确定(想表达自己真正看过代码才会确认,凸显自己严谨…我的妈呀),但假如由我来写这份代码(装作非常自信),我会只会维护一份最新的Model,然后设计对应一个版本段的 Adpater 将老版本的 Model 转化过来巴拉巴拉”。到这里我已经虚的不行了
- OK,那接下来我们聊聊 Golang (我:长舒一口气)
- 看一下这段代码有没有问题(一段 golang for-range 里 goroutine 闭包捕获的代码),为什么?
- goroutine 是怎么调度的?
- goroutine 和 kernel thread 之间是什么关系?
- 有什么想问我的?
三面 三面是和整个大部门的 Leader 聊,面试官很能聊,而且技术非常全面,全程大概微信语音聊了80多分钟:
- 给我介绍 PingCAP 相关团队的职责与挑战
- 聊为什么出来看机会,以及未来的职业规划
- 聊我之前做的一个数据同步的项目,大概内容是订阅 MySQL Binlog,sink 到搜索索引、分库分表以及业务事件订阅流中
- 为什么数据同步里选择了 xxxx 开源项目,优势在哪?
- 订阅分库分表的 Binlog 怎么订阅?
- 分库分表的数据源中假如存在主键冲突要怎么解决?
- 怎么保证下游对 Binlog 的消费顺序?
- 如何在下游保证消费时的事务原子性?
- 描述了一下 tidb 的 binlog 架构,问这种场景下怎么保证 Binlog 顺序
- 聊一个上了 Kubernetes 的项目,问了一些细节和坑
- 用 Kubernetes 之后,解决了哪些问题?
- 聊我之前做的监控警报项目,问背景和产出
- Prometheus 单实例数据量级 hold 不住了,有什么解决方案?
- 有什么想问我的?
四面 四面到了现场面,有两位面试官一起跟我聊,大约聊了 40 多分钟:
- 聊”配置中心”项目的细节
- 为什么不用 ZK,要自己再写一个”配置中心”,这个问题让我措手不及,我只好坦白:当时年轻,想刷经验,事后才领悟到不要重复造轮子,当然最后系统的产出也不错(后面这两句是我临时加的,不能让面试官觉得我是一个不看全局只顾自己刷经验的人)
- 配置中心怎么做服务发现的?怎么做 failover 的?
- 用 Kubernetes 碰到过哪些坑?
- 对 Prometheus 做了哪些改动?
- 对 Alertmanager 做了哪些改动?
- 监控系统怎么做”自监控”?
- 跨机房的网络问题怎么监控?
- 有什么想问我们的?
五面 技术面到四面就结束了,五面是创始人面(有幸和崔秋大佬聊了20多分钟人生),面完之后就是 offer call 了。
小结 一些主观评价:
- 面试难度:正常
- 面试体验:我给满分
- 问题偏向:项目经历、工程能力
但是经过 PingCAP 的五轮面试之后,我实打实地感受到了工程师文化:面试里没有任何一个”刁难人的问题”,每一位面试官感兴趣的是我的工程思维、学习能力、技术见解,同时还非常热衷于与我讨论和深挖一些坑与技术决策。这种感觉就很爽:面试官是懂我的,我作为工程师的思维能力与技术见解得到了认可与尊重。这种氛围是口号喊不出来的,因为它的硬性指标就是这其中的每一个人要热爱技术并且工程经验丰富。
最后 欢迎大家关注和转发文章,也欢迎大家关注我的公众号:程序员麦冬,每天都会分享java相关技术文章或行业资讯!
推荐阅读
- Java|大厂面经分享(双非五面入职字节,他都做了哪些准备())
- 设计模式|GO 常用设计模式
- 大厂钟爱的全链路压测有什么意义(四种压测方案详细对比分析)
- java|Java 修饰符 private、default、protected、public 的应用实例 (属性)
- java|java多线程-Lock对象的使用
- Java项目|Java--求两个整数的最大公约数和最小公倍数
- 20_表达式引擎|【java表达式引擎】四、高性能、轻量级的AviatorScript
- Java|Java · 逻辑控制(顺序结构 · 分支结构 · 循环结构) · 输入输出语句
- java|【JAVA】多线程篇章之进程与线程的区别与联系【面试热问题】