1. 什么是架构设计
"架构"是程序员非常熟悉的一个概念,做一个架构师也是很多程序员的职业发展目标,但如果正儿八经地问程序员"什么是架构",估计大部分都回答不上来,这是为什么呢?
首先,因为太熟悉了,所以反而没有深入地去思考和理解,反正一说架构,好像每个人都知道是什么意思,也没有必要花费太多的精力去深入理解了。
其次,因为同级别的概念容易混淆,包括系统、结构、架构、子系统这几个词,看起来大家都理解,但仔细一看又有点迷糊。例如:架构是结构吗?多个子系统结合在一起好像就是架构吧?
看来"什么是架构"这个问题并不简单,我们需要有打破沙锅问到底的精神去探索一下。以下是百度百科的解释(http://baike.baidu.com/subview/1950551/12477396.htm)如下:
架构是对存储在Active Directory中的对象类别和属性,对于每一个对象类别 来说,该架构定义了对象类必须具有的属性,它也可以有附加的属性,并且该对象可以是它的父对象。
对于这个解释,相信大部分人都和我一样的感觉:没看懂,这是在说面向对象吗?
Architecture is both the process and the product of planning,designing,and constructing buildings and other physical structures.
这里架构描述为”既是过程又是产品“,相信大部分人也和我一样的感觉:怎么感觉和我们理解的完全不是一回事?继续探索,终于在词典上找到一个很好的解释:
(computer science) the structure and organization of a computer's hardware or system software.
翻译过来的意思就是:**计算机硬件或者软件系统的结构和组织。虽然这里强调的是在计算机领域,但是其实去掉这个限定,架构的定义在其它领域也一样适用,即:架构是系统的结构和组织。 ** 这个解释非常容易理解,且同时回答了我们之前提到的问题”架构、系统、结构是什么关系“架构就是结构,但是指的是系统级结构,也就是说:”架构是系统的顶层结构“。
除了”顶层“外,”系统“这个词也需要特别注意,因为我们经常说”系统“、”子系统“之类的术语,那么架构是否就只能指”系统“的顶层结构,不能指”子系统“的顶层结构呢?
相信大部人凭感觉都认为这是不对的,因为我经常听到”新浪微博架构“、”新浪微博消息系统架构“、”QQ架构“、”QQ图片系统架构“等,这里的”新浪微博消息系统“是”新浪微博“的一个子系统;”QQ图片系统“是”QQ“的一个子系统,但并不能说”新浪微博消息系统“和”QQ图片系统“就没有架构了。所以这里说的”系统“和”子系统“其实是一个相对的概念,”子系统“也是”系统“,也有自已的架构。
2. 面向对象的架构设计
明确了架构定义之后,”架构设计“的定义也就水到渠成了----架构设计就是设计 系统的顶层结构。不过,这句话其实是一句正确的废话,要想真正做好架构设计,我们必须更深入的去探索一番。最典型的问题就是:我们为什么要做架构设计?
估计这个问题和”什么是架构设计“一样,因为大家都熟悉了,根本没怎么去思考,所以一旦问题起来反而一下子蒙住了。要回答这个问题,我们采用”逆向思维“的方式来思考,即:如果不做架构设计会怎么样?这个问题相信很多人很容易就答出来了。
首先,如果不做架构设计,系统就处于一种混沌状态,非常复杂,有几十上百甚至上千个技术点。当我们构思系统要实现某个功能或者业务时,需要同时关注几十上百个技术点。但是人类的思维是有局限性的,根据科学研究,人类最多能够关注7+2或7-2个点,这就是著名的72法则,超出这个范围,人类的思维就跟不上了,所以我们必须将系统划分为几个大的模块(或者叫子系统也可以,但是为了和”系统“区分,本文将统一称”模块“),每次关注 的点7+2或7-2个,这样人类的思维才能更好的思考、分析、解决问题。
归纳起来第一条就是:架构设计的目的是为了隔离关注点,降低复杂度。
其次,如果不做架构设计,系统就是一个大一统的的整体,当我们有几百个开发团队时,这些团队无法分工合作,要么一拥而上,要么无从下手,整个系统的实现过程就会变成一团乱麻。所以,我们必须将系统划分为几个大的模块,不同的团队负责不同的模块,从而达到分工工作的目的,提升整体工作效率。
归纳起来第二条就是:架构设计是为了更好的分工合作。
理解了“为什么要做架构设计”后,架构设计的任务也就自然得出来了:架构设计的任务就是将系统划分为不同的模块。当然,我们也不能简单地一拆了事,拆完模块后还要考虑让这些模块能够互相联系、互相沟通、互相配合,这样才能够完成系统的功能 。
我们以一个简单的公式来表达架构设计:架构=模块+交互!模块就是“模块1”、“模块2”等,交互就是模块之间的连接线。
如果你还记得我们最开对面向对象的定义的话,你一定会发现一个惊人的事实:架构设计和面向对象程序设计非常相似,面向对象的的公式:程序=对象+交互。
看起来可能是巧合,其实不然,原因在于架构设计就是“面向对象”思想的一个具体的应用而已。也就是说,“面向对象”的思想可以指导程序设计,也可以指导架构设计;而且在架构设计领域,可以说只有“面向对象”这一种指导思想,因为架构设计必须划分出模块并设计好模块的交互方式。
更进一步分析:
-
面向对象程序设计通过封装为“类”来降低复杂度,面向对象架构设计通过封装“模块”来降低复杂度;
-
面向对象程序设计通过“类交互”来完成分工合作,面向对象架构设计通过“模块交互”来完成分工合作。
3. 小结
- 架构就是系统顶层结构
- 架构设计的第一个目的是为了隔离关注点,降低复杂度
- 架构设计的第二个目的是为了更好的分工合作
- 架构设计的任务是划分模块,设计模块的交互方式
- 架构设计的指导思想就面向对象的思想