双世界理论
背景:冯诺依曼与面向对象
冯诺依曼架构的核心是内存、状态、指令、状态变迁。内存是空间,数据存储在地址里,程序是对空间的读写操作。程序本质上描述的是:某个时刻,内存里有什么东西。
这套模型非常强大,其本质上是一种空间隐喻。
面向对象继承了这套世界观,并把它封装得更精致:类、对象、继承、组合。对象是有名字的空间,方法是对这个空间的操作。OOP 几乎完全是空间隐喻的体现——包含、嵌套、层级、结构——却几乎没有时间隐喻——事件、演化、裁决、因果。
然而随着软件工程的不断发展,其最大的工程复杂度几乎全部来自时间:并发编程,分布式,一致性,事务,消息,超时,同步。
在面向对象的世界观中:
世界的变化实际上就是:
因果被私有化、分散化。每个对象都持有自己的状态(空间的切片),用自己的方法修改自己的状态,或者用回调方法去修改其他对象的状态(空间内容的变更)。
历史因此被切碎成无数碎片,散落在无数对象的私有空间中,没有统一的因果叙事在守护身份连续性。
空间模型追求静态的清晰:边界明确、层级清楚、组合直观。时间模型追求动态的清晰:因果可追溯、历史可叙述、冲突可裁决。
当一个问题是时间性的,却被迫用空间结构表达时,时间就会被切碎、隐藏、私有化。
本质是用空间建模的方式耦合时间维度。
双世界理论
双世界理论主张:对于持续存在的系统,必须在建模上明确区分世界事实如何形成,以及世界如何被感知和呈现。
前提:任何在时间中持续存在、并且必须不断与外部交换信息的复杂系统,都同时面临两个要求:
- 它必须保持自身的历史连续性。
- 它必须持续吸收外部变化。
一个系统如果完全忽略外部变化,它会逐渐脱离环境,失去适应能力。但如果每一次变化都完全覆盖过去,那么系统也无法形成历史、上下文和身份。
因此,一个持续存在的世界,必须不断将新的变化纳入已有历史,使未来建立在过去的基础之上。
于是,系统会逐渐分化出两套相互协作的机制:
- 因果层:负责接收事件、解释事件、裁决关系变化、维护可解释的事实历史。它的核心资产是事实历史和裁决规则,待裁决事件作为输入进入裁决过程。它对应的是时间维度——事件的不可逆、因果的单向性。
- 感知层:负责感知环境、处理变化和形成体验。接触外部世界,把外部变化翻译成系统可以消费的信息。它对应的是空间维度——多元感官的同时展开、多种呈现方式的并行存在。
两者通过持续反馈形成闭环。
外部世界 → 感知层检测 → 上报事件 → 因果层裁决
↓
外部世界 ← 感知层呈现 ← 消费事实 ← 下发事实
因果层
有一个古老的哲学问题:世界是由什么组成的?一类回答是实体,对应面向对象;另一类回答是关系与过程。因果层根植于后者,即过程哲学。
状态只回答"世界现在是什么样"。但持续存在的系统还必须回答"世界为什么会变成现在这样"。
因此,因果层的本质是维护世界的历史连续性与因果可解释性。状态只是历史事实在当前时刻的投影——如果导致状态变化的事件不存在,状态本身就毫无意义。
外部世界对系统而言天然显得无序、并发、可能冲突。因果层通过裁决把外部事件解释为稳定、可追溯的事实历史:
- 合法性判定:请求是否满足生效条件?
- 语义转换:这个事件在上下文中意味着什么?
- 冲突裁决:多个事件矛盾时,哪个版本进入历史?
感知层
感知层回答:世界如何被体验和呈现。
因果层产出离散事实。感知层把这些事实展开成连续体验:界面刷新、动画过渡、声音反馈、震动提示、数据可视化。"保存成功"从一条记录展开为进度条填满、对勾出现、提示淡出。
在事实与事实之间,感知层是自由的。
它可以插值,可以预测,可以编排。按钮可以按下缩放,数字可以滚动增长,页面可以平滑切换。这些都是局部状态,只影响呈现,不影响世界本身。
感知层的组件按空间组织。空间层级取代调用链,成为组件之间的组织方式。一个下拉菜单被嵌套在导航栏里,会跟随导航栏一起移动。
感知层只读事实,只维护局部状态,天然无竞态。多个组件可以并行展开。
唯一的约束在交接点。新事实到达时,感知层必须承认最新版本,并迅速切换。
最终因果一致性
任何需要形成稳定世界的过程,都不能允许事实长期悬而不决。
因果层一旦做出裁决,系统就要在有限时间内收敛到该裁决所确定的事实版本。这就是最终因果一致性。它强调:
- 呈现可以滞后
- 感知可以插值
- 局部可以暂时不一致
但在有限空间,有限时间内,所有参与者最终必须面对同一个事实版本,形成完整可追溯的因果链。
宏观世界永远没有真正意义上的并行。
你可以把它理解成:
宏观系统可以存在大量并行的变化,但如果这些变化需要共同构成一个稳定世界,它们最终必须被纳入同一个可解释的历史。
这很关键。我们感知中的"同时"——两个人同时挥剑、两颗子弹同时命中、两个线程同时运行——本质上都只是局部观察下暂时无法分辨先后。
但只要世界需要给出结果、状态需要收敛、事实需要成立,系统最终就必须形成一个可解释的因果顺序。否则世界无法稳定。
这其实就是裁决为什么不可避免。
比如游戏里的"同时攻击":两个角色同时砍死对方。看起来:
A hit B
B hit A
同时发生。但因果层一定要回答:谁先死亡?死亡后技能还能不能触发?吸血效果是否成立?死亡爆炸是否发生?仇恨归属怎么算?
于是系统必须裁决。哪怕玩家感觉是同时、动画也是同时、特效也是同时——因果层仍然必须裁决。
数据库事务:多个用户同时修改余额。物理世界里 CPU 并行、网络并行、请求并行,但数据库必须裁决先后顺序。否则钱会凭空消失、状态腐化、世界失真。
版本控制:多个开发者同时修改同一行代码,Git 会尝试自动合并;如果冲突无法自动解决,就必须有人工裁决。
法律系统:两个人互相指控,但法院最后一定形成一条可叙述的因果链。因为社会秩序和媒体大众都需要一个"事实版本"。
操作系统:成千上万个进程同时争夺 CPU、内存和 IO。物理世界里中断并行、调度并行、资源请求并行,但操作系统必须裁决执行顺序。否则死锁会冻结整个机器,饥饿会让任务永远等待,系统会崩溃。
区块链:全球成千上万个节点同时广播交易、争夺出块。网络里消息乱序、节点并行、提案冲突,但共识机制必须裁决哪条链是权威版本。否则双花会掏空账户,分叉会分裂账本,信任会崩塌。
宏观世界这个词非常重要。因为微观层面,可能确实存在:
- 量子叠加
- 概率态
- 真并发
- 非决定性
但一旦进入宏观层面,世界就必须收敛成可叙述现实。
为什么?因为宏观系统需要稳定因果。
否则:
- 无法观察
- 无法推理
- 无法协作
- 无法预测
- 无法治理
换句话说:文明本身就是建立在最终因果可排序之上的。