說說真實Java專案的開發流程,以及面試前的專案准備說辭

2022-12-12 15:00:25

    介紹專案是必不可少的Java面試環節,求職者需要藉此證明自己真實Java專案的經驗,如果再做的好的話,需要藉此展開自己的亮點說辭。

    不過之前如果只有學習專案經驗,比如是自己跑通一個專案,或者是在培訓班裡通過一個Spring Boot專案入門Java,那麼這些學習專案的開發流程其實和公司裡真實Java專案,是有一定差距的。在轉行之類需要真實專案的場景裡,如果僅僅介紹學習專案裡的開發流程和開發細節,那麼真可能被認定之前缺乏商業專案經驗。

    由於商業專案是用於掙錢的,而且商業專案正是因為要從客戶那邊收錢,所以其在確定需求,開發,測試,部署和問題排查等方面,和學習專案存在很大的差異。下文就將詳細講述真實java專案的開發流程,並針對性地說明學習專案和商業專案的差異,這樣一些零專案經驗想入行或轉行的Java求職者,一定能從中獲得收益。

1 先說說真實專案的敏捷開發流程和常用的專案管理工具。

    學習專案一般是從零跑通一個專案,只要能從前端發請求看到預期的效果,這個專案就算成了,但真實的專案一般會採用敏捷開發模式,哪怕是有些公司的田園敏捷開發模式,一般也是採用「迭代」開發的流程。

    比如一個專案從開始做,到真實完成,假設需要半年,包含大概50個功能點,那麼就會把這些功能點,均攤到6個開發週期,每個週期大概是一個月,這樣每個月釋出一次,把本月需要完成的功能點和本月修改掉的bug一起釋出上線。具體的,比如一個月有4周,會在第一週的前半周,和產品方或客戶方談好需求,一般這是專案經理主導做的,談好以後分配任務給諸多程式設計師,分配任務時一般用jira來記錄,當然如果發現bug了,也會用jira來記錄bug。

    開發前,一般會基於git的主分支(master或dev或current)上建立一個新分支,比如202210dev分支,諸多程式設計師在這個分支上開發,然後約定個開發結束時間,這樣到了這個月的第三週結束後,這個開發分支上就包含了本次釋出所需要的的程式碼,然後這個釋出版本就會凍結住,凍結的意思是,釋出的版本需要穩定,不能隨便再向裡面提交併合併程式碼,在此基礎上測試人員就開始測試。

    一旦測試人員測出問題,專案經理會做個評估,如果不影響本次釋出,就會在下個週期裡修改掉,如果影響很大,那麼需要走「解封」流程,解開本次已經凍結住的git分支,修改後再凍結住。

    這樣到了本次迭代週期的釋出日,一般是業務量比較少的時間點,比如週末凌晨,運維人員會把從git上拉下待發布的分支,用maven或各種工具打成jar包,然後通過jenkins工具,或乾脆手動複製貼上,放到linux環境上,再用java -jar命令啟動,啟動後開發和測試人員發現沒問題後,本次釋出就算成功,然後再開始下個為期一個月的開發週期,這樣一直到本專案全部完成。

    所以求職者如果要證明自己的專案是真實專案,可以從如下若干個角度來準備說辭。

    1 我們專案是用敏捷開發模式,然後大致敘述下開發週期,同時加一句,我們專案組,會每天開會討論進度,如果有阻塞性的問題,或者技術問題,得趕緊提出來。

    2 我們專案組用到了git和maven來管理程式碼和依賴包,同時看些git拉分支,合併程式碼和處理衝突的細節,也可以看下用maven打包以及建立公司私有倉庫的做法。

    3 我們專案是用jira來管理任務和bug,真實專案一般都用jira,所以哪怕是零基礎的,jira未必要搭建,未必要實踐,但需要了解下通過jira建立任務和建立bug的細節。

    4 我接到開發任務後,一定會在開發分支,比如202210dev分支,在此基礎上再建立一個我自己用的任務分支,比如202210dev001,其中001是任務號,在此分支上開發功能點。開發好以後,我會用junit寫單元測試案例,也會用postman發請求,這個屬於程式設計師自己要做的測試,當測試通過後,再提交到202210dev001分支上。

    5 這裡請注意,得說下程式碼review。我在202210dev001分支上的程式碼,得合併到202210dev這個釋出分支,合併前,專案經理會指定其它開發者review我的程式碼,如果有功能或程式碼規範的問題,我會修改掉。測試人員如果發現我做的模組有功能問題後,會給我開個bug,一般也是用jira開,我會修,當然我把修改掉bug後的程式碼合併到釋出分支前,依然需要經過code review這個過程。

    6 我自己做好我的業務模組後,會用junit寫測試案例,如果junit不熟悉可以不說,但一定要說用postman發請求測試。在版本釋出的時候,我會留守在公司,遇到問題我會排查和解決。

