【DDD】业务领域定义

文章目录

前言

一个业务领域是一个公司的主要活动领域的定义。通常这是每个公司向客户提供的服务。例如:

  • 联邦快递提供快递服务。
  • 星巴克以咖啡闻名。
  • 沃尔玛是最受认可的零售企业之一。

一家公司可以在多个业务领域中运作经营。例如,亚马逊同时提供零售和云计算服务。优步不仅是一家拼车公司,还提供送餐和共享自行车服务。

值得注意的是,公司可能会经常改变他们的业务领域。一个典型的例子是诺基亚,它多年来一直在木材加工、橡胶制造、电信和移动通信等多个领域开展业务。

一、什么是业务子领域?

为了实现其业务领域的发展达到预期目标,一家公司不得不在多个子领域中运作经营。子域是业务活动的一个细粒度领域。一个公司的所有子域构成其业务域:即公司提供给客户的主要服务。实现单个子域业务并不足以让一家公司取得成功。单个子业务领域只是总体系统中的一个组成部分。子域必须相互交互,以实现公司在其业务领域的目标。例如,星巴克最出名的可能是它的咖啡,但建立一个成功的咖啡馆连锁店,需要的不仅仅是知道如何做出很好的咖啡。还必须在有效的地点购买或出租房地产,雇佣人员,管理财务等其他领域活动。这些子域名本身都不能成为一个盈利的公司。所有这些子领域都是一个公司能够在其业务领域进行竞争所必需的。

二、子领域的类型有哪些?

正如软件系统由各种体系结构组件,如数据库、前端应用程序、后端服务和其他组件组成一样,子域具有不同的标准/业务价值。领域驱动的设计区分了三种类型的子域:核心域、通用域和支持域。让我们从公司战略的角度看看它们有何不同。

2.1、核心子领域

一个核心的子领域是一个公司最具竞争力且与众不同的。这可能涉及发明新的产品或新服务,或通过优化现有的工艺来降低成本。

拿优步举例。最初,该公司提供了一种新颖的打车方式:拼车。随着竞争对手的追赶,优步找到了优化和发展其核心业务的方法:例如,通过匹配前往同一方向的乘客来降低成本。优步的核心子领域影响了其底线。这就是该公司与竞争对手的区别。这是该公司为其客户提供更好的服务且将其盈利能力最大化的策略。为了保持竞争优势,核心子领域包括发明、智能优化、商业知识或其他知识产权。

再举一个例子:谷歌搜索的排名算法。在撰写本文时,谷歌的广告平台收入占了谷歌整体利润的大部分。也就是说,谷歌的广告不是一个子域,而是一个独立的业务领域。由以下子域组成并支撑其运作,谷歌云计算服务(谷歌云平台),谷歌协同平台(谷歌工作区)等。但是谷歌搜索及其排名算法呢?虽然搜索引擎不是付费服务,但它是谷歌广告依赖的最大的平台,它提供优秀搜索结果的能力是推动流量的原因,随后,它是广告平台形式的一个重要组成部分。如果算法出现错误或这竞争对手提供更好的搜索服务,谷歌的搜索结果将会损害广告业务的收入。因此,对于谷歌,排名算法是一个核心子域。

复杂性,一个简单实现的核心子域只能提供一个短暂的竞争优势。因此,核心子域通常是复杂的。继续用优步举例,该公司通过创造性的技术,创造了一个新的拼车市场,改变了几十年前的出租车行业模式。通过深度了解出租车业务领域,优步设计出了一种更可靠和更透明的交通方式。一个公司的核心业务应该有很高的进入门槛,竞争对手应该很难复制或模仿公司的解决方案。

竞争优势的来源,需要注意的是,核心子域并不一定是技术性的。并非所有的业务问题都能通过算法或技术来解决。一个公司的竞争优势有多种来源。

例如,有一家珠宝制造商在网上销售。网上商店很重要,但它不是一个核心的子域,而珠宝设计才是。该公司可以在市面上现成平台开通网上商店,或者使用现成技术方案打造自己的网店,但是它的珠宝设计不能外包。客户之所以青睐这个珠宝制造商的产品并记住这个品牌,就是因为这家珠宝商的设计。

举一个更复杂的例子,比如有一家专门人工风险欺诈检测的公司。该公司培训它的分析师检查可疑信息,并标记潜在的欺诈案件。您要设计这个风控检测系统给分析师使用,这个是这家公司的核心子域么?不是的,风险分析师们所做的工作才是核心。

核心子域与核心域之间的关系:核心子域也被称为核心域。例如,在《领域驱动设计》一书中,Eric Evans可以互换地使用"核心子域"和"核心域"。 但是在本文中,我更倾向使用核心子域这个概念,避免与业务核心域概念混淆。

