尝试从有关信息的角度出发,解释一下 Roam Research 如何通过重新定义信息的表示信息的组织信息的交互,带来生产力工具的复兴。

信息的表示

人们在接触 Roam 时总是会先注意到它不用于文件柜的信息组织形式——网状结构,而信息的表示是比较容易忽略的部分。但我认为 Roam Research 中信息的表示和信息的组织同样重要,它反映了 Roam 的设计者如何看待什么是信息人脑如何处理信息这两个问题。

原型模式(Prototype Pattern)

在开始介绍之前首先来介绍一种设计模式——原型模式(Prototype Pattern)。Douglas Hofstadter 在 GEB 这本书中提到我们大脑工作的方式就是基于属性的原型建模

书中举的一个例子是体育评论员解说一场比赛,当他谈论到一个你一无所知的新秀时,会从另一个为人所熟知的明星球员 A 身上提取特点来描述这名新秀,例如“速度快、平衡好,擅长寻找防守中漏洞的特点”,这个时候就可以看成新秀继承了明星球员 A 所有你熟知的属性。

同时,新秀的身上可能又有另一名球星 B 的影子,解说员于是说他跑起来像 B……直到这名新秀球员在你心中,成为了非常具体的体育运动员。

而即便他成为了非常具体的实例,他可以作为一个原型类来使用,也就是说到了下个赛季出现了另一名新秀,解说员可能会说他的某个特点让他想起了上个赛季的那名新秀。

这就是基于原型的建模。球星 A 是新秀的原型,新秀又成为了别人的原型,原型可以不断派生出原型。其中蕴含的哲理是:哪怕是最具体的实例也可以作为某类事件的通用例子

Douglas Hofstadter 在谈到原型模式时这样说道:“这种具体中带着普遍性的思想具有深远的意义。

Steve Yegge 称原型模式为“普适性”设计模式,是他知道的最好的用来设计开发性系统的原则,用它设计出来的系统往往能够经受住时间的考验。虽然人们可能没有意识到,但是原型模式出现在了各种编程语言和应用系统中,如 Lisp、Eclipse、Wyvern、XML 和 Bigtable。

Figma 前设计负责人 Rasmus Andersson 说过 Figma 的 Component 是他做过最创新的设计,在他这篇博客中同样提到了Figma Component 借鉴了 JavaScript 原型的思想。

Roam 中的原型继承

回到 Roam,如果说 Block 的内容描述了一个原型的属性,那么 Block reference 则实现了原型的继承。

当我们在一个 Block 中使用 Block reference 引用另一个 block 时,实际上相当于一种属性的继承——当我要描述一名新秀的特征时,完全可以引用另外几名其他球星的特征来进行说明,而不需要从头进行写起。

在 Roam 中的具体操作是

  1. 找到球星所对应的 Block
  2. 拷贝它们的 Block reference
  3. 粘贴到新秀的 Block 下
  4. 同时复制球星的所有属性(Roam 提供了快捷操作)

这样新秀就继承了这些球星的全部属性,下次当我们再次看到这个新秀的 Block 时,就可以通过这些从其他球星那里继承来的属性,构建出我们对它的理解,比如速度快、平衡好,擅长寻找防守中漏洞的特点。

无限层级的 Block 嵌套结构也允许我们使用这名新秀再去定义其他的球员,换言之,Roam 提供了一种可以无限 Remix 文本的能力。因此,Roam Research 不是关于记笔记,而是笔记的复用

通过 Block reference 继承原型最大的好处在于,即使用自己的语言重写的内容,仍然能够保留原来的原型之间的继承关系。所有修改不再是复制、粘贴后产生的冗余副本,而是相同信息的不同版本,这种原子性降低了在相似、重复信息中搜寻信息的成本。

信息的组织

Tiago Forte 在《渐进式总结》中说:“把内容从一个地方转移到另一个地方不是什么难事,真正的挑战在于,知道什么内容有价值,并且建立一个系统,将现在学习到的知识转移给未来,这样才能在未来需要时,方便的调用”。

在 Roam Research 对信息最重要假设就是信息输入的位置不重要:不像抽屉柜和基于目录树的 Wiki 那样,Roam 中每一次的记录和创作不需要考虑系统现有的信息结构,例如提前规划记下的内容从属于哪个分类、或应该被打上何种标签。

