大数据&云平台潮流下

新一代架构设计思维、方法和技术

-- 应用于数字家庭、物联网和智慧城市顶层设计

 

课程简介:

 各平台皆适用的架构设计方法

    这是一个人人都能学习的新潮课程;也是在当今智能(和移动互联网)时代里,各平台的设计者、开发者都需要的新思想、方法和模式。

 面对复杂,唯有简单

    在当今智能(和移动互联网)时代里,各式各样的设备都透过网络相联而整合起来。就产生了许多种复杂的整合形式,例如云&端整合、软硬件整合、多机整合等。凡是涉及”整合”,都必须仰赖有效的减法设计。因为整合本身就是加法思维,唯有先进行减法、设计出简单架构,才能有效、迅速地进行加法(即整合),并避免加法而产生复杂。

 架构+敏捷:设计出简单,掌握了复杂

       高老师教你一项<架构与敏捷完美组合>的途径(方法),让你花两天时间,就能学会如何设计出简单来掌握复杂的技能了。此方法的要点如下:
           ★  面对互(物)联网的复杂,我们需要减法设计
           ★  有效的减法设计:以软件接口包容通信协议
           ★  接口、组合与创新:新一代架构设计的核心
           ★  接口落实为EIT代码:是敏捷开发的好起点
           ★  需求是限制:需求检验架构,创意爱上限制
           ★  熟谙设计思考,务实减法,以简单掌握复杂

       此方法的详尽介绍,可看看高老师的:”认识<新一代创新型架构设计方法>”

 满意:让用户获得从简单中叫出复杂的满足感

       架构&设计围绕着问题(Problem);设计&创意拥抱着需求(Requirements)。创意&敏捷激发团队的创新(Creativity)氛围。敏捷迭代与代码测试(Testing)让创意深深爱上(需求)限制,认用户获得了从简单(来自设计&创新)里叫复杂(来自智能&联网)的满足感。

 外行人看热闹,内行人看门道

       俗语说,内行人看门道;专业的视角、专业的造形(Form)和模式(Pattern)就是其中之道。因此,本课程将带领学员以内行人的视角,领会设计思考、设计出未来性、落实为代码、且需求检验架构。于是,确保了架构设计的最佳性、可实现性和团队的敏捷性。

 

课程大綱:

内容                                                                                       
Part-1.  目标:从<稳定抽象>到<实践创新>
Part-2.  眼光:以新视角看日益复杂的架构
Part-3.  抽象与组合:必备的思维、方法和模式
Part-4.  范例:设计方法的应用实例解析
Part-5.  多层架构:如何在C/C++平台上建立Java框架
Part-6.  敏捷:让架构设计敏捷起来
Part-7.  成功案例分享:
              ★  案例_A:多机整合创新设计的案例分享
                                  — 以创新型架构设计支持<软硬整合开发>
                                  — 进而落实<硬硬结合销售>商业模式
              ★  案例_B:插件(Plugin)管理机制的设计重构案例分享
                                  — 重构的设计思考
                                  — 从<重构设计>到<重构代码>
              ★  案例_C:高老师的EIT造形与敏捷顶层设计经验分享
                                  — 基于减法设计,让人们更有勇气面对复杂
                                  — 透过迭代和反馈的去芜存菁,让人们更具有信心去经营未来、捕捉新机会

              ★  案例_D:诸葛亮与麦肯锡的减法设计范例
                                  — 诸葛亮的溯因推理&减法设计
                                  — 麦肯锡的MECE设计思考
                                                                                              

 

Part-1.  目标:从<稳定抽象><实践创新>

1.1   增添一个”合”设计元素

  • 由于架构设计有两个基本技艺:抽象与组合(封装);因此衍生两个不同的架构设计流派。
  • 抽象(思维)派:抽象出稳定、可靠、不变的共同性架构。
  • (创新)组合派:增添一个”合”元素,组合出具体独特性的创新架构:
  • “合”元素的影响:以”组合”为目标,先定接口(Interface)来支持组合,并以接口包装内部的结构,让内部结构也是可以变动的,以便支持弹性地敏捷重构。
  • 这(创新)组合派架构设计方法,就是本课程所称的:<创新型架构设计方法>。

