計算機領域有句話:「計算機的任何問題均可以經過增長一個虛擬層來解決」。另言之:"All problems in computer science can be solved by another level of indirection"。其主要思想是將調用者和被調者隔離開,既屏蔽細節,又提升了靈活性。因爲標準統一在此處收口,所以又提升了效率與安全性。數據庫
這個思想在計算機硬件、計算機網絡、計算機網絡無不如此。計算機網絡的7層協議,每一層均可以看作下一層的虛擬層;計算機操做系統能夠看做計算機硬件的虛擬層;JVM能夠看做是操做系統的虛擬層;分層的計算機軟件架構事實上也是利用虛擬層的概念;開啓了雲計算時代的Virtual Machine是bare metal/host OS的虛擬層(上層是不一樣的guest OS)。安全
這個思想在生活中也是常常見到。例如:集裝箱的引入大大提高了全球化的效率。原來的貨物都是雜亂的堆在車裏或船裏,而集裝箱將貨物和承載貨物的工具分離開,大大提升了運輸的效率,還加強了安全性。
有的人也許以爲集裝箱不算什麼大發明。但事實上它的標準化能大大提高效率。以前看到SAP的基礎引擎提供了一套標準化的插件機制,全部的產品都是基於一個統一的插件開發平臺,每個產品都是一個插件,每個插件都按照名字約定好了。你們都遵照這個簡單的「共識」插件架構進行開發與維護,效率大大提高。這正是SAP基礎引擎平臺的神奇之處。背後的道理與集裝箱是同樣的。
道理很是簡單,彷佛人人都懂,但作起來並不那麼簡單。知道系統裏哪一個部分須要動手術加一層indirection,考量的是能力、經驗和智慧。展開來講一下:
第1、抽象能力。計算機的任何問題均可以經過增長一個虛擬層來解決,這一虛擬層爲何要加,加在哪裏?須要「抽象」。抽象是簡化問題、解決問題的核心,也是設計的精髓。爲何要抽象?抽象能帶來間接(Indirection),能隔離變化,間接能控制依賴方向,間接能提供擴展性。
好比:SOA也是這樣的抽象和屏蔽實現的思想。插件框架也是用OSGi框架做爲中間層來向上層屏蔽實現的細節,而ORM是對數據庫的抽象。
第2、業務能力。業務理解深入了,邏輯清晰了,天然就知道哪裏常常變化,哪裏能夠進行共性的提煉。舉個栗子:你常常寫網頁,後來發現數據與顯示分離的好處,而且設計出MVC模式。所以,好的抽象與架構是不斷對業務進行分析和思考而獲取的。架構源於分析,而非設計。分析源於對業務的深入理解。要想得到可擴展性,你須要看得遠一點,對上下文作充分的瞭解。
第3、性能。分層的優勢在於,依賴方向獲得最好的控制,並且代碼複用高、耦合低。每一個層次有本身的核心問題,好比引擎這一層就是作一些業務無關的功能,好比渲染器、物理引擎。好比框架層就是爲業務支撐的,着眼於開發效率。但隨之而來的問題是多引入一層虛擬層帶來的系統性能瓶頸問題如何解決。這個考驗功底了。網絡
最後要提醒的是,增長虛擬層也許會有一些反作用,最有名的是污水池反模式(architecture sinkhole anti-pattern).這個反模式是這樣的,請求流簡單的穿過幾個層,每層裏面基本沒有作任何業務邏輯,或者作了不多的業務邏輯。好比一些JavaEE例子,業務邏輯層只是簡單的調用了持久層的接口,自己沒有什麼業務邏輯。這實際上是一種形而上學。本文強調的是一種思想,切記!架構