Elements of Programming Interviews: The Insiders' Guide 面試方針筆記
在一個 45~60 分鐘內的面試中,包含開發算法,實作及測試,分析複雜度,以下幾點會是關鍵要素
- 能解決真實世界中的問題
- 設計一個算法並解決問題的能力
- 用工具來實現一個算法並測試程式
- 分析自己解決方案複雜度的分析能力
面試的生命週期
- 找有興趣的工作
- 好好寫履歷
考慮到履歷可能被很多人看,你要能寫出針對 HR RD Manager 都感興趣的履歷。
HR :
- 對技術不了解,通常只看關鍵字,強調關鍵字,強調優秀之處
- 對電腦不了解,通常只看PDF
寫 C++ 的優良習慣
- 善用 STL ,絕不重造輪子,掌握自己使用的輪子
- 不用任何 non-const reference,傳遞輸出請用 pointer
- bool array 用 deque 裝,vector 在 *b=&A[0] 的時候有機會炸掉
寫 C++11 的優良習慣
- 善用 auto
- 善用 range base for loop
- 用 emplace_back/front 而非 push_back/front
- 用 std::array 而非舊類別 array,因為他支援 size 跟邊界檢查(有了 std::array 我再也不會炸掉 stack 惹呢)
- 善用 lambda
- 初始化空列表請用{}
寫 interview code 的優良習慣
對於有限時間的面試,我們會做以下取捨
- 直接把值域 public 了,省下寫 getters 跟 setters
- 不對空引用,不應存在的錯誤類別做檢測
- 我們偶爾使用 static 來傳遞數值,這樣可以簡少要寫的 class,不過就沒有 thread safe 了
- 我們只實作特定的解決方案,說給 interger 我們就不討論可用在其他型態的通用算法
- 錯誤處理不用太詳細,但還是要記得做,只要丟出 RuntimeException 就好
C++ 好書選讀
優質必推 C++ Primer,對於進階一點可以考慮 Effective C++ 和 Effective Modern C++ ,深入淺出設計模式,不過面試時間通常很短,用設計模式是一件很冒險的事。
如何解題
- 清楚定義問題
- 問題的值域,特性等可能導致適用的為截然不同的資料結構
- 嘗試具體的例子
- 念出你的暴力解
- 用暴力解是 ok 的,但清楚表示這是暴力解,並清楚表示這是還會在優化的。
- 大聲思考
- 嘗試去大聲談論自己的思考方向,避免冷場,也增加猜對機率
- 套用不同元件
- 嘗試套入不同的算法,解題方式,資料結構,這是一個很好逼近最佳解的方法。
展示解決方案
- 善用函式庫,避免重造輪子,省下所有人的時間
- 重心放在整體解題的算法(像是比較、hash function 等如何實現不是重點),有想回頭改的可以寫好 TODO 紀錄
- 管理好白板,用通俗的簡稱
- 假設輸入都是有效的,除非題目有特別說明要檢查
- 測試 corner case
- 注意語法錯誤,在宣稱自己做完之前從頭到尾檢查一次
- 愛用 const
- 管理好記憶體,洩漏是嚴重缺失
- 你的面試官不是密碼學大師,所以別寫一大堆洋洋灑灑的給別人猜自己的邏輯,通常 50~70 行足矣,超過的話重新想想自己是不是方向錯誤
確認好自己面試的公司
確認對方屬性,對症下藥寫履歷擬反應
通用溝通觀察點
- 能否跟應徵者清楚的溝通複雜的點子
- 應徵者是否對他的工作有熱情
- 有熱情的人眼睛會發光,可以透過詢問過往經歷得知,看他會選出自己熱愛的專案還是只是挑一個很複雜但他其實不是那麼喜歡的項目。
- 別只針對單一項目表達興趣
其他建議
- 誠實
- 保持正向
- 別莫名其妙一直道歉
- 除非談薪水不然別扯到錢
- 穿著正常輕鬆
- 注意肢體語言
壓力測試
某些公司會特別做出讓應徵者有壓力的舉動來測試,保持正常心態看待,正常回應。
進行面試
目的是找到好員工,所以下幾點避免
- 保持中庸,應徵者評斷不能只有極好跟極壞
- 別老是只給壓力,也要讓面試者在過程中感到愉快跟積極的芬圍。
該問些什麼
- 別針對單一話題猛打
- 人非聖賢,孰能無過,再優秀的人可能都會有一項失誤,要公平的給予機會
- 多方面的檢視解決方案
- 如果今天有一個多重解的解決方案,鼓勵應徵者多方面的回答多種解決方案
- 涵蓋多方面
- 雙向校準
- 應徵者通常對於一個 30 分鐘左右的題目有多難會給出不同意見,向對方確認他認知的難度是一個很好的主意
- 不問離題的問題
面試應對
- 針對卡住或是沉默的應徵者
- 鼓勵他說出自己解題的思路,並緩解緊張的情緒,不然恐怕無法展現他真正的實力
- 聒噪的面試者
- 過太爽的面試者
- 對於太過輕視問題的應徵者也該給予公平的機會,讓他能夠修正錯誤,指出問題點最好的方法是給對方一個會導致錯誤的測資讓他自行思考
評分
盡量保留面試時的紀錄,包含
- 給了哪些提示
- 對方修改程式的歷程
- 對方問了哪些問題,我們給了哪些回應
並且在打出最終分數前重新檢視一次,注意重質不重量。