1. 程式人生 > >設計,架構,框架之間是什麼關係?

設計,架構,框架之間是什麼關係?

設計(design)、架構(architechure)、框架 (framework)之間是個什麼關係?請描述一下?

每個人都在進行設計

在探討題目問題之前,我們從設計開始聊聊。

其實我們每個人都在做設計,無論我們是在哪個行業,哪個層次,哪個職位。

  • 畫家作畫時會畫草圖做設計
  • 作家寫作時會列提綱做設計
  • 程式設計師編碼時會寫虛擬碼做設計
  • 清潔工掃地時會在腦海裡設計掃地的執行路徑

設計有大有小

對於軟體系統領域來說:

  • 在方法層次,我們可以設計方法名、變數名、語句塊使得方法變得易懂、簡潔、高效;
  • 在類的層次,我們可以設計其方法、成員變數、靜態變數、繼承關係及可見性級別等,使得一個類能更好地抽象與封裝,方便其他人使用;
  • 在包的層次我們可以設計規劃各個模組程式碼的位置,方便我們能快速找到對應的程式碼;
  • 在服務層次我們可以設計服務的粒度,暴露的功能,交流的協議,以方便服務間持續的互動;
  • 在系統層次我們可以通過設計系統暴露的功能、協作的形式以完成系統層次的協作;
  • 再往上依然存在需要設計的層級,如多個軟體系統間協作完成的一個大的軟體系統,但每個公司對此叫法可能不一樣;
  • 軟體系統再往上也有層級,但其可能就是人類自身的系統了。

這裡各個層次的設計都有一個樸素的設計理念,那就是 提供抽象介面以此與外圍互動、封裝具體變化以此在內部獨立演進。這個是我們完成某項複雜任務而組織的大型工程裡的一個基礎理念。

剛剛講的是軟體系統領域的設計,但其可擴充套件到各個領域,如人的系統、建築的系統、小說的系統等等。

進行高層設計的人不一定精通底層的設計

當然,進行高層設計的人能融匯貫通其相關底層子系統的知識當然最好,但是大多數情況下,我們做不到,因為我們現在組織的系統的層級太多太深了。

舉個例子,我們設計的業務程式碼在編譯後能借助作業系統的能力協調CPU、記憶體及IO一起完成業務程式碼的執行,但是設計業務程式碼的人,不一定能知道CPU的流水線是怎麼運作的、記憶體屏障是如何協調多個核心與記憶體的、資料具體是怎麼傳輸到其他機器的。

再舉個例子,某個大型公司CEO可能不懂編碼,但其手下有不同型別的大將,包括懂技術的人才,因此CEO只要組織設計一個團體能覆蓋其知識盲點,就能管理好整個公司,包括整個公司的各類軟體系統。

從上面我們可以看到在做高層設計與做底層設計的人的能力是無法直接比較的,因為他們的能力棧可能完全不一樣,無法簡單地進行比較。

但通常的套路下,做高層設計的都是從底層設計的人才中轉崗(叫提拔、晉升不一定合適,有時候底層設計的人才更為稀缺)而來的,因為只有你的設計能力在影響不那麼大的層次經過驗證後,才放心讓你到更高層次進行設計。

架構與設計的關係

實際上架構是一種設計。

架構設計規定了主要元件間一些較大層次的約束與規範,一些較小層次的設計在這些約束與規範下進行的話,能最大限度地滿足某些方面的特性,如可閱讀性、可靠性、可擴充套件性、安全性等等。

舉個例子,我們在設計一個屋子的時候,房間、廳、廚房等可以想象為架構,我們在進行軟裝的時候,是不能改變原有的設計的,不然隨便敲牆容易造成安全隱患。但我們能控制軟裝的,形成風格各異的房間。

當然,設計層次的大小是相對的。在剛剛例子裡一個屋子裡的房間佈局是架構。但往上看,在一個街區的架構設計裡,一個屋子的內部房間佈局僅僅只是一個較小層次的設計,其不會影響整個街區的規劃。

因此,架構這一個詞,應該存在於各個層次。就像我們在寫程式碼時,運用各種設計模式,如責任鏈等,規定編寫程式碼所使用的方式,以開閉原則保證程式碼穩定性及可閱讀性時,我們就已經是這段可擴充套件的程式碼的架構師了。

架構與框架的關係

框架是架構的一種實現。

例如MVC這種架構設計(架構是每個層次都存在的),分離了不同型別程式碼的關注點,使得程式碼更為清晰及更易維護。

而各類MVC框架則實現了這種架構,只要我們基於這個框架擴充套件實現我們的程式碼,那麼我們就能寫出符合MVC架構規範的程式碼。

同時,在這裡我們需要額外理清楚的一件事情是框架(framework)與庫(library)的區別。我覺得以下這幅圖很好地說明了這個區別。

總結

  • 為了完成某件事情,無論我們身處哪個職位,都需要進行設計;
  • 一個設計可以包含多個其他人負責的子設計,你的設計也可能是其他人設計的一部分;
  • 要完成一個複雜的任務,按層級拆分設計是一個常用的方法;
  • 為了底層設計實現的可控,達到我們預期的某些效果,我們要對設計進行規範與限制,這稱為架構,這也是一種設計;
  • 就像設計有很多層次一樣,架構也有很多的層次;
  • 框架是架構的具體實現,利用框架,並在框架/架構的約束下進行擴充套件/編碼能加速我們程式碼的實現

最後

本文是基於目前個人理解而成,若文章有謬誤,望不吝批評斧正;若本文對大家有所幫助,望不吝點贊

相關閱讀

你知道如何畫好一幅架構圖麼?

作者個人公眾號

多年金融碼農,現為某信用卡中心架構師,EasyTransaction作者,歡迎關注

ref: