「敏捷模型」敏捷架构:规模化敏捷开发的策略(下)

简介: 「敏捷模型」敏捷架构:规模化敏捷开发的策略

8.考虑几种替代方案

正如精益软件开发告诉我们的那样,我们不应该尽早采取架构策略,而应该考虑几种替代方案,并且只要它们仍然可行,就让这些替代方案对我们“开放”。这意味着,当您在项目早期构想架构时,您应该真正设想出几种可能的架构。公平地说,这种策略并不是新的,事实上,这种策略已经在IT架构社区中推广了几十年,尽管并不总是如此。


9.记住企业约束

除最新组织外,所有组织都拥有现有的技术基础设施。更成熟的组织可能有:

  • 他们正在努力实现的技术基础设施的“前景”愿景
  • 企业级标准和指南 - 用于开发,数据,用户界面,安全性等 - 项目团队应遵循的标准和指南
  • 用于降低总体开发和运营成本的战略性重用策略
  • 企业架构,战略重用和/或类似的团队,负责发展和推广这些事物
  • 运营和支持组织,有时也称为系统管理组织,负责在生产中运行组织的系统

关键是这些企业级考虑因素为开发团队提供了挑战和机遇。虽然每次构建一个新系统时从一个干净的架构板开始会很棒,但实际情况是在绝大多数情况下策略都是不合适的。多年来我见过几个敏捷项目团队因为他们选择重新开始,声称他们的架构随着时间的推移而出现,他们有勇气担心明天明天的问题,他们制作了潜在的可交付软件。定期,并基本上嘲弄任何其他敏捷的言论,他们认为这些言论证明了他们的愚弄。训练有素的团队构建系统,其架构出现在他们工作的组织环境中。他们谦虚地认识到他们无法做出他们想要的所有技术决策,而是受到现有基础设施和愿景的限制。此外,他们还生产可在组织生态系统中使用的可消耗解决方案。

幸运的是,企业关注的焦点也很多。通过利用现有的基础架构团队,可以更快地提供,因为他们的构建更少。通过使用现有技术,或者至少通过使用企业愿景中提到的新技术(对您的组织来说是新的),他们通过帮助最小化运营成本来降低系统的总体拥有成本(TCO)。通过遵循公司发展准则,它们有助于提高工作的一致性和质量,增加其可维护性,以便将来负责发展和维护工作。顺便说一句,软件开发上下文框架(SDCF)的企业规程扩展因子是八个中唯一的扩展因子,这使得开发团队可能更容易实现,因为这个因素远离项目级别的重点( “容易”的情况)到企业层面的焦点(“硬”情况)。

那你怎么做的?最低限度,企业架构师,运营团队等企业集团是重要的利益相关者,应由您的产品所有者代表。对于您的企业体系结构组,其中一个或多个可能成为您的开发团队的活跃成员,具有架构所有者的角色。对于其他组,产品所有者可以根据需要和适当的即兴基础选择让他们作为域或技术专家参与您的团队。


10.轻装上阵

您的架构工作的一个目标应该是轻装上阵,尽可能灵活。当一个五页的文档可以做时,不要创建一个五十页的文档。当图表执行时,不要创建一个五页的文档。当隐喻可以做时,不要创建图表。记住“他们不会读它(TAGRI)”的原则。

不确定如何创建文档?错误的是因为你可以随时回到白板,但是你浪费了创建你不需要的工件或者为工件添加不必要的细节的时间已经一去不复返了。您的目标应该是考虑项目团队(或组织甚至行业所面临的关键问题,具体取决于您的范围),不应该创建大量的文档。最大化股东投资回报率的原则告诉您要专注于高价值的活动,例如作为一个团队解决困难问题并达成共同愿景。同样,它告诉您要避免低价值的活动,例如撰写详细的文档或开发分数漂亮的图表。这些活动往往令人感到欣慰,因为它们提供了进步的幻觉,如果你试图避免处理棘手的问题,就会为你提供一个离题的来源,但实际上很少像你想象的那样有效,因为其他人很少看到比作者。原则软件是您的主要目标意味着您应该对您的架构进行建模,直到您认为自己有可行的策略为止,此时您应该继续开始开发软件而不是文档。

您何时想撰写架构文档?在我看来,有两个例子让它变得“敏捷”。首先,当您拥有分布式开发团队并且无法找到更有效的沟通方式(例如面对面交谈)时,文档就是一种选择。其次,在项目结束时,您希望留下足够的文档,以便其他人可以在以后了解您的方法。现实情况是,对于相当复杂的系统来说,记录代码中的所有内容是非常困难的,如果不是不可能的,当然也不可取。有时,描述您的体系结构的最佳位置是简要的概述文档。本文档应侧重于解释您的架构的关键方面,可能由您的导航图捕获,它可能包括关键架构要求的摘要,以及对您所做的“可疑”方面背后的关键决策的解释。与往常一样,如果您要创建一个架构文档,那么它应该增加正值,理想情况下应该以最有效的方式执行。

