考察目標和思路
首先明確,技術初試的考察目標:
- 候選人的技術基礎;
- 候選人解決問題的思路和能力。
技術基礎是基石(冰山之下的東西),占七分, 解決問題的思路和能力是落地(冰山之上露出的部分),占三分。 業務和技術基礎考察,三七開。
為什么要考察技術基礎
程序員最重要的兩種技術思維能力,是邏輯思維能力和抽象設計能力。邏輯思維能力是基礎,抽象設計能力是高階。 考察技術基礎,正好可以同時考察這兩種思維能力。能不能理解基礎技術概念及關聯,是考察邏輯思維能力;能不能把業務問題抽象成技術問題並合理的組織映射,是考察抽象設計能力。
絕大部分業務問題,都可以抽象成技術問題。在某種意義上,業務問題只是技術問題的領域化表述。
因此,通過技術基礎考察候選者,才能考察到候選者的真實技術實力:技術深度和廣度。
為什么不能單考察業務維度?
因為業務方面通常比較熟悉,可能就直接按照現有方案說出來了,很難考察到候選人的深入理解、橫向拓展和歸納總結能力。
這一點,建議有針對性地考察下候選人的歸納總結能力:比如, 微服務搭建或開發或維護/保證系統穩定性或性能方面的過程中,你收獲了哪些可以分享的經驗?
為什么要考察業務維度?
技術基礎考察,容易錯過的地方是,候選人的非技術能力特質,比如溝通組織能力、帶項目能力、抗壓能力、解決實際問題的能力、團隊影響力、其它性格特質等。
技術基礎考察
技術基礎怎么考察?通過有效的多角度的發問模式來考察。
是什么-為什么
是什么考察對概念的基本理解,為什么考察對概念的實現原理。
比如 索引是什么? 索引是如何實現的?
引導-橫向發問-深入發問
引導性,比如 “你對 java 同步工具熟悉嗎?” 作個試探,得到肯定答復后,可以進一步問: “你熟悉哪些同步工具類?” 了解候選者的廣度;
獲取候選者的回答后,可以進一步問:“ 談談 ConcurrentHashMap 或 AQS 的實現原理?”
一個人在多大程度上把技術原理能講得清晰,包括思路和細節,說明他對技術的掌握能力有多強。
跳躍式/交叉式發問
- 比如,講到哈希高效查找,可以談談哈希一致性算法 。 兩者既有關聯又有很多不同點。也是一種技術廣度的考察方法。
總結性發問
- 比如,你在做 XXX 中,獲得了哪些可以分享的經驗? 考察候選人的歸納總結能力。
實戰與理論結合
-
比如,候選人敘述 JVM 內存模型布局之后,可以接着問:有哪些原因可能會導致 OOM , 有哪些預防措施? 你是否遇到過內存泄露的問題? 如何排查和解決這類問題?
-
比如,候選人有談到 SQL 優化和索引優化,那就正好談談索引的實現原理,如何建立最佳索引?
-
比如,候選人有談到事務,那就正好談談事務實現原理,隔離級別,快照實現等;
熟悉與不熟悉結合
針對候選人簡歷上寫的熟悉的部分,和沒有寫出的都問下。比如候選人簡歷上寫着:熟悉 JVM 內存模型, 那我就考察下內存管理相關(熟悉部分),再考察下 Java 並發工具類(不確定是否熟悉部分)。
死知識與活知識結合
比如,查找算法有哪些?順序查找、二分查找、哈希查找。這些大家通常能說出來,也是“死知識”。
這些查找算法各適用於什么場景?在你工作中,有哪些場景用到了哪些查找算法?為什么? 這些是“活知識”。
學習或工作中遇到的
有時,在學習和工作中遇到的問題,也可以作為面試題。
比如,最近在學習《操作系統導論》並發部分,有一章節是如何使數據結構成為線程安全的。這里就有一些可以提問的地方:如何實現一個鎖?如何實現一個線程安全的計數器?如何實現一個線程安全的鏈表?如何實現一個線程安全的 Map ?如何提升並發的性能?
工作中遇到的問題,也可以抽象提煉出來,作為技術基礎面試題。
技術棧適配度發問
如果候選人(簡歷上所寫的)使用的某些技術與本公司的技術棧比較契合,則可以針對這些技術點進行深入提問,考察候選人在這些技術點的掌握程度。如果掌握程度比較好,則技術適配度相對更高一些。
當然,這一點並不能作為篩掉那些沒有使用該技術棧的候選人的依據。比如本公司使用 Mongodb 和 MySQL, 而一個候選人沒有用過 Mongodb, 但使用過 MySQL, Redis, ES, HBase 等多種存儲系統,那么適配度並不比僅使用過 MySQL 和 Mongodb 的候選人遜色,因為他所涉及的技術廣度更大,可以推斷出他有足夠能力掌握 Mongodb。
創造有個性的面試題庫
每個技術面試官都會有一個面試題庫。持續積累面試題庫,日常中突然想到的問題,就隨手記錄下來。
解決問題能力考察
僅僅只是技術基礎還不夠,通常最好結合實際業務,針對他項目里的業務,抽象出技術問題進行考察。
解決思路重在層層遞進。這一點對於面試官的要求也比較高,兼具良好的傾聽能力、技術深度和業務經驗。首先要仔細傾聽候選人的闡述,找到適當的技術切入點,然后進行發問。如果進不去,那就容易考察失敗。
設計問題
-
比如多個機器間共享大量業務對象,這些業務對象之間有些聯合字段是重復的,如何去重?
-
如果瞬時有大量請求涌入,如何保證服務器的穩定性?
項目經歷
項目經歷考察不宜超過兩個。因為要深入考察一個項目的詳情,所占用的時間還是比較大的。
一般來說,會讓候選人挑選一個他或她覺得最有收獲的/最有挑戰的/印象最深刻的/自己覺得特有意思的項目。然后圍繞這個項目進行發問。通常是從項目背景出發,考察項目的技術棧、項目模塊及交互的整體理解、項目中遇到的有挑戰性的技術問題及解決方案、排查和解決問題、代碼可維護性問題、工程質量保障等。
面試過程
預先准備
面試官也需要做一些准備。比如熟悉候選者的技能優勢、工作經歷等,做一個面試設計。
在面試將要開始時,做好面試准備。此外,面試官也需要對公司的一些基本情況有所了解,尤其是公司所使用技術棧、業務全景及方向、工作內容、晉升制度等,這一點技術型候選人問得比較多。
面試啟動
一般以候選人自我介紹啟動,不過候選人往往會談得比較散,因此,我會直接提問:談談你有哪些優勢以及自己覺得可以改進的地方?
然后以一個相對簡單的基礎題作為技術提問的開始:你熟悉哪些查找算法?大多數人是能答上順序查找、二分查找、哈希查找的。
問題設計
提前閱讀候選人簡歷,從簡歷中篩選出關鍵詞,根據這些關鍵詞進行有針對性地問題設計。
比如候選人簡歷里提到 MVVM ,可以問 MVVM 與 MVC 的區別; 提到了觀察者模式,可以談談觀察者模式,順便問問他還熟悉哪些設計模式。
寬松氛圍
即使問的問題比較多比較難,也要注意保持寬松氛圍。
在面試前,根據候選人基本信息適當調侃一下,比如一位候選人叫汪奎,那我就說:之前我們團隊有位叫袁奎,我們都喊他奎爺。
在面試過程中,適當提示,或者給出少量自己的看法,也能緩解候選人的緊張情緒。
學會傾聽
多問少說,讓候選者多表現。根據候選者的回答適當地引導或遞進或橫向移動。
引導候選人表現他最優勢的一面,讓他或她感覺好一些:畢竟一場面試雙方都付出了時間和精力,不應該是面試官 Diss 候選人的場合,而應該讓彼此有更好的交流。很大可能,你也能從候選人那里學到不少東西。
面試這件事,只不過雙方的角色和立場有所不同,但並不代表面試官的水平就一定高於候選人。
記錄重點
認真客觀地記錄候選人的回答,盡可能避免任何主觀評價,亦不作任何加工(比如自己給總結一下,總結能力也是候選人的一個特質)。
多練習
模擬面試?
作出判斷
面試過程是一種鋪墊,關鍵的是作出判斷。
作出判斷最容易陷入誤區的是:貪深求全。總希望候選人技術又深入又全面。實際上,這是一種奢望。如果候選人的技術能力又深入又全面,很可能也會面臨兩種情況:1. 候選人有更好的選擇; 2. 候選人在其它方面可能存在不足,比如團隊協作方面。
一個比較合適的尺度是:1. 他或她的技術水平能否勝任當前工作; 2. 他或她的技術水平與同組團隊成員水平如何; 3. 他或她的技術水平是否與年限相對匹配,是否有潛力勝任更復雜的任務。
不同年齡看重的東西不一樣
對於三年以下的工程師,應當更看重其技術基礎,因為這代表着他的未來潛能;同時也考察下他在實際開發中的體現,比如團隊協作、業務經驗、抗壓能力、主動學習的熱情和能力等。
對於三年以上的工程師,應當更看重其業務經驗、解決問題能力,看看他或她是如何分析具體問題,在業務范疇內考察其技術基礎的深度和廣度。
如何判斷一個候選人的真實技術水平及是否適合所需,這方面,我也在學習中。
給候選人的話
為什么候選人需要關注技術基礎
一個常見的疑惑是:開發業務系統的大多數時候,基本不涉及數據結構與算法的設計與實現,為什么要考察 HashMap 的實現原理?為什么要學好數據結構與算法、操作系統、網絡通信這些基礎課程?
現在我可以給出一個答案了:
-
正如上面所述,絕大多數的業務問題,實際上最終都會映射到基礎技術問題上:數據結構與算法的實現、內存管理、並發控制、網絡通信等;這些是理解現代互聯網大規模程序以及解決程序疑難問題的基石,—— 除非能祝福自己永遠都不會遇到疑難問題,永遠都只滿足於編寫 CRUD;
-
這些技術基礎正是程序世界里最有趣最激動人心的地方。如果對這些不感興趣,就很難在這個領域里深入進去,不如及早轉行從事其它職業,非技術的世界一直都很精彩廣闊(有時我也想多出去走走,不想局限於技術世界);
-
技術基礎是程序員的內功,而具體技術則是招式。徒有招式而內功不深,遇到高手(優秀同行從業者的競爭及疑難雜症)容易不堪一擊;
-
具備扎實的專業技術基礎,能達到的上限更高,未來更有可能勝任復雜的技術問題求解,或者在同樣的問題上能夠做到更好的方案;
-
人們喜歡跟與自己相似的人合作,牛人傾向於與牛人合作能得到更好的效果;如果一個團隊大部分人技術基礎比較好,那么進來一個技術基礎比較薄弱的人,協作成本會變高;如果你想和牛人一起合作拿到更好的結果,那就要讓自己至少在技術基礎上能夠與牛人搭配的上;
-
在 CRUD 的基礎上拓展其它才能也不失為一種好的選擇,但這不會是一個真正的程序員的姿態,頂多是有技術基礎的產品經理、項目經理、HR、運營、客滿等其它崗位人才。這是職業選擇的問題,已經超出了考察程序員的范疇。
不要在意某個問題回答不上來
如果面試官問你很多問題,而有些沒有回答上來,不要在意。面試官很可能只是在測試你的技術深度和廣度,然后判斷你是否達到某個水位線。
重點是:有些問題你答得很有深度,也體現了你的深度思考能力。
這一點是我當了技術面試官才領會到的。當然,並不是每位技術面試官都是這么想的,但我覺得這應該是個更合適的方式。
參考資料: