域模型之一, 域模型的价值

一些大的企业往往把域模型当作很重要的标准化和架构规划工具。 我在国外工作的十几年中,我曾经针对不同的场景参与开发了大规模域模型并且领导了基于域模型的研发,对域模型对团队甚至是整个行业的指导作用有一定的思考。 来到AliExpress后, 发现团队对域模型的理解不是很一致, 而应用就更少了。 所以在这里整理一份系统性的介绍, 帮助大家统一对域模型的认识,介绍一些基本的域模型整理思路。 通过这些介绍,期望整个技术团队能逐步把域模型应用到日常的架构规划和设计之中。 当然全面的介绍域模型可能需要写整整一本书。 但是这里假设读者是有数据建模背景的程序员,从而把介绍压缩成几篇文章。 第一篇主要介绍域模型的地位和作用。第二篇主要介绍域模型的主要概念,定义和表达。第三篇主要介绍域模型的设计和演化方法。第四篇主要介绍域模型的应用实例。第五篇介绍域模型设计中常见的误区。第六篇主要是我个人在域模型设计中的领会的一些要点和经验总结。 通过这六篇文章,期望大家能够意识到域模型对架构设计的重要性,并且能够真正掌握域模型设计的要点。 另外也期望通过这一系列文章, 能够引起大家对域模型的兴趣,一起深入研究。  

什么是域模型?

域模型(domain model)英文又称为问题域模型(problem space model)。维基百科(Wikipedia)对它的定义是” A conceptual model of all the topics related to a specific problem” 【6】. 可以翻译成: “域模型是针对某个特定问题的所有相关方面的抽象模型”。 这个定义有几个要点:第一是“特定问题”, 也即是说域模型是针对性某个问题域而言的, 脱离的这个特定问题,域模型的构建其实不存在一个最优或者是最合理的构建。  第二是抽象, 域模型是一个抽象模型, 不是对某个问题的各个相关方面的一个映射, 也不是解决方案的构建。 这一点我后续会展开来讲。  

关于域模型, 经常会看到大家把逻辑数据模型(logical data model) 或者是物理数据模型(physical data model)和域模型混为一谈【5】。 甚至有同学把数据里的表结构抽取出来作为域模型来研究。 其实这是域模型的最大误区。 数据模型实质上都归属于结果域模型(solution space model), 是对某个问题域的解决方案的一个描述, 实质上是对解决方案的一个具体描述。

另外一个常见的误区和领域驱动设计(DDD, Domain Driven Design)【2,3,4】有关。 我个人对DDD比较推崇, 但是DDD里提到的域模型实质上是结果域模型(Solution Space Model), 不是问题域模型。 我在这个系列的文章里集中介绍的是问题域模型的构建, 而不是结果域模型的构建。这两者的区别在于前者的建立主要是为了统一我们对未知世界的了解, 也就是说我们需要统一思想, 搞清楚我们要解决什么问题和问题的本质。 而后者的主要是想解决针对近些年来敏捷开发模式中所普遍存在的对领域认知不完整而导致设计不合理的问题。 前者是一个对未知方向的探索过程,适用在一个相对较为模糊的命题,产出是对语言,边界和思路的统一。后者是一个方法论,适用于具体一个项目, 产出是一个项目的数据模型。

总结一下:(问题)域模型是为了准确定义需要解决问题而构造的抽象模型。  特别值得强调的是域模型的功能是统一认知:对要解决的问题有一个完整,规范,并且是一致的认识。  

为什么我们要学习域模型呢?

在阿里巴巴经常会听到一句话, “一颗心, 一张图,一场仗”。 我们做技术的同学要统一对这场仗的认知, 换句话说我们首先要明白要解决什么问题(仗), 然后才能把这个问题毫无歧义的表述成一张图。 有了图,我们才能能够全心全意的投入到解决这个问题中去。   

 

