QCon 全球软件开发大会(北京站)门票 9 折倒计时 4 天,点击立减 ¥880 了解详情
写点什么

阅读者 (二十一): 美丽的架构

2012 年 9 月 13 日

美丽的架构究竟是怎样的?架构师们上下求索,孜孜以求,始终不得其解。归根结底,美丽这个词语总还是偏于感性认识,就仿佛音乐之美,绘画之美,不能以尺度来衡量,追求的其实是一种艺术的幽玄与妙悟,述之以规范,述之以标准,就未免落入下乘了。然而,软件架构终归属于工程学的范畴,不能一概以“只可意会不可言传”来搪塞,因为架构知识是可以传递的,架构文档是可以共享的,最重要的是,架构自身是可以评审、验证与实现的。

Stephen J. Mellor 在《架构之美》序中,画龙点睛地勾勒出美丽架构的模样,即必须遵循的一些普遍原则,分别为:

  • 一处一个事实
  • 自动传播
  • 架构也包含构建
  • 最少量机制
  • 构建引擎
  • O(G),增长的阶
  • 抵制熵增

这些原则,其实就是架构师的智慧,没有足够深刻的理解与深入实践,是不可能给出如此言简意赅的架构建议的。按照我的理解,这些普适性原则其实就是在说明所谓美丽的架构,就是简单、一致、适应变化并能去除重复的架构。其实,泄露天机的一句话还是 Mellor 所言——美丽的架构用更少的机制做更多的工作。这就是《架构之美》一书不凡的开篇了。

若是一本平庸的书,必然会惧怕这样精彩绝伦的序,因为它愈发的美,就愈发能照映出正文的丑;它愈发的言之有物,又愈发会衬托出正文的空洞无味。 然而,若是内容也是如此的精彩绝伦,那就无异于锦上添花,珠联璧合了。通透点儿,就是齐活!这就好比一首歌曲的领唱者,倘若一开始就飙出高音,声入云霄。跟唱者没有点儿本事,恐怕就难以为继了;可要都是高手呢?那就真是一场音乐的盛宴了。《架构之美》合唱团荟萃了全球最为顶级的那部分架构师,所以说本书是架构的盛宴,似乎也不为过。

让我们先看看本书的第一部分《论架构》。第 1 章《架构概述》延续了序言的高屋建瓴,全篇介绍了架构师的角色、软件架构的含义、架构结构,并展示了什么才是好的架构,美丽的架构。虽然仅仅是一些概念的阐释,却仍然不乏真知灼见。例如在本书 1.2 节,给出了创建软件架构的如下意见:

  • 软件架构师的首要关注点不是系统的功能;
  • 考虑折中;
  • 运用“分而治之”的架构原则;
  • 概念完整性是架构最重要的特征;
  • 一份更完整的清单;
  • 架构会影响组织架构。

第 2 章《两个系统的故事:现代软件神话》的角度又有所不同。首先它注重实例,讲述了两个软件城市的故事;其次它突出对比,比较了混乱大都市性质的项目与“设计之城”。对比是最好的老师,如果你茫然不知一个系统究竟好在哪里,坏在哪里,通过引入对比,一切的好与坏都被放大,且清晰无比地被标示出来。Pete Goodliffe 运用隐喻将设计看作是城市的规划与建设,有效地促进读者的理解,加深了整体认识。本章给出了设计的反模式与模式,引导我们对自己过往的设计进行反思,进行印证。例如,本章图 2-4 给出的“设计之城”最终架构,就很好地阐释了什么才是好的架构,因为该架构图如此地简单,既能清晰地表达设计者意图,又能很好地保证架构的一致性。同时,该图又突出体现了整个系统的核心功能,并通过引入管道 - 过滤器模式,建立了一个利于扩展、结构清晰的音频架构。

因为自己工作性质的原因,我重点关注了本书第二部分的内容,即对企业级应用架构的介绍。这也是我阅读本书收获最大的几章内容。例如第 3 章对伸缩性架构的介绍,以 Darkstar 开源项目的架构开发为例,较为全面地剖析了整个系统的架构过程。作者特别谈到了该项目支持游戏开发的特征,从而识别出可伸缩性以及并发处理对整个系统的重要性。这就好像是质量属性驱动,或风险驱动,先从最紧要、最核心的部分开始架构的分析,学会取舍,才能更好地遵循帕累托原则,将好钢用到刀刃上。作者对服务的分解代表了整个架构最重要的设计决策,每个服务承担了不同的职责,既保证了关注点分离,又能因为服务的独立性与自治性,保障系统的可伸缩性。例如通信服务中提供的会话服务(Session Service)与通道服务(Channel Service),就能够因为分离而降低通信机制的复杂性。这很好地体现了架构师的抽象能力,这种抽象既能简化模型,又能隐藏实现,保证系统的可移植与可伸缩。文章写到:

“既然所有通信都必须通过 Darkstar 会话或通道的抽象层,而这些抽象层又不暴露客户端与服务器通信的真实端点,那么在实体通信和通信起止端的实际位置之间就存在着一个抽象层。”

文中还提到了“元服务”的概念,我以为这是该架构设计的点睛之笔。

“这些元服务是网络层面的服务,对于游戏或虚拟世界的程序员是不可见的,但是它们对 Darkstar 栈中的服务是相互可见的。”

“由于元服务对于游戏或虚拟世界的程序员是不可见的,所以它们在任何时刻都可以改变,不会影响到游戏逻辑的正确性。”

第 4 章《记忆留存》的作者 Michael Nyard 是获得 Jolt 大奖的《Release It!》一书的作者,长期战斗在一线扮演救火队员的角色,架构实证经验非常丰富。而本章在整本书中,也是工程实证主义表现得最为浓烈的一章。Michael 完整地介绍了 Creation Center 项目的架构过程。作者通过明确事实,发现重要问题,然后识别关注点的方式来剖析架构,理解需求到功能实现的映射。作者的讲述都是经验之谈,因而总是显得言之有物。例如在讲解架构模块中的渲染管道时,提出了一种“快速失败”模式,遵循“快速失败、大声失败”的设计哲学。之所以运用这一原则,是因为系统的核心功能是生产照片。这样的生产过程不允许因为软件的原因而导致生产线停下来。这就决定了渲染管道的设计,必须在最早的过程中进行验证。

整章内容让我唯一感到恼怒的就是篇幅太短,许多步骤、技巧以及设计思想都是点到即止,终究有些隔靴搔痒的感觉。作者自己写道:

“我本可以花更多的时间和篇幅来描述每个类、每次迭代或每个设计决定,就像初为人父的人描述宝宝的每次打嗝和摇晃一样。”

我私心更希望 Michael Nyard 能做到这一点,可惜,这个说明读起来更像是偷懒的借口。

我很喜欢第 5 章《面向资源的架构:在 Web 中》。抛开 Roy Fielding 具有卓越远见以及超凡创造性的那篇博士论文不谈,就 REST 的讲解而言,本章很好地呈露了 REST 架构风格的原貌。其实,将 REST 架构风格引入到企业应用开发中,并非本篇作者的独特见解,譬如说《Rest in Practice》一书的作者,我的同事 Jim Webber 等人就是这一观点的坚决拥护者。如果对比本章与《REST in Practice》一书,感觉本章更像是《REST in Practice》的浓缩精华版,虽然作者完全不同。短短的篇幅,不仅给读者深入剖析了面向资源架构的本质特征,还对比了传统的 Web 服务,阐释了 Web 的性质,算是理清了 REST 的历史渊源,基本思想。这个基本思想就是“关注点分离”,REST 就是将 Web 中的人机交互看做是人们感兴趣的资源、操作这些资源的动作以及选择收发这些资源的方式,从而得到名词、动词和表示形式三个重要概念。如文中所说:“REST 方式的基本工作原理是分离关注逻辑命名资源、操作资源的方式,以及选择的表示资源的方式”。

当然,如果从 Richardson 提出的成熟度模型来讲,本章并未过多提及第三级服务的特征,即“Web 感知的服务级别,支持超媒体作为应用状态的引擎的观念。【注:引自《REST 实战(REST in Practice)》第 27 页。】”因为就 Fielding 博士的本意而言,REST 是要将超媒体作为应用状态的引擎(Hypermedia As The Engine Of Application State,HATEOAS)。这或许是因为篇幅所限的原因吧。坦白说,这其实也是本书最大的硬伤。因为荟萃了如此众多的优秀架构师,势必不可能给出太多的空间让作者自由发挥。容量的限制决定了整本书的每一章节都是欲言又止的感觉。似乎讲解通透了,读起来又还不够明白。必须要再三研读,方才能明白字里行间的真意。

我仅仅是粗略地阅读了本书的第三部分,主要还是因为自己对系统架构的知识远远不够,没有这种基础,也就缺失了理解这些内容的资格。于是就畏难而退,跳到了第四部分和第五部分。第 12 章介绍的 Akonadi 框架从最初的层划分草案到最后“从里向外、而非自底向上”架构的演进,可谓深得我心。虽然架构策略以及系统背景并不相同,但就我这几年的架构经验来讲,我确实越来越重视内核模式在关注点分离中发挥的作用。许多系统的架构确乎都可以从纵向与横向进行分解,从而获得系统的应用逻辑架构与业务逻辑架构;然而从内核的观点来看,则可以理解为系统多个核心功能的交集,是整个系统的共同品质。它并不一定处于架构的最底层,如基础设施层所包含的内容;也不一定是公共的体现横切关注点的切面(aspect),而是系统最不可缺失的处于核心地位的高内聚职责。

第 13 章是 Bertrand Meyer 的大作,提供了很好的例子对比了函数式语言与面向对象语言的优缺点。其实本章的主要观点到如今已经没有太多人会反对。近几年函数式语言的迅猛发展,以及多语言开发的趋势已经说明了二者之间的互补性。本章最有价值的还是 Meyer 对函数式的推导与优势评价,以及包括对面向对象最基本要素如继承、多态、代理的剖析,这些内容对今时今日掌握面向对象设计技能,理解函数式编程本质思想,仍有非常大的参考价值。

在我这样杂乱的介绍下,本书听起来好像是一盘大杂烩。事实上它确实如此。因为全书涵盖的内容太多太广,以至于让人产生目不暇接之感。尤其对于术有专攻的开发人员来讲,要彻底吃透本书讲解的内容,无疑是一项艰巨的挑战。然而,如果从架构师所必须具备的技能来看,本书的内容其实并没有超出架构的范畴,因为架构师必须要见识广博,你才能针对不同的需求场景,面对不同的实现技术,选出最适合当前场景的恰如其分的架构方案。当然,在阅读时,千万不要在太多的技术细节中迷失自己,关键还是要把握美丽架构的基本原则。而这正是本书的主线,使得本书能够在散乱的主题中,还能做到“形散而神不散”。


给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012 年 9 月 13 日 00:005598
用户头像

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

关注

评论

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

职场发展的思考

子不语

生涯规划 职业规划

中国历史学习

小任

历史 中国 中国历史

产品周刊 | 第 13 期(20200503)

Herbert

产品 设计 产品经理 产品设计

零基础、非计算机相关专业的如何转型程序员

C语言技术网-码农有道

程序员 转型

终端Terminal:程序员是如何查询天气预报的?

lmymirror

GitHub 工具 命令行 terminal 终端工具

企业招聘的需求决定了C/C++程序员的学习方向

C语言技术网-码农有道

C/C++

Linux初学-01

Flychen

原创 | 类应该是匀称和均匀的

编程道与术

聊聊我对开源的理解

zygfengyuwuzu

开源

SpringIOC源码篇-Bean实例化-Spring如何选择类构造器(1)

申屠鹏会

Java Spring Boot

IT培训机构那些不得不说的事儿

C语言技术网-码农有道

IT培训机构

面试考试可用,十大排序算法

我不自豪谁志豪

学习 面试 算法

生活不奖赏心血来潮

池建强

个人成长 写作

LeetCode 153. Find Minimum in Rotated Sorted Array

隔壁小王

算法

LeetCode 565: Array Nesting

隔壁小王

算法

部署Hexo博客到VPS

ini

断章取义,不一样的C/C++语言的学习策略

C语言技术网-码农有道

C/C++

新人怎么寻求解决问题的方法

波波

编程 职场 新人

我们迫切需要块状时间

Neco.W

效率 时间分配 时间管理 工作效率 提升效率

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (一)什么是单元测试

编程道与术

死磕Java并发编程(8):CurrentHashMap如何实现高效地线程安全?在Java8中有哪些设计实现的演进?

七哥爱编程

Java Java并发 ConcurrentHashMap

NIO 看破也说破(二)—— Java 中的两种BIO

小眼睛聊技术

Java 学习 程序员 架构 编程语言

从草根到百万年薪C/C++程序员的二十年风雨之路

C语言技术网-码农有道

c++ 编程语言 C语言

从2009到2020,世界编程语言排行榜分析

C语言技术网-码农有道

编程语言

Netty 源码解析(六): Channel 的 register 操作

猿灯塔

Centos的初步配置

玉龙BB

Docker Linux Docker-compose Centos 7

如何消除写作过程中的痛苦,让写作变成一种享受

七镜花园-董一凡

写作

DataGrip常用快捷键

fliter

1分钟理解M2M和IoT概念

老任物联网杂谈

物联网 M2M IoT

Python 中怎样合并数据

张利东

Python

早起实操手册

超超不会飞

效率 生活 自律

边缘计算隔离技术的挑战与实践

边缘计算隔离技术的挑战与实践

阅读者(二十一):美丽的架构-InfoQ