【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

《阅读者》第 20 期:架构模式的圣经

  • 2012-08-13
  • 本文字数:4148 字

    阅读完需:约 14 分钟

提及模式,开发人员的第一反应一定是 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 章的内容。如果你仍然没有很好地理解,你还可以通过本书提供的参考文献获取相关知识,又或者通过互联网搜索相关的文档。而这正是所谓“主题阅读”的阅读形式,严格地讲,它更像是一种学术研究,通过延伸与比较的阅读,彻底明白每一个知识主题。

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

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

2012-08-13 00:008083
用户头像

发布了 109 篇内容, 共 39.7 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

比特币跌破27000美元!币圈大佬损失惨重,最高身价缩水近9成

CECBC

贝叶斯简介

5月月更

如何给 kitex 贡献单元测试

baiyutang

开源 字节跳动 微服务 5月月更 kitex

Druid连接池源码阅读07

石小天

FFmpeg安装

Loken

音视频

druid 源码阅读 7——keepAlive实现方式

张大彪

架构训练营-模块一

yuansteel

C语言打印程序行号、日期方便调试程序

DS小龙哥

5月月更

架构实战营模块一作业

融冰

网站开发进阶(七十一):css伪元素::before和::after用法详解

No Silver Bullet

css3 5月月更 伪元素 伪类

☕️从 Java8 到 Java17 的新特性(八):Java15 的新特性

看山

Java java15

C++中字符三兄弟(WCHAR、CHAR、TCHAR)

liuzhen007

c c++ 5月月更

Go 语言入门很简单:AES加密和解密

宇宙之一粟

AES Go 语言 5月月更

设计模式之观察者模式

乌龟哥哥

5月月更

5.17电信日 | 融云积极消除数字鸿沟 助力打造数字化新基建

融云 RongCloud

使用 nginx 配置项的好习惯

liuzhen007

nginx 5月月更

区块链有什么价值?

CECBC

数据库连接池 -Druid 源码学习(七)

wjchenge

Druid 数据库连接池

☕️从 Java8 到 Java17 的新特性(九):Java16 的新特性

看山

Java java16

☕️从 Java8 到 Java17 的新特性(十):Java17 的新特性

看山

Java java17

Flutter StatefulBuilder 示例

坚果

5月月更

druid源码学习七

Nick

架构实战营-第一周

Asura

ffmpeg封装格式转换

Loken

音视频 5月月更

springboot启动失败的问题('hibernate.dialect' not set)

程序员欣宸

Java 5月月更

架构训练营第一次作业

地下地上

有了这10个GitHub仓库,开发者如同buff加持

华为云开发者联盟

GitHub 开源 Web 软件开发

二分查找树

工程师日月

二叉树 5月月更

【愚公系列】2022年05月 二十三种设计模式(十六)-迭代器模式(Iterator Pattern)

愚公搬代码

5月月更

加入MOVE,一起体验Move2Earn的运动乐趣

股市老人

融云 x Zervo:打造欧美 Z 世代社交的「主题幻想世界」

融云 RongCloud

《阅读者》第20期:架构模式的圣经_语言 & 开发_张逸_InfoQ精选文章