1. 程式人生 > >如何在面試中介紹自己的專案經驗(面向java改進版)

如何在面試中介紹自己的專案經驗(面向java改進版)

    本人於3年前寫的博文,如何在面試中介紹自己的專案經驗,經過大家的捧場,陸續得到了將近7萬個點選量,也得到了眾多網站公眾號的轉載,不過自己感覺,這篇文章更多的是偏重於方法,沒有具體給到Java方面相關的說辭。

    三年過去了,隨著本人面試官經驗的積累,也隨著技術的進步,本人就用適合當下2021年Java初級開發的面試場景,改寫本文。請注意,這篇文章並不是簡單的技術升級,也沒有機械地教大家在介紹專案經驗時背誦若干說辭,而是教大家如何結合專案經驗更好地展示自己的技術亮點,這樣就能最大程度地提升面試通過的可能性。

1  用簡歷爭取到更多的面試機會

    本不想寫這段,但最近我在幫一些同學準備簡歷時,發現他們雖然在當前公司裡能勝任Java開發的工作,但憑簡歷恐怕無法得到面試機會,或者無法得到和自己相匹配的工資。而且準備簡歷的過程,也是準備專案說辭的過程,所以這裡就一併把寫簡歷的注意要點寫上。

    注意點1:閱讀職位介紹上的技能要求年限,在簡歷上的醒目位置標明你有足量的相關技術專案經驗。

    比如某職位需要有Spring boot 3年經驗,又如某職位需要有2年大資料開發經驗,而你恰好有了,就在簡歷第一頁個人資訊介紹下直接寫明。

    萬一假設你缺乏一些,比如要求是有2年大資料,而你就只有一年,你就回想下,你在讀書階段,有沒有在外面做過兼職,有沒有幫老師一起做過專案,有的話別客氣,把這部分的技術年限也加上。

    注意點2:再仔細閱讀職位介紹上要求的技術,也列在第一頁的醒目位置。

    比如某職位需要有jave核心開發,多執行緒開發經驗,分散式元件開發經驗。其實對做開發的人來說,這些技術多少在專案裡也用過,但如果你不寫上,甚至你的簡歷沒法過篩選,甚至你沒有面試機會。 

    注意點3:再多少寫些你的亮點,怎麼寫看下面的範例。

    也就是說,在簡歷第一頁,你寫好姓名性別年齡和手機郵箱等基本資訊後,一般可以用如下概要的形式,向面試官展示你和職位的匹配度,如下是範例。

    1 具有3年Java開發經驗,2年Spring Boot開發經驗,2年資料庫開發經驗。(這裡的年限需要大於等於職位介紹上的要求,如果達不到,很多公司就不給面試機會)

    如下再根據職位介紹上要求的技術,總綱性列出你掌握的技術,以此證明你很匹配

    2 有Oracle,MySQL等資料庫開發經驗。

    3 有多執行緒,集合等方面的開發經驗

    4 有大資料方面的xx技術和xx技術的開發經驗。

    這裡你可以儘可能多地列出你掌握的JD上的技能,然後,你可以照著如下的範例列些你的亮點。

    5 具有用索引,執行計劃進行資料庫調優的經驗。(當前不會就自己查,這塊資料太多)

    6 熟悉Java JVM虛擬機器結構,熟悉垃圾回收流程,有JVM效能調優的經驗。(當前不會也自己查)

    7 有在linux分析日誌和排查問題的經驗。(如果不會就去看些linux檔案開啟和搜尋的相關命令)

    8 熟悉面向物件思想,在專案裡用過設計模式。(自己去看個單例或工廠模式,然後套到專案需求裡)

    9 有分散式元件的開發經驗。(如果沒有就別寫,但對初級開發來說,這絕對是加分項)

    10 熟悉Java集合等方面的底層程式碼。(自己去看HashMap,ConcurrrentHashMap,快速失效,ArrayList增刪改查的底層程式碼,不難)

    11 工作責任心強,具有一定的承壓能力,肯加班。(寫上去總不會錯)

    其實對大多數初級開發而言,應該都具備上述技能,哪怕當下不具備,用個把月絕對也能學會,所以大家完全可以寫在簡歷上。

    但我收到的很多Java開發的簡歷,只是簡單地列出會的技術,沒有任何潤色性的文字,這樣的簡歷或許就無法完全地展示候選人的能力,對應地,得到的面試機會可能就大大降低了。

    相反,姑且先不論候選人是培訓班出身還是科班出身,但就憑在簡歷第一頁醒目地展示和該職位的匹配度,至少面試官就肯繼續往下看專案經驗了,這樣得到面試的機會,乃至通過面試的機會,就大大增加了。

