如何在短频快的节奏中做好技术?业务开发必会的架构思维

简介: 本文提供一种业务架构设计模式:从业务&技术两个角度提炼出一个基础思维框架,供业务线开发同学参考。

背景介绍

我们是CRO面向商家的业务技术团队,做商家营商环境治理业务已经4年了。作为垂直型业务技术团体(区别于平台技术团队),我们也面临大部分业务技术团队的拷问:业务技术与平台技术的差别是什么?业务技术如何做?如何理解业务?如何在短频快的业务节奏中做好技术?部分问题有答案;部分依然在寻找更好的答案。本文是对过去四年的总结:从业务&技术两个角度提炼出一个基础思维框架,供业务线开发同学参考。

  • 业务视角:业务驱动技术是前台业务的特点,业务开发要逐渐培养自己全局视角看业务的能力:从交付价值角度理解业务模式;从能力规划角度掌握产品方向。本文的第一部分介绍价值引领业务架构的做法
  • 技术视角:应用架构的内容很大,本文第二部分介绍了架构设计的两种方法(风格),以及域划分和流程建模两个架构关注点


image.png

业务架构

业务架构目的

业务架构范围比较大,本文借用“业务架构”这个词想讲的内容是:业务开发应该如何关注&分析业务问题;如何理解业务以及指导系统设计

业务架构做什么

