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