我们经常会发现, 在反复的争论之后, 我们往往对问题的定义还没有统一的认识。 所以这里我期望通过向大家介绍我们如何系统的,逻辑的,科学的定义我们的问题, 从而达到对我们要解决问题的统一认知。 这个过程就是问题域模型的建立。

域模型的价值之一,统一思想

下面一张图其实是对域模型统一思想的功能的最好解释。这张图的名字叫“How Projects Really Work?", (具体作者不明,在http://projectcartoon.com/about/有备份):

这张图中的各个角色,如客户, 项目经理,设计师, 程序员, 销售, 文书, 服务等, 都没有能够对要解决的问题有一个统一的认识,下游输出的结果和上游需要解决的问题脱节。 

而域模型的核心价值在于统一项目中各个相关方对问题的认识, 从而避免此类问题发生。

这里我们需要强调域模型服务的对象是一个部门所有的成员。 也就是说整个部门需要对我们要解决的问题有统一认知, 而不只是技术团队内部或者是技术和产品团队的统一。 

域模型的价值之二,团队分工和合作

域模型的另外一个很重要的功能就是对一个技术团队的分工和合作方面的指导意义。 一个域模型,需要准确的定义需要解决的问题的方方面面, 这些问题的方方面面,就形成了我们对团队分工的理解。 域模型中的实体, 比如说商品, 店铺往往会演变成一些核心的数据, 而针对这些数据的管理系统会最终并存(co-locate)在同一个或是一组物理机房, 而围绕这些系统的设计,研发, 运维,运营,终端用户,和对终端用户的服务等等又会统一到同一批人中去, 也就是说这一批人有了共同的问题子域, 属于整个部门的问题域的一部分。不同于我们日常的从组织结构出发定义并解决问题的方法,我们对问题域的准确定义往往能够帮助我们找到组织结构中的弱点, 从而帮助我们建立最合适的组织结构或者是最合适的交流渠道。   

 

域模型的价值之三,反映变化

在电商领域里,随着消费人群需求,市场环境,和竞争对手的变化,我们所要解决的问题也在不断的变化。  举一个具体的例子, 我们一般都会定义生态系统的参与者。 最常见到的域模型定义里会有买家,卖家和小二。 随着时间进化, 因为运营流量, 我们需要引入联盟站长概念, 因为要引入第三方研发, 我们引入ISV概念, 因为要外包服务,我们需要引入定位和权限更细分的小二的角色, 等等。

而除了网站增长带来的变化, 电商业务的演变也会带来大的冲击。 比如说AliExpress,从B2B诞生,从C2C成长, 现在又逐渐转型做B2C。 这中间卖家业务从简单的提供信息,到支持交易, 到提供物流等服务,演变到和卖家紧密结合的supply chain integration. 这中间卖家的模型也在不断的演变。 而域模型就是真实反映这个变化的最好工具。

 

域模型在大型软件设计项目中的引入

那么我们什么时候需要引入域模型呢? 下图是一个非常好的解释。 这个图描述了软件错误的代价随着时间的变化趋势【1】。  这是个三维图。 第一维横轴是时间轴, 描述错误解决的时间。 第二维纵轴也是时间轴, 描述错误产生的时间。 第三维竖轴是解决错误所耗费的成本。 这张图里描述了四种情形, 第一种是代码错误, 发生在构建时间(construction); 第二种是设计错误, 发生在设计期间(design), 第三种是需求错误, 发生在具体需求产生的期间(requirement), 第四种是概念错误, 发生在“concept of operations ”(一个对整个系统的概念性描述)形成的时间(ConOps)。  随着时间增长,解决错误的成本不断增长。 而这里面最大的成本就是概念的错误。

