京東雲開發者|探尋軟體架構的本質,到底什麼是架構?

来源:https://www.cnblogs.com/Jcloud/archive/2022/10/27/16832126.html
-Advertisement-
Play Games

不論是開發人員還是架構師,我們都一直在跟軟體系統打交道,架構是在工作中出現最頻繁的術語之一。那麼,到底什麼是架構?你可能有自己的答案,也有可能沒有答案。對“架構”的理解需要我們不斷在實踐中思考、歸納、演繹,形成自己的認知。 1 到底什麼是軟體架構 ? 定義 ”架構是什麼“ 是件非常困難的事情,不同的 ...


不論是開發人員還是架構師,我們都一直在跟軟體系統打交道,架構是在工作中出現最頻繁的術語之一。那麼,到底什麼是架構?你可能有自己的答案,也有可能沒有答案。對“架構”的理解需要我們不斷在實踐中思考、歸納、演繹,形成自己的認知。

1 到底什麼是軟體架構 ?

定義 ”架構是什麼“ 是件非常困難的事情,不同的組織對於軟體架構有不同的定義,每個人心中也有自身對於系統架構定義的認知。就好比我們無法百分之百表述模型而只能產出模型不同維度的視圖,對架構進行完備的定義是不可能的。

“道可道,非常道。名可名,非常名”。

行業內不同的組織和個人從不同的視角對 “什麼是架構” 進行了定義或闡述。

IEEE 關於架構的定義

the fundamental organization of a system, embodied in its components, their relationships to each other and the environment, and the principles governing its design and evolution --ANSI/IEEE

將系統架構定義為:架構是系統組織結構 + 組件及聯繫(組件間以及組件和環境之間) + 原則的組合。通過圖形化的形式表述該架構定義如下圖所示,這是一個非常簡潔、概念清晰的定義,其言簡意賅的表達了架構的幾個核心要素:

系統的組織:表達系統的巨集觀結構 組件及聯繫:組件化的思維,同時突出了環境要素。組件表達了系統的模塊化,組件相互之間及組件與環境之間的關聯表達元素間的相互作用。 原則:用於指導設計和系統演進的原則

 


 

大師 Martin Fowler對於架構的定義有著更加簡潔的抽象,Martin Fowler 認為軟體架構是:重要並且難以改變的決策。架構設計是關於權衡的藝術,架構設計過程中充滿了各種各樣的決策,這些決策也終將反應系統架構。

Software Architecture = Important and hard to change decisions --Martin Fowler

Ralph Johnson則對架構有更加 “泛化” 的定義軟體架構就是重要的東西,不論它是什麼!

The software architecutre is the important stuff ! Whatever it is ! --Ralph Johnson

以上的定義從高層抽象視角對什麼是架構給予了自己的回答,相比之下,Neil Ford 從架構組成元素入手,從更偏向實踐的角度對架構進行了闡述。核心思想是軟體系統的架構包括以下組合元素:

結構:應用系統所選擇的架構風格,比如微服務架構、單體架構還是SOA等 架構屬性:系統的非功能性屬性,比如性能、可用性、可維護性等 架構決策:系統設計過程中重要的架構決策 設計原則:設計過程中的指導性原則

 


 

結構

結構是系統架構的重要組成部分,其從巨集觀上表述了系統的結構組成。架構設計的核心任務之一是為系統選擇合適的架構風格。比如,架構師基於上下文的權衡,可以選擇模塊化單體架構風格,也可以選擇微服務架構風格。

 


 

架構屬性

架構屬性亦稱質量屬性,或非功能屬性,通常表示系統需要具備或滿足的某種 “能力”,比如高性能、可擴展性、彈性、伸縮性、容錯性、可測試性、可維護性等等。架構設計的目標需要關註系統需要滿足的架構屬性,架構最終要體現對架構屬性支持的相關架構決策。架構屬性眾多,系統需要關註的是這些架構屬性的子集,具體的某次特定的架構設計所需要關註的架構屬性需要依據問題域的上下文而具體分析。同時,不同的架構屬性間可能存在衝突,這種情況同樣需要架構師的權衡和決策

 


 

