在一次面向本地优先(local-first)软件的会议闭幕演讲中,Seph Gentle 表示,未来可互操作应用的发展,取决于一种更强健、更可持续的数据格式。他认为,当前的软件生态陷入了一种“伪二选一”:传统本地软件虽然保留了数据控制权,但往往被限制在单一设备上;而云端软件虽然提供了便利,却经常将用户数据锁定在中心化服务之中。
为了解决这一问题,Gentle 提出了一个概念性的“本地优先操作系统”:程序之间共享一个统一的数据层,使它们能够独立演进,同时保持完全兼容。演讲的核心主题之一,是对持久化 Schema 格式的需求。Gentle 认为,一个高质量的数据格式必须具备自描述能力、静态类型系统,并能够在长期时间跨度内保持兼容。此外,它还应该能够保留自身尚未理解的外部数据,并针对高效网络同步和数据流传输进行优化。

为了实现这些目标,Gentle 提出了将 Schema 直接嵌入文件头的方案。这种方式允许任何工具在不需要单独分发 Schema 文件的情况下,检查并解析数据。他将这一方案与 Protocol Buffers 和 Cap’n Proto 进行了对比,后两者依赖预先共享的 Schema;而 JSON 则被他认为过于冗长,且类型约束较弱,不适合作为长期保存的数据格式。
他通过一个实验性的 Rust 实现项目 schemaboi 展示了这些设计原则。在该系统中,Schema 被存储在每个文件的起始字节中,并会在文件打开时与应用程序内部的 Schema 合并。该类型系统支持布尔值、整数、浮点数等基础类型,也支持列表、映射等复杂结构,以及统一的 struct 与 enum 模型。关键的一点是,当字段缺失时,系统会使用默认值进行填充;而对于未知字段,系统会选择保留,而不是丢弃。这确保了即使不同软件版本之间存在差异,数据完整性仍然能够得到维护。

Gentle 还对不同类型的兼容性进行了明确区分。除了传统意义上的向后兼容(新应用打开旧文件)和向前兼容(旧应用打开新文件)之外,他还提出了“横向兼容”(sideways compatibility)的概念。这种兼容方式允许不同开发者在无需集中协调的情况下,独立添加新的字段。为了实现这一点,他建议使用全球唯一的字段标识符,而不是简单递增的标签编号,从而避免多人并行开发时出现字段冲突。
演讲还介绍了 Schema 演进过程中的安全准则。Gentle 指出,增加可选字段或新增 enum 变体通常是安全的操作。相比之下,将字段改为必填字段、重命名字段,或者修改字段类型,则被认为是高风险行为。他强调,应优先采用简单、渐进式的改进方式,并以电子邮件和 HTTP 等长期成功运行的系统为例,说明持续演进通常优于强制迁移。

在总结部分,Gentle 讨论了实际应用中的一些考虑因素,例如面向内容寻址系统的规范化编码,以及采用类似 ATProto 中 must_use 字段的设计。虽然基准测试显示,他提出的格式相比 JSON 在体积和速度方面都有明显优势,但他也提醒,该项目目前仍处于实验阶段。最终,他描绘的愿景是:未来的数据能够真正归用户所有,而不再依赖于创建这些数据的具体应用程序。
原文连接:





