手把手教你落地 DDD
钟敬
Thoughtworks 首席咨询师、数字化转型与运营团队 DDD 负责人
19697 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
AIGC特别策划 (2讲)
结束语&结课测试 (2讲)
手把手教你落地 DDD
15
15
1.0x
00:00/00:00
登录|注册

02|迭代一概述:怎样开启一个麻雀虽小五脏俱全的项目?

你好,我是钟敬。今天咱们开始第一个迭代。
在开篇词中我们说过,为了让你更好地掌握 DDD,咱们这门课设置了一个贯穿始终的案例。我们会模仿真实的敏捷开发过程,把案例分成三个迭代,每个迭代的需求规模逐渐扩大,复杂性也逐渐增加。为了满足变化的需求,就会出现新的问题,为了解决这些问题,咱们就会引入新的 DDD 模式和实践,或者深化之前学过的知识。
今天开始,咱们通过迭代一,实现一个“麻雀虽小、五脏俱全”的项目。打通从需求分析,到领域建模,再到架构设计,最后到数据库和代码实现的完整闭环。
学完迭代一,你就可以理解 DDD 实践中那些最基本的套路了,甚至还可以在自己实际工作的项目里,选择一个小的“切片”,开始尝试落地 DDD。
当然了,在实践过程中,你可能也会遇到这样那样的问题,别急,这些问题的答案,很可能就在迭代二和迭代三的内容里。当然,你也可以把问题写在评论区,咱们一起讨论。
现在我们就来看一下这个迭代的具体需求。

这次迭代的需求

假设咱们俩要一起创业,经过了一轮市场调研,我们发现很多中小企业,都有诸如考勤管理、工时管理、项目管理、请假管理等通用的需求。我们姑且把这些应用统称为“企业管理系统”。
现在咱们顺便回顾一下领域驱动设计里“领域”这个词的含义。领域指的是软件要解决的那些业务问题,所以也可以叫业务领域,英文叫 Business Domain。在这个例子里,“企业管理”就是咱们要处理的领域
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

