软件架构设计:实用方法及实践
上QQ阅读APP看书,第一时间看更新

··前言··

提起软件架构,人们常常会想到模型——模型表示构成软件架构的基本结构。偶尔,人们才会思考这些结构产生的过程,到底经过什么样的思考过程才有了这些结构,也就是说,设计的过程是什么。设计是一种完成起来很复杂的活动,关于设计的主题也比较复杂,不容易写清楚,因为这需要针对系统的方方面面来考虑并做出决策。这些方面往往很难表达,尤其当它们来自于以往实战性的软件开发项目时,从这样的项目中得来的经验和知识是很难言传的。尽管如此,因为设计行为本身是建立软件架构的基础,所以它亟待被解释。虽然经验很难通过一本书来传授,但是我们可以通过分享一种方法,来帮助读者以系统化的方式完成设计过程。

本书的主旨是介绍设计过程和一种特殊的设计方法,这种方法称为属性驱动设计(Attribute-Driven Design, ADD)。我们相信这种方法非常有效,能帮助读者以有原则、有纪律和可重复的方式完成设计。在本书中,列举了属性驱动设计及现实生活中的几个有关属性驱动设计的真实案例。我们将通过这些案例演示如何进行架构设计。即便你目前没有足够的设计经验,我们会举例说明如何借助该方法来复用设计概念,即那些历经考验的经典方案。

尽管属性驱动设计十多年前已经提出,关于它的文字资料却很少,也很少有资料可以提供属性驱动设计的实例并对其具体实现过程加以解释。因为公开信息的缺乏,人们很难使用该方法或将该方法传授给他人。此外,一些已经发表的关于属性驱动开发的文档也都比较概括,很少涉及架构师日常使用的概念、实践和技术。

我们已经跟职业架构师一起工作了多年,曾指导他们如何进行设计,以及如何在设计过程中学习。同时我们也学到了很多,例如,我们了解到职业架构师在设计过程的早期会考虑哪些技术因素,这一点在之前的属性驱动设计版本中是没有的。就因为这个原因,该方法被很多实践者认为跟实际脱节。本书提供了一个修正过的属性驱动设计新版本。在该版本中,我们试图不遗余力地在理论和实践之间架设桥梁,缩小理论和实践之间的差距。

虽然我们已经教授了多年软件架构和设计软件,但是一路走来我们认识到,对没有经验的人来说,软件架构和软件设计太难了。这种认识促使我们去创建设计路线图,可以肯定的是,这样可以有效引导人们完成相关设计过程。我们同时设计了一种针对软件设计教学的游戏,可以作为本书的配套部分。

本书面向的读者首先是那些对软件架构设计感兴趣的人,尤其是那些必须展开这项设计任务现阶段却不得不使用某些临时性方案的行业内人士,本书定会对他们别有益处。而对于有经验的软件架构设计者来说,他们已经有了一套逐步建立起来的设计方法,相信这些读者也能通过本书找到新的思路。例如,如何用看板(Kanban)追踪设计进度,如何利用基于策略的问卷调查分析一个设计理念,如何通过设计方法完成早期的评估预测。再者,对于已经在软件工程学院熟知其他架构方法的读者,则可以得到属性驱动设计与其他设计方法的关联信息。例如,与质量属性工作坊(Quality Attribute Workshop, QAW),与架构权衡分析方法(Architecture Tradeoff Analysis, ATAM),以及与成本效益分析方法(Cost Benefit Analysis Method, CBAM)之间的联系。最后,本书也适合计算机科学或者软件工程专业的学生和老师阅读。我们深信本书中列举的案例研究可以帮助读者理解如何更轻松地完成一系列的设计过程。可以肯定的是,我们已经在课程中运用了相似的案例,并且效果显著。就像爱因斯坦所说的,“举例不是教学时可供选择的方式,而是唯一的方式。”

我们期望本书能够让读者明白,设计其实是有套路可依的,按照这样的方法或者套路,你能够在今后的软件架构设计中设计出更优秀的软件产品。

本书各章内容如下:

❑ 第1章简明地介绍了软件架构和属性驱动设计方法。

❑ 第2章讨论软件架构设计的细节,设计过程的主要输入——架构驱动因子,以及设计的概念,这些概念会帮助你明白如何利用已经过验证的方案来理清这些驱动因子有哪些。

