跳转至

Fractal Architecture(分形架构)

fractal-architecture

定义

分形架构是一种软件组织模式,其核心特征是自相似性(self-similarity):系统中的每个组件与整体具有相同的结构和接口。一个组件既可以是独立应用,也可以是另一个组件的子部件——二者没有本质区别。

这个概念借用自数学中的分形(fractal):分形的任何局部放大后,都与整体具有相同的形状。分形架构中,任何"子树"都是一棵有效的"树"。

四条规则

Anton Telesh 在 2016 年从 React、Angular、Elm、Cycle.js 等框架中归纳出分形架构的四条规则:

  1. 统一接口:应用是由相同 API 的组件组成的树
  2. 递归组合:每个组件可以包含其他组件
  3. 无特权根节点:顶层组件与叶子组件没有本质区别
  4. 胶水与逻辑分离:引导/装配代码在组件体系之外完成

为什么可组合性依赖统一接口

分形架构的可组合性不是来自"组件很小"或"组件很简单",而是来自接口的一致性。当每个组件都暴露相同形状的 API 时:

  • 任何组件可以嵌入任何上下文——消费者不需要了解组件内部实现
  • 组合是递归的——组合出的结果仍然满足相同的 API 契约
  • 重构的成本降低——提取子树为独立应用不需要改变接口

这与函数式编程中的"闭包性质"(closure property)一脉相承:运算的结果仍然属于同一集合,因此可以继续运算。

引导分离的意义

分形架构要求组件不知道自己在树中的位置。这意味着:

  • 组件不创建全局依赖(如 Redux store)
  • 组件通过参数获取依赖,而非从全局环境中读取
  • 装配和启动由组件体系之外的"引导代码"完成

这一分离使得同一个组件可以在不同的宿主环境中复用——作为独立应用、作为子组件、作为测试对象。

在 Agent 系统中的映射

分形架构的模式在 agent 系统设计中有自然对应:

  • Agent Skills 的"每个技能是一个包含 SKILL.md 的目录"遵循了统一接口原则——所有技能暴露相同的发现/加载/执行协议
  • 隐式循环架构 中 Cycle.js 的纯函数组件(observables in → observables out)与隐式循环的"行为由约束塑造而非预设路径"具有结构呼应——两者都拒绝让组件/agent 知道自己在整体中的角色
  • 分形架构的"每个子树是有效的树"对应 agent 系统中 sub-agent 可独立运行的设计目标

与非分形架构的对比

并非所有组件化系统都是分形的。常见的非分形特征:

  • 根组件有特殊的初始化逻辑(违反规则 3)
  • 组件直接访问全局状态(违反规则 4 的分离原则)
  • 不同层级的组件暴露不同的 API(违反规则 1)

Redux 应用经常违反分形原则——不是因为 Redux 本身,而是因为使用方式:组件直接依赖全局 store 结构,没有清晰的模块边界。

哲学先驱:华严经的"无碍互入"

分形架构的"每个子树是有效的树"在佛教哲学中有更古老的表达。华严经因陀罗网隐喻描述了一种结构:每颗宝珠映照所有其他宝珠,每个节点包含全局信息。这被称为"无碍互入"(unobstructed interpenetration),本质上就是自相似性在哲学中的发现——比曼德布罗正式提出分形概念早了约一千三百年。须弥芥子("芥子纳须弥")则是这一原理的二元简化形式:部分完整地容纳整体。

分形架构的四条规则可以在因陀罗网中找到对应:统一接口对应"每颗宝珠相同",递归组合对应"映像中的映像",无特权根节点对应"任选一颗宝珠都能看到整张网"。区别在于:软件分形架构是工程选择,因陀罗网是对实在本质的哲学宣称。

References

  • Anton Telesh, "Fractal Architecture", 2016-03-16 — sources/fractal-architecture-cyclejs.md
  • egregores, "Fractal Buddhism: The Avatamsaka Sutra", 2009-05-12 — sources/fractal-buddhism-avatamsaka-sutra.md