自學(xué)三個(gè)月,成功面試路線圖
又快到「金三銀四」了,一定不少同學(xué)在摩拳擦掌,怎樣更好的準(zhǔn)備從而拿到更高的級(jí)別和更好的報(bào)酬,咱們來(lái)看一位曾在 Facebook和微軟工作,面試過(guò)數(shù)百人的工程師給的經(jīng)驗(yàn)總結(jié)。
三個(gè)月?真的可以?
人們常問(wèn)我,新人或者幾年不曾面試的人,成功通過(guò)代碼面試,合理的時(shí)間一般至少要多久?
我覺(jué)得三個(gè)月是個(gè)合理的時(shí)間。真的,三個(gè)月。如果剛面試不久,也至少需要準(zhǔn)備4-6周,如果你過(guò)去一年多都沒(méi)面試過(guò),那不能比三個(gè)月再少了。
說(shuō)回正題,下面是像 Facebook, Google, 微軟等大公司面試程序員時(shí)主要問(wèn)的五個(gè)部分:
- Coding 面試 (主要考查問(wèn)題解決能力、數(shù)據(jù)結(jié)構(gòu)和算法)
- 操作系統(tǒng)和并發(fā)相關(guān)
- 系統(tǒng)設(shè)計(jì)(PS:類似于設(shè)計(jì)一個(gè)電商系統(tǒng),秒殺系統(tǒng)之類的)
- 面向?qū)ο?/li>
- 文化契合度
和其他需要持續(xù)準(zhǔn)備的長(zhǎng)期目標(biāo)一樣(比如跑個(gè)馬拉松),遵循一些規(guī)則很重要,因?yàn)樗鼤?huì)鼓勵(lì)你在動(dòng)力可能減弱的日子里保持在正軌上。
為此,我創(chuàng)建了一個(gè)12周的準(zhǔn)備計(jì)劃,你可以跟著準(zhǔn)備。跟著這個(gè)計(jì)劃12周后,基本會(huì)覆蓋到上面提到的幾個(gè)部分。
咱們開(kāi)始吧。
Week 0 - 你應(yīng)該使用什么編程語(yǔ)言?
選擇一種編程語(yǔ)言并堅(jiān)持下去。經(jīng)常有人問(wèn):如果我知道不止一種,該怎么選?比如 Python 比 Java 好嗎?
答案是你該選擇自己最熟悉的編程語(yǔ)言。大多數(shù)面試官并不在意你是否精通主流編程語(yǔ)言。我看到有人在面試中決定「換」一種不同的語(yǔ)言,這很糟糕,別這樣,早選好一種,堅(jiān)持下去。
Week 1 - 復(fù)習(xí)你最熟悉的語(yǔ)言的基礎(chǔ)
復(fù)習(xí)一下你選擇的語(yǔ)言,即使你在日常編碼時(shí),常用到你喜歡的語(yǔ)言,也還是會(huì)忘記不少內(nèi)容。
我見(jiàn)過(guò)不少人努力回想這些內(nèi)容:
- 怎么讀寫文件
- 怎樣從控制臺(tái)讀內(nèi)容
- 字符串怎么分隔
- String 的 length 是個(gè)方法還是屬性
- 如何定義和使用二維數(shù)組
有一次我還看到候選人不記得判斷一個(gè)數(shù)是正數(shù)還是負(fù)數(shù)(我覺(jué)得他知道只是一下想不起來(lái))
你花在回想所選編程語(yǔ)言語(yǔ)法等細(xì)節(jié)上的時(shí)間不如將其放在展示你解決實(shí)際問(wèn)題的能力上,那才是面試官更想看到的。
像Lyft和Salesforce等一些公司,會(huì)要求你用筆記本電腦解決問(wèn)題。您得編寫能通過(guò)測(cè)試用例的完整代碼。在這些 case 里,您可能做類似:
- 處理命令行參數(shù)
- 解析 CSV 或者 文本文件
當(dāng)然,你可以直接 Google,但這會(huì)花你不少時(shí)間,但并不能讓你脫穎而出。
而像 Amazon 和 Google 在內(nèi)的大多數(shù)公司,會(huì)讓你在白板上解決問(wèn)題。這種考察的能力,和你在IDE里編寫代碼的經(jīng)驗(yàn)是完全不同的?,F(xiàn)在就得開(kāi)始練習(xí)實(shí)際編寫代碼來(lái)鍛煉一下了。
Week 2&3 - 數(shù)據(jù)結(jié)構(gòu)和算法
需要開(kāi)始復(fù)習(xí)一下像數(shù)據(jù)結(jié)構(gòu)和算法這些計(jì)算機(jī)科學(xué)的概念了。實(shí)際上,你曾經(jīng)在大學(xué)時(shí)上過(guò)課但從沒(méi)認(rèn)真學(xué)過(guò)的那些概念實(shí)際上對(duì)編程面試非常有用。
要復(fù)習(xí)這些主題:
- 復(fù)雜度分析(大O)
- 數(shù)組
- 棧
- 隊(duì)列
- 鏈表
- 樹(shù)
- 圖( BFS 和 DFS)
- Hash Table
- 堆
- 排序
- 查找
Weeks 4&5 練習(xí)簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)和算法
在您復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí),開(kāi)始練習(xí)一下和這些數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的相對(duì)簡(jiǎn)單的編碼問(wèn)題。
通常這些問(wèn)題在大公司面試?yán)锊⒉怀R?jiàn)。即使問(wèn),也只能算熱身問(wèn)題。這些反而在電話面試?yán)锔R?jiàn)。但練習(xí)這些問(wèn)題能幫助你內(nèi)化數(shù)據(jù)結(jié)構(gòu),解決幾周后要練習(xí)的更難的問(wèn)題。
對(duì)于數(shù)組,可以復(fù)習(xí)像下面的這些內(nèi)容:
- 從數(shù)組中刪除偶數(shù)(奇數(shù))
- 合并兩個(gè)有序數(shù)組
- 找到數(shù)組中的第一個(gè)非重復(fù)整數(shù)
- 查找數(shù)組中第二大的數(shù)
用下面的問(wèn)題來(lái)復(fù)習(xí)鏈表:
- 計(jì)算鏈表的長(zhǎng)度
- 在單向鏈表中查找
- 鏈表反轉(zhuǎn)
- 查找鏈接的中間值
通過(guò)以下的問(wèn)題來(lái)復(fù)習(xí)棧/隊(duì)列:
- 對(duì)棧中的值進(jìn)行排序
- 創(chuàng)建返回最小值復(fù)雜度是O(1)的棧
- 用一個(gè)數(shù)組實(shí)現(xiàn)兩個(gè)棧
復(fù)習(xí)樹(shù)的問(wèn)題:
- 在二叉搜索樹(shù)中查找最小值
- 計(jì)算二叉樹(shù)的高度
- 在二叉搜索樹(shù)中找到第N大的值
復(fù)習(xí)圖的問(wèn)題:
- 實(shí)現(xiàn)廣度優(yōu)先查找
- 實(shí)現(xiàn)深度優(yōu)先查找
- 檢查圖中的回路
復(fù)習(xí)堆的問(wèn)題:
- 在 list 里找到第 N 小的元素
- 在 array 里找到第 N 大的元素
Weeks 6,7,8 - 練習(xí)更復(fù)雜的編碼問(wèn)題
你已經(jīng)練了兩周的簡(jiǎn)單問(wèn)題,現(xiàn)在該練一些更難些的,在實(shí)際面試中更可能問(wèn)到的問(wèn)題了。
下面這些準(zhǔn)則,在解決這些問(wèn)題時(shí)要注意遵循:
- 一般來(lái)說(shuō),解決任何給定問(wèn)題的時(shí)間不應(yīng)超過(guò) 20-30分鐘。所以現(xiàn)在你自己也要計(jì)個(gè)時(shí)。
- 如果不能在給定時(shí)間內(nèi)解決問(wèn)題也別灰心。即使花幾個(gè)小時(shí),也先別看答案,這能幫助你建立信心,然后能更專注的在以后更快的解決。
- 開(kāi)始考慮每種解決方案的的運(yùn)行時(shí)和內(nèi)存的復(fù)雜度。實(shí)際面試的時(shí)候必須能清楚地說(shuō)明,因此最好現(xiàn)在開(kāi)始。
以下一些可以參考的問(wèn)題:
- 實(shí)現(xiàn)二叉樹(shù)
- 找到兩個(gè)鏈表的交點(diǎn)
- 對(duì)句子中的進(jìn)行逆序
- 檢查兩個(gè)二叉樹(shù)是否相同
- 克隆(深拷貝)有向圖
- 確定數(shù)組中是否存在三個(gè)等于給定值的整數(shù)。
這些你得花2到3周時(shí)間。如果遇到問(wèn)題或者被卡住了,別太擔(dān)心。一段時(shí)間后你一定能解決。在練習(xí)開(kāi)始幾天看著難的問(wèn)題之后會(huì)變得容易起來(lái)。
Weeks 9&10 - 系統(tǒng)設(shè)計(jì)面試
系統(tǒng)設(shè)計(jì)的面試在現(xiàn)在已經(jīng)成了面試中必不可少的一部分,特別是你要申請(qǐng)高級(jí)職位的時(shí)候,這些面試會(huì)直接影響你的面試「等級(jí)」。
學(xué)習(xí)一些 CAP 、 一致性、 分區(qū)、負(fù)載均衡等分布式相關(guān)的概念很有必要。
在系統(tǒng)設(shè)計(jì)中,面試官一般會(huì)讓你設(shè)計(jì)一個(gè)「彈性」的應(yīng)用,他會(huì)根據(jù)這些來(lái)評(píng)估你設(shè)計(jì)可擴(kuò)展服務(wù)不同部分的能力。比如下面這些方面:
- Web 服務(wù)器是怎么做負(fù)載均衡的?
- 數(shù)據(jù)庫(kù)是怎樣分片的?
- 大文件是怎樣存儲(chǔ)的?
- 為了穩(wěn)定性和吞吐量,網(wǎng)絡(luò)是如何設(shè)計(jì)的
而對(duì)應(yīng)考察這些方面的問(wèn)題,會(huì)體現(xiàn)在類似這種問(wèn)題中:
- 請(qǐng)?jiān)O(shè)計(jì)一個(gè) Instagram (圖片分享)
- 請(qǐng)?jiān)O(shè)計(jì)一個(gè) Facebook Newsfeed (新聞Feed)
- 請(qǐng)?jiān)O(shè)計(jì)一個(gè) Uber
PS: 關(guān)于系統(tǒng)設(shè)計(jì)的問(wèn)題,我的公眾號(hào)「Tomcat那些事兒」里后面會(huì)陸續(xù)分享,包含數(shù)據(jù)庫(kù)分片、一致性、數(shù)據(jù)庫(kù)設(shè)計(jì),負(fù)載均衡等設(shè)計(jì)可擴(kuò)展應(yīng)用必備的技術(shù),敬請(qǐng)期待。
Week 11 - 操作系統(tǒng)和并發(fā)
今天,即使最便宜的筆記本電腦和手機(jī),也都有多個(gè)核。無(wú)論你是開(kāi)發(fā)移動(dòng)應(yīng)用,還是 Web 服務(wù),了解線程、鎖、同步等概念都很有用。
像系統(tǒng)設(shè)計(jì)面試的問(wèn)題一樣, 多線程和并發(fā)問(wèn)題在衡量你的面試等級(jí)也很有用。初級(jí)工程師一般只是簡(jiǎn)單了解。而一個(gè)相對(duì)高級(jí)的工程師應(yīng)該在這些問(wèn)題上能做的更好。
Week 12 - 面向?qū)ο笤O(shè)計(jì)
一些常見(jiàn)的問(wèn)題類似:
- 設(shè)計(jì)一個(gè) ATM程序
- 設(shè)計(jì)一個(gè)電梯程序
- 設(shè)計(jì)一個(gè)停車場(chǎng)程序
在面向?qū)ο笤O(shè)計(jì)的問(wèn)題中,面試官一般會(huì)考察你對(duì)軟件設(shè)計(jì)模式的理解,以及你對(duì)從需求抽象出 Class 的能力。你得花大部分時(shí)間來(lái)解釋不同的組件,它們的接口,以及組件之間是如何交互的。
文化契合度面試
這一部分有時(shí)候可能是最重要的,但許多人并沒(méi)太注意。例如,在 Amazon,文化深深植根于他們的錄用過(guò)程中,一些深度認(rèn)同和踐行文化的人最終決定是否錄用你。(PS: 和阿里的HR 是否有一拼)
這種方式思想其實(shí)也很簡(jiǎn)單:如果你態(tài)度很好,你學(xué)新技能也沒(méi)什么問(wèn)題,因此編碼和系統(tǒng)設(shè)計(jì)時(shí)的一些問(wèn)題也是可以忽略的。但如果一個(gè)人對(duì)產(chǎn)品感興趣但看樣子和團(tuán)隊(duì)不太好合作,可能也不會(huì)錄用。
文化契合度面試的一些基本規(guī)則:
- 表現(xiàn)出你對(duì)產(chǎn)品的興趣,和對(duì)它的理解
- 要做好準(zhǔn)備「在與同事或者與經(jīng)理發(fā)生沖突的時(shí)候是怎么解決的」這類問(wèn)題的答案。不要說(shuō)工作幾年,不會(huì)有沖突之類的
- 說(shuō)一下如果面試成功,你在公司想要做什么
- 說(shuō)一下做為工程師你最近或最有影響力的一些成就。
- 說(shuō)一些你遇到特別難解決的bug。
總結(jié)
準(zhǔn)備面試會(huì)花費(fèi)你大量的時(shí)間和精力,但如果這能幫助你脫穎而出,那也是值的。在準(zhǔn)備的過(guò)程中要牢記你的最終目標(biāo)是找到一個(gè)個(gè)人滿意的高薪工作,將有助于你堅(jiān)持下去。