很多人在发现架构没有“记录良好”时会感到担心,无论这意味着什么。我并不是很担心这个问题,但我担心的是架构是否真实,以及开发人员是否理解并接受它。如果您要优先考虑您的体系结构文档,拥有可行的体系结构,让开发人员理解该体系结构,并让所有开发人员都能使用它,那么我怀疑文档将在该列表中排在最后。想一想。

11.证明你的架构

实践证明它与代码指出模型只是一个抽象,一个看似非常好的模型在实践中可能实际上并非如此,你可以肯定知道的唯一方法是通过实现验证你的模型。这意味着你应该证明你的架构是有效的,XP称之为尖峰,RUP称为架构原型。当您的架构呼唤一些对您来说不熟悉的东西时,也许您是第一次使用两个或更多产品,您应该花时间来探索这种方法是否能够如何工作以及它是如何工作的原则快速反馈。记住要获得项目利益相关者的许可才能完成这项工作,因为这是他们花的钱。有时您会通过努力发现原始方法不起作用,我希望尽早发现,有时您会发现您的方法实际上是如何工作的(而不是您认为它的工作方式)。架构尖峰/原型的开发有助于降低项目风险,因为您可以快速发现您的方法是否可行,您还没有简单地制作象牙塔架构。

图5概述了优先需求“最佳实践”的敏捷方法。通过对交付生命周期的风险价值方法,Scrum价值驱动生命周期的扩展,您将确定解决项目主要技术风险的少数需求。例如,如果您的要求表明您的系统必须能够在10小时内每秒处理4,000个事务,那么这将是一个明确包含某些技术风险的要求。这是您希望在项目早期实现的一种要求,以确保您的体系结构真正起作用。我的一般规则是,当你进入为期6个月的项目仅18天而不是在“6个月项目”的8个月点结束时,最好发现你的架构策略需要重新考虑。这意味着,如果技术风险要求不在积压的首位,那么您需要与产品所有者密切合作,以说服他们重新确定优先级不高的要求。但是,如果您无法说服您的产品所有者这样做(我在实践中从未遇到过这个问题,但认识到可能会发生这种情况),那么您需要尊重他们的决定并接受以后证明您的架构的风险生命周期。

图5.工作积压。

12.传达您的架构

有两个主要受众,您的架构的沟通很重要:您的开发团队和项目利益相关者。为了促进您的开发团队之间的沟通,我坚信您应该遵循公开展示模型的所有架构图,因为一个严密保密的架构不是一个架构,它只是一个徒劳无益的自我锻炼。我参与了几个项目,我们成功地维护了一个专门用于架构图表的白板,让它们公开显示给项目中的每个开发人员以及偶然走过的任何其他人。我们还允许任何想要在图表中添加评论或建议的人,按照开放和诚实的沟通原则以及集体所有权的实践,因为我们希望他们对我们的工作有所反馈。我们没有什么可隐瞒和信任的,其他人愿意帮助我们(他们确实)。

在项目开始时,在整个项目中不那么频繁,您经常会发现需要使图表“看起来很漂亮”,这样您就可以将它们呈现给您的项目利益相关者。您的利益相关者希望了解什么是什么您打算采取的方法来确定您是否明智地投入资源,这意味着您需要建立模型来沟通和定位您的某些模型,以便其他人可以理解它们。这可能意味着您需要花时间来清理模型以使其可呈现以及为它们编写概述文档。为了保持尽可能灵活,有目的的模型原则告诉您,您应该确切地知道您正在为谁开发模型以及他们将使用它们,以便您可以专注于所需的最小努力。向重要的项目利益相关者进行演示,这些工作往往令开发人员烦恼和分散注意力,这对项目的成功至关重要,因为它们为您提供了获得项目支持和获取所需资源的机会。此外,您可以提升让您可以积极参与项目的利益相关者的重要性(如果您没有可用的利益相关者,则无法遵循主动利益相关方参与的做法)。

准备好在演示文稿中传达您的架构,没有理由不能保持演示文稿的敏捷性。


13.考虑未来,但不要过度建设(推迟承诺)

