写点什么

专访 Eric Evans:领域驱动设计最新进展

  • 2007-05-02
  • 本文字数:2898 字

    阅读完需:约 10 分钟

InfoQ.com 采访了领域驱动设计的创始人 Eric Evans,以了解这一设计技术的最新进展。

为什么领域驱动设计一直都很重要?

基本上,领域驱动设计是我们应该专注于用户所关心领域里的重要问题的指导原则。我们的智慧应该用在理解这一领域上,和那个领域的其他专家一起将它抽象成一个概念。这样,我们就可以应用这个抽象出来的概念构造强大而灵活的软件。

它是一个永远不会过时的指导原则。不论我们何时操作一个复杂的领域,它都有用。大趋势是软件会应用于越来越复杂的问题,越来越趋近于业务的核心。对我来说,这一趋势好像中断了很多年,因为 Web 突然出现在我们面前。人们的注意力被从富于逻辑和艰深的解决方案上移开,因为有太多的数据需要传递到 Web 上,只需要简单的动作即可。因为太多的数据要传递,但短时间内在 Web 上做这一简单的事情又是比较困难的,所以消耗了软件开发的所有能力。

但是现在人们大步跨越了这一 Web 应用的基本层次,又把注意力集中在业务逻辑上了。

最近,Web 开发平台逐渐成熟,足以应用领域驱动设计来做 Web 开发,有很多积极的信号,比如,SOA,如果应用的好,就可以提供给我们一个非常有用的解析领域的方法。

同时,敏捷过程也有了足够的影响力,大多数项目现在多少都意识到了迭代、和业务伙伴亲密协作、应用持续集成和在强沟通环境下工作的重要性。

所以领域驱动设计在未来会越来越重要,目前已经有了些基础。

技术平台,像 Java、.NET、Ruby 或者其他的,一直在变化。领域驱动设计如何适应这一情况?

实际上,新的技术和流程应该由它们是否支持团队专注于他们的领域来验证,而不是置领域于不理。领域驱动设计不依附于哪一个特定的平台,但是有些平台为创造业务逻辑提供了更多的好方法,有些平台更加专注。最近几年的发展显示,为创造业务逻辑提供方法的平台是一个有希望的方向,尤其在可怕的 20 世纪 90 年代后期。

Java 是这几年默认的选择,从表达角度看,它是一种典型的面向对象语言。对于 Distracting Clutter 来讲,基础语言是个不错的选择。它有垃圾收集功能,实践证明这一功能很有用(这一点是相比于需要非常关注底层细节的 C++ 而言的)。Java 语法有些地方比较乱,但是 POJO(Plain Old Java Objects)仍然可以设计的让人理解。Java 5 语法的一些创新之处提高了代码的可读性。

但是在 J2EE 框架初次出来时,完全将那些基本的表达淹没在大量的框架代码之中。根据早期的契约(比如 EJB Home,为所有变量写的 Get/Set 前缀存取等)生产出可怕而糟糕的对象。这一工具是如此笨重,使得开发团队不得不全力以赴才能让它工作。而且改变对象非常困难,一旦产生的大量代码和 XML 出现问题,人们往往束手无策。这样的平台很难开发出高效的领域模型。

另外就是使用初级的第一代工具勉强开发藉由 Http 和 Html(不是为此目的而设计的)来完成的 Web UI。在那个时候,创建和维护一个像样的 UI 是如此困难,以至很少有人去关注有着复杂内部功能的设计。有意思的是,恰在这时,对象技术出现了,很好地解决了复杂建模和设计的问题。

这一情况在.NET 平台上也是如此,有些事情处理的比较好一些,有些还更糟糕。

那是一个让人沮丧的时代,但是在过去的四年里,总算有了些转变。首先来看 Java,关于怎样有选择地使用框架社区里有了新的看法,很多新的优秀的框架(多数是开源的)也应运而生。比如 Hibernate 和 Spring 这些框架可以用一种更轻量级的方法处理 J2EE 曾试图做到的特定工作。像 AJAX 这样试图解决 UI 问题的方法也更加便捷。现在的项目在选择使用可以提供价值和混合的新 J2EE 项时也更加聪明。术语 POJO 就是在这时产生的。

结果是项目的技术贡献逐渐明显地减少,在把业务逻辑和系统的其他部分隔离方面也有了明显的进步,这样逻辑就可以基于 POJO 来写了。这不会自动产生领域驱动设计,但是它提供了一个可行的机会。

这就是 Java 世界。然后就是像 Ruby 这样的新来者。Ruby 有表达力很强的语法,在这一基础层面上它会是领域驱动设计的一个很好的语言(尽管我没有听说在那些应用程序中有哪些实际案例)。Rails 带给人们很多兴奋的地方,因为它最终好像能够使得开发 Web UI 像上世纪 90 年代初期在 Web 出现之前开发 UI 时一样简单。很快,这种能力就被大量使用在构建众多没有太多领域背景的 Web 应用上,因为就是开发这些简单的应用在过去来说也是很困难的。但是我的希望是,当问题里的 UI 实现部分减少时,人们可以把这看成专注领域的机遇。如果 Ruby 使用是从这个方向起步的,那么我认为它会为领域驱动设计提供一个很棒的平台。(一些基础设施可能要被添加进来)

更多前沿的话题发生在域描述语言(DSL)领域,我一直深信 DSL 会是领域驱动设计发展的下一大步。现在,我们还没有一个工具可以真正给我们想要的东西。但是人们在这一领域比过去做了更多的实验,这使我对未来充满了希望。

现在,我所能说的是大多数尝试使用领域驱动设计的人们是基于 Java 或者.NET 平台,也有少部分在 Smalltalk 上。在有直接效果的 Java 世界里,这是一个积极的信号。