领域驱动设计(DDD)是一种以领域模型为核心的开发方法,本文通过介绍迭代一的需求和基本开发过程,展示了DDD实践的基本套路。文章首先介绍了SaaS应用的特点和迭代一的需求,包括租户管理、人员与组织管理、项目管理、人员分配和工时登记等功能。强调了领域专家在需求挖掘中的重要性,并指出部分需求将在后续开发中逐步揭示。整个开发流程包括捕获行为需求、领域建模、架构设计、数据库设计和代码实现等步骤,形成了一个基于DDD的开发闭环。读者可以通过本文了解到DDD实践中的迭代开发过程,以及在实际项目中需求挖掘和实现的参考。文章内容丰富,逻辑清晰,对于想要了解DDD开发方法的读者具有很好的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手教你落地 DDD》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(31)

  • 最新
  • 精选
  • aoe
    置顶
    第二次学习总结: 1. 从全局视角找出「大功能模块」 2. 在「大功能模块」中找出「子功能」 3.「子功能」推荐以一级列表平铺呈现,可以降低复杂度(反例见需求二),更利于分析问题 详见文章末尾「图例说明」https://wyyl1.com/post/23/06/
    2023-07-10归属地:浙江
    1
  • 麋鹿麋鹿迷了路²º²º
    置顶
    关于思考题: 1. 如果这是一个真实的项目,你觉得还缺少哪些需求? 回答:至少还缺少数据报表等分析、项目管理中的审批管理、流程监控等。 此外,我还有一个疑问:DDD中的领域模型,与MVC中的M、ORM中的M相比,三者有哪些异同?

    作者回复: 关于模型的问题非常好,很多同学可能都有类似的疑惑。首先,是层面不同。DDD的领域模型,属于我们说的“(领域)模型的建立”层面,如果对标传统软件工程的话,大体属于“分析模型”,里面的概念都是业务概念,没有技术概念。而MVC和ORM都是架构模式,属于“模型的实现”层面,按传统的说法就是设计层面,这里面就有业务人员不需要理解的技术术语甚至代码了。ORM里的M,其实就是(分析层面)领域模型转化成代码后的形态,处在代码的领域层。MVC的解释会复杂一点,因为传统的MVC始自SmallTalk语言,而现在一般说的MVC是为了Web应用而改过的。对于Web应用而言,粗略地说,领域层和应用层,都可以归为MVC里的M,而其中的领域层代码,就是ORM里的M。这里我用的“领域层”和“应用层”两个术语,会在我们的课程后面讲分层架构的时候详细介绍。

    2022-12-10归属地:广东
    9
  • 业余草
    置顶
    大家的关注点都在需求,我来总结一下本文的核心知识点。 DDD 是以领域模型为核心的。所以,我们可以把上面说的步骤分成“模型的建立”和“模型的实现”两部分。 模型的建立:事件风暴 -> 领域建模。 模型的实现:架构设计 -> 数据库设计 -> 代码实现。 DDD 的基本开发过程:事件风暴 -> 领域建模 -> 架构设计 -> 数据库设计 -> 代码实现。 后面所有的需求,我相信应该都是围绕整个开发过程来讲述的。 期待后面大家轮流来总结,收获满满!

    作者回复: 您的总结很漂亮。提前说一下,等学到后面的课程会发现,事件风暴只是获取行为需求的方法之一,还可以采用别的方法。所以可以把第一步改一下:获取行为需求 -> 领域建模 -> 架构设计 -> 数据库设计 -> 代码实现,这样可能更好些。不过这仍然是为了讲课简化了的流程,有时间我们可以再更全面的讨论一下DDD和开发过程的关系。

    2022-12-08归属地:广东
    9
  • 程序员吾真本
    钟老师前面把ddd对于复杂系统的分析的价值和开发人员的痛点讲得很透彻,很赞。另外,在“咱们的系统就是要对这些租户进行增删改查等管理”里的“增删改查”的提法,会不会让一部分听众认为crud不算复杂,为何要用ddd? 另外,并不是所有业务场景把crud都用上。比如只有管理员才可以做对租户进行remove,但租户不可以。是否把“增删改查”改为“根据业务需要对租户信息进行管理”好一些?

    作者回复: 谢谢道长的建议!这个问题我在写这节课的时候也考虑过,所以您可以看到,目前有些地方用的是“管理”,有些地方用的是“增删改查”。之所以这么写,是考虑两点,第一从课程设计角度出发,第二从实际情况出发。 首先,从课程设计角度,这门课故意模拟实际情况,在真实情况下,业务说需求时可能就是比较随意,这里缺一点,那里漏一点,这里又不一致一点。所以这节课中的需求就显得没那么完善,在后面的课程会逐渐丰满和严格化。 其次,从实际情况角度,当业务说“增删改查”的时候,一定意味着简单需求吗?可能客户目前只想到增删改查,但深挖下去,其实还有别的,可能有的增删改查背后,有复杂的业务校验逻辑等等。这些都要继续挖掘。这节课只是开始,后面的课会继续深挖。总之,还是希望模拟一种真实的开发过程。 至于这种写法是不是有效,我们还可以听听其他朋友的意见。

    2022-12-08归属地:广东
    4
    7
  • hopez
    1、个人觉得还缺少数据统计需求; 2、多租户的数据隔离和权限管理不知道属于业务需求还是技术需求;

    作者回复: 没错。 区分业务需求和技术需求,可以这么想,如果没有开发背景的业务人员能明白的就是业务需求,否则就是技术需求。数据隔离和权限,整体而言,业务人员应该能明白,而且开发人员必须和业务达成一致,所以算业务需求。而数据隔离具体采用哪种技术手段,则不是业务需求,是技术决策。

    2022-12-08归属地:广东
    4
  • Jaising
    请教下钟老师,对于需求本身的讨论是不是也要纳入到DDD最小闭环之中,一是不一定能保证业务对需求的把握是准确自洽适合,除了领域专家也需要研发一起参与,二是需求直接影响后面模型建立与实现,哪怕多一条业务规则可能都会影响到建模,更有甚者需求本身就没有充分调研可行导致产研做了无用功,这里就有问题怎么把握需求的真伪、质量、价值这些,DDD有没提供这方面的方法论?

    作者回复: 准确的说,需求应该包含在软件开发流程的最小闭环中。而DDD的重点其实只覆盖了整个软件开发流程的一部分,也就是从系统分析(不是需求分析)到代码的部分。需求管理本身就可以写一本书了。本课程里的事件风暴,是需求管理的一部分。

    2022-12-30归属地:广东
    2
    3
  • Jxin
    1.有点顺便给自家公司搞个项目管理(包含工时,人员)系统的味道。 2.可以增加的功能 项目工作台,项目仪表盘,项目自动关联,工时缺省填报,工时未填告警等等一系列功能,能做的太多,不罗列了。 3.需要考虑的功能 跨租户业务。 比如商机分销,比如顾问跨租户支援。 这些需要刻画租户模型 租户间协作合同 以及发生跨租户业务后双边的履约刻画以及之间的履约映射 财务结算。 5.少了一个很重要的过程,如何做需求确认。 在未知领域采集业务知识(发散),提炼业务模型/功能点(收敛),评估功能点的必要性(依赖关系)和性价比(按量化价值和成本打分)(发散),制定mvp和演进路线(收敛)。 虽然ddd没写,但这个过程得做,必然可能在开始就凉了。 演进规划一定会有变化,无论是方向还是功能集,可以逐步调整,但不能没有。

    作者回复: 感谢补充,确实还有一个从愿景,到产品设计,到需求获取,项目规划等的过程。这些足以独立写一本书了

    2022-12-10归属地:广东
    3
    2
  • 沐瑞Lynn
    一、从功能需求和非功能需求的角度讲,目前,还没有描述非功能需求; 二、从用户+场景+行为动机+目标来拆解需求,目前,有些场景也欠缺,譬如:如何分配管理权限等

    作者回复: 是的,说的很全面。

    2022-12-08归属地:广东
    2
  • aoe
    现在工作中都使用 MVC,代码结构类似 Controller、Service、DAO。 开发时没有体会过“模型的实现”-架构设计这一步,而是:直接根据需求设计数据库 -> 代码实现。 以我现在的水平,看到文末的需求列表就可以直接实现功能了: 1. 划分功能模块:多租户、人员与组织管理、项目管理、人员分配、工时登记 2. 根据功能描述设计数据库 3. 编码实现 感觉到的问题: 1. 这是一门 DDD 的课程,我这样的写出的代码会无比僵硬,没有《DDD》书中提到的有些地方是柔软的 2. 因为代码僵硬,就算使用 TDD 进行开发,有利于后期重构,但也会因代码简陋(没有设计)给重构工作带来很大的工作量 3. 请教钟老师,推荐哪种方法实践: A. 是先按自己的想法实现需求汇总里列出的所有需求,再跟着后续课程迭代功能(我能吃苦,但希望不要走弯路) B. 选一个功能点实现,但是担心选中的这个功能点后续文章直接省略了,重点讲别的功能点(这就有点尴尬了) C. 或者您有更好的建议

    作者回复: 每个人都有不同的学习习惯,我只能说一下个人的看法供您参考。建议您先忘记代码,跟着课程尽量先吃透领域建模。到了后面的代码实现部分,我其实只写了一个功能为例,你看了以后,可以用类似的方法尝试写其他功能。然后和自己头脑中原来的做法做比较,应该就可以了。

    2022-12-08归属地:广东
    4
    2
  • 6点无痛早起学习的和尚
    在这里发现一个细节问题,在捕获行为需求阶段,我们梳理了: 1. 需要提供的功能(这里就为后期提供接口功能做铺垫,也算是为功能架构设计做铺垫) 2. 功能下面一些数据之间的关系(这里就为后期做数据库设计做铺垫),比如一个合同下面可以多个项目,这里就是 1:N 的关系 不知道这样理解是否正确

    作者回复: 基本是正确的,我再补充一下: 1.关于捕获行为需求,这一课只是开了一个头,下两节课讲事件风暴才是主要部分,在那里,会对后期接口设计起到更具体的作用。 2.按照DDD,这里的需求和数据库设计之间还差了很重要的一步,就是领域建模,领域建模以后,才数据库设计。这是DDD和之前开发方法的主要不同之一。

    2022-12-09归属地:广东
    1
收起评论
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部