什麼是軟件架構

本文探討什麼是「軟件架構」,並對其下個定義!程序員

決策or組成?

若是你去google一下「什麼是軟件架構」,你會看到各類各樣的定義!不過大體可分爲「決策」論和「組成」論!架構

其中一個比較著名的「決策」論的定義是Booch,Rumbaugh和Jacobson於1999年提出的:ui

架構就是一系列重要的決策,這些決策涉及軟件系統的組織、組成系統的結構化元素及其接口的選擇、元素之間協做時特定的行爲、結構化元素和行爲元素造成更大子系統的組合方式以及引導這一組織(也就是這些元素及其接口)、他們之間的協做以及組合(架構風格)。google

而「組成」論中最受推崇的是SEI(Software Engineering Institute)的Len Bass等人提出的定義:url

The software architecture of a program or computing system is the structure or structures of the system,which comprise software elements,the externally visible properties of those elements,and the relationships among them.spa

Fielding博士在他的博士論文《Architectural Styles and the Design of Network-based Software Architectures》中對軟件架構的定義是這樣的:.net

A software architecture is an abstraction of the run-time elements of a software system during some phase of its operation. A system may be composed of many levels of abstraction and many phases of operation, each with its own software architecture. 軟件架構是軟件系統在其操做的某個階段的運行時的元素的抽象。一個系統可能由不少層抽象和不少個操做階段組成,每一個抽象和操做階段都有本身的軟件架構。架構設計

這其實也是「組成論」!不過這裏說的是系統運行時的快照翻譯

爲何會出現這樣的分歧呢?我以爲主要問題在每一個人對「架構」這個詞的理解!設計

我先來問你一個問題,你以爲「架構」這個詞是名詞仍是動詞?或者說「架構」是一個過程,仍是一個結果

「架構」對應英文單詞「Architecture」,在英文裏Architecture是個名詞,表示結構。但實際上結構只是架構的產物,如何獲得這個結構呢?是經過架構師的一個個決策獲得的。因此,「架構」包含了過程結果

若是你去搜一下「架構」這個詞的解釋,你就會發現,在中文裏,「架構」這個詞有兩層含義(來自百度詞典):

  • 一是間架結構
  • 二是構築,建造

那麼,「架構」是決策仍是組成呢?

Wiki上對Architecture給出了一個比較好的定義:

Architecture is both the process and the product of planning, designing, and constructing buildings or any other structures。

翻譯過來就是:

架構是規劃、設計、構建的過程及最終成果

可是我以爲這個定義還不夠,還缺乏了一個關鍵內容,就是「約束」!

下個定義

我我的對架構的理解是:架構是特定約束決策結果,而且這是一個循環遞進的過程。

這句話包含了三個關鍵詞:特定約束決策結果。這三個詞都是中性詞。特別是第三個詞,因爲決策的不一樣,獲得的結果也就不一樣,多是「成果」,也多是「後果」!下面來一個個具體解釋。

  • 特定約束

咱們都學過閱讀理解,老師在教閱讀理解的時候,會提到一個詞,叫「語境」!好比下面這個段子!

領導:你這是什麼意思? 小明:沒什麼意思,意思意思。 領導:你這就不夠意思了。 小明:小意思,小意思。 領導:你這人真有意思。 小明:其實也沒有別的意思。 領導:那我就很差意思了。 小明:是我很差意思。 提問:以上「意思」分別是什麼意思?

這裏的「意思」在不一樣的語境下有不一樣的含義。語境就是上下文,也就是咱們軟件行業常說的Context!Context不一樣,獲得的結果也就不一樣!

其實任何行爲、言語、結論都有一個Context爲前提!只是在不一樣的狀況下咱們對這個Context的叫法不一樣!好比:

直角三角形的兩直角的平方等於斜邊的平方

這句話在歐幾里得幾何這個Context下是成立的!可是在非歐幾何這個Context下就是不成立的!在數學裏,這個Context能夠稱爲是「限定條件」!

一樣的牛頓力學定律,在普通場景下是成立的!可是在量子力學下是不成立的!在物理裏,這個Context能夠稱爲「環境」!

在架構裏也同樣,淘寶的架構可能在其它狀況下並不適用,由於Context不一樣!這裏的Context就稱爲「約束」!

並且這個「約束」必須是「特定約束」,不能是「泛約束」!好比說,「我要造個房子」,這個約束就是個「泛約束」!是沒辦法執行的!(下節經過例子來詳細說明)

  • 決策

決策是一個過程!實際上就是選擇!選擇技術、結構、通訊方式等內容,去符合「特定約束」!

在決策時,實際上無形中又加入了一個約束:人的約束!作決策的人的認知又約束了決策自己!好比某個架構師只知道分層架構,那麼他不管在哪一種Context下都只有分層架構這一個選擇!

  • 結果

是決策的最終產物:多是運行良好、知足需求的系統。也多是一堆文檔。或者是滿嘴的跑火車!

