Java面试时,该如何准备亮点?
我說個觀點,對于在校生,也對于想通過社招跳槽的朋友,準備java項目的亮點不能光靠做業務,一定得通過事先定制、植入項目業務、準備說辭和準備相關問題等方式準備亮點。
先說下可能被大多數求職者寫入簡歷并在面試時當亮點準備,但其實不是亮點的要素。
1 做了很多的業務模塊。其實這些都是屬于增刪改查的操作,可能業務細節有差別,但從框架層面來上看,其實差別不大。業務開發多了,頂多是熟練初級開發和新手初級開發的差別。
2 同時做了前端和后端,或者前端界面很好看,或者在前端引入了多種效果和框架。其實java主要是負責后端,講具體點就負責從(控制器層)收到請求開始處理的一系列動作。如果求職者有前端開發經驗,這是個加分項,但面試官一定不會因為前端做好但后端不熟而錄用這位求職者,相反哪怕求職者只熟悉后端開發,前端一點不懂,這也照樣有機會應聘成功。
3 實現了一些較為復雜的功能,比如對日期進行特殊處理的能力,或者能實現很復雜的業務邏輯。上文也說了,能處理較為復雜的業務,依然屬于開發項目的能力,有這項技能,頂多能證明求職者屬于熟練的初級開發。
況且,上述要點在面試中還未必能很好地展示,比如你說你前端界面做的好看,你不大可能當場演示吧,比如你說你做的業務模塊數量多,功能復雜,在面試時也未必能很好地說明,但如下給出的亮點,一方面難度不高,對初級開發也適用,另一方面準備起來也不難,面試前只要方法得當,只要花費少量時間就能達到能侃侃而談的地步。
亮點1,我熟悉項目開發、測試和部署等流程。
其實這個亮點是白送的,只要是做過項目,那一定經歷過這個流程,但面試中很少有人能把這當成亮點說。這塊你可以說,在這個項目里,我們是用Maven管理項目,用jenkins部署項目,用git來管理代碼。我在這個項目里,除了寫代碼外,還參與了單元測試和聯調。我們代碼發布時,最終會把java代碼打成jar包并部署到linux服務器上。
說實在,不少面試官也不會認為此項亮點有多值錢,但你這樣會給面試官留下“有項目測試、部署和管理等方面的綜合能力”的印象。而且,我知道有些求職者,尤其是在校應屆生,他們在簡歷上的的項目可能是學習項目,但如果你在項目里加上這個亮點,那么如果面試官不細問,就會認為這是更加值錢的商業項目。
亮點2,我有過數據性能調優方面的經驗。
如果你就說,我用過索引和redis緩存,也有數據庫調優經驗,那么聽起來太空洞,而且面試可能會通過問相關的底層細節來確認。要知道redis和數據庫底層細節太繁瑣,求職者,尤其是初級開發的求職者被問倒的可能性很大,但如果你按如下的方式植入項目后再說,就能最大程度展現該亮點。
1 我們項目在部署后,會對MySQL數據庫進行監控,這塊的監控軟件有CAT、newrelic或Zabbix等,一旦數據庫SQL語句執行時間超過5秒(或其它時間),我們就會收到告警郵件。
對于初級開發來說,你甚至不用說監控的細節,因為這不是初級開發的職責范圍,你就說這套監控是運維或項目經理搭建的。不過總是先得知道哪些SQL需要調優,才能繼續往下說吧,你說出這套說辭,就能讓面試官感覺你的數據庫調優經驗來自項目。
2 你得把分析過程講出來,遇到長SQL以后,我們會用執行計劃(Execute Plan)分析該sql,這里大家可以去了解下執行計劃的知識,比如如何運行,其中包含哪些內容。同時,我們會通過日志,去看當時做了什么業務。
3 經過分析,通過看執行計劃和看日志后,我們知道了原因,原因最常見的是索引,或者是存在多張大表關聯,或者是同類sql太多,對數據庫壓力太大,沒建Redis緩存。
在準備亮點前,需要看下索引和Redis緩存的概念,比如索引的數據結構,哪些情況下該建索引,復合索引是什么,Redis的數據結構是什么?Spring Boot項目是怎么使用Redis緩存的。
但這里,為了增加可信度,你更要結合項目需求說。比如你說,對此我們建了索引,這樣就很籠統,但你如果說,經過看執行計劃后發現,是因為在從訂單明細表里根據用戶名去搜索時,對用戶名字段沒建索引,或者說,在下訂單的過程中,需要根據用戶ID多次到風控表里去查數據,這塊沒用緩存,所以導致性能慢。?這樣結合業務說,就一定能在潛移默化過程中,向面試官灌輸“你調優經驗來自項目”的事實。
4 同時再講下怎么解決的,有始有終。解決方法無非是建索引、建復合索引或引入緩存。
5 你在說好上述整套說辭后,面試官可能會問一些細節,比如索引和Redis的概念等,這塊你一定得需要刷八股文來準備。這塊如果你心有余力的話,甚至可以準備些值錢技能,比如Redis緩存穿透、Redis緩存的超時時間,或者是Redis持久化技能,或者你還可以再準備,通過Redis集群或MyCAT分庫分表組件來提升數據庫性能。
其實面試官對性能慢的原因以及解決方法不怎么關注,更關注一整套分析和解決數據庫性能問題的步驟和思路。而且上述說辭和準備要點所涉及到的技能初級開發都能準備到位。而且,哪怕簡歷上的項目是學習項目,或者來自培訓班(當然應當盡量讓面試官確信是商業項目),照樣可以套上上述數據庫調優方面的說辭。
亮點3,我有過JVM調優方面的經驗。
這里就直接展開說明了。
1 還是先說監控,我們項目在部署后,會對JVM內存進行監控,CAT、newrelic或Zabbix等同樣能監控JVM內存,一旦內存用量超過80%,且持續時間超過5分鐘,我們就會收到告警郵件。
這里額外說下,為了確保項目的高可用,一般代碼是會被部署到多個linux服務器上,比如把spring boot項目打成jar包,再通過jenkins,或干脆手動復制,部署到多個linux服務器上。每臺部署項目的服務器,都會部署這套監控系統。
2 再說排查流程。收到告警郵件后,我們會看該服務器的dump文件,其中能看到當時的內存對象,同時會看業務日志,看當時是什么業務導致了內存用量大增。
這里大家可以去看下dump文件的結構,同時可以操作下通過jmat工具打開dump文件的步驟,因為你一旦說了,面試官可能會細問。
3 再結合業務說原因,比如可以說,在導入客戶數據的過程中,我們是會從多個文件里讀取數據再導入,在導入后,沒有關閉IO對象,所以導致內存用量大增。
同樣能導致內存用量大增的原因還有,用好HashMap等沒有不關掉,或者是緩存Redis數據時沒設置超時時間,這就導致緩存對象一直占內存。如果大家要說其它原因,最好也得結合業務說。
4 再說下怎么解決,無非是關掉文件或對象。不過這里,請大家同時要準備下Java虛擬機結構、垃圾回收流程和垃圾回收算法等細節,有可能面試官會進一步提問。
亮點4,我有過通過看linux日志分析和解決問題的能力
這個亮點有哪些值錢點呢?大多數初級開發是只會在windows上做業務,不知道項目是部署在linux服務器上,而且缺乏linux的操作經驗。這個亮點所涉及的linux技能比較簡單,初級開發也能說,但你一旦說出這個亮點,就不僅能進一步證明該項目是商業項目,而且還能說明你有linux開發經驗,更不要說你還具有分析和排查問題的能力了。這方面的亮點該怎么說呢?老規矩結合項目說。
1 先說下問題的表現形式。你可以說,在一些下訂單的流程中,經常會出現500服務器錯誤。
2 再說怎么排查。發現問題后,你登錄到linux服務器上,用vi命令打開日志文件,再用根據錯誤關鍵字和時間,搜索找到上下文,再根據該日志的線程ID去看在該日志文件的其它 日志,如果涉及到其它業務模塊,可以用traceID去找。
3 再說下問題原因和怎么解決。原因你怎么說都行,比如價格參數不符規范,或請求類型應該是POST但發GET,往深了說可以說是因高并發導致的問題。怎么解決就一句話的事情,比如發現問題后,我們加了異常處理機制。
4 同時再去看下項目里通過logback輸出日志的方式,和linux打開文件搜索關鍵字等命令,以便面試官細問。
亮點5,我有過通過看底層源碼排查問題的能力
對于初級開發,可以說個簡單點的,比如在庫存盤點的業務流程里,我們是要通過迭代器遍歷ArrayList類型的庫存信息。在遍歷時,我們同時做了修改,所以就導致了“快速失效”的問題。
快速失效的底層源碼不難,網上一搜一大堆,而且解決方法也簡單,就別邊遍歷邊修改了。
關于底層源碼,哪怕是初級開發也可以準備ConcurrentHashMap的,因為其中不僅包含了紅黑樹等數據結構,還包含了transient和violate等關鍵字,還包含了線程同步等細節,而且底層源碼不難,網上資料很多。
當然面試中可以準備的亮點不止這些,還可以有分布式組件和集群等,不過上文提到的亮點,哪怕是零基礎的,準備起來也不難。再啰嗦下,準備時需要注意如下的要點。
1 別單寫在簡歷上,更要按上文給出的思路準備說辭,面試時一定會被問。
2 我知道,哪怕是不少正規項目,也未必能有上述亮點的實踐機會,更別提學習項目了。所以在準備時,一方面需要掌握技能,另一方面更得結合項目需求和業務說。
3 得按監控、發現、排查和解決的流程說,同時更要準備相關細節,比如數據庫調優方面需要準備Redis和索引等八股文。當然,準備亮點的同時,八股文和算法這類功夫不能少。
4 有時候面試官會質疑,或者細問,比如會問,這么簡單的問題為什么你們之前的測試沒發現?你或者可以說是在測試環境上發現這個問題的,或者就干脆咬定,是在生產環境上發現。至于為什么之前沒測出來,你就說你不知道,畢竟你才是一個初級開發。
或者會問,你說了通過jenkins部署,說了通過new relic監控,你說下細節。或者問些比較深的問題。這些事情其實是資深開發或架構做的,你一個初級開發能知道就不錯了,你可以干脆說,這些是我們架構或項目經理做的,面試官聽了也就不會再問了。
5?更重要的是,你得會引導。比如你在面試中介紹項目時,你說,在這個項目里,我有過數據庫性能調優的經驗,有過排查內存性能的經驗,有通過看linux日志解決線上問題的經驗,有通過看底層源碼解決實際問題的經驗。這樣面試官就會繼續問了,你就能借機說出來。
或者你可以在回答到相關問題后再提一句,比如你回答到JPA等數據庫問題后,你就說,我除了會用JPA連數據,還解決過數據庫性能調優方面的問題,然后面試官問了就再展開。
通過上文給出的步驟,大家能發現其實Java項目的亮點不是來自業務,而是來自技術,而且你有亮點的實踐經驗不會說,這也沒用。
但如果你按上文給出的步驟,把這些亮點寫入簡歷,面試前好好準備,面試時全面拋出。這時哪怕你是零項目經驗的,面試官也能認為第一你的項目是商業項目,第二你有資深的項目開發經驗,這就達到了你準備和拋出亮點的目的了。
總結
以上是生活随笔為你收集整理的Java面试时,该如何准备亮点?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: string中c_str()、data(
- 下一篇: sizeof(数组名)和sizeof(指