1.2   让<目前决策>具有未来性

  • 架构师的职责是致力于现在决策,并让它能包容未来的变化,也就是让<目前决策>具有未来性。
  • 架构师不是去预测未来,不是去关心<未来决策>、或去替未来做决策。
  • 未来环境是善变的、市场需求也往往如流水般不可测;也就是因为它的未来的不可测性,所以我们需要优越的架构设计。
  • 例如上图所示,有两个软件模块:C(Client)模块与S(Server)模块;而且两者之间透过网络通信机制来互通。此时一般人会先去寻找标准的通信机制(如协议),然后才开发C和S软件模块。这就是预测未来(通信途径)了,会让软件架构失去未来性,所以不是有效的软件架构设计思维。

1.3  让架构与代码(Code)两者能无隙缝衔接

  • Kent Beck曾说:”代码是设计(Design)与现实(Reality)的明暗交会处”。
  • 代码是架构的外貌:
  • 为了让架构与代码两者能无隙缝衔接,高焕堂老师设计了EIT代码造形,让接口(Interface)的设计,能够直接落实到代码。
  • 透过接口的落实为代码,及早检测(如TDD),促进互联互通&信息共享。

1.4  让创意深深爱上需求(的限制)

  • 抽象思维派:需求是架构设计的基础;所以又称为Requirement-based架构设计。这是Waterfall开发过程所仰赖的架构设计途径。
  • 创新组合派:愿景是起点,创新组合是目标,需求用来检验;所以又称为Test-Driven架构设计;或TDD( Test-Driven Development)方法:
  • 在TDD检验机制里,需求是架构设计的限制(Constraint);而不是架构设计的基础。这反而让架构师获得更大的创意空间。
  • 所以,谷歌公司副总Marissa Mayer提倡:“创意爱上限制”(Creativity loves Constraint)。她说:”创新来自愿景与限制的互动”(Innovation is born from the interaction between constraint and vision)。限制迫使架构师重新审视愿景(Vision),从不同观点切入,寻找新事物;同时也让其聚精会神、厘清思路;非常具有创新性。

1.5  设计思考:从简单(来自设计&创新)里叫复杂(来自智能&联网)

  • 需求善变的项目开发需要敏捷,敏捷需要搭配<创新组合型>架构设计师,架构师需要设计思考技巧,设计思考仰赖溯因(Abductive)逻辑推理能力。
  • 溯因推理是由观察现象(结果)到原因的猜测推导过程,沿着现象的特征往回追溯产生该现象之原因;它是除了演绎推理、归纳推理之外的第三种逻辑推理方法。运用这种方法去猜测现象的可能原因,受逻辑规则制约的程度较小,具有高度的灵活性,是一种颇具创造性的推理方法。如下左图所示。
  • 敏捷开发的幕后思维,就是 {溯因逻辑 + 迭代过程}。
  • 在一个企业(或公司)里,程序员、架构师和高层经里三者之间有着”战术引导战略”的重要关系。经理与架构师之间是:战略-战术关系;而架构师与程序员之间也是:战略-战术关系。敏捷方法,让”战术引导战略”的机制实际运行起来,例如TDD对代码(战术效果)检验的反馈,带动了架构的重构(战略调整)。
  • 传统上,关于”架构设计”往往比较重视”架构”而不是”设计”,因此对于设计思考、设计技术并不太重视;这常常导致:没有设计的架构。
  • 设计,就是把一件复杂的事简单化,在把简单化出的形式(Form),用事实(reality)和逻辑(logic)加以检验(verify),最后,再以直觉把形与复杂本质结合在一起。
  • 架构设计造形(如EIT造形)的<简单性>,提升了人们擁有面對软件复杂多变的能力;唯有熟谙此道,才能创造架构和产品的<未来性>,才能掌握未來意想不到的機會。

       

Part-2. 眼光:以新视角看日益复杂的架构

2.1  API = 话语权

  • API与UI不同。
  • UI是App与用户的交互接口。
  • API则泛指软件模块间的接口,可分为:
  •      SI:本架构与外部系统之间的接口
  •      PI:本架构与内部挿件(Plug-in)之间的接口
  •      一般API:本架构与应用程序(App)之间的接口
  • 掌握API定义权,就拥有话语权。

2.2  应用框架 = 用来框住应用(App)的架构

  • 框架的基本组成元素:EIT代码造形(Form)。
  • EIT造形的<I>就是API。
  • 框架是鱼饵,API是鱼钩。
  • 鱼饵是送人的礼物;送越多,拥有市场版图越大。