架構決策

架構決策是系統架構設計過程中對解決方案的選擇,其描述了系統必須遵循的規則。架構決策隨著權衡分析而自然存在,其是系統架構設計的重要維度之一。並不是所有的決策都是架構決策,架構決策應該關註對系統有重要影響的部分。比如對架構風格的選擇對系統存在重要影響,其改變的成本較高,理當屬於架構決策的範疇。比較典型架構決策包括但不限於:

直接影響高優先順序的架構屬性 •修改對外介面:對外提供的介面修改往往需要進行充分影響分析 引入或者移除依賴:依賴的加入和移除往往標示著組件能力的引進和廢棄 改變系統的通用結構:工程結構是應用架構的重要維度之一 迫使研發人員改變開發方式 接受戰略性技術債:重構影響較大的技術債往往對現有系統會有較大影響

:架構決策建議以輕量級的文檔化形式進行記錄,參考文章 《輕量級的架構決策記錄機制》一文

設計原則

設計原則與架構決策不同,其本質區別是:設計原則是一種指導,而非強制的規則。架構決策需要遵守,設計原則提供參考性指引

比如,設計原則可能是:在可能的情況下,跨系統間的通信儘可能使用非同步消息機制以提高性能和降低耦合。


 

以上對架構的定義各有特點:

•IEEE定義更加結構化和規範化 Martin Fowler的定義側重架構決策的重要性 Ralph Johnson 則更加泛化,突出 “重要” 這一核心因數 Neil Ford則更具象化

我個人更傾向於Ralph Johnson 對於架構的抽象化定義,簡單卻不失對架構本質的闡述,這也是我在工作中判斷架構邊界的準則之一。

2 架構設計的邊界

如果你是團隊的架構師,你是否有以下困惑

•系統的架構應該設計到什麼粒度? •架構設計是否要足夠詳細以便能直接指導開發人員開展編碼工作?

如果你是團隊的核心開發人員,你是否 抱怨

"架構設計" 太過詳細,涵蓋了實現的 “細枝末節”,自己除了CRUD沒有發揮的空間 "架構設計" 太過巨集觀,基於設計方案根本無法指導開發,自己還得重新設計

 


 

很多架構師自身對架構和設計的邊界缺乏深入認知,相比於對架構邊界的縮小,更多時候會出現架構設計邊界放大的情況:

架構師把架構設計當作詳細的技術方案設計,牢牢把控系統實現的所有細節,產出大量的設計文檔,然後交由核心開發人員做代碼實現的執行工作。

這種現象會導致如下問題:

壓縮了團隊核心開發人員的設計發揮空間,不利於其技術水平及認知的提升 •作為架構師你真的能講所有的細節都Cover住嗎?即使耗費巨大精力完成了 “完備” 的設計,來自一線開發所面臨的各種場景是否能夠提前預知和捕獲? •如果需求迭代持續如此,作為核心開發人員多半會有所 “怨言” •作為團隊的架構師精力有限,持續的細節輸出會耗費巨大精力,而無法關註更加巨集觀的層面 •.......

以上問題的根源是什麼?不能明確架構設計的邊界!

架構設計與設計(實現相關)的邊界或粒度問題 團隊架構師與開發人員間的職責邊界

判斷架構邊界的前提之一是:明確架構和設計的關係!

所有的架構都是設計,但設計不一定是架構!

從架構的定義看架構設計的邊界,選取兩個視角:

架構是系統中重要的東西!無論它是什麼(之所以重要,是因為改變的成本高) 架構設計涵蓋系統中重要的架構決策

所以,架構設計應該涵蓋系統中重要的東西,這些 “重要的東西” 可能是:

應用架構風格的選擇 子系統間信息通信的方式 工程採取的分層以及層間約束 工程應該遵循的開發規範 工程引入的三方類庫,或者三方框架 高優先順序的架構屬性:比如某次需求建設非常關註系統的性能,或者擴展性等架構屬性 其它 "重要的東西"

架構設計涵蓋了系統所需的重要的架構決策,從巨集觀層面對系統實現予以指引。而詳細的設計則為具體的開發實現提供指導,比如,詳細的E-R圖設計、具體的代碼級別的模式選擇、某個組件的具體實現等等。