我怀疑关于敏捷架构建模的最具争议性的概念是你应该考虑未来的变化,但在你真正需要之前不要采取行动。换句话说,不要过度构建你的系统,但同时要聪明一点。XP社区对于过度构建软件的概念相当直率,他们相信“你无论如何都不需要它”(YAGNI)。基本思想是你无法准确预测未来[1],因此不应该为未来的可能性而努力。相反,您今天应该专注于构建您现在需要的东西并干净地构建它,以便您的软件在需要时易于更改。明天,当您发现需要更改软件以满足新要求时,请更改它。当您过度构建软件以更加通用时,为了满足未来的潜在需求,您实际上正在做出非常严肃的权衡:

  • 很难估计你正在生产的实际价值。您并不专注于满足当今的需求,导致您不会为您的用户带来直接的价值。我参与了几个项目,前几个月,在少数情况下,前几个季度,我们的工作重点是开发通用基础架构(持久性框架,消息传递框架等)。技术上有趣的东西,我们肯定有很多乐趣构建它们,但对我们的用户没有任何价值。
  • 你在猜。你真的不知道你是否甚至需要你正在建造的任何东西 - 当一辆大众汽车足够时你可能正在建造一辆保时捷。
  • 你增加了维护负担。您今天过度建造的任何东西都需要在项目的整个生命周期中进行测试和维护,这违反了Travel Light的原则。
  • 目前尚不清楚它需要在多大程度上进行测试。当你过度建造某些东西时,唯一可以准确验证它的方法就是通过虚构的反馈 - 没有人要求你过度建造任何东西,所以没有人可以去验证你的工作。此外,大多数开发团队都会测试风险,但如果您猜测需求,那么您也会猜测风险级别。

所以你怎么能对这一切都很聪明?虽然您不希望根据未来/神话要求过度构建系统,但考虑未来并没有任何问题。这是一个两阶段战略:

  • 初始建模。做一些初步的架构,设想思考问题,探索关键概念,从而让你朝着正确的方向前进。这并不意味着您需要创建大量的架构文档,尽管您可能会进行一些建模,是的,egads!,甚至可以创建足够的架构文档来满足您的需求。
  • 推迟设计决策。精益软件开发的原则之一是推迟对您需要做出决定的最后可能时刻的承诺,从而提高您的灵活性并提高您的成功机会。

一个有趣的策略是变更案例建模。变更案例用于描述系统的新潜在要求或对现有要求的修改。变更案例是您未来可能需要或可能不需要支持的要求,但您今天绝对不需要支持。变更案例通常是与项目利益相关者进行头脑风暴的结果,其中诸如“业务如何变化?”等问题。“什么立法可以改变?” “你的竞争对手在做什么?”和“还有谁可能会使用该系统以及如何使用?”在技术方面,开发人员经常会提出诸如“什么技术可以改变?”等基本问题。和“我们需要与哪些系统进行交互?”这将导致识别变更案例。变更案例应该是现实的,例如“我们为银行进入保险业务”或“我们需要支持我们系统中的[INSERT FLASHY NEW TECHNOLOGY]”是合理的变更案例,但“我们的销售人员被不明飞行物绑架” “T。此外,变更案例通常描述的要求与您当前正在处理的要求相当不同,这些要求可能会导致重大的返工。通过识别变更案例,您现在可以智能地选择看起来与架构或设计决策相同的内容。当您的当前要求不足以帮助您在备选方案之间进行选择时,您应该只将相关的变更案例纳入决策过程。另一个优点是你现在可以向你的项目利益相关者解释为什么你选择一种方法而不是另一种方法,因为我想说你有一个故事要讲。但是,我不能强调改变案例不应该被用作为你的系统镀金的借口。保持敏捷,不要过度构建系统。那么当你认为你有一个你真正相信现在需要实施的变革案例时,你会怎么做?简单 - 与项目利益相关者讨论。询问他们是否立即要求变更案例,如果是,则相应地采取行动。如果这不是一个直接的要求,那么接受这个事实并继续前进。永远不要忘记项目利益相关者有责任确定需求的优先级,而不是您的需求。

未来的建模是否会受到损害?这是一个滑坡,因为我怀疑如果你建模它然后你更有可能建立它。我相信,这需要严格的纪律,不要过度建造,因为一旦你把它作为一系列气泡和线条捕获,就很容易让自己相信过度建造一次就没有坏处。已经说过,在讨论变更案例的时候绘制一些丢弃的草图并没有什么不妥,只是不要过度建模你打算保留的任何模型。

14.采用多视图方法

