DDD系列-建模设计全流程
和以往的开发模式不一样的是,DDD不是从用户需求开始的,DDD的起点是用户故事,值得一提的是,为了避免瀑布流模式的缺点,从用户故事到战术设计不是一条不可逆的路,相反,最好的模式应该是斡旋前进。
挖掘用户故事
挖掘用户故事必须包含产品团队,领域专家,研发团队共同参与,这里值得一提的是,领域专家这个角色的定义,这里是相关领域有资深经验的专家,比如
1)针对医疗行业,那么医生就是领域专家
2)针对教育行业,那么老师就是领域专家
但是,普遍存在的一个现象是,公司里并没有这些领域专家,往往PM承担了这个角色,这样在一定程度上也是可以的。但是还是建议每间隔一段时间邀请真正的领域专家来介绍一些这个领域的故事。
定义用户故事
用户故事属于问题空间的描述,用户故事描述公式为
公式: 作为什么人,我希望做什么,达到怎么样的一个目的。
例子:作为用户,我希望能够通过手机在线上和医生交流,从而更加便捷的清楚病情
复杂版
公式:合适的人(who),通过合适的渠道(channel),将合适的内容(what),在合适的时段(when),发送给合适的客户(whom),产生一定的效果和反馈(effect)
例子:复杂的一句话用户故事,甚至可以把模型建立出来。
电商运营人员 希望 对7天内没有回购的用户 在 周六晚上8点 的时候 通过 短信提醒 的方式 发送一张优惠券 并且希望用户回来再次购物并 评价购物体验
例子
这里列举一个电影票务系统的例子,假设我们并不知道票务系统长什么样子,那么我们(架构师)就去聆听另一方(领域专家或者产品经理)陈述我们的电影票务系统
这里的话术是用简单的公式: 作为什么人,我希望做什么,达到怎么样的一个目的。注意,中间一定要问答和讨论,最后形成一个图形表述的用户故事。
例如,这是一个电影票务系统的用户故事描述,这种图会作为架构师,产品经理,领域专家讨论之后的用户故事图形表达。
建立通用语言
先来看一个笑话:
一飞机在四川上空遇到故障,四川空管台问:“出了啥子问题?”
机上发出了求救信号:“MAYDAY!MAYDAY!”
空管回复:“没得问题就好。”
(四川话“没得”和“MAYDAY”发音差不多,“没得”就是没有,“MAYDAY”是国际通用的无线电求救信号)
这个笑话在平时的工作中非常常见,基本产品团队一套术语,研发团队一套术语,经常出现两个平行时空的对话。有的研发或者产品能发现这个问题,当讨论到一个概念可能有歧义的时候,会用其他的描述佐证是讲的这个概念,但即使这种情况也付出了巨大的成本。
为了克服这种交流困难,在建立模型时,我们必须通过沟通来交换对模型和模型中设计元素的想法,应该如何连接他们。当团队成员不能通过公共语言来讨论问题的时候,项目会面临严重的问题,比如在项目的交流的过程中,需要做翻译才能让其他人理解这些概念。比如开发人员可能努力使用外行人的语言解释设计模式,但是领域专家可能会创造出一种新的行话以努力表达他们的想法,在这种痛苦的交流中,往往就产生歧义。
挖掘通用语言方法
领域驱动设计一个核心的原则是使用一种基于模型的语言。并且需要确保团队使用的语言在所有的交流形式中看上去都是一致的,因为这个原因,这种语言也被称为"通用语言",那么,我们应该如何去构建一种语言呢。可用通过下面的对话,我们了解一下,注意飘红的词语
开发人员:我们想监控空中交通,应该从哪儿做起
专家:让我们从最基础的开始吧,所有的交通由飞机组成,每架飞机从一个出发点起飞,并在一个目的地着陆
开发人员:很容易嘛,在飞行时,飞机会按照驾驶员的意愿任意空中路线吗,只要他们能到达终点
专家:哦不,驾驶员会收到一条他们应该遵循的飞行路线,并且他们必须尽可能跟这条飞行路线吻合
开发人员:我会把这条路线考虑成空中的3D路线,如果我们使用笛卡尔坐标系,那么飞机就被简化成3D的点
专家:我可不这么认为,我们不会这样看待 的,飞行路线实际上是飞机预期的空中路线在地面上的映射,飞行路线会穿过一系列地面上的点,而这些点我们可以用经纬度来表示
开发人员:哦,那我们可以称每一个这样的点为方位,因为他是地球表面上一个固定的点,我们将使用一系列2D的点来描述线路。另外,出发点和目的地都属于方位,我们不在将他们考虑成不同的概念。飞机必须遵循飞行计划,那他是否可以按照自己的意愿选择飞行高度。
专家:不,飞机在一个特定的时刻海拔高度也会在飞行计划中
开发人员:飞行计划?那是什么意思
专家:在离开机场之前,驾驶员会接到一个详细的飞行计划,包括所有关于这次飞行的信息,飞行路线,巡航高度,巡航速度和飞机的类型甚至机组成员信息。
开发人员:看起来飞行计划相当重要,我们可得把它加到模型中,最后用通用语言描绘了这张图。
沉淀通用语言
附:通用语言表(这张表会存在模型中,平时对话中,设计文档中,代码中......)
英文 | 中文 | 描述 |
startingPoint | 出发点 | 飞机起飞地点 |
destination | 目的地 | 飞机着陆地点 |
flightPath | 飞行路线 | |
position | 方位 | 飞行路线经过的一个一个点,出发点和目的地也是一个方位 |
altitude | 海拔高度 | 地面某个地点高出海平面的垂直距离 |
flightPlan | 飞行计划 | 空中交通服务单位提供有关航空器完成一次飞行的飞行资料 |
cruiseAltitude | 巡航高度 | 巡航飞行时的高度 |
cruiseSpeed | 巡航速度 | 飞机在进入预定航线后连续飞行(即巡航)时所采用的速度 |
战略设计
比较复杂,单起篇幅
战术设计
比较复杂,单起篇幅
No Leanote account? Sign up now.