Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。
文章代表作者个人观点,少数派仅对标题和排版略作修改。
保尔·格鲁塞(Paul Grousset)所说,「当代资本主义没有丝毫发明」。阿尔芒多·萨波利(Armando Sapori)进一步指出:「直到今天,人们不能找到任何东西,包括所得税在内,在天才的意大利共和国没有先例。」
Roam Research 在知识管理圈子里面非常的热门,以至于引来了很多的竞品。但是 Roam 创新了哪些,又被模仿者们模仿了哪些?当我在与葫芦笔记作者沟通的时候,感觉他们似乎并没有意识到,其中有一些对一部分人看起来很自然的事情,对另外一部分人来说并不自然。
应该说,Roam 的语法体系和操作习惯,有很多并不是创新而是有所继承,同时也带来了很多的历史包袱。在 geek 眼中很舒服的事情,然而在普通用户眼中却存在学习障碍和学习成本。这些选择加和在一起,就构成了一个新软件的体态和灵魂。
下面我简单的列出一些我注意到的 Roam 的「历史包袱」。
首先我们要注意到的是,Roam 的编辑器隐含了「状态」的概念——编辑状态和视图状态。当你点击进一个 block(块)的时候,就会进入编辑状态,所有的标记都会直接显示成文本;如果你退出一个块的时候,所有的标记就被「渲染」,显示出链接、加粗等格式。
很多上古的编辑软件是有状态概念的,比如早期 DOS 时代的 WPS。或者 Linux 下面的 VIM——你用 esc 退出编辑状态的时候,就可以用键盘移动光标,输入状态和操作状态是区分的。而 Emac 选择了另外一种方式,用 Ctrl+快捷键来控制光标,把编辑模式和光标移动放在一个状态里面。
而随着 Windows 以及 Word等软件的兴起,代表了 wysiwyg(所见即所得)范式的流行。这种先编辑再渲染的情况,在用户侧变得越来越少了。而编辑器状态这个技术路线,在模仿 Office 系列的在线编辑器里面也变得极为少见。印象笔记和其他主流桌面软件里面并不会有编辑器状态。Notion,Workflowy 等新兴笔记软件,也不会有。
相比之下,带编辑器状态的软件反而是「少数人走的路」。
要讲到编辑器状态,就要讲到 markdown 语法。因为 markdown 是一种标记语言,你用到标记语言的时候,就必然引入了编辑状态和渲染状态。
Markdown是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber)。它允许人们 「使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档。
Roam 保持了对 markdown 语法的一定程度的兼容,使得他可以在部分笔记软件之间进行横向的迁移。但 Roam 的块编辑的特性,实际上又一定程度的损害了 markdown 语法的完整性(比如把 h1 语法抛弃了)。
markdown 保持了写作者对写作细节的直观的控制力,提供了一种「显式」的编辑体验。比如插入链接,就可以直接看到链接的内容。在 Word 里面,这些内容是隐藏的,需要通过额外的操作去处理。相对于 HTML 这样的标记语言来说,markdown 在保留渲染效果的自由性的同时,又提供了适当的简化。
然而,再简单的标记语言也是语言,同样引入了复杂度。
Roam 里面,页面跳转语法用的是 [[ ]] 符号,这个符号在 markdown 里面是不用的,在 Wiki 体系里面用的很多。
Wiki 是开放且可供多人协同创作的超文本系统,由沃德·坎宁安于1995年首先开发。沃德·坎宁安将Wiki定义为「一种允许一群用户用简单的描述来创建和连接一组网页的社会计算系统」。
Wiki 的构想来自他自己在 1980 年代晚期利用苹果电脑 HyperCard 程序作出的一个小功能,这个功能就是在加入特殊符号之后,程序就会为用户产生一张卡片。
Wiki 使用 [[]] 语法来作为页面之间的链接,用户可以随意的书写和扩展,新增自己想要新增的页面。然而,极高的自由度的反面是行为难以控制,因此为了保证内容的质量,大部分 wiki 系统或其所创建的社区都有一系列错综复杂的策略和指导方针,用以对用户的使用行为进行有一系列的规则控制。与此同时,由于页面书写的复杂度直线上升,wiki 往往还定义了大量的次级语法。比如,维基百科就定义了大量的和百科全书有关辅助语法,甚至包括一部分 html 的语法。
Roam 中 [[ ]] 包含的是页面标题(title),而 # 语法用来表示标签(tag),两者没有明确的区分。在社交网络比如 twitter 中,# 用来表示标签,你可以通过 # 来进入相关标签的主题页面,而在饭否里面,你需要用 #标签# 这样的语法——不同社交网络对 # 的语法支持并不完全一样,行为也有很大的差异。
在葫芦笔记中, [[ ]] 和 # 是同级别的,都会引入新单页面。命名问题必须在用户使用层面去解决,否则在列表中就是一团混乱的情况。而在 Obsidian 里面,# 被处理成一种搜索的入口,用于主题的汇集,默认并不会建立新的页面,这在一定程度上避免了混乱。
Roam 的树形结构,可以看做是一种大纲。大纲不是一个新鲜的东西。Word 里面有大纲,OneNote 里面也有大纲。编辑器里面有大纲,导航里面也有大纲。
雪小豹提到,Workflowy 等软件的创新,就是在传统的大纲中,在展开、收起等细节上面进行了的创新。帮助用户用键盘就快速的导航,把一个大纲做出了新的高度。幕布等软件继承了相关的创新成果。
而 Roam 作为一个大纲笔记软件,也继承了这样的创新成果,在操作上提供了很多的便捷性,但与此同时也引入了大纲的复杂性:大纲结构的多层次化,造成的层次不清晰;大纲结构和末端输出的平面化的要求的差异,造成大量的二次加工的必要性;大纲节奏始终处于强烈的不稳定之中,会造成和输出结果的大量的偏差。
提到双链的时候,很多文章 将其直接延伸到 Project Xanadu 这样的互联网早期项目,或者是 Wiki 这样的网络化的写作,然而我觉得 Roam 中的双链更像是一个互联网世界里面接近消失的东西:Trackback 和 Pingback。
TrackBack是一种网络日志应用工具,它可以让网志作者知道自己的文章的读者中有哪些人撰写哪些与之有关的文章。在 Movable Type 和 WordPress 软件中,包含有该功能。该功能通过在评论中显示引用者的文章链接和评论内容,实现了网站之间的互相通告;实现了网志间的沟通互动,使得更多人加入关于一个主题的讨论。
Pingback 出现完全是为了解决Trackback的诸多问题。Pingback 可以译作「自动引用通知」,因为 Pingback 的使用是完全自动的。
Wordpress 支持 pingback 或者 trackback 功能,比如我的某一篇文章就有三篇 pingback,WordPress 的处理方式是把 pingback 和回复互动放在一起。不管站内互动还是站外互动,都视为网络互动的一个有机的组成部分:
Pingback 在 blog 发展的历史中占据了一席之地,也随着 blog 的没落而一并没落。pingback 带来的网站之间、网站内部信息的自动化的互联、提示,但与此同时,由于是被动引用,对方 pingback 并不需要经过博主同意,也额外带来了大量的垃圾引用。还好 wordpress 的处理方式是把 pingback 和留言同等处理,用反垃圾插件进行清理之后,总体还属于可控状态。
而 Roam 的双链可以理解为一种站内的 pingback,一旦你在另外一个 block 中提到了这个 page,就会自动显示在这个 page 下方,也会附带 page 标题、block 子节点等内容。
一位朋友提到,印象笔记奠定了笔记软件三栏布局的基调。一个目录树,一个笔记列表,一个编辑界面。这种三栏式的布局有利于大规模的信息组织和编辑,是后来数据仓库的视觉设计的基础。这样的设计使得搜索信息变成了一个由粗到细的过程,每一次导航,基本上你只能从目录-列表-笔记-笔记内容这样一个序列去访问,在不同笔记内部的跳转是困难的,因为每一次进入笔记都会回到笔记的顶端,而不是上一次阅读的位置。
而 Roam 的双栏设计,是一种很有趣的创新——创造了一组卡片的意象。通过卡片式布局,部分替代了系统窗口布局体系,改变了浏览的动线,带来简洁高效的效果。
其页面下方的引用列表是对过去笔记列表、搜索结果的倒装的技术安排。双链引用区域,降低了列表入口的重要程度,提升了单个页面的重要程度。
与此同时,双链引用区域也可以理解为一个搜索的入口,你用任何关键词创造一个页面,都可以看到没有建立链接但包含相应关键词的页面列表。这实际上也创造了一种新的布局。
从数据层面,归根到底,Roam 是一个树的结构。数据库-页面(page)-块(block),构成了一整颗树。page 下面实际上还有一层节点可以独立出来,因为筛选功能只针对page下面的第一层block发挥作用。每一个block在特定的时候都可以作为页面标题(page title)存在,如果点击进去的话。
所以和思维导图一样,不管这个体系多么漂亮、复杂,他最后还是一棵大树。而这棵树基于的是一种叫做 Datomic 的数据库,以 block 为颗粒度,记录了节点的各类信息。
随着 Roam Research 的大热,双向链接和基于 Block 的笔记软件层出不穷,而他们(logseq、Athens)无一例外都采用了 Clojure 技术栈的 Datomic / datascript Datalog 数据库,这不免让我感到好奇想要深入探索一番。
这个技术路线,就和其他的一些新的笔记软件形成了差异。Logseq 和 Obsidian 都选择了本地的纯文本文件作为基础。
Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.
Obsidian is a powerful knowledge base on top of a local folder of plain text Markdown files.
张小龙在2021年微信之夜上讲到对视频文件的看法,可以用来比照数据库和本地文件的差别。
说到视频,大家会想到手机相册里面的视频文件。就像朋友圈,只能上传相册的视频。我们也确实是通过这个方式,来希望朋友圈里的视频更多的是用户自己拍摄的视频。从 Windows 转到苹果手机的用户,都会遇到一个问题,以前的文件和文件夹去哪里了。在 iOS 里,没有了文件的概念。文件被各个应用自己定义了。这是把文件应用化了,即文件不能脱离应用而存在,一旦脱离了,就是没有意义无法解释的数据。
原始视频只是数据,它没法关联到其他信息,如创作者,观众数,评论等。它还需要存在本地,数据丢了就丢了。因此未来的视频应该是一种结构化数据。它存在云端,有所有的创作者信息,有观众的互动信息,能够很方便的分享。
我的答案是,云端化的结构化的视频,才是视频,本地的视频文件,反而是裸数据,是应该被淘汰的。所以你看到的朋友圈里的视频号的视频,和现在的本地视频的展现没什么区别。
因此,在数据库和本地文件之间的选择,也是技术路线的一个重要的部分。顺便说一句,Obsidian 的做法,让我想起来一个笔记软件叫 nvALT,也是基于 .md 文件的,支持 [[ ]] 跳转,只是不支持图谱。
应该说,将 (()) 所带来的块引用的语法和动态更新机制,与 block 级别的引用相结合,是 Roam 技术路线的一个特点。两者产生的很多新的化学反应。
根据 tomzheng 的总结,这种动态引用实际上一个名字叫做 transclude(嵌入):
还有一种大纲,叫做文学编程,在tiddlywiki中叫输入transclude,文学编程并不只是和编程有关,而是可以用于写文章,意思就是将几篇文章合成一个文章。loeeditor、orgmode、tiddlywiki具有输入的功能,类roamresearch的软件roamresearch、obsidian、roamedit也有这个功能,roamresearch是双圆括号,obsidian是叹号加双方括号,tiddlywiki是双花括号,loeeditor和orgmode事noweb。
在 Mediawiki 中,采用 {{ }} 符号来引入模板,同样也实现了动态修改以及多层次的引用。而根据 mediawiki 的解释,这个词语大概在 1982 年就已经被创造出来了:
Ted Nelson coined the term "transclusion", as well as "hypertext" and "hypermedia", in his 1982 book Literary Machines.
编辑器战争源远流长,知识所限,我就写到这吧。
自由越多,限制越多。Roam 选择了这样一组自由度很大技术组合,造成其对使用者的知识层次要求很高。一方面有利于开拓高端用户,形成口碑,另外一方面也潜在的限制了发展的广度。
任何工具软件,都是对现实行为的抽象。应该说,大纲在现实中是常见的,但无限深度的大纲并不常见;卡片是常见的,但卡片的使用场景十分有限;卢曼的故事很有吸引力,Roam 的技术组合却很 geek。所以,让我们祝 Roam 一路走好。
> 下载少数派 客户端 、关注 少数派公众号 ,了解更妙的数字生活 🍃
> 想申请成为少数派作者?冲!
© 本文著作权归作者所有,并授权少数派独家使用,未经少数派许可,不得转载使用。
还没有介绍自己
Roam 漫游研究所:欢迎一起学习探索 Roam Research 的技巧、方法论和用例。 #roamcult #RoamResearch #RoamCN #[[]]