# Cracking the Coding Interview 第五版 筆記 ~~> 為什麼我不寫最新的第六版呢?~~ 更新第六版電子書[在這](https://play.google.com/store/books/details?id=GmlwDwAAQBAJ) > [備用書](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836) ## 概敘 面試通常會先通過電話篩選 大公司可能會現場多人同時篩選 面試過程中可以透過線上文檔同步編程 面試結束後面試官會統一討論表現 提交書面評價 理論上一個禮拜內會給回覆告知進展 超過一個禮拜後可以主動詢問,但記得要有禮貌 ### 面試題目 通常取決於面試官的喜好 大公司會先集中培訓面試官 * 法律面,什麼項目不能問,種族或是婚姻狀態之類的 * 應對面,對方爆走時該如何應對 * 實際面,觀摩數次後實際上場 題目可能來自 * 上網查 * 自己想 * 互相交換 * 經驗 同時也可能有一些傾向 * 網路公司 * 系統設計 * 數據相關 * 資料庫 資料結構跟算法是共通點 ### 面試評估流程 四個方面 * 工作經驗 * 文化契合度 * 程式能力 * 分析邏輯 > 當進入面試環節時,工作經驗就不太重要了 對不同公司看重的點可能會有所不同 * 大公司較重分析邏輯和程式能力 * 創業公司重文化契合度,個人性格 還要做好以下準備 * 巧辯跟牴觸心太重都不太好 * 對於履歷上可能被提問的負面問題,準備好四兩撥千斤的回應方式 * 主要準備程式跟算法問題 最後不要氣餒,失敗為成功之母。 ### 答題狀況 問題不一定要全部答對,面試的答案並非只有正確和錯誤,評估不只看答對幾題,以下幾點都會列入。 * 解法是否最優(複雜度、通用性......等) * 時間花費多久 * 程式是否簡潔 根據題目的難度決定策略,簡單的題目可能會被期望盡早給出答案,困難的題目可能觀察的是思維方式,這種情況就算出點錯也是難免的。 ### 衣著規範 科技行業通常穿著正常即可。 * 一般科技業:卡其褲、整齊牛仔褲 + Polo 衫或襯衫 * 銀行或其他行業:正式套裝,領帶備而不用 主管或是經理等職位正式度可能要上升一點 ### 十大常見錯誤 1. 只在電腦上練習 * 讓自己有拋開 IDE 面對不同情況的能力,但用 IDE 來驗證自己的正確性。 2. 只準備程式題目 * 行為相關題目也要準備,重點回顧過往項目和經歷,以此為基礎並準備一些小故事。 3. 不做模擬面試 * 紙上談兵的效果永遠不會好到哪裡去,尤其是事關自身未來的事情更是要實際演練,可以找認識的朋友互相模擬面試,教學相長互相檢視。 4. 死背答案(看看刷了四百題那位) * 切記質量勝於數量,練習時在不看答案的情況下試著做出題目,訓練各種觀點和技巧,就算最後能複習的數量不多沒關係,因為重點是要能從容面對新問題 5. 不大聲說出你的解題思路(這我超會的XDD) * 當你解題時沉默太久面試官會很無聊,不知道你進度怎樣,可能會開始翹二郎腿或是玩辦公椅(X),說出來不但可以讓面試官知道進度,理清絲路,甚至可以觀察面試官來確認自己有沒有矇到答案,還能突顯自己的溝通能力 6. 過於著急 * 在工作中寫程式並不是競賽,面試也不是。所以解題時不要太倉促,多做測試從不同方面檢視結果,思考的周全一點,才不會顯得自己不夠細心,一步一步穩健進展反而能高效的給出優質的答案。 7. 答案不夠嚴謹 * 面試時常常寫出錯誤百出的程式,代碼冗餘或是資料結構亂用,要假設自身是在處理實際問題,注意可維護性,OO 的相關技巧等。 8. 沒做測試 * 面試跟平常一樣,不可能沒測試就提交程式碼,寫完之後請假設運行來驗證一下程式的正確性,尤其是 corner case 特別注意。 9. 不用心的修正錯誤 * 程式有 bug 很正常,但修正時要特別小心,有些人會找到「一個」Corner case 就用 if 取代掉,這種粗暴的作法常常導致更多的 bug,也反映出這個人很粗心大意,胡亂修改程式碼比有 bug 這件事更嚴重。 10. 輕言放棄 * 別說什麼「我們時間是不是不太夠」或是「我放棄」這種毫無進取心的回應,問題困難是正常的,但不會有人討厭有挑戰心的求職者 ### 常見問題解答 1. 碰到熟悉的問題要不要誠實說? * 要,顯示你的誠信以及窺探這個問題是不是與你熟悉的一模一樣 2. 用什麼語言? * 推薦用 C++/Java......? I don't think so 3. 面試後沒回覆? * 等一個禮拜後送信過去問問 4. 被拒絕後能重新申請嗎? * 通常會有冷卻時間,過了就行 ## 面試細節 大公司通常會有12345678面,不像我們一面定生死,有些公司會針對單一團隊面試,有些公司只招全端。 ### 有工作經驗會不會影響面試 就題目而言通常沒差,但是有工作經驗的可能會追加系統架構設計,此外對於「遇過最棘手的 Bug 」這種行為題而言,資深的會被預期給出更好的答案 ### 新創公司的傾向 會更注重文化契合度,工作技能跟經驗 > 註:這他媽不是廢話嗎= = 新創公司通常沒培訓,會要即戰力,且可能特別注重正在使用之語言的熟練度。 會問更多工作經驗相關的問題,以期待能在應徵者身上得到更高的附加價值。 ## 面試之前 ### 累積相關經驗 > 對於在學的學生 * 修一些有大型 project 的科目 * 找一些實習工作 * 開拓一些業務及項目 > 對於工作中的人士 * 多承擔一些職責 * 用重大項目當作自己練習往後項目的挑戰,也會成為簡歷上的亮點 * 善用晚上及週末的閒暇時光 * 多加練習及接觸新穎的技術,這些都可以寫到簡歷上,為興趣而工作是最吸引人的特點 ### 建構人脈網路 * 培養廣度 * 培養深度 * 參加社群 * 主動打招呼 * 大方談論興趣 * 善用 LinkedIn * 在網路上建構個人可見度 ### 寫好簡歷 * 長度適中,通常一頁結束,十年以上最多兩頁 * 20 秒內要能引起對方興趣,嚴禁廢話 * 工作經驗 * 只列舉相關經驗,並且用數字說話,量化結果 * 只列二到四個重要項目,簡明扼要 * 英文履歷務必尋找專業人士幫忙檢閱 typo ,避免婚姻狀況、年齡、國籍等隱私訊息,公司並不想知道也不想觸法 ## 行為面試相關 ### 常見必備問題 * 擔當過最難的部份 -> 面試及與海外溝通 * 有什麼收穫 -> 溝通檢視能力,對嚴謹度的重視 * 最有意思的部份 -> 嘗試不同的語言,檢視不同語言的設計是一件非常有趣的事情,像是 js 的弱型態對比於強型態的設計 * 最難解的 bug -> 自己設計的模擬架構要除錯 * 最享受的過程 -> 跟團隊隊員談論架構設計,算法邏輯的時候 * 與團隊成員的衝突 -> 隊員在睡覺該如何處理,隊員進度大幅落後該如何處理。 以下人格特質問題在非純開發職的出現率較高,但如果是新創可能都會問,所以最好也準備一個小故事來對應 1. 你有哪些缺點 * 回答千萬不要太空泛,像是「我太努力了」,這種鬼話,要提到真實並且合乎情理的缺點,然後再提到自己如何克服這些缺點,有哪些解決方式。 2. 專案中最難處理的問題是什麼 * 問題有「最困難」所以就請找出一個最明顯的例子,若是回應的太空泛就好像在顯示其實專案根本不難在硬凹的感覺。 ### 應該問面試官哪些問題 大多數面試官都會給提問的機會,這些提問之問題的質量也會是評估整體表現的因素之一 1. 真實的問題 * 大概每天會花多少時間在寫 code * 一週要開幾次會 * 測試、開發及管理人員互相的比例是多少,如何溝通如何規劃 2. 有眼光有深度的問題 * 貴公司使用了 A 技術,可否透露下你們是如何處理 Y 問題的 * 為什麼貴公司的產品會選擇 A 協議而非 B 協議,據我所知 A 協議有 X、Y、Z 幾點好處,但因為存在 W 問題而被大多公司棄用。 3. 富有激情的問題 * ~~加班時能不能睡公司~~ * 我對可擴展性很敢興趣,請問您有從事過相關分散式系統方面的工作嗎?有哪些機會可以學習這方面的知識? * 我對 A 技術不是很熟悉,不過聽上去是個不錯的解決方案,您能多跟我分享一點他的工作原理嗎? ### 如何應對提問 回答問題時以下幾點切記 1. 力求具體,切記不要自大 * 陳述事實,留下部份給面試官解讀 * 回答一:「我一個人做了團隊中最累最難的事情」 * 回答二:「我實現了 file system,因為 XXXX 的原因,這在專案中是最難的一部分」 * 回答二顯得更具體更客觀 2. 省略不重要的細節 * 面試者針對某個細節喋喋不休時,別忘了不熟悉相關主題的面試官可能聽的滿臉問號,所以請談重點,如 * 「在研究 XXX 實作的算法後,我設計了新的一種,根據內部統計在 90% 的情況下操作的時間複雜度由 O(n) 降至 O(logn),如果您感興趣的話我可以再詳細說明一些」 * 這樣簡潔有重點,如果對方對細節感興趣的話他會主動詢問的。 3. 回答條理清晰 以下兩種語句組織方式供參考 * 主題先行 * 先講主題可以快速抓住對方注意力,也可以預先設定好主題讓自己敘述時不至於跑題。 * S.A.R * 分別敘述「情境」、「行動」、「結果」 * 切記情境和結果必須言簡意賅,面試官不需知道太多細節,S.A.R 意在快速讓對方了解面試者發揮了什麼影響力,有什麼樣的作用。 ## 應對技術題 ### 基本五步驟 1. 提問並消除題目中的疑義 2. 設計一種算法 3. 先寫 pseudo code ,並告訴面試官自己後續才會寫真實的 code 4. 寫程式碼要不急不徐,充分掌握思考時間 5. 測試寫好的 code 並修正錯誤 #### 1.提問 通常好問題會包含以下幾點:數據類型、多少數據、假定條件、用戶是誰。 可以用提問來釐清以上幾點 #### 2.設計算法 以下幾點務必思考 1. 該算法的空間和時間複雜度? 2. 碰到大量數據會怎麼樣? 3. 特化的設計是否會有 side effect 4. 對於特定的問題或限制,有做出正確的取捨嗎? 5. 如果指定某些方式,是否有善用這個訊息,通常給出特定訊息都是有原因的 先給出暴力解之後以此為基礎不斷優化,先給出暴力解是 OK k ,但要強調自己正在持續優化,面試官總是會期望給出最優的解法,但這不代表一開始就要給最優的解法。 #### 3.先寫 pseudo code 這有助理清思路,減少犯錯次數。但一定要先說清楚,避免讓面試官以為你在逃避寫真的 code ,這種人通常會被討厭。 #### 4.編寫真的程式碼 編寫時切記不要太倉促,放鬆步調要有條有理的寫,保持優雅很重要(?) * 善用資料結構,並且展現出對於 OO 設計的良好認知 * 保持程式碼的簡潔及簡單,盡量從左上角開始寫,這樣才有足夠的空間從容答題。 #### 5.測試 自己的代碼自己測試,考慮以下 case * 極端 case :像是 0 、負數、空值、最大值最小值 * 用戶錯誤 : 傳入空值或是不合法的輸入 * 一般 case : 測試正常 case 輸出是否正確 如果涉及大量數值操作,像是 bit wise 等建議邊寫邊測試,寫完再測試會更難。 發現錯誤時務必理清思路在修改,千萬別表現的像熱鍋上的螞蟻一樣東修西補。 #### 五個指標 > Acid tests * integrity 正直 * intelligence 聰明 * Maturity 成熟 > 4E1P * Positive energy 正能量 * The ability to energize others 鼓勵他人的能力 * Edge, the courage to make tough yes or no decisions 決斷力 * Execute 執行力 * Passion 熱情