2.3  框架(平台)调用App,不是App调用框架

  • 用户并非直接碰触软件(App)。
  • App在软件架构里,其地位是最低的。
  • 例如,从移动终端发信息给云平台时,云端的IaaS层先接到信息;然后才(调用PaaS服务)来将信息往上送;再调用SaaS层服务来将信息送上去。

2.4  从<C/S API>到<端/云API>

  • API是分工的界线。
  • 过去,Client与Server是由不同团队分工开发的:
  • 今天,谷歌、Facebook、微信等,改变了API、改变了分工,如下图所示:
  • 这称为跨<云&端>强龙企业。

2.5  架构师做<分>的决策,开发者做<合>的任务

  • 肯德基餐厅的厨师做:庖丁(分)解鸡。
  • 肯德基柜台人员则做:组(合)出全鸡、半鸡等套餐。
  • 分得妙、就合得快。
  • 分:无之以为用;合:有之以为利。
  • 因<分>而得接口(Interface),依据接口而快速组<合>。

2.6  <分>的时间点:买主来到之刻

  • 平台(Platform)设计者,必须重视买主,而不是用户。
  • 买主来到之前,先做分(即无之)。
  • 买主来了之刻,才做合(即有之)。

2.7  没钱就改版,改版就有钱

  • 拥有平台(Platform)者,常采取分层(Layered)架构,适合理的。
  • 过去,上层模快(开发者),常常要求下层必须稳定不变。
  • 今天,上层模块不能要求底层的稳定不变,而是要处处维护底层变动的自由度;这样才能实现:没钱就改版(底层),改版就有钱。

2.8  如何跨(别人的软件)平台

  • 除了大家熟悉的HTML5/JS途径之外,还有没有其它跨平台的模式呢?
  • 目前的软件平台大多采框架(Framework)来提供API。
  • 于是,我们的跨平台策略是:挾天子以令诸侯。
  • 这将别人(平台)的API,改变成为自己的API,掌握了API就有话语权。

2.9   软件平台 + 通信网络平台

  • 软件平台与通信网络平台是两的层级。
  • 网络平台是以电信网络为中心,后端(云端)和终端各挂在网络的两端;两者都是网络平台的插件。
  • 软件平台则想办法让网络被包容起来,反过来让网络成为软件平台的插件;这是为什么三网融合可能帮三个软件平台抬轿的原故。
  • 这种架构设计的关键思维是:不能将软件切分为端与云两块,且当成网络平台的插件。
  • 软件平台就像集装箱(Container),将复杂的通信网络、硬件接口、内容格式等包装起来,呈现出简单外形,让人们感到这些事物的可爱、好玩好摸好抱。并没有删除外在事物(如冰箱等)的复杂。而只消除人们心中的复杂感觉,达到简化目的。
  • 例如,Google公司的软件平台(含Android)正好横跨&控制整个互联网。
  • 软件平台控制网络平台,而不是将软件切分为两块,分别挂在网络平台的两端:终端与云端。

2.10  项目管理:搭配敏捷(Agile)的跌代(Iteration)过程

  • 架构的一生:架构的主人是愿景(Vision),架构的生母是问题(Problem),架构的养母是现实(Reality or Constraint),架构的养份是设计师的创意(Creativity),架构的外貌是代码(Code),架构的情人是需求(Requirement),架构的岁月是迭代(Iteration)。

       

Part-3.   抽象与组合:必备的思维、方法和模式

3.1  设计概念与技艺

概念复习

  • 框架是计算机可执行的架构。
  • 框架是当今提供API的只要机制。
  • 深入认识控制反转机制。
  • 主控者是框架,而不是应用程序。
  • 框架的重要功能:提供默认行为(Default Behavior)。

技艺复习

  • 抽象(无之)与衍生(有之)。
  • 打造框架:细腻的抽象步骤。
  • 基本步骤:
  •          细腻的手艺(一):数据抽象
  •          细腻的手艺(二):函数抽象
  •          细腻的手艺(三):将抽象类别转为接口
  • 善用类的继承(Inheritance)机制。
  • 设计基类的抽象函数。
  • 抽象是手段,组合是目的。

UML图形

  • UML的3种基本图表:类图、顺序图和用例图。
  • 以UML表达设计模式和框架。
  • EIT造形的两种表达:UML图和代码。