所以零專案經驗或通過培訓班轉行的同學,一定得準備上述說辭,這些點面試官如果不問就算了,如果問,就一定能從多個維度證明自己專案的真實性。

2 在商業專案裡,開發者未必是全棧都做,而是隻做後端開發,而且後端開發一定要加入很多細節。

    在學習專案和培訓班專案裡,開發者其實是全包的,從前端react到後端spring boot,再到建資料表,這些工作都要做。但在真實專案中,如果你的職責是後端程式碼,那麼其實是無需關注前端的。

    而且在專案組裡,你其實真未必是從零開始做。比如你入職被分配到一個財務系統裡,這個系統一定是開發到一定程度了, 所以你其實是無需參與表設計的工作,也無需參與搭建前端後端框架的事。你的事情其實就是用spring boot開發業務,在上文的基礎上,你還可以用如下的說辭證明你做的是商業專案,而不是學習專案。

    1 我只負責用後端開發,即用spring boot開發控制器,service和repo層,我這個介面是用@requestmapping來匹配前端請求,前端是html頁面,我熟悉react,但我沒系統做過。

    2 我開發的api需要用swagger來展示介面,swagger其實不難,大家可以看下。在我開發的api裡,要用logback寫紀錄檔,以便排查線上問題。對應的,我每開發好一個介面後,要用junit來寫單元測試案例,這裡強烈建議大家學下junit,這不難,而且瞭解一下其中mock資料的動作。

    3 我們的環境分測試環境和生產環境,其中生產環境就是對外提供服務的,但我們的程式碼開發好以後,會部署到測試環境,測試環境也是linux。一般學習專案甚至只在windows上開發,但真實專案一般分測試和生產兩個環境。

    4 我開發的時候,如果需要其它組提供介面,比如支付系統裡要呼叫對賬模組的api,那麼我會和其它組的人溝通,對應地,對方組開發好以後,會用swagger來展示介面。這裡你可以展示在專案開發中必不可少的溝通技能,相比之下在學習專案,一定沒這個流程。

    出於培訓效果,培訓班專案大多是讓學員全棧開發,但事實上,有專案經驗的開發者,大多是隻從事一個方向的工作,比如java後端。所以如果你是要去找java後端工作,一定得優先證明後端經驗,這樣哪怕前端說不上也不要緊,但相反,如果兩者都會,但後端只能說出學習專案裡的一些低層次的技術,那麼面試真就可能過不了。