❑ 第3章详细介绍属性驱动设计方法。重点讨论属性驱动设计方法的各个步骤,以及能够用来完成这些步骤的多项技术。

❑ 第4章解释了“绿地”(greenfield)系统的开发实例。在该案例研究中,我们尽力解释如何将第3章描述的大多数概念运用到设计过程中,因此,你可以自然地认为该案例研究比较“学术”(虽然该案例源于真实存在的系统)。

❑ 第5章阐述第二个案例研究,该案例是与职业软件架构师合作完成的,因而更加专业、更加详细。它将以翔实的细节展示属性驱动设计如何应用于涉及多种技术的大数据系统的设计中。该案例展示了如何在“新”领域中开发系统,而不是在第4章提到的传统领域。

❑ 第6章是一个较短的案例研究,展示如何将属性驱动设计应用于常见的遗留(或棕地,brownfield)系统的扩展设计中。该实例说明架构设计并非是在系统开发第一版时一次完成的,而是在开发过程的不同阶段实施的。

❑ 第7章展示了其他一些设计方法。在属性驱动设计的修正版本中,我们采纳了其他设计过程研究者的想法,在此简要总结了他们的方法,在向他们的工作致敬的同时,也比较了属性驱动设计与其方法的不同。

❑ 第8章深入讨论了分析这个主题(尽管这是一本关于设计的书)。分析本来就是设计的一部分,所以本章讲述了一些技巧,它们既可以用于设计过程当中,又可以用于部分设计完成后。我们专门介绍了基于策略问卷调查方法的使用,该方法能帮助我们简单有效地理解设计过程中的种种决定。

❑ 第9章展示了设计过程如何适应组织级别的应用。例如,在项目周期的最早期进行一些架构设计有助于评估目标。同时,还展示了属性驱动设计如何与其他软件开发方法协同工作。

❑ 第10章总结了全书内容。

本书附有两个附录。附录A给出了各种设计概念的目录,这些设计概念可用于特定的应用领域。该目录集合了我们从各处收集的设计概念,反映了现实中那些经验丰富、训练有素的架构师是如何工作的。目录包含了第4章案例研究中使用的设计概念的样本。附录B针对7个最常见的质量属性提供了一套基于策略的问卷调查(详见第8章),同时针对DevOps额外提供了一份问卷调查。

致谢

希望能够在此表达我们对审阅人员Marty Barrett、Roger Champagne、Siva Muthu、Robert Nord、Vishal Prabhu、Andriy Shapochka、David Sisk、Perla Velasco-Elizondo和Olaf Zimmermann的感谢,感谢他们慷慨地提出他们的观点和意见。我们也要感谢Serge Haziyev和Olha Hrytsay,他们帮助我们完成了本书第5章。此外,如果漏掉Serge、Olha和Andriy在内的许多Softserve的架构师就是我们失职了,他们对整本著作提供了很多帮助。

Humberto希望感谢Quarksoft公司的主管和架构师小组。关于修改属性驱动设计的很多想法和本书中的一个案例研究都来源于该方法在这家公司的实践。感谢我有幸合作过和交换过意见的其他公司的架构师及开发者,我从他们身上学到了很多。我也希望感谢软件工程学院,他们多年来一直邀请我和其他学者参加他们的精英教育研讨会(ACE Educators Workshop)。我还要感谢我的母校,墨西哥首都伊斯塔帕拉帕自治大学,它一直在支持我。感谢我的同事Perla Velasco-Elizondo和Luis Castro,他们已经在架构之旅中陪伴我多年。感谢Alonso Leal,是他在多年前给了我成为一个职业架构师的机会。感谢Richard S. Hall,他教了我许多写作本书时很有价值的技巧。最后,我要感谢我的合作者Rick,他是个好人,也是个好同事,很高兴能和他一起工作并交换意见。

Rick希望感谢软件工程学院的James Ivers和他的研究小组。我还要特别感谢Rod Nord悉心的审校和宝贵的建议。我也要感谢我的长期合作者和导师Len Bass,在许多年前他引领我开启了软件架构之旅。没有Len,我不知道自己今天会在哪里。此外,我要感谢Linda Northrop,她多年来一直大力支持我的研究,并提供给我许多宝贵的机会。最后,我要感谢我的合作者Humberto,他总是朝气蓬勃,和他共事是一件真正的乐事。