Vernon 谈软件设计,到底是自顶向下还是自底向上

阅读数:3945 2019 年 4 月 21 日 08:00

Vernon谈软件设计,到底是自顶向下还是自底向上

软件设计应该采用自顶向下还是自底向上的方法? Vaughn Vernon MicroXchg 柏林座谈会上提出了这个问题,他在演讲中同时讨论了参与者模型以及反应式领域驱动设计等不同的软件设计方法,并提到了浮现式架构的重要性。

作为 vlingo 的创始人以及《领域驱动设计语言》一书的作者,Vernon 认为 DDD (Domain Drive Design- 领域驱动设计)语言中最重要的两个概念是是边界上下文和通用语言。当然 DDD 中还有其他战略和战术建模工具,以及其他的一些工具,但是当谈及 DDD 时,Vernon 一般默指这两个概念。根据他的观点,如果你认为 DDD 只是关于实体、价值对象、聚合等诸如此类的东西,那么你已经混淆了 DDD 的本质。

DDD 也是关于学习的。如果你在开始一个软件项目时还没有找到所需要的学习方法,那其实你只是把 DDD 当作一组战术方法来创建对象和函数,最终你可能会陷入混乱。根据 Vernon 的经验,在开始新项目时,即使是非常有经验的架构师或开发人员也往往会认为他们已经知道了一切,并试图自己解决所有问题。

学习产生知识,知识改变一切。

在决定一个系统应该采用自顶向下还是自底向上的设计时,人们常常会发生激烈的争执,有时一方甚至声称另一方的做法是危险的,并最终会导致系统的混乱。但 Vernon 认为,真正的风险不是在于采用了那种方法,而是在于人们总是试图预先知道所有事情,就像瀑布式思维这类的设计。

对于 Vernon 来说,自顶向下和自底向上都只是学习和知识排序的策略,两者只是不同的思维方式,它们都非常有用。自顶向下的思考主要是基于我们已经知道的东西。自顶向下就像逐步分拆问题,而每个问题就像一个内容未知的黑盒子。但分拆到一定程度,我们会陷入困境,这时候就必须转换到自底向上的视角,尝试发现我们不知道的东西。现在我们只是在开发软件的一小部分(它们可以成为参与者),最终它会成为一个更大的系统中的子系统,Vernon 认为这是一种浮现式设计。

Vernon 将自顶向下视作战略设计的一种。我们首先要查看子系统之间所交换的信息,接下来确定边界上下文的发布语言,然后构建边界上下文中团队工作所提及的心智模型,而这种模型会被表示成上下文中的通用语言。以下为工作的先后顺序:

  1. 信息交换
  2. 发布语言
  3. 心智模型
  4. 通用语言

相反,自底向上是从模型的角度思考问题,这是一种战术性的设计方法。一个团队必须首先讨论他们不知道的东西,从而创建一个心智模型和一种通用语言。通用语言将会影响发布语言。最后,我们可以使用发布语言在子系统之间交换信息。这就给出了一个几乎相反的工作顺序:

  1. 心智模型
  2. 通用语言
  3. 发布语言
  4. 信息交换

Vernon 强调两种观点都很重要,但是如果考虑到边界上下文和通用语言,我们更可能会选择自底向上的方法。了解整个解决方案的核心领域是非常重要的,否则我们很可能会把工作重心搞错。如果我们在某个时候需要自顶向下的视角,那么可以将接口定义为一个占位符,用于表示我们还不知道如何通信的内容。稍后,我们可以利用边界上下文的具体实现来替换这个占位符。这时候,我们仍然需要自底向上的视角,因为我们需要更深入地理解该上下文中的域模型。

对 Vernon 来说,自底向上同时也是一种浮现式设计,该方法最终会形成浮现式架构,正如精益架构和敏捷架构一样。保持一成不变的架构是行不通的;你要么调整你的架构,要么失败。如果你知道在做什么,架构自然就会浮现出来。他还指出几种可以帮助我们走向成功的架构风格和模式。一种适合浮现式方法的架构风格就是形架构,该架构由 Alistair Cock 创建,它也被称为端口和适配器以及简洁架构。这种风格的核心是应用程序层包围领域模型。最外层是基础设施层,它通过端口和适配器来提供输入和输出。Vernon 指出,这种体系结构的一个主要优点是,可以在隔离状态下创建和测试适配器。你只是在真正需要适配器的时候才去了解它,这是一种非常典型的敏捷和浮现式架构。一个具体的实例就是决定数据存储的类型,在信息不足的时候我们可以延迟这种操作,只有真正实用时再去决定真正的类型。

Vernon 最后提到了 vlingo ,这是一个基于角色模型的反应式平台,该平台开源并且对 DDD 开发友好。vlingo 很好地满足了他在演讲中所表达的观点。

英文原文地址: Reflecting on Top-Down or Bottom-Up System Design: Vaughn Vernon at MicroXchg Berlin

收藏

评论

微博

用户头像
发表评论

注册/登录 InfoQ 发表评论

最新评论

用户头像
john 2019 年 04 月 26 日 12:13 0 回复
专有名词翻译太别扭,建议直接用原文,不要翻译。 actor model = 参与者模型? evolutionary architecture = 浮现式架构 ?
没有更多了