3 在真實專案裡,一定會遇到線上問題,你可以說下監控和排查分析線上問題的細節。

    真實專案上線後,對應的伺服器大概率會有監控元件,比如zabbix。如果遇到慢SQL查詢,或者是系統部署所在的伺服器,記憶體或cpu用量過高,zabbix會根據之前的設定,向程式設計師通過郵件或訊息之類的方式告警,而且,根據之前的設定,當系統紀錄檔裡,5分鐘內exception或error關鍵字出現頻率超過10個,zabbix也可以告警。

    程式設計師在收到告警資訊後,可以通過vi命令,去觀察linux上的系統紀錄檔,如果再有必要,可以通過執行計劃觀察慢查詢的sql語句,或者通過dump檔案觀察OOM問題,當然如果是業務問題,比如是引數不對,那麼能根據紀錄檔上的告警資訊,定位到具體的類和程式碼行,然後解決。

    相比之下,在學習專案裡,一般紀錄檔只是輸出到控制檯,而不是檔案,當介面做好以後,用postman發請求時,是通過控制檯的紀錄檔排查問題,如果在面試中只表達出這層意思,那麼面試官就能輕易確定你只有學習專案經驗。

    對應的,面試中或面試前,Java或其它IT求職者可以怎麼準備呢?

    1 準備些輸出紀錄檔的方式,比如java專案裡是用logback,然後看下怎麼用logback輸出info,warn或debug級別的紀錄檔,這些不難,零專案經驗的小白也能輕易看懂。

    2 就準備些linux上用vi或tail命令觀察紀錄檔檔案的方式,如果有條件,去看下索引等方面的細節,如果再有條件,去看些解決redis或kafka等中介軟體問題的細節。

    3 面試時可以說,我們專案上線後是用zabbix監控,監控設定的事情是運維或專案經理做的,但一旦有系統問題,比如慢sql查詢,或者紀錄檔裡大量出現exception,我會收到告警郵件,手機上也能提示。出了問題後,我登到linux,用vi命令觀察異常紀錄檔,然後解決過業務引數問題,也解決過索引等問題。

    4 然後再準備些細節,比如索引問題的八股文,或者是vi命令開啟搜尋檔案的方式,甚至redis快取穿透和kafka訊息積累問題的細節,找些資料也能看也能說。當然你說你知道zabbix等元件等設定方式,那就更好了。

    其實上述細節要準備的點不多,零專案經驗哪怕是用個一週也能看熟相關技術,但是否解決過實際問題,絕對是學習專案和商業專案的重要差別。

4 可以說下專案編譯打包部署乃至上線之類的話,因為學習專案一定不包含這些。

    比如Java專案,一般是用jenkins或pipelines,以流水線的方式完成打包部署上線之類的或,相關技能大家可以看下CI/CD,不過對於零基礎的求職者來說,要看熟這塊所需要的代價比較大,可能真得用2周甚至更長時間,這似乎有些不值當,所以在面試前倒可以用如下的方式來準備。

    1 就熟悉下上文提到的git,maven等工具,以及git的提交,合併,處理衝突等方式。

    2 大致瞭解下jenkins工具,看看jenkins長什麼樣,能幹什麼,然後就說jenkins是專案經理設定的,程式碼提交到開發分支或master或dev等主分支後,jenkins指令碼能自動從git分支上拉程式碼,然後用maven或gradle等命令把專案打成jar或war包,然後再做必要的程式碼掃描,比如用sonar,sonar工具會看程式碼單元測試覆蓋率,以及程式碼是否有方法過長等不規範,sonar這塊如果不想講也不要緊。然後jenkins會把jar或war包複製貼上到指定的linux路徑裡,然後再啟動,這樣就實現了自動化打包部署的事情了。

    3 上線之前,你們組會把你們本次上線要用的設定引數,比如決定某個功能是否要執行的引數告訴運維,會把增加欄位和增加索引的sql語句告訴運維或dba,當然這些細節你們已經在測試環境上測過。上線時,運維會在全域性組態檔上加入你們新加的內容,再具體些可以說在nacos全域性設定上加,會在生產資料庫上加加入你們的更改。這裡如果你面的是比較低階的崗位 ,不要說那麼細,就說上線前會提交本次上線的設定和資料庫變更檔案。

    4 系統上線後,你作為值班人員,會跑若干個指令碼來測試,或者乾脆到生產環境的html頁面或app上測試,如果沒問題最好,如果有問題,趕緊看紀錄檔查,如果自己搞不定就找同事或專案經理。不過上線時遇到問題不多,你說沒遇到過,你參與過的上線都很順利,問題也不大。

    相比之下,如果是培訓班專案,頂多實踐過在linux上打包部署,但培訓班專案沒有上線這個過程,如果是自學專案,估計都在windows上跑,上述說辭估計都沒聽說過。所以如果你準備過上述說辭,哪怕有些點你推說細節說不清,那麼大概率能證明你的商業專案經驗。

    5 再說下分散式元件和spring cloud alibaba元件方面,真實專案和學習專案的差異。

    分散式元件,比如redis或kafka,或者spring cloud alibaba系列的nacos或gateway,這塊由於能解決高並行分散式層面的問題,所以非常值錢,這也是架構師面試的必問點,但很多培訓班專案或自學專案,僅僅是為了使用而用,所以會不切合場景地使用,這反而會暴露求職者「其實沒做過真實專案」的底細,這還比如不說。

    這塊,零專案經驗的求職者不用學太深,瞭解下api和組態檔即可,因為很多3年以下專案經驗的java開發,也就會用個api,這方面應當結合業務需求來說。

    1 比如redis或kaifa,很多培訓班會說在低並行下用,這塊如果要說,一定要找個業務落腳點,比如某支付系統,並行量要到2000,支付過程中會頻繁呼叫會員名字,所以要用redis,因為支付後要簡訊通知,所以要用kafka,或者如果要說用過nacos之類的,你就說系統是分散式部署,所以要用。但如果你沒準備過業務場景,寧可別說用過元件,或者沒必要把相關元件都準備全,準備若個個就行。

    2 你就去看些api,比如redis是用redisTemplate快取和讀取資料,kafka也有相應的讀取和傳送方法,這些api你記著一些。面試時就結合業務結合api來說。

    這裡千萬記住,如果你單純去背redis等元件的八股文,面試時說專案沒用過,如果你面的是java初級,那問題也不大,畢竟java初級做熟spring boot等框架就行。如果你能結合業務場景和api說你專案你用過,這是零專案經驗求職者能做到的最好程度。

    但有些有經驗的面試官,就從應用場景來問,比如你說用過sentinel來限流,面試官就問你是否有限流的需求,你們業務流量多少,從這個角度,一定會問出專案是學習專案。所以分散式或微服務元件這塊,雖然值錢,但零專案經驗的求職者由於沒在專案裡開發過,這塊別貪,因為過度了反而會露餡。