业务架构最重要的是"看全局"(每个人立场/角度/高度不同,对“全局”的理解不同),这里强调的是:向外看的意识,而不是如何看的方法。从三个点出发看全局:

  • 看清楚 "":从宏观角度看“事”是价值源点,是业务战略&目标&价值;从微观来看“事”是业务流程。看清楚"事"就理解了“为什么做”和“怎么做”的2个核心问题。以我们做的业务为例:宏观的"事"就是帮助商家低成本处理风险问题,降低商家经营成本,提高平台竞争力;微观的“事”包括了商家风险预警流程,风险反馈流程等。的阶段尽量脱离具体系统/业务向高度和广度拓展视野。以风险预警为例:从广度上看,风险是如何识别的(有哪些上游),如何透出的(需要什么内容),怎么触达商家;从高度上看,有多少种风险可以预警(共性是什么),商家怎么处理(成本如何等),是否有更优的处理方式。
  • 理清楚 ""谁(利益相关者一起做这件“事”。对利益相关者进行分类管理,识别用户的不同诉求,排序优先级。关键点是用户要什么(用户视角的,而不是外部视角)。
  • 分清楚 ""不同"人“的权&责,在流程中的角色。从产品建设角度出发,人&权&责的识别为了深入了解用户诉求,设计产品能力。例如商家产品需要考虑商家不同角色员工的权&责,以及不同角色需要的产品功能。

业务架构怎么做

看清楚事-价值流/能力映射

价值流: 价值流是从利益相关者(客户、最终用户或工作所产生的产品、服务或交付品的接收者)的视角来描述描述一个端到端价值交付的完整过程。业务能力: 业务能力是业务为实现特定目的或结果而可能拥有或交换的特定能力或产能能力/价值流映射: 将业务能力映射到价值流中的每个阶段的过程,用于突出哪些能力对业务运营有着或大或小的重要性

分析价值流有助于从更宏观视角理解业务全过程:价值交付过程拆解成若干阶段,由不同的角色协作完成;每个阶段需要不同的能力。通过分析能力现状(完备,缺失,部分满足),评估价值&紧迫度,可以对未来规划形成构思。下图是Togaf招聘员工价值流的示例图,该图描述了招聘员工的完整流程和产品能力诉求,通过颜色区分不同能力的现状(绿色代表满足诉求;黄色代表部分满足;红色代表能力缺失)。

image.png

理清楚人&责-角色分析

使用UML用例图描述业务中的"人"和责。营商业务里有3种角色,各角色责任如下图展示

image.png


有了全局的人&责概览后,通过分析特定场景工作模式可以发现需求,问题或解决机会。这里的转变是:不只关注当前单个需求,而是从全局视角看业务诉求,从而对需求的合理性,重要性有更合理的判断;为设计方案提供业务视角考虑。例如下图例子描述员工招聘的工作模式。(从中可以看出入职阶段有提升较大空间)

image.png

应用架构

架构:组件的结构、它们之间的相互关系,以及关于组件设计和随时间演变的原则和指南。架构做的事情主要是:识别组件,定义关系,确定原则。组件和设计视角相关,不同视角下组件的形式/粒度:

  • DDD:子域就是组件,域之间的关系,域设计原则
  • 流程视角:流程,子流程,阶段都是组件;定义不同粒度下组件的交互关系和原则
  • 数据视角:数据表是组件,表之间的关系,和设计原则(范式和反范式)
  • 架构分层:层是组件,分层交互的关系和原则
  • ....

本文将介绍两种通用设计方法(自上而下,自下而上),以及领域建模和流程建模的相关知识。

架构方法

自上而下

自上而下设计是指参考标准方案,裁剪/适配形特定解决方案的过程。很多业务域已有标准模型或解决方案(例如财务域,电商,供应链等),这些业务域采用自上而下方法是一个不错的选择。设计师经验丰富/知识面广适合采用该方法;当然如果设计师经验不足,也可主动调研后实践。在大部分业务自上而下方法使用不多,不详细展开。

自下而上

自上而下设计是指从具体的业务细节出发,分析归纳最后得出解决方案的过程。自下而上是我们在日常业务中经常使用的方法,本文重点介绍如何做自下而上的设计。

自下而上"三板斧"

我们从实践总结出自下而上设计的"三板斧",作为框架指导设计过程:

image.png

第一招:自下而上做归纳

分析问题空间,通过归纳分类减少复杂度。分为两个过程:场景梳理 场景分类

  • 场景梳理:罗列所有问题细节。例如:流程建模先罗列所有子流程;领域建模先罗列所有域内概念
  • 场景分类:划分类型,合并同类项。找准分类是对问题空间信息的提炼,有些分类很容易;有些分类的识别需要一个迭代过程:
  • 先根据经验直觉选主要的划分维度,识别类型
  • 将场景归入对应分类
  • 遇到难以归纳的场景,则评估是否需调整分类
第二招:抽象分析出设计

所谓方案是解决方案空间里的解法,设计过程就是就是从问题空间过渡到解决方案空间。这是过程中的难点,也是最困难的点。设计结果视目标而定(有时是领域模型;有时是流程框架等),使用的方法也需结合问题而定。

第三招:自上而下验场景

设计方案要放在设计场景里进行"推演"。推演的过程很重要:既要推演已知的场景,评估是否满足现有需求;也要对可能性高的未来场景进行推演,评估未来的适应性。

架构实践

领域建模

本文不赘述领域建模的具体方法,只讨论下“子域划分”的问题。虽然有很多文章介绍子域识别的方法,对域划分还是比较难掌握的。如果你见到在某个业务应用里划分5+子域,有些子域里只有少数几个对象或方法,不要觉得奇怪,这些子域很可能是模仿教课书方法的产物;也可能是拍脑袋得到(常见情况),很多域都是"凭感觉"划分的(例如很多应用都有“配置域”)。看个例子:下图的领域模型能找到清晰的子域边界吗?在模型中找出连线少部分画分界线,两边连线越少说明边界越清晰。下图很难找出清晰且适合边界,但是设计方案里分了4个子域,这样的域划分是值得推敲的。(PS:看图说话是领域划分里一个直观好用的方法)


image.png

域的目的

回到域划分的初衷:域划分的目的。域划分和维护是有成本的(成本不低),付出了成本就要考虑收益,域划分的目的(即收益)到底是什么?我认为最重要的有两点:

  • 控制复杂度:生活中通常将复杂大问题划分为若干个容易解决的小问题。DDD的战略工具“子域”就是控制复杂度的工具:核心域,通用域,支持域就是划整体为部分,降低复杂度的具体方式。
  • 提升复用性:DDD子域类型里"通用域"的概念,清晰表明域的可复用性。

域划分的设计原则,我的观点是:非必要不划分;无收益不划分;不确定不划分。域划分一定要有收益:要么是复杂度降低;要么是复用性提升;要么两者都有。如果没有收益或收益过少,就不要划分子域。在实践中域划分错误的两种"坏味道":

  • 域很浅: 域划分很细,每个域少数几个对象,通常是问题不复杂,不需要划分。
  • 域边界模糊:领域对象关系复杂,子域间没有清晰边界,暗示了模型关系错误或者子域划分错误。

域的识别

虽然有很多的方法帮助识别子域,最主要的还是靠实践摸索,从正反两个方向迭代设计:

  • 正方向:从各种特征/方法出发识别可能的域 (域划分包括:从域定义出发/参考已有标准方案/识别领域概念模糊性/四色建模/事件风暴等);
  • 反方向:通过域设计原则收益验证划分的合理性;

域的验证

域设计原则以星环总结的"自治单元"最为完备,实操性较好。

image.png

领域自治与设计原则高内聚低耦合是一致的,核心判断点:

  • 最小完备&自我履行 "依赖" : 域的价值主张决定了域职责,域内包含了完成职责所需要的必要信息以及能独立作出决策,不/少依赖外部域。举例来说:在业务系统设计里经常看到运行域和配置域的设计;运行域执行任何功能都依赖配置域信息。那么从域的完备性和自我履行角度考虑,这种拆分是不合适的。
  • 稳定空间&独立进化 "变化":稳定空间是当前域不受/少受外部域变化的影响;独立进化是指域内变化对外部域没有影响/影响较小。举例来说,子域A直接引用了子域B的领域对象C,对象C变化一定影响到子域A;这种情况说明领域A不够稳定;或者说领域B不能保持独立进化。

流程建模

流程设计问题

以DDD四层模式为例:领域层模型设计逐渐得到了重视;但是应用层设计没有得到足够重视。通常讲应用层职责是面向用例组织业务流程,在实际代码实现中能发现非常多的应用层混乱导致的代码复杂度提升,典型问题包括:阶段粒度不一;节点职责不清;交互混乱。出现这些问题根源是业务逻辑是围绕“数据中心”组织的,没有对流程进行仔细的设计和组织。

image.png

流程建模做什么

这里的“流程建模”特指业务逻辑处理的组织方式。流程建模三件事: 定阶段,定职责,定交互

  • 定阶段

这里的“阶段”和"流程节点/处理节点”等概念类似,定阶段就是设计业务场景下程序处理步骤,包含业务和技术考虑。阶段是设计出来的传达出的观点是:根据设计目的(性能/灵活性/结构清晰等),阶段的粒度/顺序是有选择空间。注意:同类型流程的阶段划分粒度保持一致。同类型理解为类似场景,举例来说消息处理场景,那么不同类型消息(创建/完结/撤销等)的处理流程的阶段粒度保持一致。

  • 定职责

定义每个阶段的职责范围。在设计里(无论域识别/应用分层等粗粒度还是类/方法等细粒度设计),职责定义都很重要:明确了职责本质上定义了边界。这样每种功能的实现位置做好了设计,减少了随意性,有利于架构整体的清晰性,不至于腐化成大泥球。

  • 定交互

流程间&流程内的调用关系。请看下图示例的执行过程(这是从真实代码还原出来的):节点A调用了扩展点,扩展点执行完成后调用了节点B. 大家先想一想这样合理吗?

image.png

在生活中同层级机构对话、机构内上下交流、机构间同职级交流;很少有低层级员工直接和外部机构的领导对话。这是我们的生活经验,流程交互设计的原则也是类似的,节点负责组织该阶段内的执行逻辑,完成后通知下一个节点。这种节点交互原则总结为:阶段内上下对话,阶段间水平对话。

image.png

流程建模怎么做

自下而上流程建模简化为穷举->归纳->推演三步骤,每一步都可以若干次迭代完善。

  • 穷举: 选择熟练的工具梳理流程(流程图,ES等都可以),建议是:按业务场景类型梳理,一次可以梳理一个或几个场景,分多次完成。
  • 归纳:"通看"场景,找共性、找差异、找设计点,采用"合,增,调"(合并同类节点;增加缺失节点;调整节点顺序)三技巧完成流程设计。如何“调顺序"要看设计目的,例如性能优先将部分业务校验节点调整到前面。
  • 推演:用步骤2设计的流程推演业务,主要评估执行顺序和节点职责是满足业务需求。

image.png

实例练习

自下而上流程建模

使用自下而上方法为员工入职跟踪流程建模:首先由HR录入待入职员工个人信息和资料,确认无误后为员工分配办公空间;随后系统为员工准备资产和开通账号&权限;员工领取到资产,登录账号后,入职流程就完成了

第一步 自下而上做归纳

由上文的价值流热力图,我们知道公司的入职跟踪流程亟待建设:入职跟踪和员工信息管理能力缺乏;资产管理&设施管理&安全管理有基础能力,但是需要提升。本次使用了事件风暴方法,业务,产品和研发一起梳理入职跟踪过程,目的是建设入职跟踪能力。

image.png

第二步 抽象分析出设计

员工入职跟踪接收来自信息管理系统,资产管理系统,安全管理系统的事件,更新入职进展。设计后的流程模型如下图。增加了技术节点: 消息解析,校验,协议适配;为保持流程清晰性,将判断是否"首次流入"的节点提前到了协议适配前执行。

image.png

第三步 自上而下验场景

推演是将业务执行过程,用流程表达出来;场景推演技术特别适合复杂业务的验证,能发现设计阶段的遗漏点。下图推演员工已报到事件的处理流程。

image.png

总结

本文提供一种业务架构设计模式供大家参考。整个框架希望表达2个重点:1 首先要有业务视角思考,突破仅关注需求实现设计,而是从业务价值出发的业务架构思维;2. 强调设计的逻辑:自上而下或自上而下都是强调设计过程,每个设计决策需要经过推演得出。


作者 | 李建(甫田)

来源 | 阿里云开发者公众号

相关文章
|
6天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
4天前
|
存储 分布式计算 关系型数据库
架构/技术框架调研
本文介绍了微服务间事务处理、调用、大数据处理、分库分表、大文本存储及数据缓存的最优解决方案。重点讨论了Seata、Dubbo、Hadoop生态系统、MyCat、ShardingSphere、对象存储服务和Redis等技术,提供了详细的原理、应用场景和优缺点分析。
|
6天前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
25 7
|
4天前
|
传感器 算法 物联网
智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建
随着城市化进程的加速,停车难问题日益凸显。本文深入剖析智能停车系统的关键技术,包括停车场电子地图编辑绘制、物联网与传感器技术、大数据与云计算的应用、定位技术及车辆导航路径规划,为读者提供全面的技术解决方案。系统架构分为应用层、业务层、数据层和运行环境,涵盖停车场室内导航、车位占用检测、动态更新、精准导航和路径规划等方面。
31 4
|
5天前
|
Kubernetes Cloud Native 持续交付
云原生技术在现代应用架构中的实践与思考
【10月更文挑战第38天】随着云计算的不断成熟和演进,云原生(Cloud-Native)已成为推动企业数字化转型的重要力量。本文从云原生的基本概念出发,深入探讨了其在现代应用架构中的实际应用,并结合代码示例,展示了云原生技术如何优化资源管理、提升系统弹性和加速开发流程。通过分析云原生的优势与面临的挑战,本文旨在为读者提供一份云原生转型的指南和启示。
19 3
|
7天前
|
网络协议 数据挖掘 5G
适用于金融和交易应用的低延迟网络:技术、架构与应用
适用于金融和交易应用的低延迟网络:技术、架构与应用
35 5
|
5天前
|
运维 Kubernetes Cloud Native
云原生技术在现代应用架构中的实践与挑战####
本文深入探讨了云原生技术的核心概念、关键技术组件及其在实际项目中的应用案例,分析了企业在向云原生转型过程中面临的主要挑战及应对策略。不同于传统摘要的概述性质,本摘要强调通过具体实例揭示云原生技术如何促进应用的灵活性、可扩展性和高效运维,同时指出实践中需注意的技术债务、安全合规等问题,为读者提供一幅云原生技术实践的全景视图。 ####
|
9天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
8天前
|
监控 API 持续交付
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势、面临的挑战以及最佳实践策略。不同于传统的单体应用,微服务通过细粒度的服务划分促进了系统的可维护性、可扩展性和敏捷性。文章首先概述了微服务的核心概念及其与传统架构的区别,随后详细阐述了构建微服务时需考虑的关键技术要素,如服务发现、API网关、容器化部署及持续集成/持续部署(CI/CD)流程。此外,还讨论了微服务实施过程中常见的问题,如服务间通信复杂度增加、数据一致性保障等,并提供了相应的解决方案和优化建议。总之,本文旨在为开发者提供一份关于如何在现代后端系统中有效采用和优化微服务架构的实用指南。 ####
|
10天前
|
消息中间件 设计模式 运维
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,通过实际案例分析,揭示了其在提升系统灵活性、可扩展性及促进技术创新方面的显著优势。同时,文章也未回避微服务实施过程中面临的挑战,如服务间通信复杂性、数据一致性保障及部署运维难度增加等问题,并基于实践经验提出了一系列应对策略,为开发者在构建高效、稳定的微服务平台时提供有价值的参考。 ####