2  自我介紹時,立即全面丟擲技術棧和亮點

    在面試的開始階段,面試官大概率會讓候選人自我介紹,這部分別的不用說,就直接根據上文給出的簡歷上列出的總綱性要點介紹自己,如下給出範例說辭。

    先說技能和jd的匹配度。

    我叫張三,今年25歲,18年從交大大學畢業,計算機系,目前有3年Java開發經驗(這個是jd上的要求),有Oracle,MySQL的開發經驗,有xx等技術經驗(這些經驗也是jd上的要求)

    再說自己的亮點。

    在專案裡,我用過用索引和執行計劃等進行資料庫調優經驗,有JVM方面排查OOM的經驗,大資料方面,用過Spark等框架,分散式元件方面,用過Redis和Dubbo等,有在linux上看日誌然後排查線上問題的經驗。

    其實天地良心,上述提到的亮點,除了大資料spark以外,其它技能亮點初級開發應該都會,哪怕不會也能輕易學會。但就這樣,很多候選人不會說,不過反過來,你說了就比別人強。然後立即引申出最近的專案,因為大多數公司會衡量jd技術是否在最近專案裡用過。

    在最近的專案裡,我用到了Spring Boot框架,具體用到了JPA元件,資料庫用Oracle,最近的專案是xx系統,用到了敏捷開發模式,在這個專案裡,我除了做coding外,還做過單元測試,討論需求和詳細設計等工作,並且最近的專案進度比較緊,我自己感覺還能主動加班,一起和同事們保質保量地完成專案。

    在自我介紹階段甚至也不必展開專案,因為後面你有機會詳細說明,但你第一要以此進一步突出你最近的技能經驗和職位介紹很匹配,第二還要以此說明你肯加班等特性(畢竟通過專案舉例說明自己肯加班,比單純說肯加班要可信得多)。

     再強調下,在自我介紹階段,只需要說明自己能勝任當前工作的要點,這些要點不需要展開,比如不必展開說明自己如何排查OOM異常的。而其它沒和找工作沒關係的,比如興趣愛好,家庭成員,個人性格等一概不需要說。

    大家在面試前,可以根據上述範例練習下說辭,不緊不慢地說這些話,估計也就需要2分鐘,哪怕再靦腆再內向口才再不好的人,多練幾遍也能說好,但如果因為沒說好被面試官認為溝通能力差,就太冤枉了。

3  先介紹專案背景,打消面試官疑問

    由於你在自我介紹階段已經涉及到最近專案了,所以面試官一定就會再問下去。不過不管怎麼樣,面試官總會問及你最近的專案,所以你總是有機會通過介紹專案經驗來驗證自己能勝任這份工作。

    當面試官讓你介紹下最近的專案時,你可以先大致先說下專案背景。因為有些候選人在簡歷上的專案經驗看上去就像學習專案(其實我知道不少專案經驗還真是),但你可以通過如下的說辭,證明這個專案是商業專案經驗。

    我最近是在xx公司(以此突出商業專案)裡做了xx專案,這個專案的客戶方是xx,已經上線(但如果是web專案面試官大概率會去核對)。這個專案用到了敏捷開發模式(提一下別展開,算丟擲個提問點), 這個專案組人員是xx人,做了n個月,我在裡面做了xx和xx模組。 

    你這樣一說,能通過專案所在公司和客戶方等要素,說明這個專案不是你編的。有人會問了,如果專案真的是編的,該怎麼說?這塊我不管,你自己想辦法說。

    但你這樣說之前,事先需要做好如下的功課。

    1 瞭解敏捷開發模式,比如站會每個人該說什麼,用jira管理進度,一年定好若干個釋出日期,一個月釋出一次等,因為你提到了,面試官大概率後繼會問到。

    2 如果你說的是xx財務系統xx圖書館系統等,一些資深的面試官可能會問,這塊有現成的專案,為什麼你們公司還要自己開發?所以說你在準備專案描述時,不能誇張,比如把一個數據收集模組的維護專案誇張成xx財務系統。不過我也遇到過一些候選人,他們就說這是公司接的專案,為什麼人家還要下訂單做此專案他們管不著。

    3 你一旦說了這個專案,那麼面試官就會認為你真實做過,所以其中每個業務需求,比如資料從哪裡收集,客戶從哪個前端發請求,客戶請求處理的流程,以及資料表的規模等資訊,你得知道並且事先準備好回答預案,我就經常用此來確認候選人的專案是真實專案還是編的專案。 

