很多做軟件開發(fā)同學(xué)的夢(mèng)想都是成為一名架構(gòu)師,而架構(gòu)師的核心工作就是做好軟件設(shè)計(jì)。軟件設(shè)計(jì)是軟件開發(fā)過程中的一個(gè)重要環(huán)節(jié),那么如何進(jìn)行軟件設(shè)計(jì),其輸出標(biāo)準(zhǔn)又是什么呢?軟件設(shè)計(jì)過程中,如何和各個(gè)相關(guān)方溝通,使軟件設(shè)計(jì)能同時(shí)滿足用戶的功能需求和非功能需求,并降低公司的開發(fā)成本?
推薦閱讀:我憑借這份pdf拿下了螞蟻金服、字節(jié)跳動(dòng)、小米等大廠的offer
前期思考
很多軟件開發(fā)同學(xué)的職業(yè)規(guī)劃都是架構(gòu)師,試想這樣一個(gè)場(chǎng)景,如果公司安排你做架構(gòu)師,讓你在項(xiàng)目開發(fā)前期進(jìn)行了一些架構(gòu)設(shè)計(jì)。
- 你該如何開展你的工作?
- 應(yīng)該如何說出你的工作成果?
- 你如何確定你的設(shè)計(jì)是否滿足用戶需求的?
- 你是否有把握最后交付的軟件是滿足要求的?
- 是否有把握讓軟件團(tuán)隊(duì)每個(gè)工程師清晰了解自己的職責(zé)范圍,并有效的完成開發(fā)工作?
架構(gòu)師的核心工作就是做好軟件架構(gòu)設(shè)計(jì),軟件設(shè)計(jì)是軟件開發(fā)過程中一個(gè)重要的環(huán)節(jié)。
- 如何進(jìn)行軟件設(shè)計(jì)?
- 軟件設(shè)計(jì)的輸出是什么?
- 軟件升級(jí)過程中如何和各個(gè)相關(guān)方溝通?
- 軟件設(shè)計(jì)如何既能滿足用戶的功能需求,又能滿足用戶的非功能需求,也能滿足用戶的成本要求?
- 如何能夠使開發(fā)工程師,測(cè)試工程師,運(yùn)維工程師,理解軟件的整體架構(gòu),主要模塊劃分,關(guān)鍵技術(shù)實(shí)現(xiàn),核心領(lǐng)域模型,使他們能夠做好自己的工作,從而使整個(gè)軟件開發(fā)過程,處于一個(gè)可控的范圍之內(nèi),并在軟件開發(fā)之初,就對(duì)軟件未來的藍(lán)圖有個(gè)清晰的認(rèn)識(shí)?
以上這些訴求可以說是軟件開發(fā)管理與技術(shù)的核心訴求,這些問題搞定了,軟件的開發(fā)過程和結(jié)果也就得到了保障。
核心關(guān)鍵點(diǎn)
兩個(gè)客觀存在
我們?cè)賮砜纯矗鉀Q這些問題你需要理解的核心關(guān)鍵點(diǎn),也就是說究竟如何做軟件設(shè)計(jì),解決方法就是軟件建模,就是軟件的抽象模型,這些模型之上配上文字說明,就形成了軟件的設(shè)計(jì)文檔。
模型是對(duì)客觀存在的抽象,在軟件開發(fā)中有兩個(gè)客觀存在:
一個(gè)是我們要解決的領(lǐng)域問題,比如我們要開發(fā)一個(gè)電子商務(wù)網(wǎng)站,那么客觀的領(lǐng)域問題就是如何做生意,賣家如何管理商品,管理訂單服務(wù)用戶,買家如何挑選商品,如何下單,如何支付等等,對(duì)于這些客觀領(lǐng)域問題的抽象就是各種功能及其關(guān)系,各種模型對(duì)象及其關(guān)系,各種業(yè)務(wù)處理流程。
另一個(gè)客觀存在就是最終開發(fā)出來的軟件系統(tǒng),這個(gè)軟件系統(tǒng)也是客觀存在的。
- 軟件有哪些主要組成?
- 這些類如何組織成一個(gè)一個(gè)的組件?
- 這些內(nèi)核組件之間的依賴關(guān)系是如何的?
- 運(yùn)行期如何調(diào)用,需要部署多少臺(tái)服務(wù)器?
- 服務(wù)器之間如何通信?
所以這兩方面的客觀存在的抽象就是我們的軟件模型。
一方面,我們要對(duì)領(lǐng)域問題和軟件系統(tǒng)進(jìn)行分析,設(shè)計(jì)抽象,另一方面,我們根據(jù)抽象出來的模型,進(jìn)行軟件開發(fā),這就是軟件開發(fā)的主要過程。

