<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          值得每個(gè) Gopher 認(rèn)真研讀:工作兩年收獲 PingCAP、頭條和螞蟻的 Offer

          共 2132字,需瀏覽 5分鐘

           ·

          2020-08-09 05:42


          點(diǎn)擊上方藍(lán)色“Go語(yǔ)言中文網(wǎng)”關(guān)注我們,領(lǐng)全套Go資料,每天學(xué)習(xí)?Go?語(yǔ)言

          分享一篇面經(jīng),作者拿到了 PingCAP,今日頭條的 offer 以及螞蟻金服的口頭 offer。下面是該作者的經(jīng)驗(yàn)分享。

          準(zhǔn)備過(guò)程

          我自己是本科畢業(yè)后在老東家干了兩年多,老東家算是一家”小公司”(畢竟這年頭沒(méi)有 BAT 或 TMD 的 title 都不好意思報(bào)出身),畢業(yè)這兩年多我也沒(méi)有在大廠待過(guò),因此找坑的時(shí)候是非常非常虛的。迫于心慌,我好好思考了一陣來(lái)給自己打氣,當(dāng)時(shí)真正找坑和準(zhǔn)備面試的過(guò)程大概分為這幾個(gè)階段:

          • 反思:自己是不是真的要離職,假如不離職,在老東家接下來(lái)應(yīng)該做什么才能繼續(xù)提升?
          • 定位:我在硬性技能(編碼、架構(gòu))上的長(zhǎng)處在哪?我在軟技能(溝通,團(tuán)隊(duì))上的長(zhǎng)處在哪?這步順帶寫(xiě)了簡(jiǎn)歷
          • 尋找平臺(tái):哪些平臺(tái)能同時(shí)滿足:1、有挑戰(zhàn)有上升空間;2、符合我的定位方向;3、團(tuán)隊(duì)氛圍和老東家一樣好(或更好)
          • 找人內(nèi)推:基本都是在 v2 上找的(誠(chéng)摯感謝各位幫助我內(nèi)推的大佬)
          • 面試談 offer

          定位這一步其實(shí)花了好幾天時(shí)間,我先是梳理了自己的項(xiàng)目經(jīng)歷和工作內(nèi)容的專(zhuān)長(zhǎng),把 Java + Golang,做過(guò)的面比較廣(業(yè)務(wù),中間件,基礎(chǔ)架構(gòu)都做過(guò))以及對(duì) k8s 云原生有專(zhuān)長(zhǎng)和興趣作為自己的”硬招牌”。然后把學(xué)習(xí)能力強(qiáng),喜歡溝通合作,渴望挑戰(zhàn)作為我的”軟招牌”,最后把自己定位成一個(gè)”在過(guò)往經(jīng)歷中展現(xiàn)出了過(guò)人學(xué)習(xí)能力和鉆研能力,同時(shí)渴望挑戰(zhàn),不愿意呆在舒適區(qū)”的形象(媽呀打這段話的時(shí)候太羞恥了?。。。?/p>

          這個(gè)過(guò)程中,我的方法論是”換位思考”。自己過(guò)去也面試過(guò)不少人(所以平時(shí)公司讓我去面試,雖然累點(diǎn)苦點(diǎn),但也都是積累呀),并且也和 HR 以及放出 HC 的業(yè)務(wù)方聊過(guò)我們希望放什么樣的人進(jìn)來(lái)。因此全程都在以面試官的心態(tài)來(lái)考察自己:

          假如我是面試官,我會(huì)招怎樣的人進(jìn)來(lái)做我的同事?

          舉幾個(gè)例子,下面都是我在這個(gè)過(guò)程中考慮過(guò)的問(wèn)題(當(dāng)然只是我自己的喜好):

          • 對(duì)于一個(gè)畢業(yè)兩年多的人,我最希望他有什么特質(zhì)?這個(gè)階段的人其實(shí)還是”空杯”,我希望他有很強(qiáng)的學(xué)習(xí)能力和進(jìn)取心,給自己部門(mén)培養(yǎng)出一個(gè)超級(jí)生產(chǎn)力;
          • 什么樣的行為會(huì)讓我”討厭一份簡(jiǎn)歷”:把每個(gè)項(xiàng)目都大寫(xiě)特寫(xiě),尤其是陳述細(xì)節(jié)沒(méi)有重點(diǎn);羅列框架當(dāng)能力,用過(guò)了一類(lèi)場(chǎng)景的框架就覺(jué)得能解決一類(lèi)業(yè)務(wù)諸如此類(lèi);
          • 面試的時(shí)候我會(huì)偏向于問(wèn)哪些問(wèn)題?一是簡(jiǎn)歷上寫(xiě)了”理解”或”精通”的語(yǔ)言與中間件;二是簡(jiǎn)歷上寫(xiě)得比較有趣,又沒(méi)有完全交代清楚的項(xiàng)目;

          定位之后,我要找的下一個(gè)位置基本鎖定在了 PaaS、云原生、中間件方向。那接下來(lái)就是找坑了,這段時(shí)間”寒冬論”炒的火熱,好坑確實(shí)挺難找,最后兜兜轉(zhuǎn)轉(zhuǎn)找了四家的內(nèi)推:Shopee(新加坡)、PingCAP、頭條、螞蟻。Shopee 那邊挺遺憾的,12月初投完簡(jiǎn)歷后在1月初進(jìn)行的第一輪 HR Screen,而當(dāng)時(shí)另幾家面試已經(jīng)臨近尾聲,于是選擇了推掉,后來(lái)確認(rèn)是12月 Shopee 正好在休假,會(huì)說(shuō)中文的 HR 都恰好不在,這也算是機(jī)緣巧合了?Shopee 給我的感覺(jué)(雖然只有一面)是非常為員工考慮,HR 小姐姐很客觀地幫我梳理了很多去新加坡會(huì)帶來(lái)的利弊得失。大家假如對(duì) Shopee 感興趣,浩松老師 @haosdent[1] 本人就出現(xiàn)在了 issue 區(qū),可以去找找看?

          這幾家的簡(jiǎn)歷投遞出去之后,我著重把簡(jiǎn)歷里”埋的幾個(gè)坑”,也就是自己寫(xiě)了”理解并掌握”的語(yǔ)言與中間件以及專(zhuān)門(mén)用來(lái)勾引面試官問(wèn)的項(xiàng)目好好復(fù)習(xí)了一遍。事后發(fā)現(xiàn)這一步還挺關(guān)鍵的,很多知識(shí)性的內(nèi)容要是不復(fù)習(xí)一下真就全忘了,這也算臨陣磨槍?zhuān)豢煲补饬税伞?/p>

          接下來(lái)就進(jìn)入正題,逐家講一下自己的面試體驗(yàn):

          • PingCAP - Cloud 方向
          • 螞蟻 - 容器調(diào)度方向(CTO線)
          • 頭條 - 工程效能方向

          PingCAP

          面試前

          PingCAP 的簡(jiǎn)歷響應(yīng)是最快的,內(nèi)推之后第二天 HR 小姐姐就聯(lián)系了我。電話接通之后先是簡(jiǎn)單聊了一下人生,然后就是社招三問(wèn) [”為啥離職啊?”,”現(xiàn)在待遇咋樣啊?”,”期望待遇咋樣啊?”],天知道這通電話是我開(kāi)始投簡(jiǎn)歷之后的第一通電話面試,之前還完全沒(méi)有準(zhǔn)備過(guò)類(lèi)似的問(wèn)題,只能稀里嘩啦用[”現(xiàn)在自己的技術(shù)成長(zhǎng)有點(diǎn)碰到瓶頸,加上一直對(duì)您公司欽慕有加??”,”我現(xiàn)在待遇是xxx但我司除了base之外還有xxx以及我馬上要提薪了?”,”其實(shí)比起待遇我更看重平臺(tái)和挑戰(zhàn)(狗頭),但是基本的薪資需求我還是希望能xxx?”]這樣和稀泥應(yīng)付過(guò)去。內(nèi)心稍稍平靜之后小姐姐跟我講了講我意向部門(mén)的結(jié)構(gòu)和主體業(yè)務(wù),然后交代了一下接下來(lái)的面試流程,約了”一面”并且加了微信。

          “一面”加了引號(hào),這是因?yàn)椤币幻妗逼鋵?shí)是在微信上布置了一個(gè)小項(xiàng)目,然后約定好時(shí)間驗(yàn)收。

          這里要特別感謝一下 PingCAP 的 HR 小姐姐,加了微信之后全程幫助我協(xié)調(diào)面試時(shí)間并不厭其煩地回答我各種奇奇怪怪的問(wèn)題,最后談 offer 的時(shí)候還給我準(zhǔn)備了一個(gè)驚喜。面試體驗(yàn)直接滿星<3!

          一面

          早就聽(tīng)說(shuō) PingCAP 一面要寫(xiě)小項(xiàng)目,我自己心里其實(shí)是躍躍欲試的。面試官給的項(xiàng)目要求大體是這樣:

          K8S 容器化之后應(yīng)用容器里幾乎沒(méi)有什么可用的調(diào)試工具,可以利用容器 Namespace 共享的思路,啟動(dòng)一個(gè)包含各種調(diào)試工具(比如 netstat, gdb)的容器,加入到 pod 的 pid、net 等 namespace 中, 實(shí)現(xiàn)對(duì)任意 pod 的 debug 功能。現(xiàn)在希望利用 kubectl plugin 機(jī)制實(shí)現(xiàn)一個(gè)插件,用于 debug 任意一個(gè) pod 里的容器,達(dá)到 kubectl exec 的使用體驗(yàn).

          當(dāng)時(shí)因?yàn)楣ぷ魅粘椴怀鰰r(shí)間,就隔了幾天到周五晚上開(kāi)始寫(xiě),周六晚上寫(xiě)完并且把 項(xiàng)目地址[2] 分享到了 Reddit 上[3]。沒(méi)想到運(yùn)氣不錯(cuò)收了 100 多個(gè) star,這下我就覺(jué)得”哦豁,這輪應(yīng)該穩(wěn)了吧!”(結(jié)果后來(lái)發(fā)現(xiàn)這幾乎是我唯一一把覺(jué)得自己”穩(wěn)了的”面試…)

          二面

          二面是一位 Cloud 方向的前輩面我,全程大概微信語(yǔ)音聊了50多分鐘:

          • 問(wèn)項(xiàng)目經(jīng)歷,聊了兩個(gè)項(xiàng)目
          • 對(duì) Kubernetes 了解怎么樣,看過(guò)源碼嗎?
            • k8s 的代碼我以前其實(shí)只看過(guò) kubelet,臨陣磨槍的時(shí)候把 apiserver、scheduler、controller-manager 都看了一遍,笑容漸漸出現(xiàn)。
          • Kubernetes 的 Service 是什么概念,怎么實(shí)現(xiàn)的?
          • 你剛說(shuō)到 Informer,Informer 是怎么實(shí)現(xiàn)的,有什么作用?
          • StatefulSet 用過(guò)嗎?有什么特點(diǎn)?
          • StatefulSet 的滾動(dòng)升級(jí)是如何實(shí)現(xiàn)的?
          • 現(xiàn)在我們希望只升級(jí) StatefulSet 中的任意個(gè)節(jié)點(diǎn)進(jìn)行測(cè)試, 可以怎么做?
            • 這題沒(méi)有思路,只好強(qiáng)答用”兩個(gè) StatefulSet”,后來(lái)一想起一個(gè)新的 StatefulSet 那 PV 里的數(shù)據(jù)就丟了,其實(shí)正確辦法是利用 partition 機(jī)制,笑容漸漸消失。
          • Kubernetes 的所有資源約定了版本號(hào), 為什么要這么做?
            • 第二個(gè)拿不準(zhǔn)的問(wèn)題,我面試前就反復(fù)告訴自己”不要強(qiáng)答“以及”不知道的題就講思路“,于是就說(shuō)這塊代碼確實(shí)沒(méi)看過(guò),但是根據(jù)微服務(wù) API 的設(shè)計(jì)理念,版本號(hào)的作用有巴拉巴拉。答完似乎面試官還算滿意,于是又往下挖了一句:
          • 假如有多幾個(gè)版本號(hào)并存, 那么 K8S 服務(wù)端需要維護(hù)幾套代碼?
            • 這題完全不知道,內(nèi)心逐漸焦灼,立馬走老套路”這我沒(méi)看過(guò) k8s 代碼怎么寫(xiě)的無(wú)法確定(想表達(dá)自己真正看過(guò)代碼才會(huì)確認(rèn),凸顯自己嚴(yán)謹(jǐn)…我的媽呀),但假如由我來(lái)寫(xiě)這份代碼(裝作非常自信),我會(huì)只會(huì)維護(hù)一份最新的 Model,然后設(shè)計(jì)對(duì)應(yīng)一個(gè)版本段的 Adpater 將老版本的 Model 轉(zhuǎn)化過(guò)來(lái)巴拉巴拉”。到這里我已經(jīng)虛的不行了
          • OK,那接下來(lái)我們聊聊 Golang (我:長(zhǎng)舒一口氣)
          • 看一下這段代碼有沒(méi)有問(wèn)題(一段 golang for-range 里 goroutine 閉包捕獲的代碼),為什么?
          • goroutine 是怎么調(diào)度的?
          • goroutine 和 kernel thread 之間是什么關(guān)系?
          • 有什么想問(wèn)我的?

          面完之后感覺(jué)答得一般,心里有點(diǎn)忐忑。結(jié)果第二天 HR 小姐姐就來(lái)安排三面了,長(zhǎng)舒了一口氣。

          三面

          三面是和整個(gè)大部門(mén)的 Leader 聊,面試官很能聊(聲音還很好聽(tīng)!)而且技術(shù)非常全面,全程大概微信語(yǔ)音聊了80多分鐘:

          • 給我介紹 PingCAP 相關(guān)團(tuán)隊(duì)的職責(zé)與挑戰(zhàn)
          • 聊為什么出來(lái)看機(jī)會(huì),以及未來(lái)的職業(yè)規(guī)劃
          • 聊我之前做的一個(gè)數(shù)據(jù)同步的項(xiàng)目,大概內(nèi)容是訂閱 MySQL Binlog,sink 到搜索索引、分庫(kù)分表以及業(yè)務(wù)事件訂閱流中
          • 為什么數(shù)據(jù)同步里選擇了 xxxx 開(kāi)源項(xiàng)目,優(yōu)勢(shì)在哪?
          • 訂閱分庫(kù)分表的 Binlog 怎么訂閱?
          • 分庫(kù)分表的數(shù)據(jù)源中假如存在主鍵沖突要怎么解決?
          • 怎么保證下游對(duì) Binlog 的消費(fèi)順序?
          • 如何在下游保證消費(fèi)時(shí)的事務(wù)原子性?
          • 描述了一下 tidb 的 binlog 架構(gòu),問(wèn)這種場(chǎng)景下怎么保證 Binlog 順序
          • 聊一個(gè)上了 Kubernetes 的項(xiàng)目,問(wèn)了一些細(xì)節(jié)和坑
          • 用 Kubernetes 之后,解決了哪些問(wèn)題?
          • 聊我之前做的監(jiān)控警報(bào)項(xiàng)目,問(wèn)背景和產(chǎn)出
          • Prometheus 單實(shí)例數(shù)據(jù)量級(jí) hold 不住了,有什么解決方案?
          • 有什么想問(wèn)我的?

          簡(jiǎn)歷里的”數(shù)據(jù)同步”這個(gè)項(xiàng)目我是好好復(fù)習(xí)過(guò)自己當(dāng)年寫(xiě)的調(diào)研文檔和架構(gòu)文檔的,也做了被問(wèn)的準(zhǔn)備(換位思考,是我我也問(wèn)。這個(gè)其實(shí)就是我專(zhuān)門(mén)希望面試官來(lái)挖細(xì)節(jié)的項(xiàng)目)。最后確實(shí)被問(wèn)最多的就是這個(gè)項(xiàng)目,運(yùn)氣真的不錯(cuò)?。

          四面

          四面到了現(xiàn)場(chǎng)面,有兩位面試官一起跟我聊,大約聊了 40 多分鐘:

          • 聊”配置中心”項(xiàng)目的細(xì)節(jié)
          • 為什么不用 ZK,要自己再寫(xiě)一個(gè)”配置中心”
            • 這個(gè)問(wèn)題讓我措手不及,我只好坦白:當(dāng)時(shí)年輕,想刷經(jīng)驗(yàn),事后才領(lǐng)悟到不要重復(fù)造輪子,當(dāng)然最后系統(tǒng)的產(chǎn)出也不錯(cuò)(后面這兩句是我臨時(shí)加的,不能讓面試官覺(jué)得我是一個(gè)不看全局只顧自己刷經(jīng)驗(yàn)的人)
          • 配置中心怎么做服務(wù)發(fā)現(xiàn)的?怎么做 failover 的?
          • 用 Kubernetes 碰到過(guò)哪些坑?
          • 對(duì) Prometheus 做了哪些改動(dòng)?
          • 對(duì) Alertmanager 做了哪些改動(dòng)?
          • 監(jiān)控系統(tǒng)怎么做”自監(jiān)控”?
          • 跨機(jī)房的網(wǎng)絡(luò)問(wèn)題怎么監(jiān)控?
          • 有什么想問(wèn)我們的?

          四面是純項(xiàng)目,里面的經(jīng)驗(yàn)就不太通用了。但這里面有個(gè)細(xì)節(jié),就是到中途的時(shí)候兩個(gè)面試官互相對(duì)了一下”還有什么想問(wèn)的嗎?”我意識(shí)到面試官們想問(wèn)的問(wèn)題不多了,可時(shí)間大約才過(guò)了20分鐘(面試時(shí)間過(guò)短是一個(gè) bad smell)。于是之后幾個(gè)監(jiān)控的問(wèn)題我都盡量說(shuō)得很細(xì),同時(shí)順便提一下”還有一個(gè)方面我們當(dāng)時(shí)也做了挺多工作”,暗示面試官往下挖的線索。不知道這招有沒(méi)有奏效,反正這一面算是有驚無(wú)險(xiǎn)過(guò)啦。

          五面

          技術(shù)面到四面就結(jié)束了,五面是創(chuàng)始人面(有幸和崔秋大佬聊了20多分鐘人生),面完之后就是 offer call 了。

          PingCAP 小結(jié)

          一些主觀評(píng)價(jià):

          • 面試難度:正常
          • 面試體驗(yàn):我給滿分
          • 問(wèn)題偏向:項(xiàng)目經(jīng)歷、工程能力

          這里真的想夸一下 PingCAP(因?yàn)槊嬖圀w驗(yàn)超棒呀?。M?PingCAP 的初衷是覺(jué)得這個(gè)團(tuán)隊(duì)的工程師文化非常濃,大牛云集,同時(shí) TiDB 夠牛逼,項(xiàng)目開(kāi)源的模式我內(nèi)心也很認(rèn)可。只是掛羊頭賣(mài)狗肉的公司也不少,好多 JD 上寫(xiě)著工程師文化濃郁,其實(shí)很多根本不是那么回事兒。但是經(jīng)過(guò) PingCAP 的五輪面試之后,我實(shí)打?qū)嵉馗惺艿搅斯こ處熚幕好嬖嚴(yán)餂](méi)有任何一個(gè)”刁難人的問(wèn)題”,每一位面試官感興趣的是我的工程思維、學(xué)習(xí)能力、技術(shù)見(jiàn)解,同時(shí)還非常熱衷于與我討論和深挖一些坑與技術(shù)決策。這種感覺(jué)就很爽:面試官是懂我的,我作為工程師的思維能力與技術(shù)見(jiàn)解得到了認(rèn)可與尊重。 這種氛圍是口號(hào)喊不出來(lái)的,因?yàn)樗挠残灾笜?biāo)就是這其中的每一個(gè)人要熱愛(ài)技術(shù)并且工程經(jīng)驗(yàn)豐富。

          螞蟻

          面試前

          螞蟻的面試挺獨(dú)特,每輪面試都沒(méi)有 HR 約時(shí)間,一般是晚上 8 點(diǎn)左右面試官來(lái)一個(gè)電話,問(wèn)是否能面試,能的話開(kāi)始面,不能就約一個(gè)其它時(shí)間。

          全程 6 面,前五面技術(shù)面,電話面試,最后一面是 HR 面,現(xiàn)場(chǎng)面。

          一面

          • 介紹一下自己
          • 問(wèn)項(xiàng)目經(jīng)歷, 聊”數(shù)據(jù)同步”
          • 接著聊上了 K8S 的項(xiàng)目
          • 有沒(méi)有什么鉆研得比較深得技術(shù)?(我:kubernetes, golang, prometheus, java)
          • kubernetes 的架構(gòu)是怎么樣的?
            • 這個(gè)問(wèn)題很大,拆成 apiserver、controller、kubelet、scheduler 講了一下
          • golang 與 java 的比較
            • 這個(gè)問(wèn)題又很大,當(dāng)時(shí)主要對(duì)比了 vm、協(xié)程支持、面向?qū)ο蠛头盒偷膮^(qū)別、以及自己對(duì)各自使用場(chǎng)景的一些理解
          • golang 的 gc 算法
            • 知道是三色標(biāo)記,不過(guò)細(xì)節(jié)說(shuō)不上來(lái)
          • 從無(wú)限的字符流中, 隨機(jī)選出 10 個(gè)字符
            • 沒(méi)見(jiàn)過(guò)也沒(méi)想出來(lái),查了一下是蓄水池采樣算法[4],經(jīng)典面試題,沒(méi)刷題吃虧了
          • 怎么擴(kuò)展 kubernetes scheduler, 讓它能 handle 大規(guī)模的節(jié)點(diǎn)調(diào)度
            • 單節(jié)點(diǎn)提速:優(yōu)選階段隨機(jī)取部分節(jié)點(diǎn)進(jìn)行優(yōu)選;水平擴(kuò)展 scheduler 節(jié)點(diǎn),pod 做一致性 hash 來(lái)決定由哪個(gè) scheduler 調(diào)度
          • 你有什么想問(wèn)我的?

          一面其實(shí)有點(diǎn)僵,我自己完全沒(méi)放開(kāi),面試官對(duì)我的回答沒(méi)有什么反饋和深入,都是”哦好的”然后就過(guò)了。所以我當(dāng)時(shí)面完覺(jué)得自己其實(shí)已經(jīng)掛了(我自己要是對(duì)候選人不感興趣,有時(shí)候也就問(wèn)完問(wèn)題走個(gè)過(guò)場(chǎng)溜了),后來(lái)收到二面電話著實(shí)吃驚了一下。

          二面

          • 先聊了聊項(xiàng)目
          • 給 Prometheus 做了哪些改動(dòng)?
          • 自研配置中心, 具體做了哪些內(nèi)容?
          • 有用過(guò) MySQL 的什么高級(jí)特性嗎?
            • 這里不太理解,我問(wèn)什么算高級(jí)特性,面試官就切換到了下一個(gè)問(wèn)題
          • 配置中心的核心數(shù)據(jù)表是怎么設(shè)計(jì)的?
          • 為什么在業(yè)務(wù)里用 Redis, Redis 有什么優(yōu)點(diǎn)?
            • 單線程:并發(fā)安全;高性能;原語(yǔ)與數(shù)據(jù)結(jié)構(gòu)豐富;采用廣泛,踩坑成本低
          • 對(duì) Redis 里數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)熟悉嗎?
            • 說(shuō)了一個(gè) zset 跳表
          • 用過(guò) Redis 的哪些數(shù)據(jù)結(jié)構(gòu), 分別用在什么場(chǎng)景?
          • Java 初始化一個(gè)線程池有哪些參數(shù)可以配置, 分別是什么作用?
          • 自己寫(xiě)的 Java 應(yīng)用調(diào)優(yōu)過(guò)哪些 JVM 參數(shù), 為什么這么調(diào)優(yōu)?
            • 這個(gè)問(wèn)住了,我只知道最大堆最小堆,開(kāi) G1,開(kāi) GC 日志以及 OOM dumper 這些基本的
          • 用 Jetty 的時(shí)候有沒(méi)有配什么參數(shù), 為什么這么配?
          • Jetty QTP 等待隊(duì)列配置成無(wú)限的話, 你覺(jué)得好嗎? 會(huì)有什么問(wèn)題嗎?
          • 用過(guò) Linux Bash 里的哪些命令, 分別用它們干嘛?
          • 一道筆試題: 需要在給的鏈接中作答, 不能 google, 不能跳出, 不能用 IDE:

          題目是這樣的:

          啟動(dòng)兩個(gè)線程, 一個(gè)輸出 1,3,5,7…99, 另一個(gè)輸出 2,4,6,8…100 最后 STDOUT 中按序輸出 1,2,3,4,5…100

          我: 我用 Go 實(shí)現(xiàn)吧

          面試官: 不可以,用 Java 的 notify 機(jī)制實(shí)現(xiàn)

          我: (還沒(méi)意識(shí)到問(wèn)題的嚴(yán)峻) 那我用 Java BlockingQueue

          面試官:說(shuō)不可以, 要求用 Java 的 wait + notify 機(jī)制來(lái)實(shí)現(xiàn)

          我完全沒(méi)寫(xiě)過(guò) wait + notify,只能表示不會(huì)(菜雞本雞了), 面試官說(shuō)那行吧你可以用 go 寫(xiě)

          最后用 go channel 實(shí)現(xiàn)了一版, 不過(guò)給的網(wǎng)頁(yè)上不能運(yùn)行代碼,也不知道寫(xiě)得對(duì)不對(duì),然后面試結(jié)束。

          這一輪面試官延續(xù)了一面的風(fēng)格,問(wèn)完一題就趕忙下一題了,似乎沒(méi)有表現(xiàn)出對(duì)我的回答有興趣或認(rèn)可。因此這輪面完,我又覺(jué)得自己掛了…

          三面

          • 依然先聊項(xiàng)目
          • 對(duì)監(jiān)控警報(bào)的項(xiàng)目很感興趣, 問(wèn)了挺多細(xì)節(jié), 最后問(wèn)了一個(gè)問(wèn)題: 現(xiàn)在要你實(shí)現(xiàn)一個(gè)語(yǔ)義不弱于 PromQL 的查詢語(yǔ)言, 你能實(shí)現(xiàn)嗎?
            • 這里雖然看過(guò)一些 Prometheus 的代碼,但其實(shí)對(duì) PromQL 的 lexer 和 parser 部分沒(méi)有細(xì)看,還好之前因?yàn)閿?shù)據(jù)同步項(xiàng)目里想寫(xiě)聲明式 Stream SQL 研究過(guò)一點(diǎn) ANTLR,用 ANTLR 寫(xiě)語(yǔ)法 + AST 遍歷塞查詢邏輯給糊弄過(guò)去了。
          • 問(wèn)我覺(jué)得做得最深入的項(xiàng)目是什么
            • 當(dāng)然是數(shù)據(jù)同步(狗頭)
          • 聊數(shù)據(jù)同步項(xiàng)目(這個(gè)很符合我的預(yù)期,哈哈哈哈)
          • 問(wèn) Linux 掌握得怎么樣?
            • 沒(méi)有系統(tǒng)學(xué)習(xí)過(guò),基本上是自己運(yùn)維踩坑積累的
          • 問(wèn) Golang 掌握得怎么樣?
            • 用了半年, 看過(guò) effective go
          • 問(wèn)算法掌握得怎么樣?
            • 到圖為止都可以
          • 問(wèn)最短路算法
            • 只記得 dijkstra 了,描述了代碼流程
          • k8s 掌握得怎么樣?
            • 不怎么樣,沒(méi)有自己寫(xiě)過(guò) controller 和 scheduler,但是對(duì)概念都很熟悉,看過(guò) xxx 這幾部分的源碼
          • k8s 的 exec 是怎么實(shí)現(xiàn)的?
            • 這個(gè)問(wèn)題正中下懷,之前寫(xiě)了 PingCAP 的小作業(yè)正好對(duì)這塊特別熟悉

          這輪聊得順暢多了。同時(shí)發(fā)現(xiàn)螞蟻的面試官似乎挺喜歡讓你自己評(píng)價(jià)自己的:”你覺(jué)得自己 xxx 掌握得怎么樣?”(只有五位面試官,樣本不夠大,不能作數(shù)哦),這類(lèi)問(wèn)題其實(shí)我慌得要死,怕自己吹過(guò)頭了答不上來(lái),面試掛了事小,丟了面子事大。早知道就預(yù)習(xí)一下怎么吹噓自己了。

          四面

          • 介紹一下自己
          • 覺(jué)得自己基礎(chǔ)知識(shí)掌握怎么樣
          • 平時(shí)一般會(huì)用到哪些數(shù)據(jù)結(jié)構(gòu)?
          • 鏈表和數(shù)組相比, 有什么優(yōu)劣?
          • 如何判斷兩個(gè)無(wú)環(huán)單鏈表有沒(méi)有交叉點(diǎn)
          • 如何判斷兩個(gè)有環(huán)單鏈表有沒(méi)有交叉點(diǎn)
          • 如何判斷一個(gè)單鏈表有沒(méi)有環(huán), 并找出入環(huán)點(diǎn)
          • TCP 和 UDP 有什么區(qū)別?
          • 描述一下 TCP 四次揮手的過(guò)程中
          • TCP 有哪些狀態(tài)
          • TCP 的 LISTEN 狀態(tài)是什么
          • TCP 的 CLOSE_WAIT 狀態(tài)是什么
          • 建立一個(gè) socket 連接要經(jīng)過(guò)哪些步驟
          • 常見(jiàn)的 HTTP 狀態(tài)碼有哪些
          • 301和302有什么區(qū)別
          • 504和500有什么區(qū)別
          • HTTPS 和 HTTP 有什么區(qū)別
          • 寫(xiě)一個(gè)算法題: 手寫(xiě)快排

          這一輪全程問(wèn)的基礎(chǔ)知識(shí),基礎(chǔ)扎實(shí)的話就沒(méi)問(wèn)題了,不過(guò)個(gè)人感覺(jué)有一點(diǎn)像校招的問(wèn)法。

          五面

          • 介紹一下自己
          • 在 k8s 上做過(guò)哪些二次開(kāi)發(fā)?
          • 自己用 Helm 構(gòu)建過(guò) chart 嗎?有哪些?
          • 有沒(méi)有考慮過(guò)自己封裝一個(gè)面向研發(fā)的 PaaS 平臺(tái)?
          • 配置中心做了什么?
          • 為什么不用 zookeeper?
          • 配置中心如何保證一致性?
          • Spring 里用了單例 Bean, 怎么保證訪問(wèn) Bean 字段時(shí)的并發(fā)安全?
            • 用并發(fā)安全的數(shù)據(jù)結(jié)構(gòu),比如 ConcurrentHashMap;或者加互斥鎖
          • 假如我還想隔離兩個(gè)線程的數(shù)據(jù), 怎么辦?
            • ThreadLocal,然后舉了個(gè)例子
          • Golang 里的逃逸分析是什么?怎么避免內(nèi)存逃逸?
            • 這個(gè)不知道,認(rèn)慫了
          • 對(duì)比一下 Golang 和 Java 的 GC
            • 答了一下 CMS、G1和三色標(biāo)記,我對(duì)比的點(diǎn)是 JVM 有分代回收,Go 的 Runtime 沒(méi)有,沒(méi)能深入地講
          • Golang 的 GC 觸發(fā)時(shí)機(jī)是什么
            • 閾值觸發(fā);主動(dòng)觸發(fā);兩分鐘定時(shí)觸發(fā);
          • 有沒(méi)有寫(xiě)過(guò) k8s 的 Operator 或 Controller?(我:沒(méi)有寫(xiě)過(guò))
          • 談一談你對(duì)微服務(wù)架構(gòu)的理解
            • 大體思路”微服務(wù)本質(zhì)是人員組織架構(gòu)演進(jìn)與關(guān)注點(diǎn)分離”
          • 談一談你對(duì) Serveless 的理解
            • 大體思路”Serveless 是繼 docker 與容器編排之后的又一次應(yīng)用開(kāi)發(fā)與基礎(chǔ)設(shè)施提供方之間的邊界劃分”
          • 你認(rèn)為 Serveless 是未來(lái)嗎? 為什么?
            • 大體思路”是云服務(wù)的未來(lái),把蛋糕從企業(yè)的IT、運(yùn)維與中間件部門(mén)切走,形成規(guī)模效應(yīng),做得越多賺得越多;公司內(nèi)的話 servless 能夠幫助加速前臺(tái)業(yè)務(wù)迭代,但對(duì)中后臺(tái)的收益還看不到,未來(lái)可能會(huì)有比 servless 更適合中后臺(tái)的架構(gòu)”
          • 面試官:最后你有什么要問(wèn)我的?
          • 我:為什么足足安排了五輪技術(shù)面,而且其中有兩輪似乎和 k8s 沒(méi)有關(guān)系?。?/section>
          • 面試官:我們覺(jué)得你做過(guò)的東西挺多的,各個(gè)方向都想讓你嘗試一下 (我的內(nèi)心:……)
          • 我:那這輪是最后一輪技術(shù)面嗎?
          • 面試官:不一定(我的內(nèi)心:……)
          • 后續(xù)還問(wèn)了面試官一些業(yè)務(wù)相關(guān)的問(wèn)題,就不贅述了

          五面最后的三個(gè)吹水問(wèn)題我還挺感興趣,可惜面試官只是聽(tīng)我講,沒(méi)有跟我討論。還有就是問(wèn)了面試官才知道,二面四面的面試官是 PaaS 平臺(tái)那邊的,因此主要問(wèn) Java 沒(méi)有涉及到 k8s 和 go。

          六面

          HR 面,之前就聽(tīng)說(shuō)過(guò)阿里系的 HR 是來(lái)”聞味道的”(看你是否適合阿里的風(fēng)格),而且有一票否決權(quán)。所以還是挺有壓力的。

          • 問(wèn)經(jīng)歷
          • 為什么要考慮出來(lái)看看呢?
            • 金句:”現(xiàn)在自己的技術(shù)成長(zhǎng)有點(diǎn)碰到瓶頸,加上一直對(duì)您公司欽慕有加??””
          • 現(xiàn)在公司的主營(yíng)業(yè)務(wù)是什么?(這塊往技術(shù)上問(wèn)了很多,感覺(jué)是想考察我解釋復(fù)雜問(wèn)題的能力)
          • 現(xiàn)在帶人嗎?report 層級(jí)是怎樣的?
          • 對(duì)自己這幾年的經(jīng)歷滿意嗎?
          • 覺(jué)得自己有什么缺點(diǎn)?
          • 碰到過(guò)什么很挫敗的事情嗎?
          • 未來(lái)的職業(yè)規(guī)劃是怎樣的?
          • 看機(jī)會(huì)的時(shí)候,主要考慮的是待遇、平臺(tái)、人員還是什么其他因素?
          • 現(xiàn)在的待遇如何
          • 有什么想問(wèn)我的

          整體聊了 40 多分鐘,話題挺廣的,面試官也說(shuō)了系統(tǒng)部這邊壓力挺大的,優(yōu)秀的人才才能留下來(lái)。個(gè)人覺(jué)得 HR 面里除了談薪酬的部分沒(méi)有什么可準(zhǔn)備的,想說(shuō)什么直說(shuō)就行。因?yàn)榈搅?HR 面至少證明你的技術(shù)沒(méi)什么問(wèn)題,直說(shuō)出來(lái)方便 HR 判斷兩邊的價(jià)值觀是否合拍,假如真的不合拍,那其實(shí)在 HR 這一面掛了比起進(jìn)去之后再后悔又跳槽要好很多,畢竟大家都不喜歡頻繁跳槽的簡(jiǎn)歷。

          小結(jié)

          一些主觀評(píng)價(jià):

          • 面試難度:正常
          • 面試體驗(yàn):正常
          • 問(wèn)題偏向:基礎(chǔ)知識(shí),開(kāi)發(fā)常識(shí),技術(shù)見(jiàn)解

          螞蟻的面試風(fēng)格比較”高冷”,面試官給我的一致感受就是很強(qiáng),臥虎藏龍。面試內(nèi)容上在基礎(chǔ)知識(shí)部分相對(duì)考察得多一些,沒(méi)有偏門(mén)和獵奇的問(wèn)題,基礎(chǔ)知識(shí)扎實(shí)的同學(xué)可以大膽投投看螞蟻。

          頭條

          面試前

          頭條每次面試前會(huì)有 HR 約時(shí)間,并提前發(fā)一個(gè) zoom 地址過(guò)來(lái),三場(chǎng)技術(shù)面與一場(chǎng) HR 面全都是視頻面試。不得不說(shuō)視頻面試體驗(yàn)比電話面試好很多(尤其是對(duì)我這種很關(guān)注面試官反應(yīng)的),假如有 HR 同學(xué)看到這篇文章,推薦考慮一下用視頻面試取代電話面試,效率會(huì)更高。

          頭條的三場(chǎng)技術(shù)面風(fēng)格都很類(lèi)似:

          1. 問(wèn)項(xiàng)目,抓出一些你擅長(zhǎng)的領(lǐng)域或場(chǎng)景
          2. 問(wèn)系統(tǒng)設(shè)計(jì)題,每題都會(huì)不斷深化需求讓你應(yīng)變和權(quán)衡
          3. 問(wèn)一道算法題(不難不偏),先看思路,再要求寫(xiě)一下偽代碼看邊界條件能不能一次過(guò)

          這個(gè)面試流程我自己也一直在用,尤其是系統(tǒng)設(shè)計(jì)加上不斷的需求變更,能比較全面地考察后端的基本功和工程思維。因此頭條的面試套路很對(duì)我胃口,甚至好多類(lèi)似的問(wèn)題我自己也都問(wèn)過(guò)候選人。

          一面

          • 介紹一下自己, 為什么選擇出來(lái)看看機(jī)會(huì)
          • 聊項(xiàng)目, 警報(bào)怎么做的, 統(tǒng)一接入監(jiān)控項(xiàng)怎么做的
          • 聊項(xiàng)目, 配置中心項(xiàng)目, 問(wèn)實(shí)時(shí)配置推送怎么做
          • 討論為什么選擇所有的組件依賴(lài)放在配置中心中控制
          • 我現(xiàn)在要做一個(gè)限流功能, 怎么做?
            • 令牌桶
          • 這個(gè)限流要做成分布式的, 怎么做?
            • 令牌桶維護(hù)到 Redis 里,每個(gè)實(shí)例起一個(gè)線程搶鎖,搶到鎖的負(fù)責(zé)定時(shí)放令牌
          • 怎么搶鎖?
            • Redis setnx
          • 鎖怎么釋放?
            • 搶到鎖后設(shè)置過(guò)期時(shí)間,線程本身退出時(shí)主動(dòng)釋放鎖,假如線程卡住了,鎖過(guò)期那么其它線程可以繼續(xù)搶占
          • 加了超時(shí)之后有沒(méi)有可能在沒(méi)有釋放的情況下, 被人搶走鎖
            • 有可能,單次處理時(shí)間過(guò)長(zhǎng),鎖泄露
          • 怎么解決?
            • 換 zk,用心跳解決
          • 不用 zk 的心跳, 可以怎么解決這個(gè)問(wèn)題呢?
            • 每次更新過(guò)期時(shí)間時(shí),Redis 用 MULTI 做 check-and-set 檢查更新時(shí)間是否被其他線程修改了,假如被修改了,說(shuō)明鎖已經(jīng)被搶走,放棄這把鎖
          • 假如這個(gè)限流希望做成可配置的, 需要有一個(gè)后臺(tái)管理系統(tǒng)隨意對(duì)某個(gè) api 配置全局流量, 怎么做?
            • 在 Redis 里存儲(chǔ)每個(gè) API 的令牌桶 key,假如存在這個(gè) key,則需要按上述邏輯進(jìn)行限流
          • 某一個(gè)業(yè)務(wù)中現(xiàn)在需要生成全局唯一的遞增 ID, 并發(fā)量非常大, 怎么做
            • snowflake (這個(gè)其實(shí)答得不好,snowflake 無(wú)法實(shí)現(xiàn)全局遞增,只能實(shí)現(xiàn)全局唯一,單機(jī)遞增,面試結(jié)束后就想到了類(lèi)似 TDDL 那樣一次取一個(gè) ID 段,放在本地慢慢分配的策略)
          • 算法題, M*N 橫向縱向均遞增的矩陣找指定數(shù)
            • 只想到 O(M+N)的解法 補(bǔ)充: 這幾天刷 leetcode 碰到這題了, 240. Search a 2D Matrix II[5]. 辦法是從左下角或右下角開(kāi)始查找.
          • 有什么想問(wèn)我的?

          限流,分布式鎖,UUID 都屬于后端的經(jīng)典面試題,這輪面試的參考價(jià)值挺大的。

          二面

          • 平時(shí)用的工具鏈和技術(shù)棧是什么
          • golang 踩過(guò)坑嗎?
            • 答了之前 PingCAP 面試時(shí)面試官問(wèn)的 for-range 里的 go-routine 閉包捕獲問(wèn)題
          • 這段 golang 代碼有沒(méi)有 bug(還是一個(gè) for-range 的坑)
            • 有 bug,for-range 的 value 引用拷貝問(wèn)題
          • Java 中 HashMap 的存儲(chǔ), 沖突, 擴(kuò)容, 并發(fā)訪問(wèn)分別是怎么解決的
            • Hash 表,拉鏈法(長(zhǎng)度大于8變形為紅黑樹(shù)),擴(kuò)容*2 rehash,并發(fā)訪問(wèn)不安全
          • 拉鏈法中鏈表過(guò)長(zhǎng)時(shí)變形為紅黑樹(shù)有什么優(yōu)缺點(diǎn)?
            • 優(yōu)點(diǎn):O(LogN) 的讀取速度更快;缺點(diǎn):插入時(shí)有 Overhead,O(LogN) 插入,旋轉(zhuǎn)維護(hù)平衡
          • HashMap 的并發(fā)不安全體現(xiàn)在哪?
            • 拉鏈法解決沖突,插入鏈表時(shí)不安全,并發(fā)操作可能導(dǎo)致另一個(gè)插入失效
          • HashMap 在擴(kuò)容時(shí), 對(duì)讀寫(xiě)操作有什么特殊處理?
            • 不知道
          • ConcurrentHashMap 是怎么做到并發(fā)安全的?
            • segment 分段鎖
          • Java 有哪些鎖機(jī)制, 分別有什么特點(diǎn)?
            • Synchronized、可重入鎖
          • 知道 CAS 嗎? Java 中 CAS 是怎么實(shí)現(xiàn)的?
            • Compare and Swap,一種樂(lè)觀鎖的實(shí)現(xiàn),可以稱(chēng)為”無(wú)鎖”(lock-free),CAS 由于要保證原子性無(wú)法由 JVM 本身實(shí)現(xiàn),需要調(diào)用對(duì)應(yīng) OS 的指令(這塊其實(shí)我不了解細(xì)節(jié))
          • MySQL 的存儲(chǔ)引擎用的是什么?(InnoDB)為什么選 InnoDB?
            • 幾乎所有公司用 MySQL 都用 InnoDB,降低踩坑成本;聚簇索引,MVCC
          • MySQL 的聚簇索引和非聚簇索引有什么區(qū)別?
            • 聚簇索引的葉子節(jié)點(diǎn)是數(shù)據(jù)節(jié)點(diǎn)(比如定義了主鍵時(shí)的主鍵索引),非聚簇索引葉子節(jié)點(diǎn)是指向數(shù)據(jù)塊的指針
          • B+樹(shù)和二叉樹(shù)有什么區(qū)別和優(yōu)劣?
            • B+樹(shù)是多叉樹(shù),深度更小,B+樹(shù)可以對(duì)葉子節(jié)點(diǎn)進(jìn)行順序遍歷,B+樹(shù)能夠更好地利用磁盤(pán)扇區(qū);二叉樹(shù):實(shí)現(xiàn)簡(jiǎn)單
          • 針對(duì)一個(gè)場(chǎng)景設(shè)計(jì)索引,具體場(chǎng)景忘記了,反正考察的是聯(lián)合索引與列選擇性的知識(shí)
          • 現(xiàn)有一個(gè)新的查詢場(chǎng)景, 要怎么解決?
          • 假如要查 A in () AND B in (), 怎么建索引?
            • 只給選擇性高的一列建索引,這里因?yàn)閮蓚€(gè)都是范圍查詢所以另一個(gè)是走不到索引的(這里答的不好,其實(shí)也可以建聯(lián)合索引然后用 (A,B) in ((1,2),(3,4)) 的方式去查)
          • 查 A in () AND B in () 時(shí), MySQL 是怎么利用索引的?
            • 先走一個(gè)非聚簇索引,查詢出行數(shù)據(jù)后再用另一列回表做篩選
          • 假如查詢 A in (), MySQL 是針對(duì) N 個(gè)值分別查一次索引, 還是有更好的操作?
            • 不知道,有了解的同學(xué)可以留言 (補(bǔ)充, @BillyLu[6] 貼出了文檔 equality-range-optimization[7], 大意是對(duì)非唯一索引 MySQL 會(huì)使用 index dive 的方式估算這個(gè) range index 涉及的行數(shù), 結(jié)合where optimization[8] 中說(shuō)明的在走 index 時(shí)假如涉及行數(shù)過(guò)多會(huì)走 full table scan, 那么假如 estimation 認(rèn)為這次 IN 不夠好, 是會(huì)走全表掃描的. 不知道除此之外, 面試官還有沒(méi)有想考察的點(diǎn))
          • 用過(guò) Redis 的哪幾種數(shù)據(jù)結(jié)構(gòu)? (都用過(guò)) ZSET 是怎么實(shí)現(xiàn)的?
            • 跳表
          • zrange start, stop, 總長(zhǎng)度為 n, 復(fù)雜度是多少?
            • O(logN) (答得不好,實(shí)際是 O(M+log(N)), M 是結(jié)果集基數(shù) stop-start)
          • Kafka 的消費(fèi)者如何做消息去重?
            • MySQL 去重、Redis 去重、假如場(chǎng)景量極大且允許誤判,布隆過(guò)濾器也可以
          • 介紹一下 Kafka 的 ConsumerGroup
            • 挺長(zhǎng)的,略
          • Kubernetes 和 Docker 用得怎么樣? (我:在公司推行布道)
          • 給它們貢獻(xiàn)過(guò)代碼嗎?(我:沒(méi)有…)
          • 時(shí)序型數(shù)據(jù)庫(kù)的存儲(chǔ)結(jié)構(gòu)是怎么樣的?
            • 講了 prometheus 1.x 和 2.x 的存儲(chǔ)結(jié)構(gòu)
          • LSM 樹(shù)了解嗎? 是一種什么存儲(chǔ)結(jié)構(gòu)?
            • Log-Structured Merge Tree,犧牲讀性能換取性能,RocksDB、HBase、Cassandra 都在用,結(jié)構(gòu)有點(diǎn)忘了,只說(shuō)了先寫(xiě) memtable 再刷盤(pán)成 sstable
          • 在生產(chǎn)中用過(guò) Cassandra 和 RocksDB 嗎? 量有多大?
            • 用過(guò),Cassandra 存調(diào)用鏈,RocksDB 做 flink 和 Kafka Stream 的本地狀態(tài)存儲(chǔ)
          • Cassandra 的墓碑機(jī)制是什么?
            • 不知道,對(duì) Cassandra 停留在使用階段

          二面問(wèn)了好多中間件的基礎(chǔ)知識(shí),最后都沒(méi)有時(shí)間問(wèn)算法了。面完之后心里就想:頭條的面試真是耿直啊,Java 的 HashMap、鎖機(jī)制、CAS 到 MySQL 的索引,Redis 的 zset,再到 LSM 樹(shù),全都是后端或中間件相關(guān)的熱門(mén)面試題。當(dāng)然這些問(wèn)題熱門(mén)也是有原因的,即使候選人準(zhǔn)備過(guò),多扣一點(diǎn)細(xì)節(jié)也能很快就能看出來(lái)候選人是真的理解還是僅僅只是看了相關(guān)資料。

          三面

          • 聊項(xiàng)目和工作經(jīng)驗(yàn)
          • 用 Kubernetes 的過(guò)程中踩過(guò)哪些坑?
          • 考慮一個(gè)業(yè)務(wù)場(chǎng)景: 頭條的文章的評(píng)論量非常大, 比如說(shuō)一篇熱門(mén)文章就有幾百萬(wàn)的評(píng)論, 設(shè)計(jì)一個(gè)后端服務(wù), 實(shí)現(xiàn)評(píng)論的時(shí)序展示與分頁(yè)
            • 我: 需不需要支持頁(yè)碼直接跳轉(zhuǎn)?
            • 面試官: 支持和不支持兩種場(chǎng)景都考慮一下
            • 我: 不需要支持頁(yè)碼翻頁(yè)就傳評(píng)論 id 用 offset 翻頁(yè)
          • 假如用 id 翻頁(yè)的方式, 數(shù)據(jù)庫(kù)表如何設(shè)計(jì)? 索引如何設(shè)計(jì)?
            • (文章id, 評(píng)論id) 建聯(lián)合索引,評(píng)論 id 需遞增
          • 假如量很大, 你覺(jué)得需要分庫(kù)分表嗎? 怎么分?
            • 需要分,分表有個(gè)權(quán)衡,按文章 id 分表,讀邏輯簡(jiǎn)單,但寫(xiě)有熱點(diǎn)問(wèn)題;按評(píng)論 id 分表,讀邏輯復(fù)雜,但寫(xiě)壓力就平均了。寫(xiě)是要首先保證的,而讀總是有緩存等方案來(lái)折中,因此按評(píng)論 id 分表好。
          • 分庫(kù)分表后怎么查詢分頁(yè)?
            • 每張表查 N 條數(shù)據(jù)由 client 或 proxy merge
          • 分庫(kù)分表后怎么保證主鍵仍然是遞增的?
            • 講了 TDDL 的辦法:有一張專(zhuān)門(mén)用于分配主鍵的表,每次用樂(lè)觀鎖的方式嘗試去取一批主鍵過(guò)來(lái)分配,假如樂(lè)觀鎖失敗就重試
          • 現(xiàn)在需要支持深分頁(yè), 頁(yè)碼直接跳轉(zhuǎn), 怎么實(shí)現(xiàn)?
            • 不能做精準(zhǔn)深分頁(yè),否則壓力太大,找產(chǎn)品進(jìn)行妥協(xié),在50或100頁(yè)后數(shù)據(jù)分頁(yè)是否可以不完全精確,假如可以,那么緩存深頁(yè)碼的起始評(píng)論 id
          • 瞬時(shí)寫(xiě)入量很大可能會(huì)打掛存儲(chǔ), 怎么保護(hù)?
            • 斷路器
          • 斷路器內(nèi)部怎么實(shí)現(xiàn)的?
            • 可以用 ringbuffer
          • 斷路器會(huì)造成寫(xiě)入失敗, 假如我們不允許寫(xiě)入失敗呢?
            • 先寫(xiě)進(jìn)消息隊(duì)列,削峰填谷異步落庫(kù)
          • 算法題: N 場(chǎng)演唱會(huì), 以 [{startTime, endTime}…] 的形式給出, 計(jì)算出最多能聽(tīng)?zhēng)讏?chǎng)演唱會(huì)
            • 先講了思路, 按 endTime 升序排列,再順序取最多場(chǎng)次
          • (講完思路之后)屏幕共享給我, 用你最熟悉的語(yǔ)言把這個(gè)算法實(shí)現(xiàn)
            • 用 go 實(shí)現(xiàn)了一版
          • 你用了貪心法, 貪心可能會(huì)存在什么問(wèn)題?
            • 局部最優(yōu),在這個(gè)問(wèn)題里,只能找到一個(gè)可能解,無(wú)法找到所有排列方式

          我覺(jué)得三面這個(gè)架構(gòu)設(shè)計(jì)問(wèn)得還不錯(cuò),一個(gè)問(wèn)題把后端的工程能力考的很全面了。

          HR 面

          大同小異,問(wèn)經(jīng)歷,問(wèn)離職原因,問(wèn)職業(yè)規(guī)劃,問(wèn)待遇,問(wèn)期望。

          小結(jié)

          • 面試難度:正常
          • 面試體驗(yàn):挺好
          • 問(wèn)題偏向:架構(gòu)設(shè)計(jì),算法

          頭條面試流程很專(zhuān)業(yè):每輪都會(huì)提前約好時(shí)間,面試時(shí)長(zhǎng)都在40~50分鐘,按時(shí)開(kāi)始面,每輪之后發(fā)反饋短信邀請(qǐng)候選人評(píng)價(jià)面試,精準(zhǔn)地過(guò)兩天再約下一輪。整個(gè)像一臺(tái)精密運(yùn)作的機(jī)器。頭條的面試我個(gè)人挺欣賞的,考察得比較全面,面試官會(huì)抓住你沒(méi)有說(shuō)清楚的地方來(lái)深入或者變換場(chǎng)景讓你應(yīng)變,大家可以試試看去面一下,即使不打算去也可以作為一次免費(fèi)的能力評(píng)定。

          再說(shuō)說(shuō)面試官,每位面試官都聽(tīng)得出來(lái)是在一線寫(xiě)代碼的,而且很認(rèn)真地在聽(tīng)我說(shuō)話(這當(dāng)中有視頻的功勞,我可以看到面試官在認(rèn)真聽(tīng)),感覺(jué)工作中也都會(huì)是好相處好合作的類(lèi)型。

          總結(jié)

          回頭看面試的過(guò)程,有好多不盡如人意的地方,不過(guò)最后能夠拿到三家的 offer 還是很幸運(yùn)。最后再做一些補(bǔ)充性的小結(jié):

          一些經(jīng)驗(yàn):

          • 簡(jiǎn)歷里寫(xiě)了的項(xiàng)目,以及熟練程度在”掌握”以上的領(lǐng)域與中間件要好好準(zhǔn)備,當(dāng)面試官問(wèn)你一個(gè)偏門(mén)的問(wèn)題時(shí),他內(nèi)心其實(shí)也沒(méi)希望你能答上來(lái)。而當(dāng)面試官問(wèn)你簡(jiǎn)歷上涉及的問(wèn)題時(shí),假如你答不上來(lái),那面試官就覺(jué)得這個(gè)人要么是眼界太低,會(huì)了一點(diǎn)就覺(jué)得自己掌握了,要么是簡(jiǎn)歷造假在胡吹,這兩種都非常不利;
          • 在上一條的基礎(chǔ)上,可以準(zhǔn)備一個(gè)最得意的項(xiàng)目,在簡(jiǎn)歷上和面試過(guò)程中引導(dǎo)面試官往這塊聊;
          • 面試前心里可以準(zhǔn)備一個(gè)方法論:明確面試官想招怎樣的人有哪些特質(zhì),在面試過(guò)程中努力表現(xiàn)出這些特質(zhì)。這聽(tīng)起來(lái)是句正確的廢話,但面試的過(guò)程不可控因素太多,有一個(gè)清晰的目標(biāo)在腦子里能幫你在手足無(wú)措時(shí)想到說(shuō)什么。舉個(gè)例子,有一輪中面試官問(wèn)我有什么問(wèn)題時(shí),我就問(wèn)貴司的對(duì)應(yīng)崗位會(huì)面臨哪些技術(shù)挑戰(zhàn)(當(dāng)然要先說(shuō)清楚這不是在質(zhì)疑他們沒(méi)有挑戰(zhàn),只是自己渴望挑戰(zhàn));

          一些各領(lǐng)域的資料與心得:

          • System Design Primer[9],入門(mén)架構(gòu)設(shè)計(jì)必看的一篇資料??赐曛筇嵝炎约菏冀K記得:架構(gòu)設(shè)計(jì)的本質(zhì)是深入理解業(yè)務(wù)場(chǎng)景之后用工程經(jīng)驗(yàn)做出最佳權(quán)衡。面試時(shí)的一個(gè)套路是先提綱挈領(lǐng)地把舍棄什么來(lái)?yè)Q取什么講明白;
          • 云原生相關(guān),Kubernetes Concepts[10] 部分建議再看一遍,源碼部分推薦看 apiserver 中的 CRD 部分與 aggregation layer、kubelet 的 pod 狀態(tài)同步、scheduler 的調(diào)度部分以及Sample Controller[11] 如何寫(xiě)一個(gè)自己的 controller
          • 語(yǔ)言方面,推薦看書(shū)《Effective Go》《Effective Java》,都很薄。這兩本書(shū)我是以前看的,面試前沒(méi)有專(zhuān)門(mén)準(zhǔn)備語(yǔ)言相關(guān);
          • 算法相關(guān),這部分我純鶸,說(shuō)實(shí)話我覺(jué)得大學(xué)里那本教材《數(shù)據(jù)結(jié)構(gòu)與算法分析》就寫(xiě)得很不錯(cuò)…至于 leetcode,面試前沒(méi)有刷過(guò),最近為了練習(xí) Rust 刷了60多題,并沒(méi)有碰到面試?yán)锍霈F(xiàn)過(guò)的題目,看起來(lái)要刷 leetcode 的話就得走量多刷點(diǎn),刷的少純拼強(qiáng)運(yùn)了;
          • Golang for range 的坑[12] 有兩輪面試都涉及到了這個(gè)話題,這里貼一下;

          到這里就全寫(xiě)完了, 你可以直接通過(guò)我的郵箱或在評(píng)論區(qū)留言交流, 感謝您耐心地看完全文!

          參考資料

          [1]

          @haosdent: https://github.com/haosdent

          [2]

          項(xiàng)目地址: https://github.com/aylei/kubectl-debug

          [3]

          Reddit 上: https://www.reddit.com/r/devops/comments/a8vnt5/i_wrote_a_tool_to_debug_kubernetes_pods_more/

          [4]

          蓄水池采樣算法: https://www.jianshu.com/p/7a9ea6ece2af

          [5]

          240. Search a 2D Matrix II: https://leetcode.com/problems/search-a-2d-matrix-ii/

          [6]

          @BillyLu: https://github.com/BillyLu

          [7]

          equality-range-optimization: https://dev.mysql.com/doc/refman/8.0/en/range-optimization.html#equality-range-optimization

          [8]

          where optimization: https://dev.mysql.com/doc/refman/5.7/en/where-optimization.html

          [9]

          System Design Primer: https://github.com/donnemartin/system-design-primer

          [10]

          Kubernetes Concepts: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/

          [11]

          Sample Controller: https://github.com/kubernetes/sample-controller

          [12]

          Golang for range 的坑: https://studygolang.com/articles/9701


          作者:吳葉磊

          原文:https://aleiwu.com/post/interview-experience/


          推薦閱讀


          學(xué)習(xí)交流 Go 語(yǔ)言,掃碼回復(fù)「進(jìn)群」即可


          站長(zhǎng) polarisxu

          自己的原創(chuàng)文章

          不限于 Go 技術(shù)

          職場(chǎng)和創(chuàng)業(yè)經(jīng)驗(yàn)


          Go語(yǔ)言中文網(wǎng)

          每天為你

          分享 Go 知識(shí)

          Go愛(ài)好者值得關(guān)注




          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一级免费爱爱视频 | 激情操逼无码 | 日逼视频软件 | 波多野结衣视频免费在线观看 | 91精品无码人妻系列 |