以对话的方式扩展架构实践
架构不必是独白;它不是由少数集中的人员自上而下地传递。本文描述了另一种架构方法;它是一系列对话,由去中心化和赋能的决策机制驱动,并由四个学习和对齐机制支持:决策记录、咨询论坛、团队来源的原则和技术雷达。
2021 年 12 月 15 日
当“传统”的架构方法失效时
说实话,“传统”的软件架构方法(即非编码、决策、绘图)对我来说很难在最佳情况下发挥作用。但在将它们应用于持续交付自治团队的世界中,我反复发现自己面临着一项不可能的任务:无处不在,容忍重大的上下文差异,并且不阻碍任何人。
这让我思考。是否有另一种选择?
确实有:我停止做出架构决策。完全停止。
在这篇文章中,我将介绍这种替代思维方式以及相关的工具和实践,这些工具和实践使我能够颠覆“软件架构师”的传统角色,同时将软件架构实践推向开发团队的前沿。更重要的是,我将解释在这种替代方法中,每个人都可以安全有效地进行他们需要的架构工作,而不会导致一切陷入混乱。 [1]
我们需要更多的方法来“做”架构,而不是更少。
在我看来,软件交付中向越来越高的团队自治性的转变,加剧了对更多架构思维以及架构决策的替代方法的需求。
确保我们的软件团队体验真正的自治性引发了一个关键问题:一小群架构师如何为大量渴望价值流对齐的团队提供服务?为什么?因为在这种环境中,架构师 [2] 现在需要同时出现在更多地方,做所有那些传统的“架构”。
我们需要的是一种可行的方法来解决团队自治性和由此产生的架构所带来的挑战。
在本文的剩余部分,我将介绍一种替代的架构方法和治理方法。我将详细解释它是什么,它是如何工作的,以及你如何自己采用它。最重要的是,我将重点介绍如何失败,以便你能够成功。
最基本要素:通过“建议流程”进行决策
让我们以一个我们希望使其最大限度独立的团队作为起点。显然,这个团队需要以某种方式参与架构思考和决策,但如何呢?
这些“多个决策中心”正是我们需要的,但很明显,传统的自上而下的架构,由一小群全能的架构师做出所有决策,与这种去中心化的模型背道而驰。“然而”,挑战的声音响起,“决策仍然需要做出 - 这就是架构的本质”,这些怀疑者是对的。
这些架构决策仍然需要有意识地做出 - 否则我们将回到原点,甚至更糟。因此,这种替代方法的第一个方面,实际上是它的核心要素,必须描述它如何实现决策。它被称为“建议流程”。
建议流程是这种无政府主义、去中心化的架构方法的核心要素。它最大的优点是其非凡的简单性。它包含一条规则和一个限定词。
规则:任何人都可以做出架构决策。
限定词:在做出决策之前,决策者必须咨询两个群体:第一个是所有将受到决策重大影响的人。第二个是该领域有专业知识的人。
就是这样。这就是建议流程的全部内容。
这种表面上的直白却隐藏着一个值得明确说明的关键概念;虽然决策者没有义务同意这两个咨询群体中的人给出的建议,但他们必须寻求建议,并且必须倾听并记录建议。我们在这里不是在寻求共识,而是在寻求广泛的输入和声音。
针对此提出的一个常见挑战是需要咨询多少人。这是一个有效的担忧,但可以缓解。在部署这种技术时,我们创建了一个清单,帮助那些处于决策位置的人识别需要与谁交谈,以及在哪些方面交谈。信息安全受到影响?与 CISO 交谈。接近 PII?与数据团队的玛丽和法律团队的瓦妮莎交谈。用户入职流程的潜在变化?与你的 UX 负责人交谈。即将采用新的云服务?与云架构师克里斯交谈。考虑更改你的 API?与所有使用你的 API 的团队的负责人交谈。
有时这个咨询者列表可能很长。没关系。有些决策是重大的决策,建议范围清楚地表明了决策的大小和重要性。有时决策的范围可以缩小,因此许多决策也随之缩小。其他时候,受影响的人数之多会让决策者重新考虑。这个可能让他们的生活稍微轻松一点的事情真的值得咨询所有这些人吗?或者,他们可以将这个大的决策拆分成多个小的决策?当决策继续进行时,它们通常只是出于权宜之计而被调整到适当的大小。 [3]
我们能进一步推动建议流程吗?当然可以,而且我们应该这样做。我一直鼓励那些遵循建议流程的人专门寻找那些会不同意他们的人。摆脱了必须同意他们听到的内容的需要,他们不可避免地会更加认真地参与其中。因此,收到的建议的深度和广度更大。决策也不太可能因此而受到影响。他们的学习也是如此。
这让我们回到了建议流程的更广泛的益处。在部署建议流程时,我一直看到决策变得更好、更快、更负责任,最重要的是,决策者理解并拥有他们实施的决策,正是因为决策者既有需求,又对决策负责。
作为副作用,可用的决策者池也随之扩大,每个人很快就会寻找需要做出的决策,并且鉴于建议流程赋予他们的安全感,他们会将这些决策标记出来并推动它们得出结论。一个团队对决策的需求可以由他们自己满足这一事实,也导致了适当的行动偏见水平,而责任则在需要时充当刹车。
通过这种方式工作,我们消除了对固定和永久层次结构以及持久的主决策者的需求。正是由于这两个原因,建议流程是这种架构方法中最基本的要素,因为去中心化的决策是任何自称“无政府主义”的东西的核心要素。
但是等等,我们是否在一举消除了对我们“传统”架构师的所有需求?完全没有,但显然我们的角色已经改变。在本文的后续部分 - 介绍了这种方法的支撑要素 - 我们将看到一系列焕然一新的实践和工具,这些工具和实践使我们能够让团队以及他们所支持的企业达到他们需要达到的目标。
在我们继续讨论这些支撑要素之前,有必要简要地绕道而行,强调并讨论这种去中心化方法的所有剩余要素所共有的一个东西,以及它们与核心要素的共同点:它们都关注对话,以及对话在有效地达成和传播共同理解方面的作用。
对话的基本作用
事件风暴的发明者阿尔贝托·布兰多利尼曾说过一句名言:“是开发人员的假设被部署到生产环境中”,他说得没错;开发人员对目标架构的理解才是最重要的,而不是主要架构师的脑海或图表中的内容。这个问题由来已久。埃里克·埃文斯在“领域驱动设计:应对软件核心中的复杂性”中解决了这个问题,而最近我的同事埃里克·多尔嫩贝格在他的演讲“没有架构师的架构”中也谈到了这个问题。
对我来说,正是这种架构,即那些编写代码的人脑海中的架构,才是最重要的。在采用这种去中心化的方法时,架构决策的实践更加分散,这个问题在很多方面得到了缓解。
这让我晚上睡得更香。
然而,这种去中心化、无政府主义的方法将另一个所有架构都必须解决的问题置于首位:交付一个连贯的整体。在这里,我们的替代方法似乎处于劣势。如果每个人都有权做出决策,那么我们,“传统”的架构师,以及那些可能最关心最终结果的人,如何确保所有个人决策的总和能够形成一个连贯的整体?我们如何将长期视角纳入这些决策?我们如何支持那些突然发现自己承担了他们可能不适应的责任的人?
幸运的是,另一个在这个领域的实践者和思想家,露丝·马兰,之前已经看到了这个问题,并在她的文章“我们还需要架构师吗?”中分享了答案。
[为了让架构取得成功],它很大程度上是关于确保需要进行的对话正在进行 - 不一定是发起对话,也不一定是帮助集中或引导对话,而是确保对话确实发生 […] 并在需要时提供指导。
-- 露丝·马兰
我们对建议流程的采用为任何人都可以做出决策创造了空间,但它也使对话、寻求专业知识的责任以及思考影响成为核心。这种方法的其余要素,每个要素都支持核心要素,专门关注确保这些对话尽可能及时、集中和有效。它们有四个。
- 一种思考和记录工具
- 对话的时间和地点;
- 照亮并引导走向统一方向的光芒;
- 一种感知当前技术领域和气候的方法。
我们将在几秒钟内依次介绍这些内容,但首先我需要澄清两件事。
战略和跨职能需求呢?
值得用几句话来解释这种方法中没有涵盖的内容:技术战略和跨职能需求 (CFR)。
显然,这两者对于任何有意义规模的软件项目都是必不可少的。
一个良好的宣传策略可以帮助组织通过让分散的团队优先考虑与组织成熟度和需求最匹配的技术活动来取得进展。显然,最好的技术决策是那些支持战略的决策,在这种情况下,可以明确地指出这一点。
一套清晰的可测试 CFR 也有助于分散的团队确保他们超越其直接的本地交付,并满足在共享生态系统中协调运作的最低要求。
然而,技术治理指的是这两者,而不是包含它们——它们为技术治理的运作提供了背景——因此,我在这里没有详细介绍它们。但是,除了确保良好的技术决策之外,治理还包括什么呢?让我们来看看。
四个支撑要素
1. 一种思考和记录工具:决策记录
第一个支持元素是 架构决策记录 或 ADR。这些是轻量级文档,通常存储在源代码存储库中,与它们描述的工件并排。现在,各种采用者选择支持各种格式,但我坚持的关键要素如下:[4]
名称 | 描述 |
---|---|
标题 | 包括一个唯一的标识符,以及决策本身(例如,“ADR001 - 使用 AKS 用于 Kubernetes Pod”) |
状态 | 通常为“草稿”、“提议”、“已采用”、“已取代”和“已退休” |
决策 | 用几句话描述已做出的决策(通常以粗体或斜体显示,以便突出显示) |
背景 | 迫使做出此决策的力量和当前的背景情况 |
考虑的选项 | 每个考虑的选项,简要描述,并列出优缺点。(通常,提议/采用的选项在此列表中排在首位) |
后果 | 此决策的正面和负面影响 |
建议 | 这反映了遵循建议流程的原始输出。这里记录了所有给出的建议。这应该包括建议者的姓名和给出建议的日期。这通常可以采取评论的形式,如果这些评论是由建议者直接提供的,那么记录元数据是自动的。 |
我在实践中发现,拥有这样一个轻量级的 ADR 模板结构不仅是记录架构决策的好方法,而且还有助于团队学习如何做出架构决策。这些关键要素就像一个思考清单,并提示决策者需要思考什么,更重要的是,需要进行哪些对话。
更重要的是,ADR 通过将捕获和记录他们获得的所有建议作为 ADR 作者的必要条件来强化建议流程。我还鼓励作者在其 ADR 选项部分中直接参与这些建议,无论他们是否选择遵循这些建议。寻求建议并将其写下来是一回事。积极地与之搏斗又是另一回事。你参与得越多,果实就越甜美。
毫无疑问,一系列 ADR 及其周围的对话为想要开始承担决策任务的人提供了极好的学习场所;所有内容都公开,包括异议和妥协。经验较少的架构师可以快速轻松地浏览他们之前发生的事情的历史,看到好的(以及很可能不太好的)例子,并看到决策正在被做出(也许还会在情况发生变化/团队学到更多时被撤销)。它们几乎是为一组软件编写的思考和决策传说,由那些对它贡献最大的人亲手写成。
虽然我遗憾地不能与您分享我与客户进行的这些对话的例子,但有一些 很棒的 ADR 例子 公开发布在互联网上,由 Thoughtworks 校友 Wisen Tanasa 及其创业公司 Upmo 提供。我鼓励您看看。它们 得到了迈克尔·尼加德本人的认可。
2. 对话的时间和地点:架构咨询论坛
这种替代方法中的第二个支持元素是为了让所有支持这种寻求建议的对话变得更容易:一个每周一次、持续一小时的架构咨询论坛(“AAF”)。
从根本上说,这是一个定期且反复出现的地方和时间,用于进行对话。您的理想与会者是来自每个团队的代表以及来自建议流程清单的关键代表。但是,邀请应该完全开放,以鼓励透明度和开放性。对话的及时性和质量是成功的关键指标,但同样重要的是共享的观点的广度和多样性,以及贡献者的广度和多样性。如果架构在这里“完成”,并且分享和学习了经验教训,那么你就赢了。
常设议程通常从以下内容开始
- 团队代表快速分享新的 尖峰(提前发出可能出现的未来决策的预警,并允许与会者分享现有知识和经验)
- 关于每个新的“提议”决策的讨论(由做出决策的人提出,提前以 ADR 的形式捕获)
- 重新审视其他决策状态(我们对这些进行时间限制,既是为了限制传入建议的窗口,也是为了让我们能够重新审视我们用不完善的信息做出的决策)
- 看看我们集体的四个关键指标,我们的云支出趋势,最后
- 其他事项(又称“AOB”)
粗略一看,可能会让人觉得 AAF 只是标准会议的一个新名称。通常被称为“技术咨询委员会”、“架构决策论坛”或“架构审查委员会”。然而,它们之间存在几个关键区别。
首先,建议流程占主导地位。提交给 AAF 的决策仍然由发起者拥有和做出。其他与会者唯一能做的事情就是提供建议,或者建议寻求建议的其他人。因此得名。
这让我们看到了第二个关键区别。鉴于建议流程的限定条件,AAF 的受邀者通常是那些受影响/拥有相关专业知识的人。这意味着通常出席的人包括来自每个功能团队的代表(不仅仅是领导者;BA/PO 和 QA 通常也出席)、来自其他工作计划的人员、UX、产品、运营,以及偶尔的高级管理人员。
这两个差异的结合导致了第三个也是最重要的关键差异:对话。建议流程很棒,但它通常是 1 对 1 的对话。当它们在 AAF 中进行时,会有一个观众,所以很多人可以倾听,每个人都可以学习。在这些会议上分享的组织、领域、遗留和经验信息以及架构技能部署量是我见过的任何其他事情都无法比拟的,尽管它可能是一次枯燥的会议,但它是我们一周中最受欢迎、参与最广泛的一个小时。它是实现学习型组织目标的最重要贡献者之一。AAF 鼓励不同意见,并庆祝基于经验教训的失败/决策变更。所有这些都将共同扩展和深化对架构的总体理解,几乎可以保证它最终会出现在运行的软件中。
3. 照亮统一目标的光芒:团队来源的架构原则
拥有架构原则并不新鲜,尽管我很少遇到可用的原则。在高度自治团队的世界中,它们始终很重要,因为它们是实现一致交付方向而无需控制的手段。
那么,什么是好的架构原则呢?首先,它必须提供一个标准来评估我们的架构决策(在实践中,这意味着它必须是具体的、可衡量的、可实现的、现实的和可测试的,又称“SMART”)。其次,它必须支持企业的战略目标。第三,它必须阐明它必然包含在其中的后果/影响。最后,作为一个整体,它们的数目既不能太少,以至于无法满足架构原则满足的关键需求,也不能太多,以至于团队无法记住所有原则。
关于糟糕的架构原则,我有很多话要说,但我只关注关键方面。首先,它们不是实践。实践是您如何做某事,例如遵循 TDD、Trunk Based Delivery 或结对编程。这并不是说实践不好(事实上,Forsgren 博士的“加速”中充满了关于它们在特定情况下的一系列建议),它们只是不是架构原则。
也要注意不要滑向另一个极端——一般原则。“保持简单”和“不要重复自己”是原则,但它们不是架构原则。项目规划和软件质量管理周围的各种原则也不是。我们需要的是指导和评估我们的架构实践和决策的方法。我们需要的是一些东西来帮助我在 各种实现微前端的方法 之间进行选择,或者帮助我决定是否真的有必要 自己动手实现 OAuth 2.0,或者指导我在 AWS 上的自托管 Lucene 与 Amazon Elastic Search Service 之间进行评估。
鉴于所有这些,现在让我们分享一个基于 团队拓扑“流对齐团队”组织模型的良好原则
标题:高度重视团队的价值独立性
副标题:沿着团队界线划分解决方案
基本原理:我们构建和运行产品的方法的优势从根本上依赖于团队的独立性。我们承认这种方法的缺点,但认为优点超过了缺点,尤其是在考虑到预测未来需求的难度时。
影响
- 功能和数据的重复将不可避免地出现。与其与之抗争,我们接受它,承认在某些情况下,需要明显的最终一致性和数据复制
- 多个第三方解决方案的组合许可、运行时和支持成本可能高于单个共享跨产品团队解决方案的成本
- 解决方案可以针对拥有和运行它们的团队的需求进行设计。它们不需要关心其他团队的需求
- 系统以及它们所构建的第三方服务/解决方案往往更小,并且更专注于特定任务
- 独立运行的团队需要自行支持他们独立采用的任何第三方服务/解决方案
如果您想查看更多示例,请查看公开发布的 John Lewis“软件工程原则”。[5]
到目前为止,一切都还很笼统。我在本节中到目前为止所述的内容在任何架构方法中都不会引起争议。那么,我为什么如此强调这些要点呢?不仅在分散的方法中,架构原则的重要性得到了提高,而且所有相关人员都需要了解如何构建它们以及什么是好的,因为它们将来自团队本身,并由团队本身维护。
我们的方法在很大程度上直接来自 Abbot 和 Fisher 的优秀著作 “可扩展性艺术”。虽然他们的书假设了一种比这里提出的更自上而下、更分层的架构方法,但作者非常认识到人的因素对其主题的影响。事实上,我读到的版本已经过大幅度重写,以更加重视这种观点。这方面的一个关键是他们的论点,即对于任何架构原则要取得成功,针对这些原则进行交付的团队需要对它有一种所有权意识。
我鼓励你看看他们的书,里面详细介绍了如何从集体中获取这些信息。简而言之,当你面对企业的战略目标、“SMART”标准(前面已经提到)以及来自技术领域和其他领域(再次强调,你的AAF邀请人名单在这里将证明其价值)的广泛受邀者时,你将迅速而集体地得出8-15条原则,这些原则将对你大有裨益。 [6] 将原则的采用记录为ADR非常值得。这些将非常轻量级(不要陷入重复原则本身的陷阱),提供了一个绝佳的机会来阐明为什么这个原则很重要。
关于原则,还有一点需要说明。请记住,这种方法旨在支持团队自治,因此我们的原则所扮演的一个关键角色是作为每个人之间最小的可行理解和协议集。这提出了一个关键点,因为我们要求团队在他们的ADR中明确标记的不仅仅是适用的原则,还有他们的决定何时与一个或多个原则相冲突。这成为一个很好的切入点,可以利用AAF的建议流程和集体的力量,真正获得所有最优秀的人才和不同的观点,然后将所有这些记录在ADR中。再次强调,各种元素相互支持,放大其优势,帮助我们实现成功的架构。请记住,如果由于这个原因,原则发生了变化,请将其作为单独的ADR调用,该ADR取代了原始的ADR。
这就是架构原则的覆盖范围,它们扮演着指路明灯的角色,让每个人都朝着目标努力,但我们如何注意到周围的环境和气候呢?架构决策也经常基于其他人正在做什么,谁拥有哪些技能,以及科技行业的总体趋势。进入第四个也是最后一个支持元素:你自己的技术雷达。
4. 技术领域和当前气候感知工具 - 自己的技术雷达
许多人听说过ThoughtWorks的技术雷达 - 一个对软件语言和框架、工具、平台和技术的当前趋势(预测、当前和消退)的意见性指南。它的优势在于它如何直观地呈现当前的格局以及各种“闪烁”在其上的移动,使观看者能够非常快速地看到(例如)前端框架中的新兴事物、当月的流行趋势以及开始消失的事物。
遗憾的是,很少有人知道你可以构建自己的雷达。“BYOR”允许你作为一个集体,捕获并绘制出你在整个组织中看到的技术趋势的本地版本。它也是高度可配置的。在我最近的使用中,我们保留了象限(技术、工具、平台和语言与框架),但将环形改为反映技术通过我们的工作计划的传输(它们变成了“实验”、“采用”、“保持”和最终“退休”)。
与架构原则一样,这些雷达闪烁需要在研讨会上进行众包。第一次运行将捕获你现在组织中的所有内容 - 如果可以的话,进行基线扫描。在此之前,你需要弄清楚你要走多远(全组织?只是你的项目?你会包括运维和UX等学科吗?等等)以及你的象限将是什么。还可以添加额外的字段来捕获数据,但我通常会尽量保持简单。第一次这样做可能需要相当长的时间(我们之前已经花了四个小时甚至更长时间),但这是因为让所有团队成员参与进来至关重要,而不仅仅是架构师,最终的结果将很好地概述格局和流行的气候,并引发许多关于应该将精力投入到哪里以及应该减少精力的讨论。与原则一样,这将导致团队理解的一般一致。
你的雷达的使用情况如何?与原则一样,我们的ADR中也有“相关雷达闪烁”的位置。在这里,我们既要标记对现有格局的遵守(如当前雷达所反映的那样),更重要的是,还要标记此决定将引入的现有雷达的潜在变化。也许是新的框架的激增,或者从特定实践的“实验”到“采用”的转变。
同样,这对AAF讨论论坛来说是一个很好的素材,也是在ADR本身中捕获内容的好方法。你甚至可以将特定类型的闪烁出现和移动与提交ADR的需要联系起来,尽管在我的经验中,这种情况在没有人明确推动的情况下也会发生。请记住,你的目标是尽可能广泛地参与你不断发展的架构,以及在所有团队成员中培养不断增长的架构思维。
如何保持雷达的最新状态?我见过季度节奏有效,半年也一样。关键是关注雷达在AAF和其他地方是如何被消费的(或者没有被消费)。这应该能让你很好地了解何时值得投资刷新。
这在实践中通常是如何运作的
鉴于所有这些,你如何看待这一切在实践中运作?让我们来看看…
当对架构决策的需求首次出现时,它很可能很模糊,而且可能理解不佳。因此,立即打开一个新的ADR模板并开始尝试填写它是一个好主意。
首先要解决的是“上下文”部分。要尝试这样做,我们需要了解我们决策的“原因”,以及我们需要平衡的周围力量。我们可能会很快意识到,我们需要做一些研究才能完成这个简短的部分。
在这次研究中,早期访问的地方应该是架构原则和雷达。你会记得,原则给了我们一个关于我们理想解决方案将理想地体现出来的前进方向的想法。并非所有原则都相关,但有些原则应该有助于我们的决策。请记住,架构原则的主要目标是帮助评估多种技术可能性,并突出最适合的技术。
有时,体验会略有不同。一种选择是,相关原则无法帮助你在两个选项之间进行选择,那么要么这两个选项之间几乎没有区别,要么可能是你的原则不够SMART。这是一个重新审视原则并重新定义它的好理由。
另一种选择也可能最终导致重新评估的原则集,也许稍晚一些。这些原则出现在为了做出决定,你感到倾向于违反一个或多个原则的时候。这没关系;好的决定可能会违背原则,但要这样做,你需要清楚地说明为什么这种做法是正确的步骤。覆盖原则是一个重要的步骤,因为它意味着我们实际上正在偏离一般的前进方向。因此,决策和由此产生的ADR必须有充分的论据并得到强有力的证明。它也可能表明是时候根据这一发展重新审视原则了。
相比之下,雷达的性质更具建议性。它将给出关于在我们的问题空间中,当前的事实上的标准是什么,过去做了什么,以及其他团队可能正在尝试什么的想法。走不同的路不太可能引起人们的注意,但它仍然是一个明确的理由,需要在ADR中解决偏差。
鉴于所有这些,我们可以开始提出我们评估选项的关键标准,以及备选方案列表。也许我们意识到我们真的需要做一些功课,在这种情况下,我们可能会分出一个时间盒式的Spike来了解更多关于某件事的信息。我们的ADR思维将有助于在这里编写超级清晰的验收标准。如果我们不需要做Spike,我们会考虑寻求建议。
从上下文(例如,将包括技术策略)、适用的原则、雷达闪烁以及关键标准/备选方案中获得这些输入将反过来帮助我们思考与谁交谈以寻求建议。在我的经验中,当你对理解问题空间/需求相对有信心时,但在你对特定解决方案过于执着之前,参与其中是有帮助的。当你寻求建议时,将大部分时间和精力花在与那些不同意你的人交谈上;那些你知道思维方式不同的人,以及你知道你会有盲点的人。不仅如此,还要挑战自己。考虑“这个备选方案有什么不好?它的缺点是什么?”花更多时间思考最直接和根本地挑战你决定的备选方案。
在你进行讨论之前,最好准备好一个粗略形式的ADR,并提前与他们分享。这将给他们思考的时间。然后,当你见面时,浏览ADR模板的每个元素。你是否遗漏了上下文中的某些内容?从原则/闪烁?从评估标准?征求并记录他们对所有这些事情的建议。更重要的是,询问他们为什么提出这些建议。这些问题的答案是学习如何做出更好的架构决策的关键。你的顾问将帮助你了解他们如何看待问题,他们过去遇到过哪些类似的问题,甚至是你从未想过的一些方面。 [7]
AAF怎么样?这不是收集建议的地方吗?是的,我上面分享的所有内容都应该指导你在任何地方进行对话,但对于团队或个人做出的前几个决定,以更具针对性的方式与关键顾问进行这些对话确实很有帮助。你在AAF之前提交的ADR将更加扎实和集中,这意味着由此产生的AAF对话将更加丰富和集中。有时,在AAF中的快速对话会导致后续的更深入的1对1对话。
请记住,一旦你获得了建议,无论它来自哪里,你都必须将其纳入你的ADR。你不需要采纳给出的建议,但你必须记录它。这里一个很好的做法是优先考虑你的写作中人们会发现不直观或令人惊讶的事情。如果你不同意关键建议,说明如何以及为什么。如果你正在做一些新的事情,说明为什么当前的方式不适合你。请记住使用原则。有时它们会支持你的决定。说明如何。有时你必须违反它们。说明为什么。你的目标是让读者理解你为什么做出了你做出的决定。如果你实现了这个目标,那么你不仅会做出一个坚实的决定,而且你很可能在这个过程中学到了很多东西。 [8]
在我结束本节之前,请记住,所有决策都是时间点上的决策,没有人能预见所有情况,但你希望能够在以后回顾时仍然对决策感到满意,考虑到你当时所知/理解的内容。在这方面,你捕获的上下文和标准是关键。重新审视决策是另一个很好的学习工具。有了后见之明,你现在可以问一些问题,例如:“我们是否充分理解了上下文?”以及“我们是否对自己所知和所不知的东西足够诚实?”
如何失败
这就是我们对架构的替代、分散、无政府主义方法的范围,以及它通常如何组合在一起的想法。但在我们结束之前,我们应该解决最后一个方面 - 你可能失败的关键方式。让我们列举一下。
你将看到的大多数失败实际上都是好的 - 随着经验不足的人做出决策,会发生微小的失败。这些很好,因为这个过程促进了那些需要做出决策的人快速做出决策,更重要的是,它促进了透明度和快速识别失败(因为做出决策的人将在编码时意识到问题),以及重新审视和分享经验教训的安全方法。拥抱这些,明确指出它们,并在AAF中庆祝它们。这是建立学习型文化的一个关键方面。
为了最有效地学习,你需要感到安全,而当集体学习时,每个人都受益于最广泛、最多样化的输入,这些输入有助于讨论。请记住,在这种方法中,我们明确地不是在寻找共识,而是在寻找广泛的输入和声音。下一个失效模式就存在于此,它比第一个更隐蔽,也更具破坏性。这种第二个失效模式出现在你作为对话发起者和空间持有者,未能将所有应该参与贡献、决策和学习的人纳入其中时。在很大程度上,这种架构风格的早期采用阶段可能感觉像是巨大的成功。“它正在起作用!越来越多的人参与决策,将它们写成 ADR,提供建议并在 AAF 中讨论它们!我从未见过如此积极地参与原则。”只有在事后反思时,你才会意识到收益本可以更大。正是当这种最初的满足感袭来时,你必须最警惕。你真的观察到大众参与和学习了吗,还是只是一群老面孔?你可以积极地缓解这个问题。注意谁在贡献。放大声音,确保其他人倾听更安静的贡献者。确保影响力是平衡的,而不是基于声誉、任期或等级制度中的位置。积极鼓励多种观点,并强调它带来的价值,使其成为可持续的。
第三个失效模式是对你正在遇到前面失效模式的早期预警,然而,它更多地存在于理想和不受欢迎之间的灰色地带。当你沿着这条道路前进时,你会发现一些脱离网格的决策。这些决策从未在 AAF 中出现,也从未被写入 ADR。有两种方法可以处理它们。第一种,正确的方法,是将发现视为你希望它成为的样子——一个诚实的错误,以及一个学习和教导他人的机会。也许决策者甚至没有意识到他们正在做出一个关键决策。也许他们受到其他地方的压力。也许他们认为它不像后来证明的那样重要。也许他们觉得他们在 AAF 中会被驳倒。无论是什么原因,都要把它看作是他们和你学习的机会。改进流程。另一种错误的方法是回到旧的方式,重新控制。这很好地将我们带到了完全破坏这种方法及其所有承诺的失效模式。
很容易陷入这种第四种也是最危险的失效模式,因此你需要不断保持警惕。触发这种情况的唯一事情是像你这样的“大写 A”架构师未能信任人们;是不实践你所宣扬的;是不为前面提到的微小失败和随之而来的学习机会留出足够的空间;是在幕后继续进行“影子架构”,以确保事情仍然按照你认为应该的方式进行,尽管来自其他地方的所有信号都表明并非如此。这种失效模式的唯一好处是它会很快变得明显,因为我上面列出的所有好处都无法实现。
如果你想知道是否是这种关键的失效模式使得这种架构方法难以实现,那么你是对的。我过去很幸运。同事们在我为他人做出决策时指出了我的错误,我发现自己对人们不知道我所知道的事情感到沮丧。但随后我意识到我在作为架构师的真正任务中失败了——我未能让正确的人在正确的时间进行正确的对话。记住这一点(甚至可以委托其他人在你未能坚持流程时指出你的错误),你会惊讶地发现成功是多么容易(和令人满意)。
五个要素再次出现,以及可能的进一步步骤
鉴于我们现在既有好的也有(潜在的)坏的,以及一系列需要注意的失效模式,让我们总结一下。我们记得我们有五种替代架构方法的要素
一个核心要素:建议流程
四个支持要素
- 架构咨询论坛
- 轻量级 ADR
- 团队来源的原则
- 你自己的技术雷达
希望我已经清楚地表明,虽然这些要素中可能没有一个是新的(除了可能建议流程),但有一些非常不同的地方。这种差异在于所有这些要素在对话、学习和安全背景下的相互作用/相互强化。希望吸引人的是,至少根据我的经验,这更有可能提供现在和未来成功部署的架构。这是我用来扩展自己的方法,并确保我与之合作的团队能够兑现我们对用户的承诺,毕竟,这是目标。
后记:下一步是什么?
当然,虽然我试图让这篇文章保持重点,但可以更进一步。我看到团队以这种方式自然地开始铺设自己的道路——在(交付)平台团队出现之前,为自己的交付平台提供服务。(有关此方面的更多详细信息,请参阅我的同事 Evan Bottcher 的优秀文章 “当我谈论平台时我谈论什么” 以及 Skelton 和 Pais 的 团队拓扑。)
我还看到团队建立了自己的 架构适应度函数(不仅仅围绕 运行成本),以便他们知道何时集体架构偏离其预期范围。
我学到的最大教训是,一旦你赋予人们权力,为他们提供一个成功的环境,并认可他们的成功,他们将迅速地,并且作为一个集体,开始思考你甚至没有想到的事情。这就是这种方法的真正好处:获得许多人的集体智慧,而不是依赖少数人的更有限的智慧。
脚注
1: 虽然会有一剂健康的无政府主义……
2: 我将自己也包括在这个群体中。
3: 决策的经济学在 Donald G. Reinertsen 的《产品开发流程原理》中进行了详细的阐述。原则 E8:小决策原则,E10:第一易逝性原则和 E11:细分原则,鉴于我们在这里讨论的内容,特别有趣。
4: 实际上还有两个,但我们会讨论它们,并在支持要素 3 和 4 中分别详细讨论它们。
5: 请注意,在撰写本文时,John Lewis 原则包括一些超出我们对“架构”原则定义的项目。我指的是例如 “可理解性” 和 “性能重要性”。这并不意味着这些不是糟糕的目标,只是它们不符合我们的定义。
6: 值得指出的是,虽然他们在下一章中的 JAD 和 ARB 不太适合我们在这里遵循的方法,但它们确实包含了一些关于何时重新审视/更新原则的伟大想法,从而确保它们通过持续使用和重新评估保持新鲜。
7: 典型的例子包括那些不得不寻找、雇用和留住开发人员的人,以及那些对新技术有不同想法的决策“支持”端的人。
8: 有些很棒的博客文章符合这个标准,在很多方面只是扩展的 ADR。“为什么不使用 Rust?” 和 “不,我们不使用 Kubernetes” 是很好的例子,如果你想看到一些真正伟大的决策(和避免货物崇拜)正在进行,值得一读。
致谢
非常感谢所有帮助我将这篇文章写成现在状态的人:Martin Fowler、Nimisha Asthagiri、Nick Robinson、Rob Horn、Ian Cartwright、Tim Cochran、Carl Nygard、Marty Abbot、Mel Mitchell、Pete Hunter 和 James Brown。感谢你们的智慧和贡献。
重大修订
2021 年 12 月 15 日:完成出版
2021 年 12 月 13 日:发布技术雷达
2021 年 12 月 9 日:发布架构原则
2021 年 12 月 8 日:发布架构咨询论坛
2021 年 12 月 1 日:发布决策记录
2021 年 11 月 30 日:发布建议流程