聊一个看起来有点“玄”、实际上非常工程的话题:用易经的思维方式作为软件架构的“系统观”。如果你关注过“哲学驱动式软件架构法”这个系列,应该知道它不是在讲玄学,而是想建立一套能应对复杂系统判断的思维模型。这篇对应的是该系列里 2.10.1 ~ 2.10.3 的部分,主要解决一个痛点——当技术方案都“看起来可行”的时候,我们靠什么做取舍,靠什么判断一个系统该往哪个方向演进。
软件架构做得越久,越会发现一个尴尬的事实:难点通常不在选型,而在“判断”。Redis 和 Kafka 谁都能接入,领域模型和微服务划分也各有道理,但真正让人纠结的是整体状态——现在的系统是健康的还是不健康的?某个模块的压力是暂时的还是结构性的?该不该为未来的变化提前留接口?这些问题靠单一的量化指标很难回答,需要一套能同时观察“整体、关系、变化”的认知框架。这篇文章就是把这套框架拆开来讲,适合正在做架构评审、系统演进规划的技术负责人,也适合想建立系统观的中高级后端工程师。
1. 先从困境说起:架构师缺的不是方案而是系统观
1.1 架构复杂度的真正来源
我见过不少团队,痛点不是“不会用某个中间件”,而是每个人都在局部做正确的事,合起来系统却变得越来越难改。典型的场景是:交易链路延迟升高,A 团队给核心服务加了重试,B 团队给依赖方加了超时,C 团队把同步调用改成异步。单看每个改动都合理,但整体上重试和超时叠加后反而放大了故障;异步化之后,数据一致性又没人兜底了。
这种问题的根源不是某个代码写得不好,而是缺少“系统观”。什么叫系统观?就是先把系统看成一个整体,识别出关键实体、实体之间的关系、以及关系之间的动态作用,再去做局部决策。好比装修房子,单看每个房间都觉得不错,但门一开、动线一绕,才发现客厅和厨房的连接处是堵的。你缺的不是更好的瓷砖,而是一张总平面图。
1.2 为什么偏偏是易经
可能有人会问:系统观有很多种表达方式,为什么拿易经来说事?我的理解是,易经本质上是一套用符号描述“整体、关系、变化”的语言,这恰好对应软件架构的三个底层属性。
第一是整体性。一个卦由六个爻组成,六个爻合在一起构成一个完整的系统状态。架构评审时,我们关心的不是某个接口快不快,而是整个系统处于什么运行态势。第二是关系性。卦里每一爻不是孤立的,爻与爻之间有承、乘、比、应,类似于模块之间依赖、调用、反馈的关系。第三是动态性。卦与卦之间可以推移、互变,表达系统状态的演化路径——这跟系统从一个阶段演进到另一个阶段很像。
强调一下:这里说的“易经思维”不是占卦预测,也不要拿卦辞去给服务命名。真正的价值是借用这套思维框架的“观察维度”,帮我们建立判断秩序。比如看一个系统,先看整体状态,再看局部;先看模块之间的关系,再看模块本身;先看变化趋势,再看当前静止指标。有了这个秩序,架构讨论就能从“我觉得”“我猜”变成“基于关系与状态的判断”。
1.3 这章内容适合谁读,不解决什么问题
这套方法适合三类人:一是需要做技术决策的架构师和技术负责人,可以用它来组织评审逻辑、判断演进方向;二是平台后端工程师,可以在设计模块边界时多一个“关系视角”;三是对“架构思维”感兴趣的开发者,即使你不做架构,也能用它理解复杂系统的运行逻辑。
但也要说清楚边界:它不解决具体的框架选型、性能调优和代码级问题。系统观负责的是“决策之前的认知整理”,帮你明确约束和优先级。真正的落地还得靠工程能力,两者是配合关系,不是替代关系。接下来的三个小节,正好对应本系列 2.10.1 的卦象与系统结构、2.10.2 的阴阳与动态平衡、2.10.3 的易有三义与工程清单。
2. 卦象即拓扑:用六爻结构拆解系统分层
2.1 卦、爻、象与系统、模块、接口
读易经时,经常看到“卦”“爻”“象”三个词。简单说,卦是整体状态,爻是组成这个状态的六个要素,象是可观察的外在表现。把这套映射到软件架构里,非常直观:
- 卦对应系统的总体运行态势,比如“整个交易系统当前处于高负载但稳定的状态”。
- 爻对应核心关注点或组件,比如用户、商品、订单、支付、消息、风控。
- 象对应系统对外表现出的接口契约、监控指标、日志轨迹,也就是我们能直接观察到的东西。
为什么是“六”个爻?这不是什么神秘数字,而是复杂度控制的经验值。当一个系统需要同时关注的核心点超过六七个,人很难在头脑里维持整体感。所以六爻其实在提醒我们:核心关注点太多时,要先做分组和收敛,不要试图同时把控十几个变量。比如把几十个微服务先归类为“接入层、领域层、基础设施层”,再按层分析,整体性一下子就出来了。
2.2 用“取象比类”给模块分组定位
“取象比类”是易经里常用的认知方法:给抽象的事物找一个可感知的“象”,通过象与象之间的关联,反推真实结构。我们在设计系统时,也可以这样操作。
假设有一个电商下单链路,核心关注点包括用户、商品库存、订单、支付、消息通知、风控。在架构评审时,我会把它们排成一张“六爻表”:
- 初爻:用户与商品主数据。这是底座,属于基础支撑,变化频率低,但被几乎所有链路依赖。
- 二爻、三爻、四爻:订单、库存、支付。这是核心交易主流程,承载业务规则和状态流转,是整个系统的心脏。
- 五爻:消息通知与事件流。它协调各个环节,属于业务主流程的反馈器。
- 上爻:风控与外部规则。这层面向政策、营销活动、外部多变条件,是系统里最常变化的部分。
注意,我不是在说“用户就一定对应初爻”,这个映射不是唯一答案。更重要的是让团队坐下来讨论:“这几个关注点之间的强弱依赖是什么?”“哪个变化会影响最多人?”“哪个模块出了问题会把整个系统拖垮?”这种讨论本身就是取象比类——把一个看不见的系统,用一组可见的“象”建立共识,然后基于共识做决策。
2.3 用“卦位”判断职责边界和依赖方向
六爻还有一个很有用的视角:位置。初爻、二爻偏内部、偏基础,五爻、上爻偏外部、偏表现。放到架构里,这恰好是依赖方向的坐标——稳定的东西放下面,易变的东西放上面,依赖从上层指向下层。
这跟软件开发里的“依赖倒置原则”和“稳定依赖原则”是同一个道理。具体实操时,我会在评审里直接问几个问题:
- 这个模块处于哪一“位”?它是底层支撑,还是上层应用?
- 如果一个频繁变化的模块放在接近底层的位置,它是不是变成了整个系统的“不稳定地基”?
- 底层模块是否被太多上层模块直接依赖?如果有,说明底层已经被污染,需要做防腐层或者重新划界。
举一个实际例子:某个项目把营销活动规则直接写进了订单核心服务里,每次活动上线都要改核心代码,发布要拉着全链路回归。从卦位来看,营销规则是典型的“上爻变化面”,订单核心是“四爻核心链路”。把高度变化的东西放进稳定内核,就像把易碎品塞进了承重墙,不出问题才怪。后来把营销规则抽到独立的规则引擎,订单服务只依赖规则执行结果,核心链路立刻稳定了。这不是玄学,是“位”与“性”不匹配导致的架构问题。
3. 阴阳不是玄学:架构演进中的动态平衡术
3.1 阴阳的核心是互补而非对立
很多人提到易经就想到“阴阳两极”,然后以为这是二元对立,非黑即白。实际上,阴阳的核心是互补、互根、消长。软件开发里到处都是这种互补关系。
拿同步和异步举例。同步调用直观、容易排查,但容易让链路互相拖累;异步调用能削峰、能解耦,但一致性、排查复杂度都上去了。两者不是“选一个就行”的关系,而是必须同时存在、彼此配合。比如用户下单要同步返回成功,但积分、短信、推荐更新可以异步处理。系统不能只有“阴”或只有“阳”,关键是在不同维度上做出当前场景最适合的偏置。
3.2 五个常见架构平衡点:状态速查
工程里常见的平衡点可以参考下面这张表:
| 平衡维度 | 偏向一侧的表现 | 偏向另一侧的表现 | 典型判断方式 |
|---|---|---|---|
| 一致性 / 可用性 | 强一致、严格事务 | 最终一致、高并发读写 | 资金交易偏向一致,内容社区偏向可用 |
| 集中 / 分散 | 中心化治理、单一存储 | 多团队自治、多分片 | 团队协作半径和故障爆炸半径的权衡 |
| 稳定 / 演进 | 核心链路尽量少变 | 接入层快速适配外部变化 | 变化点是否被隔离,核心是否被扰动 |
| 同步 / 异步 | 强依赖、实时返回 | 削峰、解耦、异步补偿 | 链路是否允许延迟,失败是否可补偿 |
| 抽象 / 具体 | 通用抽象层多 | 业务直接实现 | 抽象本身是否真的降低了决策成本 |
你看,任何一个维度都没有绝对答案。比如交易系统早期可以做得简单直接,直接读写一个库;等流量上来后,才需要考虑缓存、分片、读写分离。平衡点是随阶段变化的,不是固定不变的。
3.3 一个读链路演进案例:阴阳失衡后怎么走
我在之前参与的一个订单系统里,遇到过典型的“失衡”场景:业务高速增长,数据库的读压力越来越大,晚上八点高峰时主库 CPU 持续飙高,慢查询开始冒头。团队里立刻有两种声音:一种主张上缓存,一种主张上读写分离。从“阴阳消长”的视角看,更稳妥的做法不是直接跳到最终方案,而是按照风险从低到高逐级推进。
第一步,先做索引优化和 SQL 治理。很多读压力其实来自几条烂查询,把全表扫描改成覆盖索引,成本最低。第二步,增加只读副本,把非实时的读流量分走。这一步要处理主从延迟带来的数据可见性问题,适合对实时性要求不高的查询。第三步,再考虑对热点数据加缓存,但要把缓存击穿、穿透、雪崩策略一起设计好。最后如果还不满足,才考虑分库分表这种大改造。
这里最有价值的一句话是:什么时候停下来?答案是当读压力回落到可控水位、写链路没有受到明显影响的时候,就应该停止叠加方案。不要因为“缓存听起来更先进”就跳过前两步。用阴阳的话说,目标不是让“阳”无限膨胀,而是恢复“阴阳平衡”。每次只推进一步,等系统重新达到平衡,再判断下一步要不要动。这样做的好处是,每一步都能独立回滚,不会把系统一次性推进不可控的复杂度里。
4. 易有三义:稳定内核、变化点与简化原则的落地清单
4.1 不易:先守住建系统的稳定内核
“不易”指的是那些长时间不变的东西。放到软件系统里,就是领域模型、核心业务规则、主数据模型、关键流程状态机。这些东西是整个系统的“压舱石”,一旦它们频繁变动,整个系统会进入持续动荡。
保护稳定内核的办法有几个。第一,领域层要独立,不依赖外部框架和中间件的细节。第二,核心链路要有“防腐层”,外部接口传进来的 DTO 必须在入口转换成领域对象,不允许外部结构直接渗透到核心逻辑。第三,核心服务改动要有更高门槛,比如必须经过架构评审,不能因为某个业务方的临时需求就直接改主流程。我记得有一个团队把订单核心服务当成“公共工具”来改,三个月后债务爆发,一次常规需求引发线上故障,最后花了两个迭代才把边界重新收拾清楚。守“不易”,守的不是不变化,而是让变化发生在受控的位置。
4.2 变易:给变化预留受控的位置
“变易”强调一切都在变化。系统的麻烦从来不是“变化”本身,而是“变化不受控”。
给变化预留位置,通常有几种手段:策略模式应对业务规则变化;适配器应对外部协议变化;配置中心和特性开关应对运行时行为变化;事件机制应对流程解耦需求。但这里有一个容易犯的错:变化还没出现,就提前抽象。
我的判断标准是“变化至少出现两次,再考虑抽象”。第一次出现时,写下清晰的接口边界就够了;第二次出现时,用策略或注入把它接住;第三次出现,再考虑是否提炼通用模型。提前设计的抽象往往不是基于真实需求,而是基于想象,结果就是过度设计——代码更难懂,改动还要绕很多弯。另外要注意,配置项本身也是变化点。每增加一个配置项,系统就多了一个运行时的“变”的可能性,要控制数量,否则配置就会变成新一层的混乱。
4.3 简易:砍掉没有决策价值的间接层
“简易”不是简单粗暴,而是把不必要的复杂性消灭掉。软件复杂度的两个主要来源是状态和耦合:状态越多越难推理,耦合越多越难修改。好的架构会刻意减少这两者。
在真实项目里,判断一个抽象层有没有存在价值,可以问一个问题:如果去掉这层,谁需要改?如果答案是“没有人的改动会变多”,那这一层就没有存在价值。我见过一个订单流程,为了“未来可扩展”,包了七层抽象,改一个字段需要动五个文件。后来重构时砍掉了四层,只保留“领域服务、应用服务、基础设施”三层,改动路径瞬间清晰,团队的理解成本也大幅下降。这个例子不是说层数越少越好,而是说每一层都必须承担具体的、可解释的决策责任。不承担决策责任的间接层,统统是噪音。
4.4 直接能用的架构评审问题清单
把上面三个原则整理成一套检查清单,每次架构评审时拿出来逐条过一遍,非常实用:
| 阶段 | 问题 |
|---|---|
| 设计期 | 系统整体状态能用一句话描述吗? |
| 设计期 | 每个模块的职责能否用一个词说清楚? |
| 设计期 | 底层模块是否被过多上层模块直接依赖? |
| 设计期 | 变化点是否都有明确的承载层? |
| 评审期 | 这个改动是否会扰动稳定内核? |
| 评审期 | 它把某个平衡点推向哪一侧?当前可以接受吗? |
| 评审期 | 是否引入了新的全局共享状态? |
| 演进期 | 上次决策的关键假设现在是否依然成立? |
| 演进期 | 当前是哪个维度失衡?靠什么恢复平衡? |
| 演进期 | 最小有效的下一步动作是什么? |
这套清单的价值在于把“不易、变易、简易”从哲学概念变成了可讨论的工程问题。不用去背卦辞,只需要带着这些问题去看系统,就能发现很多原本会被忽略的隐患。
5. 踩坑实录:别把哲学驱动用成术语装饰
5.1 把哲学名词做成架构图,但给不出决策依据
有一段时间,团队里有人特别喜欢用太极图、八卦图来画架构图,看着很有文化感,但评审时问“为什么这个模块放这里”,回答却是“因为它属阴”。这种用法就是把哲学变成了术语装饰。哲学驱动式架构法的正确打开方式,是让思维模型辅助决策,而不是用名词替代决策。
我现在更倾向于这样的做法:在讨论中完全可以用“稳定内核”“变化点”“平衡”这些工程化词汇来表达,不一定要提卦象。卦象是帮助理解思维模型的脚手架,不是用来向别人证明自己高深的东西。真正有帮助的永远是那个问题:“这个模块和谁相连?删了这条连接会怎样?”
5.2 把“平衡”当平均,导致方案没有立场
另一个常见的坑是把阴阳平衡理解成“什么都来一点”。比如为了兼顾一致性和性能,团队既做强一致同步,又做最终一致异步,一套业务同时走两条链路,结果运维复杂度翻倍,数据对不上还要到处对账。平衡不是平均主义,而是“此时此刻,根据业务特点,选择当前最优的偏置点,并预留纠偏机制”。
交易支付类业务在高风险场景下必须偏向强一致,哪怕损失一些吞吐;内容信息流则偏向高可用和最终一致。这两个方向没有对错,错的是不做选择。用阴阳的话说,就是“当下这个系统应该阳多于阴,还是阴多于阳”,要给出明确的判断依据,而不是含糊地说“保持平衡”。
5.3 团队落地心得:少讲名词,多用提问引导
如果你想把这套方法带到团队里,我个人的经验是不要上来讲课,更不要强制大家背卦名。可以先从评审开始,用“系统整体状态、模块关系、变化点、平衡点”这几个词作为提问框架。
比如评审一个新增需求时,问三个问题:这个改动碰了稳定内核吗?它会给哪个模块增加新的变化?它把系统的平衡点推向哪一侧?这些问题听起来一点都不玄,但本质上就是易经系统观在工程里的投影。等团队习惯了这种提问方式,再慢慢讲背后的模型,接受度会高很多。我也试过在复盘时用这套框架:把上一次架构决策时的假设列出来,逐条核对现在还成不成立,然后判断系统是往好的方向偏了,还是需要纠偏。这个方法落地非常快,因为它不是在解构名词,而是在建构决策。
就我个人实际操作的体会,这套方法最值得带走的不是任何卦象或爻辞,而是三个习惯:先看整体再看局部,先看关系再看实体,先看变化再看静止。每次技术讨论陷入细节时,我都会先退一步问一句:“我们现在是在聊局部优化,还是在聊整体状态?”这一句话,往往就能把讨论拉回正轨。
最后再分享一个小经验:架构评审前,把系统里关键模块和它们之间的关系画成一张带方向的简单拓扑,然后挨个问“如果删掉这条线会发生什么”。很多看似复杂的平衡问题,会在这种简单的推演里自己浮出水面。这套方法不需要任何哲学背景也能用,但它背后的观察方式,正是传统系统观最有价值的地方。