funkygao/cp-ddd-framework

View on GitHub
doc/design.md

Summary

Maintainability
Test Coverage
# 架构设计

## 关于解耦

### 什么时候寻求解耦

- 业务功能不同
- 代码变化不同
- 可伸缩性不同
- 容错要求不同
- 数据安全不同

### 什么时候耦合是必要的

- 存在数据库事务
- 存在数据依赖
- 存在工作流编排

### 识别耦合的边界

```
                            technology
                                ^
             static coupling    |   dynamic coupling
             (compile time)     |   (runtime)
explicit <----------------------+------------------------> implicit
             logic coupling     |   semantic coupling
             (feature)          |   (contract)
                                V
                            business
```

### 复杂问题特征

错综复杂,纵横交错。

- 模糊性:问题难以定义,每个人看法都不一样
- 多面性:问题涉及面广,涉及的部门、角色、相关方多
- 非线性:问题产生原因多方面的,原因之间不正交,可能有不同层次、维度并相互影响

### 重构的目标

- 业务敏捷
   - 业务变化响应力
      - 需求交付周期
      - 需求吞吐量
   - 交付质量
      - 变更实施成功率
      - 线上问题数量
   - 运维能力
      - 部署频率
      - 服务恢复时长
- 运营效率
- 客户洞见
- 系统韧性与弹性

## 业务建模

>业务建模(Business Modeling)是以软件模型方式描述企业管理和业务所涉及的对象和要素、以及它们的行为、属性和彼此关系,业务建模强调以体系的方式来理解、设计和构架企业信息系统。

### 关键概念

#### 广义合同

>包含协议、共识、承诺、约定等具备履约行为的内容,都可以称之为合同,或者合同的履约凭证。

合同的生命周期主要分为:询价、报价、合同签订、履约四个阶段。合同签订前的活动,不具备法律效力。履约过程中会产生相应履约凭证,以此证明参与方履行了相关义务与权利。

软件虽然使得业务过程管理更加高效便利,但是由线下管理迁移到线上的过程中,往往模糊了业务凭证的概念及边界,使得我们在分析业务时很难发现业务本质。那么该怎么寻找合同中的凭证呢?从业务流程中归纳业务凭证,业务流程即业务凭证的追溯过程。通过梳理询价、报价、履约的流程对凭证进行溯源、归纳及定义。无论线上化程度多高,业务本身的履约动作并没有改变,改变的仅仅是记录履约信息的载体。

#### 业务流程

业务流程,是业务链路,在链路上把各个业务角色纳入进来,体现的是业务逻辑的流转。

业务流程的核心要义其实更多是划分责任归属,而流程的推进就是责任的转移。例如,货物经过不同的流程环节时,实际上就是货物在托运人、承运人和收货人直接的责任转移。

- 所有作业过程,有4个层次:领域,业务,流程,活动
   - 活动是业务功能描述的基本单位
   - 流程是活动的集合,在活动相互作用下产生特定结果
   - 流程按照作业的逻辑顺序完成一个完整业务工作
- 作用对象,参与对象,结果对象

#### 领域知识

领域知识是指在特定领域内所需要的知识和技能,具体包括了:领域背景(历史,发展,趋势,文化,社区),领域业务(业务流程/流程间依赖关系,业务对象、对象间关系、业务规则、应用场景等),领域技术,领域人员。

#### 业务规则

业务规则是对企业或组织业务过程的约束条件,它描述了业务流程的各种限制、规范和条件。业务规则通常是由法律、政策、行业标准、企业内部规章制度等产生的,可以用来约束业务流程的各种行为和决策。
业务规则通常包括以下几种类型:
1. 约束性规则:指必须遵守的规则,如法律、政策等规定
2. 规范性规则:指应该遵守的规则,如行业标准、企业内部规章制度等
3. 推荐性规则:指建议性规则,如最佳实践、经验分享等
4. 条件性规则:指在一定条件下才适用的规则,如优惠活动、特殊情况等

在一个复杂的业务系统中,通常有很多不同的业务规则,并且这些规则之间可能存在冲突,导致系统出现不一致或者错误的结果。造成业务规则冲突的原因主要有以下几点:
1. 业务规则的复杂性:随着业务系统的发展,业务规则会变得越来越复杂。不同的业务规则之间可能存在交叉、重叠或者互斥的关系,导致规则之间出现冲突。
2. 规则设计的不合理:在业务规则设计时,如果没有考虑到不同规则之间的关系,或者规则之间存在歧义或者矛盾,就很容易造成规则之间的冲突。
3. 规则实现的不完善:在业务规则实现的过程中,如果没有考虑到规则之间的相互影响,或者没有进行充分的测试和验证,就很容易出现规则之间的冲突。
4. 数据质量问题:在业务规则的实现中,如果数据质量存在问题,例如数据重复、缺失或者错误等,就会导致规则之间出现冲突。

解决业务规则冲突的方法主要包括以下几种:
1. 优先级排序:确定具有高优先级的规则将覆盖低优先级的规则,从而避免规则之间的冲突。例如,对于一个销售订单,一个规则要求在3天内发货,另一个规则要求在5天内完成发货,可以通过设置优先级,让3天内发货的规则优先于5天内完成发货的规则。
2. 规则合并:对于业务规则之间存在矛盾的情况,可以通过对规则进行合并,产生新的规则以解决冲突。例如,如果一个业务流程要求客户提供完整的地址信息,但另一个业务流程却允许在后续环节提供地址信息,可以将两个规则进行合并,产生新的规则要求客户在下单时提供部分地址信息,但在发货前必须提供完整地址信息。
3. 规则嵌套:通过规则嵌套的方式,将一些特殊规则嵌套在通用规则之内,从而解决业务规则冲突的问题。例如,企业内部规定优惠券不能与其他优惠活动同时使用,但当地政府规定在特定节日可以同时使用多种优惠,可以将政府规定的规则嵌套在企业内部规则之内,从而解决规则冲突。
4. 规则调整:如果业务规则之间的冲突无法通过优先级排序、规则合并和规则嵌套等方式解决,可以对规则进行调整或修改,以达到业务流程的顺利进行。在进行规则调整时,需要考虑到业务规则的合法性、有效性和公平性等方面。

#### 2B

系统的变更,来自两个方向:
- 需求变化
- 治理偏差

B端有个特点就是很多的业务流程变更都是由领导变更开始的,因为B端是要承载管理思想的,所以当管理思想发生变化,业务流程就一定会发生变化。

### 方法论

文化做引领,架构做创建,落地做应用,治理做维护。

#### 两个流

- 业务流
- 数据流

#### 沟通

- 向上沟通求授权
- 同级沟通求支持
- 向下沟通求落实

#### 指导思想

- 抽象要素
- 理清关系
- 寻找规律

#### 模型分层

- 概念模型
- 逻辑模型
- 物理模型

#### 业务复用前提

1. 业务可复用:即该业务适合被复用,通常表现为该业务有一定的通用性和可重用性,能够在多个场景下使用。
2. 业务规范化:即该业务已经经过规范化处理,有明确的标准和规范,能够被其他系统或模块所理解和使用。
3. 技术支持:即该业务的实现需要有相应的技术支持,如标准化接口、开放式API等技术手段,以便其他系统或模块可以方便地调用和使用。
4. 组织支持:即该业务的复用需要有相应的组织支持,包括建立复用文化、制定复用策略、培训复用人员等。
5. 业务管理:即需要对复用的业务进行管理,包括版本管理、权限管理、安全管理等,以保证复用的业务能够稳定地运行。