而對(duì)領(lǐng)域問題和軟件系統(tǒng)進(jìn)行分析,設(shè)計(jì)抽象,這個(gè)過程我們稱它為軟件建模與設(shè)計(jì)。
UML工具
軟件建模工具很多,目前主要是統(tǒng)一建模語言UML。
所謂的建模,就是對(duì)領(lǐng)域問題和軟件系統(tǒng)進(jìn)行抽象設(shè)計(jì),一個(gè)工具完成前述軟件開發(fā)過程中的兩個(gè)客觀存在的建模。
而所謂的語言,一則用于溝通,滿足設(shè)計(jì)階段和各個(gè)相關(guān)方溝通的目的,一則用于思考,即使軟件開發(fā)過程中不需要跟其他人溝通,或者還沒有到了溝通的時(shí)候,依然可以使用UML建模,幫助自己進(jìn)行設(shè)計(jì)思考。
此外,語言還有個(gè)特點(diǎn),就是有方言,就我觀察不同公司,不同團(tuán)隊(duì),都有自己的特點(diǎn),并不需要拘泥于以往那樣規(guī)范和語法,只要不引起歧義,在使用過程中對(duì)語法元素適當(dāng)變通,這是UML的最佳時(shí)間。
軟件建模與設(shè)計(jì)過程又可以拆分成需求分析,概要設(shè)計(jì),詳細(xì)設(shè)計(jì)三個(gè)階段,而軟件建模的主要工具是UML,下面我們看一下使用方法包含了哪些軟件模型,常用的有7種。
7種軟件模型
下面我們討論這7種模型圖,如何在三個(gè)階段使用。
類圖

類圖是最常見的UML圖形,用來描述類的特性和類之間的靜態(tài)關(guān)系,一個(gè)類包含三個(gè)部分,類的名稱,類的屬性列表,類的方法列表之間有6種靜態(tài)關(guān)系關(guān)聯(lián),關(guān)聯(lián),依賴,聚合,組合,繼承,泛化,而相關(guān)的一組類及其關(guān)系,用一張圖畫出來就是類圖,類圖主要是在詳細(xì)設(shè)計(jì)階段化,如果內(nèi)圖已經(jīng)設(shè)計(jì)出來了,那么開發(fā)工程師只需要按照內(nèi)圖實(shí)現(xiàn)代碼就可以了,只要類的方法邏輯不是太復(fù)雜,不同的工程是實(shí)現(xiàn)出來的代碼幾乎是一樣的,從而保證軟件的規(guī)范統(tǒng)一。
實(shí)踐中通常不需要把一個(gè)軟件所有的類都畫出來,把核心的有代表性的,有一定技術(shù)難度的內(nèi)畫出來,一般就可以了,除了在詳細(xì)設(shè)計(jì)階段畫類圖,在需求分析階段,也可以將關(guān)鍵的領(lǐng)域模型對(duì)象圖,用例圖畫出來,這個(gè)階段,關(guān)注的是領(lǐng)域?qū)ο蟮淖R(shí)別及其關(guān)系,所以通常用簡化的類圖來描述。
序列圖

序列圖描述類之間的關(guān)系,描述參與者自己的動(dòng)態(tài)調(diào)用關(guān)系,每個(gè)參與者有一條垂直向下的生命線,用虛線表示,而參與者之間的消息,也從上到下表示其調(diào)用的前后順序關(guān)系。
每個(gè)生命線都有個(gè)結(jié)果,只有在參與者活動(dòng)的時(shí)候才是激活的,序列圖通常用于描述對(duì)象之間的交互,這個(gè)對(duì)象可以是類對(duì)象,也可以是更大粒度的參與者,比如組件,比如服務(wù)器,比如子系統(tǒng)。總之,只要描述不同參與者之間的交互的,都可以使用序列圖,也就是說,在軟件設(shè)計(jì)的各個(gè)階段,都可以畫序列圖。
組件圖

