架构师如何从复杂中设计出简单? – 反思许多架构师的迷思

来源:互联网 发布:cdx什么意思网络用语 编辑:程序博客网 时间:2024/06/05 13:29

架构师如何从复杂中设计出简单? – 反思许多架构师的迷思

By 高焕堂

 

  1.  至今,仍有许多架构师都从基类看子类的对称性,而误解为基类表达了其幕后的不变性;因而与另一项对称之美而失之交臂,未能充分落实优雅的软件架构。
  2.  软件美何在? 把酒问<对称>。
  3.  发挥软件架构的对称、单纯和美丽。

 

前言:

    于1996年我用日文写了这篇文章,是我在日本对当年”设计模式( Design Patterns)”热潮下的反思,曾经在东京的一次软件架构会议上,引起许多参会者的响应。也逐渐引起我对软件代码造形的兴趣,也间接促成我在2012年提出<EIT代码造形>,成为软件产业的一项重要发现。今天,我利用退休闲暇,将之整理翻译出来,与各位粉丝们分享。  

  

1. 单纯美丽的密切联系 

   依据 爱因斯坦 相对论的说法:

            事物看上去是相对的,可是不要被善变的外貌所愚弄了。

             ~~摘自 K. C. ColeThe Universe and the Teach-up一书~~

 

    简而言之,当某事物在某种变化中不变,则称该事物具有对称性。也就说,当你把某个对象变换后,其形状不变的话,就找到一种对称性了。例如一个正方形,当它被旋转90度之后,就形状而言,你看不出有什么地方不同;此时你已经看到不变性了,因此找到对称性了。所以,寻找对称性也就是寻找不变性。当你发现两个事物是对称的,就会想到两个事物幕后的不变性,它蕴含单纯和美丽。因之会想到如何表达出这个单纯美丽的密切联系。

 

2. 软件架构的对称性 

    软件架构设计也不例外,架构就是蕴含单纯和美丽,许多软件架构设计就是以精致的技术表达出这个单纯美丽的密切联系。软件架构的对称之美,表现于两个层面:

1.         两个或多个实现子类(Subclass)的对称性,其幕后的接口(Interface)的不变性,就蕴含了单纯和美丽。这在1980年代的OOP(Object-orientedprogramming)风潮下,表现得亮丽耀眼。

2.         两项或多项内涵(Content)的对称性,其幕后的代码造形(Form)的不变性,也蕴含了单纯和美丽。

 

   以上这两个层面,都在1980年代的OOP(Object-orientedprogramming)风潮下,表现得亮丽耀眼。只是当年的C++语言没有”Interface”这个关键词(Key- word),而将接口隐藏于基类(Base class或Super class)里,很多架构师都从基类去看子类的对称性,而误解为基类表达了其幕后的不变性。因而与另一种对称之美(即上述的第二项)而失之交臂,未能充分落实优雅的软件架构。

 

3. 软件架构的第1种对称性 

      依据相对论的说法:“事物看上去是相对的,可是不要被善变的外貌所愚弄了”。因之会想到如何表达出这个单纯美丽的密切联系。例如,两个应用子类(例如子类T1与子类T2)之间,就外貌看来可能是相对的,该如何看出它们之间可能的对称性(即不变性)呢? 架构师大多会从类的接口而观之。此时,会发现两个应用子类的接口是一致的,那就找到对称性了。因为,两个应用子类提供一致的服务,当你从服务角度而观之,从子类T1变换成子类T2时,其接口和服务是不变的。

     当架构师发现众多应用子类是对称的,就会想到表面上繁杂多变的众多应用子类幕后的不变性,它的却蕴含单纯和美丽。例如,框架(Framework)就要蕴含这项单纯而美丽之序,以便包容应用子类的繁杂多变;框架之美就尽在其中矣! 

 

4. 软件架构的第2种对称性 


