聊聊架構(gòu)設(shè)計(jì)做些什么再談如何成為架構(gòu)師
一、架構(gòu)的定義
在軟件開(kāi)發(fā)領(lǐng)域,自從架構(gòu)這個(gè)詞被廣泛傳播之后,產(chǎn)生的架構(gòu)模式也非常多,架構(gòu)關(guān)注點(diǎn)也在增加。但回到“道”的層面,架構(gòu)的定義或者說(shuō)本質(zhì)還是:
架構(gòu),又名軟件架構(gòu),是有關(guān)軟件整體結(jié)構(gòu)與組件的抽象描述,用于指導(dǎo)大型軟件系統(tǒng)各個(gè)方面的設(shè)計(jì)。
——摘自《百度百科》
二、架構(gòu)是做什么?
很多做業(yè)務(wù)功能的增刪改查開(kāi)發(fā)感受到無(wú)趣的小伙伴常把做架構(gòu)想象成一片樂(lè)土,沒(méi)有嘈雜的業(yè)務(wù)聲音干擾,可以專(zhuān)心做一番牛X的技術(shù)。會(huì)把架構(gòu)單純的理解成,牛X的性能、牛X的TPS、高可用,支撐了多少PV等等。但是其實(shí)這些只是架構(gòu)很小的一部分,并不是全部。在互聯(lián)網(wǎng)時(shí)代之前都是C/S程序的天下,那個(gè)時(shí)候并沒(méi)有對(duì)性能等有像現(xiàn)在這樣的關(guān)注度,但是就已經(jīng)有架構(gòu)之說(shuō)了。
世上本無(wú)架構(gòu),只是由于團(tuán)隊(duì)越大越需要對(duì)整體的規(guī)則做約定,好讓大家往同一個(gè)方向發(fā)力,避免各自為戰(zhàn),產(chǎn)生大量的內(nèi)耗,所以才逐漸形成了架構(gòu)。這條路就是“世上本無(wú)路,只是因?yàn)樽叩娜硕嗔俗兂闪寺?rdquo;。
為什么說(shuō)一個(gè)軟件架構(gòu)是很重要的呢?當(dāng)我們的團(tuán)隊(duì)人數(shù)只有2、3個(gè)人,甚至只有1個(gè)人單槍匹馬的情況下,可能架構(gòu)凸顯的作用不是那么的明顯,但是如果團(tuán)隊(duì)大了之后相信下面的這些現(xiàn)象會(huì)比較常見(jiàn):
- 新上一個(gè)系統(tǒng),往往不是獨(dú)立存在的,一般都需要與現(xiàn)存的系統(tǒng)進(jìn)行交互,而需要集成交互的地方可能還很多,哪些集成是本系統(tǒng)需要實(shí)現(xiàn)的?同時(shí),一般會(huì)劃分為多個(gè)階段開(kāi)發(fā),怎樣界定系統(tǒng)的邊界呢?
- 軟件系統(tǒng)是一個(gè)由多個(gè)模塊組成的整體。因此當(dāng)上游開(kāi)發(fā)與我們負(fù)責(zé)的模塊銜接老是出問(wèn)題時(shí),自己再做更多的努力也無(wú)法扭轉(zhuǎn)上游模塊的質(zhì)量差帶來(lái)的負(fù)面效果。(我想大家這時(shí)候肯定是抓狂的。)
- 每次看到別人寫(xiě)的代碼,老覺(jué)得自己來(lái)寫(xiě)的話(huà)肯定不會(huì)這么寫(xiě)。比他寫(xiě)的更好。(我們做技術(shù)的,自我感覺(jué)良好是個(gè)常態(tài):)。)
- 在某些場(chǎng)景下,自己腦子里有多套方案來(lái)實(shí)現(xiàn),但是對(duì)孰優(yōu)孰劣沒(méi)太大感覺(jué),最終基本上就是拍腦袋選了一個(gè)。某塊代碼維護(hù)的次數(shù)多了,特別是中間由多個(gè)人接手過(guò)后,代碼風(fēng)格各異,難以理解。
- 相似的代碼在好幾個(gè)地方出現(xiàn),特別是一些非業(yè)務(wù)性的代碼,比如日志處理等。再甚是在大型的分布式系統(tǒng)中,不同子程序使用了不同的同類(lèi)型中間件,同樣導(dǎo)致維護(hù)成本大增。
- 在2個(gè)相依賴(lài)項(xiàng)目邊界處的設(shè)計(jì)產(chǎn)生了分歧,并且站在各自的角度看都有道理。
任何事物都是有兩面性的,并不是說(shuō)上面的這些問(wèn)題,我們通過(guò)架構(gòu)就要往另外一個(gè)極端去走。比如在大型的分布式系統(tǒng)中,不同子程序的確有必要在某些時(shí)刻選擇同類(lèi)型的其它中間件。如Kafka和RabbitMQ雖都是MQ,但在特定的場(chǎng)景下能發(fā)揮的價(jià)值是無(wú)法相互替代的。
所以我們做架構(gòu)有一點(diǎn)也是比較重要的,就是去Balance,選擇一個(gè)投入產(chǎn)出比***的方案。關(guān)于這點(diǎn)第四段中會(huì)多說(shuō)幾句。
除此之外,架構(gòu)的主要目的是為了讓大家往同一個(gè)方向,在同一個(gè)標(biāo)準(zhǔn)之上去發(fā)散擴(kuò)張。一是把控硬性的下限標(biāo)準(zhǔn),提高整體的最短版,二是提高上限水平位,也就是天花板位置,提供更大的發(fā)展空間。好比造一幢大樓,把框架結(jié)構(gòu)設(shè)計(jì)好搭好,讓大家形成一個(gè)共識(shí),什么是承重墻不能破壞,什么是創(chuàng)變空間可以自定義。在這樣的基礎(chǔ)下各自發(fā)展。這個(gè)看上去是個(gè)限制,但卻是做架構(gòu)最重要的任務(wù),所謂再多的文檔,再多的***實(shí)踐都比不上一條約束。降低復(fù)雜度、降低理解難度,是實(shí)實(shí)在在的收益。最怕的就是憑空假設(shè)帶來(lái)的過(guò)度浪費(fèi)。
更甚之,我們做架構(gòu)追求的理想國(guó)度是一個(gè)大家擁有一致共識(shí)的世界,架構(gòu)是大家都像吃飯喝水這樣習(xí)以為常的習(xí)慣。去理解或者接手其它人負(fù)責(zé)的項(xiàng)目的時(shí)候就好像是自己寫(xiě)的一樣。這個(gè)時(shí)候就消滅架構(gòu)了,就好比現(xiàn)在沒(méi)有人會(huì)教你如何吃飯一樣。(就當(dāng)YY一下吧:)。)
三、做架構(gòu)的***實(shí)踐
上面提到更多的是做架構(gòu)的目的,那么要做好架構(gòu),主要就是要做好抽象,做抽象的方式是類(lèi)比,做類(lèi)比的方式可以使用用例圖。所以建議大家多畫(huà)圖,通過(guò)畫(huà)圖來(lái)將大腦中抽象的結(jié)果直觀的體現(xiàn)在前面,再來(lái)進(jìn)一步分析合理性。主要推薦2種圖的類(lèi)別,一種就是前面提到的用例圖。如下圖:
另外一種是魯棒圖,如圖:
整個(gè)過(guò)程的主要目的是:
- 描述其與外部實(shí)體(系統(tǒng)和最終用戶(hù))的交互。
- 標(biāo)識(shí)系統(tǒng)和外部實(shí)體間的信息和控制流。