分类的缺点在于作为一种索引信息的方式它的可扩展的性太低:同一个在一个时间点只能被划分到一个分类下,这导致对分类准确性要求很高:如果定义的分类太粗,每个分类下内容因为数量多,可发现性就很低,但如果如果分得太细,因为类目数变多,类别自身的可发现性就降低了。

标签系统其实也好不到哪里去,虽然同一篇内容可以被打上不同标签,但是后期在根据标签查找内容时仍旧需要从一大堆松散或耦合度很高的内容中找到自己感兴趣的某一个段落。

Roam 中 Daily Notes 的设计就是为了让信息以线性的方式输入系统,你完全可以利用写下语句中现成的语料,创建双向链接,为未来的自己建立召回信息的通道。

双向链接

Roam 通过双向链接打开了通往过去和未来路径,帮助使用者在自己的过去和未来之间进行协作。不同于 Notion 的 backlink 指向一个 Page,而 Roam 的双向链接是以 Block 为单元,并以 Page 作为容器进行聚合展示。

看起来反向链接是在找 Page,其实是在找 Block。这种细粒度的信息管理机制让它很快在所有笔记软件中脱颖而出,被很多知识精英用来实践 How to Take Smart Notes常青笔记这些记笔记的方法。

双向链接利用 Block 语句中的元素建立索引,很像搜索引擎中的反向索引(inverted index),在必要时用户还可以创建具有更高抽象层级的标签,对 Block 进行标记。

当然在绝大部分时候,你都不需要这么做,而仅仅只是敲下双方括号!这种轻量级的交互带来的优势会在下一个章节中提到。

和搜索引擎几乎一样的是,Roam Research 提供了基于双向链接的集合运算——通过使用 AND、OR、NOT 这些逻辑运算对自己感兴趣的 Block 进行检索(Filter+Query)。这种灵活自定义查询的能力,不就是知识库搜索引擎的 NoCode 实现吗?

只有在需要时(例如整理或 Remix 信息),才通过双向链接从各个地方收集笔记的概念,类似于软件工程领域里的好莱坞法则控制反转)——“不要打电话给我们,合适的话我们会打给你”。

同时由于双向链接本身就是一个 Page,而非一种元数据(标签),它下面的 Block 可以用其他双向链接进行索引,因此能构建出图(网状)的结构。图(网状)结构最大好处在于,你可以总是可以根据事物之间的某种联系,经过几次跳转,找到一段内容或者信息。

我们完全可以将双向链接看成某种地位更高的 Block (原型),只不过它们本身可以用来对内容进行检索,因此通常我们会为自己所熟知并且有区分度的概念建立双向链接。

信息的交互

如果说 Block reference 提供了 Remix 发生的信息的表示,而双向链接提高了信息组织的效率,那么信息的交互则是用户体验的关键。

输入阶段

因为每一次双向链接的创建都不会中断当前的工作流,不需要关心在哪里文件下创建,甚至不要关心你所提到的这个双向链接是否存在。

每一次的敲下方括号都是在当前的上下文中,而不是在搜索框中进行搜索。通过自动补全让填空题变成选择题,不仅可以消除歧义,绝大部分时间还能让你少打几个字,不会中断当前的思路

Remix 阶段

Remix 是一个不断回顾旧的知识体系,并且将已有想法编织成新的想法的过程,为了方便用户在在编辑目标文本时参考或引用原始内容,Roam Research 提供了 Sidebar,降低了因为环境切换带来的心智负担,增加了大脑的缓存区域。多通道的信息呈现形式,同时也增加了信息双向流动的带宽。

思想放大器

“假设你希望能够实现的一些见解飞跃。为了实现这一飞跃,你通常需要同时演化出许多独立的、部分成型的想法,直到它们在灵感的闪现中突然汇合。如果你需要同时迭代几个以上的作品,把它们全部记在脑子里可能是一件很难的事”。—— Andy Matuschak

写作往往来源于交流和阅读过程中,因为共鸣而产生的强烈观点,抑或是经过一系列开放性研究后,想法在重新连接、组合后的自然涌现,而非确定了一个写作标题后,寻找支持你观点的论据的过程。

Roam Research 借助双向链接这种在相互关联的信息之间建立连接,通过 Block reference 沉淀已有想法之间的关联,发展出新的想法,让使用者获得思想的复利,而寻找、收集、连接想法,这一切过程都不是发生在脑子里,而是以极其简单的动作和交互来完成。