架构模式的圣经

在模式领域里,有一部伟大著作给予软件设计领域带来的影响非常大,那就是以德国人Frank Buschmann为主要贡献者的《面向模式的软件架构》(Pattern-Oriented Software Architecture)系列。

提及模式,开发人员的第一反应一定是GOF的《设计模式》。毫无疑问,这本软件领域的经典著作已经深入人心,差不多可以说是设计模式的圣经了。书中的23种模式已经成为开发者之间进行交流的术语,使用它们甚至像使用语言中的惯用法一般自然。然而,事实上,在模式领域里,还有一部伟大著作给予软件设计领域带来的影响同样的大,那就是以德国人Frank Buschmann为主要贡献者的《面向模式的软件架构》(Pattern-Oriented Software Architecture)系列。相对于《设计模式》而言,我以为这一系列可以称之为是架构模式的圣经。

这一套煌煌巨著一共分为五卷,其中第一卷《面向模式的软件架构:模式系统》(Pattern-Oriented Software Architecture Volume 1:A System of Patterns)的出版日期为1996年8月,最后一卷《面向模式的软件架构:模式语言》(Pattern-Oriented Software Architecture Volume 5:On Patterns and Pattern Language)则出版于2007年5月,也即是说整个系统从创作到出版跨度长达十余年的时间,单以这一点来说,本书的作者们,尤其是主要贡献者Frank Buschmann的毅力值得钦佩。

与《设计模式》不同,本系列主要的关注点放在了架构层面。根据Richard Helm(GOF之一)对设计的划分,这些内容应属于宏观架构(macro-architecture)的部分,可以作为处于微观架构(micro-architecture)中的《设计模式》的有力补充。正因为此,阅读这一系列须得有足够的架构经验或基础,才能有所收获,而如此多卷的大部头著作,也是许多人望而却步的主要原因。

为了对架构以及架构模式有更深入的理解,我曾硬着头皮、下定决心、不辞万难地啃完了这个系统的三卷,分别为第1、3、4卷。在我未来的阅读计划中,本系列的第二卷是我必须要阅读的。关于第五卷《模式语言》,窃以为更多地是偏向理论介绍,大可以忽略不计。因此,以我的阅读经验来看,自认为有几分资格来谈谈我的阅读体验。

这个系列虽然都是讲解架构模式,但各有其特色,关注点也有不同。整体说来,第一卷《模式系统》介绍的内容更为宽泛而通用,书中讲解的各种架构模式也已得到了足够广泛的普及,例如大家耳熟能详的Layer 、MVC以及Pipes And Filters模式,都在本书进行了深入的讨论。当然,准确说来,本书涵盖的内容其实涉及到模式的各个方面。

作者将模式分为三个层次,分别为架构模式、设计模式与惯用法(Idioms)。前面提及的模式就属于架构模式的类别,除了这三种模式之外,Broker模式、Presentation-Abstraction-Control模式以及Microkenel模式,对于我们进行软件架构活动而言,都有非常重要的参考价值。至于书中的设计模式部分,可以看做是《设计模式》的延续,有的模式表达的思想本质与GOF的《设计模式》完全一致,只是在命名上略有不同。例如Whole-Part模式与GOF的Composite模式,Publisher-Subscriber模式与GOF的Observer模式都有着千丝万缕的关系。

书中还提到了《设计模式》所未曾涵盖的内容,如Forwarder-Receiver模式与Master-Slave模式,以及Client-Dispatcher-Server模式,都非常有用,尤其可以运用在并发场景或分布式场景中,这正是GOF《设计模式》较少提及的内容。

我虽然未曾阅读本系列的第二卷,但仍然粗略的翻看过,其中讲到的诸如Reactor模式、Active Object模式与Leader-Follower模式等,都曾经有过深入了解并在项目中运用过。该书的主题是用于并发和网络化对象的模式,这对于真实的大型应用系统而言非常重要,却又是我们在系统设计中最常面对的难题。本书的介绍与讲解方式完全延续了第一卷的风格,既有理论阐述,又有案例详解,同时又保持了一贯严谨的学术风格。

本系列的第三卷是唯一没有Buschmann参与的一本,也是最薄的一本,但书中讲解的概念却同样关键。该书主要介绍了与资源管理相关的模式,例如Lookup模式、Lazy Acquisition模式与Caching模式,以及Pooling模式等。关于资源管理的相关问题,事实上在企业应用系统中相当普遍,无论是硬件资源、网络资源还是其他外部资源,从性能、可重用性与可扩展性角度来看,都是值得关注的。这其中很多模式也得到了广泛地运用。例如Java中的JNDI就采用了类似Lookup模式的设计,Lazy Acquisition模式也在诸多框架例如Hibernate与Spring等得到运用。Leasing模式在WCF或早期的.NET Remoting中也得到了有效运用。

