从开发、敏捷到设计的捷径

 

一、课程简介:

       一般而言,人们大多先学开发(代码)的技术,随后才学(架构)设计的方法。然而,在实际做事时,却是先设计,随后才写出代码来。敏捷过程则让设计与写码迭代循环下去,一直到完成为止。在本课程里,就遵循敏捷的迭代过程,从思想、方法、模式、范例和成功案例各种不同角度,带你学习从设计到代码的途径。让你在活泼的过程中,轻松地从原本的代码世界,迅速熟悉设计的新天地。在跃入架构设计新天地时,你很快会发现,架构设计的主要流派有二:
         抽象思维派:致力于抽象出稳定、可靠、不变的共同性架构;即追求<万变不离其宗>的宗。
         创新組合派:致力于组合出具体独特性的创新架构;亦即,追求<与众不同>的特质。

       本课程以比较新潮的<创新组合派>为主轴,希望能陪伴你在移动互联网、智能终端的创新潮流中,能如鱼得水、展现无比的创造力。然而,仍然会兼顾两者,在本课程的中间段,也特别帮你梳理和强化<抽象思维派>技艺,这是有效架构师的必备能力。为了让你能顺利从(代码)开发跃升到(架构)设计,本课程会坚持一个美好的信念:
              “各项架构设计决策都必须有未来性,并能迅速落实为代码”

       如此,一方面符合敏捷的原则;另一方面,你可以从熟悉的代码中,领悟到其幕后的设计思想和技术。例如,本课程也以Android开源的代码来阐述其幕后的 UI、IPC、HAL等架构的设计思维和技巧。为了特别强调架构与代码两者之间的无隙缝衔接,高焕堂老师特别设计了EIT代码造形,让组合创新派的设计核心:接口(即EIT的<I>)能直接落实到代码。因之,EIT造形是架构与代码的优先交汇点,成为敏捷开发的起始点(Simple solution);所以EIT被称为:从架构到代码的捷径。


图-1. 高老师设计的EIT代码造形

