工具與資源中心
幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源
developer.aliyun.com/tool?spm=a1z3...
關於筆試題的選擇,有很多種方式。無論怎麼選擇,一定要問自己:這個題是否可以把候選人的動手能力體現一二?是否和本崗位的實際研發技能需求貼近?
我瞭解到,有的面試官經常從公共題庫選題,有的面試官從個人題庫選題,有的面試官從網上選題,有的面試官長你只用同一道題。無論哪裡的題,其實核心是:具體延伸、深挖的考察點,這樣可以通過互動提問過程,或者說程式碼review 互動過程,評估出候選人的動手、思考、交流等軟硬體能力
1. 需求理解
有的筆試題,非常抽象,然後給一個簡單例子。有的筆試題,非常具體,考察的點非常明確。例如案例1: 有N個佇列,每個佇列有M個數字,求所有佇列都出現的數字。例如案例2,求A 和B 字串的共同出現的最長子串。
一些候選人,上來就開始寫程式碼。這不是最佳的“姿勢“。應該先進行需求對齊,需要主動向面試官提問。例如案例1,佇列的數字是否有序,佇列的數字是否重複,佇列的數字型別是否統一等。例如案例2,是直接使用lib,還是自己實現,對時間複雜度有什麼要求。
加分點:主動需求溝通、需求對其。這個反應的是工作中,是否“習慣性“對需求發起對齊、確認的”意識“
2. 最佳和最快
有的候選人敲程式碼前很糾結,這個題是最快、最笨的方法實現,還是弄一個最佳的、需要仔細設計的實現?例如案例1,直接暴力的 for、hash等實現,還是排序佇列求交實現?
推薦:先已自己最擅長的方式,或者說最笨的方式,快速實現一個版本。然後在與面試官,講解程式碼過程中,提出其他的實現方案,需要“講“清楚關鍵資料結構、關機處理邏輯。
3. Code Review
這部分最為關鍵,盡是細節點。也正是這些“細節”點,反應候選人在寫程式碼過程中的點滴思考和過往經驗的“折射”。
一般的考察點如下
1. 可讀性、可運維性
體現的點:(1)函式、方法、引數的命名(2)主線邏輯、區域性實現邏輯的 “組合“編排 (3)For 迴圈的深度、If else的 簡化、Case switch的簡化 (4)基本的註釋說明 (5)程式異常了,如何排查定位問題
提問:
- 命名有什麼好的經驗和選擇
- 函式的行數一般多長比較合適,為什麼
- 新增新的邏輯,在這段程式碼哪裡改,成本最小
- If else 是否可以精簡
- for 迴圈是否可以 提前退出
- for、do while、while 有什麼區別,使用的注意事項是什麼
- 註釋怎麼寫比較好?為什麼。例如中文註釋有什麼不足點?
- 有沒有GVM 調參的經驗
- 程式異常崩潰了,如何排查,一般使用哪些工具排查
- 平時程式碼部署的伺服器有多少臺,有沒有遇到部署過程中的異常問題,如何排查和解決
- 業務是否出問題怎麼識別、怎麼定位、怎麼解決
。。。
2. 健壯性、基本質量
體現的點:(1)入引數的校驗(2)邊界條件的處理(3)迴圈的退出條件 (4)IO資源的關閉(5)日誌的輸出 (6)單側的用例覆蓋
提問:
- 當前的實現,支援哪些場景、不支援哪些場景的輸入
- 邊界條件是什麼,為什麼這麼處理
- 迴圈是否有提前退出的可能,是什麼時候
- IO資源關閉,是否存在極端情況的洩漏
- Sytem.out 和 log 輸出的差別是什麼?什麼時候使用system、log
- 程式碼質量的保障措施有哪些?
- 常見的測試方法有哪些,你平時使用那種方法,有什麼優點、不足
- 如果執行過程中,突然斷電了會有什麼問題發生
- 如何改造,可以在伺服器異常下,業務不受影響
- 大型專案,很多同學同時研發,如何保障整體的質量
- Map、HashMap、List、ArrayList、Filter等基礎資料結構原理和實現
。。。
3. 複用性、移植性
體現的點:(1)邏輯處理的場景鑑容性 (2)方法抽象定義的內聚、功能單一性 (3)無狀態化,減少全域性變數的依賴 (4)簡單資料結構
提問:
- 具體程式碼考慮的場景是否充分,例如還其他的輸入的影響?
- 結合這個筆試題,用物件導向的概念分析、介紹下?
- 伺服器異常,快速從另外一個伺服器拉起應用,當前實現是否可行,有什麼需要改造的
- 複雜均衡怎麼實現
- 限流降級怎麼實現
- 切面是否有幫助
- 配置中心是否有幫助,為什麼
- 是否可以跑在雲端,如何改造
- 做為公共Tool 類,還需要做哪些改造
- 你覺得企業內部程式碼是否應該全員開放,為什麼
- Java、GO、C++、Python等語言的差異是什麼,你喜歡哪種語言,為什麼
。。。
3. 複雜度優化
體現的點:(1)演算法本身的複雜度 (2)分散式實現方案 (3)其他的組合演算法實現
提問:
- for迴圈可否去掉,為什麼
- 是否有分散式的實現方案
- 是否可以多演算法組合進行優化,怎麼做
- 如何控制軟體的複雜度?
- 重構是怎麼理解的,什麼時候需要重構?重構需要避免哪些坑
- 架構設計有什麼作用,架構設計和複雜度優化是否有關係,如何通過架構設計降低複雜度
- 複用第三方jar 和自己實現,有什麼異同,需要注意什麼
。。。
4. 效能優化
體現的點:(1)記憶體優化 (2)IO優化 (3)網路優化 (4)多執行緒優化(5)分散式版本實現 (6)GC友好優化 (7)Cache 優化 (8)任務拆分
提問:
- 輸入引數非常大,記憶體裝不下,怎麼優化
- 頻繁的記憶體、磁碟交換,有什麼問題,如何優化
- 多執行緒原理,本題多執行緒是否可以實現,如何實現
- 單機並行、分散式並行實現的方案是什麼
- 當前演算法實現,是否可以直接分散式部署使用,需要怎麼改造,可以實現分散式版本
- 當前程式碼實現,哪些地方可以優化,可以對GC回收友好
- Java GC的原理、常用回收演算法
- 其他效能優化,例如cache引入
- 平時瞭解和使用的cache 演算法有哪些,優缺點是什麼
- 大型專案,研發如何分工合作
- 當前的實現方法是否可以進一拆解?
- 大任務和小任務,例如大sql 和多個小sql 並行執行,那個更好,為什麼?
- 同步和非同步的區別是什麼
- 訊息引入進來,是否有幫助,為什麼
- 使用mysql 為何不使用nosql
- 使用其他儲存是否有幫助,例如es 為什麼有幫助?
。。。
本作品採用《CC 協議》,轉載必須註明作者和本文連結