第四卷虽然名为《分布式计算的模式语言》,但事实上可以看作是一本模式目录,因为本书涉及到的模式一共包含了114种模式,这其中还没有计算参考到的另外150多种模式。形象地说,本书好像是模式大观园,其中的风景可以说是美不胜收。然而,正是因为美丽的景点实在太多,就很容易导致风景的欣赏者开始走马观花,最后充斥在脑海中的不过是肤浅的一堆表面印象而已。

粗略看来,由于要介绍的模式太多,而书的容量有限,导致许多模式的介绍只能浅尝辄止。我不否认这确乎是事实,但另一方面,本书对模式的这些描述言简意赅,背后包含的思想与意义,却又值得我们反复思索。例如,本书将Domain Object模式描述为:“将自我完备的连贯功能和基础性责任封装成定义良好的实体,通过一个或多个Explicit Interface提供功能,并隐藏内部结构和实现。”在这个描述中,所谓的“自我完备”一词就值得我们反复玩味,若能充分地体会到封装的意义与面向对象的本质,当阅读到这个词语时,定能会心微笑,犹如遇见知音一般的快乐。

面对这样一套浩如烟海的著作,我们该怎样阅读,才能攻克架构模式这座堡垒呢?

在阅读到第4卷时,通过回应前面几卷的内容,给了我一个很好的提示。我认为,最好的阅读方法就是《如何阅读一本书》中提到的主题阅读(Syntopical Reading)方式,即通过确定主题相关性,定位到相关章节,广泛查阅资料,汲取与主题相关的知识营养,进而深入地分析这个主题的方方面面。本系列的第四卷就起到了很好地提纲挈领的作用。

如果大家希望阅读这一系列,并能在阅读之后真正有所收获,我建议的阅读顺序为:首先阅读本系列第一卷,其目的在于对模式(架构模式、设计模式与惯用法)与模式系统有一个初步的认识,可以算作是登堂入室的第一步。没有踏出这第一步,就很难谈得上你能够很好地理解架构模式。这一步骤可以是一个快速浏览的过程。正如陶渊明所言“好读书,不求甚解”,此次阅读完全可以遵循这七字法则,不必深入理解书中讲解的每个模式。阅读时不能理解的,可以暂时搁置在一边。

有了第一遍的基础,就可以翻开第四卷,开始真正的模式之旅了。本书有价值的内容全部都放在了《第二部分 模式故事》与《第三部分 模式语言》中。当然,如果你希望了解什么是分布式系统,也可以快速阅读第2章的内容。本书的第5章《基线架构》写得非常漂亮,极好地表现了作者非凡的写作功底与扎实的技术功底,这是我读过的除了《企业应用集成模式》第一章《运用模式解决集成问题》与《设计模式》第二章《实例研究:设计一个文档编辑器》之外,将理论与实际案例结合得最好的一章。事实上,这个案例应该是从第四章开始,简略地介绍了整个案例的需求,然后就从架构环境,层次分解,领域层,分布式通信,用户界面,功能分布,并发处理,数据持久化等诸多方面,层层递进地勾勒出整个仓库管理流程控制系统的架构过程,且非常完美地嵌入了本书所要讲解的主要模式。因此,用这个案例来开始你的模式之旅,就让自己现在走的一步站在了更高的起点上。

将如此众多的内容浓缩到这一章中,必然会产生阅读障碍。没有关系,你可以默念“不求甚解”的真言进行你的阅读,它可以给你心灵上极大的安慰与自信,使得你不至于在面对困难与挫折时,直接缴械投降。这确实需要足够的信心才能让自己不至于中途放弃,因为这样磕磕巴巴的阅读之旅,会一直持续到第7章《仓库拓扑》,你才可以停下来喘一口气(事实上,从第4章一直到第7章,才算完整地介绍完整个项目案例的架构设计与分析)。

休息好了吗?收拾好心情,活动活动疲惫的双脚,做好继续迎面困难的准备吧。因为前方还有无穷多的高峰和险峰在等着你去征服呢。从本书的第三部分开始,你就进入了模式语言的世界中,希望你能保持足够的清醒,不要在模式语言中迷了路。在这个环节中,我认为最好的阅读方式应该是一种“超链接阅读”方式,简言之,就是以本书为纲,开展纵向和横向的阅读,就像浏览网页时不停地点击超链接了解相关知识一般。你需要准备足够多的资料,包括本系列的前面三卷以及其他相关书籍。

