You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
19 KiB
Markdown

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 14 | 8X Flow何为业务何为领域
你好我是徐昊。今天我们开始进入8X Flow的学习。
8X Flow是继四色建模法之后由我发明的另一种建模方法。其实以前四色建模法也叫8X Flow。
从之前的学习中你会发现四色法是一种数据流方法——Flow有了而我姓徐名昊字八叉以我的名字命名而得但后来为了向Peter Coad致敬表示灵感来自他的彩色建模法就叫了四色建模法。于是今天要介绍的方法我们内部之前叫8X Flow 2.0现在直接叫8X Flow就行了。
8X Flow方法是四色法的一种演进。虽然**权责追溯**仍然是8X Flow的核心理念但比起四色法8X Flow更注重通过权责关系提取业务模式并通过引入变化点构建可复用的业务模型。所以对于业务平台或业务中台这类系统来说8X Flow可谓是量身定制。此外由于充分考虑了云时代的架构约束得到的模型也能很容易地映射到微服务架构上。
那么接下来我会用三节课来介绍8X Flow的具体内容。今天我们先来讲一讲业务系统与领域系统的区别因为这二者之间有着明显的弹性边界而根据弹性优先原则我们首先要对它们加以区分。
## 模型真的是稳定的吗?
正如我们在“云时代的挑战”这两讲中提到的,进入云时代后,出于更有效地利用云平台的目的,我们引入了新的架构约束:弹性优先原则。也就是说,**在云时代架构系统中,弹性是最需要优先考虑的因素。**
在具体讨论如何在业务模型中体现弹性优先原则之前,我想你可能会有这么一连串的问题。
* 对于业务建模而言,我们需要考虑弹性吗?
* 业务不应该是独立于技术的吗?难道我们从前云时代过渡到云时代,连模型也要改变吗?那么我们怎么还能相信,建模的稳定性?
* 我们在[第6讲](https://time.geekbang.org/column/article/389095)也说过:“一旦领域层出现重大改变,就意味着重大的业务调整,整个系统都可以推倒重来了。因而在软件系统有限的生命周期内,我们可以认为领域层应该是不变的。”难道说,云会让系统推倒重来吗?
这些都是很好的问题,触及了业务建模最底层的逻辑。而要回答这些问题,归根到底,我们需要弄清楚一件事:**业务模型会不会受到技术范型的影响?**
答案是:**会,但不经常发生**。那么什么时候会发生呢?**就是在技术范型改变可以带来成本大幅下降,或者带来收入巨幅增加的时候。**
说到底,我们做软件,特别是业务软件,并不是为了什么自我表达,而是为了更好地帮助业务方实现业务价值。而业务价值也很简单:**产生更多的收入,或者用更低的成本**。
那么,当技术范型的改变,可以带来巨幅收入或者成本改变时,业务自身的运营方式,必然也会利用这些技术的改变。所以从源头上,业务就变了,那么模型自然也要响应这种改变,作出对应的变化。
所以实际上,**并不是新的技术范型直接改变了模型,而是新的技术范型带来了成本收入上的优势,业务方则为了利用这些优势,便根据这些新的技术范型,改变了业务运营方式,然后引起了背后模型的改变**。
那么,能够引起业务重视的新的技术范型,自然不是什么新的编程语言或者新的框架,而是一些能够产生较大影响的技术范型的改变。
比如企业级数据库系统Enterprise Database System的出现直接将企业应用架构从单体桌面系统Monolithic Desktop Application架构转向了两层客户端/服务器架构C/SClient/ Server。我觉得没有人会相信自己在桌面应用中设计的模型可以无缝过渡到数据库时代吧。毕竟我们需要思考范式、数据冗余、索引这些在之前根本不存在的概念并在模型中加以体现。
类似的情况在互联网Internet普及的过程中客户端/服务器架构变成了多层架构Multi-Tiered Architecture。你在旧约部分能看到过去十几年我们一直在与这种改变作斗争让我们的建模方法可以适应架构的改变。
同样的在C/S架构中的模型也不能无缝过渡到多层架构里。那就需要考虑新的架构约束重新建模。比如我们在旧约部分讲到的关联对象、角色对象和能力提供者等模式都是重新建模时采用的手段。
可以说,好的模型可以在软件生命周期内保持稳定,帮助我们在特定的架构风格下高效应对变化。这没错儿。**但是,模型不能帮我们渡劫。如果架构风格彻底改变了,那就没办法了,模型必须重建**。
非常不巧的是,云计算就是我们现在正面临的这样一场大劫。而它带来的变革之大,也是这么多年来诸多变化之最。因为云改变了**成本最低的运营模式将其从统一模式Unification变成了复制模式Replication。**
统一模式与复制模式出自**四种业务运营模型**最早由IBM在上世纪八十年代发明用以描述不同业务模式间的差异以及需要何种IT能力来支撑与其对应的模式后来被商学院教程广泛采纳就成了一个讨论业务模式与IT诉求的非常有用的宏观模型。如下图所示
![](https://static001.geekbang.org/resource/image/48/07/48bf61723a09b1b05407de2d97f20c07.jpg?wh=2000x1125)
对于四种业务运营模型,我在这里还是做个简单的说明。你可以将流程标准化看做是否需要强制使用同样的业务流程;而将流程整合度,看做是否需要使用同一数据源。那么我们就可以这么来理解了:
* 统一模式强制使用同样的流程也需要使用同样的数据源。业务上是强流程强管控模式对应在软件上的运营模式就是单实例模式Singleton。举个例子比如用户身份系统在逻辑上我们始终认为只有一种也就是单实例。当然这个单实例可以是一片集群或云化的但只要在概念是统一的那么它就是统一模式。
* 复制模式强制使用同样的流程但可以使用不同的数据源。业务上是以同样业务模式独立运营的业务单元Business Unit对应在软件上的运营模式是多租户模式Multi Tenancy。对于每个租户他们如同独占整个系统一样但是租户间数据是隔离的。也就是我们说的SaaS模式。
* 协作模式不强制使用同样的流程但需要使用同样的数据源。业务上是仅仅在财务流程和关键数据上互通的更具有独立性的业务单元或子公司模式。对应在软件上可以看做通过开放API提供对于共享数据的访问。
* 差异化模式:不强制使用同样的流程,也不使用同样的数据源。基本上就是不同的业务实体。对应到软件上,可以将其看作开放生态模式。
这四种业务运营模式不仅仅是对IT系统对组织结构也有指导意义。而从这个角度来看**我们行业内存在的很多问题就源自业务组织能力与IT能力的不匹配**。
比如说业务组织已经逐步过渡到独立BU的形态而IT系统却无法提供与复制模式匹配的运营能力。当然这种影响也是双向的。毕竟在逆康威定律Inverse Conway Maneuver的影响下**最低成本的软件架构模式,也会影响企业对运营模式的选择**。
我们知道,在前云时代,统一模式所对应的软件架构也就是单实体模式,是最容易实现,也具有最低的运营成本(在数据中心为主的基础设施上)。所以**我们所熟知的最佳实践,都是在统一模式为最低成本的假设前提下,被总结确立起来的。**
而在云时代,复制模式代替了统一模式,具有最低的成本。而业务方也在尝试改变运营模式,以获得云平台的红利。所以不仅仅是建模,我们所熟知的一切,都需要重新确认是否仍然是最佳实践。
说到底,我们不可低估云计算带来的改变。不过更重要的是,在这股巨浪中,我们不应保留任何先入之见,而是要去探索背后的核心逻辑。
## 什么是模型中最明显的弹性边界?
我们知道云是通过降低成本改变运营模式,从而给业务带来影响的。那么是否存在着某些业务功能更容易受到运营模式的影响,而另一些业务功能,则不容易受到运营模式的影响呢?
如果是这样的情况,就意味着**这两种不同的功能存在不同的弹性边界。那么按照弹性优先的原则,我们就需要将这两类需求进行分离**,从而在最宏观层面上,贯彻弹性优先的原则。
那真实情况是怎么样呢?让我们以极客时间专栏为例,罗列一下与之相关的功能点,看看这些功能点之间存在什么差异:
1. 编辑发布新的专栏;
2. 编辑为专栏定价;
3. 读者订阅专栏;
4. 读者阅读专栏;
5. 读者转发专栏拉新返现;
6. 编辑发布专栏内新的课程章节;
7. 读者在课程下评论;
8. 作者回复读者评论;
9. 作者根据专栏销量获得提成。
现在让我们考虑一下,在运营模式改变的情况下,哪些功能点会发生改变。
比如说,极客时间专栏提供了企业版,也就是对企业收取特定的费用(每年或者一次性),这样企业内的员工就能无限或者按照规定的量来自由阅读专栏。
可以发现,与发布、阅读、评论相关的功能点,无论是公开版本,还是企业版本,都没有什么区别。而定价、返现、提成等功能,则会发生较大的改变。也就是说,这些功能点更容易受运营模式改变的影响。
如果按照变化隔离的原则从架构上将这两类功能分割开的话我们就有了一个不同的看待极客时间系统架构的角度。我们将它分成两部分一个是与运营无关的内容管理系统Content Management SystemCMS一个是极客时间的运营系统。
那么,企业版不过就是在内容管理系统上,提供了另一套运营系统而已。如下图所示:
![](https://static001.geekbang.org/resource/image/38/c0/38f4af6a80a833960a64e6b1d28074c0.jpg?wh=2000x1125)
由此我们就发现了一个常用的架构模式,可以把**系统分解为两部分:与运营无关的部分;提供运营能力的部分。**
比如对于类似Google、Bing这类搜索引擎而言与运营无关的部分是搜索引擎而与运营有关的则是广告的投放和竞价。对于类似优酷、爱奇艺这类视频网站而言与运营无关的是流媒体部分而与运营有关的则是VIP账户、广告等。
下面让我们来看看分开的这两部分中的模型。在与运营无关的部分中,模型似乎不怎么需要业务方的输入。比如说:
* 极客时间专栏中的内容管理系统核心的概念是专栏、课程和评论和通用的内容管理系统中的栏目Category、文章Article、评论Comment似乎没有什么区别。
* 类似地,对于搜索引擎而言,与运营无关的部分中,关键概念是分词、词频、索引、爬虫等,似乎更不需要业务方的输入。
而在与运营相关的部分,模型则需要业务方的输入和验证。比如说:
* 对于极客时间专栏而言,这部分牵扯到如何定价、如何分成等诸多业务规则。在没有业务方输入的前提下,几乎不可能构造出任何的模型,甚至都无从开始。
* 类似地,对于搜索引擎而言,广告如何与关键词关联、如何计算投放量、如何衡量广告效果等等,就需要业务方制定相应的规则与逻辑。
那么我们就会发现在进行建模时针对与运营无关的部分和与运营有关的部分我们需要处理的核心复杂度并不相同。而且“两关联一循环”对于这两部分的功用也不尽相同。事实上从Eric Evans提出领域驱动设计开始行业并没有明确区分这两种不同的领域逻辑。所以我们一直都在用“领域”这个词指代这两种不同的领域逻辑。很多误会与歧义也是从这里就产生的。
我个人从2010年开始就分别使用“领域”Domain和“业务”Business来指代这两类不同的逻辑。即“**领域”表示与运营无关的问题域,“业务”表示与运营相关的问题域**。
之所以将与运营无关的逻辑称作“领域逻辑”,原因有二。
第一,这两部分分别有不同的建模方法。既然领域与业务有不同的关注点,那么针对不同的关注点,自然有不同的最佳实践和最佳建模方法。分别对待,会让我们更容易得到恰当的模型。
第二在我们区分了领域逻辑与业务逻辑之后再回过头去看Eric Evans的领域驱动设计会发现他在书中给出的例子大部分都是与领域系统相关的。所以他没起错书名他讲的的确是“领域驱动设计”。因此如此命名可以减少概念上的冲突。
## 究竟是领域建模还是业务建模?
知识消化的“两关联一循环”,对于领域逻辑和业务逻辑都是有效的吗?还是只对某一种逻辑更适用呢?**从我的经验来看,通过“两关联一循环”对业务逻辑建模的效果,要远远好于对领域逻辑的建模的效果**。
业务逻辑与运营相关。运营本身也没有绝对的好坏之分,只有合适与否。大量的业务逻辑其实是源自运营实践经验的总结,其背后也不一定存在什么严谨的逻辑。所以所谓的“专家”可能也只是经验丰富而已。
我经常举这样一个例子。比如你和你朋友都是卖烤白薯的,你们分别在东直门地铁站左右站立,配方、产品、文案无一不同。唯一的差别是,你每天进货,而你的朋友一次进一周的货。那么在运营中,你会有很多与采购有关的操作,而你的朋友则更多关注库存的管理。当你们都成为红薯专家的时候,如果互换位置(听起来有没有职业经理人空降的感觉),其实都玩不转。因为你不知道怎么管库存,而你的朋友可能无法处理频繁的采购操作。
业务逻辑是和某种运营方式绑定的,我们把业务逻辑的这个特性称作**运营特定Business Operation Specific**。知识消化对于这类逻辑的总结与提炼,具有很好的效果,这个我们在旧约部分已经讲过了,就不再复述了。
相对地,你可能会发现,如果把卖烤红薯变成卖烤土豆,那么采购或是库存的业务逻辑其实没什么改变。这种特性我们叫做**领域中立Domain Neutral**。
也就是说某种业务运营的模式也就是赚钱的办法其实可能和对应的领域功能没什么关系。比如极客时间专栏的订阅分成模式如果把内容换成网剧其实也是成立的。还有Google的广告竞价模式把搜索引擎换成门户类网站也是成立的。
**因而业务逻辑一般具有运营特定和领域中立性。与之相对的,就是领域逻辑具有运营中立性和领域特定性**。那么这里就有一个问题:对于领域逻辑,知识消化法还有效吗?
事实上,对于能通过面向对象模型表示核心复杂度的领域逻辑,知识消化法是能够发挥作用的。因为我们讲到现在,隐含的前提就是通过对象模型建模问题。但是,并不是所有的领域逻辑都适合使用对象模型表达。
比如推荐引擎通过特征建模Feature Modeling并使用相似度算法可能是更好的方法。当然也可以是决策树Decision Tree甚至是神经网络Neural Network。这时候知识消化并不能帮助我们得到这些模型。
那你可能会问为什么Eric Evans可以从“领域逻辑”出发提炼出知识消化法呢
这主要是因为,他并没有区分领域和业务,所以他想解决的问题是对“业务逻辑”的提取。而书中例子多是“领域逻辑”,只不过因为“领域逻辑”更好举例而已。
所以知识消化实际是一种“业务建模”方法,而不是“领域建模”方法。这也是为什么,我们这门课叫《如何落地业务建模》。
总结来说,将领域与业务分开,可以让我们更好地理解什么是业务系统:**支撑业务运营,利用领域系统赚钱/省钱的系统,叫做业务系统**。所以我们业务建模的目的,就是寻找到恰当的业务模型,更好地支撑业务系统的构建与演进。
## 小结
这节课我们主要介绍了云给业务运营模式带来了什么样的改变,以及这种改变会如何影响我们获取业务模型。然后,我们将逻辑分成了领域逻辑与业务逻辑,分别讨论了它们的异同,以及我们究竟是在针对什么进行建模。
总结起来说,**业务逻辑**是源自业务运营的逻辑,是领域中立且运营特定的,其复杂度来自于业务流程,关注的是如何通过某个领域逻辑实现获利。因而它的关注点,就集中在盈利和成本结构上。或者说,业务逻辑对外体现为利润或现金,对内体现为成本和绩效承诺。
而**领域逻辑**源自问题域自身的逻辑,是运营中立而领域特定的,其复杂度来自于问题本身,关注点通常是算法、计划、统计、优化等等。
所以关注业务逻辑的组件与关注领域逻辑的组件,通常具有不同的弹性边界。以极客时间专栏为例,在缓存策略恰当的前提下,如果读者猛增,那么对内容管理部分的弹性需求,会远远小于对业务运营部分的弹性需求。而对于搜索引擎业务来说,当搜索用户猛增时,对广告投放这部分的弹性需求,要远远小于对索引部分的弹性需求。
因而从弹性优先的角度出发,我们应该将关注业务逻辑的组件与关注领域逻辑的组件分离。这样构建出来的模型,更能适应云时代的架构约束,也能让我们分别使用不同的建模方法,获得对应的领域模型与业务模型。
## 思考题
对于业务系统来说,除了可以使用事件建模法之外,还有没有其他的方式,可以让我们更好地从“盈利”的角度来展开业务维度?此外,在我们常见的领域系统中,有哪些可以使用非对象模型以更好地描述问题?
![](https://static001.geekbang.org/resource/image/39/68/390d9cd901bef56e37f655da16789368.jpg?wh=1500x1798)
欢迎在留言区写下你的想法和思考我会和你交流。我们下节课继续8X Flow的学习