fort0 2019-10-22
今年想出来看看机会,最后很幸运地拿到了 PingCAP,今日头条的 offer 以及蚂蚁金服的口头 offer。想着可以总结一下经验,分享一下自己这一段"骑驴找马"过的心路历程。当然,一家之言,难免粗浅,如有不妥,敬请指正。
全文有点长,假如只对一家公司感兴趣的话可以直接跳过去:
我自己是本科毕业后在老东家干了三年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找坑的时候是非常非常虚的。迫于心慌,我好好思考了一阵来给自己打气,当时真正找坑和准备面试的过程大概分为这几个阶段:
反思:自己是不是真的要离职,假如不离职,在老东家接下来应该做什么才能继续提升?
定位:我在硬性技能(编码、架构)上的长处在哪?我在软技能(沟通,团队)上的长处在哪?这步顺带写了简历
寻找平台:哪些平台能同时满足:1、有挑战有上升空间;2、符合我的定位方向;3、团队氛围和老东家一样好(或更好)
找人内推:基本都是在 v2 上找的(诚挚感谢各位帮助我内推的大佬)
定位这一步其实花了好几天时间,我先是梳理了自己的项目经历和工作内容的专长,把 Java + Golang,做过的面比较广(业务,中间件,基础架构都做过)以及对 k8s 云原生有专长和兴趣作为自己的"硬招牌"。然后把学习能力强,喜欢沟通合作,渴望挑战作为我的"软招牌",最后把自己定位成一个"在过往经历中展现出了过人学习能力和钻研能力,同时渴望挑战,不愿意呆在舒适区"的形象(妈呀打这段话的时候太羞耻了!!!)。
这个过程中,我的方法论是"换位思考"。自己过去也面试过不少人(所以平时公司让我去面试,虽然累点苦点,但也都是积累呀),并且也和 HR 以及放出 HC 的业务方聊过我们希望放什么样的人进来。因此全程都在以面试官的心态来考察自己:
假如我是面试官,我会招怎样的人进来做我的同事?
举几个例子,下面都是我在这个过程中考虑过的问题(当然只是我自己的喜好):
对于一个毕业三年多的人,我最希望他有什么特质?
这个阶段的人其实还是"空杯",我希望他有很强的学习能力和进取心,给自己部门培养出一个超级生产力;
什么样的行为会让我‘’讨厌一份简历‘’
把每个项目都大写特写,尤其是陈述细节没有重点;罗列框架当能力,用过了一类场景的框架就觉得能解决一类业务诸如此类;
面试的时候我会偏向于问哪些问题?
定位之后,我要找的下一个位置基本锁定在了 PaaS、云原生、中间件方向。那接下来就是找坑了,这段时间"寒冬论"炒的火热,好坑确实挺难找,最后兜兜转转找了四家的内推:Shopee(新加坡)、PingCAP、头条、蚂蚁。
这几家的简历投递出去之后,我着重把简历里"埋的几个坑",也就是自己写了"理解并掌握"的语言与中间件以及专门用来勾引面试官问的项目好好复习了一遍。事后发现这一步还挺关键的,很多知识性的内容要是不复习一下真就全忘了,这也算临阵磨枪,不快也光了吧。
PingCAP 的简历响应是最快的,内推之后第二天 HR 就联系了我。电话接通之后先是简单聊了一下人生,然后就是社招三问
天知道这通电话是我开始投简历之后的第一通电话面试,之前还完全没有准备过类似的问题,只能稀里哗啦用
现在自己的技术成长有点碰到瓶颈,加上一直对您公司钦慕有加、我现在待遇是xxx但我司除了base之外还有xxx以及我马上要提薪了、其实比起待遇我更看重平台和挑战(狗头),但是基本的薪资需求我还是希望能xxx,这样和稀泥应付过去。内心稍稍平静之后HR跟我讲了讲我意向部门的结构和主体业务,然后交代了一下接下来的面试流程,约了"一面"并且加了微信。
"一面"加了引号,这是因为"一面"其实是在微信上布置了一个小项目,然后约定好时间验收。
这里要特别感谢一下 PingCAP 的 HR ,加了微信之后全程帮助我协调面试时间并不厌其烦地回答我各种奇奇怪怪的问题,最后谈 offer 的时候还给我准备了一个惊喜。面试体验直接满星。
早就听说 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 代码怎么写的无法确定(想表达自己真正看过代码才会确认,凸显自己严谨...我的妈呀),但假如由我来写这份代码(装作非常自信),我会只会维护一份最新的 Model,然后设计对应一个版本段的 Adpater 将老版本的 Model 转化过来巴拉巴拉"。到这里我已经虚的不行了
OK,那接下来我们聊聊 Golang (我:长舒一口气)
看一下这段代码有没有问题(一段 golang for-range 里 goroutine 闭包捕获的代码),为什么?
goroutine 是怎么调度的?
goroutine 和 kernel thread 之间是什么关系?
面完之后感觉答得一般,心里有点忐忑。结果第二天 HR 就来安排三面了,长舒了一口气。
三面是和整个大部门的 Leader 聊,面试官很能聊(声音还很好听!)而且技术非常全面,全程大概微信语音聊了80多分钟:
给我介绍 PingCAP 相关团队的职责与挑战
聊为什么出来看机会,以及未来的职业规划
聊我之前做的一个数据同步的项目,大概内容是订阅 MySQL Binlog,sink 到搜索索引、分库分表以及业务事件订阅流中
为什么数据同步里选择了 xxxx 开源项目,优势在哪?
订阅分库分表的 Binlog 怎么订阅?
分库分表的数据源中假如存在主键冲突要怎么解决?
怎么保证下游对 Binlog 的消费顺序?
如何在下游保证消费时的事务原子性?
描述了一下 tidb 的 binlog 架构,问这种场景下怎么保证 Binlog 顺序
聊一个上了 Kubernetes 的项目,问了一些细节和坑
用 Kubernetes 之后,解决了哪些问题?
聊我之前做的监控警报项目,问背景和产出
Prometheus 单实例数据量级 hold 不住了,有什么解决方案?
简历里的"数据同步"这个项目我是好好复习过自己当年写的调研文档和架构文档的,也做了被问的准备(换位思考,是我我也问。这个其实就是我专门希望面试官来挖细节的项目)。最后确实被问最多的就是这个项目,运气真的不错。
四面到了现场面,有两位面试官一起跟我聊,大约聊了 40 多分钟:
聊"配置中心"项目的细节
为什么不用 ZK,要自己再写一个"配置中心"
这个问题让我措手不及,我只好坦白:当时年轻,想刷经验,事后才领悟到不要重复造轮子,当然最后系统的产出也不错(后面这两句是我临时加的,不能让面试官觉得我是一个不看全局只顾自己刷经验的人)
配置中心怎么做服务发现的?怎么做 failover 的?
用 Kubernetes 碰到过哪些坑?
对 Prometheus 做了哪些改动?
对 Alertmanager 做了哪些改动?
监控系统怎么做"自监控"?
跨机房的网络问题怎么监控?
四面是纯项目,里面的经验就不太通用了。但这里面有个细节,就是到中途的时候两个面试官互相对了一下"还有什么想问的吗?"我意识到面试官们想问的问题不多了,可时间大约才过了20分钟(面试时间过短是一个 bad smell)。于是之后几个监控的问题我都尽量说得很细,同时顺便提一下"还有一个方面我们当时也做了挺多工作",暗示面试官往下挖的线索。不知道这招有没有奏效,反正这一面算是有惊无险过啦。
技术面到四面就结束了,五面是创始人面(有幸和崔秋大佬聊了20多分钟人生),面完之后就是 offer call 了。
这里真的想夸一下 PingCAP(因为面试体验超棒呀!)。投 PingCAP 的初衷是觉得这个团队的工程师文化非常浓,大牛云集,同时 TiDB 够牛逼,项目开源的模式我内心也很认可。只是挂羊头卖狗肉的公司也不少,好多 JD 上写着工程师文化浓郁,其实很多根本不是那么回事儿。但是经过 PingCAP 的五轮面试之后,我实打实地感受到了工程师文化:面试里没有任何一个"刁难人的问题",每一位面试官感兴趣的是我的工程思维、学习能力、技术见解,同时还非常热衷于与我讨论和深挖一些坑与技术决策。这种感觉就很爽:面试官是懂我的,我作为工程师的思维能力与技术见解得到了认可与尊重。?这种氛围是口号喊不出来的,因为它的硬性指标就是这其中的每一个人要热爱技术并且工程经验丰富。
蚂蚁的面试挺独特,每轮面试都没有 HR 约时间,一般是晚上 8 点左右面试官来一个电话,问是否能面试,能的话开始面,不能就约一个其它时间。
全程 6 面,前五面技术面,电话面试,最后一面是 HR 面,现场面。
介绍一下自己
问项目经历, 聊"数据同步"
接着聊上了 K8S 的项目
有没有什么钻研得比较深得技术?
我:kubernetes, golang, prometheus, java)
kubernetes 的架构是怎么样的?
这个问题很大,拆成 apiserver、controller、kubelet、scheduler 讲了一下
golang 与 java 的比较
这个问题又很大,当时主要对比了 vm、协程支持、面向对象和泛型的区别、以及自己对各自使用场景的一些理解
golang 的 gc 算法
怎么扩展 kubernetes scheduler, 让它能 handle 大规模的节点调度
单节点提速:优选阶段随机取部分节点进行优选;水平扩展 scheduler 节点,pod 做一致性 hash 来决定由哪个 scheduler 调度
一面其实有点僵,我自己完全没放开,面试官对我的回答没有什么反馈和深入,都是"哦好的"然后就过了。所以我当时面完觉得自己其实已经挂了(我自己要是对候选人不感兴趣,有时候也就问完问题走个过场溜了),后来收到二面电话着实吃惊了一下。
先聊了聊项目
给 Prometheus 做了哪些改动?
自研配置中心, 具体做了哪些内容?
有用过 MySQL 的什么高级特性吗?
这里不太理解,我问什么算高级特性,面试官就切换到了下一个问题
配置中心的核心数据表是怎么设计的?
为什么在业务里用 Redis, Redis 有什么优点?
单线程:并发安全;高性能;原语与数据结构丰富;采用广泛,踩坑成本低
对 Redis 里数据结构的实现熟悉吗?
说了一个 zset 跳表
用过 Redis 的哪些数据结构, 分别用在什么场景?
Java 初始化一个线程池有哪些参数可以配置, 分别是什么作用?
自己写的 Java 应用调优过哪些 JVM 参数, 为什么这么调优?
这个问住了,我只知道最大堆最小堆,开 G1,开 GC 日志以及 OOM dumper 这些基本的
用 Jetty 的时候有没有配什么参数, 为什么这么配?
Jetty QTP 等待队列配置成无限的话, 你觉得好吗? 会有什么问题吗?
用过 Linux Bash 里的哪些命令, 分别用它们干嘛?
题目是这样的:
启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4,5…100
我: 我用 Go 实现吧
面试官: 不可以,用 Java 的 notify 机制实现
我: (还没意识到问题的严峻) 那我用 Java BlockingQueue
面试官:说不可以, 要求用 Java 的 wait + notify 机制来实现
我完全没写过 wait + notify,只能表示不会(菜鸡本鸡了), 面试官说那行吧你可以用 go 写
最后用 go channel 实现了一版, 不过给的网页上不能运行代码,也不知道写得对不对,然后面试结束。
这一轮面试官延续了一面的风格,问完一题就赶忙下一题了,似乎没有表现出对我的回答有兴趣或认可。因此这轮面完,我又觉得自己挂了...
对监控警报的项目很感兴趣, 问了挺多细节, 最后问了一个问题: 现在要你实现一个语义不弱于 PromQL 的查询语言, 你能实现吗?
这里虽然看过一些 Prometheus 的代码,但其实对 PromQL 的 lexer 和 parser 部分没有细看,还好之前因为数据同步项目里想写声明式 Stream SQL 研究过一点 ANTLR,用 ANTLR 写语法 + AST 遍历塞查询逻辑给糊弄过去了。
问我觉得做得最深入的项目是什么
当然是数据同步(狗头)
聊数据同步项目(这个很符合我的预期,哈哈哈哈)
问 Linux 掌握得怎么样?
没有系统学习过,基本上是自己运维踩坑积累的
问 Golang 掌握得怎么样?
用了半年, 看过 effective go
问算法掌握得怎么样?
到图为止都可以
问最短路算法
只记得 dijkstra 了,描述了代码流程
k8s 掌握得怎么样?
不怎么样,没有自己写过 controller 和 scheduler,但是对概念都很熟悉,看过 xxx 这几部分的源码
这个问题正中下怀,之前写了 PingCAP 的小作业正好对这块特别熟悉
这轮聊得顺畅多了。同时发现蚂蚁的面试官似乎挺喜欢让你自己评价自己的:"你觉得自己 xxx 掌握得怎么样?"(只有五位面试官,样本不够大,不能作数哦),这类问题其实我慌得要死,怕自己吹过头了答不上来,面试挂了事小,丢了面子事大。早知道就预习一下怎么吹嘘自己了。
介绍一下自己
觉得自己基础知识掌握怎么样?
平时一般会用到哪些数据结构?
链表和数组相比, 有什么优劣?
如何判断两个无环单链表有没有交叉点
如何判断两个有环单链表有没有交叉点
如何判断一个单链表有没有环, 并找出入环点
TCP 和 UDP 有什么区别?
描述一下 TCP 四次挥手的过程中
TCP 有哪些状态?
TCP 的 LISTEN 状态是什么?
TCP 的 CLOSE_WAIT 状态是什么?
建立一个 socket 连接要经过哪些步骤?
常见的 HTTP 状态码有哪些?
301和302有什么区别?
504和500有什么区别?
HTTPS 和 HTTP 有什么区别?
这一轮全程问的基础知识,基础扎实的话就没问题了,不过个人感觉有一点像校招的问法。
介绍一下自己
在 k8s 上做过哪些二次开发?
自己用 Helm 构建过 chart 吗?有哪些?
有没有考虑过自己封装一个面向研发的 PaaS 平台?
配置中心做了什么?
为什么不用 zookeeper?
配置中心如何保证一致性?
Spring 里用了单例 Bean, 怎么保证访问 Bean 字段时的并发安全?
用并发安全的数据结构,比如 ConcurrentHashMap;或者加互斥锁
假如我还想隔离两个线程的数据, 怎么办?
ThreadLocal,然后举了个例子
Golang 里的逃逸分析是什么?怎么避免内存逃逸?
对比一下 Golang 和 Java 的 GC
答了一下 CMS、G1和三色标记,我对比的点是 JVM 有分代回收,Go 的 Runtime 没有,没能深入地讲
Golang 的 GC 触发时机是什么
阈值触发;主动触发;两分钟定时触发;
有没有写过 k8s 的 Operator 或 Controller?
谈一谈你对微服务架构的理解
大体思路"微服务本质是人员组织架构演进与关注点分离"
谈一谈你对 Serveless 的理解
大体思路"Serveless 是继 docker 与容器编排之后的又一次应用开发与基础设施提供方之间的边界划分"
大体思路"是云服务的未来,把蛋糕从企业的IT、运维与中间件部门切走,形成规模效应,做得越多赚得越多;公司内的话 servless 能够帮助加速前台业务迭代,但对中后台的收益还看不到,未来可能会有比 servless 更适合中后台的架构"
我:为什么足足安排了五轮技术面,而且其中有两轮似乎和 k8s 没有关系啊?
面试官:我们觉得你做过的东西挺多的,各个方向都想让你尝试一下 (我的内心:......)
我:那这轮是最后一轮技术面吗?
面试官:不一定(我的内心:......)
后续还问了面试官一些业务相关的问题,就不赘述了
五面最后的三个吹水问题我还挺感兴趣,可惜面试官只是听我讲,没有跟我讨论。还有就是问了面试官才知道,二面四面的面试官是 PaaS 平台那边的,因此主要问 Java 没有涉及到 k8s 和 go。
HR 面,之前就听说过阿里系的 HR 是来"闻味道的"(看你是否适合阿里的风格),而且有一票否决权。所以还是挺有压力的。
问经历
为什么要考虑出来看看呢?
金句:"现在自己的技术成长有点碰到瓶颈,加上一直对您公司钦慕有加"
现在公司的主营业务是什么?
这块往技术上问了很多,感觉是想考察我解释复杂问题的能力
现在带人吗?report 层级是怎样的?
对自己这几年的经历满意吗?
觉得自己有什么缺点?
碰到过什么很挫败的事情吗?
未来的职业规划是怎样的?
看机会的时候,主要考虑的是待遇、平台、人员还是什么其他因素?
现在的待遇如何
整体聊了 40 多分钟,话题挺广的,面试官也说了系统部这边压力挺大的,优秀的人才才能留下来。个人觉得 HR 面里除了谈薪酬的部分没有什么可准备的,想说什么直说就行。因为到了 HR 面至少证明你的技术没什么问题,直说出来方便 HR 判断两边的价值观是否合拍,假如真的不合拍,那其实在 HR 这一面挂了比起进去之后再后悔又跳槽要好很多,毕竟大家都不喜欢频繁跳槽的简历。
蚂蚁的面试风格比较"高冷",面试官给我的一致感受就是很强,卧虎藏龙。面试内容上在基础知识部分相对考察得多一些,没有偏门和猎奇的问题,基础知识扎实的同学可以大胆投投看蚂蚁。