深入瞭解架構的本質
目前討論架構實操(術)的文章較多,討論架構理念(道)的較少,本文基於作者在大型電商系統架構方面的一些實踐和思考,和大家聊聊架構理念性的東西,希望能夠拋磚引玉,推進大家對架構的認識。
什麼是道,什麼是術?道是事物發展的本質規律,術是事物發展的具體途徑。規律只有一個,途徑很多,條條大路通羅馬,羅馬是道,大路是術。道為本,術為途,如果事先知道羅馬在哪裡,那麼遍地是路,路路相通。架構也是如此,如果能領悟架構的本質,就不會拘泥於現有的實踐和理論框框,而以最直接的方式解決問題,無招勝有招。本文的內容包括架構的本質、架構的服務物件、架構師能力模型 、架構境界等。
架構的本質
任何系統,自然情況下,都是從有序到無序,這是有科學依據的, 按照熱力學第二定律,自然界的一切自發過程都有方向性,一個孤立系統會由有序變為無序,即它的熵會不斷增加,最終寂滅。但生物可以通過和外界互動,主動進行新陳代謝,製造 “負熵” 來保證自身有序,繼續生存。
同樣,一個軟體系統隨著功能越來越多,呼叫量急劇增長,整個系統逐漸碎片化,越來越無序,最終無法維護和擴充套件,所以系統在一段時間的野蠻生長後,也需要及時干預,避免越來越無序。
架構的本質就是對系統進行有序化重構,不斷減少系統的 “熵”,使系統不斷進化。
那架構是如何實現無序到有序的呢? 基本的手段就是分和合,先把系統打散,然後重新組合。
分的過程是把系統拆分為各個子系統 / 模組 / 元件,拆的時候,首先要解決每個元件的定位問題,然後才能劃分彼此的邊界,實現合理的拆分。合就是根據最終要求,把各個分離的元件有機整合在一起,相對來說,第一步的拆分更難。
拆分的結果使開發人員能夠做到業務聚焦、技能聚焦,實現開發敏捷,合的結果是系統變得柔性,可以因需而變,實現業務敏捷。
舉個例子,在 Web 1.0 時代,一個 ASP 或 JSP 頁面裡,HTML 和指令碼程式碼混在一起,此時指令碼程式碼越多,系統越混亂(即熵增加),最終連開發者自己都無法理解。此時就需要對系統重新架構,辦法是引入 view helper 模式,分離 HTML 和指令碼,HTML 成為 view,指令碼成為幫助類。然後再簡單整合在一起。通過重新分和合,整個系統層次清晰,職責明確,系統的無序度降低,容易擴充套件。同時不同技能的開發人員,如 UED 和程式設計師,可以負責不同部分,有效提高開發效率。
好的架構就像一篇優美的散文,形散神不散,表面看無序,實則高度有序。
架構分類和服務物件
架構一般可分業務架構、應用架構、技術架構,那麼它們分別解決什麼問題,服務於誰呢? 我們首先看一個系統落地過程:
對於負責開發的人來說,怕的是業務太複雜,程式碼邏輯太亂,超出他能理解的範疇,系統無法維護。因此開發的需求是系統整體概念清晰,容易理解,方便擴充套件。
對於負責執行的機器來說,怕的是業務併發量太大,系統核心資源不夠用(如資料庫連線)。它希望在業務量增加時,系統能夠支援水平擴充套件,支援硬體容錯(如避免單點故障)。
開發的痛點主要由業務架構和應用架構解決,業務架構從概念層面幫助開發理解系統(動態的包括業務流程 / 節點 / 輸入輸出,靜態的包括業務域 / 業務模組 / 單據模型)。
應用架構從邏輯層面幫助開發落地系統(應用種類 / 應用形式 / 資料互動關係 / 互動方式等),整個系統邏輯上容易理解,最近大家談的比較多的 SOA 即屬於應用架構的範疇。
機器的痛點主要由技術架構解決,如技術平臺選型(作業系統 / 中介軟體 / 裝置等),部署上希望支援多機房,水平擴充套件,無單點等。
強調一下,系統是人的系統,架構首先是為人服務的,業務概念清晰、應用邏輯合理、人好理解是第一位的(即系統有序度高)。現在大家討論更多的是技術架構,如高併發設計,分散式事務處理等,只是因為這個不需要業務上下文背景,比較好相互溝通。具體架構設計時,首先要關注業務架構和應用架構,這個架構新手要特別注意。
架構師能力模型
架構師只做分和合的事情,但綜合能力要求很高,要求內外兼修,下得廚房,上得廳堂,下圖通過典型的架構方式介紹一個架構師的能力要求:
在此基礎上,架構師要有技術的廣度(多領域知識),又有深度(技術前瞻),對主流公司的系統設計非常瞭解,知道優劣長短,碰到實際問題,很快有多種方案可供評估。
抽象思維是架構師最重要的能力,架構師要善於把實物概念化並歸類。比如面對一個大型的 B2C 網站,能夠迅速抽象為採購->運營->前臺搜尋->下單->履單這幾大塊,對系統分而治之,庖丁解牛,早已目無全牛。
抽象思維是往高層次的總結昇華,由實到虛;而透過問題看本質則是由虛到實,往深層次地挖掘。比如看到一段 Java 程式碼,知道它在 JVM 如何執行;一個跨網路呼叫,知道資料是如何通過各種介質到達目標 (作業系統核心 / 網絡卡埠 / 電磁介質等)。透過問題看本質使架構師能夠敏銳地發現底層之真實,系統性端到端地思考問題,識別木桶的短板並解決之。
能落地的架構才是好架構,良好的溝通能力確保各方對架構達成共識,願意採取行動;良好的平衡取捨能力確保架構在現有資源約束下是最合理的,理想最終照進現實。
總結下,架構師的能力要求包括:
-
兼具技術的廣度(多領域知識)和深度(技術前瞻)
-
兼具思維的高度(抽象思維)和深度(問題到本質)
-
兼具感性(溝通)和理性(平衡)
架構境界
架構師從境界上由淺到深可以分為四層:第一看山不是山,第二看山是山,第三看山不是山,第四看山是山。
剛接手專案時,對業務不瞭解,時時被業務方冒出的術語弄得一愣一愣的,如果把現有問題比作山,則是橫看成嶺側成峰,根本摸不透,此時看山不是山。
經過業務梳理和對系統深入瞭解,可以設計出一個屌絲的方案,把各個系統串起來,解決當前的問題,對當前這個山能夠看清楚全貌,此時能夠做到看山是山。
通過進一步抽象,發現問題的本質,原來這個問題是共性的,後續還會有很多類似問題。設計上進行總結和昇華,得出一個通用的方案,不光能解決當前的問題,還可以解決潛在的問題。此時看到的已經是問題本質,看山不是山。
最後回到問題本身,去除過度的抽象,給出的設計簡潔明瞭,增之一分嫌肥,減之一分嫌瘦,既解決當前問題,又保留最基本的擴充套件,此時問題還是那個問題,山還是那個山。
第一境界給不出合適方案,不表。
第二境界的方案只解決表面問題,往往設計不夠,碰到其它類似問題或者問題稍微變形,系統需要重新做。
第三境界的方案往往過度設計,太追求通用化會創造出過多抽象,生造概念,理解和實現均困難,此時系統的無序度反而增加,過猶不及。
第四境界的方案,在瞭解問題本質的基礎上,同時考慮現狀,評估未來,不多做,不少做。
佛教講空和色,色即事物現象,空即事物本質,從這個意義上說,第一重境界無色無空,第二重境界過色,第三重境界過空,第四重境界站在色和空之間,既色又空,不執著於當前,不虛無於未來。
不空不色,既空既色,道法自然,本性如來,架構之髓也。
歡迎工作一到五年的Java工程師朋友們加入Java架構開發:468947140
點選連結加入群聊【Java-BATJ企業級資深架構】:https://jq.qq.com/?_wv=1027&k=5zMN6JB
本群提供免費的學習指導 架構資料 以及免費的解答
不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導