AndroidDocker一致架构设计(1)

-- 追求今天决策的未来性

 

By 高焕堂 (台灣Docker論壇 主席)

2015/02/23  misoo.tw@qq.com

 

高煥堂的相關文章: 

  A01从「集装箱」思考Docker风潮:Docker潮流下的赢家策略 

  A02Docker从容<器>到集装箱设计之<道>

  B02、Android和Docker的一致架构设计(2):包装<跨集装箱>的通信协议 

  B03、Android和Docker的一致架构设计(3):建立企业主的<核心集装箱> 

  B04、Android和Docker的一致架构设计(4):<分合自如>的设计模式

 

前言

  企业需求的变化,往往如流水般不可测;也就是因为它的不可测性,所以才需要优越的架构设计。虽然未来世界是不可知的,但我们的目前决策会影响世界未来的发展轨迹。所以架构师专注的不是未来决策,而是目前决策的未来性。在当今的大数据时代里,需求日益碎片化,藉由集装箱形式包装微服务(碎片)成为主流趋势,无论在移动终端或云平台,如果都能一致追求(目前)决策的未来性,将能有效支持企业的整体、和谐与创新服务。

  因此,本文将以Android框架和Docker集装箱为例,说明架构师如何扩大视野,涵盖终端和云平台,以一致的架构设计思维,追求决策未来性,开创产品的不一样生命。

 

1、设计理念的一致性(Conceptual Integrity)

  1960年代开发IBM OS的Fred 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。当用户于稍后出现时,用户没有选择的余地,这样的设计常常不能满足各用户的特殊需求,所以他们不会想买这样的产品或系统。这表示这个系统架构的设计是没有未来性的,没有办法适应未来各种不可预期的环境变化(如用户的的不同需求)。于是,架构师将SurfaceView与Camera两者的相依性(Dependency)降低,成为疏结合(Loosely Coupled),预留了弹性,让用戶在稍后出现时,能有决策的空间,并委托App开发者把其决策写在App里。如下图所示:

  

   图-2、创造了弹性的决策空间

 

3.2 表现出架构设计<决策的未来性>

  一旦SurfaceView与Camera两者变成为疏结合(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),以便创造整体的和谐感。其中的设计理念之一就是:目前(设计)决策的未来性。从本文里,我相信您已经能基于Android和Docker的经验而更上一层楼,迈向兼具<整体、和谐与创新>的更高境界了。

 

高煥堂的相關文章: 

  A01、从「集装箱」思考Docker风潮:Docker潮流下的赢家策略

  A02、Docker:从容<器>到集装箱设计之<道> 

  B02、Android和Docker的一致架构设计(2):包装<跨集装箱>的通信协议 

  B03、Android和Docker的一致架构设计(3):建立企业主的<核心集装箱>

  B04、Android和Docker的一致架构设计(4):<分合自如>的设计模式

 

~ End ~