2015年3月4日 星期三

Android和Docker的一致架構設計 -- 追求今天決策的未來性

AndroidDocker的一致架構設計
-- 追求今天決策的未來性

By 高煥堂 

前言
    企業需求的變化,往往如流水般不可測;也就是因為它的不可測性,所以才需要優越的架構設計。雖然未來世界是不可知的,但我們的目前決策會影響世界未來的發展軌跡。所以架構師專注的不是未來決策,而是目前決策的未來性。
   在當今的大資料時代裡,需求日益碎片化,藉由貨櫃形式包裝微服務(碎片)成為主流趨勢,無論在行動終端或雲平台,如果一致追求(目前)決策的未來性,將能有效支持企業的整體、和諧與創新服務。
   因此,本文將以Android框架和Docker貨櫃為例,說明架構師如何擴大視野,涵蓋終端和雲平台,以一致的架構設計思維,追求決策未來性,開創產品的不一樣生命。

1、設計理念的一致性(Conceptual Integrity)
    1960年代開發IBM OSFred Brooks說道﹕Conceptual integrity does require that a system reflect a single philosophy and that the specification as seen by the user flow from a few minds.”(概念一體性是一個系統反應出一致設計理念﹐讓人們感覺到整個系統猶如由少數幾位元設計師精心策劃一般。)
    
    這種感覺,在城市建築中也能感受到,它能創造整齊的協調感(和諧感)。例如,田思怡 在其歐洲遊記裡曾寫道:

比利時的布魯日(Brugge)是歐洲觀光客的最愛之一,雖然觀光客不少,但仍可隨處覓得一個僻靜的角落,發思古之幽情,城內建築物的造形不一,卻十分整齊協調,整個城市猶如由一位大師精心規劃的一般,找不到一棟礙眼的建築。

這個概念一體性包含了空間的完整性。不同的建築師在不同時期裡,興建出各式各樣的建築物,只要都能與空間搭配而且維護其一體性,就自然猶如由一位大師精心規劃的一般。Fred Brooks 又說道﹕

Today I am more convinced than ever. Conceptual integrity is central to product quality. Having a system architect is the most important single step toward conceptual integrity. These principles are by no means limited to software systems, … 
(我現在更相信,概念一體性是系統品質的核心。聘請系統架構師是邁向概念一體性的關鍵步驟。這個原則並不限於軟體系統,)

    所以,大家常說,一般架構師用心于改善客戶的系統架構和設計,而傑出架構師努力改變自己的思考角和視野。因為傑出架構師想領導團隊開創產品的不一樣生命,必須仰賴自己對它有主見的思考。

2、舉例:媽媽決策的未來性
    從日常生活中也能領悟到決策的未來性。例如,一位完全聽從小孩為所欲為的母親,很可能會寵壞了小孩,所給予的並非小孩的真正需求,因為小孩對「未來的」環境和技術變化的知識並不充足,其明示的需求常常偏於眼前視野。無論是一般的系統架構設計,或者是軟體框架設計,都是關注於:目前決策的未來性。例如:
小孩目前就想去買糖果吃(這是目前決策)
媽媽正苦惱著要不要答應小孩(這是目前決策)

   如果媽媽唯小孩的需求是從,每次都答應小孩買糖吃,逐漸地媽媽就失控了,再也沒有替小孩思考未來的空間,導致目前決策偏於眼前短利,目前決策就失去它的未來性了。媽媽有責任要確保整體家庭的目前決策具有未來性,以保護小孩未來的健康、安全和成長。

3、Android框架領悟<決策的未來性>
3.1  SurfaceView框架為例
    照相機(Camera)能透過鏡頭去取得影像,然後將影像傳遞到SurfaceView顯示視窗裡呈現出來。為了有效的未來,目前透過比較彈性的途徑去將接口(Interface)拉到對方。例如下圖的系統架構設計,就是缺乏未來性的:

 
-1、少了未來性的設計決策

    架構師做了決策:SurfaceView搭配Camera。當使用者于稍後出現時,使用者沒有選擇的餘地,這樣的設計常常不能滿足各使用者的特殊需求,所以他們不會想買這樣的產品或系統。這表示這個系統架構的設計是沒有未來性的,沒有辦法適應未來各種不可預期的環境變化(如使用者的的不同需求)
   於是,架構師將SurfaceViewCamera兩者的相依性(Dependency)降低,成為疏結合(Loosely Coupled),預留了彈性,讓使用者在稍後出現時,能有決策的空間,並委託App開發者把其決策寫在App裡。如下圖所示:
