GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

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

2019 年 4 月 21 日

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

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


作为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


2019 年 4 月 21 日 08:004559
用户头像

发布了 36 篇内容, 共 16.3 次阅读, 收获喜欢 54 次。

关注

评论 1 条评论

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

第七周作业

晨光

架构师训练营第 7 周学习总结

Season

系统性能优化总结

李广富

第七周总结

Acker飏

JVM系列之:Contend注解和false-sharing

程序那些事

Java JVM 性能调优 GC

k8s 上运行我们的 springboot 服务之——flume 读取kafka数据批量同步到clickhouse

柠檬

kafka Clickhouse

Week 07 命题作业

Jeremy

爱币(LOVE COIN)全球同步耀世上线,掀起币圈追捧热潮

Geek_116789

ChaosBlade:从零开始的混沌工程(四)

郭旭东

云原生 混沌工程 ChaosBlade

第七周作业

刘卓

性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

李广富

一文入门DNS?从访问GitHub开始

Kerwin

后端 DNS DNS服务器

第七周总结

晨光

web 性能压测工具

莫莫大人

第七周·命题作业·写 web 性能压测工具

刘璐

架构师 0 期第七周总结

何伟敏

SQL查找还在用count吗?

Bruce Duan

SQL查询是否存在

Java 基础

Bruce Duan

java基础

第七周学习总结

刘卓

架构师训练营week07 作业

GunShotPanda

第七周·周总结

刘璐

压测工具

Acker飏

charles断点使用方法

rainbow

架构师 0 期第七周命题作业

何伟敏

架构师第七周 作业

冯凯

Week 07 学习总结

Jeremy

架构师训练营week07 学习总结

GunShotPanda

架构师训练营 -Week07

Just顾

架构师 第七周总结

冯凯

脑洞:基于DDD进行组织架构治理

Winfield

组织转型 领域驱动设计 DDD

新站上线通知

Damon

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