4 通過說專案管理工具,說明你不僅會寫程式碼

     在介紹專案背景之後,你更可以說些專案管理的工具,以此證明你在專案裡還做過其它事情,不僅是僅會寫程式碼,具體的說辭範例如下。

    在這個專案裡,我們用到了maven,用git來管理程式碼,用jira來管理任務和bug,用jenkins工具來發布。我還用過junit編寫過單元測試,我們還用sonar來統計程式碼的測試覆蓋度,我們專案經理要求,只有當“行覆蓋率高於80%”,程式碼才能提交。

    上文提到maven,Git和junit這塊不難,jira管理bug和task這個也沒什麼可問,但你要事先了解下sonar管理程式碼質量的基礎知識以及行覆蓋率等要點,至於jenkins釋出指令碼,這個無需一般開發操心,你說下就行了。在上文裡你僅僅提到的是工具,但你更要通過這些工具,來進行自我表揚。

    我在使用junit時,不會敷衍地編寫案例,而會根據真實的業務資料來編寫案例,並且我還會著重考慮各種邊界情況(這些哪怕初級開發也有本事做到),而且在編寫程式碼時,我會非常注意編碼規範,比如定義變數時會讓人一看就理解 ,在關鍵程式碼地方多寫註釋,在if等條件裡不會寫太複雜,一個方法不會寫太長,或者你可以再說些其它好的編碼規範。而且,一旦遇到我的bug,我會第一時間跟進,並會和相關對應的人一起解決掉。

    上述文字,雖然說是自賣自誇,但由於你結合到了專案,所以面試官不會有違和感。而且你這樣一說,面試官就會認為你除了寫程式碼外,其它開發專案的綜合能力也很強。

    不過千萬注意,介紹專案經驗的目的主要是證明技能的匹配度,所以上文提到的“介紹專案背景”和“說明專案用到的工具”以及“自賣自誇”的說辭,你別說太多,可以通過練習把它們控制在1分鐘以內。

5  用Spring Boot專案舉例,說明你的技術基本面

    然後就需要介紹專案裡用到的技術,哪怕你的亮點說辭再說,你也得保證技術的基本面說辭,這裡就用當前Java專案的主流框架Spring Boot為例,告訴大家如何以此展示Java開發的基本功。

    我們這個專案用到了Spring Boot框架,其中用JPA連線Oracle(或MySQL等)資料庫,在控制層裡用到了@RequestMapping註解來編寫業務處理方法。在業務程式碼裡,是用@Autowired註解來以IOC的方式引入類,還用到了@Service和@Component註解。當我們從資料庫裡拿到資料後,會用包含@Entity和@Table註解的模型類來對映資料。在這個專案裡,我們還用到了@Transactional註解來定義事務,這個註解是作用在Service層上的,在這個專案裡,我們還用到多個Java集合類和異常處理類。

    通過上文的範例,大家應該可以很好地展示Spring Boot的基本技術面,其實對大多數Java初級開發而言,日常工作也就是用Spring Boot寫一些增刪改查的工作,所謂根據現有的業務再編寫新的業務,所以上述說辭足夠了。但是由於你提到了Spring Boot,所以在提問階段,面試官大概率會問及如下的問題。

    1 @Service和@Component註解的差別? 

    2 各種Restful請求格式以及各種http請求返回碼。

    3 @Transactional事務裡的事務隔離級別和事務傳播機制概念。

    4 Spring依賴注入概念和@Autowired的用法。

    5  Spring Bean的生命週期。

    6  甚至可能還會問Spring Boot啟動流程以及底層原始碼。

    對Java 0到3年的初級開發而言,其實能按本範例給出的說辭,並結合網上題目說好前4個問題,應該就足以應對大多數的面試了。 