架構不是一成不變,需要持續演進,而實現相關的設計也可能在項目進行中持續變化,因此,二者不能完全割裂,而是需要在實現過程中進行雙向反饋

架構設計信息要高效的同步至開發人員 實現過程中的變更同樣也要迴向反饋至架構,以便對架構設計進行調整

 


 

在進行架構邊界判定時要註意一個至關重要的因數:上下文!!!以上的判斷準則必須要給定的上下文中才有價值。

比如:實現過程中大家經常會適用一些設計模式,例如策略模式。那麼,這種設計模式的選擇是屬於架構設計還是詳細的實現設計?答案就是:It depends!!! 具體情況,具體分析

 


 

如果當前上下文,我們非常關註系統的擴展性,該架構屬性是我們高優先順序的架構屬性,那麼,核心模塊的策略模式的應用可以看作是架構設計的範疇。而如果上下文中擴展性不是我們關註的高優先順序的架構屬性,相比我們更關註性能,那麼,這種代碼級的設計模式選擇應該屬於架構設計的範疇之外了,而需要劃分到實現設計層面,交由核心開發自主決定。

3 架構模式(Patterns)與架構風格(Styles)

架構模式架構風格是極容易混淆的兩個概念,很多開發人員將其理解為同一事物,而實際上二者有本質區別。

架構風格是系統設計的頂層抽象,從巨集觀視角表述我們的系統組成。更進一步,架構風格聚焦於系統的分層、模塊以及交互形式。 架構模式聚焦於對重覆出現問題提供解決方案

二者概念不同,並不存在衝突,其聯繫如下圖所示:

架構模式可以應用於架構風格,在同一架構風格上下文內可以應用一或多種架構模式 架構風格可以組合以產生新的架構風格

 


 

比較典型的例子是CQRS:CQRS本身是一種模式,將命令和查詢的職責在不同維度進行分離。該模式我們可以在單體架構風格中使用,也可以在微服務架構風格中使用,當然也可以在SOA架構風格中使用。

 


 

4 為什麼要做架構設計 ?

至於 “為什麼要做架構設計” 也是一個古老且頻繁出現的問題,有太多的文章闡述為社麽要架構設計:有的巨集觀,有的具體,有的“務實”,有的“務虛”。我把這個問題作為一個獨立章節闡述,並不是想進行大篇幅的論述,只是想突出它的重要性,這個問題值得耗費一些精力去深入理解其背後的原因。但,在此不做展開過多說明,通過一句話來進行概括:

之所以要進行架構設計,是因為:重要 !

做,收益高 不做,成本高

5 開發人員和架構師的知識模型

作為開發人員,更加關註知識的深度,以便有足夠的知識儲備滿足工作需要。開發人員在職業生涯的早期,應該關註於自身知識儲備的增長,並保持技術深度。

 


 

作為架構師,之所以技術的廣度比深度更重要,是因為架構師的重要職責之一是進行架構決策。系統架構設計是關於權衡的藝術,在特定的問題域上下文下,架構師需要在諸多可行的解決方案間進行權衡和決策,這也對其技術廣度提出了要求。開發人員成長為架構師,應該更加關註知識的廣度,併在幾個特定領域深耕,以便有足夠的知識支撐架構決策。

 


 

雖然開發人員和架構師在知識域的關註點上存在差異,但在認知層面都可以統一到Bloom認知層次模型。該模型將認知層次劃分為逐步遞進的六個層次:

識記:識別和回溯事實性知識 理解:理解事實的內涵 應用:將事實、規則、概念、思想加以應用 分析:將信息分解、關聯、區分、實驗、測試 評估:將信息或思想的價值進行評價 創造:整合不同的信息形成新的知識體系

 


 

不論是架構師還是開發人員,Bloom認知層次模型都適用。通過不斷的學習擴展自身的知識體系,在識記、理解和應用的同時,要持續的培養分析、評估和創造的能力,逐步向高層次的認知水平提升。

