Fractal Architecture(分形架构)¶
定义¶
分形架构是一种软件组织模式,其核心特征是自相似性(self-similarity):系统中的每个组件与整体具有相同的结构和接口。一个组件既可以是独立应用,也可以是另一个组件的子部件——二者没有本质区别。
这个概念借用自数学中的分形(fractal):分形的任何局部放大后,都与整体具有相同的形状。分形架构中,任何"子树"都是一棵有效的"树"。
四条规则¶
Anton Telesh 在 2016 年从 React、Angular、Elm、Cycle.js 等框架中归纳出分形架构的四条规则:
- 统一接口:应用是由相同 API 的组件组成的树
- 递归组合:每个组件可以包含其他组件
- 无特权根节点:顶层组件与叶子组件没有本质区别
- 胶水与逻辑分离:引导/装配代码在组件体系之外完成
为什么可组合性依赖统一接口¶
分形架构的可组合性不是来自"组件很小"或"组件很简单",而是来自接口的一致性。当每个组件都暴露相同形状的 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