-2、創造了彈性的決策空間
    

3.2  表現出架構設計<決策的未來性>

    一旦SurfaceViewCamera兩者變成為疏結合(Loosely Coupled)關係了,當業主在稍後出現時,就能做彈性的組合了。例如,委託App開發者把 SurfaceView聯接到醫院加護病房的儀器設備上。如下圖所示:

 
-3、彈性的決策空間,創造了系統的未來性


    所以,在Android框架的支持下,我們將醫院加護病房的儀器聯結到護士站的Android TV(電視機),讓患者的病情及時傳送到TV上。同時,TV也主動再將訊息及時傳送到醫生的手機或Pad上,讓醫生能進行即時性的決策,提供更高品質的服務。如下圖所示:

 
-4、醫院ICU的即時訊息傳遞系統架構


架構師的職責不是對使用者的未來行為,進行明確的預測。架構師專注于未來環境的變化,創造更好架構來包容未來環境的變化。架構師要處理的是使用者的未來行為的「變化」,而不是行為本身。架構師的洞悉力愈好,規劃出來的架構就愈能替使用者帶來高度的決策空間。基於這樣的優越架構設計,產品就會具有未來性,能掌握美好商機。


4、Docker雲端:也採取一致的設計理念
在上述的圖-1可以看到,兩個碎片(Docker貨櫃)之間,如果直接連結(例如直接使用對方的接口),將產生高度的相依性。如下圖:

-5、少了未來性的設計決策

    
A貨櫃的開發者知道B貨櫃有一項拍照片的功能(或函數)時,自然而然會將該項函數名稱寫在A貨櫃的程式碼(Code)裡,下圖:

 
-6、程式碼之間的相依性

於是,就產生了相依性,也就降低了未來(變化的彈)性了此時,可以增添一個轉接器(Adapter)貨櫃,如下圖

 
-7設計一個Adapter貨櫃


那麼,可能你馬上會問到:這轉接器C貨櫃裡,其內涵是什麼呢? 此時,可參考上圖-2,採取一致的架構設計理念:力求設計決策的未來性。於是可設計出轉接器C貨櫃的內涵,如下圖:

 
-8轉接器貨櫃的內涵


    如此,讓A貨櫃與B貨櫃之間的相依性降低了,也提升的彈性。例如,必要時可以將B貨櫃抽換掉,改換成為H貨櫃來與A貨櫃組合,創造新的服務,如下圖:

 
-9、可迅速而彈性抽換

值得留意的是,在這圖裡,C貨櫃裡的<I>介面通常是由A貨櫃的開發者所定義的。而綠色模組則常常是由協力廠商(即組合者)所開發的。因此,從開發者(Developer)視角來看,這是由三種開發者互相<分工>的結果,如下圖:

 
-10三個開發者團隊的<分工>

    反之,從維運(Operator)視角來看,這是由三個Docker貨櫃所<組合>而成的。傑出架構師常常善於創造出這種<分合自如>的彈性架構,來開創產品的高度未來性

5、未來性架構設計
5.1 創造未來重構的自由度
構師團隊如何給自己創造重構的自由度,以及支持開發者重構的空間,是架構設計的關鍵議題。這種自由度,決定于架構師是否能仔細分辨出:關注<未來的決策>與關注<今天決策的未來性>的微妙差異了。愈是能關注<今天決策的未來性>,而不是關注<未來的決策>,就愈能創造未來重構的自由度。
從上圖-9和圖-10哩,可以看出來,<I>A貨櫃與B(H)貨櫃的組合點。這項<未來性>架構設計,其實在日常生活中,也是俯拾可見的。基於此種<分合自如>的一致性設計思維,我們就能輕易理解到:為什麼火鍋店裡的桌子上都會挖洞了。同樣地,也很容易理解:為什麼汽車車輛都會把輪胎拔掉,留下輪盤(或輪穀)介面,這讓買主在買了車子之後,未來隨時可以改變選擇(公路或高山等)搭配不同的輪胎,展現出設計師目前決策的未來性了。例如,買主未來決定將車子要到沙灘上跑時,就更換新輪胎如下圖:

 
-11、包容未來變化範例()