2.2、通用子领域

通用子域是所有公司都以相同的方式执行的业务活动。与核心子域一样,通用子域通常是复杂的,很难实现。然而,通用子域并不能成为公司竞争的优势。通用子领域不需要更多创新或者优化:它经过了市场的广泛验证,而且所有的公司都在使用它们。

例如,大多数系统都需要对其用户进行身份验证和授权。使用市面上现成的解决方案更有意义,而不是发明一种专有的身份验证机制。这种解决方案可能更可靠和安全,因为它已经被许多其他有同样需求的公司进行了验证。

回到一个珠宝制造商开网店的例子,珠宝设计是一个核心的子域,但网上商店则是一个通用的子域。与竞争对手使用相同的在线零售平台,相同的通用解决方案,不会影响珠宝制造商的竞争优势。

2.3、支撑子领域

顾名思义,支撑子领域对公司的业务主要是支撑作用。然而,与核心子域相反,支撑子域对公司的核心竞争起不到帮助作用。

例如,一家在线广告公司,它的核心子域包括将广告与浏览者进行匹配,优化广告的有效触达,以及最小化广告投放的成本。然而,为了在这些领域取得成功,该公司需要对其创意素材进行分类。该公司存储和检索其实体创意材料的方式,如横幅和渲染页面,并不会影响其利润。在这个领域,没有什么可以创新和优化的。另一方面,创造性的编排管理对于实施公司的广告管理和服务系统至关重要。这使得内容编排解决方案成为该公司的支持子域之一。

支撑子域的独特特点是解决业务逻辑的复杂性。支撑子域逻辑很简单。他们的业务逻辑主要包括数据输入和ETL(提取、转换、加载)操作;即所谓的CRUD(创建、读取、更新和删除)接口。这些领域活动不为公司提供任何竞争优势,因此不需要很高的进入门槛。

三、子领域差异对比

现在我们对这三种类型的业务子域有了更深入的理解,让我们从其他角度来探讨它们之间的差异,看看它们是如何影响战略软件设计决策的。

3.1、竞争优势比较

只有核心子域才能为一个公司提供竞争优势。核心子域是该公司区别于竞争对手的核心战略。

根据定义,通用子域不能成为任何竞争领域的来源。这些都是通用的解决方案------与公司竞争对手使用的解决方案相同。

支撑子域具有较低的进入壁垒,也不能为公司的竞争提供什么优势。通常,公司不介意竞争对手复制其支撑子域技术或者业务能力,这不会影响其在行业的竞争力。相反,从战略上讲,公司更希望其支撑子域是通用的、现成的解决方案,从而避免重复造轮子带来的损耗。

一个公司能够解决的问题越复杂,它能提供的商业价值就越大。复杂的问题并不局限于向客户提供服务这一方面。例如,解决一个复杂的问题可能是使业务更加灵活和高效。例如,以较低的运营成本,提供与竞争对手相同的服务水平,也是一种竞争优势。

3.2、复杂性比较

技术从业者的角度来看,识别并组合子领域是很重要的,因为不同类型的子域具有不同的复杂级别。

在设计软件时,我们必须选择工具和技术来适配业务需求的复杂性。因此,识别子域对于设计一个可靠的软件解决方案至关重要。

支撑子域的业务逻辑很简单。这些都是基本的ETL操作和CRUD接口,其业务逻辑是显而易见的。通常,它的复杂度不会超越输入参数校验或将数据结构转换。

通用子域要比支撑子域复杂得多。有一部分公司或者个人已经投入了时间和精力来解决这些问题,也能说明一些问题,这种复杂度也值得花时间。这些解决方案既不简单,也不平凡。例如,加密算法或身份验证机制。从知识可用性的角度来看,通用子域是"已知的未知数"。这些都是你可能知道某个技术或某个方案,但是你不知道其具体实现,但是拿来直接用很容易。您可以使用被行业内认可的成熟方案,也可以根据需要,聘请一名专门从事该领域的顾问来帮助设计一个定制的解决方案。

核心子域是复杂的。竞争对手很难复制某个公司的核心领域业务,因为公司的盈利能力主要靠的是核心子域。这就是为什么从战略上讲,一些公司正在寻求解决复杂的问题来作为他们的核心子领域。

有时候,区分核心子域和支撑子域可能具有挑战性。根据业务复杂性来区分,是一个比较有用的办法。询问相关子域是否可以转变为辅助业务,是否有人愿意花钱来购买该子域解决方案么?如果有的话,那么该子域就是核心子域。类似的推理也适用于区分支撑子域和通用子域:自己实现该领域业务会比集成外部现有方案更简单更便宜么?如果是,则这是一个支撑子域。