敏捷建模的多模型原则建议您认识到,因为现代系统很复杂,您需要考虑架构中的一系列视图。虽然它们采用不同的方法,但多视图策略是现代架构框架中的基本概念,例如Zachman框架,TOGAF,4 + 1等。这些框架中的每一个都有很好的理由来选择视图,它们在实践中似乎都运行良好,它们都可以灵活地进行处理,所以我的建议是检查您的选项并选择最能反映出来的架构框架。您组织的文化。我的目标不是提出另一个架构框架,而是让您了解它们及其基本概念。图6概述了软件/系统架构师需要关注的视图和关注点(通常称为服务质量要求)。

图6.架构视图和关注点。


视图/视点被捕获为图表和文本描述(例如用例,技术规范或散文)的组合。潜在的问题,可能是您自己的观点,您的架构应该解决的观点包括:

  • 用法/业务流程
  • 用户界面
  • 系统界面
  • 网络
  • 部署
  • 硬件
  • 数据存储
  • 数据传输
  • 活动
  • 代码/组件分发
  • 功能/逻辑/服务

借用面向方面编程(AOP)的语言,您的架构也可能需要考虑“横切关注点”。这些问题/观点也应该通过您的架构视图来解决,在某些情况下可能是您自己的特定视图。这些担忧包括:

  • 分层/分区
  • 重用
  • 质量和验证
  • 准确性和及时性
  • 可靠性,可用性,可维护性和性能
  • 环境(绿色计算问题)
  • 定制点
  • 可消耗性(包括(de)安装的简易性,支持级别,可用性,......)
  • 并发
  • 安全
  • 国际化
  • 条例
  • 维护,操作和支持问题

这意味着,任何担任架构师角色的人都需要拥有广泛的技能才能发挥作用,他们需要摆脱过度专业化的传统哲学,更多地是一个普遍化的专家。最低限度的是,他们应该从简单的数据架构师,安全架构师或网络架构师转变为架构师。仅仅是一名架构师也可能过于专业化,但这取决于具体情况。真正的专业人士力求拥有广泛的技能以及一个或多个专业。

15.这是如何工作的?

我所描述的架构方法与许多组织目前正在做的事情明显不同。表1比较并对比了许多组织中常见的架构实践与敏捷对应的架构实践。显然,这有很大的不同。敏捷方法之所以有效,是因为它专注于团队合作的人员。敏捷建模认识到人们是错误的,他们不太可能从一开始就获得正确的架构,因此需要有机会根据实施工作的反馈行事。当敏捷架构师是开发团队的高效成员,并且当开发团队参与开始的架构工作时,他们不需要全面的文档,导航图就足够了(授予,当这不是案件文件,希望最小,可能是必需的)。不需要架构评论,因为架构是通过架构原型设计/峰值的具体反馈来证明的,因为人们可以看到架构发展,因为您的模型公开展示供所有人查看。敏捷架构师有勇气专注于解决当今的问题并相信他们明天可以解决明天的问题(Beck,2000),以及认识到他们无法准确预测未来并因此选择不过度构建他们的架构的谦虚。

表1.比较常见和敏捷架构实践。

共同的实践

敏捷实践

架构师受到高度重视,经常被置于基座上,甚至更糟糕

敏捷的架构师谦虚地承认他们不会走水

架构师太忙了,不能随便开发

敏捷架构师是开发团队的活跃成员,在适当的情况下开发软件并充当团队的架构顾问

架构模型非常强大,可以满足未来的需求

敏捷架构师谦虚地承认他们无法预测未来,而是有勇气相信他们明天可以解决明天的问题

目标是在项目早期开发全面的架构

您可以逐步和迭代地改进您的体系结构,使其随着时间的推移而出现

需要记录良好的架构模型

轻装上阵,专注于概述您的建筑的导航图,记录足以与您的目标受众进行沟通

架构模型只有在“适合公众消费”时才会传达

架构模型即使在进行中也会公开展示,以促进其他人的反馈

在投入使用之前,将进行架构评审以验证您的模型

通过具体实验证明了架构

16.解决敏捷和架构周围的神话

我想通过解决一些与世界各地的组织合作时仍然遇到的常见神话来结束这篇文章。

  • 敏捷者不做架构。我的希望是,这篇文章将把这个神话牢牢地放在一边。
  • 您需要进行详细的前期架构建模。您应该进行一些前期架构建模,以确定您的一般技术策略,识别您可能遇到的潜在技术挑战,并帮助您在团队中围绕技术方向达成共识。关键是你不需要很多细节来实现这些目标。采用“大型模型预测(BMUF)”方法是一种选择,这种方法在理论上听起来很棒,特别是如果你是一名专业建模师,但在实践中通常被证明是一个相当差的人。BMUF战略导致糟糕的决策和解决方案不太可能满足利益相关者的实际需求,降低您支持不断变化的需求的能力,并导致士气低落。
  • 架构师负责架构。虽然许多组织选择支持主要负责架构活动的专业架构师,但事实证明这在实践中是一个相当糟糕的选择,因为开发人员可能会将架构师视为“象牙塔”并且经常会选择忽略它们。正如您在本文中看到的那样,有效的架构策略本质上是协作的,而不是独裁的。