从你写完这本书,在领域驱动社区里发生了那些值得注意的事情?

一个让我很兴奋的事情是,人们采用我在书中提到的原则然后用一些我所没有预料到的方法实践。比如,在挪威国家石油公司的 StatOil 项目中对战略设计的使用。那儿的一个架构师根据他的经验写了一篇报道

在其他项目里,还有人做了上下文映射,并应用到在抉择是自己构建还是购买时到对已有软件的评估当中。值得一提的是,我们中的有些人已经通过开发一些许多项目中要用到的基础领域对象,探索这方面的话题了。

我们一直在探索在仍然用 Java 实现对象时,究竟能把这种域描述语言推动多远。

已经走了很远。在人们告诉我他们在做什么事情的时候,我一直都很感激。

请您给要学习领域驱动设计的人一些建议?

读我的书!;-) 另外,在项目中舍得投入时间和资金。我们最初的目标之一就是提供一个好的案例,让人们可以通过它进行学习。

要谨记一点的是领域驱动设计主要是由团队来操作,所以你也许要成为一个布道者。现实一点讲,可能需要你找到一个大家正在努力完成的项目。

另外还要注意下面几个领域建模时的重要之处(Pitfall):

  • 注重实践。模型需要代码。
  • 专注于具体场景。抽象思维需要落地于具体案例。
  • 不要试图对任何事情都进行领域驱动设计。画一张范围表,然后决定哪些应该进行领域驱动设计,哪些不用。不要担心边界之外的事情。
  • 不停地实验,期望能产生错误。模型是一个创造性的流程。

查看英文原文: Eric Evans on why DDD Matters Today - - - - - -

作者简介:Eric Evans 是《领域驱动设计——软件核心复杂性应对之道》(Addison-Wesley 2004,已由清华大学出版社翻译出版)一书的作者。早 20 世纪 90 年代,他就参与了很多项目,用具有多种不同的方法多种不同的输出的对象开发大型的业务系统。这本书是那些经验的总结。它提供了一个建模和设计技术的系统,成功的团队应用这一系统可以组装有业务需求的复杂软件系统,并使系统在增大时仍然保持敏捷。Eric 现在是“Domain Language”的负责人。Domain Language 是一个咨询小组,它指导和训练团队实施领域驱动设计,帮助他们使自己的开发工作对业务而言更有生产力和更有价值。

2007-05-02 20:345165

评论

发布
暂无评论
发现更多内容

架构实战营 模块六:课后作业

👈

架构实战营

【小技巧】Google浏览器设置之Tab折叠分组

恒生LIGHT云社区

推荐 浏览器书签 谷歌 工具分享

双指针法

后台服务器开发

c++ 双指针 LeetCode

工作年限、成长路线、进阶技术。怎样才能成为架构师?

Linux服务器开发

Linux服务器开发 Linux后台开发 软件架构师 服务器架构师 C++架构师

剪视频一点都不难,多款超实用剪辑软件全方位评测!

懒得勤快

短视频 视频剪辑 视频制作

低代码助力企业生产管理8大招式,你学废(hui)了吗?

优秀

低代码

开发5年!三面字节,成功拿到27k*17offer,原来也没那么难

Java 程序员 架构 面试

一份283页pdf,五大核心内容,熬夜“啃完”,竟拿下了阿里offer

Java 程序员 架构 面试

墨奇,以“一手之力” 证明你就是你

E科讯

管理者如何避免主观偏见

石云升

职场经验 管理经验 6月日更

Rust从0到1-泛型-生命周期

rust 泛型 生命周期 generic lifetimes

新版发布|ShardingSphere 5.0.0-beta 来了!

SphereEx

ShardingSphere

2021年,想要成为年薪百万的Java架构师需要掌握哪些技术?

Java架构师迁哥

网络为本,博睿数据NPMD用20%的投入实现80%的功能

博睿数据

博睿数据 数据链DNA NPMD

通用时区:你应该知道的数据库时区知识

华为云开发者联盟

数据库 时区 GaussDB(DWS) 通用时区 夏令时

微警务系统搭建,智慧派出所平台建设解决方案

字节跳动亿级视频处理系统高可用架构实践

火山引擎开发者社区

架构 后端 音视频

体验为先,博睿数据打造以用户会话为中心的监测体系

博睿数据

博睿数据 数据链DNA DEM

高寿命NVMe SSD应用场景探讨

怀瑾握瑜

区块链 数据库 云计算 SSD 虚拟货币

Flink 和 Iceberg 如何解决数据入湖面临的挑战

Apache Flink

flink

唯品会:在 Flink 容器化与平台化上的建设实践

Apache Flink

flink

Flink Job 概览

Alex🐒

flink 翻译 flink1.13

【签约计划】百位签约创作者名单公布

InfoQ写作社区官方

签约计划

【Linux】使用 systemd 管理 frp 服务

赖猫

Linux 后端

网络态势感知是什么?

郑州埃文科技

为什么大家都在用WebRTC?

anyRTC开发者

音视频 WebRTC 语音通话 视频通讯

ROS CDK | 云上资源自动化部署新模式

郭旭东

阿里云 ROS 基础设施即代码 IaC

前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述

编程三昧

JavaScript 大前端

自从有了这个工具,一键代码迁移不在话下

华为云开发者联盟

代码迁移 鲲鹏DevKit 汇编翻译 汇编语言 Kunpeng

1小时学会不打代码制作一个网页精美简历(1)

1_bit

大前端 低代码 iVX 低代码开发平台

多云部署又添新「云」,EMQ X Cloud 正式支持腾讯云部署

EMQ映云科技

阿里云 IoT 华为云 云平台 #腾讯云

专访Eric Evans:领域驱动设计最新进展_Java_霍太稳@极客邦科技_InfoQ精选文章