6  用例項說明你在記憶體調優方面的經驗

    當你介紹好基於Spring Boot的技術基本面以後,你還可以進一步說明諸多亮點,這裡就先給出結合專案展示記憶體調優方面說辭的範例。

    (之前是介紹專案技術基本面,比如Spring Boot)在本專案裡,我會非常注意記憶體的使用效能,並在專案裡有過排查分析OOM的專案經驗,我在編碼的時候,也會非常注意記憶體效能,同時我也瞭解過JVM記憶體結構以及GC演算法。

    不管怎麼組織語言,這方面你需要突出四點:第一強調你有記憶體調優意識,第二說明你有排查OOM的經驗,第三說明你寫程式碼的時候也會注意記憶體效能,第四說明你還了解JVM結構和GC流程的知識。但這裡依然要強調,你尚在專案介紹階段,你說明要點即可,別展開,如果這裡你展開說明記憶體調優的做法,面試官會認為你思路不清晰,不過既然你提到了,面試官可能立即就打斷你介紹讓你詳細說明,或者你介紹完專案後會繼續問,總之你是有機會詳細展示記憶體調優亮點技能了。

    這裡不僅給出專案介紹階段怎麼說,還會給出你後繼如何詳細回答。

    如果面試官事後詳細問你排查OOM經驗細節時,你可以這樣回答。

    在測試環境,我們經常會收到記憶體使用率高於70%的告警,(至於怎麼告警的相關設定,你可以看下new relic,如果你是初級開發,甚至不需要掌握相關經驗),收到告警後,我第一通過dump命令觀察當前記憶體映象(你得熟悉下dump命令以及dump檔案的開啟方式和dump檔案的內容),第二通過日誌觀察是哪個方法丟擲的,最後發現是因為在訂單模組(或其它模組)一個JDBC連線物件沒關閉(或一個大的Hashmap物件用好沒clear),所以導致了記憶體無法回收,發現問題後對應回收掉即可。   

    這裡你結合的業務(比如訂單模組)來說明,然後面試官再問dump細節時,你再說下dump檔案的結構,這就行了。

    如果面試官再問你如何在程式碼裡注意記憶體效能,你可以這樣說:

    在寫程式碼時,我會非常注意,在try...catch...finally從句裡關閉或釋放Connection和大的集合,一些大的物件用好以後,我會及時把它們設定成null,以此提升它們的回收時間,在for等迴圈裡,我不會頻繁地操作String物件,因為會產生大量記憶體碎片。同時,我會非常謹慎地使用finalize方法(事先看下),因為這可能會導致物件無法回收。

    其實說上這四點就夠了, 如果你自己感覺有本事,可以在瞭解強引用、弱引用和軟引用的前提下在說如下的點,這很值錢。 

    在資料同步的業務場景裡,我用到了弱引用(或軟引用),以此提升資料物件的回收時間。

    如果面試官問你JVM記憶體結構及GC(垃圾回收)流程,這其實是理論問題,網上資料太多,靠背就行了,所以這裡就不再詳細說了。但話說回來,GC流程以及JVM體系結構這方面的理論知識,這屬於面試常用考點,你準備下不吃虧。 

