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