【DDD】业务领域定义

文章目录

  • 前言
  • 一、什么是业务子领域?
  • 二、子领域的类型有哪些?
    • 2.1、核心子领域
    • 2.2、通用子领域
    • 2.3、支撑子领域
  • 三、子领域差异对比
    • 3.1、竞争优势比较
    • 3.2、复杂性比较
    • 3.3、易变性比较
    • 3.4、实时策略比较
  • 总结

前言

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

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

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

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

一、什么是业务子领域?

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

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

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

2.1、核心子领域

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

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

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

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

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

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

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

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

2.2、通用子领域

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

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

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

2.3、支撑子领域

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

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

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

三、子领域差异对比

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

3.1、竞争优势比较

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

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

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

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

3.2、复杂性比较

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

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

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

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

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

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

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

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

3.3、易变性比较

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

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

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

3.4、实时策略比较

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

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

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

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

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

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

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

总结

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

子领域类型竞争优势复杂性易变性实施策略关注度
核心子域自研
通用子域购买/外采已解决
支撑子域自研/外包一般

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis(11):springboot中使用redis

1 创建springboot项目 2 创建pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…

vue3+Luckysheet实现表格的在线预览编辑(electron可用)

前言&#xff1a; 整理中 官方资料&#xff1a; 1、github 项目地址https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/https://github.com/oy-paddy/luckysheet-vue-importAndExport/tree/master/ 2、xlsx vue3 json数据导出excel_vue3导出excel_羊…

【SpirngCloud】分布式事务解决方案

【SpirngCloud】分布式事务解决方案 文章目录 【SpirngCloud】分布式事务解决方案1. 理论基础1.1 CAP 理论1.2 BASE 理论1.3 分布式事务模型 2. Seata 架构2.1 项目引入 Seata 3. 强一致性分布式事务解决方案3.1 XA 模式3.1.1 seata的XA模式3.1.2 XA 模式实践3.1.3 总结 4. 最终…

React AntDesign表批量操作时的selectedRowKeys回显选中

不知道大家是不是在AntDesign的某一个列表想要做一个批量导出或者操作的时候&#xff0c;发现只要选择下一页&#xff0c;即使选中的ids 都有记录下面&#xff0c;但是就是不回显 后来问了chatGPT&#xff0c;对方的回答是&#xff1a; 在Ant Design的DataTable组件中&#xf…

什么是框架?为什么要学框架?

一、什么是框架 框架是整个或部分应用的可重用设计&#xff0c;是可定制化的应用骨架。它可以帮开发人员简化开发过程&#xff0c;提高开发效率。 项目里有一部分代码&#xff1a;和业务无关&#xff0c;而又不得不写的代码>框架 项目里剩下的部分代码&#xff1a;实现业务…

基于C++的QT基础教程学习笔记

文章目录&#xff1a; 来源 教程社区 一&#xff1a;QT下载安装 二&#xff1a;注意事项 1.在哪里写程序 2.如何看手册 3.技巧 三&#xff1a;常用函数 1.窗口 2.相关 3.按钮 4.信号与槽函数 5.常用栏 菜单栏 工具栏 状态栏 6.铆接部件 7.文本编辑 8…

Docker Compose(九)

一、背景&#xff1a; 对于现代应用来说&#xff0c;大多数都是通过很多的微服务互相协同组成一个完整的应用。例如&#xff0c;订单管理、用户管理、品类管理、缓存服务、数据库服务等&#xff0c;他们构成了一个电商平台的应用。而部署和管理大量的服务容器是一件非常繁琐的事…

【时间复杂度】

旋转数组 题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 /* 解题思路&#xff1a;使用三次逆转法&#xff0c;让数组旋转k次 1. 先整体逆转 // 1,2,3,4,5,6,7 // 7 6 5 4 3 2 1 2. 逆转子数组[0, k - 1] // 5 6 7 4 3…

疲劳驾驶检测和识别2:Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码)

疲劳驾驶检测和识别2&#xff1a;Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码) 目录 疲劳驾驶检测和识别2&#xff1a;Pytorch实现疲劳驾驶检测和识别(含疲劳驾驶数据集和训练代码) 1.疲劳驾驶检测和识别方法 2.疲劳驾驶数据集 &#xff08;1&#xff09;疲…

MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6:MySQL Enterprise Monitor之Query Analyzer

文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6&#xff1a;MySQL Enterprise Monitor之Query AnalyzerMySQL Enterprise Monitor之Query AnalyzerQuery Response Time index (QRTi)例题例题1: Query Analyzer答案与解析1 参考 【免责声明】文章仅供学习交流&#x…

vue中如何通过webpack-bundle-analyzer打包分析工具进行配置优化

vue中随着项目的不断功能迭代和开发&#xff0c;项目文件越来越多&#xff0c;项目的打包文件也越来越大。如何对打包文件进行分析优化&#xff0c;减小打包文件大小呢&#xff1f;可以通过webpack-bundle-analyzer 这个打包分析工具进行解决。 1、webpack-bundle-analyzer的安…

Python Flask构建微信小程序订餐系统 (十一)

🔥 已经删除的会员不允许进行编辑昵称 🔥 🔥 已经删除的会员要隐藏掉会员信息的编辑按钮 🔥 🔥 创建商品表 food 🔥 CREATE TABLE `food` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`cat_id` int(11) NOT NULL DEFAULT 0 COMMENT 分类id,`name` varchar…

【算法题解】51. 二叉树的最近公共祖先

这是一道 中等难度 的题 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为…

【模型压缩】 LPPN论文阅读笔记

LPPN论文阅读笔记 LPPN: A Lightweight Network for Fast Phase Picking 背景 深度学习模型的问题在于计算复杂度较高&#xff0c;在实际数据处理中需要面临较高的处理代价&#xff0c;且需要专用的加速处理设备&#xff0c;如GPU。随着数据累积&#xff0c;迫切需要设计一种…

【力扣刷题 | 第二十二天】

目录 前言&#xff1a; 63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09; 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 今天我们爆刷动态规划章节的题目&#xff0c;相关的算法理论介绍我也有写过文章&#xff1a;【夜…

深度学习anaconda+pycharm+虚拟环境迁移

一、下载好anaconda和pycharm安装包。 下载anaconda:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror pycharm汉化包 二、安装anaconda 深度学习环境配置-Anaconda以及pytorch1.2.0的环境配置&#xff08;Bubbliiiing 深度学习 教程&…

Java版本企业电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

uniapp小程序跳转其他小程序uni.navigateToMiniProgram效果demo(整理)

放点击事件里面即可 uni.navigateToMiniProgram({appId: , //跳转的小程序的aooIdpath: pages/index/index?id123, //如果这里不填&#xff0c;默认是跳转到对方小程序的主页面extraData: { //需要传给对方小程序的数据data1: test},success(res) {// 打开成功} })

JAVA设计模式——单例模式

单例模式是应用最广的设计模式之一&#xff0c;也是程序员最熟悉的一个设计模式&#xff0c;使用单例模式的类必须保证只能有创建一个对象。 今天主要是回顾一下单例模式&#xff0c;主要是想搞懂以下几个问题 为什么要使用单例&#xff1f; 如何实现一个单例&#xff1f; 单…

c++11/c++98动态规划入门第5课,经典DP问题 --- 区间

第1题 取数问题 查看测评数据信息 有一排N个数&#xff0c;你和小明2个人玩游戏&#xff0c;每个人轮流从2端取数&#xff0c;每次可以从左或右取&#xff0c;不能从中间取。你取的所有的数的和是你的得分&#xff0c;小明取的所有的数的和是小明的得分。如果你先取&#x…