三、架構(gòu)設(shè)計(jì)的過程
本人經(jīng)歷過不少項(xiàng)目,一些項(xiàng)目的架構(gòu)設(shè)計(jì)負(fù)責(zé)人能力很強(qiáng),接到活之后,馬上一頭扎進(jìn)設(shè)計(jì),抽象出一堆玄玄乎乎的概念,講得人暈頭轉(zhuǎn)向的,讓人覺得高深莫測,但是,在會議上卻被涉眾提的一些簡單的問題問得很倉促,究其根本,還是漏考慮了涉眾的需求,被人提問而又缺乏準(zhǔn)備,是不是很多人有類似的經(jīng)驗(yàn)?:)
我們還經(jīng)常遇到的場景是設(shè)計(jì)人員通常為一些模型、概念爭論不休,公說公的英俊,婆說婆的漂亮,其實(shí)模型概念這東西就像人的人生觀和世界觀,是人對世界和人生的主觀認(rèn)識,可能隨著年齡階段的變化而變化,而且有時(shí)候沒有絕對的對與錯(cuò),就像有些人喜歡金戈鐵馬,有些人喜歡與世無爭,我們很難說誰一定是對的一定是錯(cuò)的!遇到這種清醒時(shí),我建議停下爭論,爭論方各自拿出實(shí)際的業(yè)務(wù)場景來檢驗(yàn)?zāi)P?,哪個(gè)模型對場景的滿足度更好,實(shí)現(xiàn)成本更低則更好,如果兩個(gè)都挑不出刺兒,隨便選一個(gè)即可。
還有一些架構(gòu)設(shè)計(jì)人員喜歡創(chuàng)造一些與眾不同的概念,讓人看上去顯得高深莫測。我覺得如果一個(gè)架構(gòu)師能夠用最少的語言、文字把問題和方案講清楚,那才是真正的有水平!你讓人暈頭轉(zhuǎn)向的時(shí)間既是項(xiàng)目的成本,因此,我們創(chuàng)造概念詞匯的時(shí)候,需要從涉眾的角度出發(fā),我這里的意思不是盲從涉眾語言詞匯,而是說出發(fā)點(diǎn)從涉眾角度出發(fā),如果涉眾原本使用的語言不夠準(zhǔn)確,我們可以跟他們一起探討,定義更合適的概念詞匯。
還有一個(gè)就是對軟件競爭力的認(rèn)識。有人通過包裝一堆玄玄乎乎的概念來顯得很高深莫測,試圖通過這種方式讓人覺得有競爭力,我認(rèn)為,競爭力首先是要跟對手比,其次一定是涉眾能感知的,能夠涉眾帶來正向價(jià)值的,比如省多少成本,端到端業(yè)務(wù)流程節(jié)約多少時(shí)間。
我認(rèn)為遵循一個(gè)科學(xué)的架構(gòu)設(shè)計(jì)過程跟上篇提到的軟件架構(gòu)4+1視圖法是架構(gòu)設(shè)計(jì)的兩個(gè)法寶,一個(gè)指導(dǎo)思維、定義輸出,另一個(gè)指導(dǎo)如何來做,相輔相成,確保架構(gòu)設(shè)計(jì)人員全面而正確的理解需求,做好需求平衡、設(shè)計(jì)平衡,設(shè)計(jì)出實(shí)用的、能落地的架構(gòu)。
下面我會按順序講解架構(gòu)設(shè)計(jì)的過程,以及每個(gè)步驟具體要做的事情。
3.1 確定涉眾
一般來講,涉眾包括客戶(資方)、承接方(勞方)、用戶。我們通常找到代表某一類型的涉眾群體的代表人:客戶代表、勞方代表、用戶代表等。訪談的時(shí)候直接找代表進(jìn)行。
3.2 確定系統(tǒng)邊界
對于要明確實(shí)現(xiàn)某種標(biāo)準(zhǔn)的軟件系統(tǒng),通常確定邊界非常容易,直接按標(biāo)準(zhǔn)圈定的scope分析即可,比如像SIPServlet容器,是要求遵從JSR168規(guī)范的,那么軟件系統(tǒng)的Scope就是JSR168規(guī)定的Scope,但是也有例外,比如客戶或者勞方明確指定要復(fù)用一個(gè)現(xiàn)有的實(shí)現(xiàn)了部分功能的系統(tǒng)或組件,那么Scope就不同了。對于沒有標(biāo)準(zhǔn)的軟件系統(tǒng),就需要分別訪談客戶代表、承接方代表確定系統(tǒng)邊界。為什么要訪談承接方代表呢?因?yàn)槌薪臃酱硗莿诜筋I(lǐng)導(dǎo),領(lǐng)導(dǎo)肩負(fù)企業(yè)戰(zhàn)略達(dá)成的使命,很有可能對系統(tǒng)提出比客戶更多的要求。舉個(gè)例子,某客戶需要一個(gè)SIP通信協(xié)議棧,以實(shí)現(xiàn)三方通話的業(yè)務(wù),但是勞方領(lǐng)導(dǎo)認(rèn)為,后續(xù)ICT融合是趨勢,我們構(gòu)建的系統(tǒng)要支持ICT融合應(yīng)用部署和運(yùn)行,支持業(yè)務(wù)標(biāo)準(zhǔn)JSR168規(guī)范。
3.3 軟件需求收集
軟件需求可分為二類:
功能需求(即業(yè)務(wù)用例):描述Actor(用戶或系統(tǒng))可基于軟件系統(tǒng)做什么事,要符合什么業(yè)務(wù)規(guī)則;
非功能性需求又可分為兩類:
質(zhì)量屬性:質(zhì)量屬性指軟件系統(tǒng)的品質(zhì),可分為運(yùn)行期質(zhì)量屬性與開發(fā)期質(zhì)量屬性。
運(yùn)行期質(zhì)量屬性包括
(1)性能:性能是指軟件系統(tǒng)及時(shí)提供相應(yīng)服務(wù)的能力。具體而言,性能包括速度、吞吐量和持續(xù)高速性這三方面的要求。
?。?)安全性:指軟件系統(tǒng)同時(shí)兼顧向合法用戶提供服務(wù),又阻止非授權(quán)使用功能的能力。
?。?)易用性:指軟件系統(tǒng)易于使用的程度。
?。?)可用性:可用性與易用性不相同??捎眯灾赶到y(tǒng)長時(shí)間無故障運(yùn)行的能力。
?。?)可伸縮性:指當(dāng)用戶增加時(shí),軟件系統(tǒng)維持高服務(wù)質(zhì)量的能力。
?。?)互操作性:指本軟件系統(tǒng)與其他系統(tǒng)交換數(shù)據(jù)和相互調(diào)用服務(wù)的難易程度。
(7)可靠性:軟件系統(tǒng)在一定時(shí)間內(nèi)無故障運(yùn)行的能力。
?。?)健壯性:也稱容錯(cuò)性。是指軟件系統(tǒng)在異常情況仍能夠正常運(yùn)行的能力。
開發(fā)期質(zhì)量屬性包括:
(1)易理解性:是指系統(tǒng)設(shè)計(jì)能被開發(fā)人員理解的難易程度。
?。?)可擴(kuò)展性:為適應(yīng)新需求或者需求變化,為軟件增加功能的能力。有些時(shí)候,稱之為靈活性。
?。?)可重用性:重用軟件系統(tǒng)或其中一部分的能力的難易程度。
?。?)可測試性:對軟件測試以證明其滿足需求規(guī)約的難易程度。在實(shí)際的項(xiàng)目中,主要指進(jìn)行單元測試等難易程度。
?。?)可維護(hù)性:修改Bug,增加功能,提高質(zhì)量屬性。
(6)可移植性:將軟件系統(tǒng)從一個(gè)運(yùn)行環(huán)境轉(zhuǎn)移到另一個(gè)不同的運(yùn)行環(huán)境的難易程度。
約束:規(guī)定開發(fā)軟件系統(tǒng)時(shí)必須遵循的限制條件,如要基于什么操作系統(tǒng),要基于什么開發(fā)語言等等。
對于功能需求,可找系統(tǒng)的直接使用用戶代表,對其進(jìn)行訪談,收集其要基于系統(tǒng)做的事情,可按照標(biāo)準(zhǔn)的用例模板,在訪談的過程中引導(dǎo)用戶代表。之后,繪制業(yè)務(wù)用例視圖,并針對每個(gè)業(yè)務(wù)用例,使用標(biāo)準(zhǔn)的用例模板將功能需求編檔,通常叫用例規(guī)約。
對于非功能性需求,可找軟件系統(tǒng)的涉眾,依據(jù)下面的模板,引導(dǎo)涉眾,收集其對相應(yīng)質(zhì)量屬性的要求:
總結(jié):本階段需要輸出業(yè)務(wù)用例視圖,業(yè)務(wù)用例規(guī)約,非功能性需求。
待續(xù)。。。