本文是的第十篇文章,作者將會(huì)重點(diǎn)談軟件拆分背后的原則和原理,對于我們每一個(gè)人來說,理解這些背后的原則,可以讓我們在復(fù)雜的情況下不再迷茫。如果我們每一個(gè)人在自己的能力范圍之內(nèi),嘗試往這個(gè)方向努力,真正的為軟件開發(fā)的環(huán)境帶來改變,這就善莫大焉了,這篇文章的目的也就達(dá)到了。
軟件需要拆分,這是眾所周知的。但是如何拆分,根據(jù)什么原則拆分,則眾說紛紜,各有各的道理。甚至有人認(rèn)為把架構(gòu)一步到位的做好是不是更好?還有很多人根據(jù)自己的經(jīng)驗(yàn)從技術(shù)的角度去進(jìn)行主動(dòng)拆分。因?yàn)閺募夹g(shù)上講,每個(gè)人對技術(shù)的理解都不太一樣,都有自己的側(cè)重點(diǎn)和道理,拆的方案都是符合自己的利益的。
“別人”的問題能否得到很好的解決呢?是不是反而拆出來更多的問題,導(dǎo)致更加惡化?在實(shí)際的操作過程中我們更多看到的是:系統(tǒng)遇到瓶頸,被迫加班加點(diǎn)的進(jìn)行拆分,并把這個(gè)叫做架構(gòu)的演化。以下打算探討一下軟件拆分的原則和方法,可以把本篇看做的進(jìn)一步細(xì)化,請大家結(jié)合起來閱讀。
軟件拆分的原動(dòng)力
軟件架構(gòu)拆分的原動(dòng)力實(shí)際上是來源于業(yè)務(wù)本身的切分所形成的組織架構(gòu)。這個(gè)似乎比較難理解,我們先從業(yè)務(wù)本身分析。業(yè)務(wù)的組織架構(gòu)是怎么形成的呢? 業(yè)務(wù)組織架構(gòu)的背后原動(dòng)力,如架構(gòu)漫談第四篇所說,是每個(gè)人的負(fù)載超限。這個(gè)負(fù)載主要是人的時(shí)間不夠,無法在一個(gè)人有限的時(shí)間內(nèi)完成大量的業(yè)務(wù),就只能把整個(gè)工作的大的生命周期,切分為小的生命周期,形成一個(gè)樹狀架構(gòu),授權(quán)給具備不同專業(yè)技能的人對各自所負(fù)責(zé)的生命周期負(fù)全責(zé)。
而分拆的人則成為了整個(gè)組織的領(lǐng)導(dǎo),負(fù)責(zé)把各個(gè)子生命周期的運(yùn)行結(jié)果組合為自己的產(chǎn)出,這樣他一個(gè)人在相同時(shí)間內(nèi)的產(chǎn)出就放大了許多倍。比如一個(gè)公司剛開始時(shí),CEO一個(gè)人處理所有業(yè)務(wù)。這個(gè)時(shí)候客戶比較少,問題還不大。
當(dāng)業(yè)務(wù)逐漸上來,客戶量和業(yè)務(wù)規(guī)模逐漸上來的時(shí)候,CEO一個(gè)人就不可能做所有的事情了,自然就把他自己做的所有的事情(也就是整個(gè)公司運(yùn)營的生命周期),切分為更小的生命周期,分配給不同的專業(yè)的人來運(yùn)營,形成一個(gè)樹狀的架構(gòu):
當(dāng)然,每個(gè)專業(yè)領(lǐng)域還可以把自己的生命周期細(xì)分解成更小的生命周期,以提升自己的生產(chǎn)力。但是當(dāng)增長到一定程度的時(shí)候,溝通成本就成了主要的損耗,不可能無限的增長下去。所以引入軟件系統(tǒng)來提升生產(chǎn)力就順理成章了。軟件實(shí)際是扮演一個(gè)替代人的作用,把很多人做的事情,交給軟件來做。如果業(yè)務(wù)人員能夠進(jìn)行軟件開發(fā),那么這是最好的(未來應(yīng)該是一個(gè)趨勢),他們自行把自己的職責(zé)自動(dòng)化,就可以提升自己的生產(chǎn)力。但是實(shí)際情況是,軟件開發(fā)門檻還是很高,所以必須成立獨(dú)立的軟件開發(fā)團(tuán)隊(duì)來服務(wù)于業(yè)務(wù)人員。
以上看起來好像說的是傳統(tǒng)企業(yè)采用軟件的過程,但實(shí)際上是想說明企業(yè)背后架構(gòu)發(fā)展的邏輯,并非特指傳統(tǒng)企業(yè)。互聯(lián)網(wǎng)企業(yè)的發(fā)展也是一樣的,和傳統(tǒng)企業(yè)的區(qū)別在于,互聯(lián)網(wǎng)企業(yè)一開始就專注于采用軟件來提升生產(chǎn)力,業(yè)務(wù)團(tuán)隊(duì)的增長往往會(huì)慢于軟件體系的增長。因?yàn)檐浖?qiáng)大,業(yè)務(wù)人的生產(chǎn)力提高的非??欤恍枰罅康臉I(yè)務(wù)人員投入,但需要大量的軟件開發(fā)投入。但是絕對不可以因?yàn)闆]有經(jīng)歷無軟件的純業(yè)務(wù)期,而忽視業(yè)務(wù)團(tuán)隊(duì),放棄以業(yè)務(wù)為中心。因?yàn)檐浖菫槿朔?wù)的,是為業(yè)務(wù)服務(wù)的,先有人,有業(yè)務(wù),才有軟件,這個(gè)次序絕對不可以顛倒。沒有人,軟件就失去了模擬的目標(biāo),軟件就沒有價(jià)值了。
軟件開發(fā)團(tuán)隊(duì)的拆分
因?yàn)樾枰褬I(yè)務(wù)部門提出的需求用軟件來實(shí)現(xiàn),自然需要建立軟件開發(fā)團(tuán)隊(duì)。那么對于不同的業(yè)務(wù)團(tuán)隊(duì)提出的需求,軟件開發(fā)團(tuán)隊(duì)又應(yīng)該如何分工組織來應(yīng)對呢?我們分幾種情況來分析:
情況1, 多個(gè)業(yè)務(wù)團(tuán)隊(duì)對應(yīng)一個(gè)軟件開發(fā)團(tuán)隊(duì)。
在這種情況下,很容易就出現(xiàn)軟件開發(fā)團(tuán)隊(duì)中的某些人會(huì)處理多個(gè)不同業(yè)務(wù)團(tuán)隊(duì)的問題,進(jìn)而就很容易導(dǎo)致多個(gè)不同業(yè)務(wù)團(tuán)隊(duì)的需求,以省力或者重用的理由,全部或者部分的整合在了同一個(gè)軟件中。這樣就會(huì)導(dǎo)致這些業(yè)務(wù)部門都在提需求的時(shí)候,軟件開發(fā)團(tuán)隊(duì)內(nèi)部之間,軟件開發(fā)團(tuán)隊(duì)和業(yè)務(wù)部門之間,會(huì)產(chǎn)生大量的互相依賴,干擾,扯皮,也會(huì)產(chǎn)生大量的會(huì)議,降低整個(gè)團(tuán)隊(duì)的效率。最終這些軟件之間的依賴狀況會(huì)變得錯(cuò)綜復(fù)雜,軟件上線也會(huì)變成一個(gè)純靠運(yùn)氣的活了。
情況2,一個(gè)業(yè)務(wù)團(tuán)隊(duì)對應(yīng)多個(gè)軟件開發(fā)團(tuán)隊(duì)。
在這種情況下,業(yè)務(wù)團(tuán)隊(duì)必須要自行對業(yè)務(wù)需求拆分,以便給到相應(yīng)的開發(fā)團(tuán)隊(duì)。而業(yè)務(wù)團(tuán)隊(duì)一般都不具備這個(gè)能力,只能同時(shí)和多個(gè)軟件開發(fā)團(tuán)隊(duì)一起開會(huì)討論,同樣會(huì)有很多的溝通,扯皮。并且這種溝通是持續(xù)的,每次調(diào)整都需要所有團(tuán)隊(duì)來開會(huì),效率非常的低下。并且初期的分工所形成的職責(zé)切分,隨著溝通的進(jìn)展,會(huì)變得越來越模糊,最終也會(huì)變成和情況1類似的情況,軟件的之間的依賴狀況會(huì)變的錯(cuò)綜復(fù)雜,軟件上線也變成了運(yùn)氣活,要燒香求神了。
情況3,一個(gè)業(yè)務(wù)團(tuán)隊(duì)對應(yīng)一個(gè)軟件開發(fā)團(tuán)隊(duì)。
這樣每個(gè)業(yè)務(wù)部門都有獨(dú)立的軟件開發(fā)團(tuán)隊(duì)來配合。這些軟件開發(fā)團(tuán)隊(duì)只對應(yīng)一個(gè)業(yè)務(wù)團(tuán)隊(duì),所形成的軟件邊界都很清楚,溝通也很高效,業(yè)務(wù)團(tuán)隊(duì)和對應(yīng)的軟件開發(fā)團(tuán)隊(duì)能夠形成合力,共同解決該團(tuán)隊(duì)的業(yè)務(wù)問題。這實(shí)際上形成的還是一顆樹。
由以上對比可見,情況3是最好的狀況。每個(gè)業(yè)務(wù)部門形成了一個(gè)軟件開發(fā)團(tuán)隊(duì),這個(gè)軟件開發(fā)團(tuán)隊(duì)為這個(gè)部門生成相應(yīng)的軟件,提升該部門的價(jià)值。當(dāng)然,如果業(yè)務(wù)團(tuán)隊(duì)內(nèi)部劃分為多個(gè)子團(tuán)隊(duì),軟件開發(fā)團(tuán)隊(duì)也一樣劃分相應(yīng)的內(nèi)部子團(tuán)隊(duì),一一對接,生成相應(yīng)的軟件。從這個(gè)意義上來說,軟件開發(fā)團(tuán)隊(duì)其實(shí)應(yīng)該是和業(yè)務(wù)部門在同一個(gè)部門的。當(dāng)業(yè)務(wù)組織發(fā)生變化的時(shí)候,軟件開發(fā)部門也應(yīng)該要有相應(yīng)的變化,否則就會(huì)變成情況1或者情況2的結(jié)果了。這就是業(yè)務(wù)組織架構(gòu)對開發(fā)團(tuán)隊(duì)組織架構(gòu)的影響,順從這個(gè)影響,溝通協(xié)作就會(huì)很順。反之則需要大量的資源來糾正這些問題,表現(xiàn)出來就是沖突頻繁,內(nèi)耗嚴(yán)重,每個(gè)人都很累,但是成效都不大。
軟件的拆分
同樣,軟件是軟件團(tuán)隊(duì)的產(chǎn)出物(軟件:是指一個(gè)可以單獨(dú)部署運(yùn)行的完整產(chǎn)出物,組件:軟件的組成部分,一般是一個(gè)獨(dú)立開發(fā)的單元,不可以單獨(dú)運(yùn)行。軟件可以由一個(gè)或多個(gè)組件組成,形成一顆依賴樹),對于軟件開發(fā)團(tuán)隊(duì)和軟件的關(guān)系,也有以下三種情況:
情況1, 多個(gè)軟件開發(fā)團(tuán)隊(duì)開發(fā)同一個(gè)軟件。這時(shí)對代碼的分支合并的管理要求就非常高,經(jīng)常會(huì)發(fā)生互相把對方的代碼沖掉的情況,導(dǎo)致嚴(yán)重的線上事故。當(dāng)這個(gè)軟件需求比較多的時(shí)候,就會(huì)導(dǎo)致排隊(duì)上線的情況,拖慢對業(yè)務(wù)的響應(yīng)。
情況2, 一個(gè)軟件開發(fā)團(tuán)隊(duì)開發(fā)多個(gè)軟件。軟件開發(fā)團(tuán)隊(duì)內(nèi)部很難形成明確的分工,導(dǎo)致一個(gè)人會(huì)同時(shí)修改多個(gè)軟件,這樣就會(huì)導(dǎo)致同一個(gè)需求,在既可以放在A,也可以放在B的情況下,讓多個(gè)軟件的邊界變得非常模糊,形成不恰當(dāng)?shù)囊蕾嚒?/div>
情況3,一個(gè)軟件開發(fā)團(tuán)隊(duì)開發(fā)一個(gè)軟件。這樣每個(gè)軟件的職責(zé)非常明確,溝通也會(huì)比較簡單,這是最好的狀況。這時(shí)形成的還是一顆樹。軟件和軟件之間的關(guān)系,反應(yīng)的就是組織和組織之間的關(guān)系,還是一顆樹。
當(dāng)軟件開發(fā)團(tuán)隊(duì)發(fā)生拆分時(shí),軟件也需要響應(yīng)的拆分,否則就會(huì)變成情況1。當(dāng)開發(fā)團(tuán)隊(duì)發(fā)生合并時(shí),這個(gè)時(shí)候比較難處理,因?yàn)檐浖灰欢ê喜ⅲ菀鬃兂汕闆r2。所以一般軟件團(tuán)隊(duì)開始合并時(shí),往往都是比較亂的。這個(gè)時(shí)候一定要確保內(nèi)部的原有分工得以保持。
在軟件開發(fā)團(tuán)隊(duì)內(nèi)部,精確到每個(gè)人的分工也是一樣的道理,一個(gè)組件根據(jù)內(nèi)部的分工(參見第八篇)可以分成不同的職責(zé),有負(fù)責(zé)業(yè)務(wù)的開發(fā),也有負(fù)責(zé)技術(shù)的開發(fā),這同樣就導(dǎo)致了組件的分拆,這里限于篇幅,就不一一展開了。所以從軟件團(tuán)隊(duì)到人,人到組件,形成的還是一顆樹。軟件和組件,組件和組件之間,形成的也是一顆樹。
軟件開發(fā)的基礎(chǔ)技術(shù)方面
當(dāng)軟件開發(fā)進(jìn)行到一定的程度,每個(gè)部門的軟件開發(fā)團(tuán)隊(duì)都會(huì)發(fā)現(xiàn)很多開發(fā)方面共通的東西,因?yàn)榇蠹沂窃谕粋€(gè)公司,大家的東西都是放在同一個(gè)網(wǎng)站上的,這時(shí)站在整個(gè)公司的層面,就會(huì)有很多大家都要共同遵守的東西出現(xiàn)。為了避免每個(gè)團(tuán)隊(duì)都重復(fù)發(fā)明輪子,這個(gè)時(shí)候整個(gè)公司的軟件開發(fā)團(tuán)隊(duì)也會(huì)產(chǎn)生統(tǒng)一的規(guī)則和相應(yīng)的分工:
同樣都面臨的技術(shù)問題,比方說UED、日志、流量分流、基礎(chǔ)框架、運(yùn)維等,會(huì)專門有獨(dú)立的團(tuán)隊(duì)來負(fù)責(zé),這樣開發(fā)團(tuán)隊(duì)就分成了專門服務(wù)于業(yè)務(wù)的軟件開發(fā)團(tuán)隊(duì)和專門服務(wù)于技術(shù)的軟件開發(fā)團(tuán)隊(duì)。
如果是共享運(yùn)維團(tuán)隊(duì),那么還需要同樣的開發(fā)流程保障,也會(huì)有獨(dú)立的團(tuán)隊(duì)來服務(wù)于各軟件開發(fā)團(tuán)隊(duì)。
所以業(yè)務(wù)軟件開發(fā)團(tuán)隊(duì)就變成了這些技術(shù)軟件開發(fā)團(tuán)隊(duì)的業(yè)務(wù)方,也需要相應(yīng)的組織架構(gòu)來處理業(yè)務(wù)軟件開發(fā)團(tuán)隊(duì)提出的需求,也是一個(gè)樹狀結(jié)構(gòu)。這樣以技術(shù)為導(dǎo)向的同學(xué),就知道自己是處在架構(gòu)的什么位置,就不會(huì)有那么多關(guān)于技術(shù)和業(yè)務(wù)關(guān)系的困惑。
對于CEO而言,需要一個(gè)CTO來輔助CEO管理軟件方面的事務(wù),管理軟件開發(fā)團(tuán)隊(duì)的分工,對于業(yè)務(wù)軟件開發(fā)團(tuán)隊(duì)所共同面臨的問題,建立相應(yīng)的內(nèi)部分工,形成軟件開發(fā)內(nèi)部團(tuán)隊(duì),配合業(yè)務(wù)軟件開發(fā)團(tuán)隊(duì)進(jìn)行工作。這樣就形成了如下的組織架構(gòu)和軟件架構(gòu):
以上就是業(yè)務(wù)組織架構(gòu)的拆分,如何決定軟件開發(fā)團(tuán)隊(duì)的組織架構(gòu),進(jìn)而決定軟件的組織架構(gòu)。軟件開發(fā)團(tuán)隊(duì)又進(jìn)行內(nèi)部的分工,分為業(yè)務(wù)和技術(shù)兩類,軟件則分解形成了不同的組件,落實(shí)到每個(gè)研發(fā)人員的身上,形成樹狀的關(guān)系。換句話說,軟件架構(gòu)–把軟件看成虛擬的人–實(shí)際就是虛擬人的組織架構(gòu)。架構(gòu)拆分的原則就來自于業(yè)務(wù)自身的組織架構(gòu),使得軟件架構(gòu)保持和業(yè)務(wù)組織架構(gòu)的匹配關(guān)系。
如果不認(rèn)識(shí)到這么深遠(yuǎn)的影響來源,我們在進(jìn)行軟件開發(fā)活動(dòng)的時(shí)候,一定會(huì)遇到很多的麻煩:關(guān)系錯(cuò)綜復(fù)雜,難以理清,失去控制。一旦從源頭入手整理,一切都清楚了。如果新接手一個(gè)團(tuán)隊(duì),搞清楚這些也有利于快速展開工作,并可以在自己的范圍之內(nèi),嘗試調(diào)整好這些關(guān)系。對于領(lǐng)導(dǎo)而言,調(diào)整好這些關(guān)系,事半功倍。
軟件拆分的第二動(dòng)力
前面我們已經(jīng)知道,按照業(yè)務(wù)組織架構(gòu),軟件分拆為相應(yīng)的架構(gòu)。我們就可以把軟件當(dāng)成一個(gè)虛擬的人,把軟件認(rèn)識(shí)為虛擬人的組織架構(gòu)。當(dāng)軟件上線后,軟件就有了身體,成了一個(gè)”真實(shí)”的人。當(dāng)流量進(jìn)來之后,軟件就開始服務(wù)于用戶的請求。隨著流量的增大,軟件就會(huì)遇到和人同樣的問題,一臺(tái)機(jī)器的負(fù)載有限,那么就開始增加機(jī)器來增加處理能力,或者一個(gè)軟件開發(fā)團(tuán)隊(duì)的需求量過多,就開始分拆團(tuán)隊(duì),進(jìn)而分拆軟件,這就是scale out。
但是當(dāng)機(jī)器達(dá)到一定的量之后,仍然會(huì)遇到瓶頸,這個(gè)時(shí)候就會(huì)開始考慮對軟件進(jìn)行進(jìn)一步的分拆。此時(shí)就需要分析業(yè)務(wù)的場景,把該軟件所處理的業(yè)務(wù)分拆成一個(gè)樹狀結(jié)構(gòu),分散對機(jī)器的壓力。這個(gè)樹狀結(jié)構(gòu)就是該軟件所形成的子樹,同時(shí)也不能違背之前所述的組織架構(gòu)拆分原則。
綜上來看,影響軟件分拆的動(dòng)力都是流量的增長,也就是希望單位時(shí)間內(nèi)可以處理更多的業(yè)務(wù)。一方面流量增長導(dǎo)致了業(yè)務(wù)本身的拆分,進(jìn)一步導(dǎo)致了軟件的拆分;另一方面,某個(gè)軟件本身流量的增長也會(huì)導(dǎo)致該軟件自身的拆分。根本問題都在流量的增長上。從這個(gè)角度來看,流量增長是企業(yè)都追求的目標(biāo),只有更多的流量,業(yè)務(wù)才能夠做大,良好的架構(gòu)是流量增長的保證。
架構(gòu)一步到位?
很多人就會(huì)說這太麻煩了,可不可以把軟件架構(gòu)一步到位地做好?基本上這是不太可能的。一方面在流量不大的時(shí)候,做太復(fù)雜的拆分會(huì)浪費(fèi)大量時(shí)間和不必要的成本;更重要的是因?yàn)榱髁渴峭庠诘囊蛩?,有?jīng)驗(yàn)的人可以做出部分預(yù)判,但也沒有辦法完全預(yù)測流量會(huì)在哪個(gè)地方增長。所以既沒必要一步到位,也不可能一步到位。只能結(jié)合運(yùn)維和運(yùn)營,及時(shí)地探測到流量的增長,在流量達(dá)到瓶頸之前,根據(jù)業(yè)務(wù)的規(guī)律進(jìn)行合理的拆分,幫助快速的應(yīng)對增長。同樣,我不把這叫做架構(gòu)演化,因?yàn)闃I(yè)務(wù)并沒有發(fā)生變化,只是流量增長,把這叫做軟件的長大可能會(huì)更合適一點(diǎn)。
以上所說的是軟件拆分背后的原則和原理,也可以說是一個(gè)理想情況?,F(xiàn)實(shí)工作中我們遇到的往往和這個(gè)理想情況差距很大。對于我們每一個(gè)人來說,理解這些背后的原則,可以讓我們在復(fù)雜的情況下不再迷茫。如果我們每一個(gè)人在自己的能力范圍之內(nèi),嘗試往這個(gè)方向努力,真正的為軟件開發(fā)的環(huán)境帶來改變,這就善莫大焉了,這篇文章的目的也就達(dá)到了。
第三十四屆CIO班招生
北達(dá)軟EXIN網(wǎng)絡(luò)空間與IT安全基礎(chǔ)認(rèn)證培訓(xùn)
北達(dá)軟EXIN DevOps Professional認(rèn)證培訓(xùn)
責(zé)編:yangjun
免責(zé)聲明:本網(wǎng)站(http://www.www.gypb.net/)內(nèi)容主要來自原創(chuàng)、合作媒體供稿和第三方投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請進(jìn)一步核實(shí),并對任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
本網(wǎng)站刊載的所有內(nèi)容(包括但不僅限文字、圖片、LOGO、音頻、視頻、軟件、程序等)版權(quán)歸原作者所有。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),請及時(shí)通知本站,予以刪除。