关于EIT造形的介绍,可参考网站: (http://223.26.63.39/?p=138 )。
       此外,在本课程里,将由高老师指导大家亲自进行架构设计,直接取得实务经验;例如,以移动互联网+智能家庭的情境,设计出手机与TV整合、多萤互动的新型系统架构,并迅速落实为可执行的框架代码。并藉由成功案例分享来提供大量的实务设计模式,融合到框架的开发与API设计上,让学员在最短的时间内获得扎实的设计经验和技巧,并应用于各行各业上。兹说明如下:

二、课程特色

  • <架构>与<敏捷>的完美组合
  • 各项<架构>设计都能迅速落实到<代码>
  • 以EIT代码造形衔接架构与代码
  • 以EIT的<I>强力支持系统(或产品)的创新组合
  • 从原本的代码世界,迅速熟悉设计的新天地

三、 学员对象

  • 熟悉Android应用开发,希望从事架构设计的工程师
  • 想深入了解Android幕后的架构设计者
  • 想兼具<抽象思维派>和<组合创新派>设计思维和技术者

四、课程目标

  • 顺利从<开发>跃入<设计>的新境界
  • 梳理了架构设计思想、方法和模式
  • 拥有组合创新派的{架构、代码、敏捷}三位一体的创新设计能力
  • 学完后具备相当于1-2年Android架构设计的经验

五、学员基础

  • 熟悉Java,Android SDK
  • 熟悉Android应用框架
  • 具备C/C++基础知识,

六、主讲人:高焕堂 老师

  • ”敏捷顶层设计方法”主要创作人
  • MCS设计模式和EIT代码造形的创作人
  • 发表200多篇Android核心技术文章
  • 出版了9本Android专业技术书籍
  • 亚太地区Android技术大会主席。

七、课程大纲

Part-1:  从架构到代码的过程

1.1  敏捷与架构的完美组合

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

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

         架构师与开发者的合作成果:架构+代码=软件(系统)
         架构是软件的骨架、代码是软件的外貌
         架构是软件的核心
         架构的用意:创新组<合>
         架构设计的焦点:接口(Interface)
         设计决策具有<未来性>,系统才能适应未来


图-2.  开发、架构、测试之关系

1.3  设计与开发的分工合作

         架构设计的目的是:组合
         架构师做<分>,支持开发者做<合>,合作实践(系统)组合
         分得妙,就能合得快(即:分之以为用,合之以为利)
         分得妙,就能得好接口(Interface)
         架构师的核心工作:接口设计(Interface Design)
         开发者的核心工作:依据接口,开发(系统)模块并整合
         有许多种开发者:如App开发者、底层系统开发者等

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

         接口设计是<物>的组合设计
         接口设计是<事>的分工设计
         架构师设计多种接口来支撑分工与组合
         架构师心中的4种接口:SI、PI、API和UI
              – SI:本架构与外部系统之间的整合接口
              – PI:本架构与内部挿件(Plug-in)之间的接口
              – API:本架构与应用程序(App)之间的接口
              – UI:App与用户的互动接口
         依循敏捷原则,接口迅速落实为代码,尽快呈现外貌
         关于敏捷思维,可参考高老师设计的”敏捷顶层设计方法论”:


图-3. “敏捷顶层设计方法论” (可参考网站: http://223.26.63.39/?p=138)

1.5  EIT造形:接口美丽的外貌

         认识EIT软件造形
         EIT造形:呈现核心设计的外貌
         EIT造形的<I>可涵盖三种:SI、PI、API
         EIT造形的<E>代表本架构
         EIT造形的<T>代表本架构的配件(即插件:Plug-in)

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

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

Part-2:  从Android框架代码中学习设计

2.1   基础设计模式(Pattern)的代码:以Android为例

         Template Method模式:IoC(控制反转)机制
         Observer模式:接口设计
         Abstract Factory模式:两个EIT造形的组合
         Adapter模式:封装接口
         Composite模式:实践组合
         Façade模式:组合体的接口设计
         EIT造形是原子,设计模式是分子
         更多EIT造形的组合模式:以Android代码为例

2.2  从 UI框架入手

         View体系的架构设计(使用Template Method模式)
         Activity-View的架构设计(使用Factory模式)
         Layout-View的架构设计(使用Composite模式)
         WMS(WindowManagerService)-View的架构设计
         WMS-SurfaceFlinger的架构设计
         Surface-Canvas(画布)的架构设计
         SurfaceView与OpenGL的3D绘图架构设计
         ListView框架的设计

2.3  跨进程(IPC)架构设计

         Android 的IPC幕后设计:BD(Binder Driver)驱动架构
         以IBinder接口包装BD驱动的服务
         包装IBinder接口的Proxy-Stub设计模式
         Proxy和Stub类别的代码
         设计Proxy和Stub类别的API
         如何自动生成Proxy和Stub类别代码
         IBinder & AIDL方法
              – 方法(一):Implementing a Binder
              – 方法(二):Using a Messenger
              – 方法(三):Bound Services

2.4  Java与C/C++两层框架的设计

         JNI(Java Native Interface)代码开发要点
         JNI的数据型态(Data Type)转换规则
         JNI的线程(Thread)模式:JNIENV类的设计
         正向通信:Java函数调用本地C函数
         反向通信:本地C函数调用Java函数
         Android HAL架构设计
              – HAL(Hardware Abstraction Layer)的意义
              – 理解runtime与HAL Stub
              – 撰写HAL Stub代码
              – Stub调用Linux Kernel的方法

2.5  核心服务的框架设计

         认识核心服务(Core Service)
              – 核心服务都是在开机过程中,由Android的INIT进程启动的
              – 包括Android Service和 Native Service两种
              – 以Java语言撰写的,就称为Android Service
              – 以C++撰写的,就称为Native Service
         亲自撰写一个核心服务
              – 撰写一个C++类别
              – 继承BBinder基类,继承得来IBinder界面
              – 提供接口给Java层(透过JNI)调用  

2.6  JUnit测试框架的设计

         Android的测试工具,都是基于JUnit测试框架的
         JUnit框架也是由许多EIT造形所组成;其TestCase基类是<E&I>
         从基类衍生出各子类,如ServiceTestCase;其内涵的setUP()和tearDown()函数就是<I>
         可撰写<T>(即Test case)代码,来启动TDD机制
         可使用TestSuite基类来管理一群相关的<T>(即Test case)

Part-3: 梳理你的架构设计思想、方法和模式

3.1  复习设计概念与技艺

概念复习
         说明框架的起源、分层与其「无用之用」效果
         阐述应用框架魅力的泉源:控制反转(IoC, Inversion of Control)机制
         深入认识控制反转机制
         主控者是框架,而不是应用程序
         现代应用框架:采取广义IoC观念
         框架的重要功能:提供默认行为(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>里
谁控制<I>?
       ◆  <E>成为控制点
       ◆  引擎<E>à<I>à驱动轮胎<T>
如何控制API ?
       ◆  UI与API
       ◆  被动型API与主动型API
API与商业模式
       ◆  API决定控制权&金流
       ◆  没钱就改版,改版就有钱
       ◆  以HAL为例,说明API = 话语权
       ◆  谁拥用接口的制定权,谁就掌握控制点,就能获得较大的话语权
       ◆  从API看控制力量的强弱等级
       ◆  把控制力传播出去

Part-4:  亲自<敏捷+架构>、并迭代出代码


图-4. 多机整合:移动、智能、物联网和云计算

4.1  情境范例:”手机访问TV/STB”

       ◆  愿景:多屏互动、幸福家庭的实践
       ◆  亮点:许多智能设备大量进入家庭,在家里的Android TV建立一朵私密云,
                      来整合窗外多个云平台和手机移动终端,变得流行起来。
       ◆  情境:手机远距访问TV,透过TV打开家中的壁灯开关
       ◆  架构:基于<手机+TV>的大小机相联、大小屏幕互动的新架构
       ◆  设计:设计TV里的框架<E&I>、撰写插件<T>
       ◆  技术:
              – 人们透过手机浏览器访问家庭云,您可以在家庭云里,安装i-Jetty网页容器(Container)
              – 此时,I-Jetty里的HttpServlet就是另一个<E>,而它的doGet()等函数就是<I>
              – 您写的servlet代码就是I-Jetty的<T>,它接受手机的访问

4.2   实际开发:依循敏捷、落实为代码


图-5. 亲自体验:创意爱上限制(Creativity loves constraint)

<架构设计>阶段的敏捷迭代
         Step-0. 准备测试计划
              – 订定此阶段的测试方案(Test Case)
              – 以Android手机Browser为测试方案的执行软件
         Step-1. 设计敏捷过程的起点架构:Simple Solution
              – 通信协议:手机与TV采HTTP通信
              – 软件接口:TV端的EIT造形与手机端Browser对接
              – 设计:以UML表达EIT造形
              – 代码:赚写I-Jetty的Servlet来实践EIT造形
         Step-2. 启动TDD机制、进行迭代
              – 从手机来实机检测TV里的EIT造形的接口代码
              – 依循TDD的反馈,迭代Step-1和Step-2的活动

<代码开发>阶段的敏捷迭代
         Step-3. 准备测试计划
              – 订定此阶段的测试方案:基于用户需求(Requirements)
              – 以Android手机Browser为测试方案的执行软件
         Step-4. 以上阶段Step-2产出的EIT造形为起点架构
         Step-5. 依循测试方案,展开细节设计和代码开发
              – 撰写Android App代码:基于Android应用框架
              – I-Jetty的<T>调用Android的App
              – App透过JNI调用Android的Zigbee驱动代码
              – Zigbee驱动透过Dongle发信号给壁灯开关
         Step-6. 启动TDD机制、进行迭代
              – 从手机来实机检测TV里的有关代码
              – 依循TDD的反馈,迭代Step-5和Step-6的活动,直到完成

4.3   继续敏捷迭代、开发新功能

新功能1手机控制TV里的Camera拍照片
         TV/STB内的i-Jetty含有servlet代码,让手机可以远距来访问它
         TV/STB则内含Camera驱动,能控制摄像头硬件
         运用EIT造形和敏捷迭代,开发软件来整合家外的手机与TV/STB上的摄像头硬件
         让家庭成员随时从手机来打开TV/STB的摄像头,拍了照片送回到手机上呈现出来
         展开敏捷过程,直到完成

新功能2手机控制TV将照片送上云端(Cloud)
         TV/STB将Camera拍摄的照片送上云端:例如Google的GAE等
         基于WiFi通信协议
         展开敏捷过程,直到完成 

Part-5:  架构设计应用:支持跨平台


图-6.  跨别人的平台、整合自己的平台

5.1  跨平台的三个设计策略

         三个实施策略:
              – 策略-1:把它”EIT(设计)”了
              – 策略-2:挟天子以令诸侯
              – 策略-3:建立中间件(middleware)

5.2  跨芯片(小)平台:采取<策略-1>

情境A先有别人的()平台,然后才建立我的平台
         小平台是指别人的平台,该平台的变化决定于别人
         为了跨平台,就不宜直接使用别人的平台
         您设计<E&I>,而且设计<T>来包容别人平台的变化,这就称为:把它”EIT(设计)”了。
情境B先建立我的平台,然后才让别人来扩充(Extend)
         这反过来,让别人设计插件<T>来扩充(extend)您的<E&I>
         别人为了保护他自己,也会将插件分成两部分:<壁虎尾巴>与<壁虎身体>
         万一您的<E&I>有变化时,这只壁虎(插件)便能弃尾求生,让<壁虎身体>跨您的<E&I>

5.3   Android版本(大)平台:采取<策略-2>

         Android升级和版本变更频繁,终端必须随之而更新
         Android是一个多层级<E&I>结构,各层都是由Google所开发
         Google是强龙,位居天子角色,其设计<I>来控制您的插件<T>
         您可以拿EIT造形搭配Proxy-Stub设计模式,规划Stub类别(曹操类),制定自己的<I>
         于是,让<T>脱离Android的<E&I>所牵制;实现”挟天子以令诸侯”的效果

5.4   跨自己的平台(建立中间件):采取<策略-3>    

         随着您的公司业务成长,您的平台版本变更频繁;如何包容自己平台的变化呢?
         可以规划一个上层平台<E&I>来吸纳自己平台的变化,此平台又称为中间件,提供稳定的<I>
         此稳定的<I>(又称API),也保护自己平台的变动自由度,实现”没钱就改版,改版就有钱”效果
         中间件还能提供您的专有API,来凸显自己平台的独特性

Part-6:  架构设计的成功案例分享


图-7.  PhoneGap的重构蓝图

6.1   案例:重构PhoneGap的架构和代码

         议题:PhoneGap目前只搭配HTML5的Web App
              – 如何重构PhoneGap的架构和代码
              – 让PhoneGap也能搭配一般的Native App
         现况:目前PhoneGap的架构设计
              – HTML5 & PhoneGap可以让UI更容易跨平台
              – 其依赖Browser和PhoneGap的插件<T>来吸收平台的差异化
              – 如果插件很多时,PhoneGap里的PluginManager负责管理之
              – UI事件是从WebView传送到PhoneGap的插件<T>
         目标:
              – 即使不采用HTML5,也能使用PhoneGap来管里插件
              – 一旦不使用HTML5,PhoneGap就不再搭配WebView
              – 于是,PhoneGap转而搭配一般的View,如Button等
              – UI事件(Event)改从一般的传送到PhoneGap的插件<T>
         收获:
              – 如何拦截App的启动事件(onCreate事件)和UI事件
              – 以EIT造形加快理解PhoneGap框架的结构
              – 深刻领悟<I>的设计要领:如IPlugin接口设计
              – 熟悉从<重构设计>到<重构代码>的过程

6.2   重构的设计思考  

       重构范围内共有3个EIT造形的美妙组合
              – 第1个造形:{ Activity-DroidGap }
              – 第2个造形:{ WebView-CodavaWebView }
              – 第3个造形:{ PluginManager-Plugin-<T> }
              – 熟悉从<重构设计>到<重构代码>的过程
         因为不再搭配WebView,所以前两个EIT造形都必须重构
         第3个造形最复杂
         上上策是:不重构第3个造形,其内涵和接口代码都保持不变
         成功地让第3个造形跨到重构的新平台(即前两个造形)

6.3   案例的成功关键和启示

         关键:在于上述的设计思考
         洞悉:心怀EIT造形去观察架构
         技巧:从<I>观察重构的变动震幅,找出上上之策
         启示:优越架构,带来易于重构的机会,创造了系统未来性
~ end ~