買主在未來時間裡,可能會改變他決策。例如,買主未來又改變需求,決定將車子開到高速公路上時,就更換新輪胎,如下圖:

 
-12、包容未來變化範例()
     
再如,買主未來又改變需求,決定將車子開到高山雪地時,又可隨時換新輪胎,如下圖:
     
-13、包容未來變化範例()
     
從這圖裡,可以看到我所提出的EIT架構設計模式(或稱EIT造形)。架構師設計了介面<I>來容納買主未來決策的改變,這也意味著:架構師的目前決策(決定如何定義介面)具有高度的未來性。EIT造形讓架構師、開發者都具有整體觀,兼具通用性和特殊性的考慮,因而讓整體系統具有高度的未來性和敏捷性。

5.2  組合與創新
有些人認為,架構設計是要尋覓系統的共通性。其實,架構是獨一無二的,架構設計是追求獨特性的、氣象萬千的、與眾不同的嶄新組合。蘋果約伯斯(Jobs)
創造無非就是把事物聯結起來。即若是非凡的創通常也不過是對已有事物進行的新組合和關聯而已。
在《7 Brains:怎樣擁有達芬奇(De Vinci)7種天才》一書裡,作者寫道:
能不能看出事物的關係和模式,並做出不尋常的組合和關聯,乃是創造力的核心要素。

剛才已經說過了,在需求碎片化的時代裡,架構師的職責並非去萃取共通性,而是追求與眾不同的創新組合,並力求設計出未來性。關於共通性許多人熱衷於<亂中有序>,致力於分析(Analysis),並對分析結果進行抽象,抽出萬變不離其<>,把此宗視為不變的序(Order)或本質(Essence),然後基於這本質來進行產品開發,如下圖:
    
-14、追求共通性

至於獨特性(與眾不同)方面,例如在飛機行業裡,架構師的願景是把一群各自「不會飛」的元件(如輪胎、引擎、機翼、機尾、油箱等),以精緻架構將它們巧妙地組<>起來,竟然整體就飛起來了,如下圖:

-15追求獨特性


在追求獨特性時,架構師心中先有合的目標,才來做<>的動作。分離出很多介面,依據介面來組合出許多新奇的產品。由於EIT造形具有重複組合的特性,人們可以組合出多層級EIT造形體系的結構,進而設計出多層級的框架,就能創造更大的重構自由度。

6、結語:整體、和諧與創新
蘋果賈伯斯(Jobs)曾說:
你必須相信今天所做的<決策>會影響你的未來。

所以,今日決策的未來性關係到個人或企業的未來發展。架構師是重要的決策者,他要透過架構<設計>來創造<今日決策>的未來性。對企業而言,所謂未來性就是未來競爭主導性。所以,架構設計不僅要適應未來的變化,而且要讓企業、產品或系統在未來多變的需求趨勢、時尚空間裡取得市場的競爭話語權。

架構師的職責是致力於現在決策,並讓它能包容未來的變化,也就是讓<目前決策>具有未來性。架構師不是去預測未來(的標準),不是去關心<未來決策>、去替未來做決策。架構<設計>不是要去實現<需求>。需求是善變、市場主導權之競爭也往往如流水般不可測;也就是因為它的未來的不可測性,所以我們需要優越的架構設計。
架構師的核心思維有4個元素:願景、組合、創新、未來性,如下圖:
    
-16、架構師決策的4個要素
     
例如,業主的願景是想要能<>,架構師把一群各自<不會飛>的模組(如輪胎、引擎、機翼、機尾、油箱等),以精緻架構將它們巧妙地組<>起來,竟然整體就飛起來了。架構師的職責是要創造<會飛>的整體(Whole),而不是去分析、抽象和開發不會飛的零件(Part)對於客戶(或企業)而言,願景是目標,組合創新是手段;然而對於架構師而言,願景則是手段,組合創新是目的。至於需求(Requirements)則代表現實性。願景和需求都隨時間而變,所以架構決策必須具有未來性。
  因之,在本文裡,就以Android終端 + Docker雲端的架構設計為例,深入闡述如何追求終端與雲端的一致設計理念(Conceptual Integrity),以便創造整體的和諧感。其中的設計理念之一就是:目前(設計)決策的未來性。從本文裡,我相信您已經能基於AndroidDocker的經驗而更上一層樓,邁向兼具整體、和諧與創新更高境界了。

~ End ~

沒有留言:

張貼留言