組件是更大粒度的設(shè)計(jì)元素,一個(gè)組件中通常包含多個(gè)類,組件圖有時(shí)候和包的用途比較接近,組件可以描述邏輯上的組件,也可以描述物理上的組件,比如一個(gè)JAR,一個(gè)DLL的,因此組件圖更靈活一點(diǎn),實(shí)踐中,用組件圖而不是包圖進(jìn)行模塊設(shè)計(jì)更常見一些。
組件圖描述中間之間的靜態(tài)關(guān)系,主要是依賴關(guān)系,如果想要描述組件之間的動(dòng)態(tài)調(diào)用關(guān)系,可以使用組件序列圖,以組建作為參與者,描述組件之間的消息調(diào)用關(guān)系,因?yàn)榻M件的力度比較粗,通常用于描述設(shè)計(jì)軟件的模塊及其之間的關(guān)系,需要在設(shè)計(jì)早期階段就畫出來。
部署圖

他是描述軟件系統(tǒng)的最終部署情況,需要部署多少臺(tái)服務(wù)器?關(guān)鍵組件都部署在哪些服務(wù)器上?部署圖呈現(xiàn)的是系統(tǒng)最終物理呈現(xiàn)的藍(lán)圖。
- 根據(jù)部署圖,所有相關(guān)者,客戶,老板,工程師,都能夠清晰的了解到最終運(yùn)行的系統(tǒng),物理上是什么樣子?和現(xiàn)有系統(tǒng)服務(wù)器的關(guān)系,和第三方服務(wù)器的關(guān)系。
- 根據(jù)部署圖,還可以估算出服務(wù)器和第三方軟件的采購成本。
因此,部署圖是整個(gè)軟件設(shè)計(jì)模型中比較宏觀的一張圖,在設(shè)計(jì)早期就需要畫的一張模型圖。根據(jù)部署,各方可以討論是否對(duì)這個(gè)方案認(rèn)可,只有對(duì)部署圖達(dá)成共識(shí),才能夠繼續(xù)后面的細(xì)節(jié)設(shè)計(jì),部署圖主要用在概要設(shè)計(jì)階段。
用例圖

主要在需求分析階段,通過反映用戶和軟件系統(tǒng)之間的交互,描述軟件的功能需求,圖中小人物被稱為角色,角色可以是人,也可以是其他的系統(tǒng),系統(tǒng)的功能可能會(huì)很復(fù)雜,所以一個(gè)用例圖,可能只包含其中一小部分功能,這些功能被一個(gè)巨型框框起來,這個(gè)巨型框被稱為用力的邊界,框里的橢圓,表示一個(gè)一個(gè)的功能,功能之間可以調(diào)用依賴,也可以進(jìn)行功能擴(kuò)展,因?yàn)橛美龍D中功能描述比較簡單,通常還需要對(duì)用例圖配以文字說明,形成需求文檔。
狀態(tài)圖

用來展示單個(gè)對(duì)象生命周期的狀態(tài)變更,業(yè)務(wù)系統(tǒng)中,很多重要的領(lǐng)域?qū)ο髮?duì)于比較復(fù)雜的狀態(tài)變遷,比如賬號(hào),有創(chuàng)業(yè)狀態(tài),激活狀態(tài),凍結(jié)狀態(tài),欠費(fèi)狀態(tài)等等各種狀態(tài),因此,用戶訂單商品紅包這些常見的領(lǐng)域模型,都有多種狀態(tài),這些狀態(tài)的變遷描述,可以在用例圖中用文字描述,隨著角色的各種操作而改變,但是這種描述方式,狀態(tài)散落在各處,做開發(fā)的時(shí)候容易搞錯(cuò),就是產(chǎn)品經(jīng)理自己在設(shè)計(jì)的時(shí)候,也容易搞錯(cuò)對(duì)象的狀態(tài)變遷,狀態(tài)圖可以很好的解決這一問題。
一張狀態(tài)圖描述一個(gè)對(duì)象生命周期的各種狀態(tài)及其變遷的關(guān)系。
活動(dòng)圖

