分析與設(shè)計(jì)這兩個(gè)詞我們平時(shí)經(jīng)常聽到,也經(jīng)常講,那么分析與設(shè)計(jì)的本質(zhì)究竟是什么呢?到底要分析什么?又到底要怎樣去設(shè)計(jì)?這3個(gè)問題如果平時(shí)沒有一些積累,突然被問到這些,一時(shí)也會(huì)顯得不知所措。接下面在第一部分中回答分析與設(shè)計(jì)的本質(zhì),只有清楚了本質(zhì),那就知道要怎么分析與設(shè)計(jì),因此在第二、第三部分具體講軟件的分析與設(shè)計(jì)方法,最后一部分講述個(gè)人的一些思考。
一 .分析與設(shè)計(jì)的本質(zhì)
1. 分析的本質(zhì)
"分析",由"分"和"析"兩個(gè)字組成,"分"是分開的意思,這個(gè)比較好理解;"析",左"木"又"斤","斤"通"金",即把木劈開。延伸來講,分析的本質(zhì)即是洞察出事物的內(nèi)部要素,包含組成結(jié)構(gòu)、運(yùn)行機(jī)制等。平時(shí)開發(fā)同學(xué)經(jīng)常看到"需求分析"、"軟件分析"、"架構(gòu)分析"這些詞,以"需求分析"為例,分析階段要了解的內(nèi)容有:需求背景、需求目的、需求目標(biāo)、利益相關(guān)方、業(yè)務(wù)流程、業(yè)務(wù)依賴方、業(yè)務(wù)指標(biāo)。分析的目的是為了找出隱藏在現(xiàn)象背后的本質(zhì),考察的是否對(duì)事物打散認(rèn)識(shí),深入到事物內(nèi)部去看問題,就像我們高中學(xué)習(xí)化學(xué)一樣,分子結(jié)構(gòu)決定表現(xiàn)現(xiàn)象。在實(shí)際軟件開發(fā)中,產(chǎn)品同學(xué)提的一個(gè)需求,有時(shí)它就包含了技術(shù)解決方案,只有深入分析之后,開發(fā)同學(xué)有可能提出更為合理的技術(shù)解決方案,否則只是就事論事的解決問題,在新的場景下,現(xiàn)有的解決方案又有問題。
有一個(gè)段子說一個(gè)人去做美容,剛來的一個(gè)醫(yī)生不懂人體結(jié)構(gòu),結(jié)果一刀下去,把大動(dòng)脈劃破了,結(jié)果人失血過多死了,"美死你了"這個(gè)詞就是這么來的。段子歸段子,這也說明如果分析沒有做得相當(dāng)充分,也即缺乏對(duì)事物的了解,往往做事會(huì)出錯(cuò)。
2. 設(shè)計(jì)的本質(zhì)
"設(shè)"和"計(jì)"兩個(gè)字都有"言"字旁,并且右邊有"多"的意思,如"十"、"又",即集多家之言。延伸來講,設(shè)計(jì)的本質(zhì)即是對(duì)方案優(yōu)中選優(yōu),包含了對(duì)方案設(shè)計(jì)的思考、取舍和權(quán)衡。只有了解了當(dāng)時(shí)的設(shè)計(jì)思想才會(huì)比較快掌握是怎樣實(shí)現(xiàn)的,在軟件編碼實(shí)現(xiàn)層面上,我們有時(shí)看到一些比較難理解的邏輯,這些邏輯就是當(dāng)時(shí)設(shè)計(jì)的產(chǎn)物,在當(dāng)時(shí)是為了解決特定的問題產(chǎn)生的。
一個(gè)好的設(shè)計(jì)凝集了設(shè)計(jì)者的思想和心血,比如經(jīng)典的文學(xué)著作,里面有優(yōu)秀的寫作手法;比如經(jīng)典的影視橋段,里有精彩的故事情節(jié);比如巧奪天工的建筑設(shè)計(jì),里面有豐富的寓意。相反一個(gè)糟糕的設(shè)計(jì),輕則讓人迷惑,看不懂為什么要這么設(shè)計(jì),影響美觀、使用,重則產(chǎn)生事故,在《復(fù)雜系統(tǒng)的產(chǎn)品設(shè)計(jì)與開發(fā)》一書中,作者舉了一個(gè)輪船的例子,當(dāng)時(shí)建造輪船提了很多要求,在面對(duì)這么復(fù)雜的系統(tǒng)時(shí),設(shè)計(jì)沒有考慮周全,結(jié)果設(shè)計(jì)出來的輪船下水就沉了。
拉曼《UML和模式應(yīng)用》一書中,對(duì)分析與設(shè)計(jì)概括成:分析是做正確的事;設(shè)計(jì)是正確地做事,之前看到這2句話挺迷糊,并沒有領(lǐng)會(huì)到這兩句的精髓,后面經(jīng)歷了一些系統(tǒng)的設(shè)計(jì)之后,重新去看發(fā)現(xiàn)這2句話高度概括出了分析與設(shè)計(jì)的本質(zhì)內(nèi)涵。
二 .到底要分析什么
1 .分析全景圖
分析的起點(diǎn)是問題本身,比如現(xiàn)象、痛點(diǎn)、挑戰(zhàn)、價(jià)值等,從這些基礎(chǔ)點(diǎn)去分析,如分析一個(gè)業(yè)務(wù)時(shí),我喜歡從業(yè)務(wù)愿景和業(yè)務(wù)目標(biāo)去看這個(gè)業(yè)務(wù)有哪些利益相關(guān)者,也即有哪些角色在使用這個(gè)業(yè)務(wù),從這些利益相關(guān)者的角度去思考他們的本質(zhì)訴求,正是他們的訴求構(gòu)成了我們要做什么的輸入,不管外部怎么變化,他們的本質(zhì)訴求是不變的,如對(duì)于消費(fèi)者來講,他們的訴求是花最短的時(shí)間、最少的錢、更好的體驗(yàn)買到心儀的商品;對(duì)于商家來講,他們的訴求是怎么賣出更多的貨、怎樣獲得更大的利潤。反而如果我們不去關(guān)注利益關(guān)注點(diǎn)的本質(zhì)訴求,而只是自己憑空想出來的,自以為有價(jià)值,結(jié)果一落地就出現(xiàn)了問題。
當(dāng)明確了要做什么(What)之后,接下來就要思考業(yè)務(wù)流程以及業(yè)務(wù)中包含的要素(業(yè)務(wù)對(duì)象)、業(yè)務(wù)模型以及業(yè)務(wù)能力(How),實(shí)際上這部分就是提供一個(gè)解決方案去實(shí)現(xiàn)前面提到的訴求。分析的階段,一定要非常細(xì),在軟件分析中,有一些分析的工具幫助我們更好地理解事物本身,具體地在下一節(jié)中講到。分析的產(chǎn)物是業(yè)務(wù)模型和業(yè)務(wù)能力地圖,通過業(yè)務(wù)模型可以看出業(yè)務(wù)是什么、有什么,通過業(yè)務(wù)能力地圖可以看出具體的業(yè)務(wù)能力有哪些,可以支撐哪些業(yè)務(wù)場景。
分析往上看一層,就是要分析商業(yè)價(jià)值鏈和商業(yè)模式,雖然這一塊并不是開發(fā)同學(xué)負(fù)責(zé)的范疇,了解一些還比較好,能讓我們對(duì)業(yè)務(wù)有更深刻的認(rèn)識(shí),商業(yè)模式?jīng)Q定商業(yè)結(jié)構(gòu),商業(yè)結(jié)構(gòu)決定交易結(jié)構(gòu),交易結(jié)構(gòu)決定業(yè)務(wù)組成結(jié)構(gòu)。利益相關(guān)者也是從業(yè)務(wù)組成結(jié)構(gòu)中推導(dǎo)出來的,這一部分是最頂層的分析,分析業(yè)務(wù)的可行性,也即我們常說的Why。
2. 具體分析方法
在實(shí)際中,我們會(huì)看到各種各樣的分析方法,這些方法本身并不重要,重要的是它能給我們帶來什么的幫助,為什么需要它,個(gè)人的觀點(diǎn)是分析方法不要貪多,真正融匯到實(shí)際中,有那么1、2個(gè)方法就足已,不要迷失在各種各樣的分析方法中,真正還是要了解分析的本質(zhì)是什么,在第一部分中,已經(jīng)提到分析的本質(zhì)是要洞察出事物的組成,包含組成結(jié)構(gòu)和運(yùn)行機(jī)制,你再去看各種各樣的分析方法,它們都是為了找出事物的組成結(jié)構(gòu)和運(yùn)行機(jī)制。如黃金圈分析方法,它就包含了三層(Why、What、How),分析事物不斷從宏觀到微觀、從目的到實(shí)現(xiàn);再比如5W2H,真正的把一件事分析得非常仔細(xì),什么人在什么時(shí)間什么地點(diǎn)因?yàn)槭裁醋隽耸裁词隆?
再回到軟件分析本身,之前在大學(xué)里我們我們學(xué)習(xí)軟件工程、UML等課程,由于當(dāng)時(shí)并沒有多少實(shí)際的研發(fā)、設(shè)計(jì)的經(jīng)驗(yàn),學(xué)習(xí)的時(shí)候覺得這些內(nèi)容比較空洞,反正老師讓我們這樣做就這樣做,缺乏對(duì)這些UML圖的理解。
- 用例圖:用戶對(duì)系統(tǒng)最直接的交互,要表達(dá)出用戶需要怎樣的能力去滿足他們的訴求,它的關(guān)鍵是用戶、目的、價(jià)值。
- 活動(dòng)圖:用戶在某一類場景中,要表達(dá)出業(yè)務(wù)流程是怎樣的,它的關(guān)鍵是業(yè)務(wù)活動(dòng)、流程交互(僅是業(yè)務(wù)層面,不是系統(tǒng)流程)。
- 模型圖:屏蔽業(yè)務(wù)細(xì)節(jié),抽象出業(yè)務(wù)關(guān)鍵要素以及它們之間的聯(lián)系,它的關(guān)鍵是業(yè)務(wù)抽象出來的實(shí)體以有實(shí)體之間的關(guān)聯(lián)。
我們現(xiàn)在反過來去想想當(dāng)時(shí)學(xué)習(xí)的UML課程,里面各種圖都是為了幫助我們更好去認(rèn)識(shí)、理解項(xiàng)目需求,畫這些圖并非是做做樣子,而是真正地挖掘出業(yè)務(wù)能力有哪些、系統(tǒng)能力有哪些、業(yè)務(wù)模型是怎樣的、要有哪些對(duì)象、對(duì)象之間的關(guān)系是怎樣的。在實(shí)際工作中,有些人在分析階段在這一塊落實(shí)得并不那么好,其實(shí)問幾個(gè)問題很容易暴露出來,比如設(shè)計(jì)的類圖的出發(fā)點(diǎn)是什么、這個(gè)類的職責(zé)為什么有這些、這個(gè)職責(zé)為什么在這個(gè)類而不是在另外一個(gè)類中。如果我們分析階段做得不扎實(shí),設(shè)計(jì)階段的輸入就會(huì)比較少,或者是淺層次的輸入,設(shè)計(jì)的質(zhì)量也不會(huì)高,因?yàn)椴]有真正洞察出問題。
3. 1個(gè)分析案例
用2.1節(jié)中提到的分析方法,我當(dāng)時(shí)分析一個(gè)分銷業(yè)務(wù)也是用了上面的方法,從下面這張圖中可以看出業(yè)務(wù)發(fā)展思路是怎樣,用了幾個(gè)關(guān)鍵詞進(jìn)行概括:打基礎(chǔ)、拓渠道、夯能力、搭體系、數(shù)據(jù)化。當(dāng)有了這些認(rèn)識(shí)之后,再去推導(dǎo)技術(shù)側(cè)要做哪些就比較容易,以拓展渠道為例,當(dāng)多個(gè)渠道接入進(jìn)來時(shí)就暴露了一些問題,比如答疑成本比較高,因此就有一個(gè)重要的方面就是渠道接入保障,怎么減少渠道接入成本、答疑成本就是技術(shù)側(cè)要思考的問題。
三 .到底要怎樣設(shè)計(jì)
1 .設(shè)計(jì)全景圖
如果說分析階段是把事物打散,那么設(shè)計(jì)就是把打散的事物更好地組合起來。設(shè)計(jì)最為核心的是從分析中提煉出問題,即定義技術(shù)問題,這個(gè)是非常難的,比如你覺得某個(gè)設(shè)計(jì)不好,但又講不出來為什么不好,說明對(duì)問題的理解程度還不高。常見的技術(shù)問題有:性能、擴(kuò)展性、穩(wěn)定性、安全、效能、體驗(yàn)、成本、數(shù)據(jù)一致性等。
當(dāng)定義好了技術(shù)問題,接下來就要調(diào)研業(yè)界對(duì)這個(gè)問題有哪些方案,每個(gè)方案的優(yōu)缺點(diǎn)是什么,比如數(shù)據(jù)一致性,有事務(wù)型解決方案,也有補(bǔ)償型解決方案,結(jié)合業(yè)務(wù)本身去做選擇,這個(gè)選擇就包含了決策,決策就意味著取舍和平衡,并不是隨意的決策,而是有決策的依據(jù)來支撐,比如經(jīng)驗(yàn)、原則、數(shù)據(jù)等。
設(shè)計(jì)是包含原則的,這些原則應(yīng)該是大家都去遵循的,比如分層原則,這個(gè)在軟件設(shè)計(jì)中非常常見,原則是平時(shí)大家開發(fā)過程經(jīng)驗(yàn)的結(jié)晶,以分層原則為例,可以深入思考,為什么要分層、分層解決了什么問題、要分多少層、如何去分層,只有深入思考了這些原則,在新的場景中再去做設(shè)計(jì)時(shí),就會(huì)得心應(yīng)手,而不是僵硬地去套用分層原則。
2 .設(shè)計(jì)原則
設(shè)計(jì)原則,每個(gè)設(shè)計(jì)者有自己的理解,很難有統(tǒng)一的設(shè)計(jì)原則,只能在局部上達(dá)成一致,比如分層原則,這個(gè)大家比較容易達(dá)成的,設(shè)計(jì)原則應(yīng)該是一系列的原則組成集合,并非是單一。設(shè)計(jì)原則是在大量實(shí)踐過程中沉淀出來的,我更想說的是如果你對(duì)看到的某些原則能結(jié)合自己的經(jīng)歷講得出來,說明你是有過真正實(shí)踐和思考的,否則這些設(shè)計(jì)原則也僅僅是一些文字,轉(zhuǎn)化不了設(shè)計(jì)經(jīng)驗(yàn)和設(shè)計(jì)能力,這里列出一些常用的設(shè)計(jì)原則。
- 系統(tǒng)性原則
- 抽象分層原則
- 領(lǐng)域原則
- 復(fù)用原則
- 簡易原則
- 成本效率原則
- 正交原則
- 擴(kuò)展原則
- 演進(jìn)原則
3 .兩個(gè)設(shè)計(jì)案例
對(duì)于上面提到的9個(gè)設(shè)計(jì)原則,這里主要聊的是系統(tǒng)性原則和正交原則,系統(tǒng)性原則是站在全局上思考系統(tǒng)之間的交互,這個(gè)是非常重要的,相當(dāng)于是指明燈,當(dāng)看懂了整個(gè)系統(tǒng)未來的樣子,在當(dāng)下每一步的執(zhí)行都清楚知道是為了什么。反之沒有這個(gè)系統(tǒng)性原則,所做的事都只是關(guān)注點(diǎn)狀事情,不成體系。以2.3節(jié)中的例子來講,當(dāng)分析出來要做的事情后,如下圖畫出系統(tǒng)架構(gòu)圖。從系統(tǒng)架構(gòu)圖中可以看出系統(tǒng)之間的交互是怎樣的、鏈路邏輯是怎樣的(注:逆向鏈路沒有表達(dá)出來)。
我們?cè)跀?shù)學(xué)中學(xué)習(xí)過正交,最簡單的理解是兩條線是垂直的,在軟件中我們看到一些邏輯中包含了很多的邏輯,每次修改的時(shí)候,改了這個(gè)邏輯結(jié)果影響了另外一個(gè)邏輯,說明我們的邏輯耦合度比較高。正交原則即是分離出不同的變化點(diǎn),讓變化自治,即每個(gè)變化只影響自身,不會(huì)影響到其它的變化點(diǎn)。平時(shí)我們寫代碼中有兩種場景影響正交:代碼重復(fù)和關(guān)系依賴,對(duì)于重復(fù)的代碼可以抽取出來,對(duì)于依賴的部分,可以抽象一層防腐層出來。
舉一個(gè)正交的例子,假如有一個(gè)需求是:查找員工名為John的員工,這個(gè)代碼可以很快寫出來,但細(xì)細(xì)想想的它的變化點(diǎn),至少可以想到下面3個(gè)變化點(diǎn):
查找的內(nèi)容會(huì)變,不一定按照名字來查,比如按照員工工號(hào)來查;
查找的對(duì)象會(huì)變,不一定查員工,還有可能查學(xué)生;
查找的規(guī)則會(huì)變,不一定是待值查找,還有可能是范圍查找,比如查找年齡在20至30的員工。
當(dāng)想到了這些變化,重新設(shè)計(jì)后的效果就會(huì)不一樣了,當(dāng)面臨業(yè)務(wù)場景變化的時(shí)候,可以做到最少的改動(dòng),這也即是設(shè)計(jì)能夠降本增效的原因。
四 .分析與設(shè)計(jì)的思考
1 .衡量標(biāo)準(zhǔn)
衡量分析與設(shè)計(jì)的標(biāo)準(zhǔn)是比較難的,一般是從一些大的原則去看,比如復(fù)雜性、開放性等,但又很難有一個(gè)量化的指標(biāo)去衡量,到底復(fù)雜度有多高、開放性有多底。真正衡量好壞只有通過比較才比較好判斷,比如多個(gè)方案之間的比較,這個(gè)是比較容易衡量誰好。因此我們需要多去看別人是怎么設(shè)計(jì)的,有哪些好的設(shè)計(jì)思想值得借鑒,多吸收好的設(shè)計(jì)思想、設(shè)計(jì)案例。
做設(shè)計(jì)最怕是閉門造車,結(jié)果設(shè)計(jì)出來的東西不能夠很好地解決實(shí)際問題。個(gè)人的經(jīng)驗(yàn)是去看業(yè)界的方案,看看它們是怎么設(shè)計(jì)的,各自的特點(diǎn),比如數(shù)據(jù)不一致性的問題,有很多種設(shè)計(jì)方案來解決,有的方案對(duì)業(yè)務(wù)入侵比較大,需要改造很大,能不能無入侵業(yè)務(wù)呢?阿里提出了TXC解決方案,這個(gè)設(shè)計(jì)就非常好,使用者只有打上一個(gè)注解就ok,對(duì)業(yè)務(wù)改造沒有什么成本,這也即是前面提到的簡易設(shè)計(jì)原則。
2. 虛實(shí)結(jié)合
提到分析與設(shè)計(jì),很多人覺得很虛,的確,在我剛工作前3年,也覺得這個(gè)非常虛,這個(gè)不就是畫畫圖嘛,后面發(fā)現(xiàn)還真不是這么一回事。印象最深的一件事,當(dāng)時(shí)在滴滴,我的主管給我們展示了營銷系統(tǒng)未來我們要做的事,用了一張系統(tǒng)架構(gòu)圖非常體系地講出來,知道未來我們要做成什么樣子,當(dāng)前我們處在什么位置上,那段時(shí)間我們過得非常充實(shí),知道我們?cè)谧鍪裁础⒁鍪裁矗?年半以后我們把當(dāng)時(shí)那張系統(tǒng)架構(gòu)圖上的事情都完成了,回過來頭來看,如果沒有當(dāng)時(shí)的指引,每天還是做著需求,來一個(gè)需求做一個(gè)需求,這也即是最開始做事沒啥動(dòng)力,沒看到目標(biāo)。
當(dāng)設(shè)計(jì)的內(nèi)容確定之后,最為重要的就是落實(shí),這個(gè)過程是經(jīng)驗(yàn)的積累,在實(shí)踐的過程中會(huì)遇到一些問題,比如發(fā)放優(yōu)惠券的過程中怎么扣庫存、怎么保持事務(wù)一致性,技術(shù)難度的問題,我聽一個(gè)人講過一句話:要么沒看到問題;要么回避問題,在實(shí)際中,我們會(huì)遇到各種各樣的問題,只是我們把它忽略掉了,到最后說這個(gè)事技術(shù)上沒復(fù)雜度。我經(jīng)常分享的一個(gè)觀點(diǎn)是往上抽象看2層,或許你的設(shè)計(jì)方案會(huì)變。架構(gòu)設(shè)計(jì)是需要大量的實(shí)實(shí)在在的經(jīng)驗(yàn),不是簡單地畫畫架構(gòu)圖就行了,需要在實(shí)踐中反復(fù)檢驗(yàn),再去指導(dǎo)下一次更好地設(shè)計(jì),我欣賞的一句話是:將虛的事情做實(shí)。
3 .將經(jīng)驗(yàn)轉(zhuǎn)化成能力
當(dāng)我們有一些分析設(shè)計(jì)經(jīng)驗(yàn)之后,更進(jìn)一步地要轉(zhuǎn)化成設(shè)計(jì)能力,設(shè)計(jì)能力是抽象的,需要在實(shí)際中得到檢驗(yàn)。就像在第三部分講到的設(shè)計(jì),它不像分析那么很好地講出具體的方法出來,設(shè)計(jì)本身是凝聚了思想、心血在里面,同時(shí)設(shè)計(jì)是一種藝術(shù),具有高度的靈活性,因此很難講出具體的設(shè)計(jì)方法,也不會(huì)有統(tǒng)一的方法,有靈活性一定不是具體的,所以這部分需要在大量的實(shí)踐基礎(chǔ)上,提煉出設(shè)計(jì)原則,將其轉(zhuǎn)化成設(shè)計(jì)能力。
原文鏈接:https://zhuanlan.51cto.com/art/202112/696329.htm