3.2    架构设计的需求分析方法

  • 基本设计技能:把轮胎拔掉。
  • 伟大的雕刻师罗丹( Musée Rodin)说:”把不必要的部分去掉”。
  • 买主需求:想想为什么(why)汽车架构师会决定把轮胎拔掉呢? 其背后的理由是:买主来了,才知道买主对轮胎的偏好或特殊需求。只有等到买主决定和挑选了轮胎之后,才能将轮胎装配上去。
  • 探索买主需求:
  •         为什么把轮胎拔掉呢?
  •         为什么火锅店的桌子要挖洞呢?
  •         为什么餐厅要分开<食谱>与<点菜单>呢?

3.3    接口设计模式

如何定义接口(Interface)

  • 在OOP里,将接口定义为一种特殊的类别(Class)。
  • 在Java里,将”纯粹抽象类别”称为接口(Interface)。
  • EIT造形的接口表示为<I>;<I>可以合并到<E>里。
  • 被动型API与主动型API。

API与商业模式

  • API决定控制权。
  • 谁拥用接口的制定权,谁就掌握控制点,就能获得较大的话语权。
  • 从API看控制力量的强弱等级。

EIT基础():容易,插件容纳变化

  • 什么是插件<T>?
  • 插件(Plugin)的分类;插件与接口。
  • EIT造形里的插件<T>。

EIT基础():结构制约,积极掌控插件

  • 什么是接口<I>? 谁控制<I>?
  • 接口的分类。
  • <I>决定控制权。

EIT基础():组合创新,让整体<>起来

  • 什么是平台<E>?
  • <E>+<I> = 框架(Framework)。
  • <E>是控制点,透过<I>来驱动<T>。

EIT基础():曹操类,协天子以令诸侯

  • 拿EIT造形搭配Proxy-Stub设计模式,规划Stub类别(曹操类),制定自己的<I>,让<T>脱离上层<E&I>所牵制;实现”挟天子以令诸侯”的效果。

3.4   平台 = 框架 + 引擎

  • 古典:平台 = (服务)引擎。
  • 为了维护底层<引擎>的变动自由度,就采用新架构:
  • 于是,得出典型的Framework-based平台架构:
  • 当今的.NET、iOS、Android平台都是这种架构。
  • App就是一种插件;应用层也是插件层。       

       

Part-4.  范例:设计方法的应用实例解析

4.1  范例(1):保护<DB引擎>的变动自由度

  • 传统架构:降低引擎的变动自由度。
  • 优化架构:加上一个EIT造形。
  • EIT造形直接落实为类别(代码):
  • 此架构的控制点在哪里? myDbHelper类别是谁开发的呢?
  • 此EIT造形与Factory模式有何差异呢?
  • EIT造形如何保护DB引擎的变动自由度呢?
  • SQLite引擎可以”没钱就改版,改版就有钱”吗?

4.2  范例(2):后台<业务规则(BR)引擎>的挿件架构

  • 首先替引擎设计一个EIT造形,并将成长为框架。
  • 插件包括3种:App(用户)插件、业务(业主)插件和平台插件。
  • 当插件增多了,需要设计插件管理机制。
  • 看似复杂的架构,却只是3个EIT造形的巧妙组合而已。

4.3  范例(3):如何搭配敏捷(Agile)或RUP的跌代

  • 两种方法都是跌代(Iterative)的模式。
  • 其实,两种方法也都是渐增(Incremental)的模式。
  • 需求分析也都可以来自:双插式分析法。
  • 依循I&I和Use Case-Driven途径,以 EIT造形来表示接口。
  • 然后将EIT造形落实为类别和代码。
  • 随着<领域概念>分析和<业务规则>分析,得到更多的业务概念、类别和规则,就以前面所述的<平台&插件>关系来组织和重构。
  • 此架构模式,既能搭配敏捷开发,也能搭配RUP方法。

4.4  范例(4):如何提供<插件接口>给Client

  • 通常,后台的业务或平台插件的开发者,与Client开发者是不同的;而且开发的时间点也不一样(插件常开发在先)。
  • 那么,当Client需要调用插件时,后台如何提工插件接口给Client开发者呢?
  • 即使Client端可以从文件中得知插件的接口,又如何调用呢?
  • 首先,后台<E&I>提供一个通用型接口,内含一个通用型函数;
  • 然后,后台提供一个Proxy类别给Client:
  • 那么,又如何提供Proxy类别的代码给Client开发者呢?

       

