架构模式的圣经

在模式领域里,有一部伟大著作给予软件设计领域带来的影响非常大,那就是以德国人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 条评论
登录 后参与评论

相关文章

来自专栏悦思悦读

我是这样入门“机器学习”的

大三的时候学过一门“人工智能导论”的课,只记得课里有一些回溯和图搜索的算法,具体细节全忘了。

1003
来自专栏章鱼的慢慢技术路

转载:程序员都应该访问的最佳网站

1975
来自专栏申龙斌的程序人生

搞定GTD - 合乎自然的项目规划法

这次介绍GTD总流程图左侧的项目分解的步骤,对于需要多个步骤的项目,需要留出专门的时间进行项目计划,分解出多个行动来。《搞定1》里称为一个项目的纵向规划,而在《...

3018
来自专栏程序人生

如何从零开始学一门程序语言?

今天一大早排队挂号给孩子看病,耽搁了,现在才发。 说实话,『能花钱的,就不要花时间』是篇即兴之作,本该随着时间被有限的听众渐渐淡忘。但没想到前有 @老赵 微博转...

3176
来自专栏GopherCoder

番外篇:面试总结(1)

1594
来自专栏老九学堂

【必读】每位程序员职业生涯必读书单

很多小伙伴都在问,要成为一个更好的开发人员,我应该读哪些书?我真的需要读书吗? 这是一个很值得探讨的问题,而且很多人推荐的是不同主题的不同书籍。 他们推荐的书在...

3424
来自专栏程序员互动联盟

告别码农

一、成长的寓言:做一棵永远成长的苹果树 一棵苹果树,终于结果了。第一年,它结了10个苹果,9个被拿走,自己得到1个。对此,苹果树愤愤不平,于是自断经脉,拒绝成长...

3388
来自专栏海天一树

给计算机专业大一新生的一些学习规划建议

(零) 每个时代都会悄悄犒赏努力学习的人。 没有人生来就是主角,所有主角都是从龙套开始,一步一步脚印,把自己的路走出万丈光芒。 不少人在高中时候,尤其是高三的时...

3106
来自专栏程序员互动联盟

人类语言遇上编程语言

自然语言(人类语言)与编程语言之间有着很多惊人的相似之处。前些天我做了一个关于这两种语言相似性的讨论,惊讶地发现自己很容易就找到了它们之间的许多共同点。 然而实...

3886
来自专栏编程坑太多

打字速度对编程的影响大吗?

1445

扫码关注云+社区