文章目录
- 一、需求人员如何利用领域模型?
- 1、解决"用户参与不够"的问题
- 2、解决"分析瘫痪"的问题
- 二、开发人员如何利用领域模型?
- 1、从词汇表到领域模型:从点到面的跨越
- 2、领域模型如何帮助理解复杂业务?
- 表达出关系:画出领域模型与状态图
- 从业务的点、线、面来把握业务的整体认知
- 3、领域建模是一个渐进的过程
- 三、总结:领域模型是团队的"沟通工具"和"思维工具"
核心观点:
- 领域模型就是需求人员和业务人员沟通的 “大白话词典”,也是帮大家跳出 “越聊越乱” 的实用工具。
- 它能让业务人员全程参与需求讨论,不用靠需求人员瞎猜;
- 还能把复杂问题拆成一个个好处理的小部分,避免聊来聊去没结果。
一、需求人员如何利用领域模型?
领域模型就是需求人员和业务人员沟通的 “大白话词典”,也是帮大家跳出 “越聊越乱” 的实用工具。
它能让业务人员全程参与需求讨论,不用靠需求人员瞎猜;还能把复杂问题拆成一个个好处理的小部分,避免聊来聊去没结果。
1、解决"用户参与不够"的问题
传统的需求分析方式,往往是需求人员听用户说,然后整理成文档。这种方式的问题在于:用户说的和需求人员理解的,可能不一样。就像两个人看同一张地图,一个人说"往东走",另一个人理解的"东"可能不是真正的东。
领域建模提供了一个解决方案:让用户代表或领域专家深度参与领域建模活动。在画领域模型的过程中,需求人员和业务人员会不断讨论、澄清、确认。这个过程本身就是深度沟通,可以让需求人员的理解从"假设"变成"共识"。
例如,在讨论银行账户的"挂失"功能时,如果只是听用户说"挂失就是账户不能用了",需求人员可能会假设"挂失就是删除账户"或"挂失就是冻结账户"。但通过画状态图,需求人员和业务人员会一起讨论:
- 挂失是什么状态?是账户的一种状态,不是删除账户
- 从什么状态可以变成挂失?从"正常"状态可以变成"挂失"状态
- 挂失需要什么条件?需要身份证验证
- 挂失后可以做什么?不能进行存款、取款等交易
- 挂失后怎么恢复?通过身份证解挂,可以回到"正常"状态
- 挂失和冻结有什么区别?挂失是用户主动申请的,冻结是银行根据授权(如司法授权)操作的
这样,需求人员的理解就从假设变成了共识。更重要的是,通过画状态图,还发现了业务规则:开户时开户金额必须≥10元人民币,这个规则如果不通过建模讨论,可能被忽略。
更重要的是,领域模型关注的是"问题域本身",而不仅仅是"想要的功能"。就像盖房子,不仅要讨论"要几个房间",更要讨论"房间之间的关系"、“房间的用途”、“房间的约束”。这种讨论,让需求人员和业务人员对业务的理解更加深入和稳定。
再看一个例子,在讨论项目管理系统的"任务分配"功能时,如果只是问"任务怎么分配",用户可能说"分配给项目成员"。但通过领域建模,会发现很多细节:
- 一个任务只能分配给一个人,还是可以分配给多个人?通过建模发现:一个任务只能分配给一个人,但一个人可以负责多个任务(一对多关系)
- 任务分配后可以修改吗?可以,但需要记录分配历史
- 任务分配和资源分配是什么关系?资源被项目占用,但具体使用是分配给任务的,任务分配资源时需要记录使用期限
- 任务可以分配给团队吗?最初可能只考虑分配给个人,但通过建模讨论,发现未来可能需要支持分配给团队或部门
这些细节,如果不通过领域建模深入讨论,可能要到编码时才发现问题。比如,如果数据库设计时只考虑了分配给个人,后来要支持分配给团队,就需要修改数据库结构,成本很高。
更重要的是,领域模型定义的领域词汇,应该成为团队所有活动的沟通基础。当开发者问用户详细的需求问题时,当系统分析师争论需求文档时,当测试人员争论bug时,都应该使用领域模型定义的词汇。这样,沟通才能准确、有效。
2、解决"分析瘫痪"的问题
有些项目一分析需求就停不下来,讨论来讨论去,就是定不下来。比如银行系统中,客户、账户、凭证之间的关系到底怎么理解?“一卡通”、"一折通"这些概念反复讨论,就是理不清楚。
这种"分析瘫痪"的根本原因,往往是对关键领域问题的理解不够深入。就像两个人讨论"怎么去北京",如果连"现在在哪里"都没搞清楚,讨论再多路线也没用。
领域建模提供了一个渐进式的方法:理解一点,画一点,公开讨论,再理解一点,再画一点。就像盖房子,不是一次性把所有图纸都画完,而是先画地基,再画框架,再画细节。每画一层,团队的理解就深入一层,讨论就聚焦一层。
例如,在软件配置管理系统的开发中,最初的理解可能是零散的:有"角色"、“工件”、“变更”、"基线"这些概念,但关系不清楚。通过不断建模,逐渐发现:
- 角色执行活动,活动可以生产、使用、修改工件
- 工件产生变更,但不是所有变更都需要管理,只有受控的变更才能纳入基线
- 配置项是工件的子类,只有通过评审的工件才能成为配置项
- 基线由多个配置项组成,是配置项在某个时间点的快照
这样的关系链,最终形成一个完整的领域模型。这个过程就像拼图,一块一块地拼,最终拼出完整的画面。
更重要的是,这个过程是公开的、迭代的。每画一层模型,就公开给整个项目团队讨论。这样,不仅需求人员的理解在深入,整个团队的理解也在深入。就像"层层夯实":理解一层,建模一层,讨论一层,再理解一层,再建模一层。
在敏捷社区有一个著名的案例:新加坡贷款项目。这是一个"巨大的失败",一家大型系统集成公司花了两年时间,最终放弃。这个项目涉及广泛的贷款系统,整合了各种贷款凭证和贷款功能。
但同样的问题,一个叫Jeff的人却成功了。他的成功秘诀之一,就是领域建模。在开始"新"项目后的两个月内,Jeff的团队就开始向客户提供可演示的功能,而他们花了大约一个月的时间进行整体对象建模。
这个案例说明:领域建模不是浪费时间,而是节省时间。花时间把领域模型搞清楚,可以让后续的开发更顺利,避免返工。
二、开发人员如何利用领域模型?
领域模型就像"拼图游戏",把零散的业务词汇拼成完整的业务图景。它不仅能帮你理解单个概念,更重要的是帮你理解概念之间的关系,从而形成对业务的整体认知,破解"领域知识不足"的死结。
很多开发人员都有这样的经历:拿到一个需求文档,里面有很多业务术语,每个术语的定义都看懂了,但就是不知道它们之间有什么关系,也不知道业务到底是怎么运作的。就像看一本字典,每个字都认识,但连成句子就不知道什么意思了。这就是"领域知识不足"的典型表现。
1、从词汇表到领域模型:从点到面的跨越
对于开发人员来说,收集业务词汇是理解领域的第一步。可以从用户手册、业务文档中收集,特别是从类似项目的"领域词汇列表"中收集。这些文本描述,可以作为领域建模的输入。
例如,在在线拍卖系统中,词汇表可能会这样定义:
- 拍卖:一种销售方式,将物品卖给出价最高者
- 拍卖信息:拍卖活动的信息,包括开始时间、持续时间、拍卖项列表等
- 拍卖项:被拍卖物品的统称
- 拍卖项信息:拍卖项的信息,包括商品信息(名称、描述、图片、分类)、起拍价、最低加价幅度等
- 起拍价:初始最低出价
- 成交价:拍卖结束时的最高出价
- 买家:参与竞价的参与者
- 卖家:提供商品并通过拍卖销售的人
- 成交:拍卖物品的所有权从卖家转移到最高出价者,买家支付成交价
这些定义都很清楚,但看完之后,开发人员可能还是不知道:一个拍卖可以有几个买家?一个买家可以参与几个拍卖?成交是怎么发生的?成交记录了哪些信息?这些关系,词汇表说不清楚,但领域模型可以画清楚。
在领域模型中,开发人员会看到:
- 类图部分:
- 商品是父类,拍卖商品继承商品,有起拍价和加价幅度属性;买家和卖家通过"成交"这个关联类连接,成交记录了拍卖商品、买家、卖家、成交价、成交时间。
- 这样,开发人员就知道:需要定义Product类、AuctionItem类(继承Product)、Buyer类、Seller类、Transaction类(关联类),Transaction类包含AuctionItem、Buyer、Seller的引用,以及transactionPrice和transactionTime属性。
- 状态图部分:
- 在线交易的交付过程,从"已订购"状态开始,买家预付后变成"已预付"状态,卖家发货后变成"已发货"状态,买家确认支付后变成"成功"状态。但如果买家申请退款,从"已发货"状态可以转到"申请退款"状态,卖家同意退款后变成"失败"状态。
- 这些状态之间的转换,用状态图画出来,开发人员就知道需要定义OrderState枚举,需要实现状态转换的方法,需要检查状态转换的条件。
这样,整个业务流程就清晰了:卖家发布拍卖项,买家出价,最终最高出价者与卖家形成成交关系,然后进入交付流程。
对于开发人员来说,这种可视化的表达方式,让抽象的业务规则变成可以讨论、可以验证的图形。就像看地图比听人指路要清楚一样,看领域模型比听业务人员描述要准确。
2、领域模型如何帮助理解复杂业务?
表达出关系:画出领域模型与状态图
在软件配置管理系统的开发中,最初的领域模型可能很简单:有"角色"、“活动”、"工件"这些概念。但随着建模的深入,会发现很多隐藏的规则:
- 角色通过执行活动来体现职责,活动可以生产、使用、修改工件
- 不是所有工件都需要管理,只有通过评审的工件才能成为"配置项"
- 基线是多个配置项的快照,只有受控的变更才能纳入基线
这些规则,如果只用文字描述,开发人员很容易遗漏或理解偏差。但用领域模型画出来,关系就清楚了:工件和配置项是继承关系,配置项和基线是组合关系,变更和受控变更是继承关系。这样,业务规则就变成了可以验证的模型结构。
很多业务概念不是静态的,而是有生命周期的。比如银行账户,从开户到销户,中间可能经历挂失、解挂、冻结、解冻等状态变化。这些变化,用状态图画出来,比用文字描述要清晰得多。
更重要的是,状态图还能展示状态转换的条件。比如,在银行账户的状态图中:
- 从初始状态到"正常"状态,需要"开户[开户额≥10]"这个事件,这意味着开户时不仅要触发开户事件,还要检查开户金额是否≥10元
- 从"正常"状态到"挂失"状态,需要"挂失[身份证]"这个事件,这意味着挂失时需要验证身份证
- 从"挂失"状态回到"正常"状态,需要"解挂[身份证]"这个事件,这意味着解挂时也需要验证身份证
- 从"正常"状态到"冻结"状态,需要"冻结[授权]"这个事件,这意味着冻结需要授权(如司法授权)
- 从"冻结"状态回到"正常"状态,需要"解冻[授权]"这个事件
- 在"正常"状态下,可以进行"存款"和"取款"交易(自转换)
这些条件,如果只写在需求文档里,开发人员可能忽略,但画在状态图里,就一目了然。
对于开发人员来说,状态图直接对应到代码实现。
比如,看到状态图,就知道要定义一个AccountState枚举(NORMAL, LOST, FROZEN, CLOSED),要定义状态转换的方法(reportLost(idCard), unreportLost(idCard), freeze(authorization), unfreeze(authorization)),要定义状态转换的条件检查(开户金额≥10,身份证验证,授权验证)。这样,业务规则就变成了可以实现的代码逻辑。
从业务的点、线、面来把握业务的整体认知
单个概念的理解是"点",概念之间关系的理解是"线",业务流程的理解是"面"。领域模型帮助开发人员把点连成线,把线连成面,最终形成对业务的整体认知。
例如,在项目管理系统中,开发人员最初可能只知道有"项目"、“任务”、"资源"这些概念。但通过领域建模,会发现:
- 项目分解成任务,任务分配给项目成员
- 资源被项目占用,但具体使用是分配给任务的
- 任务之间有前后关系,影响项目进度
- 项目有状态变化,从"未启动"到"进行中"到"已完成"或"已取消"
这样,整个项目管理的业务逻辑就清晰了:项目是容器,任务是工作单元,资源是支撑,状态是监控。这种整体认知,是单个概念的理解无法提供的。
对于开发人员来说,这种整体认知,直接指导代码的组织方式。比如,看到"项目是容器",就知道Project类应该包含Task的集合;看到"任务分配给项目成员",就知道Task类应该有一个assignedTo属性;看到"任务之间有前后关系",就知道要定义一个TaskDependency类。
3、领域建模是一个渐进的过程
领域建模最初的理解可能是零散的、不完整的,但随着讨论的深入,模型会越来越清晰,越来越系统。
在软件配置管理系统的案例中,最初的领域模型只有四个概念:角色、工件、变更、基线,关系也不清楚。但随着讨论,逐渐发现:
- 角色和活动的关系:角色执行活动
- 活动和工件的关系:活动生产、使用、修改工件
- 工件和变更的关系:工件产生变更
- 配置项和基线的关系:基线由多个配置项组成
最终,形成了一个完整的领域模型,不仅包含了核心概念,还包含了它们之间的关系,甚至包含了业务规则(比如"只有受控的变更才能纳入基线")。
对于开发人员来说,这个过程就像"代码重构"理解代码一样。最初可能只知道有几个类,但不知道它们之间的关系。通过不断抽象和整理,逐渐发现类之间的关系,最终形成清晰的代码结构。领域建模也是一样,通过不断抽象和整理业务概念,逐渐形成清晰的领域模型。
三、总结:领域模型是团队的"沟通工具"和"思维工具"
领域模型对需求人员的价值,主要体现在两个方面:
- 一是作为"沟通工具",让业务人员深度参与需求分析,避免假设过多;
- 二是作为"分析工具",让复杂问题分解成可管理的小块,避免分析瘫痪。
领域模型对开发人员的价值,主要体现在三个方面:
- 一是帮助理解概念之间的关系,而不仅仅是单个概念;
- 二是帮助发现隐藏的业务规则,而不仅仅是表面的功能;
- 三是帮助形成对业务的整体认知,而不仅仅是零散的知识点。
因此,
需求人员和开发人员都应该主动使用领域建模。需求人员应该在发现用户参与不够时,邀请用户一起画领域模型;在发现需求分析陷入僵局时,用领域建模渐进式地推进理解。
开发人员应该在面对陌生的业务领域时,不要急于写代码,先花时间做领域建模,从收集业务词汇开始,到画出初步的领域模型,再到不断迭代完善。
更重要的是,领域建模不是一个人的工作,而是团队的工作。需求人员、开发人员、业务人员、架构师、测试人员都应该参与进来。在这个过程中,不仅领域模型会越来越清晰,团队对业务的理解也会越来越一致。这种一致性,是项目成功的基础。
最终,对业务的理解越深入,需求分析的质量就越高,代码的质量就越高,系统的扩展性就越好。领域建模,就是帮助团队达成这种深入理解的关键工具。