Steel Threads 是一种功能强大但晦涩难懂的软件设计方法。了解 Steel Threads 将使您成为更好的工程师。您可以使用它们来避免诸如集成痛苦之类的常见问题。您可以使用它们来降低系统设计的复杂性。
钢丝线有多不为人知?这个概念于 2013 年从维基百科中删除,因为“这个想法在软件工程中并不引人注目,并且没有从显着来源获得大量报道。”让我们增加覆盖范围,并讨论为什么它是如此有用的方法。
钢线是贯穿软件系统的非常薄的功能片段。它们被称为“线程”,因为它们贯穿软件系统的各个部分并实现一个重要的用例。
它们被称为“钢”,因为线程成为以后改进的坚实基础。
使用 Steel Thread 方法,您可以构建跨越系统边界并涵盖重要用例的最薄的版本。
假设您正在构建一项新服务来替换您的整体代码库的一部分。最常见的方法是
查看旧代码,并找出新系统的需求。
设计和构建可提供您所需功能的 API。
进入旧代码,并更新参考以使用新 API。在功能标志后面进行。
使用功能标志进行切换。
修复出现的任何问题,直到它正常工作,必要时关闭功能标志以返回到旧代码路径。
当它稳定时,删除旧的代码路径。
听起来很合理,对吧?嗯,这是软件工程师最常见的操作方式,但这种方式有很多地雷。
在这个项目中我会遇到什么问题?
以一种与旧系统断开连接的方式构建新服务可能会很有吸引力。毕竟,设计可能感觉更纯粹。但是您也引入了明显更多的结构变化,并且您在没有与旧系统进行任何集成的情况下进行这些更改。这显着增加了集成痛苦。我的期望是该项目的所有估算都是不切实际的。而且我希望该项目在完成后被视为失败,即使由此产生的服务具有总体上良好的设计。
我希望切换到新系统会有问题。切换时会发现一系列问题,需要切换回旧代码路径或在项目的最后阶段加紧工作以解决问题。
通过不进行大规模切换,这两件事都是可以避免的。请注意,即使将 1% 的流量减少到带有功能标志的新服务也是一种切换方法。为什么?您正在同时切断所有更改的百分之一的流量。
我仍然不希望它进展顺利。您正在采取太大的步骤。
将这种方法与 Steel Thread 的方法进行对比。
考虑一下您正在构建的新系统。想出一些代表系统 Steel Threads 的狭窄用例——它们涵盖了系统中有用的功能,但不处理所有用例,或者在某些方面受到限制。
选择一个尽可能窄且能提供一些价值的起始用例。例如,您可能会选择一个您认为会成为新服务一部分的 API。
在新服务中构建新 API。
让它只适用于那个狭窄的用例。对于任何其他用例,请使用旧代码路径。将其投入生产并充分利用。 (提示:您甚至可以同时执行新旧代码路径,然后进行比较!)
然后逐渐添加额外的用例,直到将所有需要的功能移至新服务。每个用例都在生产中。
完成后,您将删除旧代码和功能标志。这根本没有风险,因为您已经在新系统上运行了。
这不也是“扼杀者”模式吗?是的,但这也可以用于新项目。继续阅读绿地示例。
集成痛苦是项目中最后一刻出现问题的更大原因之一。当您切换到一个新系统时,您总会发现意想不到的问题。您应该对涉及切换的任何事情持怀疑态度。循序渐进地做事。
Steel Threads 从一开始就集成,因此您永远不会遇到很多集成难题。取而代之的是,您在整个过程中都会遇到很小的集成痛苦。
此外,您的服务在上线之前永远不需要进行测试,因为您已经在整个过程中以增量方式对其进行了测试。您知道它可以处理生产负载。您已经添加了网络延迟,因此您知道它的含义。
所有的惊喜都被向前推进,并逐步处理,作为您逐步推出服务的方式的一部分。
重要的是你有一个工作的、集成的系统,当你在它上面工作时,你就让它继续工作。随着时间的推移,你会充实它。
当你设计一个系统时,你有很多复杂性。为新系统建立一套要求可能是一项具有挑战性的工作。
使用 Steel Thread 方法时,您可以选择一些核心需求,并以贯穿系统各层的方式对它们进行表述,并练习您的设计。它为整个系统提供了一种骨架结构。
然后,该 Steel Thread 的实施成为可以构建进一步需求的骨架。
因此,Steel Threads 是系统需求的一个子集。
假设您正在实施 Slack 的克隆。你最初的 Steel Thread 可能是这样的:
“任何未经身份验证的人都可以在硬编码帐户的硬编码#general 房间中发布消息。消息通过页面刷新持续存在。”
请注意这个最初的 Steel Thread 有多么有限。它不处理身份验证、用户或帐户。它确实处理写入消息并持久化它们。
您的第二根钢丝线可以使系统变得更有用。例如,您可以有一个 Steel Thread,允许消息发布者选择他们发布的名称。
这第二个钢丝线实际上并没有做太多。您仍然没有身份验证、帐户,甚至没有用户的概念。但是您已经创建了一个足够运行的聊天室,您可以开始使用它了。
另外,请注意您还没有将钢线拉过系统的每个部分。但是您已经剔除了用户和帐户的概念。
请注意,在这个 Slack 克隆示例中,您可以获得有关您正在构建的系统的早期反馈,即使您还没有构建那么多。这是使用 Steel Threads 的另一个重要原因。
在这两个 Steel Threads 之后,您的团队就可以开始全职使用聊天室了。想一想您的团队将从使用您的系统中学到多少东西。这是一个工作系统。
将其与构建用户和帐户系统、连接所有内容并最终构建聊天室的知识进行比较。
在设计项目时,Steel Threads 通常是一个很好的起点。他们为接下来的工作创建了一个骨架。他们确定了系统的核心部分,以便有自然的地方可以充实。
我鼓励您尝试使用 Steel Threaded 方法。我想你会发现它可以改变你的项目。让我知道你的经历吧!
您可能听说过“垂直切片”一词。我在关于Milestones 的帖子中描述了这个概念。
Steel Threads 是一种软件设计技术,可以在垂直切片中交付您的软件。该术语往往用于描述系统的初始垂直切片。
它们是密切相关的概念,但并不完全相同。
我还听说过 Steel Threads 被称为“曳光弹”。
该图片由Steen Jepsen在Pixabay上发布
这个故事最初出现在:https: //www.rubick.com/steel-threads/