2014-12-26

矽谷科技業求職心得分享(四)準備面試

準備面試


準備面試就像準備考試一樣,是確保你能在面試時發揮實力的必經之路。以下想分享一下我在準備的過程中,準備了哪些東西、怎麼準備的、還有一些資源分享。

程式設計

軟體公司的面試絕對會有演算法或資料結構相關的題目。這次準備面試,我主要準備了以下幾樣東西:
  1. Cracking the Coding Interview (CCI) (2014/07-2014/10)
    這本書上面的題目偏簡單,涵蓋的題材較廣(也因此我有跳過一些較不相關部分)、也較為基本,解答是用 Java 寫的。有些公司已經明文規定不可以問這本書上出過得題目,雖然這麼說,我還是有聽說有人被問到上面的題目(包含我自己)。
  2. Elements of Programming Interviews (EPI) (2014/07-2014/10)
    我覺得這本是神書,應該可以涵蓋 90% 以上會被問到的程式設計的題目了。他解答是用 C++11 寫的,我覺得寫得滿漂亮的,光是看解答都可以學到不少。
  3. The Algorithm Design Manual (2014/03-2014/04)
    這本書前半就是一般大學演算法、資料結構會講的內容,雖然我大學修過演算法與資料結構,但很多小東西還是忘記了,因此我把前半複習了一次。
  4. C++ Primer(2013 時因興趣加上想說順便練習而讀)
    這本書聽說是 C++ 學習者的聖經之一,雖然以前我大學有寫過一些 C++,但為了複習一些基本概念與語法,我把這本書的前七章複習了一次。
  5. LeetCode (2014/08-2014/10)
    一般只要講到面試,很難不提到 LeetCode。LeetCode 是一個可以練習寫程式解題的平台,上面大部分的題目都是從真正的面試中蒐集而來。在平台中你必須輸入語法正確的程式碼,並且通過各種大小或奇怪的測資,才算解完一題。有趣的是,有不少題目在 EPI 或是 CCI 中也有出現過,所以有時候你可能在書上讀一次,在 LeetCode 實際練習一次。我自己總共大概練習了 125 題左右。
  6. USACO(2013 時因興趣加上想說順便練習而做)
    USACO 是一個資訊程式競賽的練習平台,我之前花時間在上面練習寫程式,一方面是想要玩玩看 Google Code Jam 之類的的程式競賽,二方面想說也許對面試也會有點幫助,嚴格說來,事後看來,其實只對熟悉語法、實作演算法兩件事情有幫助,對面試來說不算有直接幫助。我自己大概寫了至多 30-40 題。
一些準備面試相關書籍
我認為練習程式設計要培養的能力分成兩種:
  1. 能運用演算法、資料結構解題的能力
  2. 把心中的演算法無誤的(用白板、紙筆)實作出來的能力
有些準備面試的書上會建議你每一題都要在紙筆上寫,寫完後輸入電腦看看是否正確。我覺得這樣有點像是把兩件事情混在一起練習,畢竟寫不出來或是寫錯的可能性有千百種,有時候卡的是不知道演算法或資料結構,有時候是實作上的細節沒有考慮到。

針對第一點,我會建議可以直接看書,自己想演算法,再看解答是否跟自己想的一樣,想不太到的其實直接看解答也無妨。有些題目自己想破頭,幾個小時還是想不到答案,反而有點浪費時間。不如超過一定的時間界線(如十分鐘)就直接看解答,並且思考這題的解答的精隨為何,為什麼自己想不到,並且看看解答中他是怎麼實作的。但也不要想不出來就馬上看答案,面試的題目有千百種,隨便一個變形都可以是一個新的題目。切記一定要培養自己抽絲剝繭的解題能力!

針對第二點,我會建議把已經知道演算法的題目用白板或紙筆練習寫程式碼。你可以從簡單的題目開始,再進階到複雜的題目。要盡量練習到知道做法就寫得出程式碼的地步,因為實際面試時,你並不會有時間慢慢塗塗改改。

一定要在白板上練習寫程式碼
你可能會問,這些題目到底與工作本身有什麼關係?其實我也是在準備程式設計面試的同時,才體會到為什麼這些軟體公司會想要考這些看似與工作內容不直接相關的題目。軟體公司追求的人才不外乎是能迅速寫出高效能軟體的,而唯有對資料結構、演算法、時間空間複雜度熟悉的人,才有可能達到公司的需求。老實說,透過這次的訓練,也讓我更知道該怎麼優化自己平時研究的實驗。

系統設計 (system design)

系統設計的題目比較千變萬化,也較難掌握,我自己沒有太多心得,根據在矽谷工作幾年的黃金單身漢 Q 君的說法,系統設計主要是考經驗。就我自己的經驗,還有跟朋友討論後的結論是要從大格局出發,從流程圖或是系統架構圖開始,再詳細討論每個地方的設計的取捨。而我碰到最難的地方在於,我常常連要用什麼東西來設計都不知道,更遑論取捨了。

行為性面試 (behavioral interview)

我自己的做法是上網搜尋了一些常見的問題(上網搜尋 behavioral interview 就有很多了),並事先想好、寫好答案,每題以一到兩個要點回答。另一方面,我也在面試前對履歷上每一點自己所做過的事情,都去想想一些如「自己最喜歡」或「自己最不喜歡」的內容。另外一個常見也必想的題目則是:「如果你今天面試的公司都上了,你會怎麼挑選要去哪裡?」,這邊想請大家想想看,如果一個面試者告訴你他覺得錢最重要,你會怎麼想?

60 秒自介 (elevator speech)

60 秒自介主要是用於就業博覽會中。對方通常會請你先短短自我介紹,但由於時間不多,我個人建議可以涵蓋:「你是誰、專長是什麼?」「你為什麼想去這家公司?」「公司為什麼要僱用你?」。其中「你為什麼想去這家公司?」「公司為什麼要僱用你?」其實是一體兩面,你可以說因為他們公司有很多你覺得有趣也擅長的工作,所以你想去他們公司,另一方面,你也可以說因為你們公司正在發展某某(你的專長)方面的東西,而我覺得這同時也是我的專業。在任何這種自介的場合無論長或短,對方都不會太仔細看你的履歷,如果你想談一些有比較專業關鍵字的內容而怕對方一下聽不懂時,你可以指引對方到你履歷的特定部位,當作你的「自介投影片」。

除了準備簡短的自我介紹以外,為了避免被問到履歷上的內容時一下無法很順的答出,我有履歷上每項經驗或是可能會被問的問題都寫了一段短短(三四句話)盡可能淺顯易懂的講稿。我設想的問題不外乎「請問這是什麼?你做了些什麼?」「你可以多談談你這項經驗嗎?」。


沒有留言:

張貼留言