Java筆試題怎麼做

hjavn 發表於 2021-08-20
Java 筆試

工具與資源中心

幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源
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)程式異常了,如何排查定位問題

提問:

  1. 命名有什麼好的經驗和選擇
  2. 函式的行數一般多長比較合適,為什麼
  3. 新增新的邏輯,在這段程式碼哪裡改,成本最小
  4. If else 是否可以精簡
  5. for 迴圈是否可以 提前退出
  6. for、do while、while 有什麼區別,使用的注意事項是什麼
  7. 註釋怎麼寫比較好?為什麼。例如中文註釋有什麼不足點?
  8. 有沒有GVM 調參的經驗
  9. 程式異常崩潰了,如何排查,一般使用哪些工具排查
  10. 平時程式碼部署的伺服器有多少臺,有沒有遇到部署過程中的異常問題,如何排查和解決
  11. 業務是否出問題怎麼識別、怎麼定位、怎麼解決

。。。

2. 健壯性、基本質量

體現的點:(1)入引數的校驗(2)邊界條件的處理(3)迴圈的退出條件 (4)IO資源的關閉(5)日誌的輸出 (6)單側的用例覆蓋

提問:

  1. 當前的實現,支援哪些場景、不支援哪些場景的輸入
  2. 邊界條件是什麼,為什麼這麼處理
  3. 迴圈是否有提前退出的可能,是什麼時候
  4. IO資源關閉,是否存在極端情況的洩漏
  5. Sytem.out 和 log 輸出的差別是什麼?什麼時候使用system、log
  6. 程式碼質量的保障措施有哪些?
  7. 常見的測試方法有哪些,你平時使用那種方法,有什麼優點、不足
  8. 如果執行過程中,突然斷電了會有什麼問題發生
  9. 如何改造,可以在伺服器異常下,業務不受影響
  10. 大型專案,很多同學同時研發,如何保障整體的質量
  11. Map、HashMap、List、ArrayList、Filter等基礎資料結構原理和實現

。。。

3. 複用性、移植性

體現的點:(1)邏輯處理的場景鑑容性 (2)方法抽象定義的內聚、功能單一性 (3)無狀態化,減少全域性變數的依賴 (4)簡單資料結構

提問:

  1. 具體程式碼考慮的場景是否充分,例如還其他的輸入的影響?
  2. 結合這個筆試題,用物件導向的概念分析、介紹下?
  3. 伺服器異常,快速從另外一個伺服器拉起應用,當前實現是否可行,有什麼需要改造的
  4. 複雜均衡怎麼實現
  5. 限流降級怎麼實現
  6. 切面是否有幫助
  7. 配置中心是否有幫助,為什麼
  8. 是否可以跑在雲端,如何改造
  9. 做為公共Tool 類,還需要做哪些改造
  10. 你覺得企業內部程式碼是否應該全員開放,為什麼
  11. Java、GO、C++、Python等語言的差異是什麼,你喜歡哪種語言,為什麼

。。。

3. 複雜度優化

體現的點:(1)演算法本身的複雜度 (2)分散式實現方案 (3)其他的組合演算法實現

提問:

  1. for迴圈可否去掉,為什麼
  2. 是否有分散式的實現方案
  3. 是否可以多演算法組合進行優化,怎麼做
  4. 如何控制軟體的複雜度?
  5. 重構是怎麼理解的,什麼時候需要重構?重構需要避免哪些坑
  6. 架構設計有什麼作用,架構設計和複雜度優化是否有關係,如何通過架構設計降低複雜度
  7. 複用第三方jar 和自己實現,有什麼異同,需要注意什麼

。。。

4. 效能優化

體現的點:(1)記憶體優化 (2)IO優化 (3)網路優化 (4)多執行緒優化(5)分散式版本實現 (6)GC友好優化 (7)Cache 優化 (8)任務拆分

提問:

  1. 輸入引數非常大,記憶體裝不下,怎麼優化
  2. 頻繁的記憶體、磁碟交換,有什麼問題,如何優化
  3. 多執行緒原理,本題多執行緒是否可以實現,如何實現
  4. 單機並行、分散式並行實現的方案是什麼
  5. 當前演算法實現,是否可以直接分散式部署使用,需要怎麼改造,可以實現分散式版本
  6. 當前程式碼實現,哪些地方可以優化,可以對GC回收友好
  7. Java GC的原理、常用回收演算法
  8. 其他效能優化,例如cache引入
  9. 平時瞭解和使用的cache 演算法有哪些,優缺點是什麼
  10. 大型專案,研發如何分工合作
  11. 當前的實現方法是否可以進一拆解?
  12. 大任務和小任務,例如大sql 和多個小sql 並行執行,那個更好,為什麼?
  13. 同步和非同步的區別是什麼
  14. 訊息引入進來,是否有幫助,為什麼
  15. 使用mysql 為何不使用nosql
  16. 使用其他儲存是否有幫助,例如es 為什麼有幫助?

。。。

本作品採用《CC 協議》,轉載必須註明作者和本文連結