7  展示你在資料庫調優方面的經驗

    很多候選人其實不會在面試中展示記憶體調優方面的經驗,而你如果按照上述說辭,一方面在介紹專案經驗時引出要點,另一方面在後繼交流中很好地說明細節,那麼可以這樣說,你就超越了很多競爭者,甚至說句不該說的話,一些初級開發甚至還能以此充實自己的專案經驗。

    在介紹專案經驗時,如果單純展示記憶體調優方面的經驗,可能說服力不強,這裡再給出用實際說明資料庫調優技能的範例。首先你可以在介紹專案時,適當地通過如下的說辭來引入要點。

    在本專案裡,我參與過資料表設計,所以會考慮用反正規化來避免因大表關聯而導致的效能損耗,同時我們會合理地設定索引以提升資料庫的訪問效能,並且我還有過用執行計劃優化語句的經驗,同時在使用事務的時候,我會非常注意配置事務隔離級別和事務傳播機制,以免造成鎖表。

    同樣,在專案介紹階段,資料庫調優方面的說辭不需要展開,給出點即可,由於你提到了,所以面試官在後面大概率會問到。

    不過你在面試前,需要準備如下的技能(其實這些技能屬於資料庫基本點,你不準備反而會有問題)。

    1 你去看下索引的資料結構(比如B+樹),建索引的語句,索引的種類,尤其是複合索引以及對應的回表和最左匹配原則。

    2 事先看下索引的正確用法,以及哪些情況下用不到索引,比如where a != 'xx'可能就用不到。
    3 索引的代價(會佔硬碟,以及大批量讀寫時會重建索引,所以效能慢),以及在小表裡,無需建索引。

    4執行計劃的概念,以及通過執行計劃排查慢sql時該注意的點(避免全表掃描,設定合理的關聯表方式等)。

    5 三正規化和反正規化相關概念,因為你提到了。

    6 事務隔離級別裡的髒讀等概念,以及事務傳播機制,尤其地,你要具體說出你專案裡用的是哪個。

    其實上述點屬於面試常考點,但根據我面試下來的結果,一些有3年java開發經驗的候選人也未必能說好,不過再一次天地良心,這些技能點不難學,大多靠背就行,所以哪怕你剛畢業,或者只具備少量的開發經驗,只要靠用功背下這些要點,一方面在介紹專案時就能很好地亮出要點,另一方面還能很好地應付後繼的資料庫問題,這樣你的表現就足以超出大多數你的競爭者。   

8 總結前文說辭

    這裡根據上文給出的要點,整理下介紹專案經驗的說辭。

    (介紹專案背景)我最近的專案是在xx公司做的xx社群愛心超市專案(專案別說太大),客戶方是xx公司,專案組裡是6個人,開發了八個月,最近還在開發,在其中我做了刪除和更新訂單模組的業務 (如果是在校階段做的專案需要再加上如下的話),這個專案是我從大三開始,外面找xx公司做的兼職專案,做專案的時候我每月還能拿到錢。 

    (介紹專案技術,JD上列的儘量說全)這個專案用到了Spring Boot框架,資料庫是Oracle,用JPA連線Oracle(或MySQL等)資料庫,在控制層裡用到了@RequestMapping註解來編寫業務處理方法。在業務程式碼裡,是用@Autowired註解來以IOC的方式引入類,還用到了@Service和@Component註解。當我們從資料庫裡拿到資料後,會用包含@Entity和@Table註解的模型類來對映資料。在這個專案裡,我們還用到了@Transactional註解來定義事務,這個註解是作用在Service層上的,在這個專案裡,我們還用到多個Java集合類和異常處理類。

    (介紹專案管理工具)這個專案用到了敏捷開發模式,用Maven框架,用sonar管理質量,用git管理專案版本,用jenkins釋出,用logback打日誌, 我在這個專案裡,除了寫程式碼外,還有用Junit進行單元測試的經驗。我們還用sonar來統計程式碼的測試覆蓋度,我們專案經理要求,只有當“行覆蓋率高於80%”,程式碼才能提交。

    (最後丟擲亮點)在這個專案裡,我用到了單例和工廠設計模式,在這個專案裡,我做過JVM調優和資料庫調優的的事情,在做專案時為了加深理解,我還看了ArrayList快速失效的底層程式碼,也看過HashMap關於HashCode以及put和get部分的底層原始碼。這個專案後期進度比較緊,我也能通過加班等手段保證專案能正常上線,而且一旦遇到線上問題,我也會盡量參與並解決。

    大家在面試前,可以根據上述範例合理地準備說辭,次序和內容上可以做調整,但包含的幾個要素儘量都說全。如果可以,事先要多練習幾遍,確保能足量地丟擲你的相關技能和亮點。

    不過千萬注意,在介紹專案時,對具體的點,比如記憶體調優,你點到為止,別展開,否則的話,面試官一定會認為裡思路不清晰。總之在介紹專案時,需要遵循的要點是:第一要儘可能全面地說明你用過JD上的技能,第二要丟擲亮點話題,等待面試官提問。

