纵观市面上的所有协作软件,无论是Google Docs 还是 Notion,还是 Mira 或者Evernote,优秀的协作软件必然由三个核心引擎构建:渲染引擎,协同引擎以及数据引擎
如何理解三个核心引擎,我们从用户视角来看:
渲染引擎:-
对于在线文档,渲染引擎就是文字编辑器。
-
对于在线表格,渲染引擎就是电子表格编辑器。
-
对于在线幻灯片,渲染引擎画布编辑器。
-
对于在线脑图,渲染引擎就是mind编辑器。
-
对于在线BI,渲染引擎就是布局设计器以及图表设计器。
-
....
协同引擎理解起来稍微复杂一点,协同引擎存在的目的,本质就是保持各个终端在展示同一个内容模型时,能够在单个操作消费到模型之后,模型保持一致,所以协同引擎需要处理操作涉及的各个阶段的情况:
阶段1 - 客户端发送操作,
-
操作等待同步给Server(其他协作者) pendingCommmands
-
操作同步给Server(其他协作者) sendingCommands
-
操作已同步给Server(其他协作者) sentCommmands
阶段2 - 客户端模型消费操作
-
操作作用于Model之后,客户端的Model应当与服务端的Model保持一致
如何保持一致,各个厂商之间各显本领,有JavaScript组合Nodejs,有Rust组合WebAssembly,有Java GWT组合JavaScript。
阶段1和阶段2在协同引擎是非常重要的,如何保持协作的即时性以及数据的一致性和健壮性,非常考验这部分的设计
数据引擎不同的协作软件的数据引擎是不同,例如:
-
Word - openxml的设计
-
Etherpad - 采用字符串 Z:1>6b|5+6b$Welcome to Etherpad!
-
Google Docs Word - 采用一个commands集合的设计
-
Google Docs Spread - 设计比较想Excel,但是使用的protobuf
-
Notion - 很明显是结构化的属性数据,并且使用CRDT的冲突解决数据结构
好的数据引擎通常有这些特点:
-
数据传输的稳定性
-
数据的可维护性
-
数据的存储性能
-
数据引擎不等于视图模型
-
天然支持数据冲突解决方案,扩展性看CRDT,性能看OT
-
对于其他软件导入导出的扩展度(例如在线文档导出Word)
如果你是一个在线软件创作者或者商业产品创业者,你需要去自研这渲染引擎,协同引擎,数据引擎吗?我的答案是不需要,你完全在Starup阶段,找到对应领域的合适技术选型,选择做出你协作软件的MVP,当自研能够成为你的壁垒或者优势,再选择自研。