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