如何面試篩選出動手能力強的Java服務端程序員

最近要招一名中高級程序員, 有位同窗的面試表現咱們幾位面試官都以爲不錯: 思惟很活躍, 知識面也還挺廣, 尤爲是主動說起最近還在研究Disruptor這個高性能框架, 並說出了基本實現原理, 表現出喜歡鑽研技術的態度. 惟一的缺點就是邏輯思惟不太縝密, 工做經驗只有3年多. 但咱們都以爲稍加培養他就能快速上手工做, 因而就把他招了過來. 畢竟目前我手頭的項目,都是業務驅動型的互聯網系統--業務不太複雜, 技術難度也不算過高. mysql

誰知該同窗在試用期的表現讓咱們大跌眼鏡: 他跟同事溝通沒有任何問題, 能清楚的表達本身的想法, 也能理解簡單的業務需求, 但就是沒法根據簡單的需求作出對應的技術設計, 一樣也不能根據技術設計作出代碼實現, 開發速度比同等級程序員慢幾倍不說, 寫出的代碼也是bug百出. 無奈之下, 只能讓其試用期過完後離職.程序員

以後我開始反思此次招人經歷, 暴露了咱們面試中存在的兩個問題:面試

  1. 缺乏全面考察程序員動手能力筆試過程.sql

  2. 低估了邏輯思惟嚴密的重要性.mongodb

對於程序員來講, 能將需求轉化爲代碼實現的能力和寫出健壯程序的能力偏偏是最基礎的能力. 而咱們面試時, 過多的考察了表達溝通能力和知識廣度深度, 卻缺失了對程序員最基本能力的考量. 結果招來了"眼高手低"的程序員.數據庫

那如何面試才能篩選出實戰能力強的程序員呢? 併發

我以爲除了基本的面試(項目經歷的考察)以外, 還須要設計一些偏實戰性的筆試題來測試程序員的能力. 框架

如下是我爲此設計的筆試題目之一:性能


題目1

現有遺留系統S1, 其關係數據庫D1有一張表Table T1 , T1用戶數據樣例以下:測試

用戶ID 積分 修改日期
1 20 2016-12-23 10:55:33
2 49 2015-09-12 11:11:23
3 60 2016-10-22 23:55:55

S1的主要業務爲查詢,修改和插入用戶數據.

S1在線上運行, 目前T1天天大約會插入20萬條數據, T1當前數據總量爲5千萬, 插入速度較慢.

因爲業務發展須要, 須要開發新系統S2, 用來替換遺留系統S1.

S1的用戶數據T1須要所有遷入到S2的數據庫D2中, 並添加新的業務字段"用戶等級","狀態".

D2中用戶數據樣例以下:

用戶ID 用戶等級 積分 修改日期 狀態
1 1 20 2016-12-23 10:55:33 1
2 1 49 2015-09-12 11:11:23 0
3 2 60 2016-10-22 23:55:55 1

其中"用戶等級","狀態"可經過如下邏輯肯定:

用戶等級1: 積分<50

用戶等級2: 積分<100

用戶等級3: 積分>=100

狀態1: 修改日期 >= 2016-10-00 00:00:00

狀態0: 修改日期 < 2016-10-00 00:00:00

問題1: 爲了應對數據的增加速度, 減小業務響應時間, 請設計新系統S2的數據庫D2, 並給出具體實現過程.

問題2: 假設S2已開發測試完畢, 請結合電商系統的日流量分佈狀況, 給出系統S2上線替換系統S1的方案, 列出詳細實施步驟.

問題3: 假設S2的數據庫D2爲Mysql, D2採用針對問題1調整後的表結構保存用戶數據. 請寫出遷移程序, 保證在1個小時之內完成數據的遷移(全部用戶字段都須要填充完).


這個筆試題比較偏實戰性, 給定了一個特定的場景, 和須要解決的3個問題.

問題雖然簡單, 但依然能暴露出很多面試者在思惟和動手能力上的問題, 好比:

對問題1來講, 有些人能提出mysql分表, 但沒法給出分表實施細節. 有人能給出mongodb自動分片方案, 但不瞭解如何實施自動分片.
對問題2來講, 很多人沒有考慮到遷移時的數據完整性問題.
對問題3來講, 這是須要手寫代碼的問題, 不少動手能力差的程序員都沒能寫好併發處理的線程調度邏輯, 一樣經驗欠缺和邏輯思惟不嚴密的程序員不少都沒意識到mysql分頁大偏移量帶來的性能問題.

那如何評判答案呢?

  1. 若是面試者不能給出基本的解決方案, 直接pass.

  2. 若是面試者能給出基本解決方案, 但須要在面試官的指導下才能意識到本身方案的不足. 對於5年以上的程序員直接pass. 對於5年如下程序員, 若是他能在指導下給出方案的改進措施, 並能寫出步驟, 則能夠酌情考慮.

  3. 若是面試者能給出基本解決方案, 能主動發現方案中的不足, 指出須要改進的點, 並能寫出改進措施的詳細步驟. 說明該程序員的邏輯思惟和動手能力都很是不錯. 是很好的備選人員.

  4. 若是面試者能直接給出優化後的方案, 甚至給出不止一種解決方案, 同時能將細節用筆寫出來. 則說明他是一名很是有經驗和動手能力較強的程序員, 是不錯的人選.

總之, 對於中高級程序員職位的面試, 用於衡量動手能力的筆試環節還是不可或缺的一個環節.

相關文章
相關標籤/搜索