核心领域模式 -Nick Tune


时间和资源是有限的,在开发软件系统时,我们如何花费有限时间并利用有限资源解决最根本、最困难的挑战?在我们可能要做的所有事情中,我们应该做什么,我们应该投资多少质量和严格度?
对于软件工程师来说,自然的趋势是倾向于迎接最有趣的“技术”挑战。尽管并非总是如此,但我可以从自己的亲身经历中确认。
但是,遵循领域驱动设计方法的开发人员会认为这其中存在平衡。一种称为核心子域的概念,核心子域是系统中具有最高业务投资回报率的部分。
作为开发人员,我们应该寻找这种核心领域,以帮助我们的专注能产生最大的效果,而不是被技术上有趣但投资回报率低的功能所吸引。
核心域伴随着支持子域和通用子域。支持子域是业务必需品,它们包含与该域相关的业务概念,但是投资回报率有限。通用域代表的是我们域中不唯一的概念,例如用户身份,发送电子邮件,付款等,我们应该考虑购买SaaS或使用开源而不是构建通用子域。
为了使这些概念更加清晰,结构化和量化,使它们更易于理解和应用,我一直在使用以下基本可视化方法。

根据此定义,核心域是具有高度业务差异性机会的域领域。这代表了引人注目的ROI。另外,实现必须至少具有合理的复杂度(模型复杂度)。如果一个简单的基于数据的表格(又名CRUD)解决方案就足够了,那么我们不应该浪费时间进行过度的设计。
使用这种可视化,我们可以走得更远,找到可以指导我们现在和将来的技术策略和软件开发投资的模式。

决定性核心
当核心域极其复杂并提供最大的业务差异化潜力时,这是决定性的能力。具有决定性意义,因为无论哪个组织拥有这项权利,都有可能成为市场领导者。高度的复杂性使得需要大笔投资才能取得胜利。

短期核心
当核心域具有较高的分化潜力而复杂性相对较低时,它可能是短期核心。由于复杂性低,这不是防御性的优势,竞争将在相对较短的时间内赶上。

隐藏的核心
潜在的反模式值得警惕。如果上下文的复杂性很低,并且是一个简单的数据表单的CRUD系统,那么它就不是我们需要创新的核心领域。
但是,如果这种能力代表着与企业不同的东西,我们应该提防:复杂性如果仍由员工手动处理,软件系统只是在更换纸张。
在这种情况下,企业应该问:“我们可以在这里利用技术的潜力吗?我们可以采用手动流程,让计算机完成人们当前正在做的所有艰苦工作吗?”。

数据表单赌注式的核心
任何创新的自然生命周期是,随着时间的流逝,它变成了赌注,不再是能够与众不同的创新,而是仍然需要的东西。
还记得第一波商店和餐馆何时开始非接触式付款吗?奇妙,便捷的原因影响了您选择购物或用餐的地方。而现在,我们期望无处不在的支付方式。

商品化的核心
曾经是核心域的领域可以变成一种通用功能,任何公司都可以轻松地将其用作SaaS产品或开源工具。
商品化核心的一个示例是搜索引擎。如果您的产品依靠高级搜索功能来与竞争对手区分开来,那么像Elasticsearch这样的最先进的开源软件和SaaS搜索引擎的到来将破坏您的优势,从而为任何潜在的竞争对手提供与您竞争的能力。

黑天鹅核心
有时,完全出乎意料的事情发生了,表面上的商品可能成为核心领域。在这里想到了Slack的故事。
Slack开始成为视频游戏市场中一家公司的内部聊天系统。当视频游戏未能产生收入时,公司决定将其聊天系统转变为产品。Slack现在的价值为130亿美元。
IRC已经是一个既定的聊天标准,可以达到目的。似乎没有什么分化潜力。没有人看到机会,甚至没有看到机会,他们都在使用该产品。

大赌注核心/破坏性核心
对于许多计划而言,业务差异化的潜在水平是未知的。在产品交付并获得市场反馈之前,没人能确定。
由于潜力如此之大,可能会破坏整个行业,因此这种能力可能是一个大赌注,因为组织必须注入大量资源,并使其成为主要关注点,因为相信ROI可能是巨大的。

可疑的支持子域
如果有界的上下文非常复杂却仅能提供支持功能,则应提出严肃的问题。业务差异相对较小的事物为何需要如此高的投资来管理复杂性?
一个完全正确的原因是意外的复杂性太高了:也许是从旧系统迁移到新系统。应该制定降低复杂性的清晰计划和时间表,以确保将浪费的精力重新分配给具有更高分化潜力的功能。

进入下一个层次
我发现评估有界上下文来区分业务差异和复杂性是一个非常实际和可接近的起点。对于不了解其架构如何与业务模型联系的团队,我发现这种技术方法在使开发人员能够更多地思考业务观点,尤其是随着时间的推移而发展方面非常有用。
要了解功能为何会随着时间的推移在差异化和复杂性方面发展,我强烈建议您研究Wardley Mapping和Cynefin框架。
了解不同类型的复杂性也很重要-复杂性与偶然性以及偶然性复杂性的各个子类别。

相关:
使用DDD重新思考ERP系统的一些初步想法