9 準備專案說辭時,更可以準備後繼面試官的問題

    其實大多數面試官在面試前,有可能還在除錯程式碼,或者還在開會,也就是他們事先是不會準備面試問題的。所以當你在自我介紹和介紹專案經驗時丟擲亮點後,他們往往會隨口接著這個話題問下去,也就是說,只要實現準備好,你是知道面試官會問什麼的。

    根據上文給出的專案介紹說辭,你提到了敏捷開發,Spring Boot框架,資料庫調優,記憶體調優,設計模式,junit以及專案管理軟體,java集合以及底層原始碼等話題,在前文裡也給出了一些面試官可能問到的問題以及對應的準備要點,除此之外,大家還可以做如下的準備。

    1 理解單例模式,尤其是雙重檢查的單例模式,要會寫程式碼,並給出一個專案使用場景,比如某工具類需要用單例的方式建立。同樣地,對於工廠模式也準備一個使用場景,這更好辦,比如xml解析器類,是用Factory模式建立的。

    2 在理解的基礎上,背誦並會默寫ArrayList快速失效的底層程式碼,面試時,當面試官順著你給出的言辭繼續提問時,你可以邊寫邊說,同時也可以準備HashMap以及Hashcode的底層原始碼。

    3 去看下JVM記憶體調優和垃圾回收相關理論,最好再看下強引用,弱引用和軟引用理論。

    這裡請注意,你在自我介紹和專案介紹時,可以通過丟擲亮點來引導面試官提問,但同時,你更需要準備其它常見問題,因為有些面試官依然會問其它問題。對此大家可以在Spring Boot框架,資料庫和Java核心開發這三個方面多刷些面試題,甚至可以多準備些筆試題。那麼這樣一說,你丟擲亮點有什麼好處呢?

    第一,真有些面試官在順著你言辭提問後,發現你回答很好(因為你事先準備過,想不好回答都難),然後他們就不再提問了。

    第二,面試官多少會問及些你提到的亮點,這樣你就能最大程度避免面試官問及你不熟悉的點。

    第三,其實大多數初級開發在專案中只是做增刪改查,但一方面你根據上文描述準備了若干常穩點,另一方面你能很好證明你熟悉設計模式,有JVM和資料庫調優經驗,那麼你就有可能在面試中表現比其它人強。

    總之,你在準備專案經驗的前提下準備些基礎和亮點技術點,準不會吃虧。 

10 總結:本文所含的說辭和方法足以應對初級面試官

     本人最近在幫上海一家知名培訓學校的學員做面試輔導,在教他們用上述方法和說辭準備簡歷和準備專案介紹說辭後,他們均成功地找到工作。而且有好幾位同學,有2到3年開發經驗,本來期望工資是11到13k一個月(畢竟是培訓班出身不敢要高)。我全程輔導讓他們通過技術面試後,在談薪資時,我好說歹說讓他們至少要15k, 當他們硬著頭皮咬著牙說出口後,均成功拿到這個價,而且一位膽子比較大的同學,還要到了16.5k。現在他們已經開始擔心入職後怎麼過試用期了,不過這是後話,如果我有時間還會寫文章介紹此類經驗。

    這才是我敢在這篇博文裡介紹相關方法和說辭的底氣。除此之外,我敢寫這篇博文的底氣還在於我的多年技術面試官經驗,以及我還出的兩本面試書。對培訓班畢業生尚且如此,如果大家最近還在軟體公司裡真刀真槍地幹專案,那麼我敢說這篇文章對大家的幫助更大。

    也就是說,通過本文給出的技巧,大家足以能應對一些面試經驗不足2年的初級面試官,當然,如果要去支應一些資深面試官(比如我),光憑此應該還不夠,更需要在面試中展示多執行緒、分散式元件,微服務框架以及高併發等方面的技能,對此本人將在後繼的文章裡繼續給出相關的技巧。

    請大家關注我的公眾號:一起進步,一起掙錢,在本公眾號裡,會有更多精彩文章。

&n