若是這個結果是五視圖、組件、接口、子系統、及其之間的關係,那麼這個架構就是軟件架構

若是這個結果是建築圖紙、鋼筋水泥、高樓大廈,那麼這個架構就是建築架構

若是這個結果是事業成功、家庭美滿,那麼這個架構就是人生架構,也叫人生規劃

舉個例子

以上面「我要造個房子」爲例,來詳細解釋「架構是特定約束決策結果」!

上面已經說了「我要造個房子」是個泛約束,是沒法知足的!由於它有不少可能性選擇,且不少選擇是互斥的!例如:

  • 房子造在哪裏?城市、鄉村、山頂、海邊、南北極......
  • 要形成什麼樣子?大平層、樓房、草房、城堡......
  • 要使用什麼材料?水泥、玻璃、木頭、竹子......
  • ......

這裏實際就是需求收集階段,須要和客戶溝通,挖出具體的客戶需求!

假設客戶最終決定:想在海邊建個房子,適合兩我的住,每半年過來度假一週左右,但願能方便的看到海、還有日出,預計支出不超過XX元!這就是功能性需求!

經過上面的功能性需求,你須要挖出非功能性需求:

  • 海邊風大、潮溼。如何防風?防潮?
  • 海潮聲音大,是否須要作好隔音?避免影響睡眠?
  • 但願能看到海和日出,使用玻璃是否合適?須要什麼樣的玻璃?
  • 價格是否超出預算?
  • .....

完善的需求(功能性、非功能性),實際就是架構的「特定約束」!而對上面這些問題的選擇,就是「決策」!

  • 爲了防風,地基要打深一點;要使用防潮材料
  • 牆壁須要加厚,使用隔音門和窗戶
  • 面朝大海的牆使用強化加厚玻璃牆
  • 選擇價格內的材料
  • ......

這些決策肯定後,須要告訴工人如何建造!須要相關的設計圖,對不一樣的人須要不一樣的圖!好比,對建造工人就是總體結構說明圖,水電工就是水電線路圖!這些圖紙就是你決策的部分結果

整個過程是個循環遞進的過程!好比:你爲了解決客戶方便看海的問題,先選擇了開一個較大的窗戶的方案!可是客戶以爲不夠大!你決定直接把整面牆都使用玻璃來建造,客戶很滿意,可是承重、防風等問題如何解決?你最終決定經過使用強化的加厚玻璃來解決這個問題!

最終交付給客戶的房子纔是你架構的最終成果

免責申明:我不懂造房子,以上言論都是胡謅的,你理解意思就好了!

縱向深刻

最近訂閱了李運華的《從0開始學架構》,他對架構的理解是:軟件架構指軟件系統的頂層結構!我以爲這個定義太過寬泛了,且只是定義了「結構」而沒有說明「過程」!不過,這間接說明了架構和設計的關係!架構是頂層設計

從操做層面作決策:用戶從哪裏進入、頁面應該跳轉到哪裏、應該輸入哪些信息.....這就是流程設計!

從代碼層面決策,代碼該怎麼寫:模塊如何組織、包如何組織、類如何組織、方法如何組織......這就是代碼設計!

從系統總體層面決策:子系統如何組織、組件如何組織、接口如何設計......這就是架構設計!

橫向擴展

好像架構思惟是個比較通用的思惟方式!讀書,演講,寫做.....都是這樣!

讀書,你須要先了解這本書是講關於什麼的?計算機、哲學、心理學.....以及具體是講的哪一個方面?這是約束!而後你須要問本身,本身是否須要瞭解這些內容?是否須要讀這本書?這就是決策!若是須要讀,那麼再進一步,這本書的總體結構是什麼樣子的?我該怎麼讀?這個章節是講什麼的?我是否須要讀?我是否贊成做者的結論?若是贊成,我爲何贊成?若是不一樣意,我爲何不一樣意?我有什麼本身的觀點?最終的成果就是我對這本書的我的理解

演講,你須要先了解你是對誰進行演講的?要講什麼?聽衆的水平如何?聽衆的水平以及演講的內容就是你演講的約束!而後你須要考慮如何進行演講?演講的總體結構該怎麼組織?該用什麼樣的語言?是否該講個笑話?各個小節裏的內功如何組織?這裏是否須要設置問題?這裏是否可能會有人提出問題?會提出什麼樣的問題?我該如何回答?這些是決策!最終,作出來的演講,就是我此次演講的成果

寫做和演講比較相似,少了一些互動。就再也不贅述了!

作個小結

本文梳理了我對架構的理解:架構是特定約束決策的**結果,**而且這是一個循環遞進的過程。並經過例子來解釋我爲何這麼理解!

參考資料

  • 《IBM架構思惟介紹》
  • 《恰如其分的軟件架構》
  • 《Java應用架構設計》
  • 《軟件架構設計》
  • 《程序員必讀之軟件架構》
  • 維基百科
  • 百度詞典
相關文章
相關標籤/搜索