Part-5.  多层架构:如何在C/C++平台上建立Java框架

5.1  目的

  • 让Client端开发者自己来撰写后台的插件。
  • 于是,后台成为一朵真正的云(Cloud)了。
  • 一个C/C++平台可以搭配多个不同语言的框架。

5.2   做法:以Java为例

  • 使用JNI(Java Native Interface)。
  • 例如,C/C++平台的<业务规则BR引擎>可以搭配一个Java框架。
  • 因为C/C++模块(如<业务规则引擎>)可以调用Java函数,所以C/C++平台仍然拥有主控权。

5.3   也能用ANSI-C语言来设计框架

  • 活用C语言函数指针(Function Pointer)。
  • 在C语言的struct结构内定义一个数据项(Data Item)¸ 并定义其型态(Type)是函数指针。
  • 这个struct结构相当于C++的抽象类别了,而函数指针数据项,就相当于是抽象函数了。
  • 于是,就可以撰写这个struct结构的”子类别”(或插件)了。

       

Part-6.  敏捷:让架构设计敏捷起来

6.1  敏捷与架构的完美组合

  • 敏捷开发的原则和价值观。
  • 开发、架构、测试之关系。
  • 过程观点:(需求)测试做<反馈>,敏捷(过程)做<迭代>。
  • 分合观点:(架构)设计做<分>,(代码)开发做<合>。
  • 测试触发反馈,反馈带动迭代,迭代驱动<架构à代码>重构。
  • 迭代促进了<架构师&开发者>的心灵沟通与携手协作。
  • 举例:架构师如何设计敏捷的起始架构(Simple Solution)
  •       加法设计:围绕问题( Problem)和愿景(Vision),产生创意构想(Creative Idea)。
  •       减法设计:创意爱上限制(Creativity loves constraint)。

6.2  代码是架构的外貌,永远青春

  • 架构是软件的骨架、代码是软件的外貌。
  • 架构是软件的核心。
  • 架构的用意:创新组<合>。
  • 架构设计的焦点:接口。
  • 设计决策具有<未来性>,系统才能适应未来。

6.3  设计与开发的分工合作

  • 架构设计的目的是:组合。
  • 架构师做<分>,支持开发者做<合>,合作实践(系统)组合。
  • 架构师的核心工作:接口设计(Interface Design)。
  • 开发者的核心工作:依据接口,开发(系统)模块并整合。
  • 有许多种开发者:如App开发者、底层系统开发者等。

6.4  敏捷思维:尽快呈现架构的外貌

  • 接口设计是<物>的组合设计。
  • 接口设计是<事>的分工设计。
  • 架构师设计多种接口来支撑分工与组合。
  • 依循敏捷原则,接口迅速落实为代码,尽快呈现外貌。
  • EIT造形:呈现核心设计的外貌。

6.5  一群<E&I>美妙的组合是:框架(Framework)

  • 随着敏捷的迭代过程,EIT造形会逐渐增加。
  • 如何巧妙组合渐增的EIT造形:擅用设计模式。
  • 组合起来,就成为软件框架了。
  • 如何迭成多层级(Layer)的框架体系:以Android为例。

 

Part-7.  成功案例分享

      ◆ 多机整合架构设计与新型商业模式
           ★  详细请看:多机整合创新设计的案例分享
                                   – 以创新型架构设计支持<软硬整合开发>
                                   – 进而落实<硬硬结合销售>商业模式
      ◆ 应用框架的插件管理架构设计
           ★  详细请看:插件(Plugin)管理机制的设计重构案例分享
                                  – 重构的设计思考
                                  – 从<重构设计>到<重构代码>
      ◆ 造形、方法论的设计思考
           ★  详细请看:高老师的EIT造形与敏捷顶层设计经验分享
                                  – 基于减法设计,让人们更有勇气面对复杂
                                   – 透过迭代和反馈的去芜存菁,让人们更具有信心去经营未来、捕捉新机会
      ◆ 溯因推理&减法设计
           ★  详细请看:诸葛亮与麦肯锡的减法设计范例
                                  – 诸葛亮的溯因推理&减法设计
                                    – 麦肯锡的MECE设计思考

~ end ~