6 个回答
简单讲下业务架构,产品架构,技术架构,数据架构,组织架构的认知。
以你做一个 2C 的直营电商平台为例:
业务架构,包括了选品、采购、仓库、物流、商城、订单。。。等一系列业务板块。不是所有的模块都要自己研发来支持,可以采购第三方成熟的软件或者不复杂线下记账也可以,业务架构可以业务模式和流程讲清楚。
产品架构,需要将各业务的板块及支持板块细化出功能板块,例如账号(登录、注册、找回密)、商品(商品上架、品类管理、相似推荐)、订单()、物流()。。。每一个功能板块可以细拆出核心功能。
技术架构,需要考虑如何实现这些功能,一部分是基础设施,一部分是系统设计。基础设施包括选择什么语言、什么框架、什么数据库,以及消息队列、搜索引擎、部署方案等等。系统设计是否采用微服务、事件驱动、CQRS 模式、商品、订单、物流几个模块间怎么通信,实现数据统计分析是几个模块分别实现还是统一一个服务实现等等。
数据架构,这个会受到技术架构的影响,比如是否用了 Flink 流处理、需不需要 Redis 做缓存、要不要 Druid 做时序存储,各个业务是否拆库拆表,垂直分表还是水平分表。算是对技术架构的支撑,一部分在基础设施中,一部分在细节设计中。
大家去看很多架构图,往往产品架构和技术架构图都只是个大概意思,很多只是一个样子货,与实际技术实现差异很大。这个主要两方面原因,一是软件系统内部关系复杂,很难用简单的架构图清晰准确展示大量的细节;二是对外或向上汇报时细节实现并不重要,大致上下层次分明简单易懂最重要。
但到了实际研发环境,就会发现业务架构、产品架构、技术架构很多地方对不上,最后陷入泥团之中。
现在比较好的做法就是按照 DDD 领域驱动设计的方法,抽象业务领域模型,基于业务领域模型去构建应用,这样可以实现业务、产品、技术的统一,因为技术的变动取决于产品,产品的变动取决于业务,业务模块间相互高内聚低耦合,后续某一个业务模块变动也只影响少量的产品设计和技术实现,项目比较可控。
另外根据康威定律,组织结构对产品研发有很多影响,《软件开发本质论》提到按照功能特性去拆解团队,采用 BASE 基础能力团队 + A、B、C 不同的功能特性小团队,每个小团队有产品、设计、研发成员,这样很多功能特性的信息只需要在这个小团队间沟通同步,极大降低沟通成本提高效率和质量。
总的来说,业务架构(业务专家)->产品架构(产品专家)->技术架构(技术架构师)->数据架构(技术架构师),依靠领域驱动设计可以实现几者模型统一延续。与领域模型想匹配的组织架构可以很好的提高效率,与之相反的话可能将团队拖向泥潭。