6 再說下零專案經驗求職者java技術層面的上限。

    上文也提到了,零專案經驗求職者在分散式元件層面的上限,下面再說說在java技術方面其他層面的上限,即過了這個線,你再學的技術,由於無法證明在專案裡用過,所以頂多只能證明你看過了解過,與其把精力大量用在這方面,還不如熟悉下上文提到的證明專案真實性等說辭。

    1 spring boot框架層面,看熟增刪改查,logback,swagger等元件可以看,但別看對應的原始碼。

    2 資料庫層面,頂多看些單機版外帶redis的技能,比如索引,事務,執行計劃,單機版redis,這塊可以落實到專案裡,但redis叢集或mysql叢集,你可以說你是用專案經理搭建的,但你自己沒搭建過,再進一步,比如資料庫底層或資料庫或快取叢集,別看。

    3 docker容器部署和k8s,別看。

    4 上文已經提到,分散式元件或微服務元件,量力而行,重要的是要結合業務講。

    5 linux層面,看到能通過vi或tail命令開啟和搜尋紀錄檔檔案這個層面就行,像shell指令碼可以別看,比shell更復雜的 ,也別看。

    6 前端,大致瞭解下vue或react框架或關鍵步驟即可,不用深入看。

    7 多說一下,spring boot業務,通過若干個增刪改查流程,看熟從控制器到service再到repo運算元據庫的流程和關鍵程式碼即可,看熟悉以後,再多跑業務就屬於重複勞動,沒意義。

    不過事實上,有些培訓班為了突出自己專案技術的優勢,會講docker等值錢技術,還是這句話,零專案經驗求職者在找工作時,以說清楚專案經驗為主,像docker之類的技術,本身確實值錢,但零專案經驗的求職者由於無法結合專案證明自己用過,所以過度學沒太大意思。

7 總結

    初級java求職者,其實不是單純靠技術找到工作,找工作時更要證明自己的專案經驗。有些求職者由於不知道真實專案長什麼樣,所以在準備面試時會無的放矢,甚至會在無意識的過程中暴露自己零專案經驗的事實。

    所以本人站在準備java面試的角度,向大家講述真實專案的各種細節,從中大家能知道闡述專案真實性的方式,這樣一定能幫助零專案經驗的求職者更好地過面試。