今年想出來看看機會,最後很幸運地拿到了 PingCAP,今日頭條的 offer 以及螞蟻金服的口頭 offer。想着能夠總結一下經驗,分享一下本身這一段"騎驢找馬"過的心路歷程。固然,一家之言,不免粗淺,若有不妥,敬請指正。java
全文有點長,假如只對一家公司感興趣的話能夠直接跳過去:git
我本身是本科畢業後在老東家幹了三年多,老東家算是一家"小公司"(畢竟這年頭沒有 BAT 或 TMD 的 title 都很差意思報出身),畢業這兩年多我也沒有在大廠待過,所以找坑的時候是很是很是虛的。迫於心慌,我好好思考了一陣來給本身打氣,當時真正找坑和準備面試的過程大概分爲這幾個階段:github
反思:本身是否是真的要離職,假如不離職,在老東家接下來應該作什麼才能繼續提高?golang
定位:我在硬性技能(編碼、架構)上的長處在哪?我在軟技能(溝通,團隊)上的長處在哪?這步順帶寫了簡歷面試
尋找平臺:哪些平臺能同時知足:一、有挑戰有上升空間;二、符合個人定位方向;三、團隊氛圍和老東家同樣好(或更好)算法
找人內推:基本都是在 v2 上找的(誠摯感謝各位幫助我內推的大佬)docker
定位這一步其實花了好幾天時間,我先是梳理了本身的項目經歷和工做內容的專長,把 Java + Golang,作過的面比較廣(業務,中間件,基礎架構都作過)以及對 k8s 雲原生有專長和興趣做爲本身的"硬招牌"。而後把學習能力強,喜歡溝通合做,渴望挑戰做爲個人"軟招牌",最後把本身定位成一個"在過往經歷中展示出了過人學習能力和鑽研能力,同時渴望挑戰,不肯意呆在溫馨區"的形象(媽呀打這段話的時候太羞恥了!!!)。api
這個過程當中,個人方法論是"換位思考"。本身過去也面試過很多人(因此平時公司讓我去面試,雖然累點苦點,但也都是積累呀),而且也和 HR 以及放出 HC 的業務方聊過咱們但願放什麼樣的人進來。所以全程都在以面試官的心態來考察本身:數組
假如我是面試官,我會招怎樣的人進來作個人同事? 舉幾個例子,下面都是我在這個過程當中考慮過的問題(固然只是我本身的喜愛):安全
對於一個畢業三年多的人,我最但願他有什麼特質? 這個階段的人其實仍是"空杯",我但願他有很強的學習能力和進取心,給本身部門培養出一個超級生產力;
什麼樣的行爲會讓我‘’討厭一份簡歷‘’ 把每一個項目都大寫特寫,尤爲是陳述細節沒有重點;羅列框架當能力,用過了一類場景的框架就以爲能解決一類業務諸如此類;
面試的時候我會偏向於問哪些問題?
定位以後,我要找的下一個位置基本鎖定在了 PaaS、雲原生、中間件方向。那接下來就是找坑了,這段時間"寒冬論"炒的火熱,好坑確實挺難找,最後兜兜轉轉找了四家的內推:Shopee(新加坡)、PingCAP、頭條、螞蟻。
這幾家的簡歷投遞出去以後,我着重把簡歷裏"埋的幾個坑",也就是本身寫了"理解並掌握"的語言與中間件以及專門用來勾引面試官問的項目好好複習了一遍。過後發現這一步還挺關鍵的,不少知識性的內容要是不復習一下真就全忘了,這也算臨陣磨槍,不快也光了吧。
PingCAP 的簡歷響應是最快的,內推以後次日 HR 小姐姐就聯繫了我。電話接通以後先是簡單聊了一下人生,而後就是社招三問
天知道這通電話是我開始投簡歷以後的第一通電話面試,以前還徹底沒有準備過相似的問題,只能稀里嘩啦用 如今本身的技術成長有點碰到瓶頸,加上一直對您公司欽慕有加、我如今待遇是xxx但我司除了base以外還有xxx以及我立刻要提薪了、其實比起待遇我更看重平臺和挑戰(狗頭),可是基本的薪資需求我仍是但願能xxx,這樣和稀泥應付過去。心裏稍稍平靜以後小姐姐跟我講了講我意向部門的結構和主體業務,而後交代了一下接下來的面試流程,約了**"一面"**而且加了微信。
**"一面"加了引號,這是由於"一面"**實際上是在微信上佈置了一個小項目,而後約定好時間驗收。
這裏要特別感謝一下 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 機制,笑容漸漸消失。
第二個拿不許的問題,我面試前就反覆告訴本身**"不要強答"以及"不知道的題就講思路"**,因而就說這塊代碼確實沒看過,可是根據微服務 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)
這個問題很大,拆成 apiserver、controller、kubelet、scheduler 講了一下
這個問題又很大,當時主要對比了 vm、協程支持、面向對象和泛型的區別、以及本身對各自使用場景的一些理解
golang 的 gc 算法
怎麼擴展 kubernetes scheduler, 讓它能 handle 大規模的節點調度
單節點提速:優選階段隨機取部分節點進行優選;水平擴展 scheduler 節點,pod 作一致性 hash 來決定由哪一個 scheduler 調度
一面其實有點僵,我本身徹底沒放開,面試官對個人回答沒有什麼反饋和深刻,都是"哦好的"而後就過了。因此我當時面完以爲本身其實已經掛了(我本身要是對候選人不感興趣,有時候也就問完問題走個過場溜了),後來收到二面電話着實吃驚了一下。
先聊了聊項目
給 Prometheus 作了哪些改動?
自研配置中心, 具體作了哪些內容?
有用過 MySQL 的什麼高級特性嗎?
這裏不太理解,我問什麼算高級特性,面試官就切換到了下一個問題
配置中心的核心數據表是怎麼設計的?
爲何在業務裏用 Redis, Redis 有什麼優勢?
單線程:併發安全;高性能;原語與數據結構豐富;採用普遍,踩坑成本低
說了一個 zset 跳錶
用過 Redis 的哪些數據結構, 分別用在什麼場景?
Java 初始化一個線程池有哪些參數能夠配置, 分別是什麼做用?
本身寫的 Java 應用調優過哪些 JVM 參數, 爲何這麼調優?
這個問住了,我只知道最大堆最小堆,開 G1,開 GC 日誌以及 OOM dumper 這些基本的
用 Jetty 的時候有沒有配什麼參數, 爲何這麼配?
Jetty QTP 等待隊列配置成無限的話, 你以爲好嗎? 會有什麼問題嗎?
用過 Linux Bash 裏的哪些命令, 分別用它們幹嗎?
一道筆試題: 須要在給的連接中做答, 不能 google, 不能跳出, 不能用 IDE:
題目是這樣的:
啓動兩個線程, 一個輸出 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 掌握得怎麼樣?
沒有系統學習過,基本上是本身運維踩坑積累的
用了半年, 看過 effective go
到圖爲止均可以
只記得 dijkstra 了,描述了代碼流程
不怎麼樣,沒有本身寫過 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 沒有,沒能深刻地講
閾值觸發;主動觸發;兩分鐘定時觸發;
有沒有寫過 k8s 的 Operator 或 Controller?
談一談你對微服務架構的理解
大致思路"微服務本質是人員組織架構演進與關注點分離"
大致思路"Serveless 是繼 docker 與容器編排以後的又一次應用開發與基礎設施提供方之間的邊界劃分"
大致思路"是雲服務的將來,把蛋糕從企業的IT、運維與中間件部門切走,造成規模效應,作得越多賺得越多;公司內的話 servless 可以幫助加速前臺業務迭代,但對中後臺的收益還看不到,將來可能會有比 servless 更適合中後臺的架構"
我:爲何足足安排了五輪技術面,並且其中有兩輪彷佛和 k8s 沒有關係啊? 面試官:咱們以爲你作過的東西挺多的,各個方向都想讓你嘗試一下 (個人心裏:......) 我:那這輪是最後一輪技術面嗎? 面試官:不必定(個人心裏:......) 後續還問了面試官一些業務相關的問題,就不贅述了
五面最後的三個吹水問題我還挺感興趣,惋惜面試官只是聽我講,沒有跟我討論。還有就是問了面試官才知道,二面四面的面試官是 PaaS 平臺那邊的,所以主要問 Java 沒有涉及到 k8s 和 go。
HR 面,以前就據說過阿里系的 HR 是來"聞味道的"(看你是否適合阿里的風格),並且有一票否決權。因此仍是挺有壓力的。
問經歷
爲何要考慮出來看看呢?
金句:"如今本身的技術成長有點碰到瓶頸,加上一直對您公司欽慕有加"
這塊往技術上問了不少,感受是想考察我解釋複雜問題的能力
如今帶人嗎?report 層級是怎樣的?
對本身這幾年的經歷滿意嗎?
以爲本身有什麼缺點?
碰到過什麼很挫敗的事情嗎?
將來的職業規劃是怎樣的?
看機會的時候,主要考慮的是待遇、平臺、人員仍是什麼其餘因素?
如今的待遇如何
有什麼想問個人
總體聊了 40 多分鐘,話題挺廣的,面試官也說了系統部這邊壓力挺大的,優秀的人才才能留下來。我的以爲 HR 面裏除了談薪酬的部分沒有什麼可準備的,想說什麼直說就行。由於到了 HR 面至少證實你的技術沒什麼問題,直說出來方便 HR 判斷兩邊的價值觀是否合拍,假如真的不合拍,那其實在 HR 這一面掛了比起進去以後再後悔又跳槽要好不少,畢竟你們都不喜歡頻繁跳槽的簡歷。
螞蟻的面試風格比較**"高冷"**,面試官給個人一致感覺就是很強,臥虎藏龍。面試內容上在基礎知識部分相對考察得多一些,沒有偏門和獵奇的問題,基礎知識紮實的同窗能夠大膽投投看螞蟻。