但需要註意的是:知識不等於認知,避免陷入知識學習的陷阱。知識是無限的,沒有人能夠以有限的精力去學習無限的知識。不論是開發人員還是架構師,又或者其他角色,不應該只將精力投入在知識邊界的擴充,而應該註重從知識到認知提升的轉變。

吾生也有涯,而知也無涯。以有涯隨無涯,殆矣!已而為知者,殆而已矣! ----《莊子》

格物以致知,對錶象不斷的歸納、演繹直至事物的本象,探尋事物背後的規律,建立更高層的認知。這種認知層次由下及上的躍升有兩種方式:

:由內向外,通過不斷積累、持續思考,由量變到質變,直至 “開悟” :自外向內,高層次或不同的思想輸入碰撞,加速認知層次的突破

 


 

 

為學日益,為道日損。損之又損,以⾄於⽆為。⽆為⽽⽆不為。 --《道德經》

6 結語

對架構定義的探討實際上是一種朴素的 “格物” 的過程,每個人都應該尋找自己的答案。跳脫對架構定義探討的視野,大家的工作和學習何嘗不是如此呢 ?!大道至簡,殊途同歸,格物致知,與君共勉!

作者:倪新明


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2022-10-27 一、Vue的列表渲染 (1)關鍵字:v-for (2)用法:v-for:"臨時變數名 in 列表名"。“列表”的說明是寫在script中的Vue中的data中。 (3)擴展:在列表渲染中,渲染就是在前端能看見的。需要用到索引的用法。v-for:"(臨時變數名,index) in ...
  • 01、HTTP 常⻅的狀態碼有哪些? 1xx 伺服器收到請求 2xx 請求成功 200 成功狀態碼 3xx 重定向 301永久重定向,瀏覽器下次⾃動取重定向的地址 302臨時重定向,瀏覽器下次還會請求原地址 304 資源未被修改 4xx 客戶端錯誤 403 沒有許可權 404 資源未找到 5xx 服務 ...
  • 今天npm run dev的時候,有個頁面報錯,提示[Vue warn]: Failed to mount component: template or render function not defined.昨天還好好的,今天就報錯了,也沒改啥。經過查資料,反覆查證回想改了什麼,發現是因為昨天在在 ...
  • 上文 《Vitepress搭建組件庫文檔(上)—— 基本配置》已經討論了 vitepress 搭建組件庫文檔的基本配置,包括站點 Logo、名稱、首頁 *home* 佈局、頂部導航、左側導航等。本文進入最重要的部分 —— 如何像 *Element Plus* 那樣一遍代碼就可以展示組件的效果和源代碼... ...
  • 背景 最近在公司內部進行一個引導配置系統的開發中,需要實現一個多圖輪播的功能。到這時很多同學會說了,“那你直接用swiper不就好了嗎?”。但其實是,因為所有引導的展示都是作為npm依賴的形式來進行插入的,所以我們想要做的就是:儘量減少外部依賴以及包的體積。所以,我們開始了手擼簡易版swiper之路 ...
  • 在 CSS 中,漸變(Gradient)可謂是最為強大的一個屬性之一。 但是,經常有同學在使用漸變的過程中會遇到漸變圖形產生的鋸齒問題。 何為漸變鋸齒? 那麼,什麼是漸變圖形產生的鋸齒呢? 簡單的一個 DEMO: <div></div> div { width: 500px; height: 100 ...
  • 一、瀏覽器本地存儲方式及使用場景 1.Cookie 概念:Cookie是最早被提出來的本地存儲方式,在此之前,服務端是無法判斷網路中的兩個請求是否是同一用戶發起的,為解決這個問題,Cookie就出現了。Cookie的大小隻有4kb,它是一種純文本文件,每次發起HTTP請求都會攜帶Cookie。 特性 ...
  • 表格基本不使用了,用列表來代替,表格緩存太慢,列表是一列一列緩衝的 密碼里將預設的type類型test換成password(密碼),可以隱藏輸入的密碼 單選框 type更改後,預設的框發生變化,radio是小圓圈,如上圖,兩個radio之間如果沒有聯繫的話不能實現單選,就是可以同時選,為了滿足單選需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...