新接手一個(gè)業(yè)務(wù)系統(tǒng),我是這么熟悉的
故事
接二連三地背鍋?zhàn)屝∝埖膬?nèi)心受到了前所未有的打擊。這也是他職業(yè)生涯中的第一次。感興趣的伙伴們?nèi)绻肓私庖幌滦∝堅(jiān)趺戳?,可以看一下?a target="_blank" href="http://www.ekrvqnd.cn/article/779524.html">冪等事件”以及“緩存擊穿事件”。
這天組長找小貓來到了一間會(huì)議室。
“在這么短的時(shí)間內(nèi)發(fā)生了這么多的事故,我想也你心里也不好受,也不怪你,畢竟剛接手項(xiàng)目。以前項(xiàng)目中可能本身存在一定問題。正好輪到你頭上,我希望你也不要灰心......”,組長在一邊balabala。
小貓?jiān)谝慌孕‰u啄米似的點(diǎn)著頭。緊張的內(nèi)心緩和了許多,“聽組長這語氣,貌似不扣我績效啊”,小貓心里尋思著。
“但是呢,事情是發(fā)生了,系統(tǒng)中估計(jì)還有其他的問題,無論是業(yè)務(wù)上的還是代碼上的亦或是設(shè)計(jì)上的,我希望你最近可以花時(shí)間整理一下,然后輸出一份項(xiàng)目文檔分析。等到下次月會(huì)的時(shí)候和大家一起分享一下當(dāng)前系統(tǒng)的情況?!?/p>
小貓連連點(diǎn)頭,心里琢磨“這應(yīng)該算是變相抓典型吧,罷了罷了,可是,這樣的一份文檔該怎么寫呢”
此時(shí)小貓的內(nèi)心又開始不安起來。
聊聊熟悉新項(xiàng)目
當(dāng)接手到一個(gè)新的系統(tǒng)的時(shí)候,大家是如何進(jìn)行熟悉的呢?其實(shí)老貓?jiān)谏弦黄?a target="_blank" href="http://www.ekrvqnd.cn/article/779927.html">緩存擊穿事件”的文末就問過大家了,不曉得大家還有印象不?
接下來和大家聊一下老貓對一個(gè)新系統(tǒng)的熟悉過程。如果大家覺得有所幫助歡迎借鑒,當(dāng)然如果大家還有更好的方式,也歡迎留言。主要按照以下方法:
項(xiàng)目熟悉
1.嘗試畫一下用例圖
當(dāng)接受到一個(gè)新的業(yè)務(wù)系統(tǒng)之后,首先咱們至少需要知道當(dāng)前這個(gè)系統(tǒng)是干什么的,所以有時(shí)候就需要抽時(shí)間找到相關(guān)的產(chǎn)品經(jīng)理了解一下業(yè)務(wù),此時(shí)產(chǎn)品經(jīng)理可能會(huì)和你聊一下現(xiàn)有的業(yè)務(wù)現(xiàn)狀和背景,但是有可能也會(huì)直接丟給你一份V0-Vn版本的產(chǎn)品需求方案,并告訴你他沒空。如果是后者記住千萬得忍住,不要用顯示器砸產(chǎn)品的臉,因?yàn)槟銈兊暮献魃形撮_始......開個(gè)玩笑,言歸正傳。
我們先了解一下什么是用例圖。
用例圖簡析
用例是系統(tǒng)中的一個(gè)功能單元,可以被描述為執(zhí)行者與主體之間的一次交互行為。執(zhí)行者是與系統(tǒng)、子系統(tǒng)或類發(fā)生交互作用的外部用戶、進(jìn)程或其他系統(tǒng)的理想化角色。
用途:能夠列出系統(tǒng)中的用例和執(zhí)行者,并顯示哪個(gè)執(zhí)行者參與了哪個(gè)用例的執(zhí)行。
針對之前小貓遇到的“下單付款的業(yè)務(wù)點(diǎn)”,咱們來畫個(gè)用例圖說明一下。如下圖:
用例
如上圖其實(shí)就是一個(gè)簡單的用例圖。我們需要搞清楚的是各種線條的含義。
- a線條表示的是關(guān)聯(lián)即執(zhí)行者與其參與的用例之間的通信路徑。用實(shí)線表示。
- b線條表示包含,在基用例上插入附加的行為,并且顯式地描述了該插入。
- c線條表示擴(kuò)展,在基用例上插入附加的行為,基用例并不知道。
- d線條表示用例泛化,一般用例和特殊用例之間地關(guān)系,其中特殊用例繼承了一般用例的特征并增加了新的特性。
這樣我們就可以很清晰地了解當(dāng)前的業(yè)務(wù)現(xiàn)狀。
2.后端模型梳理
當(dāng)梳理完當(dāng)前的系統(tǒng)功能點(diǎn)以及業(yè)務(wù)形態(tài)的時(shí)候,我們就可以介入去看一下現(xiàn)有系統(tǒng)的模型了即DB數(shù)據(jù)庫的表。這樣我們就能知道當(dāng)前設(shè)計(jì)的系統(tǒng)是如何對業(yè)務(wù)進(jìn)行抽象的。那么在看相關(guān)表的時(shí)候,其實(shí)我們就可以慢慢地將ER圖進(jìn)行繪制出來了。
什么是ER圖
E-R圖即全稱實(shí)體-聯(lián)系圖(Entity Relationship Diagram),它提供了表示實(shí)體類型、屬性和聯(lián)系的方法,用來描述現(xiàn)實(shí)世界的概念模型。
通過其定義其實(shí)我們就知道了在ER圖里面有三個(gè)比較重要的點(diǎn),分別是實(shí)體類,屬性,聯(lián)系。當(dāng)我們在整理DB表的時(shí)候其實(shí)對應(yīng)的就是我們的表、表字段以及對應(yīng)的表和表之間的關(guān)系。
看個(gè)例子,下面老貓繪制一下一般商城系統(tǒng)底層的商品邏輯。
ER例子
解釋一下每一塊圖的含義:
- 方塊表示一個(gè)模型即一個(gè)表,當(dāng)然這個(gè)也是ER圖中的實(shí)體類。
- 橢圓形表示實(shí)體類包含的屬性。
- 菱形就表示兩個(gè)類之間的動(dòng)作行為關(guān)系,比如上圖中商品上架到貨架上。日常中老師給學(xué)生上課,那么菱形中可能就是上課。
- 線條上的1和n就更清晰了,就是一對多,多對一,一對一的關(guān)系。
上圖中其實(shí)我們就可以比較清晰地看到,在當(dāng)前的這個(gè)系統(tǒng)中存在三個(gè)比較重要的實(shí)體概念,分別是商品、商品池、以及貨架。從圖中我們也可以大概地看到他們之間的關(guān)系。
當(dāng)咱們梳理完ER圖之后,其實(shí)上述的用例業(yè)務(wù)圖如何在現(xiàn)有系統(tǒng)中的抽象大概就清楚了。
聊到這里,咱們從上帝視角去看一下,我們給當(dāng)前這個(gè)系統(tǒng)賦予了骨架,接下來得讓它的開始心臟跳動(dòng),血液奔騰起來,讓整個(gè)系統(tǒng)賦予靈魂。那么接下來,我們就把模型通過流程的方式串起來。
3.核心流程以及狀態(tài)機(jī)流轉(zhuǎn)
咱們直接看一下例子,其實(shí)老貓覺得流程圖的梳理可能比較簡單,但是難的是如何去把控整個(gè)流程中的環(huán)節(jié)。如果在繪制的時(shí)候想的比較細(xì)致,可能每一步的落庫環(huán)節(jié)都會(huì)去記錄。這樣的話對于業(yè)務(wù)的專注度就會(huì)少一些。如果畫粗了,模型的對應(yīng)關(guān)系可能又把控不好。所以這個(gè)地方老貓覺得還是比較考驗(yàn)程序員的概括能力以及業(yè)務(wù)的理解能力的。
流程圖
上述圖中,老貓簡單畫了一個(gè)流程圖,當(dāng)然流程圖中可能會(huì)存在紕漏,大家不要太過較真,在此是說明這么一個(gè)事情,咱們暫且不談里面業(yè)務(wù)流程的準(zhǔn)確度。上面流程中我們看到有以下圖形內(nèi)容:
- 起始節(jié)點(diǎn),咱們用圓圈表示,當(dāng)然可以選擇自己喜歡的顏色,沒有太多標(biāo)準(zhǔn)。
- 流程進(jìn)行流轉(zhuǎn)的時(shí)候,我們用了相關(guān)的箭頭線表示,涉及到核心業(yè)務(wù)操作的時(shí)候就是方塊。
- 遇到分支節(jié)點(diǎn)的時(shí)候,咱們用菱形去做路由。
- 遇到一些異步操作的時(shí)候,老貓喜歡用虛線去表示。
上述這種流程的表示其實(shí)是比較簡單的,我們不用去在意系統(tǒng)邊界。只管繪制即可。
但是現(xiàn)在的開發(fā)體系咱們往往都是微服務(wù)化的,那么此時(shí)我們可能就要考慮到不同系統(tǒng)之間的交互流程。由此,咱們可能機(jī)會(huì)引入泳道的概念。見下圖。
泳道流程
上述圖中我們就可以看到各個(gè)系統(tǒng)應(yīng)用之間的交互,每一個(gè)泳道就代表著其中的一個(gè)微服務(wù)系統(tǒng)。這是老貓日常熟悉業(yè)務(wù)中真實(shí)繪制的一張圖,再次強(qiáng)調(diào)一下大家要看的是繪圖的一些思路,不要太過糾結(jié)業(yè)務(wù)。
那么再細(xì)節(jié)一點(diǎn),比如討論到訂單狀態(tài)的一些流轉(zhuǎn)的時(shí)候,此時(shí)我們?yōu)榱烁玫陌芽兀瑫?huì)使用一些狀態(tài)的流轉(zhuǎn)圖去梳理。
狀態(tài)流轉(zhuǎn)
上述主要是闡述整個(gè)狀態(tài)在流程中的流轉(zhuǎn),當(dāng)然很多時(shí)候狀態(tài)位比較簡單的時(shí)候,咱們也可以不用畫,可能當(dāng)狀態(tài)比較復(fù)雜多樣的時(shí)候才會(huì)去考慮到畫狀態(tài)機(jī)。
到此,通過上面的幾個(gè)步驟的梳理,其實(shí)我們已經(jīng)能夠?qū)Υ蟛糠值臉I(yè)務(wù)有個(gè)熟悉了。但是有的時(shí)候還不夠,涉及一些復(fù)雜接口交互請求時(shí)序的時(shí)候,可能還是會(huì)翻車弄不清楚,那么此時(shí)咱們就要引入時(shí)序圖進(jìn)行梳理。
4.引入時(shí)序圖
時(shí)序圖通常為表示多個(gè)對象之間消息交互的序列。其中時(shí)序圖涉及:參與者、對象、生命線、激活、消息、片段。當(dāng)然消息中又包含:同步消息、異步消息、自關(guān)聯(lián)消息、返回消息。
如下圖。
時(shí)序圖
上述簡單繪制了下單扣減庫存的時(shí)序。
在上述圖中,老貓用到了其中的一種片段--抉擇,其實(shí)關(guān)于片段還有很多種類,大家繪制時(shí)序的時(shí)候可以對照著去使用。
片段
5.復(fù)雜代碼的類圖
完成上面這些梳理之后,這個(gè)老系統(tǒng)其實(shí)就已經(jīng)被你搞定了,后續(xù)一些比較細(xì)節(jié)的地方,當(dāng)然隨著業(yè)務(wù)功能地迭代再慢慢吃透。
類圖:是描述類、接口、協(xié)同以及他們之間關(guān)系的圖,用來顯示系統(tǒng)中這些概念的靜態(tài)結(jié)構(gòu),類圖主要由類、接口和各種關(guān)系組成。
如果老系統(tǒng)中存在一些屎山代碼或者極端優(yōu)秀的代碼,你看不透里面的繼承實(shí)現(xiàn)關(guān)系的,那么可以去繪制一下類圖。這里老貓不作展開,先賣個(gè)關(guān)子,后續(xù)等咱們梳理到設(shè)計(jì)模式相關(guān)知識(shí)點(diǎn)的時(shí)候,咱們再慢慢聊。
寫在最后
在日常開發(fā)的過程中,我們會(huì)遇到各種各樣復(fù)雜的系統(tǒng),老貓通過上述手段,基本就可以做一個(gè)比較好的拿捏。希望能夠幫助到大家,大家如果還有其他比較好的辦法,也歡迎在評論區(qū)留言。