(Image Credit: http://www.stevemcconnell.com/articles/art04.htm)

举个具体的例子, AliExpress在几年前最初形成卖家和店铺的概念的时候, 没有把卖家(Seller,aka Merchant)和店铺(Store)这两个概念分割开来。 而是简单的认为卖家就是店铺。 导致几乎所有的地方需要引用到店铺的情形都使用了SellerID。数据库,数据仓库,Service API 里到处都是SellerID, 而本该使用的是店铺ID, 这样的设计在一人一店的C2C时代还看不出大问题。 但是到了引入大的企业卖家,就出现很大的问题了。 因为一个企业卖家会同时开多个店铺。 店铺和企业是出现在完全不同的流程,服务,和数据分析中。 这个问题到最终解决可能造成的研发人日损失以千人日计。

所以我们一定要在一个项目最终形成概念的时候讨论域模型。 搞清楚我们需要解决的问题如何能够毫无歧义的表达出来。 这就是域模型的价值所在。   

 

这篇文章是一系列文章中的第一篇, 域模型系列文章:

域模型之二, 主要概念

域模型之三, 设计方法简介

References

  1. Steve McConnell (2004): Code Complete, 2nd Edition, Microsoft Press, Redmond, Washington. ISBN 0735619670
  2. Eric Evans (2003),Domain Driven Design, Tackling Complexity in the Heart of Software. Addison Wesley, ISBN 0321125215
  3. Stefan Baerisch (2010), Domain-Specific Model-Driven Testing, Vieweg+Teubner Research, ISBN9783834809315
  4. Vanghn Vernon (2013), Implementing Domain Driven Design, Addison Westley, ISBN0321834577
  5. Fowler, Martin: Analysis Patterns, Reusable object models, Addison-Wesley Longman, 1997.ISBN 0-201-89542-0.
  6. Wikipedia, Conceptual  Last retrieved on 2015/12/16

https://en.wikipedia.org/wiki/Conceptual_model_(computer_science)

该文章来自阿里巴巴技术协会(ATA)精选集

时间: 2024-10-26 20:21:18

域模型之一, 域模型的价值的相关文章

局域网技术基础:冲突域与广播域

局域网技术中,冲突域与广播域这两个词对网络性能影响很大,下面让我们看一看这两个词是如何影响网络性能的. 局域网技术之冲突域 假如你想将车驶出高速公路,但每做一次尝试,都有一辆车挡住你的去路.如果强行出来,就会发生碰撞,这与使用带冲突检测的载波侦听多路访问(CSMA/CD)协议的以太网上发生的情况很相似.电气与电子工程师协会(IEEE)将CSMA/CD以太网定义成802.3标准,如今,该标准的使用遍及整个网络界.开放系统互联模型(OSI)第二层的介质访问控制(MAC)子层,就是使用CSMA/CD协

Visual Studio DSL入门 5---理解生成的域类和域关系

1. 首先找到Dsl项目中模板DomainClasses.tt生成的DomainClasses.cs,我们来查看一下它由两个类组成: 其实也就对应着我们域模型中的根域类ExampleModel和域类ExampleElement.我们仔细再来看一下ExampleElement类的具体结构.可以发现: 1).字段是Guid类型的,这样更方便关系类中直接引用属性,后续我们也会发现在验证,规则中也会经常使用属性的Guid字段变量来代表属性. 2).我们看到上一节我们看到的关系生成的属性,ExampleE

操作模型与展现模型的对象:作者与读者

网页制作Webjx文章简介:用比较容易理解的方式来形容操作模型与展现模型的对象,那就是作者与读者--作者的角色定义是写文章,而读者则是读文章. 用比较容易理解的方式来形容操作模型与展现模型的对象,那就是作者与读者--作者的角色定义是写文章,而读者则是读文章 作者给我们的印象是面对一堆草稿纸,电脑上凌乱的文档碎片,时而抓耳挠腮大脑一片空白,时而思维泉涌洋洋洒洒一大篇:读者则是对着一本包装精美,经过仔细排版的书籍,读的津津有味 这中间有个出版商,将草稿整理排版印刷,然后以最适合读者的形式去演示 产品

谈操作模型与展现模型