17.致谢

相关文章
|
18天前
|
消息中间件 存储 Cloud Native
云原生架构下的数据一致性挑战与应对策略####
本文探讨了在云原生环境中,面对微服务架构的广泛应用,数据一致性问题成为系统设计的核心挑战之一。通过分析云原生环境的特点,阐述了数据不一致性的常见场景及其对业务的影响,并深入讨论了解决这些问题的策略,包括采用分布式事务、事件驱动架构、补偿机制以及利用云平台提供的托管服务等。文章旨在为开发者提供一套系统性的解决方案框架,以应对在动态、分布式的云原生应用中保持数据一致性的复杂性。 ####
|
21天前
|
机器学习/深度学习 自然语言处理 C++
TSMamba:基于Mamba架构的高效时间序列预测基础模型
TSMamba通过其创新的架构设计和训练策略,成功解决了传统时间序列预测模型面临的多个关键问题。
68 4
TSMamba:基于Mamba架构的高效时间序列预测基础模型
|
15天前
|
Cloud Native 安全 API
云原生架构下的微服务治理策略与实践####
—透过云原生的棱镜,探索微服务架构下的挑战与应对之道 本文旨在探讨云原生环境下,微服务架构所面临的关键挑战及有效的治理策略。随着云计算技术的深入发展,越来越多的企业选择采用云原生架构来构建和部署其应用程序,以期获得更高的灵活性、可扩展性和效率。然而,微服务架构的复杂性也带来了服务发现、负载均衡、故障恢复等一系列治理难题。本文将深入分析这些问题,并提出一套基于云原生技术栈的微服务治理框架,包括服务网格的应用、API网关的集成、以及动态配置管理等关键方面,旨在为企业实现高效、稳定的微服务架构提供参考路径。 ####
42 5
|
18天前
|
存储 NoSQL 分布式数据库
微服务架构下的数据库设计与优化策略####
本文深入探讨了在微服务架构下,如何进行高效的数据库设计与优化,以确保系统的可扩展性、低延迟与高并发处理能力。不同于传统单一数据库模式,微服务架构要求更细粒度的服务划分,这对数据库设计提出了新的挑战。本文将从数据库分片、复制、事务管理及性能调优等方面阐述最佳实践,旨在为开发者提供一套系统性的解决方案框架。 ####
|
16天前
|
Kubernetes 负载均衡 Cloud Native
云原生架构下的微服务治理策略
随着云原生技术的不断成熟,微服务架构已成为现代应用开发的主流选择。本文探讨了在云原生环境下实施微服务治理的策略和方法,重点分析了服务发现、负载均衡、故障恢复和配置管理等关键技术点,以及如何利用Kubernetes等容器编排工具来优化微服务的部署和管理。文章旨在为开发者提供一套实用的微服务治理框架,帮助其在复杂的云环境中构建高效、可靠的分布式系统。
32 5
|
16天前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
21天前
|
缓存 负载均衡 监控
微服务架构下的接口性能优化策略####
在当今快速迭代的软件开发领域,微服务架构以其灵活性和可扩展性成为众多企业的首选。然而,随着系统复杂性的增加,接口性能问题日益凸显,成为制约用户体验与系统稳定性的关键因素。本文旨在探讨微服务架构下接口性能优化的有效策略,通过具体案例分析,揭示从代码层面到系统架构层面的全方位优化路径,为开发者提供实战指南。 ####
|
21天前
|
消息中间件 数据库 云计算
微服务架构下的数据库事务管理策略####
在微服务架构中,传统的单体应用被拆分为多个独立的服务单元,每个服务维护自己的数据库实例。这种设计提高了系统的可扩展性和灵活性,但同时也带来了分布式环境下事务管理的复杂性。本文探讨了微服务架构下数据库事务的挑战,并深入分析了几种主流的事务管理策略,包括Saga模式、两阶段提交(2PC)以及基于消息的最终一致性方案,旨在为开发者提供一套适应不同业务场景的事务处理框架。 ####
|
23天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
23天前
|
存储 负载均衡 Kubernetes
混合云和多云策略:混合云架构设计详解
混合云和多云策略:混合云架构设计详解
59 1