从技术的角度出发,识别业务复杂性,对核心子域的软件设计是很重要的。正如我们前面讨论的,核心子领域不一定与软件相关。在Coding之前,需要对业务进行建模和实现设计,识别核心子域业务的复杂性,对于方案设计至关重要。业务逻辑只是类似于数据输入校验和CRUD接口,还是必须实现复杂的算法规则或由复杂的业务规则和变量串联业务流程呢?前者是一个支撑子域的标志,而后者是一个典型的核心子域。

下图可以直观比较通用子域、支撑子域、核心子域的业务逻辑复杂性和业务差异性(业务价值)。

3.3、易变性比较

如前面所述,核心子域业务逻辑可能经常变更。如果一个问题能在第一次尝试时就得到解决,那么这可能并不能成为一个公司的核心竞争优势,因为竞争对手将会很快也能实现并追赶上来。因此,针对核心子域问题的解决方案是比较急迫的。必须不停地尝试、改进和优化不同的实现方案。但是核心子域的工作也不仅如此。公司需要不断创新和发展核心子领域。这些变化的形式是添加新特性或优化现有功能。无论如何,其核心子领域的不断发展对于一家公司在行业内保持领先地位是至关重要的。

与核心子域相反,支撑子域并不经常发生变化。它不会为公司提供任何竞争优势,因此,与投资于核心子域的相同的努力相比,在支撑子域下功夫对核心业务价值提升微乎其微。

尽管是现有的解决方案,通用子域仍然可以随着时间的推移而改变。这些更改可以以安全补丁、bugfix或针对通用问题的全新解决方案的形式出现。

3.4、实时策略比较

核心子域为该公司提供了与同行竞争的关键能力。这是一种业务关键性的责任,但这是否意味着支撑和通用子域并不重要?当然不是。公司在其业务域中工作都需要使用所有子域。子域就像基本的构建模块:拿走一个,整个结构可能会倒塌。也就是说,我们可以利用不同类型的子领域特征来选择实现策略,以最有效的方式实现每种类型的子域。核心子域必须在公司内部实现,不能购买或采用,这将对公司核心竞争优势造成破坏,因为该公司的竞争对手也可以这样做。

外包一个核心子域的实现也是不明智的。这是一项战略投资。在核心子领域上偷工减料不仅在短期内有风险,而且在长期内可能会产生致命的后果:例如,无法维护的代码库,无法支持公司的战略目标。公司内部最高端的人才应该被分配到其核心子领域去工作。公司自研实现核心子域可以让公司更快地做出更改和发展解决方案,从而在更短的时间内建立竞争优势。

由于核心子域的需求需要经常且不断地变化,因此解决方案必须具有可维护和易于发展。因此,核心子域需要用最先进的工程技术去实现。

虽然通用子域很困难,但已经解决了问题,因此购买现成的产品或采用开源解决方案比投入时间和精力来实现一个内部通用子域解决问题更有效。

与通用子域不同,虽然支撑子域也缺乏竞争优势,但是没有现成的解决方案可用,在内部实现支撑子域也是合理的。因此,公司别无选择,只能自己实现支持子域。这就是说,业务逻辑的简单性和更改的不频繁性使得抄近路变得很容易。

支撑子域不需要复杂的设计模式或其他先进的技术栈。一个快速应用程序开发框架足以实现业务逻辑,也不会带来额外的复杂度。

从人员分配的角度来看,支撑子领域不需要高端的技术人才,应该安排有潜力的初级、中级人员来实现支撑子域逻辑,进行锻炼。从而节省团队中有经验应对核心子域复杂挑战的工程师。最后,由于业务逻辑的相对简单,可以优先选择外包方式实现支撑子域。

总结

通过一下表格,总结下不同类型子领域的差异:

子领域类型 竞争优势 复杂性 易变性 实施策略 关注度
核心子域 自研
通用子域 购买/外采 已解决
支撑子域 自研/外包 一般
相关推荐
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
wm10432 小时前
java web springboot
java·spring boot·后端
小扳3 小时前
微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)
java·服务器·分布式·微服务·云原生·架构
龙少95433 小时前
【深入理解@EnableCaching】
java·后端·spring
溟洵5 小时前
Linux下学【MySQL】表中插入和查询的进阶操作(配实操图和SQL语句通俗易懂)
linux·运维·数据库·后端·sql·mysql
SomeB1oody8 小时前
【Rust自学】6.1. 定义枚举
开发语言·后端·rust
SomeB1oody8 小时前
【Rust自学】5.3. struct的方法(Method)
开发语言·后端·rust
啦啦右一9 小时前
Spring Boot | (一)Spring开发环境构建
spring boot·后端·spring
森屿Serien9 小时前
Spring Boot常用注解
java·spring boot·后端
盛派网络小助手11 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#