什麼是架構?為什麼做架構?架構師需要做什麼?
好比我們要定義一個概念:
1. 首先定義邊界和範疇,我們近似的稱為系統
2. 再次根據自身認知把指定範疇劃分為指定的抽象,也即組成系統的元素
3. 最後我們定義元素之前的聯絡和系統(整體)元素(區域性)的規範和約束
架構的定義
恰如其分的軟體架構
開發者無法平添智慧,隨著業務的開展和複雜度的提高,開發者面臨共同的難題:是解決昨日之難題,還是準備與明日一戰?
所以他們只能升級自身的作戰武器和作戰方式以應對更大規模和更高複雜度的系統
軟體架構就是軟體系統的巨集觀設計
自組織,自架構,自下而上(類似碎行)
巨集觀架構,自上而下(規則與約束)
軟體架構就是無形的武器,是知識和智慧的傳承
軟體開發的有形武器:IDE,程式語言,整合的開發環境
軟體開發的無形武器:抽象思維,透過現象看本質,把物件的原始感知,轉換成對目前局勢與情景的簡明扼要的理解,並根據自己的經驗和思考,遵循事務的規律和週期指導自身行動繼而達到自身事半功倍的效果
軟體架構正式這樣的武器,它幫助我們解決軟體系統開發過程中因規模增長和複雜度增長帶來的問題,幫助我們定義軟體系統的整體與部分關係, 它幫助開發者按部就班的構建那些之前需要大師才能完成的系統,基於知識和實踐的智慧傳承,並不是要扼殺創造力,而是使開發者可應用其創造力去構建更大規模和複雜度的系統
程式碼大全
架構是需求明確後,為了正確的解決問題,做出的從頂層到底層的結構和約束的設計
廣聯達
架構,是對某項複雜事物的結構性規劃。
軟體架構,則是從巨集觀上對一套復 雜的軟體系統的組成與特性的結構性規劃。軟體架構用來處理軟體高層次結構的 設計和實施,它以精心選擇的形式將若干結構元素進行裝配,從而滿足系統主要 功能和效能需求,並滿足其他非功能性需求,如可靠性、可伸縮性、可移植性和 可用性等。
從全域性、巨集觀的角度思考整個軟體系統, 像城市規劃師一樣規劃複雜的軟體系統,並識別軟體系統開發過程中的各類風險
軟體架構的幾大武器:分治,知識,抽象,可演化
分治
如何定義一個系統,如何定義部分與整體
解決複雜度和規模問題的有效策略,分治需要滿足兩個條件
1. 分割各部分足夠小一邊單個人就能解決他們,類似自組織和自我類似
2. 考慮如何將各部分組裝為一個整體,向下打散,向上聚合,軟體開發的組織方式和其他組織都有類似,都需要考慮,中心和地方,核心與區域性的定義以及聯絡方式
這裡引用一下《微服務架構設計模式》中系統的定義: 在既定的範疇內,被定義組成元素,以及元素之前的聯絡
被封裝的部分越容易理解,將各部分組成為整體時細節就越少就越簡單(元素定義),這可以幫助我們更好的推斷和設計個部分之間的協作方式(元素聯絡)
知識
實踐中的來的知識,用來指導自己更好的解決顯示中的問題
最佳實踐,覆盤總結,資料,演講,原始碼,設計文件,白板草圖......
抽象
抽象能夠精簡問題空間,問題越小越好理解,因而能夠有效的解決複雜度及規模帶來的問題
抽象其實是對系統組成元素的定義,越是簡單就越是能夠更好的定義各個元素的功能,就越容易定義推斷和設計元素之間的協作方式,就越便捷的能夠實現一個系統
現實中紛繁複雜的事物和規律 不管在生物界,動物界,其本質往往是簡單的規則重複,自我組織,自我類似,就好比水分子按固定的規則排列,最後形成了漂亮的雪花,具體請研究 碎行的概念,自組織的概念
可演化
包容變化,相容變化
http://www.uml.org.cn/zjjs/201807034.asp?artid=20908
架構設計不是靜態的,而是動態演化的。只有能夠不斷應對環境變化的系統,才是有生命力的系統。所以即使你掌握了抽象、分層和分治這三種基本思維,仍然需要演化式思維,在設計的同時,藉助反饋和進化的力量推動架構的持續演進
軟體架構內部成本與收益的博弈
質量屬性:可修改性,可伸縮性,延時時間
天下沒有免費的午餐,提升一種就會抑制另外一種,屬性之間會互相抵消的
我們拆分微服務,由中心到分散式,帶來的伸縮性提高了,但是就要承受可修改性降低,延遲時間增加,這裡想要表達的核心是,任何操作都是由成本的想獲取某方面的提升必然要付出其他方面的代價
概念模型
所謂概念模型,可以理解為最佳實踐,設計模式,等等,這些都是在特性場景下得出的關於質量屬性運用的一些模板和範例,是在實踐中形成的如何運用質量屬性的心得體會的總結,是一種對質量屬性如何運用在架構上的認知和預判
抽象與約束
抽象是元素定義,約束表述元素聯絡
架構由很多細小的部分組成,我們既要見微知著對某個方法進行實現,也要在系統層面對整體由一個設計,這樣簡單功能的部分才能和系統性的整體功能性的組合在一起
OKR 的上下約束,從上到下是約束,從下到上是對齊,整體對區域性元素是有約束,區域性元素到整體要有對齊,而簡單則會讓二者更牢固和更自然符合組織和結構的特性和定義
架構中我們設計的元件和模組是抽象,它們往往要有遵循嚴格的約束,實現一些列的介面繼承一系列的方法,施加這些約束是為了讓系統元素的聯絡更有預期,是系統的推導和設計更簡單,使思考問題的維度更確定,更簡單
軟體架構師是幹啥的?
《深度思考解密》王富強 老師,系統化思考章節的闡述
分與合描述的就是整體和部分,他們是一個整體,切勿之僅僅關注一個
分:靜態的區域性思考,抽象的幫我們聚焦的分析一個事物
分其實是為了簡化事物的理解,分了之後最終是要合,融合之後就可以幫助我們理解更為複雜的事物,分不是終點,而只是起點。
所以,讓自己首先學會包容和接納不同的意見和事物, 然後再分析和了解他們,並最終融合他們吧!
合:整體的動態思考,讓我們看清事物的全貌以及內外部的聯絡
我們要系統化思考,那麼就得儘可能將不同的事物納入到自己的思考體系中來,
連線是將不同的點和事物連線到一起形成更大層面的認知,
但是,如果納入自己思考體系的點和事物數量不夠大,得出來的思考也很大程度上是狹隘和偏頗的,所以,這就要求我們儘可能去了解更多的東西,然後納入到自己的思考體系中來
架構師是聯結器,C位
在軟體行業,技術專家是專業的人,負責精深鑽研某個領域的技術,而架構
師是負責連線的人,大家各自有各自的優勢,需要協同合作才能創造更大的成果。這其實跟公司的 CEO 作為組織者,將各種專業的人組織到一起來完成同一個願景是一個道理
架構師角色認知,最後借用一句話:從無到有的是架構;從表到裡的是抽象;從粗到細的是設計
像架構師一樣思考用價值找尋重心:先做哪些事情會比後做哪些事情更能創造收益。
像架構師那樣全域性性思考,把遇到問題進行抽象和分治,結合架構實踐和自身認知進行自上而下的包含約束的設計