4.1 最完美的对称:无物 

    在人们心目,具有最完美对称的东西,就是「无物」(Nothing)。这空无抽象概念,在印度的宗教中,占有非常重要的地位。古印度宗教的湿婆神代表最终的空无,祂是世界的创造者与毁灭者。逐渐地,印度又发明一个代数符号来代表「无物」概念,该符号就是「0」。宇宙始于最完美对称的空无,其蕴藏着自然创生的秘密。到了近代,0与1构成软件的最基本元素,完美对称的地方就蕴藏着软件的秘密。


 4.2 虚实相依的力与美:源于对称的单纯和美丽

      就空间而言,无物就是虚空(虚的空间),虚空可以蕴含各式各样的实物,让实物乘虚而(出)入,于是形成虚实相依的美丽境界。依据虚实相依的哲理,虚空可存在于实物之内,实物可存在于虚空之内,层层相依。于是,我将「物」区分为二:

·          虚物 --- 内含虚空,称为虚物。例如,茶杯、集装箱、Windows等,皆可视为虚物。

·          实物 --- 被含在虚空之内的物,称为实物。例如,茶水被装入茶杯中、鞋子被装入集装箱中、或应用软件被加载Windows环境里执行等。

    物是虚或实,并非其本质,而只是相对观点而已。例如,鞋子相对于货柜,鞋子是实,而货柜是虚;而货柜相对于载货柜的轮船,货柜是实,而货柜轮是虚。鞋子、货柜、货柜轮三者虚实相依。由于物之的虚实只是观点而非本质,虚物是藉由虚空间来「持有」(Hold)或「支撑」(Support)实物。虚空间只是让实物能弹性地PnP( Plug and Play)到虚物里。

    当我们把一堆鞋子放入一只集装箱里;经于轮船运抵对岸之后,将鞋子倒出来,成为空集装箱。接着,又把一堆袜子放入该只集装箱里。此时,可观察到鞋子和袜子两项内涵(Content)的对称性,其幕后的集装箱造形(Form)的不变性,也蕴含了单纯和美丽。

   在软件架构里,类(Class)就是代码集装箱,无论基类或子类都属于类造形,都具有不变性,支撑了内涵的对称性。


5. 反思

  1. 基类本是软件集装箱,它的不变性所蕴含的单纯和美丽,必须对映到其内涵的对称性。因此,基类的内涵具有复杂多变的外貌;但是至今许多架构师还是在追求基类内涵的稳定、可靠和不变。这是莫大的迷思啊!!
  2. 为了避免上述的迷思,我(高焕堂)于2012年率先提出EIT代码造形,将接口(Interface)提升为软件架构的第一级公民(First-classcitizen)。于是:

  • 实现子类<T>的对称性对映于接口<I>的不变性,蕴含了第1层面的单纯和美丽。
  • 基类<E>和子类<T>的内涵的对称性对映于EIT造形(即基类+子类造形)的不变性,蕴含了第2层面的单纯与美力单纯与美丽。

6. 结语

   面对复杂,科学家(或架构师)必须设计出简单,让攸关人员皆能享受从简单中叫出复杂的满足感。兹回忆,于十七世纪中,牛顿提出了简单公式(即造形):F=ma;让人们能轻易理解物体运动的复杂<关系>。再如,于二十世纪初,爱因斯坦发表了简单公式:E=mc平方;让人们能理解复杂的质量、能量与光速之间的复杂关系。  商业(环境与)模式是复杂的,架构师也必须设计出简单,才能进一步支撑复杂的产品创新活动。著名的软件专家Fred Brooks(<<人月神话>>一书作者)在40年前就说道:

  ”软件的复杂性是本质性的,并非表像而已。”(The complexity of software is an essential property, not an accidental one.)


由于软件的本质是复杂(多变)的,不能纯然去追求本质;于是,软件架构师必须先领悟其复杂本质,设计出简单之形(架构),让人们(如软件开发、营销团队)能从简单中掌握复杂的本质。那么,架构师如何从复杂中设计出简单呢? 答案是:充分发挥上述的两个层面的对称、单纯和美丽。以上摘自我的新书《思考软件,创新设计:A段架构师的思考技术》。  

 

 

0 0