主要用來描述過程邏輯,業(yè)務(wù)流程。UML中沒有流程圖,很多時(shí)候人們用活動(dòng)圖代替流程圖,活動(dòng)圖和早期流程圖的圖形元素也很接近.
實(shí)心圓代表流程開始,空心圓代表流程結(jié)束,圓角矩形表示活動(dòng),菱形表示分支判斷,此外,引入了一個(gè)重要的概念,泳道。可以根據(jù)活動(dòng)的范圍,將活動(dòng)根據(jù)領(lǐng)域,系統(tǒng)角色的,劃分到不同的泳道中,使流程邊界更加清晰明了。
總結(jié)
模型圖本身并不復(fù)雜,幾分鐘的時(shí)間就可以學(xué)習(xí)一個(gè)模型圖的畫法。難的是如何在合適的場(chǎng)合下用正確的UML模型,表達(dá)自己的設(shè)計(jì)意圖,從而形成一套完整的軟件模型,進(jìn)而組織起一個(gè)言之有物,層次分明,可以指導(dǎo)開發(fā),在團(tuán)隊(duì)內(nèi)部達(dá)成共識(shí)的設(shè)計(jì)文檔。
我們從軟件設(shè)計(jì)的不同階段這一維度重新梳理一下,如何使用正確的模型進(jìn)行軟件建模。
需求分析
在需求分析階段,主要是通過用例圖描述系統(tǒng)的功能與使用場(chǎng)景;對(duì)于關(guān)鍵的業(yè)務(wù)流程,可以通過活動(dòng)圖描述。如果在需求階段,就提出要和現(xiàn)有的某些子系統(tǒng)整合,可以通過時(shí)序圖,描述新系統(tǒng)和原來的子系統(tǒng)的調(diào)用關(guān)系。
核心領(lǐng)域?qū)ο螅梢酝ㄟ^簡化的類圖進(jìn)行模型領(lǐng)域抽象,并描述核心領(lǐng)域?qū)ο笾g的關(guān)系。
如果某些對(duì)象內(nèi)部有復(fù)雜的狀態(tài)變化,比如用戶,訂單這些,可以用狀態(tài)圖進(jìn)行描述。
概要設(shè)計(jì)
在概要設(shè)計(jì)階段,通過部署圖,描述系統(tǒng)最終的物理藍(lán)圖,通過組件圖以及組件時(shí)序圖,設(shè)計(jì)軟件主要模塊及其關(guān)系,還可以通過組建活動(dòng)圖,描述組件之間的流程邏輯。
詳細(xì)設(shè)計(jì)
在詳細(xì)設(shè)計(jì)階段,主要輸出的就是類圖和類的時(shí)序圖,直到最終的代碼開發(fā),如果某個(gè)類方法內(nèi)部,有比較復(fù)雜的邏輯,那么可以畫方法的活動(dòng)圖進(jìn)行描述,UML的工具可以是很復(fù)雜的,收費(fèi)的,比如EA這樣的大型軟件工具。也可以使用processon在線的免費(fèi)的工具。對(duì)于一般的開發(fā)者,建議從簡單的用起,因?yàn)槟莻€(gè)建模可以很復(fù)雜,也可以很簡單,簡單掌握類圖,時(shí)序圖,組件圖,部署圖,用例圖,狀態(tài)圖,活動(dòng)圖。在7種模型圖,靈活的在需求分析,概要設(shè)計(jì)詳細(xì)設(shè)計(jì)階段,根據(jù)場(chǎng)景的不同,繪制對(duì)應(yīng)的模型圖,可以實(shí)實(shí)在在的做好軟件建模,搞好系統(tǒng)設(shè)計(jì),作為一個(gè)掌控局面,引領(lǐng)技術(shù)團(tuán)隊(duì)的架構(gòu)師。