核心域的模式

218 阅读6分钟

企业和个人的时间和资源都是有限的。
在开发软件系统时,如何使用我们的时间和资源可能是最基本和最困难的挑战。在我们可做的所有事情中,我们应该做什么,以及我们应该投入多少质量和严格程度?
对于软件工程师来说,更倾向于被最有趣的技术挑战所吸引。
然而,遵循领域驱动设计方法的开发人员可以通过一个名为核心域的概念来进行平衡,核心域就是系统中业务投资回报率最高的部分。
作为开发者,我们应该寻找核心域,以保证我们专注于实现最大的价值,而不是被技术上有趣但是ROI很低的特性所吸引。

核心域通常伴随着支撑域和通用域。支撑域是业务上必需的,它们包含与领域相关的业务概念,但是ROI有限。通用域表示非领域特有的功能,如用户身份、发送电子邮件、接收付款——对于这类业务,我们应该考虑购买SaaS或使用开源产品,而不是构建通用域。
我尝试将这些概念清晰化、结构化和量化以便其更容易理解和应用,并使用了以下基本的可视化方法。

image.png

通过识别高复杂性和业务差异来提取核心领域
根据这一定义,核心域就是具有高度业务差异化机会的领域。这也代表了引人注目的ROI。此外,其实现至少具有合理的复杂度(模型复杂性)。如果一个简单的数据表格(CRUD)就足够,那么就不应该在设计上浪费时间。
通过可视化,我们可以进一步来分析,找到可以指导我们现在和以后要使用的技术策略和软件开发投资。

决定性核心域

image.png

当核心域具有相当的复杂度,并且可以提供最大的业务差异化潜力时,这就是决定性的能力。其决定性在于,无论哪个组织在这方法做得正确,拥有话语权,都有可能成为市场的领导者。高度的复杂性也标志着需要大量的投资才能取得成功。

短期核心域

image.png

当一个核心域具有较高的业务差异化潜力,但是复杂度相对较低的话,它可能就是短期核心域。由于其复杂性低,无法形成技术上的防御优势,竞争对手会在较短的时间内赶上。

隐藏核心域

image.png

一个需要注意的潜在反模式就是隐藏核心域。如果上下文的复杂度较低,并且只是简单的数据CRED系统,这就不是需要我们创新的核心域。
但是,如果这种能力代表的是差异化的业务,我们就应该警惕——要么竞争对手很容易就能追上,要么业务缺少更大的机会,举例来说,业务的复杂性可能仍由员工手动处理,而软件系统只是替换了原有的纸张系统。
在这种情况下,企业应该反问:“我们能否在这里利用技术的潜力,让计算机完成人们目前正在做的困难工作?”

赌注式旧核心域

image.png

任何创新式业务的生命周期都是,随着时间的推移,它会变成桌面上的赌注——不再是与众不同的创新,但仍然是系统所需要的。
还记得第一批商店和餐馆开始接受非接触式支付吗?奇妙而且便利,这也是影响你吃饭或购物时如何选择的因素。而现在,我们期望在所有系统都支持非接触式支付。

商品化核心域

image.png

与赌注式旧核心域类似,更多的情况是,曾经的核心域会沉淀为一种通用功能,可以作为SaaS产品或开源工具提供给任何公司方便地使用。
商品化核心的一个典型例子就是搜索引擎。如果您的产品依靠高级搜索功能来区别于竞争对手,那么像ElasticSearch这样先进的开源产品和SaaS搜索服务的出现,都可能会对您的产品造成很大的冲击,使得任何潜在的对手都具有与您竞争的能力。

黑天鹅核心域

image.png

有时候,会有完全意想不到的事情发生,一个普通的商品也会变成核心域。这让我想起了Slack。
Slack一开始只是一家视频游戏公司的内部聊天系统。当视频游戏无法为公司创收时,该公司决定将其聊天系统转变为一项产品,而Slack现在的市值为130亿美元。
IRC在之前已经成为了服务于特定聊天场景的实际标准,分化潜力不大,没有人看到机会,甚至Slack自身和使用该产品的人都没有看到。

大赌注核心域/颠覆式核心

image.png

对于许多计划来说,业务差异化的潜力是未知的。在产品交付并获得市场反馈之前,没人可以确定。
由于其潜力巨大,可能会颠覆整个行业,因此这种能力可能成为一个大赌注,公司组织会倾注大量资源,并将其作为首要关注点,因为相信其ROI的非常可观的。

可疑的支撑域

image.png

如果一个限界上下文非常复杂,而且仅仅作为支撑域,那就要做出严肃的思考。为什么业务差异性相对较小的模块会需要如此高的投资来管理其复杂性?
一个完全合理的原因就是,偶然复杂性太高了——或许是正在从旧系统到新系统做迁移。应该为减少复杂性制定一个清晰的计划和时间安排,以确保将浪费的精力投入到具有更高差异化潜力的功能开发中。

更进一步

评估业务差异性和复杂性的限界上下文是一个非常实用且易用的起点。对于那些不太了解体系结构如何与业务模型关联的团队,该技术可以有效地帮助开发人员从业务角度,尤其是系统的长期发展方面来考虑系统的设计。
要想了解功能为何会向差异化和复杂性方向演变,推荐您研究Wardley Mapping和Cynefin框架。
还有一项很重要的事就是理解不同类型的复杂性(本质复杂性、偶发复杂性以及偶发复杂性的各种子范畴)。

参考

medium.com/nick-tune-t…