举例说来,当我们阅读到第9章介绍的Domain Model模式时,你绝对不能仅满足于本书的内容,而应该在阅读完本书对该模式的介绍后,再去翻阅Martin Fowler的著作《企业应用架构模式》,找找看Martin对Domain Model是怎样描述的。又例如在阅读到第10章的Message Endpoint模式时,可以翻阅《企业应用架构模式》第3章中对该模式的介绍。阅读到本书第15章的Leader/Followers模式时,应查阅《面向模式的软件架构》第二卷第5章的内容。如果你仍然没有很好地理解,你还可以通过本书提供的参考文献获取相关知识,又或者通过互联网搜索相关的文档。而这正是所谓“主题阅读”的阅读形式,严格地讲,它更像是一种学术研究,通过延伸与比较的阅读,彻底明白每一个知识主题。

当把这些模式(当然,你也可以只选取你感兴趣或认为重要的模式)全部吃透之后,或许光阴已经飞逝一年或者二载。不管怎样,通过这种精读的形式,并结合自己项目中的经验与收获,你已经在架构模式之旅中行进到足够远的距离了。此时的你可以再回过头来通读本系列的第一卷,以及第四卷,特别包括第四卷的第二部分,你一定会产生豁然开朗的感觉。

会否觉得这是艰辛而又漫长的旅程呢?既然你已经选择了走上软件开发的道路,在希望提升自己的前提下,就一定做好了这样的准备。与其临渊羡鱼,不如退而结网,最重要的不是学习方法,而是执行力。即使是最美好的学习方法,如果没有执行,仍然是镜花水月。倘若是在犹疑不定中三心二意地阅读本系列,一定会半途而废;因而要想阅读本系列书籍,就必须下定决心,准备好把这一年的业余时间献给这无与伦比的不朽著作吧。顺带说一句,在阅读这一套艰深的书籍期间,可以配套阅读一些相对轻松的书籍,例如《黑客与画家》,《浪潮之巅》或者《程序员的思维修炼》之类的书籍,就当是给自己的大脑放放假吧。

卷1:模式系统

卷2:并发和联网对象模式

卷4:分布式计算的模式语言

原文发布于微信公众号 - 逸言(YiYan_OneWord)

原文发表时间:2015-06-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ImportSource

微服务-捣乱的猴子

在微服务的架构中有这样一个词,叫Chaos Monkey。翻译过来就是捣乱的猴子。这个概念最早是被在Taleb的书中提到。Antifragile。抵抗力里边的R...

3378
来自专栏量化投资与机器学习

几种编程语言的优缺点

我的旋风式简介会讲C、C++、Lisp、Java、Perl 、Ruby (我就是喜欢) 和 Python,把 Python 加进来是因为 —— 好吧,你看了就知...

44611
来自专栏Kiba518

谈谈我理解的SA——Systems Architecture

系统体系结构是定义系统的结构、行为和系统视图的概念模型。架构师将其系统的形式化描述或表示出来,以支持结构和行为的推理的方式组织。

472
来自专栏Golang语言社区

改变未来IT世界的十种编程语言:Go语言

这里要说的都是革新,说这些的目的就是要保持关注最新技术。如果你是一个程序员,想要探寻未来技术,那这篇文章就是你的必读之选。我们这里列出了10种编程语言,10种将...

3065
来自专栏飞总聊IT

大数据的那些事(4):活雷锋与风口的猪

按照惯例今天应该是继续讲三驾马车的BigTable,但是一则BigTable这东西不容易一下子说清楚。二则我觉得是时候停一下技术,多聊点八卦。所以我们来讲讲这个...

3406
来自专栏斑斓

晴窗闲谈 | 从Go语言的设计学习设计决策

阅读了Rob Pike撰写的《Go在谷歌:以软件工程为目的的语言设计》,颇多感触。这些感触并不在于语言层面,或者Go这门语言的语法以及底层实现;而是因为语言设计...

3567
来自专栏飞总聊IT

大数据时代的装逼利器之CAP理论

诸位读者在读这篇文章之前请先举个手,有没有谁听说过CAP理论,又有谁明白CAP理论到底是个什么东西的?作为新时代的码农和数据工程师,在大数据的浪潮下要是连CAP...

3279
来自专栏ThoughtWorks

C#读书雷达 | TW洞见

大家都知道,ThoughtWorks的技术雷达每年都会发布两到三次,它不但是业界技术趋势的标杆,更提供了一种卓有成效的方法论,即打造自己的技术雷达。在这种思想的...

3257
来自专栏北京马哥教育

R、Python、Scala 和 Java,到底该使用哪一种大数据编程语言?

当你找到大数据项目,你首先会怎么做?确定这个项目的问题领域,确定这个项目的基础设施,在往上,确定项目的框架,选择最适合用来处理当前数据的所有内容。这个时候唯一摆...

2905
来自专栏人工智能头条

DMLC对于机器学习和系统开发者意味着什么?

1416

扫描关注云+社区