用比较容易理解的方式来形容操作模型与展现模型的对象,那就是作者与读者--作者的角色定义是写文章,而读者则是读文章 作者给我们的印象是面对一堆草稿纸,电脑上凌乱的文档碎片,时而抓耳挠腮大脑一片空白,时而思维泉涌洋洋洒洒一大篇:读者则是对着一本包装精美,经过仔细排版的书籍,读的津津有味 这中间有个出版商,将草稿整理排版印刷,然后以最适合读者的形式去演示 产品设计呢?我们面对的是运营.市场.http://www.aliyun.com/zixun/aggregation/15572.html">公

将Windows Server Core操作系统加入域或退出域

  1.1.1 任务5:将Windows Server Core操作系统加入域或退出域 用虚拟机打开安装有Windows Server Core的ProfileServer虚拟机. 以管理员的身份登录ProfileServer虚拟机. 输入 hostname 查看计算机名称. 输入 netdom renamecomputer FileServer /newname:ProfileServer 更改计算机名称为ProfileServer. 输入netsh interface ipv4 set ad

WCF中的Binding模型之一: Binding模型简介

一. 信道层与服务模型层(Channel Layer and Service Mode Layer) 对于一个分布式应用的开发与设计来说,通信问题是不得不考虑,同时也是最为复杂.最难实现的问题.在过去的若干年中, 微软先后推出了一系列广受欢迎的通信技术, 比如DCOM.Enterprise Service..NET Remoting.XML Web Service.MSMQ等等.这些技术提供了各自的编程模型,是开发人员从繁琐的完全基于通信的编程中解脱出来,使之仅仅需要关注具体的业务逻辑.WCF是

区域-pci 总线中总线域和存储域转换问题

问题描述 pci 总线中总线域和存储域转换问题 pci设备只能访问在存储器域有映射的区域,但是这个映射关系是初始化pci后就固定了还是可以再修改的?因为pci与存储器域的映射有限,倘若我下次访问另外一块存储器地址咋办? 解决方案 http://blog.sina.com.cn/s/blog_6472c4cc0100qg5i.html

数字图像处理-高斯滤波器空间域与频率域

问题描述 高斯滤波器空间域与频率域 10C Hello!我有一个关于高斯低通滤波器的问题, 在许多的博客上(同样的情况在matlab的fspecial函数中),产生空间域滤波器 使用的公式都是A*exp(-u/(2*sigma^2)),之后再进行了归一化.但是这个公式不是高斯函数在频域域中的公式吗?用这个公式为什么可以计算空间滤波器呢?还是说因为空间域和频域的公式均属于高斯函数,所以可以这样实现? 解决方案 http://wenku.baidu.com/link?url=BiXCUBEPvJHT

基于动态混合高斯模型的商品价格模型算法

1. 背景     作为电子商务网站,淘宝网上的每个商品都有一个价格,该价格从一个很重要的维度上反应出一个商品的品质.但是由于该价格是由第三方卖家自己确定的,因此存在一定的随机性.一个价格过低的商品,其假货的可能性往往较大,比如500元的劳力士手表,或者商品的质量存在问题:同时一个价格过高的商品,可能会失去一个潜在的购买者,也可能会是卖家故意设置高价,以便用户按价格排序时展现在靠前的位置.    因此对一个商品当前价格的合理性进行判断,并根据该商品的属性给出其合理的价格区间,对于规范淘宝网的商品

django,性能测试,以及对fastcgi下进程模型和线程模型的分析

/** *作者:张荣华 *日期:2008-11-15 **/ 之前网上有很多关于django的测试,他们的测试结果都表明django在fastcgi模式下,使用线程模型要比进程模型快,而且更稳定,具体文章见:http://irobot.blog.hexun.com/20332312_d.htmlhttp://taoyh163.blog.163.com/blog/static/19580356200802433559850/ 但是ahuaxuan根据操作系统的原理判断结果不应该是这样,理论上来讲,