构建基础设施平台
基础设施平台团队通过使用弹性解决方案解决常见产品和非功能需求,帮助组织扩展交付。这使其他团队能够专注于构建自己的产品并为用户发布价值。但没有人说构建可扩展平台很容易... 在本文中,Poppy 和 Chris 探索了 7 条关键原则,可以帮助你正确地构建正确的东西。剧透:不要跳过策略、用户体验和研究。
2022 年 2 月 9 日
在过去的 20 年里,软件已经取得了长足的进步。不仅交付速度加快了,而且正在开发的系统的架构复杂性也飙升以匹配该速度。
并不是说在“美好”的旧时代构建软件是简单的。如果你想为你的业务建立一个简单的 Web 服务,你可能需要
- 安排一些时间与基础设施团队一起寻找备用 [已修补] 机架服务器。
- 花费数天时间反复配置一堆负载均衡器和域名。
- 说服/哄骗/贿赂 IT 管理员让你将流量安全列入白名单,通过你的公司防火墙。
- 找出最适合你拼凑的上线脚本的 FTP 咒语。
- 向残酷无常的Prod 之神献上祭品,祈求他们保佑你的服务好运。
值得庆幸的是,我们已经(或者更确切地说,我们正在)从这种传统的“裸机”IT 设置转向团队能够更好地构建和运行的设置。在这个勇敢的新世界中,团队可以以类似于编写服务的方式配置他们的基础设施,并且可以反过来受益于拥有整个系统。
在这个清新闪亮的可能性新时代,团队可以在他们选择的任何独角兽配置中构建和托管他们的产品和服务。他们可以选择他们的托管提供商、技术和监控策略。他们可以发明一百万种不同的方法来创建相同的东西 - 而且几乎肯定会这样做!然而,一旦你的组织达到一定规模,让你的团队构建自己的基础设施可能不再有效。一旦你开始一遍又一遍地解决相同的问题,可能是时候开始投资“平台”了。
基础设施平台为团队提供通用的云组件,以便团队利用这些组件构建自己的解决方案。所有托管基础设施(包括所有网络、备份、计算等)都可以由“平台团队”进行管理,从而让开发人员可以自由构建自己的解决方案,而无需担心这些基础设施。
通过构建基础设施平台,您可以为产品团队节省时间,减少云支出,并提高基础设施的安全性与严谨性。基于这些原因,越来越多的高管正在寻找预算来组建独立的团队以构建平台基础设施。遗憾的是,问题可能就此开始。幸运的是,我们已经经历了构建基础设施平台的起起落落,并总结了一些确保平台成功的基本步骤!
制定具有可衡量目标的策略
“我们没有实现目标”可能是您在为某事工作数周或数月后从利益相关者那里听到的最糟糕的事情。在基础设施平台领域,这是一个问题,可能导致您的高管决定放弃这个想法,并将预算花在其他领域(通常是更多产品团队,这可能会加剧问题!)避免这种情况并不难 - 制定一个目标和一个实现目标的策略,让您的所有利益相关者都参与进来。
制定策略的第一步是召集合适的人员来定义问题。这应该是产品和技术主管/预算持有者的组合,由可以帮助提供有关组织中正在发生的事情的背景信息的 SME 提供帮助。以下是一些好的问题陈述示例
我们的前 15 个产品团队中没有足够具有基础设施能力的人员,我们也没有资源来雇用我们需要的人员,这将使我们的产品上市时间平均延迟 6 个月
在过去 18 个月中,我们的产品已中断 160 小时,损失收入超过 200 万美元
这些问题陈述诚实地阐述了挑战,并且易于理解。如果您无法提出问题陈述,那么您可能不需要基础设施平台。如果您希望通过创建基础设施平台来解决许多问题,那么请列出这些问题,但选择一个作为驱动因素和重点。拥有多个问题陈述可能会导致对基础设施团队将取得的成就做出过多的承诺,并且无法实现;对具有不同结果的过多事情进行优先排序,并且实际上无法实现任何目标。
现在将您的问题陈述转换为目标。例如
为前 15 个产品团队提供他们可以轻松使用的基础设施,以平均减少 6 个月的上市时间
在未来 18 个月中将中断时间减少到 3 小时以内
现在,您可以制定一个策略来解决您的问题。以下是一些有趣的想法
验尸会议
- 如果您按照前面的步骤操作,您已经确定了组织中存在的问题陈述,因此最好找出为什么这是一个问题。召集所有了解问题背景的人员参加事后分析会议(理想情况下是具有不同观点和对问题有不同了解的人员)。
- 在开始时确保每个人都致力于让会议成为一个安全的空间,在这个空间中赞扬诚实,并且没有指责。
- 会议的目的是找出问题的根源。以下操作可能会有所帮助
- 绘制出可能导致问题的时间表。互相帮助构建问题潜在原因的图片。
- 使用 5 个为什么技术,但确保不要专注于找到单一的根本原因,通常问题是由多种因素共同造成的。
- 一旦找到根本原因,询问需要改变什么以避免再次发生;您需要创建一些安全准则吗?您需要确保所有团队都使用 CI/CD 实践和工具吗?您需要每个团队都有质量保证吗?此列表还可以继续...
未来倒推会议
- 映射实现目标所需的条件,例如“所有产品都有多个可用区”、“所有服务必须有五九 SLA”。
- 现在弄清楚如何实现这些条件。您需要组建一个基础设施平台团队吗?您需要雇用更多人吗?您需要更改一些治理吗?您是否需要在开发早期将信息安全等专家嵌入到团队中?此列表还可以继续...
我们强烈建议进行这两个环节。使用过去和未来的视角可以为实现目标和解决问题所需采取的措施带来新的见解。首先进行事后分析,因为我们的大脑似乎更容易在未来之前思考过去!如果您只有一次机会,那么进行一次未来倒推环节,因为未来的范围稍宽,因为未来尚未发生,并且可以促进更广泛的构思和跳出框框的思考。
希望通过完成这两个环节中的一个或两个环节,您会获得一份非常实用的清单,列出实现目标需要采取的措施。这是您的策略(旁注:愿景和目标不是策略!!!请参阅理查德·P·鲁梅尔特撰写的《好策略坏策略》)。
有趣的是,您可能会决定组建一个团队来构建基础设施平台并不是您的策略,这很好!基础设施平台并不是每个组织都需要的东西,您可以跳过本文的其余部分,去马丁博客上阅读一些更有趣的东西!如果您有幸在您的策略中创建基础设施平台,那么请做好准备,获得更多出色的建议。
找出客户的需求
当我们敏捷主义者听说一款产品已经构建完成,但没有用户时,我们翻了翻白眼,知道他们一定没有进行适当的用户研究。因此,您可能会惊讶地发现许多组织构建了平台基础设施,但无法让任何团队使用它们。这可能是因为一开始就没有人生产需求。也许您构建基础设施产品太晚了,他们已经构建了自己的产品?也许您构建得太早,他们忙于其他积压优先级而无暇顾及?也许您构建的内容不完全符合他们的用户需求?
因此,在决定构建什么之前,请像对待面向客户的产品一样进行探索。对于那些以前没有做过探索的人来说,探索是一种(通常)按时间限制的活动,一群人(理想情况下是将构建解决方案的团队)尝试了解他们构建某项内容的问题空间/原因。在探索期的末尾,团队应该了解基础设施产品的用户是谁(可能有多种类型的用户)、用户有什么问题、用户做得好的事情以及团队将构建的基础设施产品的一些高级想法。您还可以调查其他可能有用的事情,例如人们正在使用什么技术、人们以前尝试过什么没有成功、您需要了解的治理等。
通过将我们的问题陈述定义为战略工作的一部分,我们了解了组织的需求。现在我们需要了解这与我们的用户需求有何重叠(我们的用户是产品团队 - 主要开发人员)。确保在考虑战略的情况下开展活动。例如,如果您的战略侧重于安全性,那么您可能会
- 突出显示安全漏洞的示例,包括导致这些漏洞的原因(如果您进行过事后分析,请使用事后分析中的信息)
- 采访参与安全工作的各种人员,包括安全主管、技术主管、技术负责人、开发人员、质量保证人员、交付经理、业务分析师、信息安全人员。
- 使用事件风暴等研讨会绘制产品的现有安全生命周期。在您希望基础设施平台提供服务的时限内,尽可能与尽可能多的团队一起冲洗并重复。
如果您只在探索中做一件事,请进行事件风暴。让一个团队或一群将成为您客户的团队在有物理墙的物理房间中或在有虚拟白板的电话中。在此图表上绘制一个有开始和结束点的时序图。对于基础设施平台探索,从项目开始到在生产中对用户上线进行映射可能很有用。
然后要求每个人将从项目开始到在生产中上线的所有内容映射到一种颜色的便利贴上。
接下来要求团队用另一种颜色覆盖任何痛点、令人沮丧的事情或并不总是顺利的事情。
如果您有时间,可以覆盖任何其他信息,这些信息可能有助于您了解潜在用户面临的问题空间,例如所使用的技术或系统、不同部分所需的时间、可能参与不同部分的不同团队(如果您决定在会议后深入研究某个领域,此信息很有用)。在会议期间和会议之后,促进者(即进行探索的团队)应确保他们了解每个便利贴周围的背景,在需要时深入研究并进一步调查感兴趣的领域。
一旦您完成了一些探索活动并了解了用户交付面向客户的产品所需的内容,那么优先考虑哪些内容可以最快地提供最大价值。有大量的在线资源可以帮助您塑造您的探索 - 一个很好的资源是 gov.uk
尽早让用户参与
“这行不通”可能是你最不想听到的关于你的基础设施平台的话,尤其是在你已经做了所有正确的事情并且真正理解了你的用户(开发者)和他们的最终用户需求之后。事实上,让我们来问问你是如何陷入这种境地的。当你将正在创建的基础设施产品分解为史诗和故事并真正开始深入了解细节时,你和你的团队将对产品做出决策。你做出的某些决策可能看起来很小而且无关紧要,所以你不会向你的用户验证每一个小细节,而且你当然不想在每次必须定义一个小实现细节时减慢或停止你的构建进度。顺便说一下,这是可以的!但是,如果你几个月没有收到关于你所做的这些小决策的反馈,而这些决策最终构成了你的基础设施产品,那么你正在构建的内容可能无法为你的用户正常工作的风险将会越来越大。
在传统的产品开发中,你会定义一个最小可行产品 (MVP) 并获得早期反馈。我们一直都在努力解决的一件事——尤其是在基础设施平台方面——是如何知道什么是“可行的”产品。回想一下你构建基础设施平台的原因,可能是当你降低了安全风险或缩短了团队的上市时间时,它就是可行的,但是如果你不向用户(产品团队中的开发者)发布产品,直到它从这个定义中“可行”,那么“这行不通”的回应就变得越来越有可能。因此,在考虑基础设施平台时,我们喜欢将价值最短路径 (SPV) 视为我们希望我们的第一个用户加入的时间。价值最短路径听起来就像它的意思,无论对你的团队、你的用户、你的组织还是混合,你都能获得价值的最早时间。我们喜欢 SPV 方法,因为它可以帮助你不断思考学习的最佳时机并推动更薄的切片。因此,如果你还没有注意到,这里的重点是尽早让用户加入,以便你可以找出什么有效,找出什么无效,并决定你应该将你的下一个开发工作投入到哪里,以改善这个基础设施产品,以便在你的组织中更广泛地使用。
传达你的技术愿景
也许毫不奇怪,这里的关键是确保你尽早阐明你的技术愿景。你希望防止多个团队构建与你相同的东西(这会发生!)。确保你的利益相关者知道你在做什么以及为什么。这不仅会建立对你的解决方案的信心,而且是获得早期产品洞察的另一个机会!
你的愿景不必是一些高保真系列的 UML 杰作(尽管那里有很多常见的建模格式非常有用)。拿一块白板和一个马克笔/可擦记号笔,尽情发挥。当你试图传达想法时,事情会变得混乱,因此能够轻松擦除并重新开始是关键!尽量避免立即跳入 CAD 程序来绘制此类图表,它们最终会让你远离创作过程。
话虽如此,有一些有用的工具足够轻量级,可以在此阶段实施。例如
C4 图
这是西蒙·布朗在千禧年之交提出的。C4 建立在 UML 概念之上,不仅提供了定义系统的词汇,还提供了一种将愿景分解为 4 个不同“级别”的方法,然后可以使用这些级别来描述不同的想法。
- 1 级:上下文
- 上下文图是 4 个图中最“缩小”的。在这里,你粗略地突出显示所描述的系统以及它与相邻系统和用户的关系。使用此图来构建有关与你的平台交互以及你的用户如何加入的对话。
- 2 级:容器
- 容器图将整体上下文分解为一堆可能包含应用程序和数据存储的“容器”。通过深入研究描述你的平台的一些应用程序,你可以与你的团队讨论架构选择。你甚至可以将你的设计带给 SRE 人员,以讨论任何警报或监控注意事项。
- 3 级:组件
- 一旦你了解了构成你的平台的容器,你就可以将事情提升到一个新的水平。选择你的一个容器并进一步分解它。查看容器中模块之间的交互以及它们与你所在领域其他部分的组件之间的关系。此抽象级别可用于描述你的系统的内部运作的职责。
- 4 级:代码
- 代码图是描述系统的可选第 4 种方法。在此级别上,你实际上是在代码级别描述类和模块之间的交互。鉴于创建此类图表的开销,通常使用自动化工具来生成它们很有用。不过,请确保你不仅仅是为了它而制作虚荣图。这些图表对于描述不寻常或遗留的设计决策非常有用。
一旦你能够构建你的技术愿景,就使用它来传达你的进度!将其带到你的冲刺演示中。使用它来指导与你的团队的设计对话。带着它去你的下一次威胁建模练习中进行一次短途旅行。我们在这篇文章中仅粗略介绍了 C4 图表。有很多很棒的文章深入探讨了这一点 - 要进行探索,请从这篇文章开始 InfoQ 上的文章。
不要止步于此!请记住,尽管上述技术将有助于指导现在的对话;软件是一个生命体,在你退休后可能还会存在很长时间。能够将你的技术愿景传达为一系列能够指导你的手的决策是另一个有用的工具。
架构决策记录
我们已经讨论了使用 C4 图表作为绘制你的架构的一种方法。通过在不同的概念级别为你的架构提供一系列“窗口”,C4 图表有助于向不同的受众描述软件并用于不同的目的。因此,虽然 C4 图表可用于绘制你的架构现在或未来;ADR 是一种你可以用来描述你的架构过去的技术。
架构决策记录是一种轻量级机制,用于记录做出构建软件的决策的内容和方式。将这些内容包含在你的平台存储库中类似于为未来的团队/未来的你留下了一系列精心构建的线索,说明系统为什么是现在的样子!
一个示例 ADR
有许多好工具可以帮助您使 ADR 文档保持一致(Nat Pryce 的 adr-tools 非常好)。但一般来说,架构决策记录的格式如下
名称 | 描述 |
---|---|
日期 | 2021-06-09 |
状态 | 待定/已接受/已拒绝 |
上下文 | 一句话,描述需要做出决策的原因。 |
决策 | 决策结果。将决策与更广泛的上下文联系起来非常有用。 |
后果 | 做出决策可能产生的任何后果。这可能与拥有该软件的团队、与平台相关的其他组件甚至更广泛的组织有关。 |
谁在场 | 谁参与了决策?这不是为了指责谁有资格做出决策或对决策负责。此外,这是一种向记录中添加组织透明度的方法,以便帮助未来的对话。 |
您是否曾经遇到过在代码中发现一些奇怪情况的情况?您是否曾经想回到过去,询问做出该决策的人为什么会出现这种情况?您是否曾经在尝试诊断生产中断时遇到困难,但由于某种原因,您没有任何文档或有意义的测试?ADR 是用一系列动态快照补充您的工作代码的好方法,这些快照记录了您的系统和周围生态系统。如果您有兴趣进一步了解 ADR,您可以在 Harmel-Law 的建议流程 的上下文中阅读更多相关内容。
设身处地为用户着想
如果您在组织中拥有任何内部工具或服务,并且您发现使用它们非常容易且轻松,那么您很幸运!根据我们的经验,当您获得想要的东西时,这仍然令人惊讶。因此,想象一下一个世界,您花费时间和精力来构建您的基础设施平台和团队,他们会说“哇,这太容易了!”。无论您出于何种原因构建基础设施平台,这都应该是您的目标!如果您必须强制使用您的基础设施产品,事情并不总是那么顺利,因此您将不得不努力让人们愿意使用您的产品。
在常规产品开发中,我们可能有具备用户研究、服务设计、内容撰写和用户体验专家等能力的人员。在构建平台时,很容易忘记填补这些角色,但如果您希望组织中的人员喜欢使用您的平台产品,那么这一点同样重要。因此,请确保您的团队中有人负责基础设施产品的端到端服务设计,无论他们是开发人员、BA 还是 UX 人员。
入门的一个简单方法是绘制您的用户旅程。我们以入职为例。
即使不了解此旅程的背景,也有一些需要注意的事情,这些事情可能表明用户体验不太友好
- 开发人员用户和您的平台团队之间的交接
- 有一些循环可能会让开发人员用户在入职过程中退缩
- 缺乏自动化 - 平台团队正在做很多事情
- 我们的开发人员用户需要完成 9 个步骤才能完成入职,期间可能会有等待时间和延迟
理想情况下,您希望您的入职流程如下所示
如你所见,平台团队不参与入职,因此它完全是自助服务,我们的开发人员用户只需遵循三个步骤。要为你的用户提供如此出色的体验,你需要考虑可以自动执行什么以及可以简化什么。简单的用户体验和简单的代码库之间会有权衡(如“不要把事情复杂化”中所述)。两者都很重要,因此你需要一位强大的产品负责人,他可以确保这种权衡符合你最初提供平台的原因,即如果你正在构建一个平台,以便你可以更快地将产品推向市场,那么一个无缝且快速的入职流程非常重要。
实际上,你的入职流程可能更像是这样
尤其是在你发布你的 MVP 时(参见上一部分)。将这种思考应用于团队在使用你的产品时可能必须经历的任何其他交互或流程。通过创造出色的用户体验(当然,还要拥有一个基础产品人员想要的产品),你不仅应该拥有快乐的用户,还应该在你的组织内拥有良好的宣传,以便其他团队想要加入。请不要忽视此建议,并让自己陷入组织强制使用你的噩梦般的基础设施平台并且所有开发人员团队都感到悲伤的境地 :(
不要把事情复杂化
所有软件都是有缺陷的。不要对事情过于悲观,但你编写的每一行代码都极有可能很快过时。每个 If 语句、设计模式、每一行配置都有可能中断或引入奇怪的副作用。这些可能表现为难以重现的错误或全面中断。你的平台也不例外!仅仅因为你的产品没有花哨的、响应式的 UI 或高可用性 API 并不意味着它不会出现错误。如果正在构建的内容是一个平台,其他团队正在其上构建自己的服务,会发生什么情况?
当你正在开发一个其他团队依赖的基础设施平台时;你的客户的开发环境就是你的生产环境。如果你的平台出现问题,你最终可能会带着其他人一起倒下。你真的不想冒着将停机时间引入其他团队的开发流程的风险。它会侵蚀信任,甚至最终损害你试图帮助的人际关系!
软件中出现错误的主要(且非常阴险的)原因之一与复杂性有关。支持的功能越多,平台尝试执行的操作越多,可能出错的地方就越多。但是平台团队中出现复杂性的主要原因是什么?
康威定律,对于那些可能还没有非常亲密地了解的人来说,指出组织倾向于设计反映其自身内部沟通结构的系统。从软件角度来看,这意味着系统通常可能会设计为具有某些“警告”或“解决方法”,这些警告或解决方法适用于组织历史中的某个时间点。虽然这不一定是一件坏事,但它很容易影响我们在现场做出的设计决策。如果你正在构建一个 API,那么团队内部可以轻松处理这些类型的设计决策。但是,如果你正在为许多不同的团队(及其众多不同的细微差别)构建一个具有许多不同集成的系统,这将成为一个更大的问题。
那么,在编写大量与业务流程紧密耦合的细粒度组件与构建一个能够支持组织发展的平台之间,最佳点在哪里?
一般来说,作为团队编写每个组件都是需要衡量、维护和支持的另一件事。当然,你可能会受到现有架构债务、合规性约束或安全保障的限制。我们在这里的收获是,在为解决方案引入另一个组件之前三思而后行。开发的每个活动部分都是对后期支持的投资,也是另一种潜在的故障模式。
衡量重要内容
一篇关于构建更好的基础设施平台的文章,如果没有关于衡量事物的说明,将是不完整的。我们之前提到过确保使用可衡量目标定义策略。那么成功是什么样的?这是你可以用代码提取的东西吗?也许你想通过减少运营摩擦来增加用户的部署频率?也许你的真正目标是提供一个稳定且安全的工件存储库,团队可以依赖它?花点时间看看你是否可以将这个成功指标转化为一个轻量级仪表板。能够庆祝你的胜利对团队士气和帮助在整个组织内建立对平台的信心都有极大的好处!
四大关键指标
我们真的不能不提指标就谈论度量。在 2018 年的书Accelerate中(一本关于开发团队绩效的精彩读物),这四个关键指标是高绩效团队的一个足够简单的指标。它由以下内容表示
- 交付提前期
- 与其说是“请和谢谢”之间的时间(从最初构思到分析、开发和交付),这里我们讨论的是从代码提交到代码在生产中成功运行所需的时间。开发持续时间越短(或者更重要的是越可预测),团队的绩效就越高。
- 部署频率
- 团队部署其软件的次数为何重要?通常来说,部署频率高也与部署规模小有关。随着较小的变更集部署到你的生产环境中,你的部署就越安全,并且在需要回滚时更容易测试和补救。如果你将高部署频率与短交付提前期结合起来,你将更有能力快速安全地为你的客户提供价值。
- 变更失败率
-
这让我们了解到“变更失败率”。当你拉动触发器进入生产时,你的部署失败的次数越少,团队的绩效就越高。但什么是部署失败?一个常见的误解是将变更失败率等同于红色管道。虽然这对于 CI/CD 的总体运行状况来说是一个有用的指标;但变更失败率实际上描述了生产因部署而受损的情况,并且需要回滚或向前修复来补救。
如果你能够关注这一点作为一项指标,并在团队回顾和规划期间对其进行思考,你也许能够发现可以关注的技术债务领域。
- 平均恢复时间
- 4 个关键指标中的最后一个指标说明了在部署失败时软件的恢复时间。鉴于失败的部署可能会导致用户中断,了解当前的风险状况可以让你了解可能需要投入更多精力的地方。对于传统的“产品”开发来说,这很好,但对于你的平台呢?事实证明,如果你正在为人们构建一个通用平台,那么 4 个关键指标就更加重要。你的停机时间现在是其他软件团队的停机时间。你现在是组织交付软件能力中的一个关键依赖项!
重要的是要认识到 4 个关键指标是极其有用的滞后指标 - 它们可以为你衡量实现目标的程度。但是,如果你没有设法让任何人采用你的平台呢?可以说,只有在拥有了一些用户后,4 个关键指标才变得有用。在你到达这里之前,关注了解和促进采用是关键!
还有更多的方法来衡量你的软件交付,但多少才算太多?有时,过于专注于衡量所有内容,你可能会错过一些显而易见且可以修复的问题。认识到并非平台设计的各个方面都能屈服于衡量。同样,也要小心所谓的“虚荣指标”。如果你选择衡量某件事,请务必确保它与实际情况相关并且可操作。如果你选择的指标无法为你的团队或用户发挥作用,那么你只是给自己增加了更多的工作。选择重要的事情,其余的都扔掉!
为其他工程团队开发一个基础设施平台可能看起来与创建更传统的软件完全不同。但通过采用本文中概述的 7 个原则中的一些或全部,我们认为你将更好地了解组织的真实需求、衡量成功的途径以及最终传达你的意图的方法。
重大修订
2022 年 2 月 9 日:发布文章的其余部分
2022 年 2 月 8 日:发布“传达你的技术愿景”和“设身处地为用户着想”
2022 年 2 月 2 日:发布“了解客户的需求”和“尽早让用户参与”
2022 年 2 月 1 日:发布“制定一个具有可衡量目标的策略”