上一篇文章《架構(gòu)由術至道的轉(zhuǎn)變(1)》已經(jīng)從“人”聘殖、“組織”瘪菌、“社會”三個方面講述了架構(gòu)的起源,為什么會產(chǎn)生架構(gòu)毫目,產(chǎn)生架構(gòu)的動力條件蔬啡,并分析了如何可以更好的做好架構(gòu),比如:概念認知镀虐、問題識別箱蟆、架構(gòu)切分,這些都是做好架構(gòu)最核心刮便、最實用的思維手段空猜,相信真正理解了這些道的含義,再到軟件行業(yè)進行架構(gòu)實踐恨旱,會更加的游刃有余辈毯。
其實軟件行業(yè)也是社會的一部分,社會是由人組成的搜贤,自然架構(gòu)最終是解決人的問題谆沃。有人的地方,便有了江湖仪芒,林子大了啥鳥都有唁影,江湖中也便起了紛爭,其實歸根結(jié)底還是人對自己利益最大化的訴求桌硫。不過在此強調(diào)下夭咬,人對利益最大化的訴求,不是產(chǎn)生架構(gòu)的必要條件铆隘,產(chǎn)生架構(gòu)必要條件可查看《架構(gòu)由術至道的轉(zhuǎn)變(1)》卓舵。
好了,那就讓我們來看下膀钠,在軟件行業(yè)中掏湾,架構(gòu)又是為何產(chǎn)生,又是解決人的什么問題肿嘲,最后再討論下融击,軟件行業(yè)的架構(gòu)是如何做的。
首先雳窟,我們要確認什么是軟件
軟件的歷史尊浪,實際上可以說是用機器模擬人的歷史匣屡。不管大家(包括在這個歷史過程中的參與者)有沒有意識到,我們都有意無意的在計算機上模仿人類的行為拇涤。
人們越來越愿意把原來只有人才能做的事情捣作,交給計算機來做。結(jié)果就導致軟件越來越豐富鹅士,能夠做的事情也越來越多券躁,成本也越來越低〉糁眩可以這么說也拜,成本是我們?yōu)槭裁床捎密浖闹饕獎恿Γ梢怨?jié)省大量的人員培訓趾痘,減少雇員的數(shù)目慢哈。隨著互聯(lián)網(wǎng)的發(fā)展,人類社會也開始軟件化了扼脐。
有了軟件之后岸军,實際上,我們是把我們?nèi)粘I钪兴龅氖虑橥呶辏ㄎ覀冏约罕救硕家黄鹛摂M化到了計算機中。而人則演化成了佣谐,通過計算機的輸入輸出設備肚吏,控制計算機中的自己,來完成日常的工作狭魂,以及與其他人的溝通罚攀。也就是說,軟件一直以來的動力雌澄,始終都是來模擬人和這個社會的斋泄。
不管如何發(fā)展,模擬人的所有行為都是一個大的趨勢镐牺。也就是說炫掐,軟件的主要目的,還是把人類的生活模擬化睬涧,提供更低成本募胃,高效率的新的生活。從這個角度來看畦浓,軟件主要依賴的還是人類的生活知識痹束。軟件更多的是扮演一個cost center,這也是為什么會出現(xiàn)很多的軟件代工讶请。
軟件架構(gòu)為何出現(xiàn)
軟件工程師是實現(xiàn)這個模擬過程的關鍵人物祷嘶,他必須先理解人是怎么在日常生活中完成工作的,才能夠很好的把這些工作在計算機中模擬出來÷畚。可是軟件工程師需要學習大量的計算機語言和計算機知識剿牺,還需要學習各行各業(yè)的專業(yè)知識。軟件工程師本身的培養(yǎng)就比較難环壤,同時行業(yè)知識也要靠時間的積累晒来,這樣就遠遠超出了軟件工程師的能力了。所以軟件開發(fā)就開始有分工了郑现,行業(yè)知識和業(yè)務的識別湃崩,會交給BA,系統(tǒng)的設計會交給架構(gòu)師接箫,設計的實現(xiàn)交給架構(gòu)師攒读,實現(xiàn)的檢驗交給測試,還有很多其他角色的配合辛友。為了組織這些角色的工作薄扁,還有項目經(jīng)理。這就把原來一個人的連續(xù)工作废累,拆分成了不同角色的人的連續(xù)配合邓梅,演化成了不同的軟件開發(fā)的模式。然后慢慢演變出專門為別人開發(fā)軟件的軟件公司邑滨。
一開始是懵懵懂懂的去寫軟件日缨,后來慢慢的就有意識的去切分,演變成了不同的架構(gòu)掖看。這個背后的動力也是一樣的匣距,就是提升參與的人的利益,降低成本哎壳。導火索也是軟件工程師的任務太重毅待,我們需要把很多工作拆分出來。拆分的原則也是一樣的归榕,如何讓權(quán)責一致尸红。同樣,這個拆分也是需要組織架構(gòu)的調(diào)整蹲坷,來保證架構(gòu)的落地驶乾。
以上通過簡單的描述計算機和軟件的發(fā)展歷史,闡明軟件的本質(zhì)循签,其實就是通過把人類的日常工作生活虛擬化级乐,減少成本,提升單個人員的生產(chǎn)力县匠,提升人類自己的利益风科。軟件工程師的職責在這個浪潮中撒轮,不堪重負,自然而然就分拆為不同的角色贼穆,形成了一個獨特的架構(gòu)體系题山。這一切的背后,仍然是為了提升人類自己的利益故痊,解決人類自己的問題顶瞳。
然后,確認軟件架構(gòu)解決的核心問題
如前所述愕秫,軟件實際上就是把現(xiàn)實生活模擬到計算機中慨菱,并且軟件是需要在計算機的硬件中運行起來的。在這個過程中戴甩,要做到這一點需要解決兩個問題:
- 業(yè)務問題
具體的現(xiàn)實生活狀態(tài)下符喝,沒有軟件的時候,所解決的問題的主體是誰甜孤,解決的是什么問題协饲,是如何解決,如何運作的缴川?- 計算機問題
(1)如何把現(xiàn)實生活用軟件來模擬茉稠?
(2)模擬出來的軟件,需要哪些硬件設施才能夠滿足要求二跋? 并且當訪問量越來越大的時候战惊,軟件能否支持硬件慢慢長大,性能線性擴展扎即?
(3)因為硬件是可能會失效的,軟件如何在硬件失效的情況下况凉,仍然能夠保證可用性谚鄙,讓用戶能夠不中斷的訪問軟件提供的服務?
(4)怎么收集軟件產(chǎn)生的數(shù)據(jù)刁绒,為下一階段的工作提供依據(jù)闷营?
然后,明確上面兩個核心問題主體
- 業(yè)務owner的問題知市,需要提升業(yè)務的效率傻盟,降低業(yè)務的成本,這是動機嫂丙,所以一般軟件開發(fā)的出發(fā)點就在這里娘赴。
- 軟件工程師的問題,要解決業(yè)務owner把業(yè)務虛擬化的問題跟啤,并且要解決軟件開發(fā)和運營的生命周期的問題诽表。
然后唉锌,明確分解上面兩個核心問題
業(yè)務問題的本質(zhì),是業(yè)務所服務的對象的利益問題竿奏,明白了這個袄简,就很容易搞清業(yè)務的概念和組織方式。再次強調(diào)一下泛啸,有了軟件绿语,可以降低業(yè)務的成本候址,沒有軟件的情況下,業(yè)務是一樣跑的宗雇。如果只是為了跟風要用軟件,說不定反而提高了成本赔蒲,這個是采用軟件之前首先要先搞清楚的。我們經(jīng)常說軟件和技術是業(yè)務的enabler舞虱,實際就是把原來成本很高的降到到了很低的程度而已,并不是有了什么新的業(yè)務矾兜。另外軟件也不是降低業(yè)務成本的唯一方式损趋。
為了能夠讓軟件很好的跑起來椅寺,軟件工程師必須理解業(yè)務所服務的對象,他們的利益所在桐玻,即業(yè)務問題荆萤。業(yè)務面對這些問題是如何分拆解決的? 涉及到了哪些概念偏竟? 這些概念分別解決了哪些哪些問題踊谋? 我們不能自己按照自己的理解儡陨,用自己的一套概念體系來表述量淌。如果這么做的話呀枢,會導致兩個問題:
業(yè)務無法和我們交流笼痛,因為他們無法明白我們所自己創(chuàng)建的概念,所以他們無法確認我們的理解是否正確摘刑。
我們所表述的東西,并沒有在實際生活中實踐過刻坊,我們也不知道這些概念是否能夠解決業(yè)務的問題枷恕。
- 軟件工程師還必須要考慮徐块,用什么樣的硬件把軟件跑起來灾而,怎樣跑得好旁趟,跑得快,并且可以隨著業(yè)務的流量逐漸的長大橙困?
分析解決分解后的問題
對于2耕餐,在有限的時間下蛾方,軟件工程師毫無疑問無法一個人去完成這么多事情桩砰,那么我們需要把所做的事情列出來释簿,進行分析:
- 虛擬化業(yè)務需要完成這些事情:
- 學習業(yè)務知識庶溶,認識業(yè)務所涉及的stakeholders的核心利益訴求懂鸵,以及業(yè)務是如何分拆滿足這些利益訴求匆光,并通過怎樣的組織架構(gòu)完成整個組織的核心利益的酿联,以及業(yè)務運作的流程贞让,涉及到哪些概念,有哪些權(quán)利和責任等续镇。
- 通過對業(yè)務知識的學習摸航,針對這些概念所對應的權(quán)利和責任以及組織架構(gòu)柴墩,對業(yè)務進行建模江咳,把并把建模的結(jié)果用編程語言實現(xiàn)。這是業(yè)務的模型爹土,通常是現(xiàn)實生活中利益斗爭的結(jié)果胀茵,是非常穩(wěn)定的挟阻。
- 學習業(yè)務所參與的stakeholder是如何和業(yè)務打交道附鸽,并完成每個人的權(quán)利和義務的,并通過編程語言熄浓,結(jié)合業(yè)務模型實現(xiàn)這些打交道的溝通通道赌蔑。這部分是變化最頻繁的,屬于組合關系跷乐。明白了這一點劈猿,對后續(xù)的實現(xiàn)非常有幫助潮孽。
- 如何把業(yè)務運行的結(jié)果往史,持久化,并通過合適的手段把持久化后的數(shù)據(jù)挨决,在合適的時間合適的地點加載出來脖祈。這部分和基礎設施有關刷晋,變化可能也會比較頻繁眼虱。
- 代碼如何運營,需要完成這些事情:
- 需要多少硬件設備來滿足訪問的需求撞蚕?
- 代碼要分成多少個組件部署到哪些硬件設備上甥厦?
- 這些代碼如何通過硬件設備互相連接在一起矫渔?
- 當業(yè)務流量增大到超過一臺機器的容量時摧莽,軟件能否支持通過部署到新增機器上的方式镊辕,擴大對業(yè)務的支撐?
- 當某臺或某些硬件設備失效時石咬,軟件是否仍然能夠不影響用戶的訪問鬼悠。
- 軟件運行產(chǎn)生的數(shù)據(jù)焕窝,能否支持提取出來并加以分析维贺,為下一輪的業(yè)務決策提供依據(jù)溯泣。
- 如果分成不同的角色來完成這些事情,就需要一個組織架構(gòu)來組織代碼的編寫和運營客给,需要做哪些事情:
- 完成一和二所列的這些事情靶剑,需要哪些角色參與抬虽?
- 這些事情基本都需要順序的發(fā)生纵菌,如何保證信息在不同角色的傳遞過程中不會有損失咱圆? 或者說即使有損失,也能快速糾正手幢?
- 這些角色之間是如何協(xié)調(diào)围来,才能共同完成虛擬化業(yè)務的需求监透?
最終,生成哪些架構(gòu)
如果業(yè)務足夠簡單院刁,用戶流量夠小退腥,時間要求也不急迫再榄,那么一個人不跟,一臺機器就夠了窝革,這個時候一般不會去討論架構(gòu)的問題。當訪問的流量越來越大瘪板,機器就會越來越多侮攀,代碼的部署單元就會拆分的越來越多厢拭。
同樣就會需要越來越多的人來完成拆分出來的越來越多的部署單元供鸠,甚至同一個部署單元也需要分拆為多人合作完成楞捂。但是我們需要注意到一點,整個的概念體系胶坠,或者說業(yè)務的建模不會有任何的變化沈善,還是完成同樣的這些事情矮瘟。唯一的區(qū)別就是量越來越大,超過了單個人和單個機器的容量,不斷地增長哨啃。這樣就會導致以下的架構(gòu):
- 當流量越來越大拳球,我們就會發(fā)現(xiàn)珍特,軟件所部署的機器就會開始按照樹狀的結(jié)構(gòu)開始分拆扎筒,就會形成硬件的部署架構(gòu)嗜桌。這就是為什么會形成部署的分層骨宠。
- 為了把業(yè)務在軟件中實現(xiàn)并落地,需要前端人員桦卒、業(yè)務代碼人員方灾、存儲層等不同技巧的人同時工作琳省,需要切分成代碼的架構(gòu)针贬。這就是為什么會形成代碼的分層桦他,形成代碼的架構(gòu)。當然圆仔,當這些角色由一個人來完成的時候坪郭,不一定會有代碼架構(gòu)歪沃,往往會比較亂沪曙。
- 當參與的人員越來越多,就會形成開發(fā)體系的組織架構(gòu)碳默。因為代碼開發(fā)的過程是一個連續(xù)的過程嘱根,會用流程來把不同的角色串聯(lián)起來儿子,這就是軟件工程砸喻。
- 為了完成業(yè)務的工作割岛,需要識別出來業(yè)務架構(gòu)和支撐業(yè)務的組織架構(gòu)癣漆,以及業(yè)務運作的流程惠爽。這是被虛擬化的業(yè)務架構(gòu)和組織架構(gòu),也需要體現(xiàn)在代碼中租副,保持和現(xiàn)實生活中一致用僧。
再談责循,何為軟件架構(gòu)
這就是軟件比較復雜的地方院仿,涉及到軟件本身的業(yè)務體系,和所虛擬的業(yè)務體系耸别。根據(jù)以上的分析,所生成的架構(gòu)若贮,究竟那些算是軟件架構(gòu)呢谴麦?
- 軟件因為流量增大而分拆成不同的運行單元匾效,在不同的機器上部署所形成的架構(gòu)恤磷,屬于軟件架構(gòu)扫步『犹ィ【部署架構(gòu)】
- 每個運行單元為了讓不同角色的人游岳,比如前端胚迫,業(yè)務,數(shù)據(jù)存儲等能夠并行工作摩骨,所分成的代碼架構(gòu)恼五,也屬于軟件架構(gòu)灾馒〔锹蓿【代碼架構(gòu)】
所以當我們說軟件架構(gòu)的時候容达,我們一定要講清楚,究竟說的是部署的架構(gòu)羡滑,還是代碼的架構(gòu)柒昏。軟件架構(gòu)的落地职祷,需要軟件的組織架構(gòu)和流程來保障有梆,離開了這個淳梦,軟件架構(gòu)是一句空話昔字。
另外很多人講作郭,架構(gòu)是進化出來的夹攒,但其實架構(gòu)是設計出來的咏尝,架構(gòu)的好壞體現(xiàn)于在進化過程中支撐業(yè)務高效運轉(zhuǎn)的生命周期。
架構(gòu)實際是為了在量不斷的增大扰才,超過了單臺服務器的容量衩匣,逐漸的分拆琅捏,同時導致超過單個人員的能力递雀,工作人員不斷的增多,工作內(nèi)容不斷的分拆的情況下杠输,仍然能夠良好地支撐業(yè)務流程高效運轉(zhuǎn)。這本身就是架構(gòu)的意義所在据忘。不管怎么分拆曼追,所達到的目標沒有任何變化汉规,就是完成業(yè)務在計算機中的虛擬化。