如何熟悉一個(gè)新項(xiàng)目
目錄
- 一. 必要條件
- 二. 從頁(yè)面到數(shù)據(jù)庫(kù)的線
- 三. 了解項(xiàng)目間的關(guān)系
- 四. 整理數(shù)據(jù)庫(kù)表
- 五. 整理Controller層接口
- 六. 重新理清項(xiàng)目間的關(guān)系
很多新人進(jìn)入一家新公司后,最頭疼的就是如何快速了解公司的業(yè)務(wù)和項(xiàng)目架構(gòu)。或者說(shuō)不要求快速,給你足夠的時(shí)間,也很難在龐大的業(yè)務(wù)中整理出思緒。當(dāng)然,如果你碰到一個(gè)特別熱心的老員工,事無(wú)巨細(xì)地給你講,隨時(shí)在你身邊答疑解惑,那可能還好。但很可惜,我沒(méi)有碰到這樣的人,在加入新公司后,帶我的人幾乎沒(méi)有花時(shí)間給我講項(xiàng)目,也沒(méi)有給我安排一些可以熟悉項(xiàng)目的需求。就這樣的一個(gè)多月時(shí)間里,我慢慢開(kāi)始靠自己的力量熟悉大概十個(gè)項(xiàng)目,并在過(guò)程中總結(jié)了一些方法,借此機(jī)會(huì)記錄一下,并分享給大家。
這里強(qiáng)調(diào)一點(diǎn),我的策略并不是快速了解一個(gè)項(xiàng)目的具體業(yè)務(wù),這個(gè)不同項(xiàng)目也不一樣,無(wú)法總結(jié)。我的策略是大體了解整個(gè)業(yè)務(wù)線上的所有項(xiàng)目,大概摸清楚每個(gè)項(xiàng)目都是干嘛的,他們之間的關(guān)系如何,以便以后不論具體負(fù)責(zé)任何項(xiàng)目不至于找不到方向,具體到細(xì)節(jié)的業(yè)務(wù),雖然需要花時(shí)間,但相比對(duì)整體上的一頭霧水,還是簡(jiǎn)單許多的。
一. 必要條件
我們首先要想的是,有了哪些必要條件后,只要給你足夠的時(shí)間,你總是能夠完全了解整個(gè)項(xiàng)目的?這里說(shuō)的必要條件不是“項(xiàng)目面對(duì)的客戶是誰(shuí)”,“項(xiàng)目用的框架是什么”這種,而是真真正正的必要條件,就好比用幾條數(shù)學(xué)公理能推出整個(gè)數(shù)學(xué)體系一樣。這里我總結(jié)的真正的必要條件只有這兩點(diǎn):
源碼位置(gitlab或svn),部署環(huán)境(dev/test/online)
所謂項(xiàng)目,其實(shí)就是一堆代碼放在了一堆機(jī)器上而已,所以這些就足夠了。當(dāng)然,為了更加節(jié)約時(shí)間,最好還要到wiki、jenkins、頁(yè)面訪問(wèn)路徑、數(shù)據(jù)庫(kù)地址,我之所以說(shuō)那兩個(gè)必要條件,是想說(shuō)其實(shí)項(xiàng)目本質(zhì)上就是這么簡(jiǎn)單的一個(gè)事,你千萬(wàn)不要想的太復(fù)雜。它的業(yè)務(wù)可以無(wú)限復(fù)雜,但它的本質(zhì)卻逃不出這些,你千萬(wàn)不可以糊涂。當(dāng)你無(wú)從下手或者什么都不清楚的時(shí)候,那么就主要把源碼和環(huán)境弄清楚吧,其它的都是附屬品。
二. 從頁(yè)面到數(shù)據(jù)庫(kù)的線
有了上面的必要條件后,我們就開(kāi)始了解項(xiàng)目了。由于不只是一個(gè)項(xiàng)目,所以千萬(wàn)不能深入具體代碼,否則你就越來(lái)越煩直到放棄,也不會(huì)有好的效果。對(duì)某個(gè)具體項(xiàng)目的了解,一定要建立在對(duì)整體了解的基礎(chǔ)上。這時(shí)我們首先為各個(gè)項(xiàng)目畫(huà)出一條線,并標(biāo)明每一個(gè)節(jié)點(diǎn)的信息,就像下面的樣子:
頁(yè)面訪問(wèn)路徑--前端項(xiàng)目--后臺(tái)服務(wù)--數(shù)據(jù)庫(kù)地址
這里的一個(gè)前端項(xiàng)目可能對(duì)應(yīng)多個(gè)后臺(tái)服務(wù),所以最終的圖應(yīng)該差不多是這樣:
這個(gè)整理的過(guò)程,主要是讓自己梳理清楚,一共有哪些項(xiàng)目,哪些是前端可視的,哪些是后臺(tái)提供服務(wù)的。并且,大致了解到了前端項(xiàng)目分別調(diào)用了哪些后臺(tái)服務(wù),通過(guò)后臺(tái)服務(wù)和數(shù)據(jù)庫(kù)的名稱(chēng),我們能從本質(zhì)上了解到這條業(yè)務(wù)線提供了什么功能,從前端項(xiàng)目和頁(yè)面路徑,我們能了解到我們需要給用戶展示什么。注意,這個(gè)階段我們只是見(jiàn)名知意,即使點(diǎn)開(kāi)頁(yè)面,連接上數(shù)據(jù)庫(kù)看看,也千萬(wàn)別花過(guò)多的時(shí)間,這個(gè)階段的重點(diǎn)就是僅僅知道,這條業(yè)務(wù)線提的整體內(nèi)容。
在此基礎(chǔ)之上,這個(gè)圖可以不斷細(xì)化,比如項(xiàng)目部署的機(jī)器,我們可以標(biāo)注在項(xiàng)目旁邊,或者保存在xshell里。此外所有非業(yè)務(wù)相關(guān)的,能查到的盡量都記錄下來(lái),這個(gè)真的為以后找各種東西方便太多了,否則別看你現(xiàn)在節(jié)約了時(shí)間,把以后查找相關(guān)東西的時(shí)間加起來(lái),將會(huì)是天文數(shù)字了。
這里關(guān)于整理項(xiàng)目部署的機(jī)器還有個(gè)小插曲,跟大家分享一下。由于這部分的信息沒(méi)人會(huì)一個(gè)一個(gè)地告訴你,就算有也不可能說(shuō)的特別全。所以我是借助jenkins來(lái)整理的。項(xiàng)目部署都需要用到j(luò)enkins,只要查看jenkins配置的命令,就可以把部署環(huán)境一一整理出來(lái),這個(gè)我認(rèn)為是最全而且最新的。不要和我說(shuō)查wiki,如果公司wiki都寫(xiě)的這么全,我估計(jì)就沒(méi)這篇文章什么事了。當(dāng)時(shí)我的jenkins權(quán)限特別少,只能看一部分項(xiàng)目,而且還只能執(zhí)行,不能看配置,帶我的人也是摳門(mén),每次問(wèn)他都給我開(kāi)通所需要的項(xiàng)目的執(zhí)行權(quán)限,多一點(diǎn)都不給。后來(lái)我也懶得問(wèn)了,由于jenkins機(jī)器大家都可以用root權(quán)限登陸,所以我進(jìn)入jenkins的配置文件config.xml,給我自己添加了一個(gè)admin權(quán)限,重啟jenkins,再打開(kāi)之后屏幕滿滿的項(xiàng)目都出來(lái)了,而且都可以查看和修改,暢通無(wú)阻。我就這樣通過(guò)一個(gè)個(gè)jenkins的配置,整理了部署的機(jī)器,也看了下啟動(dòng)的邏輯。
三. 了解項(xiàng)目間的關(guān)系
這部分如果有老員工愿意和你說(shuō)說(shuō),那最好還是了解一下。如果沒(méi)有也沒(méi)關(guān)系,先跳過(guò)這段,以后慢慢了解也是可以的。
四. 整理數(shù)據(jù)庫(kù)表
我們上面都是整理項(xiàng)目的大體框架,還沒(méi)有涉及到具體的項(xiàng)目細(xì)節(jié)。這一部分,仍然不去涉及。如果說(shuō)站在整個(gè)業(yè)務(wù)的本質(zhì)上看,業(yè)務(wù)無(wú)非就是一堆代碼運(yùn)行在一堆機(jī)器上。那么站在單個(gè)項(xiàng)目來(lái)看,一個(gè)項(xiàng)目無(wú)非就是對(duì)數(shù)據(jù)庫(kù)的增刪改查操作而已,或者從使用者的角度看,一個(gè)項(xiàng)目就是輸入一些參數(shù)得到一些返回結(jié)果。所以接下來(lái)我們要做兩件事,一個(gè)是整理數(shù)據(jù)庫(kù)表,一個(gè)是整理Controller層的所有接口。
這里首先要選擇一個(gè)核心項(xiàng)目去看,眾多項(xiàng)目中一定有一個(gè)是核心項(xiàng)目,先從這個(gè)開(kāi)始看起。
如果數(shù)據(jù)庫(kù)的表比較少,那我們拿工具導(dǎo)出來(lái)表結(jié)構(gòu),一個(gè)個(gè)看就行了,這個(gè)不難。但如果數(shù)據(jù)庫(kù)表特別多,我們首先要將表名全部導(dǎo)出,篩選出那些核心的表。這里導(dǎo)出表名、篩選表以及后面的分析表字段,不妨給自己做個(gè)工具,我在遇到一些很麻煩的或者感覺(jué)以后還可以通用的事情時(shí),就會(huì)做成一個(gè)小工具,放在一個(gè)我給自己起名為javamate的程序中,這些小工具逐漸積累起來(lái)你會(huì)發(fā)現(xiàn)今后有意想不到的方便。話說(shuō)回來(lái),如何判斷哪些是核心表呢,不要著急,我們首先排除掉一些沒(méi)用的。拿我在公司分析的系統(tǒng)來(lái)說(shuō),一共150多個(gè)表,其中有好多copy結(jié)尾的是備份,flow結(jié)尾的是流水,rel結(jié)尾的是中間關(guān)聯(lián)表,statistics結(jié)尾的是數(shù)據(jù)統(tǒng)計(jì)表,log結(jié)尾的是日志表,config結(jié)尾的是配置表。等等。排除掉這些對(duì)核心業(yè)務(wù)理解無(wú)影響的表之后,所剩的也就20來(lái)張表,再根據(jù)他們的名字,可以看出好多表是屬于一類(lèi)的,比如order表就有各種order,按類(lèi)別再分出來(lái)也就四五類(lèi),再分析起來(lái)就不難了。當(dāng)然如果是更大的體系結(jié)構(gòu),那就要再不斷做拆解。
再具體分析這些核心表字段之前,還要做一件事就是找出表中間的關(guān)系。如果表b中有個(gè)字段叫比如a.id,那么b和a就是一對(duì)多的關(guān)系,如果兩個(gè)表有rel中間表,那二者就是多對(duì)多的關(guān)系,起碼從邏輯上講是這樣的。這個(gè)分析過(guò)程我也是做了個(gè)小工具,通過(guò)程序來(lái)判斷的。
到此,你就對(duì)整體的數(shù)據(jù)庫(kù)結(jié)構(gòu)有所了解了。根據(jù)表名也能對(duì)表的大致內(nèi)容有所了解,接下來(lái)就是針對(duì)具體的表,看里面具體的字段和前人給出的備注,這個(gè)過(guò)程就沒(méi)有技巧了,要耐心,要慢慢熬。
五. 整理Controller層接口
當(dāng)你對(duì)數(shù)據(jù)庫(kù)表做了以上到了解后,你基本上對(duì)這個(gè)系統(tǒng)能提供什么服務(wù)了解到差不多了。這個(gè)不論你的代碼長(zhǎng)什么樣子,數(shù)據(jù)庫(kù)擺在那里,其實(shí)能提供的服務(wù)就已經(jīng)差不多出來(lái)了,對(duì)于有經(jīng)驗(yàn)的人來(lái)講,代碼的業(yè)務(wù)邏輯也大致能猜到個(gè)八九分。我們梳理了大后方,那接下來(lái)就是把最前端和別人交互的部分搞清楚,這樣掐頭去尾,整個(gè)項(xiàng)目就解剖的差不多了。
這里我也給自己做了個(gè)小工具,掃描出所有的controller層的接口,展示出方法名,路徑名,參數(shù)列表和返回值等,但可惜沒(méi)能展示注釋?zhuān)写笊窨梢詭臀蚁胂搿:蛿?shù)據(jù)庫(kù)一樣,如果接口很少那么一個(gè)個(gè)看,如果特別多,還是先找出比較核心的幾個(gè)方法研究。這里我用的是postman,把要研究的接口訪問(wèn)保存起來(lái),并且添加訪問(wèn)成功和失敗的Example。這里我推薦自己開(kāi)發(fā)的時(shí)候也把postman用起來(lái),越詳細(xì)越好,postman不只是可以簡(jiǎn)簡(jiǎn)單單訪問(wèn)你的接口,還能做批量測(cè)試,還可以生成api文檔用于和前端交互。這樣你不但測(cè)試了自己的接口,還省的寫(xiě)文檔了。而且postman還有個(gè)好處就是可以給自己的接口mock一個(gè)服務(wù),這樣即使你的接口掛了,或者你的接口根本就沒(méi)寫(xiě)好,你可以讓前端人員先訪問(wèn)你的mock,完全不影響前端邊測(cè)試邊開(kāi)發(fā),這才是真正的前后端分離嘛。
六. 重新理清項(xiàng)目間的關(guān)系
好了,這時(shí)候每個(gè)項(xiàng)目你已經(jīng)大致了解,最起碼調(diào)用的效果,數(shù)據(jù)庫(kù)所能提供的服務(wù),你是清楚的。這個(gè)時(shí)候,要重新整理下項(xiàng)目之間的關(guān)系。
- 根據(jù)之前的接口名稱(chēng),詳細(xì)了解下項(xiàng)目間的調(diào)用關(guān)系。理不清的部分去問(wèn)老員工,這時(shí)候你帶著自己的了解問(wèn),他們也能給出更多的信息。
- 看看每個(gè)項(xiàng)目中用到的中間件,主要是mq服務(wù),看看誰(shuí)是生產(chǎn)者,誰(shuí)是消費(fèi)者,以此來(lái)了解關(guān)系
- 這時(shí)你應(yīng)該已經(jīng)開(kāi)了好幾輪的周會(huì)了,接下來(lái)的周會(huì)你應(yīng)該能聽(tīng)懂部分內(nèi)容。根據(jù)每個(gè)人的描述和最新的幾組需求,逐漸摸清楚現(xiàn)在項(xiàng)目面臨的問(wèn)題,以及哪個(gè)項(xiàng)目是核心,哪個(gè)項(xiàng)目是輔助,哪個(gè)項(xiàng)目是以穩(wěn)定安全為主的
到此為止,整條業(yè)務(wù)線你就有了大致的了解,接下來(lái)就要結(jié)合你具體負(fù)責(zé)的內(nèi)容,領(lǐng)導(dǎo)安排你做的方向,去看具體的業(yè)務(wù)代碼了。深入其中,事無(wú)巨細(xì)地了解。但此時(shí),你通過(guò)前面的努力,你已經(jīng)可以站在一定的高度看每一個(gè)項(xiàng)目了,雖然你細(xì)節(jié)上還是不了解,但這是完全不同的。在研究具體業(yè)務(wù)代碼的同時(shí),不斷地跳出來(lái)看整條業(yè)務(wù)線的框架,修正之前由于不了解具體業(yè)務(wù)而理解錯(cuò)誤的架構(gòu)。長(zhǎng)此以往,你一定會(huì)在某個(gè)項(xiàng)目中脫穎而出,讓大家認(rèn)識(shí)到你的全局視野,這也是走出老是寫(xiě)增刪改查代碼怪圈的一個(gè)途徑。慢慢會(huì)有人意識(shí)到,你對(duì)項(xiàng)目的理解總能站在全局的視野,很多需要跨項(xiàng)目去做的業(yè)務(wù),也會(huì)自然而然想到你,慢慢地,你會(huì)接觸到更為核心的東西,成為架構(gòu)師,或者去轉(zhuǎn)向產(chǎn)品,轉(zhuǎn)向管理。
這就是我總結(jié)的了解項(xiàng)目的過(guò)程,我工作年限不多,經(jīng)驗(yàn)上還不夠豐富,希望大佬們多多留言指點(diǎn),提出問(wèn)題,共同進(jìn)步。