如何在面試中介紹自己的項目經驗(面向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年的初級面試官,當然,如果要去支應一些資深面試官(比如我),光憑此應該還不夠,更需要在面試中展示多線程、分布式組件,微服務框架以及高並發等方面的技能,對此本人將在后繼的文章里繼續給出相關的技巧。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM