設計(design)、架構(architechure)、框架 (framework)之間是個什么關系?請描述一下?
每個人都在進行設計
在探討題目問題之前,我們從設計開始聊聊。
其實我們每個人都在做設計,無論我們是在哪個行業,哪個層次,哪個職位。
- 畫家作畫時會畫草圖做設計
- 作家寫作時會列提綱做設計
- 程序員編碼時會寫偽代碼做設計
- 清潔工掃地時會在腦海里設計掃地的執行路徑
設計有大有小
對於軟件系統領域來說:
- 在方法層次,我們可以設計方法名、變量名、語句塊使得方法變得易懂、簡潔、高效;
- 在類的層次,我們可以設計其方法、成員變量、靜態變量、繼承關系及可見性級別等,使得一個類能更好地抽象與封裝,方便其他人使用;
- 在包的層次我們可以設計規划各個模塊代碼的位置,方便我們能快速找到對應的代碼;
- 在服務層次我們可以設計服務的粒度,暴露的功能,交流的協議,以方便服務間持續的交互;
- 在系統層次我們可以通過設計系統暴露的功能、協作的形式以完成系統層次的協作;
- 再往上依然存在需要設計的層級,如多個軟件系統間協作完成的一個大的軟件系統,但每個公司對此叫法可能不一樣;
- 軟件系統再往上也有層級,但其可能就是人類自身的系統了。
這里各個層次的設計都有一個朴素的設計理念,那就是 提供抽象接口以此與外圍交互、封裝具體變化以此在內部獨立演進。這個是我們完成某項復雜任務而組織的大型工程里的一個基礎理念。
剛剛講的是軟件系統領域的設計,但其可擴展到各個領域,如人的系統、建築的系統、小說的系統等等。
進行高層設計的人不一定精通底層的設計
當然,進行高層設計的人能融匯貫通其相關底層子系統的知識當然最好,但是大多數情況下,我們做不到,因為我們現在組織的系統的層級太多太深了。
舉個例子,我們設計的業務代碼在編譯后能借助操作系統的能力協調CPU、內存及IO一起完成業務代碼的執行,但是設計業務代碼的人,不一定能知道CPU的流水線是怎么運作的、內存屏障是如何協調多個核心與內存的、數據具體是怎么傳輸到其他機器的。
再舉個例子,某個大型公司CEO可能不懂編碼,但其手下有不同類型的大將,包括懂技術的人才,因此CEO只要組織設計一個團體能覆蓋其知識盲點,就能管理好整個公司,包括整個公司的各類軟件系統。
從上面我們可以看到在做高層設計與做底層設計的人的能力是無法直接比較的,因為他們的能力棧可能完全不一樣,無法簡單地進行比較。
但通常的套路下,做高層設計的都是從底層設計的人才中轉崗(叫提拔、晉升不一定合適,有時候底層設計的人才更為稀缺)而來的,因為只有你的設計能力在影響不那么大的層次經過驗證后,才放心讓你到更高層次進行設計。
架構與設計的關系
實際上架構是一種設計。
架構設計規定了主要組件間一些較大層次的約束與規范,一些較小層次的設計在這些約束與規范下進行的話,能最大限度地滿足某些方面的特性,如可閱讀性、可靠性、可擴展性、安全性等等。
舉個例子,我們在設計一個屋子的時候,房間、廳、廚房等可以想象為架構,我們在進行軟裝的時候,是不能改變原有的設計的,不然隨便敲牆容易造成安全隱患。但我們能控制軟裝的,形成風格各異的房間。
當然,設計層次的大小是相對的。在剛剛例子里一個屋子里的房間布局是架構。但往上看,在一個街區的架構設計里,一個屋子的內部房間布局僅僅只是一個較小層次的設計,其不會影響整個街區的規划。
因此,架構這一個詞,應該存在於各個層次。就像我們在寫代碼時,運用各種設計模式,如責任鏈等,規定編寫代碼所使用的方式,以開閉原則保證代碼穩定性及可閱讀性時,我們就已經是這段可擴展的代碼的架構師了。
架構與框架的關系
框架是架構的一種實現。
例如MVC這種架構設計(架構是每個層次都存在的),分離了不同類型代碼的關注點,使得代碼更為清晰及更易維護。
而各類MVC框架則實現了這種架構,只要我們基於這個框架擴展實現我們的代碼,那么我們就能寫出符合MVC架構規范的代碼。
同時,在這里我們需要額外理清楚的一件事情是框架(framework)與庫(library)的區別。我覺得以下這幅圖很好地說明了這個區別。
總結
- 為了完成某件事情,無論我們身處哪個職位,都需要進行設計;
- 一個設計可以包含多個其他人負責的子設計,你的設計也可能是其他人設計的一部分;
- 要完成一個復雜的任務,按層級拆分設計是一個常用的方法;
- 為了底層設計實現的可控,達到我們預期的某些效果,我們要對設計進行規范與限制,這稱為架構,這也是一種設計;
- 就像設計有很多層次一樣,架構也有很多的層次;
- 框架是架構的具體實現,利用框架,並在框架/架構的約束下進行擴展/編碼能加速我們代碼的實現
最后
本文是基於目前個人理解而成,若文章有謬誤,望不吝 批評斧正 ;若本文對大家有所幫助,望不吝 推薦。
相關閱讀
作者個人公眾號
多年金融碼農,現為某信用卡中心架構師,EasyTransaction作者,歡迎關注
ref: