🔒
发现新文章,点击刷新页面。
✇吕立青的博客

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?

作者 吕立青
这篇文章是使用 Gingko Writer 所写的,题图中 Gingko 的布局跟 Timestripe 视图是我思考的“引子”,从而开篇穿插了一大段「目标与执行」在 AI 背景下的关系重建。但重点依然是,Gingko 如何更好地围绕目标 Output 写作输出呢?让你的想法“写”出来,“放”到位。当然最后,别忘了人与 AI 在情感上的最大不同。

P.S. 这篇文章是由一个真实的人写的,来自真实大脑所激发的想法和创造力。我希望你使用 AI 自动总结这篇文章时,不会过度“模糊化”

始于“目标”,忠于执行

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?

在重度(每天多次)使用 Roam Research 和 Timestripe 数年之后,最近又重逢 Gingko Writer 的布局和交互,真的是深得我心。我才意识到,原来 Timestripe 这个我用了2年多的目标管理软件,似乎也可以用Gingko就能完全替代了?

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?
Timestripe 最具特色的时间线横排视图

Timestripe 的界面设计和细节,可以参考 @Miobowl 所写的这篇 Timestripe:什么样的待办软件才是最贴近生活的人生规划器 - 少数派

Telegram、Timestripe、Roam Research、Readwise Reader,对我来说分别是灵感(idea 数据)、目标(goal 数据)、笔记(note 数据)、资料(refs 数据)的集合,由此可见,我还缺少了一个系统性的输出工具,即写作(opus 数据)。

我在 Timestripe 设置了每日目标,然后通过日历同步到 Zapier 或 n8n,然后自动触发任务执行并汇总到 Roam Research,从而我可以在 Daily Notes 当中校对目标的结果并推进下一步,日拱一卒。我在之前的直播分享过一个 Import Google Calendar 的 [[roam/js]] 插件,所以Timestripe 里面安排的目标都会手动 pull 到 Roam Research 里面,每天一次就够了。后续对于目标的修改和完成的记录也是发生在 Roam Research,我的过程笔记 notes 都在Roam Research。

这里面其实暗合了 OKRs 的思路。只有当我将人生、年月季度的 Objective 自上而下拆分到每一天的执行,然后自下而上的输入(Roam Research 过程笔记),才是有可能真正去实现目标。我需要思考的如何去执行目标之下的任务,而且更应该思考如何更好地完成目标而非任务本身

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?
Roam Research 最棒的大纲和Sidebar侧边栏展开

任务的“执行”交由 AI

围绕目标之后的输入 Input 和输出 Output,让我收获了更有价值的成就感。但大语言模型的到来,破坏了这种获得感,LLM 天生擅长于“文字游戏”,AIGC 内容生成在输出端以降维打击之势碾压了人类。在频繁使用 ChatGPT 等 AI 工具之后,不自觉会把人类的弱点跟 AI 的优点对比,直面人本身的弱点的同时,还需要直面 AI 本身强于人的优点。这个过程那是真的难受,于是真正“作为人”的写作需要另外的工具。

对了,由于 Timestripe 我还彻底弃用了 Things3,我发现我没有管任务了,因为我的核心思考是:AI 时代 task 不重要了,至少 task 不应该是“人”来主导执行。在操作层面上,顶多在 Timestripe 里面记录一个 subgoal 子目标,而非 task。

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?
日、周、月、季度(年度、人生)的 OKRs 关系视图

所以,我更多的是在考虑如何将 Timestripe 的目标与 AI 联动,AI Agent 现在的规划能力偏弱,在核心领域人类的任务拆解能力尚处于绝对优势。

可以说,今后人的价值就在于做好任务拆解,把任务的颗粒度控制在合适的大小,AI是能够批量化、自动化高质量完成的;与此同时,在人机协同的和谐配合之后,对于个人来说,构建知识库、以及快速构建知识库的能力很重要。基于知识库的 RAG,以及如何调取 API、RPA 等第三方软硬件能力。

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?

我之前转发过 @Yangyi 一条很酷的 Tweet,也许可以开一个课程:《基于 LLM 与 RAG 的 AI 时代超级个体》(感兴趣的朋友可以评论或私信我了,众筹众筹 🐶),围绕软件和媒体,通过 AI Agent 自动化 build & sell,打造闭环,赋能个体 🤣

  • 🤖 杠杠率最高的:开发超级酷的 AI 应用
  • 🎬 杠杆率第二高的:做贼有意思的视频

另外一方面,当 OpenAI 的 GPTs 可以让每一个都轻松构建私人助理,那么知识库的质量就尤为重要了,甚至是直接决定了后续 RAG 或 Workflow 执行流程的质量,而非单纯的 prompt 就能教会 LLM 那大学生水平的大脑。@Skyline 的实践经验在于:人工把控源头的精确,而让 AI 负责细节的调控。

  1. 精确获取高质量的官方信息源,而非玄学小红书运营防雷内容
  2. 加入高质量的付费内容,将实战专家的可验证规模化经验作为补充
Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?
@Skyline 的小红书 GPTs 截图

回归正题:Gingko 让想法“写”出来,“放”到位

Gingko 官网的 Slogan 是 Let Your Writing Flow,也就是让你的想法自由地流淌到位。

Let your ideas flow freely into place,自然而然地形成,流动到妙手偶得的位置。

"文章本天成,妙手偶得之。" —— 南宋陆游《文章》
Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?
Gingko 独创的 Flow 流式视图,专注输出

张玉新老师在群里说推广 TB 很有成就感,于是又推广了一下小众的 Gingko,他在人生尺度的记录,从逻辑维度看,都在 TheBrain 中;从时间看,都在 Gingko。建议看看张玉新老师的记录示例 https://gingkoapp.com/2021-pub 和关于《学习之道》的分享 https://gingkoapp.com/art-of-learning ,从而感受一下 Gingko到底是算什么形式?大纲?列表?卡片?可能只有对着屏幕边画边说,才能讲清楚。

Gingko 主要是在你面对一项重大的写作项目(比如论文、专栏、出书等),或者试图将生活的各个方面都整合在一起时,问题在于:你会如何进行组织呢?

你可能会在纸上先写一个最简单的列表?或者是用一个数字化笔记,比如在 Roam Research 从大纲开始写层级?或者说,拿起一叠纸质索引卡?先随便写,然后再自由组合起来?

那么,为什么不同时选择上述所有的选项呢?Gingko 创造了一个简洁界面,让你可以同时使用列表、大纲和卡片。这带来了自由,你可以从任何一种形式开始,灵感闪现一张卡片,或者深度思考几条核心观点,又或者发现了卡片之后的关联关系。这种自由和专注,形成了 Flow。

就像我作为程序员,特别偏好于使用键盘快捷键,而在 Gingko 当中卡片的导航、链接和展示都可以纯键盘实现,再次保障了 Flow 的流淌。

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?

作为软件工程师的Patrick也提到,这是曾经遇到的唯一一种写作方式,它让自己能够一次性将所有想法表达出来,并同时保持有条不紊。我觉得这比 Emacs 或 Vim 模式下的诸多扩展,多了一层可视化的思维展开。

Gingko 对于其他写作模式的融合

Gingko 作者,开篇就提到了「攻读博士学位很痛苦。」为什么?对于任何写过论文、小说或其他大作品的人来说,(组块)大小在保持专注力方面很重要。我尝试了各种文字处理软件、大纲工具、思维导图、维基和tiddlywikis……但是发现没有任何工具能够组织我需要写的所有内容,随着内容越来越多,立马会变得令人不知所措

  • 思维导图的价值在于一致性放置(思维在空间推理方面很擅长),也就是将相关概念或主题以一致的方式放置在图的特定位置可以帮助大脑更容易地理解它们之间的关系。
  • 大纲的价值在于层次结构的力量,也就是将主题和子主题层层分解,有助于将信息分成可管理的部分。并且在 Roam Research 这类软件当中,可以非常自由调整父子主题的位置,即指代了层级和同级的关系,并且还能轻松合并同类项。Roam Research 还可以同层级展开或折叠节点,在深入某个局部的同时,保持对整体结构的鸟瞰。
  • 而 TiddlyWikis 的价值在于通过使用卡片或内容块来获得专注。慢慢地,使用一个卡片的层次结构的想法开始形成,而且不隐藏任何卡片。每个卡片或内容块都可以视为一个独立的单元,用户可以直观地将其组织和排列。当你专注于一个个小的信息单元,而不必同时处理大量的内容,这种分块的方式有助于减少认知负荷,更容易专注于当前的写作任务或主题。

Gingko 在 UI 设计上是通过灰度来高亮正在编辑的卡片及其左侧的父级卡片,但同时也会显示其他所有层级的内容,只不过会降低灰度从而弱化存在感;

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?

更重要的是,会自动将当前编辑内容始终处于屏幕的最中间,就像《使命召唤》游戏中的飞机轰炸视角但始终瞄准,从而极大提高了专注度。Gingko Writer 能够让你自动做到总是在写小组块内容,即“卡片”,这是取得进展的唯一途径:

  • Break your work into small chunks. 将你的工作分成小块。
  • Focus on one at a time. 一次只专注于一个。

让 Gingko 专注于写作输出

就如同 Gingko 重构后的新网址 (writer) 一样,https://gingkowriter.com 我目前也是让 Gingko 专注于写作输出 (writing),跟 Roam Research 的过程笔记作为输入,简直绝配!这篇文章的创作就是一次试验罢了,想法和资料的整理在 Roam Research,但是结构成品是在 Gingko,写起来非常愉快。

Gingko 跟 Roam Research 比还差一个 card ref,如果也能直接“穿针引线”的话,那简直就是绝,但我觉得可以互为补充。Roam Research 强于记录,但是写作输出则是另外一条逻辑,Roam Research 反而过于发散而无法专注。写作应该化网状为线性,根据 Gingko 作者的初心(写论文),我觉得 Gingko 在系统性输出上会更友好。

也不确定,反正我之前在Roam Research尝试写专栏文章(此处愧对 @Sainho 少数派编辑),单篇篇幅动辄就是几万字了,没法看,最后导致我直接放弃咯 🤣

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?
夭折的《Roam Productivity 漫游生产力》专栏

Roam Research 的灵活度与发散主要体现在 block ref(块引用),block embed(块嵌入)用得飞起,结果就是上下文插入过多,主线就不够清晰了,大纲 Outliner 这种其实也不适合项目或任务管理,甚至也不适合写作(成品输出),我现在也很少 all in one 甚至杜绝 all in one Roam Research。或者说,已经断了执念all in one 任意一款软件啦,哈哈哈

群友 @赣中 在讨论很多 APP 的功能视图都能在 Roam Research 实现,包括 Timestripe和 Gingko,我之前做的「Roam卡片式主题」灵感就来自于 Gingko;但是 Roam 不固化 Pattern,终端用户是没法用的。就像你要开发个应用,你把字段设计好了,存 DB 数据库里了,然后你跟用户说你会写 SQL 吧,你自己查吧,应用层面的 UI 咱就不做了。

其实对于工具的选择还是因人而异,Roam Research 的根基 pattern 就是 outliner,这是我用得最顺手的 pattern(模式),也许跟每个人的大脑偏好有关:

  • 有些人的pattern可能是folder,
  • 有些人的pattern可能是tags,
  • 有些人的pattern可能是mindmap,

更高阶的,

  • 有些人的pattern可能是TheBrain的父子兄
  • 有些人的pattern可能是Excalidraw自由白板
  • 有些人的pattern可能是纸笔,自带边界限制

Heptabase 原名 Project Meta,就是你所说的定义好字段,然后推出一堆的 Meta Apps(现在官方也有3、4个咯),本质上就是结构化数据之上的pattern,即应用。

Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?

以“人”为本,实践出“喜欢”

如果要说“最”喜欢的某种 pattern,那其实就只能选一种,但凡宣称所有 pattern 都支持的,可以灵活供选择的都是骗子。或者说,在最合适的场景下,应该选择最合适的 pattern 吧!或者换个角度来说,“人”相较于 AI 所能探寻的情绪价值是更重要的,“喜欢”本身就需要实践和时间。越用越喜欢的工具,哪怕忍受它的各种问题,一定是因为它那 20% 最特别的地方吸引了最独特品味的你。

哪怕是 Gingko,也有不同的用户用在不同的场景中,衍生出了不同的 pattern。大家可以看看官网中的 Examples - Gingko App 里面有论文写作,也有 GTD 的示例。

最后,总结一下在写这篇文章时,使用 Gingko 的几个严重问题:

  1. 无法插入图片(不支持任何附件,纯 Markdown 语法)
  2. 如果使用 md ![]() 插入图片,拖拽就会失效(由于图片显示时的尺寸刷新问题)

当然,使用 Gingko 也有几个爽点:

  1. focused 的感觉真的强,特别是淡化其他卡片和居中当前卡片的显示效果
  2. 移动+合并卡片等快捷键,使用Alt+方向键,真的舒服,卡片在指尖流动!
  3. 全屏编辑的效果,Shift+Enter,让人瞬间 focus 的同时保留了上下文。
Gingko Writer:在 AI 随便生成 20 万字的时代,“生而为人”该如何写作?
全屏编辑时,显示的是正常阅读的线性顺序

那么,朋友们!等我先实践一波:Input 都放 Roam Research、Output 都在 Gingko,看看我能不能疯狂输出几篇文章?也欢迎留言与我交流,这篇文章的可读性,是否会比我之前的文章更好一些呢?

✇吕立青的博客

序章:为什么都 2023 年了,我还在用 Roam Research 写笔记?

作者 吕立青
序章:为什么都 2023 年了,我还在用 Roam Research 写笔记?

展信佳,

曾经有无数新的笔记工具摆在我面前,我没有珍惜,等我失去的时候,我才后悔莫及,人世间最痛苦的事莫过于此。如果上天能够再给我一次机会,我会对那个笔记工具说三个字:我选你。如果非要为这个选择作出一个解释,我希望是……这份信。
序章:为什么都 2023 年了,我还在用 Roam Research 写笔记?

📝 笔记工具市场:Roam Research 的模仿者

在工具层面,同类型对比时,唯一的对手只有 Logseq,同为 Clojure & ClojureScript 开发,文学编程的默契“同源”。而且 Logseq 是开源的,融资额 400w 美元,现金充裕,生态很好,之前的 Roam Research 大V Ramses Oudt 被雇佣专门做 Marketing,最新官网的描述也很棒:Logseq: A privacy-first, open-source knowledge base.

Obsidian,作为最先的模仿者,但是选择了 Markdown 文件作为载体,所以受限很多,跟 Logseq 相比而言,在数据格式上并不占优。Logseq 和 Obsidian 都主打 local-frist,私有化数据,就像 Obsidian 的口号:A second brain, for you, forever.

但是对于普通用户来说,并不关心背后的 Markdown 或者是 Datalog 数据库,所以依然需要同步,自选方案当然有,比如 iCloud,但是 Apple 确实拉胯,导致基于文件系统的同步体验着实很差, 并且经常可能出错。

💰 商业化变现:Obsidian Publish 和 Logseq Pro

于是乎,Logseq 和 Obsidian 这对难兄难弟都选择推出了自己的 Pro 服务,即自带云同步。Obsidian 更甚,基于 Markdown 的好处在于面向文档,于是 Obsidian Publish 孕育而生,作为内容的托管服务,取代博客,且模仿了 Andy's Working Notes 样式,名为「数字花园」。只不过,同样价格很贵。

Logseq 本身是开源的,且天然支持 Git,从而程序员群体比较偏爱它。同时,爱折腾的程序员们,自然会更容易找到公开发布的方案,也更愿意为它开发插件。需要注意的是,Obsidian 本身并不开源,但它的插件生态和开发者文档做得很好。于是,诸多插件如雨后春笋般涌现,产品体验也随之走向了崩坏,原因也很简单:插件不考虑宿主,更不考虑用户。

💻 本地化 vs. 云端化:新兴的云笔记工具们

说完了本地化的两款代表笔记工具之后,基于云的 Roam Research 模仿者,值得一提的就只有两款:RemNote 和 Tana。RemNote 依托于靠谱的科学研究,较为重视 Remember Note 的相关产品设计,比如 Flashcard 等机制,对学生来说价值更高。

当然,继双链的概念大热之后,市场上既有的类似产品也随之跟上,最典型的比如 Workflowy 是我看好的一名选手。多年的功能开发之后,却保持了极简,着实不易。双向链接的引用,取名为 mirrors 也比较贴切,跟 Notion 的 synced block 有异曲同工之妙,但也仅限于此了。

而 Tana 则是新的搅局者,第二大脑的作者 Tiago Forte 称之为 "the new Roam",而社区更倾向于将其描述为 Notion + Roam Research 的孩子。Tana 的早期起势非常高调,社区大 V 们纷纷高潮,奔走相告,再加上邀请制一码难求,期待值非常高,堪比 Arc 浏览器。

🤖 AI 的崛起:ChatGPT 和 New Bing 带来的挑战与机遇

但是,就如 ChatGPT 所引发的一波高潮之后,微软祭出 New Bing 大杀器,让直接集成 ChatGPT 的 Edge 浏览器大杀四方。Arc 浏览器在功能层面上的创新显得微不足道,AI 加持的新生产力工具,才是未来的革命性创新。

序章:为什么都 2023 年了,我还在用 Roam Research 写笔记?

New Bing 弥补了 GPT-3 缺失实时网络搜索结果的缺憾,聚合总结的效果更加震撼。并且,Edge 浏览器中的 New Bing 能够直接与网页的内容直接进行交互,让 ChatGPT 根据用户实时浏览的内容进行智能问答。众所众知,浏览器作为互联网的入口,所浏览的内容不局限于网页,同样可以作用于 PDF、图片等其他内容,因此想象空间更为巨大。

由此,微软所打出的 New Bing 搜索引擎 + New Edge 浏览器,让这两个领域都占据先手优势的谷歌猝不及防,已有的 Google 搜索和 Google Chrome,不得不开始跟上脚步和踩准节拍。好玩的是,谷歌联合创始人拉里·佩奇(Larry Page)和谢尔盖·布林(Sergey Brin)都被紧急召回,更频繁地参与到公司业务当中,布林甚至亲自下场为谷歌聊天机器人Bard写代码。然而被给予厚望的先发产品 Bard,还是在发布会演示时就立马栽了跟头。

💡 思维链路:Roam Research 的独特价值与使用感受

现在,让我回过头重新选择工具的话,我依然对 Roam Research 寄予厚望。并不是因为我曾经一次性充值了 5 年 believer 的所谓信仰,也不是因为我已经退出微信群运营的 RoamCN 社区,曾经的 #roamcult 社区狂热早已退散。

但如同我的实践感受一样,有一种莫名的集体潜意识让我意识到,社区也在慢慢发现 Roam Research 确实做得更好。并且,使用的人也在慢慢回流,不光是因为他们在 Logseq 或 Obsidian 等其他地方碰了壁,也是因为对笔记本身这件事情的理解。

我确信,如果自己不曾坚持使用 Roam Research,我也不会发现在深层级的功能设计和操作细节之下,隐藏的所谓“思维链路”是多么重要,更无法悟得卢曼与卡片盒“沟通”的真谛。才明白,原来 Roam Research 一直在这里,扮演着最好的“沟通对象”角色,哪怕已经有了 ChatGPT 这样更加智能的“提问对象”。

🤖 ChatGPT vs. 写作:为什么选择卡片写作而非直接问 AI?

相比之下,AI 看似智能的直给,恰恰剥夺了思考的乐趣。直给答案,代表着丝滑,同样也意味着没有摩擦。但由于缺少了必要难度,大脑无法加强存储难度,反而培养了一种遇事不决,先问 AI 的惰性,因为提取难度更高,大脑总是会选择那条最小阻力之路。

「不写,就无法思考。」代表着就是通过写作的方式来刻意制造摩擦,游戏化就是主动克服本来不必要的麻烦,但是麻烦也不能太大,总不能一来就去打终极 BOSS。于是,笔记要选择从写卡片开始,这是给自我反馈的最佳方式,也是滑板鞋在地板上摩擦的乐趣所在,时尚!

我的滑板鞋时尚时尚最时尚

回家的路上我情不自禁

摩擦 摩擦

在这光滑的地上摩擦

🎨 从双向链接到视觉化白板:笔记工具们的新探索

除了笔记要卡片化这一共识以外,大家对双向链接本身的迷思陷入最深,自动化双链后,用户会不自觉地吐槽知识图谱未能成型,笔记厂商们则假惺惺地对图谱做做优化。但除了更难看之外,也开始做起了视觉化白板,便是摸到了新的方向,也将其纳为了商业化变现的 Pro 功能,既引得了用户们的欢呼,更赢得了投资者的期待。

对于视觉化白板,开头提到的那对难兄难弟 Logseq 和 Obsidian 分别称之为 Whiteboard 和 Canvas,简称 WC。我始终不确定白板的价值,只能将其拆分阶段为“小白板”和“大白板”,前者用于灵感阶段,后者用于梳理知识结构?可能吧,只是不同阶段理应使用不同的工具。

如果真的 All in 了视觉化白板,那肯定不得不提 Heptabase,内测一年多了,功能迭代飞速,每周发版从未间断。但不知为何,为了减少摩擦的白板功能,始终摩擦力巨大让人用不起来,这也变成了共识。是不是白板本身就错了呢?

📈 视觉化白板:框架与灵活度如何取舍的平衡之道

关键点在于,“大白板”和“小白板”之间,存在一个概念叫做“框架白板”,白板的灵活度本身就是汝之蜜糖,彼之砒霜。框架对应思维模型,思维导图如果算一种的话,那么它也算是一种自带框架的“白板”。

所以,在框架和灵活度之间取得平衡的,当属最老牌的第二大脑软件 TheBrain,本身就具备了父子兄三种层级的自由链接,还兼顾了大纲和思维导图的模式。更值得一提的是,使用 TB14 版本的用户,依然念念不忘 TB8 版本的扩展视图,可以称之为弥补白板灵活度的天花板,只要梳理过白板上节点关系时,尝试过拖拽节点,就会意识到它的价值所在。

TheBrain 的大纲视图,区别于 Roam Research 的大纲有一个很重要的点,它的连线,本质上是可活动的。连线可变更,所以灵活性高于子弹节点本身的移动。因此,TheBrain 更适合作为知识结构的持续迭代,在在不断梳理的过程中,断开链接,清理那些大脑自以为是的跳跃式联想。

而另一方面,学海无涯生有涯,我只能关注我所能关注的,TheBrain 在帮助梳理个人目标领域(Areas)的同时,不断让自己意识到能力的范围。因为,搭建结构的同时也是在塑造知识的边界,你需要积累更有限,但是更有用的知识卡片。

🔔 后续(可能的🙈)拖更计划:

序章:为什么都 2023 年了,我还在用 Roam Research 写笔记?

✇吕立青的博客

超越效率:10x 提升阅读体验后,我有哪些反思?

作者 吕立青
哈喽,大家新年快乐!#立青与佳# 祝您和您家人✨💘✨2023年🌟新的一年里🎵✨✨好运连连,平安幸福🍎💯🏮兔年吉祥🐇🌹
超越效率:10x 提升阅读体验后,我有哪些反思?

少数派年度征文截稿在即,趁此良机,我刚好想要总结和分享一下「我的效率系统 2022 升级版」,内容包括:

  1. 碎片化阅读
  2. 书本阅读
  3. 整理笔记的思维链路(#卡片盒笔记法)
  4. GPT-3 人工智能赋能的生产力工具
  5. 重新思考 Roam Research 的价值
  6. 任务管理和目标管理的反思
  7. 白板的作用,以及各大笔记工具在 2022 年对白板的支持。

由于篇幅和时间有限,这篇文章只能涉及前 2 个话题(阅读篇),如果你感觉对某个话题很感兴趣,不如先来点一波关注。对于其他话题的细节,可以看我在 B 站的往期视频,在视频中能够找到更多有价值的信息。

引言:我的年度关键词 ——「幸运」

面对新的一年,我的情绪跟股票市场一样,也是高波动,高分化。去年我的投资收益率大概在 16%,只不过是负的,🐶。

超越效率:10x 提升阅读体验后,我有哪些反思?

但这其实是一种幸运,因为它让我可以有机会去把握「机会」,尽管我可能还没来得及做好充分的准备。跟股票市场的两轮暴跌类似,2022 年度我的心情也是两次暴涨,两次暴跌,所以总结下来,我对年度关键词「幸运」有了更深的理解:幸运不仅仅意味着要把握机会,也可能伴随着失去幸运的可能。只有努力再努力,才能让自己的实力配得上所获得的「幸运」。

另外,去年我的 B 站关注数突破了5000,总计发布83个视频,累计时长22小时,而这背后所花费的录制和剪辑的时间至少是10倍以上啦。令人唏嘘的是,近一年的 B 站总收益是668.33元,不足少数派的一篇稿费,🤣 这更加鼓励我要继续努力。所以,非常感谢看我的文章和视频的各位,也特别感谢2022年新关注的4334位小伙伴,希望你可以和我一起,用努力来获得幸运,迎接新的一年!

碎片化阅读(化零为整)80% -> 20%

Readwise Reader 是我在 2022 年自我评选的最佳软件产品,我用四象限图表的方式总结了它和其他 APP 的区别,可以看到 Readwise Reader 属于「学习(认知)」部分,我愿称之为年度最好用的现代化阅读器,它是碎片化阅读的完美兜底。

超越效率:10x 提升阅读体验后,我有哪些反思?
我的效率系统2022年度总结
我之前做过开箱视频和移动端使用的相关视频,点击链接即可查看:

Readwise Reader 本身有一个 Feed 流的概念,能够帮助我把微信公众号、少数派、B 站、博客、Newsletter,甚至是 Twitter List 里的内容统一汇总到 Reader 里。我将之前订阅的 RSS 内容全部迁移过来了,下图包括我所有 Feeds RSS 订阅源(Subscribed),而 Reader 甚至还能根据你的订阅源智能推荐新的信息源(Suggested)。

超越效率:10x 提升阅读体验后,我有哪些反思?

将所有信息源统一收纳之后,我就可以通过 Reader 的「每日摘要」卡片式筛选自己想要读的内容,然后保存在 Library 里。我还可以根据作者和对应的域名进行筛选,比如可以通过 domain:sspai.com 筛选出所有从少数派来的文章。

超越效率:10x 提升阅读体验后,我有哪些反思?

特别的是,当我看到一篇关于 MarginNote 的少数派付费内容,通过浏览器端插件直接保存时,它可以备份完整的文章和对应的图片。进入精读的阶段,当我在 Reader 中进行文章高亮,右侧会有一个 Notebook 的列表,所高亮的内容也会实时同步到 Readwise 本体。我最喜欢的是精读时的纯键盘操作,可以通过上下左右的快捷键快速跳转文章段落,以及按下 h 或 n 进行内容的高亮(highlight)或笔记(note),并且支持在整个文档层级完成笔记记录、加标签、打开原网页、归档等快捷操作。

超越效率:10x 提升阅读体验后,我有哪些反思?

在阅读高亮完毕后,我就可以跳转到 Readwise 查看所记录的所有卡片,编辑或添加更多的笔记内容,甚至可以制成类似 Anki 的闪卡,通过提问的方式总结知识卡片。Readwise 会每天提醒我回顾这些卡片,从而形成阅读的闭环,持续不断的反馈帮助我将卡片内容内化到大脑当中。

另外,使用 Readwise 还有一个好处,它会把笔记内容自动同步到笔记软件,比如我在 Readwise 里加了 #favorite 标签,也会自动同步到 Roam Research 方便筛选。而在查看笔记时,还可以通过 highlight 链接直接回到原文出处。

超越效率:10x 提升阅读体验后,我有哪些反思?

同时,Reader 的手机端体验也非常好,能够快速地将内容在移动端保存到 Reader 中。此外,它还支持其他文件类型,比如电子书支持 Epub、PDF 文件甚至支持文字重排、Email 支持 Newsletter 和 Twitter Thread 等,非常值得一试。

总结一下,对于碎片化阅读,虽然信息源多且繁杂,但是借助于好用的汇总和筛选工具,比如 Readwise Reader,可以「化零为整」,我们只需要 20% 的时间就能系统化地处理自己的碎片化信息。

书本阅读(渐进式总结)20% -> 80%

因此,这也就引出了下一个话题:书本阅读。我想特别提一点我的反思:在 Reader 聚合了「碎片化阅读」之后,反而又让我重新更加重视「读书」了,更应该阅读的应该是书籍。

每当我打开 Reader 的 Home 页面时,看到自己未读完的内容、最近添加的内容、可快速阅读的内容,以及信息流中新出现的信息。此时,我会有意识地将书籍放在 Reader 主页的第一个位置,看到自己更应该去做的是「书本阅读」,而不是所谓的「碎片化阅读」。因为相比之下,当你看到可以阅读书籍时,你会发现书籍会给你更多有价值的体系性内容。

超越效率:10x 提升阅读体验后,我有哪些反思?

书籍阅读的渐进式总结流程

但是,这又引出了一个新的问题:什么是更好的书籍阅读 Workflow?我认为,更好的书籍阅读发生在 MarginNote 中,使用 MarginNote 可以很好地结合渐进式总结。那么,什么是渐进式总结?

超越效率:10x 提升阅读体验后,我有哪些反思?

Tiago 的 CODE 框架是一种更加明确的提取和总结方式,它由 Capture(捕获)、Organize(组织)、Distill(提取)、Express(表达)四个阶段组成,而在 Distill 阶段的渐进式总结 Workflow 中,每个层级的筛选过程和提取比例都是逐步降低的。

  • 第一层是 Note,通过加粗高亮的方式对原文内容进行筛选,并以视觉化的方式标注出来;
  • 第二层是 Mini Summary,用自己做一个简短的总结,然后跟自己的其他笔记 Remix,最终变成属于自己的东西;
  • 第三层是 Q&A,提问的方式来对关键概念进行总结,最终混合出属于自己的知识结构。

L 先生的 INK-P 也是一套类似的理论,只要总结它们的原则和关键点,最终提取属于自己的,适用于自己的框架,就可以让类似的知识框架为自己所用。

MarginNote 阅读笔记流程演示

接下来,我会逐步演示一下我在 MarginNote 里面是怎么阅读的。MarginNote 对阅读和学习的支持非常好,借助 MarginNote 的「学习模式」,可以方便地完成渐进式总结的流程。我发现很多 MarginNote 的小细节,真的很贴心,比如 iPad 和 macOS 的联动,可以快速推送笔记,并且打开的笔记在书中的位置是完全统一的。

以终为始,我会先带你看看阅读笔记的最终形态是什么样子的?打开 MarginNote,以我正在看的《第二大脑》为例,左边是一个思维导图,右边是这本书。另一个模式是学习模式,点击某一张卡片,就会跳转到对应的 PDF 位置。最终的笔记成品是以一个个问题组织起来的,就像爆竹的引线,将一颗颗爆竹🧨串联在一起。

超越效率:10x 提升阅读体验后,我有哪些反思?

完成对书本的阅读和学习之后,我会将 MarginNote 的笔记导出到我的笔记软件,完成统一的知识汇总。在 Roam Research 中有类似的一个大纲结构,对应 MarginNote 里面的思维导图,展开可以看到一些概念,比如书中所提到的「中间产物」或「知识资产」,都是以问题的方式组织起来的。

超越效率:10x 提升阅读体验后,我有哪些反思?

在 Roam Research 中,我还可以通过 Roam Memo 插件,间隔回顾对应的卡片内容,比如「什么是中间产物?」。只需要给 Block 加上 #memo 标签即可,这是插件所需要识别的标识符。如果我对问题的答案已经很了解,可以对它进行反馈,根据反馈指定下一次 Review 的时间,比如选择 Hard,就会明天提醒再次 Review。右上角的 Past Due 会标注是否错过 Review 时间。

超越效率:10x 提升阅读体验后,我有哪些反思?

当然,如果对卡片内容记得不是特别清楚了,可以点击链接,直接回到 MarginNote 所对应的卡片位置和原文位置。

Q1: 如何梳理书籍的知识结构?

以《程序员修炼之道》这本书为例,我打开的是 PDF 文件,因为 MarginNote 支持的功能会比 Epub 格式更多。在学习模式里面,你可以直接导入整本书的目录结构,从而生成一个思维导图,但问题在于,这还是以原作者的知识框架来整理内容的,而不是你自己的。

超越效率:10x 提升阅读体验后,我有哪些反思?

其实,按照作者的结构来组织内容,还是按照自己的结构来组织内容,这其实是没有标准答案的。如果你对某个领域完全没有框架性的基础概念,你可以先学习一遍作者的结构,也就是把原书的 TOC 目录放进思维导图。

超越效率:10x 提升阅读体验后,我有哪些反思?

但如果你对这个领域已经有了属于自己的初步认识,你就可以在这里选择只按照文档(By Document)进行自动摘录。此时每当我摘录一条,它就会存在整个文档的框框里面,而不会出现在之前的目录结构下面。所以,我一般就会把知识点概念单独摘录出来,把目录删掉,然后从书中找到自己感兴趣的部分,比如「正交性」的概念,就对它所在的关键文本进行高亮。

Q2: 阅读时遇到新概念怎么办?

重点来了,阅读时,我还会打开「学习模式」的 Title Link(标题字典),并且在文档中打开 Recall Mode(回顾模式),从而在阅读的过程中,就开始回想所提取的新概念。

高亮之后,打开大纲模式,选择 Emphasize(强调),并且选中强调会同步到标题。此时,点击「正交性」这个词,它会自动同步到卡片标题上。而所有文中出现「正交性」这个关键词的地方,都会有一个小小的下划线。点击它,在左边的大纲中,就会出现词的具体解释,而在右边 PDF 的划线高亮段落中,所有关于「正交性」的词语都会隐藏起来,让你通过回想强化一次「提取强度」。

超越效率:10x 提升阅读体验后,我有哪些反思?

更神奇的是,当我在其他地方划上高亮之后,也选中「正交」作为它的标题,那么点击「正交」这个词,会发现关于这个词的解释会有两个出处,可以直接点击它,分别跳转到不同的原文位置。

比如,「正交」的系统能获得两个最主要的收益:提高生产力和降低风险。因此,我就可以把生产力风险标注起来,从而使文章中出现的概念彼此相互链接。比如,我可以看到风险正交系统有关,它是正交系统的收益之一。特别是当我想要查看关键概念出处时,就可以方便地快速查看。如果对卡片内容仍然不能理解,就可以点击它回到当时你所划线的文章内容。因此,通过这样一个过程,我就能够在阅读时把文章中的许多关键概念组织起来

Q3: 如何组织书中的新概念?

就像我前面提到的,我会通过问题的方式来组织我的思维导图或者叫大纲,所以我就会在这里添加 Q 作为问题的前缀。(当你做笔记的时候,你可以把右边稍微缩小一点。)比如,新建一个问题:「Q:: 正交性的好处是什么?」这样按照你自己的思维链路,通过自己大脑里的提问方式来组织内容的表述:「好处就是提高生产力和降低风险。」

正交性促进了重用,特别是当两个组件的职责相对单一时,正交性的价值就提高了。因为一个组件能做 M 件独特的事情,另一个组件能做 N 件事情,如果它们是正交的,它们就能够组合起来完成 M 乘以 N 件事情。

所以,正交组件在组合过程中,单个组件单元的性价比就提高了。

同样的,当我遇到了一个新的概念叫做「组合」,那么我就可以给这张高亮的卡片,手动加上一个标题:组合,从而书中所有出现「组合」的地方就会被划线高亮出来。

超越效率:10x 提升阅读体验后,我有哪些反思?

Q4: 笔记如何导出到 Roam Research?

完成阅读之后,我就会把这些内容复制放到 Roam Research 里面,但是如果直接复制,你会发现有个小问题:它是不带 MarginNote 的链接的。所以这个时候,我会借助印象笔记作为一个中转,每本书导出一遍的频率倒也还可以忍受,仪式感满满 😉。

另外需要注意的是,当你是英文系统,并且 MarginNote 也是英文版的时候,你登录的是 Evernote,而不是国内的印象笔记。 只需要在 iPad 上或者把 MarginNote 改成中文语言即可,在系统设置 language 里面,你可以添加增加 MarginNote,把语言改成简体。这样,当你重启之后,整个 MarginNote 就会变成中文,当你去导出的时候,它就会登录的是印象笔记。

超越效率:10x 提升阅读体验后,我有哪些反思?

导出的时候,你可以不用附上原文的文档,也不用附上脑图。保存的笔记很快就会出现在印象笔记,我只需要选中它们,复制到 Roam Research 当中。所有的 MarginNote 的链接都会保留下来,一张一张的卡片以问题的方式组织起来,而通过链接可以非常快速地回到原文所对应的位置

超越效率:10x 提升阅读体验后,我有哪些反思?

Q5: 如何间隔复习笔记卡片?

接下来,我就会批量的把这些问题加上对应的 #memo 标签。通过 Roam Research 的 Find & Replace 插件,我可以按下 Ctrl + S 再找到刚刚的两个 Q,然后替换为将两个 Q:: 作为前缀,然后将 #memo 作为后缀。这样就可以通过双向链接的特性,变成 Roam Research 所能识别的 attribute 属性页面。

超越效率:10x 提升阅读体验后,我有哪些反思?

此时当我点击打开 [[Q]] 页面,你就可以看到我之前所有的加了问题的笔记卡片。接下来,还需要去设置 MEMO 插件,额外增加 2 个标签,将 Q 和 memo 增加进来,作为 MEMO 卡片的标识符。这样,当我点击 Review 插件,选择下拉框,里面就会出现 Q 和 memo,点击查看所有的跟刚刚的卡片所对应的卡片内容。每张卡片,还会显示一个面包屑,从而我可以快速查看当前这张卡片的出处。

超越效率:10x 提升阅读体验后,我有哪些反思?

Q6: 如何在阅读时 Remix 自己的旧笔记?

在 MarginNote 阅读时,你还可以快速添加自己的评论。比如,当我们意识到「正交性」的价值时,你可以把正交性概念加上双链符号,并且将它与脑海中的其他概念相互联系起来。比如,我会想到[[正交性]]与笔记的[[原子化]]非常类似,都可以用来增加笔记的[[可复用性]]

超越效率:10x 提升阅读体验后,我有哪些反思?

可想而知,我在 MarginNote 所添加的笔记双链,导出到 Roam Research 后会自动跟已有的 [[原子化]] 页面链接起来,从而我就可以查看[[原子化]]在我之前的笔记系统中有哪些相关内容。

比如,这里的原子化和之前我所做的另一个视频《【效率思维】顺理成:卡片化写作与原子化设计》就链接起来了。此时,我就可以再次回顾它,并且关联出一些相关的概念,也完成了我们刚刚所说的 Remix 混合的一个步骤。

超越效率:10x 提升阅读体验后,我有哪些反思?

好,以上就是我在 MarginNote 到 Roam Research 的一个渐进式总结。这只是一个非常简单的演示,不过我特意通过 Q: 小标题提问? 的方式将内容组织起来了,也算是一个不断实践的亲身示范。

当我在 MarginNote 里面读书,在阅读过程中,就会通过高亮文本和提取关键概念,不断通过标题链接链接相关的知识点。而当我把笔记导入到 Roam Research 之后,又可以通过双链符号以及页面属性功能来进行间隔重复。

总结:书本阅读的重要性

作为年度征文,我向你尽可能详细地介绍了「碎片化阅读」和「书本阅读」的整个流程。更多的操作细节可以参考我的视频

本文从文章篇幅上,就刻意强调了「书本阅读」的重要性,😛。当我们把碎片化阅读和书本阅读摆在一起时,优先级自然浮现出来。从书本中学习,从经典中学习还是会更加重要一点,哪怕碎片内容可能占据了 80%,但我们的重心仍然应该是花 80% 的时间去阅读书籍 📚

对于「碎片化阅读」,虽然可能信息量更多,时效性更强,但借助于好用的聚合与筛选工具,比如 Readwise Reader,我们只需要 20% 的时间就能够系统化地处理自己的碎片化信息,「化零为整」批量化处理,留出那属于自己的 80% 时间去阅读书籍 📚

超越效率:10x 提升阅读体验后,我有哪些反思?

题外话:因为录制的过程就是我思考的过程,时间相对会比较长,所以我想把它拍成几个视频来进行讲解。目前来看,至少需要三个视频才能够完整地讲完,然后再通过 Notion AI 转成文章,手动插图,然后才会有类似这篇文章的成品。

如果大家对之后的卡片盒笔记、人工智能、Roam Research 插件、任务管理、目标管理以及白板等话题感兴趣,可以帮我在少数派「充电、收藏、关注」三连啦,特别重要的是留下一个属于你的脚步:「己所欲,施于人」,为自己留下一个评论。

好啦,我的 2022 年度征文 Part 1 就到这里了,谢谢大家,我们下次再见,拜拜 👋。

✇吕立青的博客

如何克服精神内耗并对抗分心?

作者 吕立青
如何克服精神内耗并对抗分心?

本文为你介绍一个此前的热门话题 —— 精神内耗。

7 月份的时候,我发了一条 B 站动态,说是要分享「如何使用 Roam Research 克服精神内耗」。很多朋友都说这期视频是值得去做的,但我又在不断内耗当中,继续思考而迟迟没有动手。

如何克服精神内耗并对抗分心?
写作本文的契机

最近在看尼尔·埃亚尔(Nir Eyal)的新书《不可打扰》时,又对「精神内耗」这个话题产生了新的感悟。

尼尔·埃亚尔是《上瘾》这本书的作者,之前他在书中所讲的是「让用户养成使用习惯的四大产品逻辑」,如今所有的 App 都想让你对它上瘾,或多或少都有基于这本书的几个观点。

而相反地,作为行为设计学的导师,尼尔·埃亚尔也提供了另外一个角度,即我们作为个人,如何去避免被这些抖音之类的 App 吸引注意力而「分心」。上瘾在本质上跟精神内耗是有很多类似的地方,本文我将分享自己关于精神内耗的 4 个应对策略。

进入正文之前,我先稍微偏个题,本文的大纲是结合了 L 先生的几个有效的方法,共同构成的。那么这份大纲是如何在 Roam Research 中产生的呢?推荐给你一个好用的方法 —— 我在思考某个话题,或者是看一本书之前,会带着自己的问题(比如,如何克服精神内耗?)首先写下自己的想法,再去看你要读的材料

如何克服精神内耗并对抗分心?

比方说当时我就写下了自己的四个想法:使用 Roam Research 写下来、尽快进入下一阶段、冥想、任务驱动。然后呢,我再去读 L 先生关于有效克服精神内耗的方法,我相应地再去做阅读笔记,将文章里面提到的四个方法,跟之前自己所写下的四个角度进行对比。

你会发现大差不差的,我自己想的 4 个方法竟然跟 L 先生提出的 4 个方法是非常类似的,只是它们的顺序有所不同。从而,我就进一步通过 block reference 将它们关联了起来,相当于打通了自己的知识跟学到的知识的关联。

这也就是双链笔记的最重要的使用场景,没有之一。

一、我是可以选择的:接纳-记录-回顾-行动 👉 [[写下来]]

当你产生精神内耗的时候,是非常正常的状态。首先你就是去接纳它,接受它。

人类大脑有一种思维模式叫做「默认模式网络」(DMN: default mode network 的缩写),也就是我们的大脑在什么都不干的情况下,也是在不断运转中的。当你的脑袋里面产生很多的想法或者是负面的想法是非常非常正常的,这是生活的常态,所以你要尝试去接受它。

而我在开头提到的《不可打扰》这本书,主要尝试解决的「分心」问题跟「精神内耗」非常类似,并且抛出了非常有意思的一个观点 —— 「时间管理就是疼痛管理」。

分心的动机源自我们的大脑会不断地产生新的想法,分心只是一种人类行为,是大脑尝试对疼痛作出反应的一种方式。当你产生不适的感觉的时候,你可以去寻找它为什么会让我们产生不适。

而这种不适感当然会造成大脑的分心,既然分心会耽误时间,那么时间管理就是疼痛管理。

当然,产生这种状态的原因其实很简单,因为对于我们作为人类这一物种来说,如果满足和快乐是永恒的,那么人类就没有多少动力继续去追求进步了。我们的祖先曾经比我们更努力,更有开拓精神,进化让他们不安于现状。那么哪怕到了今天,我们也是依然如此。只是说,原本在非洲大草原上,这种进化的特征可以帮助我们的祖先艰难地生存下来,但是在今天,这种特征反而会对我们有所不利。

本质上,这种精神内耗的心理可以分为以下四个方面:

  1. 第一个就是百无聊赖(boredom)。当我们不去做事情的时候,自然而然地就会产生一种无聊的状态。有一个有趣的实验,房间里空无一人,只有一台微电流电机设备让参与者可以电击自己。那你会想,如果你在这间房间里面,你会无聊到电击自己吗?而实验结果表明,当参与者处于这样无事可做的房间里的时候,67%的男性和 25% 的女性会选择电击自己,甚至有人还会多次尝试。所以说,人类啊这个有趣的物种,哪怕非常好奇地去尝试电击自己,都不愿意在房间里面无所事事。
  2. 而第二个方面是负性偏向(negativity bias)。比如说,你失去 50 块钱的痛苦,会比你获得 100 块钱的快乐的程度更高。因为消极事件比中性或积极事件更有影响力,需要得到更多的关注。原因也很简单,因为负性偏向会给我们进化带来优势,需要永远识别风险,让这些负性的事件最先被关注。
  3. 第三个是反刍思维(rumination)。当我们遇到不愉快,我们总是会在脑海里面一遍一遍地回想自己做过的事情,别人对我们做过的事情;或者去憧憬未来那些你想做但还没有来得及做的事情。反反复复,不断纠结于过去和未来,难以释怀,这就是一种反刍思维。我们总是在自我批评,消极地将现状与未尽的目标进行对比,或者是哪怕你做地很好了,你也会不断地反问自己,为什么我不能够做得更好呢。这同样是一种进化的特质,通过反思来找到纠正问题的方法。但凡事都有个度,如果我们一直在寻找错误的根源或其他的解决方法,又造成了另外一种让自己难受的精神内耗。
  4. 前面提到的百无聊赖、负性偏向和反刍思维都会让我们分心。但第四个心理因素可能才是最残酷的,它就是享乐适应(hedonic adaptation)。无论生活中发生任何事情,你当时有多么地快乐,都会非常快速地回到一切如常的原点。比方说你梦想自己工资能够达到 1 万,但是你真的工资到达 1 万之后,你很快就会适应这种感觉。下个月再发工资的时候,并不会让你变得更加更快乐。即使带来了快乐,这种快乐也会昙花一现地转瞬即逝。

在大脑 DMN 这种默认的运行状态当中,不满足和不适感会激发我们去不断进化。曾经这种不满足给我们人类带来了进步,如今也让我们犯下了错误。所以,首先要接受这种精神内耗的或者叫分心的感觉。分心只是我们试图逃避不适感的一种方式。当你精神内耗或者遇到负面想法的时候,你首先接受它是正常的。其次你可以记录下来,专门在 Roam Research 里面写下来自己的这些负面的想法。

如何克服精神内耗并对抗分心?

及时地记录自己的负面想法(你可以尝试「间歇日记」),一方面这可以让你的大脑放空下来,不再去想它了。另外,当你写下来之后,你就可以去审视它,去回顾它:它真的是真实的吗?它发生的可能性大吗?我有没有办法去应对它呢?

在《不可打扰》这本书里面同样提到了,当你产生分心的时候,你可以主动地去找到你当前所处的一种消极的情绪,把这些消极情绪的触发因素给写下来。比方说当你感到焦躁不安,或者是有某种玩手机的渴望,或者是觉得自己能力不够,不足以完成当前的目标的时候,你就把它写下来。然后,你要保持人类的一种好奇心,去探究一下,为什么自己会产生这种感觉。

书中还介绍了一种「溪流浮叶」的想象法。当你产生内部的不适感时,你就想象自己坐在一条缓缓流动的小溪边,有很多树叶顺着这条小溪漂流而下,每片叶子都代表着你的想法,它可以是一段记忆、一个词语、一种担忧、一幅画面,想象自己坐在岸边,看着眼前每一片浮叶,打着旋儿漂流而下。

往往在你去观察它的时候,去探究它的原因的时候,慢慢地你也就放松下来了,不会再去想它了。这个时候你可以直接把它划掉,去行动就好了,继续去做眼前的事情。

如何克服精神内耗并对抗分心?
Unsplash: green leaf on water flow

另外,对抗分心的一种方式是给自己设置一个阀值,「阀限时刻」指的是我们生活中从一件事情切换到另外一件事情的过渡。比方说你在等红绿灯的时候,就会不自觉地拿起手机,或者是当你用浏览器打开标签页,但因为网速的原因加载过长就感到厌烦了,从而你不自觉地就打开微博或者 Twitter 去刷其他的内容了。

对于这种切换的过渡时刻,你就可以给自己设一个缓冲阈值,比方 10 分钟,当你产生不适的感觉的时候,不要立马去拿手机或者去刷 Twitter。而是使用「十分钟规则」的技巧,对自己说,「等过了 10 分钟之后我再去刷」。如果过了 10 分钟之后,你仍然有去做某件事情的冲动,那你就去做。但这种情况并不多见,一般在时间段过去之后,你就能够去做自己真正想做的事情了。

如果你以一种温和的状态、温和的态度去关注消极情绪的时候,消极情绪往往会消失得无影无踪。与此同时,你的积极情绪也会不断增长,有足够的动力去完成你当前想做的事情了。

永远记得,「我是可以选择的」。首先接纳,记录,重新审视内心的想法,接下来就开始行动或者回归行动。

二、正念,觉察呼吸;内观想法 👉 [[冥想]]

注意力本质上是一种能力,日常你可以通过冥想的方式来训练自己的注意力。意志力并不是一种有限的资源,而是类似于一种情绪的东西。

实验结果表明,只有那些认为意志力是一种有限资源的受试者,才会出现自我精神损耗的迹象。比方说,我的印象中,在死亡笔记这部动漫里面,L 经常会通过吃糖的方式来提高自己的注意力。我之前也一直以为吃糖或补充葡萄糖就能够让自己更加专注。但其实这是一种心理行为,只有当那些人「以为自己喝了加糖的柠檬水可以提高自己注意力」的时候,才能够真正地增强自己的意志力。由于他们认为糖对自己有影响,吃糖才会产生一种心理安慰,从而就更有动力去做眼前的事情了。

如何克服精神内耗并对抗分心?

明白了意志力其实是一种情绪,而正如快乐和愤怒的情绪不会完全消失一样,意志力也会随我们的亲身经历和感受变得时强时弱。所以,你就可以以一种控制自己情绪的方式,来控制自己的自制力。小朋友得不到想要的玩具,会乱发脾气在地上哭闹。对于大人来说也是一样的,在《被讨厌的勇气》中作者举过一个例子,一位孩子的母亲正在对自己的孩子进行愤怒的斥责,但是当她接到孩子学校老师的电话的时候,她又突然非常温柔礼貌地跟老师进行谈话。此时,你就会发现这位母亲并不是不能控制自己愤怒的情绪,而是她选择了愤怒,她选择了对孩子愤怒,而选择了对老师平和。

那么,当我们像对待情绪一样对待意志力的时候,你可以相对平和地去处理自己的意志力。比方说,在完成一项艰巨的任务时,你可以认为自己只是暂时缺失动力,而不是说我好累,想休息一下,甚至想吃点冰淇淋犒劳自己,那么这样也会更加有效率,当然也更健康。

这跟自我认同其实也有关系,自我同情心越强的人,幸福感也越强。这种自我同情心,其实是打破了「失败带来压力,而压力又导致失败」的恶性循环,让我们可以在面对失败时能够更加顽强坚韧,而不是一直在内心的自我损耗,责怪自己产生一种罪恶感,从而变得更加地分心挣扎,集中不了注意力。

再介绍一个非常简单的调节方法,就是「觉察呼吸」。当你产生内耗的情绪的时候,你可以亲自试一试:找一个舒适的位置,闭上眼睛,采取 10 秒左右的呼吸,把注意力放到你的呼吸上面,体会呼吸过程中的感觉。不要去管脑海中来来回回的想法,也不要去抑制它们。跟前面提到的「溪流浮叶」想象法也是一样的,想象让自己坐在一条缓缓流动的小溪边,有许多的树叶顺着这条小溪顺流而下,每片叶子都代表着你的想法,它可以是一段记忆、词语,一种担忧,一幅画面。想象自己坐在岸边,看着这些眼前的每片浮叶,打着旋儿漂流而下。

如何克服精神内耗并对抗分心?
Unsplash: woman sitting on cliff overlooking mountains during daytime

注意,这跟发呆还不太一样,严格意义上来说,发呆并不算冥想,也不等同于冥想。其实,我对冥想粗浅的理解就是 yes and let it go(确认,然后就让它随风而去)。冥想最初源自佛教,而正念是 1979 年由巴卡金博士把这种修习的方式从宗教属性里面剥离出来的。从而,正念指的就是有意识的觉察,专注于当下这一刻,而不附加任何主观的评判。正念摆脱了宗教的性质,结合一些医学研究才提出了 Mindfulness 觉知的概念。

发呆的时候你的思绪是飘散的,注意力也是分散的。前面提到的 DMN 默认网络模式本质上就是一种发呆的状态,也就是我们的大脑在什么都不干的情况下,它在默认地运转发呆。而冥想是一种锻炼大脑的方式,需要你主动地觉察你在脑海中不停冒出的念头。

所以,冥想本质上激活的是「任务积极网络」(TPN: task positive network),而对于 DMN 活跃的人来说,如果他们想要集中注意力去专注工作,那么 DMN 默认模式就会不断地去跟 TPN 专注模式争夺注意力资源,从而造成了更多的精神内耗。

通俗来说,冥想是手动挡,你需要主动地去觉察自己的想法,而发呆则是大脑的自动挡。

所以,在你做正念冥想的时候,并不是需要完全去消除各种念头,而是去觉察这些念头就好了。就像呼吸一样,你无法停止你的呼吸,但是你可以去观察它,觉察它,并且对这些念头保持非评判的态度。正念就是有意识的觉察,专注于当下这一刻,而不附加任何主观的评判,从而可以帮助到你缓解压力和调解情绪。

我们可以在日常的训练当中,去培养自己专注于特定想法的能力,而不要任由 DMN 默认网络模式来主宰自己的大脑。

接下来进入视频的下半部分:我会继续分享剩下的 2 个方法,帮助你去提高精神内耗的对抗能力,特别是该如何专注于当下正在做的事情而不会轻易分心。

如何克服精神内耗并对抗分心?
如何克服精神内耗与对抗分心(视频版:下篇)

三、提高注意力需求,多任务切换保持兴趣 👉 [[拆解]]

第 3 个对抗精神内耗的策略是提高注意力需求,保持对大脑注意力的转换和饱和。

那么,什么是注意力饱和呢?简单来说,工作的时候我们为什么会分心?最关键的原因就是我们手头所做的事情无法 100% 地吸引我们的注意力,大脑对它没有足够的兴趣。在注意力不够饱和的情况下,大脑就会产生闲置的注意力资源,从而这些资源会由大脑主动地自动激活了 DMN 默认网络模式,从而使你的注意力从外部的目标转向了内部损耗。

解决的办法,当然就是提高你对手头在做的事情的注意力需求,从而让注意力达到饱和,这样大脑就不会再去主动激活默认网络模式。

通过录制视频抢占大脑注意力

第一个我觉得还不错的办法,就是通过录视频的方式(或者更进一步以直播的形式),让自己无法停止手头正在输出的过程。录制视频时,你需要在意画面里的头像,或者是正在所处的软件界面等各种情况。这种类似于直播面对面的方式,就是一种非常好的抢占注意力的方式,能够帮助到我更加专注于当前知识输出的任务。由不得自己去想那么多,你必须尽可能把当前这件事情做完。

通过录视频的方式,可以高强度抢占大脑注意力,防止分心乱逛。深度工作的主要障碍则是将注意力转移到某种浮浅事物上的冲动,从而我们要克服这种障碍,需要刻意练习来避免干扰,高度专注于当前的任务。制作视频,就是这样一种刻意的练习,何乐而不为。

同时,在我使用录制软件时,会在左上角有一处计时的时间显示。从而我就知道,当前视频的录制花了多少时间,让我有意识地意识到自己的注意力正在何处。

如何克服精神内耗并对抗分心?

多任务同时推进,保持项目切换

第二个增加注意力饱和的方式,则是多任务同时推进,保持项目的切换。《拖拉一点也无妨》这本书专门讲了这件事情,叫做「结构化拖延」。来自斯坦福教授的高效拖延术,让你的拖延也变得高效,这个概念在 2011 年还得到了搞笑诺贝尔文学奖,非常地有意思。这本书的总页数都没超过 120 页,所以推荐大家(在拖延的时候)拿来读一读。

如何克服精神内耗并对抗分心?
真正有效的战拖小书

结构化拖延,指的就是你用一件事情去拖延另外一件事情,哪怕你没完成任务 A 但是你却完成了任务 B。当你在多个任务之间切换的时候,你要保证的是这件事情能够百分百地吸引你的注意力。这跟卢曼的跟着兴趣走是一样的,你需要让自己的大脑尽可能的有兴趣地去做当前手头上的工作,同样是一样的哄骗大脑的套路。

举个例子,在你工作的时候,如果手头在做的事情并不需要花费太多的注意力,那就可以打开多个项目。从项目 1 工作一段时间,切换到项目 2,再工作一段时间,再切换到项目 3,....,让自己的注意力永远保持饱和。换句话说,让你的大脑对当前项目持续地保持百分百的兴趣。

当你持续地处理同一件任务,过了一段时间后,大脑必定会对它失去新鲜感而感到疲劳,因为你对当前事情已经有了足够的掌握。注意力就会有一部分被闲置出来,从而特别容易造成分心。而此时你要做的,就是用另外一件事情把注意力再次地吸引过来,避免它转向内部,去反刍那些负面的想法。

L 先生还介绍了另外一个有趣的清单,叫做问题清单,里面记录一些需要持续思考做出决策的一些问题。在碎片时间里,当你无所事事的时候,为了不让注意力转向内部的精神内耗,就可以打开问题清单,随便挑一个问题,开始思考,让它来占据自己的注意力。这跟费曼的 12 个问题也是非常类似的,费曼的原话是,「你需要 12 个最喜欢的问题,让它们不断出现在你的脑海里」。虽然这些问题大部分时间都在休眠,但是当你注意力不够饱和的时候,你就可以用这 12 个问题去占据你的注意力,让你重新燃起兴趣。另外一方面,每当你看到一个新的技能或知识点的时候,你也可以用自己这 12 个最喜欢的问题去测试它,看看是否对 12 个问题的答案有所帮助。

Tab + Enter 细化分解,进入下一阶段

第三个避免分心的方法叫做「细化分解」。如果说,你对当前的项目或者目标已经产生不了足够多的兴趣时,我最重要的建议是,你一定要尽快地进入到知识点或者项目的下一阶段。

比方说,如果你在学知识,那么你就尽可能快地从一级目录学到二级目录,或者是你从当前学科尽快地学到该学科下一层级的子学科。如果你是在做项目,那么就尽可能进入到具体实现的那一层面,比方从功能需求尽快进入到写代码的过程。或者如果你是在写文章,那么就尽快地从大纲阶段进入到写二级标题的阶段。这时候你会发现有更多的细节需要去补充,比方说之前积累的卡片可以快速地摘录过来,或者是这些卡片还需要梳理一个最佳的行文逻辑。

在这里我给你一个口诀,叫做 Tab + Enter 细化分解。尽快地去细化分解,也就是在推进当前项目的过程,不要停留在宏观,但是又要随时能够回到宏观。举个例子,我来为你细化一下「Tab + Enter」:细化和分解并不是同一个意思,在一个大纲式的软件中,细化是 Enter,分解是 Tab。琢磨一下,比方说当我按下 Enter 的时候,我就是在细化当前的项目。

以本文要解决的问题为例,当我按下 Enter 的时候,我就是在细化问题。我可以把这样一个大问题进行拆解,变成了更细的一些子问题:「什么是精神内耗?为什么要克服精神内耗?克服内耗的好处是什么?」等等。如果我再对每一项按下 Tab,就是进行更细的分解,比如说将「什么是精神内耗?」再分解为「精神是什么?内耗又是什么?」,内耗就是内部的损耗。从而我们就可以持续地把问题进行拆解。「精神是什么?」精神在这里指的就是大脑的思维方式,从而我们就引入了 DMN 默认模式网络和 TPN 专注网络等一些概念。

如何克服精神内耗并对抗分心?

就像这样,快速地进入到当前项目的下一阶段,你就知道你正在深挖问题的核心,并且让你的大脑燃起了新的兴趣点,大脑希望知道下一层级的子问题,寻找更细节的答案。

提高注意力的需求,让你的大脑注意力持续保持饱和的状态,通过多任务切换的方式保持大脑对当前项目的兴趣。只有当你的大脑对自己正在做的事情产生百分百的兴趣,你才不会有闲置的资源去关心那些内部不断冒出的想法。所以说,我们大脑也是需要被不断哄着去做事情的。

四、尽管去做,优先去做,默认去做 👉 [[行动]]

我们可以刻意地通过任务驱动的方式培养自己的成就感受能力,也就是让自己意识到自己已经完成了很多工作,「你已经相当厉害啦」。因为只有去做,才能够去产生成就感,从小开始持续积累自己的成就感,再去挑战大的。

从前面的分析当中,你可以看到精神内耗的主要问题就是它消耗了我们的动机。动机就是行动的动力,当你缺少了动力,当然就没有那么想去行动了。但是,这句话反过来也是成立的,要克服这种精神内耗,最有效的方式就是去积累自己行动的动力,通过培养自己去行动的习惯。当你行动了,自然就能够获得更多的能量,有了更多的动力了。

原则,就是你做事的价值观。你可以设置一个非常简单粗暴的原则:如果一件事情你想不到特别有力的不去做的原因,那么就优先选择去做。

如何克服精神内耗并对抗分心?
Unsplash: Nike #just do it text

如果你不去做,眼前的项目就永远都是未知,你就永远得不到一些要去做的动力,项目也永远不会得到解决。而根据上文所提到的「反刍思维」,这件事情就会一直停留在你的记忆里面。随着 DMN 默认模式网络的激活,就会进一步地占据你的认知资源。让你不停地去想,不停地去纠结,不停地内耗。而只有当你去行动了,你才会真正地把这些未知变成已知,把不确定变成确定,让这些想法都可以得到安放和处置,不再干扰你当下的思考,让你的大脑启动 TPN 专注模式。

所以说,现在就动起手来,直接通过 Tab + Enter 的方式在 Roam Research 里面进行细化分解,而这种大纲式的组织结构会成为你的有力助手。大纲的树状结构可以让你不断地放大缩小,就像我经常提到的,Roam Research 就像有焦距的镜头,有微距也有广角,可以看到整棵树的全局或细节。

行动是你开启正向反馈循环的第一步。很多时候当你去真正行动了,你就会发现原来所恐惧的东西并没有那么可怕。自己先前对她的所有情绪,包括猜测、担忧、焦虑等等,很多都是不必要的。这跟前文「我是可以选择的」第一小节当中,所提到的各种内部的情绪和不适感是相关的,你会发现大脑所产生的这些负面想法都很正常,但没有必要。

你可以亲自试试,重新审视一下当时所记录下的负面想法:「它是真实的吗?」它不是真实的;「它发生的可能性大吗?」可能性并不大;「我有没有办法可以应对它呢?」我行动了我就可以应对它了。

所以,尽管去做,优先去做,默认去做,这就是你开始克服自我怀疑和恐惧的第一步,也是你摆脱精神内耗的第一步。

总结

我们所有人,每个人都是可以选择的,牢记默念「我是可以选择的」。我们选择接受自己的精神内耗,这只不过是我们大脑的默认工作模式。在漫长的人类进化过程当中,不断反思,不断进步的特征帮助我们的祖先生存下来,我们应该合理地去利用这种思维特征。

与此同时,我们在日常生活中,也可以通过正念的方式去觉察自己内心的各种想法,积累自己的注意力资源。而在真正做事的时候,为了避免分心,你可以尽可能提高当前任务的注意力需求,并且通过多任务切换的方式让自己的大脑保持兴趣。只有当你对当前任务的注意力足够投入的时候,你才不会分心去做其它事情。只有当你的注意力足够饱和的时候,大脑才不会启动精神内耗的过程。

最后,当然就是行动起来,给自己设立一个原则,尽管去做,优先就去做,默认就去做!

如果你觉得这篇文章(本期视频)还不错的话,请一键三连,如果可以分享的话就更好啦。之后我会给大家做更多相对软一点的知识讲解类的视频,当然也会伴随更多的软件实操的硬核一点的视频。我们下次再见!

对了,这篇文章同样是遵循了「先录视频,再写文章」的知识输出工作流。我在录制视频发布 B 站 之后,会通过飞书妙记的语音识别自动化生成文章初稿,再配合我记录下来的大纲进行初步修改。至此,文章基本的结构已经成型,我只需要再去补充跟它有关的一些内容和插图,插图可以直接来自我视频的截图,就能非常快速地产出这篇文章啦。

✇吕立青的博客

【双向链接的前世今生】上都计划与 Roam Research 思维工具

作者 吕立青
【双向链接的前世今生】上都计划与 Roam Research 思维工具

对我来说,我在很久之前就一直在探索知识管理、任务管理,这方面是我一直以来非常热衷的兴趣点。本文是我第一次系统性地介绍双向链接是什么,会先为你讲述 Roam 的 3 个故事,然后专注于解释 Roam Research最核心的 1 个功能:双向链接(当然,Roam 还有很多其他好玩的地方)。最后,我会介绍自己的 2 个应用场景,以及什么是 Tools for Thought 和为什么你需要一款思维工具?

一、Roam 的 3 个故事,源自上都计划

故事 1:@Ted Nelson 失落的超文本 —— 上都计划(Project Xanadu)

第一个故事其实是 Ted Nelson(泰德·尼尔森)的故事,上都计划(Project Xanadu)。1963 年,信息技术先驱、《Computer Lib / Dream Machines》作者 Ted Nelson 发明了「超文本」(hypertext)这一概念。但是,此时的超文本跟我们现在所讲的 HTTP 超文本传输协议大相径庭。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

在 Ted Nelson 构想的超文本系统中,我们访问的所有的网页或者叫文本,都应该是相互链接的。Xanadu(上都)是一个拥有很富文学意涵的字,马可·波罗(Marco Polo)在他的自传里提到 Shan-Du,指的是忽必烈汗元帝国的夏季之都。1965 年,Ted Nelson 将他发起的超文字构想,依照柯立芝的诗命名为「仙那度计划」(Project Xanadu),因为他认为仙那度是「一个记忆永远不会被遗忘的神奇地方」

但它最终跟我们现在听到的超文本系统是非常不一样的。1991 年,Tim Berners-Lee(蒂姆·伯纳斯-李)在欧洲粒子物理研究所工作时,提出了一套新的协议超文本传输协议(The Hypertext Transfer Protocol,即 HTTP),并且定义了超文本标记语言(HyperText Markup Language,即 HTML),然后才有了 HTTP 1/2 的实现。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

在 HTTP 这套系统里面,其实每一个事物都是有对应的一个统一资源标识符(URL)。但是你有没有想过,我们每次通过链接点进去,从 A 网页到达 B 网页,那我们又怎么从 B 回到 A 呢?

在 1991 年之后,基于 HTTP 协议的整个网络我们称之为它为万维网(World Wide Web,即 WWW),这都是我们非常熟悉的概念了,Tim Berners-Lee 也因此被称之为万维网之父。并且,在万维网上诞生了 Google、Amazon、Meta 等一系列大型互联网公司,使其易于连接和交易。

但是,Tim Berners-Lee 在一系列的连锁事件中,他也开始指责这些公司用广告的名义破坏了网络,凭借平台积累了过多的权力,因此创办了「Inrupt」公司和 Solid 项目,试图通过建立一个让用户控制自己数据的平台来「重塑互联网」

【双向链接的前世今生】上都计划与 Roam Research 思维工具

而对于 84 岁的 Ted Nelson 来说,「上都计划」是他一直以来的初心,他的个人梦想,直到 2014 年发布了第一个试用版本。「上都计划」的试用版本可以通过这个网页链接 https://xanadu.com 进入,你将看到一篇宇宙学的文章。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

网页的左右两边分别有不同颜色的划分,重点来说中间的这篇文章,其实它是引用了很多其他文章里面的内容。所以,在 Ted Nelson 最开始的愿景中,就期望通过双向链接在浏览网页的同时,能够把引用不同文章里的高亮能够互相引用起来。

不同颜色的高亮其实就表达了一种引用关系。当然「上都计划」除了这个引用关系的描述以外,还会有其他的一些构想,比如说版本管理或者增量出版等等,文本就不多作具体介绍了。

从 1963 年到 2014 年,「上都计划」才发布了它的第一个版本对吧?但是大家有没有想过,它竟然也是发布在万维网上的一个 URL 链接,也就是说连 Ted Nelson 的最初版本都还是不得已借助于 HTTP 协议来传播,基于万维网去实现它的第一个发布版本。

故事 2:@Conor 与 Roam Research 双向链接笔记/思考工具

【双向链接的前世今生】上都计划与 Roam Research 思维工具

第二个故事就要讲到 Conor,也就是 Roam Research 的创始人,他在 2019 年的时候推出了 Roam Research,掀起了双向链接笔记工具的浪潮。但其实在 Roam 的官网上,一直将 Roam Research 称之为一个「网状思维工具」。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

首先,Roam 是可以在一定程度上模拟前文提到的「上都计划」,不同页面之间可以相互链接,与此同时也有社区的设计师 Azlen 在 Roam Research 里面实现了 Block 块与块之间能够互相链接的可视化,不同的页面之间会有段落和段落之间的联系,而这些联系通过高亮的方式链接起来。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

Azlen Roam Style: “parallel pages, visibly connected”

那在 2019 年推出 Roam 之后,2020 年双链笔记最火热的同时,特别是资本也是非常狂热的,Roam Research A 轮融资 900 万美元,估值两亿多美元,最新的这个报道,显示的总计融资应该是 1240 万美元。

虽然体量很小,但是 Roam Research 却受到了资本的狂热的追捧,有十几家公司及个人参与了 Roam 的 A 轮融资,包括 Stripe 联合创始人 Patrick 和 John Collison、True Ventures 和 Lux Capital 等非常知名的一些资本。

当然,除了狂热的资本以外,Roam 也拥有一个非常狂热的社区,我们通常来说都称之它为 #roamcult 类似宗教的一个概念。这里有一个蛋糕,就是用户自行制作的 Roam Research 界面的蛋糕。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

然后与此同时,甚至还有人把 Roam Research 的 LOGO𐃏 符号纹到了身上或者腿上,我至少在推特上见过 5 个这样的狂热份子。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

故事 3:@JimmyLv 与 RoamCN 社区,“探索未来工作”

第三个故事是我自己的一个故事,我其实是在 2019 年初次知道双向链接,遇见 Roam Research,然后在 2020 年跟另外两个区块链领域的小伙伴(Jessie、Victor)共同创立了 RoamCN 中文社区

【双向链接的前世今生】上都计划与 Roam Research 思维工具

前文提到我自己的兴趣点,关注知识管理已经很长时间了,而 Roam Research 提供的双向链接刚好解答了我探索已久的困惑。与此同时,在中文社区,特别是对于我自己而言,我也在寻找很多的一些同路者,大家一起来学习探讨新的工具,一个极具突破性的工具。所以,我就不断地在使用这款工具来管理我的日常,不管是做项目或者是写文章、做视频等等。

「逍遥漫游,即时创作」是我最近在合桃派的一次直播,也是我使用 Roam Research 两年多的经验总结,分享的内容会比较详细啦,也可以推荐大家去看看。另外在 B 站上面,我有做过六十多个视频,也是一个不断输出不断学习的一个过程。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

特别好玩的是,在 2020 年我也因为对 Roam Research 的探索和学习,积累了一些工作机会。包括当时我去阿里,跟面试官聊的时候也聊到了 Roam Research,而在 2022 年 2 月 22 号,我加入了一家纯远程办公的公司(Parabol.co),开启了新的「完全在家办公」的工作方式。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

Parabol.co - Build the Future of Work

所以说,Roam Research 这样一款新工具不光是承接了我自己的一个兴趣,也让我有了一个“探索未来工作”的机会。其实我也是非常感激这些机会,特别是我遇到了很多非常好玩有趣的人,特别是像字节跳动、小米、微软、阿里巴巴的高层(我平常不可能接触到的那种)都注意到了双向链接,并且推进了相关产品的研发。

这三个故事分享完,我们可以对双向链接有了一个基本脉络,双向链接这个概念它并不新颖,其实在 1963 年就由 Ted Nelson 发布了「超文本」(hypertext)一词,此时超文本的原本概念就已经包含了相互链接。而直到 2022 年 Roam Research 推出之后,双向链接的概念才被普通人接触到,包括印象笔记等等这样的很多知识管理工具都开始跟进设计。

二、Roam 的 1 个核心:[[双向链接]]

接下来我会介绍在 Roam Research 里面,双向链接到底是一个什么东西,以及我为什么会对双向链接以及社区为什么会对双向链接如此的热衷。

0. 思想即技术 Thought as a Technology

首先想给大家介绍一个概念,就是「思想即技术」。在我们没有这个高速摄像机的时候,我们会怎么样去描述一个子弹穿过某些物体的呢?其实我们是没有任何手段去描述它或者说去观察这个过程的。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

在高速摄影机出现之后,我们就相当于有了一种新的认知元素。Michael Nielsen 物理学家在 Thought as a Technology 这篇文章提到 Tools for Thought 就是思维层面的工具,当我们拥有了一个新的认知元素,就可以在更低维度或者说在不同的维度去观察,那些以前我们觉得非常习以为常的一些元素,或者是概念、事物。

就像唐·诺曼提到,人们其实高估了自己独立思考的能力。我们的大脑如果没有像双向链接这样的思维工具作为外部的辅助,我们的思考、推理其实都是会受到限制的。那如果我们有了这样能够提高认知能力的外界辅助工具,我相信大家的这种思考或者是推理能力都会得到提升。

唐·诺曼,全球最具影响力的设计师,《设计心理学》的作者,苹果的前用户体验架构师,在他的《Things That Make Us Smart 让我们变聪明的事情: 在机器时代捍卫人类属性》一书中提到:「人们高估了独立思考的能力。 没有外部帮助,记忆、思维和推理都会受到限制… …真正的力量来自于设计能够提高认知能力的外部辅助设备。」

1. 页引用 [[]],“时空隧道”

Roam Research 的第一个概念就是页引用,大家接触双向链接之后最常见的双中括号的符号就是页引用。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

如图所示,首先我们在 [[October 12th, 2019]] 页面上写下了自己的一些想法,然后我们可以通过双括号的方式直接新建一个页面 [[Grant Proposal v3]],然后从这个页面上就可以直接跳转过去。而在 [[Grant Proposal v3]] 页面下方会显示对应的一个反向链接,所谓的双向链接就是包括正向链接和反向链接。

如果说大家对这个概念不是特别了解,我就抽象了一个相对来说更熟悉的一个概念,叫「时空隧道」。比如说你可以从今天穿越到 50 年之后或者是 3 年之前(时间),或者从今天穿越到一个对应的页面,你还可以在不同的页面当中进行穿梭(空间)

文字解释起来非常苍白,我在下方准备了一个视频,从任意的地方打开一个传送门,就可以直接穿越过去,这在一些解密游戏里面是非常常见的。比如说上方的锯齿机关就要压到你,进入传送门就直接从这一端穿越到了另外一端,恭喜通关。

这个就很像奇异博士的超能力,能够直接打开一个时空门或者叫哆啦 A 梦的任意门,你就可以随意地从时间上和空间上进行一个穿梭。

好,这是第一个双向链接的一个解释,特别是在 Roam Research 里双向链接的用途之一。当然页引用还有其他用途,我会在第三部分,也就是我自己的两个使用场景上给大家具体去解释。

2. 块引用 (()),“蜘蛛丝”

下一个双向链接的应用场景就是块引用。比如说我们在一个页面上有很多很多的节点或者叫段落,我们在写文章的时候,会期望把另外一个页面上的某一个段落直接摘录过来。

那就可以通过两个圆括号 (()) 直接把对应的段落 “拉”过来,比如说我用圆括号搜索刚刚写的「页引用」内容,你会发现它可以搜索到之前我写过的所有内容,然后直接把它拉过来。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

相应的,在块级别右上角有一个 reference 的数字,如果点一下就会发现又回到了刚刚讲页引用的出处,建立了块级别的「时空隧道」,也就是段落级别或者叫 Block 块级别的一个双向链接。

块级别的双向链接,我更期望说用“蜘蛛丝”的具体概念来给大家映射一下,或者叫类比一下。比如说我们想要拿到一个东西,我们并不需要直接跑到那个页面上去,而是直接通过圆括号 (()) 的方式直接就把它拉过来了,就像蜘蛛侠弹出蜘蛛丝,然后就把这个内容来拉过来

【双向链接的前世今生】上都计划与 Roam Research 思维工具

3. 动态块 {{}},“乐高马达”

下一个在 Roam Research 里面的概念是「动态块」,比如说我在视频中最开始的时候有提到过一个计时器,{{[[POMO]]: 25}} 就是通过花括号 {{}} 的方式直接创建出来的。

我可以把「动态块」类比成「乐高马达」,乐高这家公司确实X炸天,乐高机械组 1:1 比例完整还原全球时速最快的量产超跑——BUGATTI CHIRON。布加迪首席试车员更将这辆独一无二的超跑开上了跑道,真正意义上实现了机械传动的无限可能,完成了“让积木跑起来”的惊艳挑战。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

那么这辆车里面是用到了真正的「乐高马达」,因为乐高其实会有动态的和静态的两种,我们平常接触到的可能都是静态的,但其实是有一些动态的模块可以作为马达来使用的,从而你可以创作出更多的好玩的东西。

那这里我给大家举一个具体的例子,比如说我可以通过花括号加上一个 video 的特殊标识 {{[[video]]: https://www.youtube.com/watch?v=ZQdlCQmzUAM }},然后再输入视频的链接,这个 block 就会变成了一个动态的,可以显示 YouTube 视频的「动态块」,从而还可以播放视频,插入时间戳记录笔记,进行功能上的交互。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

为什么说 Roam Research 是一款思维工具,而非笔记工具?

所以说,Roam Research 被称之为一款思维工具,而不仅仅只是一款笔记工具的原因就在于基于 Block 的可编程性。首先就是前文提到的每一个 block 每一个段落都可以单独去拖动和处理,并且它可以单独显示,单独执行,可以被引用,可以被拉取。

万物皆可 Block 这个概念在使用 Roam Research 之前也有很多工具,包括 Notion、Microsoft Loop 等等,不得不说 Loop 的宣传片确实是让我垂涎欲滴等了好久,确实做得非常非常漂亮,也是我 2022 年最期待的一个产品之一。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

每一个元素都是可以单独拖拽、编辑和显示,并且具有很强的可交互性,你就可以像搭建乐高一样去搭建属于自己的知识操作系统,可以实现看板、 Table 等等各种各样的子系统,让它们去帮助你去做任务管理、知识管理等工作。

而 Roam Research 在使用体验上最大的特点,就在于它让我们写作跟“写代码”一样 [[]](()){{}}我们只需要通过简单的中括号 [[]] 去跳转到之前记录下的一些笔记页面或者叫卡片标题;我们可以通过圆括号 (()) 来搜索之前包含关键词的一些段落内容;最后,我们还可以用花括号 {{}} 来实现一些特殊用途的动态元素,比如说前文提到的番茄钟,就会变成了一个时间的按钮,我可以点击它,然后进行一个倒计时。

三、我的 2 个应用场景:输入/输出

【双向链接的前世今生】上都计划与 Roam Research 思维工具

首先,我们需要有一种思维的辅助工具,比如说像高速摄像机一样,当我们拥有了双向链接这样一个思考工具,或者叫新的认知元素,就能辅助我们在思维上有所提升,辅助你去思考,辅助你去推理。

「时空隧道」我们可以从今天跳到明天,跳到 50 年之后,也可以用它来串联起不同概念之间的一个联系。比如说我在准备这一次分享内容的时候,其实是有关联到到之前的一些页面的,比如说「探索未来工作」这个页面,跟今天要讲的内容就是串联起来的。这样产生的一个局部的知识图谱,就是双向链接的一个可视化效果。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

而当我们使用块引用的时候,我们可以把不同页面的段落快速地组装起来,像搭乐高一样把积木块搭起来,那就可以用到「蜘蛛丝」去快速拉取自己想要调取的内容。

另外还可以通过「乐高马达」来实现知识的编程,Roam Research 内的 Block 并不是静态的,而是可能能够像乐高里面的马达一样“转动”起来。

所以,拥有了这样一款思维工具,我们应该怎么样去使用它呢?接下来就进入到我的下一个话题,就是我是怎么去使用 Roam Research,怎么样在具体的场景中去使用它。

通过最简单的输入、输出模型将其分为两个部分,第一个是输入,我是怎么读书记笔记的,第二个则是怎么样高效地去产出,用自己的卡片盒快速地产出我要分享的内容、我要写的文章等等

1. 逍遥输入 - 读书、记笔记

所以,第一部分我会来讲读书记笔记的过程。可能之前大家都已经听说过卡片盒笔记法,甚至还有本书叫《卡片笔记写作法》,书中有一个最核心的观点,就是「不写,就无法思考」。那我们可以以读这本书为例,来简单讲解一下阅读+记笔记的过程。

点击跳转时间戳 18:58https://www.bilibili.com/video/BV1NS4y1Y749?t=1138

(这一段的文字描述同样过于苍白,还是推荐大家去看我在视频中的演示,我尽力了,🤣)

首先,我会新建一个单独的 Graph 来存放要读的书,《卡片笔记写作法》就是其中一本。那么在读书的时候,双向链接可以怎么样帮助到我们呢?比如说我们在读第一章的时候遇到一些概念,以「心流」概念为例,我就可以给[[心流]]加上中括号,也就是双向链接。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

此时我再点进[[心流]]这个页面,我就可以点开 Unlinked References 看到跟「心流」相关的内容,也就是在这本书里面的其他章节也提到了心流这个概念。所以说,每当我遇到了一些新的概念,我就会把新的概念加上中括号,从而就可以探索性地去发现这本书里面有哪些跟这个内容相关的。

如果将这个过程总结一下的话,区别于以前「线性地」根据章节去读这本书的过程,相反,我们其实是在跟作者进行一个交流,然后在交流的时候,还原作者脑海中原来的「网状结构」。认知科学家史蒂芬·平克曾经说过,他是从写作者的角度来说的:

「写作之难,在于将网状的思想,通过树状的句法,用线性的文字展开。」

每当作者写成一本书,写成一篇文章,其实是将自己在大脑中原本互相链接的网状结构,必须只能「局限性地」通过文字这种的线性方式进行展开。

所以,当我们在 Roam Research 阅读一本书的时候,就更像是在与作者跨时空交流,根据自己的兴趣点向作者提问。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

而我在提问交流的同时,我会使用 roam/comments 功能记录下自己的「闪念笔记」。这些笔记一方面会自动记录到某一天的 Daily Note,从而我可以通过「时间隧道」穿越到当时我读这本书的那一天。另一方面,也可以通过「空间隧道」穿越到我当时读这部分的具体内容是什么,以及当时我的想法灵感是什么。

当我通过双向链接回到到原文对应段落的位置时,我又可以重新去查看它的上下文。划重点,这里有个很重要的概念就在于「上下文」当我根据自己的笔记无法得知当时我在阅读的是哪部分的时候,我可以通过双向链接的反向链接直接回到当时读书的这个出处,从而我能够去得知当时在书中原有的意思是什么。

这基本上就是跟一个作者一本书里面交流的过程。其实我还有个想法,期望以一个主题阅读的方式去同时读多本书的,在《如何阅读一本书》中称之为「检视阅读」。如果说,我把多本书同时导入到 Roam Research 里面,比如说把认知科学的一些书全部放到一块儿呢?

【双向链接的前世今生】上都计划与 Roam Research 思维工具

我最近在读斯坦诺维奇教授的系列著作《机器人叛乱》、《超越智商》、《决策与理性》、《理商》;平克教授的《风格感觉》;特纳教授的《古典风格》;艾利克森教授的《刻意练习》及弗林教授的《智力是什么》、道伊奇教授的《重塑大脑,重塑人生》、约翰逊的《日常生活的神经科学》、科斯林教授的《上脑下脑》等书,阳志平老师集结的《追时间的人》、《认知尺度》和所著的《人生模式》等书。

其实在心理学、认知科学这些领域里面有很多类似概念的书,并且在学术上还会相互引用。如果说我们把多个作者多本著作全部导入到 Roam Research 里面,是不是就像把这些作者全部都拉了一个群,围着一个圆桌,让他们自由地根据一些关键词概念进行讨论。

哇,这就相当于在不同年代、不同地区的人物们以一种双向链接的形式,从而形成一个「跨时空」的交流。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

2. 高效产出 - 卡片盒、块引用

接下来我再讲第二个部分就是高效产出。当我们在读书、记笔记之后,我更希望的是能够高效产出。我在记完笔记卡片之后,会将卡片放入卡片盒,通常来说我会将卡片盒一直显示在侧边栏,里面存放了非常非常多的卡片内容。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

卡片笔记我会通过一个 #关键词+{{[[embed]]: [[卡片标题]]}} 的方式组织起来,最最重要的是右边的引用符号,显示的数字代表着我有几个地方关联起了这张卡片,也就是说这些知识卡片就是相互链接的,形成了一个网状结构。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

那么,当我需要产出或者写文章的时候,我就可以利用「块引用」,非常方便地去创建草稿,再基于草稿内容,我就能非常方便地去修改最终的产出。

点击跳转时间戳 25:50https://www.bilibili.com/video/BV1NS4y1Y749?t=1550

(同样,这一段的文字描述同样过于苍白,还是推荐大家去看我在视频中的演示,我尽力了,🤣)

比如说我要做一个分享,就会在卡片盒里面去寻找相关的卡片,可以通过 Alt + 鼠标直接把卡片内容从侧边栏的卡片盒拖入当前的项目页面。借助于卡片盒,可以非常快速地生成我想分享的一些内容,然后再对内容进行一个改写。这样产出文章的速度是非常之快的,且符合「快写慢改」的认知写作模式。

比如说我在 B 站做视频,也会采用这样的过程来快速产出这个大纲,再把它通过录屏的方式讲解出来,而产出的视频又可以通过语音识别自动生成文稿,再对其进行润色就能产生一篇高质量文章。

另外,在我平常做项目的时候,其实也会使用类似的非线性方式。比如说我最近新上手公司的技术栈,我之前是没有用过 GraphQL 和 Relay 相关的一些技术。那么,首先我需要理解问题,再去确定它的验收条件,在一个非线性的模式下去边学边做 Learning by Doing。在这个例子中,首先我去学习什么是 Suspense,什么是 Entrypoint 模式,在学习的过程中会遇到很多很棒的文章,又会边读边做笔记,从而就是这样磕磕碰碰「非线性」地去完成开发需求。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

总结一个框架叫做「人、事、果」,因为在整个开发的过程当中,比如说我会提到一些人或者一些事,比如说我会在很多提到同事 @Matt,而我每次只需要进入到 [[@Matt]] 这个页面,Roam 就会自动汇总我总共跟他有哪些联系,比如说我哪天跟他有 1:1 会议,或者是我需要有什么东西想要寻求他的帮助,就可以批量地一次性解决。

其实,「人、事、果」就是可以把人、事情和结果全部都链接起来,就很像一些在线协同工具,像飞书、钉钉、Microsoft Teams 都在尝试将组织、文档和目标链接起来,但可能都没有做到真正的双向链接。这样的话,公司在评估项目结果的时候,就可以看到有哪些人参与进来了,然后有哪些事情(“一事一文档”)被完成了,并且这这些事情所对应的人和目标其实也是非常清晰的。

所以,双向链接在这样的使用场景下,是能够帮助我们去了解关于某个项目、某个人或者某个目标更多的上下文,并且只有链接在一起,才构成了一个完整的上下文。

最重要的是,积累模板:e.g. 九宫格

另外就是做决策,我们讲高效产出或者叫输出,「输出」并不一定是写文章或者是做视频,其实更大的作用是帮助你去做出更好的决策。

我平常会积累一些模板,每当我需要做一个决定,第一件事情应该去扩充自己的可选项。面对选择,其实不只有 A 或者 B 这两个选项,而是有更多可能的选项。比如说当我思考直播分享要不要开摄像头,原本的答案可能只有「开」和「不开」这两个选项,但其实我还可以思考一下,摄像头是不是买好一点?或者我可以开美颜?甚至是换上正式一点的衣服?

当我思考了更多的可能性,最终的决定可能是「换上正式的衣服,再开一个美颜」。这样的话,是不是比我们最开始选择「开与不开」的某一个选项会更加好一点的?

【双向链接的前世今生】上都计划与 Roam Research 思维工具

最重要的是,Roam Research 是一个思考工具,而思考需要模型或者模板的辅助。我们在整个产出过程当中应该多去积累自己的一些知识晶体,也就是知识的沉淀,并且在实际中去不断运用它,迭代它。

我在 roam/templates 和 roam/js/smartblocks 里面积累了很多的自动化模板,比如说写文章、晨间日记、每日计划、Weekly Review 或者是深度工作的时候,都可以有一些模板。这其实是一种「思维算法」( Algorithms of Thought),也是一种思考的自动化。

这些积累的模板是我的一个外置辅助,也就是刚刚提到的思考工具,就像高速摄像机一样,能够辅助我去做更好的内容产出,或者说加速我做事的过程。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

再举一个例子叫九宫格。通常来说我会用九宫格的方式去思考要完成的项目,这次演讲的过程也是用九宫格快速地做出来的,「中心」就是我的主题:「做一场贼有意思的直播」,再通过南东北西这样的方式建立一个大纲式的「初心」,最后从西南、西北、东北、东南四个角这样的方式来补充细节,也就是「细心」

这样的思考框架,可以帮助我更快地去思考,并且考虑整个产出的全面性。九宫格是我觉得非常有用的思考方式之一,而只要日常不断积累和迭代思考的模板,就能通过模板加速你输入和输出的效率。

为什么是我?Believer of Tools for Thought

在前文的九宫格规划截图中,我就提到了我最希望的是认识更多的人,能够跟大家互相去学习和交流。因为我非常喜欢的一句话,「在成长的同时帮助他人成长,在学习的同时帮助他人学习」。学习和知识管理是息息相关的,这也是我在最开始的时候提到我为什么对学习方法和知识管理这件事情非常的热忱。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

而 Roam Research 就是目前最好用的双向链接笔记工具,没有之一。我也是买了它 5 年的 Believer 版本,500 美元也就是一次性付费人民币 3000 多,但我所获得的成长价值已经远超于此。

另外,我也做了很多相关的视频,有兴趣的话大家可以去 B 站上关注一波。如果大家对知识管理感兴趣,想要跟我交流,也可以加我的微信。另外我在少数派上也有很多文章都是讲 Roam Research 以及思考工具和知识管理相关的,大家也可以去查看一下。

彩蛋:如果,浏览器能够直接内置双链笔记呢?

我在探索双向链接的过程中,一直在纳闷为什么浏览器就没有动力去实现网页之间的双向链接呢?直到我看到了 Beam,我在B 站视频中介绍了这个内置双链笔记的新型浏览器,有一个非常顺畅的交互体验在于,按住 Alt 可以直接对网页内容进行摘录,并且可以选择摘录到某一个页面。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

但是,我在视频中也吐槽了为什么 Beam 浏览器没有做到极致,是因为当我们回到「被摘录的网页」时,Beam 在右侧并没有任何地方去显示我在针对这个网页所做的笔记。它虽然建立了摘录笔记的快捷方式,但遗憾的是也未能做到反向的链接,而这其实是实现了至少在我个人层面,我觉得最有价值的一个功能。

如果现阶段有浏览器能够实现任意网页和任意笔记之间的双向链接,我愿称之为“Dream Browser”!目前来看,Microsoft Edge 的集锦功能最有希望,毕竟已经有了一定的基础。

如果能够实现「个人」的笔记跟「互联网」的网页之间的互相链接,那么也就回到了我最初所讲的「上都计划」,Ted Nelson 的最终愿景可能算是在一定程度上得以实现。

【双向链接的前世今生】上都计划与 Roam Research 思维工具

这绝对是非常非常牛逼的一件事情,也是 Ted Nelson 在 1963 年最初的构想里面,就思考过和想要做的「一个记忆永远不会被遗忘的神奇地方」。

只是,互联网是人类历史的一段弯路吗?

参考资料

[@少楠 - 🗄 个人知识管理指南 flomo 101](https://help.flomoapp.com/thinking/pkm.html)

✇吕立青的博客

我是如何艰难地克服「效率成瘾」的?

作者 吕立青
我是如何艰难地克服「效率成瘾」的?

作为一个效率工具爱好者,也是一个效率产品的从业者,天然地就会去把玩各种各样的 App 或者是软件。我还记得我在大学的时候有打开 Firefox 的扩展商店,玩各种各样的插件,甚至连玩插件都能够玩上一个通宵,当然这是非常不健康的。

而到了工作以后,我还是会定期下载手机上的 App 来玩,很多时候都会去应用商店里面试用各种各样新鲜的 App,经常会找限免或者是“最美应用”这样的平台去发现新的效率工具,后来越来越意识到自己陷入了「效率成瘾」或者是叫 Productivity Porn(效率色情),于是开始自己寻找药方。

药方 1:玩具属性 vs 工具属性

效率色情(aka 生产力色情)这个词最早出现于《生活黑客》这本书,书中写到 Porn 这样一个词,其实是「对某件事情上瘾」的一种描述,不只是说对色情内容上瘾,而是你对其他的内容像是生产力工具,或者是各种各样的时间管理方法的无止限追求,都可以称之为 Porn。

比如说武侠或者是枪战动作片,其实也是一种 Pron,就像我们去电影院看的商业片,其实最重要的卖点就是那些在赛道上的追逐戏或者是动作类的打斗戏,让我们自己产生一种代入感,就像自己能够拥有主角那样的能力。

那么类比来说,当我们使用效率工具的时候,就很可能认为当自己掌握某项工具的时候,会像其他使用该工具的人那样厉害。但现实往往会打你的脸,哪怕你用上最贵的 GTD 工具 OmniFocus 或者是笔记软件 Roam Research,你可能依然只是在把它当成一个玩具,而不是真正把它作为一个工具。

我是如何艰难地克服「效率成瘾」的?

【效率工具01】OmniFocus 4.0 初印象

其实「工具」是一种执念,当你不断地去追求新的工具,追求新的方法论,一直在忙于磨刀,却一直没有去砍柴,就一直没法推进自己的项目

其实所有的效率工具都有两个属性,第一个是它的玩具属性,第二个是工具属性。那么我找到的第一个克服效率成瘾的办法,就是一定要区分当前自己是在「玩玩具」还是在「用工具」

当我们在「玩玩具」的时候,你就可以用这段时间尽可能地去发现更多的应用,去探索更多的可能性。比如说少数派里面就有很多的文章会教大家如何去使用工具,或者就像大家看 VLOG 或者是测评类的视频时,其实你也是在一种玩的属性,因为这个时候你也会将自己代入进去,而这个时候其实你只需要享受玩具或者是看别人玩玩具的快乐就好

我是如何艰难地克服「效率成瘾」的?

而当你在「用工具」的时候,你最重要的事情还是要把事情做完,真正的 Getting Things Done。

药方 2:Create Before Consume

我每天都会使用 RSS 或者是 Twitter 来刷各种各样的信息,很多时候我就会问自己:这些信息都只是我的消费品,那当我去消费这些信息的时候,我能得到什么呢?或者说更重要的是在我消费它之前,我自己能不能先输出内容呢?

我是如何艰难地克服「效率成瘾」的?

Feedly 和 Twitter(with Twemex)

因为现在是 Web 2.0 时代,所有的平台都在鼓励创作者在他们的平台上创作,而平台通过智能推荐算法来引诱人们去消费它的信息,创造属于平台的商业价值,尽可能地赚取你的注意力

在这个流量经济时代,你会发现最典型的就是宠物、小孩以及性(打擦边球)这类信息在抖音或 TikTok 盛行。为什么呢?因为它是一个注意力驱动的商业时代,《注意力商人》的工作模式就是收割观众的注意力,向观众投放广告

而观众不会永远被动,早晚都要反击。其实办法也很简单,就是要在你消费之前去创作,Create Before You Consume。我特别期待于 Web 3.0 的到来,所以我们应该尽可能的 Publish More,就像我在读文章的时候,我也会想:当我看了这篇文章准备消费下一篇文章的时候,我对当前内容有没有什么评价呢?

其实我也就会直接在作者的文章下面进行评论,比如说我的知识管理工具 - 少数派这篇文章提到了作者的一个工作流,使用到 Cubox、Flomo 以及思源笔记。那我就在评论区做了一个总结:

我是如何艰难地克服「效率成瘾」的?

那么就这样一段话,我会把它直接放到这篇文章的评论区,当然我也会把它保存下来,放到 Telegram,通过 telegroam(Telegram + Roam) 直接发送到 Roam Research 里面。

还有更多的时候是跟作者进行交流,作者发表文章就是想要获得读者的反馈,就像我在2021 —— 我的工作流定型过程 - 少数派另一篇文章下面也有所评论,作者总结了自己的一个工具流,那么当我读完之后,我也会直接告诉作者我从他的文章当中学到了什么:

我是如何艰难地克服「效率成瘾」的?

这也是一个即时的输出。我将自己的笔记法称之为「春夏秋冬」笔记法,春天播种收集,夏天除草规整,秋天收获输出,冬天储藏归档,通常来说也会引起作者的更多讨论。

我们也可以从哲学角度来说,当你需要消费内容的时候,你也需要别人来创作;而当你创作内容的时候,也会期望其他人的注意力和互动。那么 Create Before You Consume 其实就是「己所欲,施于人」

药方 3:“重器轻用”,自由组合

“重器轻用”其实是张玉新老师(善用佳软)提出来的一点,我们已经见识到了各种各样的工具,每一款工具都有它的独特的地方。我之前有在Roam Newsletter 漫游研究所周报 #2020W52这一期里面提到过:我们之所以用某一款工具,一定是因为它那 20% 特别吸引我们,那么此时我们就只需要用好它最重要的 20% 的功能即可。

就像在 Roam Research 里面,我最喜欢的是它的 block reference 块引用,比如说我可以通过 (()) 来找到任意可以引用的内容,然后还直接把我需要引用的内容快速地粘过来,然后打上我想要的标签。

我是如何艰难地克服「效率成瘾」的?

就像 Tim Ferriss 提到,我们在 2022 这个新年之际,不要去做那么多的新年愿望,雄心勃勃地觉得自己新的一年会有新的改变。但其实这么多年过去了,今年是什么样,去年是什么样,有多大差别难道你自己还不清楚吗?所以说大家应该多做 Past Year Reviews(PYR)也就是过去一年的回顾,少做 New Year Resolutions 新年愿望。

所以说,再举个用好重器 20% 功能的例子,对于 DEVONthink 来说,我觉得它最重要的就是 Search 搜索功能。比如说我通过 Alfred 的 DEVONthink 插件快速输入「重器轻用」,然后我就可以搜到在 DEVONthink 里面所有关于「重器轻用」的信息。而这个搜索速度是极快的,并且在右侧边栏,你可以看到搜索结果有一个展现的区域,让你快速知道哪些地方有相关文字的一个出处。

我是如何艰难地克服「效率成瘾」的?

DEVONthink 极致搜索体验

其实我就能找到之前所有提到该内容的地方,而这个地方的“快”是非常重要的。我常常把 DEVONthink 比作是一栋楼当中的地下室或者是楼阁,当我们需要找什么内容的时候,我们能够非常快速地去找。虽然说平常不会去楼阁里面翻东西,但只要它搜索起来很快,你就能够快速地去找到想要的内容。

就像我今天要分享的内容,其实是在我看一篇文章的时候,快速记录下的跟文章有关的一些想法,而这些灵感会自动通过 Diigo 同步到 DEVONthink 里面。从而当我回顾时,我就可以通过 DEVONthink 重新打开这篇原文查看当时划线的位置。

当然,你也知道在 Diigo 里面也有大纲的功能,并且你可以直接把正在读的文章高亮,直接转化到 Diigo 的大纲编辑器里面。但为什么我不去用它呢?因为它虽然有,但是做得并不够极致。

我是如何艰难地克服「效率成瘾」的?

而我通过 Diigo + DEVONthink + Roam Research 这样的工具可以自由地组合,我就可以用好每个软件最特色的 20% 的功能。而自由组合这一点其实就来自 UNIX 哲学

  • 每个程序只做一件事,做好它
  • 多个程序相互组合,共同完成复杂任务

总结一下,如果你想克服效率成瘾,不要去追求一个软件 All in One,而是用好每一个软件最有特色的 20%,然后通过自由组合的方式,把各自的功能发挥到极致。你要知道,你的最终目的是为了产出,Create Before You Consume。

药方 4:流程化、标准化、自动化

我在前文提到注意力是非常重要的,而注意力意味着我们要专注,专注意味着我们直达目标。而到达目标之前的中间部分其实就要减少浪费。什么是效率?其实就是在减少浪费。而如何减少浪费,就是要尽可能把我们要做的事情自动化起来。

对于我们做事情来说,特别是效率工具来说,最好的状态是不要接触它,只有当你不用操作它的时候,你就不会被吸引注意力。

举一个 DEVONthink 的用例,比方说当我每次需要去切换视图显示在左边还是右边的时候,DEVONthink 默认的快捷键是 ⌘+5/6/7,显然不是很好按,而它默认的 ⌘+1/2/3 我却一般用不到它。所以我就可以通过 BetterTouchTool 映射 DEVONthink 的快捷键操作,比如按下 ⌘+ 1,我希望把它转换成 ⌘+5,以此类推。

我是如何艰难地克服「效率成瘾」的?

首先,我们要去总结自己常用的一些操作,然后把自己的操作标准化出来,从而我们可以通过一些像 BetterTouchTool 这样的自动化工具来保存你的自动化流程。

在 DEVONthink 里面,最常用到的有两个自动化功能,一个是 Workspace。比如说,我总是需要打开我的“高亮视图”,回顾我所有的网页高亮,此时按下快捷键 ⌘ + Enter 就会跳转到下一个我收藏过的,但还没有阅读的内容。

我可以通过 Workspace 来保存这个自定义的“高亮视图”,在我平常用的时候并不会打开它,但每次我需要启动它的时候,我只需要在菜单栏选中“高亮视图”或按下快捷键,DEVONthink 就会完全变成另外一种形态。

我是如何艰难地克服「效率成瘾」的?

另外一个 DEVONthink 的自动化功能是 Smart Rules,比方说我要 filter 所有重复的内容,或者是我可以自己新建很多自动化的规则,让它自动帮我去做一些原本手工需要做的事情,比如自动将网页转成 Markdown 格式。

再举一个更直观的例子给大家介绍一下。Keysmith 这个软件很神奇,我们可以创建一个工作流,并且你可以录制它,录制的时候可以模拟你所有的鼠标点击事件或者是快捷键操作。然后当你再次运行它的时候,你就会发现它可以帮你自动执行这些操作。

我是如何艰难地克服「效率成瘾」的?

Keysmith 自动记录内容至 Telegroam

比方说我正在阅读文章内容,只需要按下快捷键,Keysmith 就会帮我自动打开 Telegram 然后把网页的 Markdown 链接粘贴到输入框内容。而这个时候我只需要再粘贴一遍我复制的内容,再写下我自己的留言发送过去就可以完成一个速记。

而 Telegram 所有的内容其实都会保存到我的 Roam Research 里面,所以这就是借助于工具来帮助我快速达到自己想达到的一些目的,特别是收集 Fleeting Note 的时候一定要是“唯快不破”,因为灵感往往“稍纵即逝”。

类似这样速记或者阅读的流程,我们都可以先把它流程化出来。通常来说,你可以用看板来标识每个阶段,比如说 Todo、Doing、Done。然后,你再去想哪些地方可以改进,哪些地方可以优化,从而减少每个流程之间的重复步骤,也就是我们要尽可能减少工具的不必要操作,提高效率其实就是减少浪费。

我是如何艰难地克服「效率成瘾」的?

药方 5:建立“防崩溃”机制

克服效率成瘾的最后一点,你还需要一个“防崩溃”机制。对我来说,最为典型的一个机制就是 Daily Notes。它让我意识到,每天都是崭新的一天,而这崭新的一天能够帮助我重新开始。不管昨天做得有多烂,我今天面对的都是一张白纸,而这张白纸等待我去书写,写下新的内容。

我一天当中会先以 Objectives 也就是目标为核心来写下我所有的内容,另外还有一项是前文演示过的 Quick Capture。也就是说,我在手机端 Telegram 里面记录下的内容,会自动同步到 Daily Notes 的 Quick Capture 这一项。

我是如何艰难地克服「效率成瘾」的?

我的 Daily Notes,每天都是一个崭新的开始

就像今天看到的 Twitter 内容,或者是我记录下的一些网页摘抄内容,或者是我在手机端的一些想法,或者是刚刚给大家演示的测试部分,都会自动放到我的 Daily Note 里面。而每一天都是这样一个崭新的开始,避免我的自我管理系统陷入混乱,从而容易崩溃。

另外一个机制是 P.A.R.A 中的 Archive,归档这个概念的意义其实也是非常非常重要的。就像我会把所有内容都归档到我的 DEVONthink 里面,我可以看到我所有的推文、所有的笔记,然后也可以看到我所有的网页高亮,还有我发布过的博客或者是 Newsletter 都会归档到我的 DEVONthink 里面。

我是如何艰难地克服「效率成瘾」的?

博客内容自动归档至 DEVONthink

只有当你归档之后,一切才可以安心,也就是你可以防止自己陷入系统的混乱而崩溃。而“防崩溃”这个概念之所以重要,也是意在帮我们创建一个对外的接口,只要接口不变,内部一定程度的混乱是可以接受的。

这里的类比其实很有趣,当我在 DEVONthink 里面搜索时,经常会搜到一些其他领域毫不相干的一些内容。比如说我会搜到“防崩溃”来自领域驱动设计软件架构里面的一个概念,但其实“防崩溃”这个概念最开始是我在读少数派的信息管理专栏里面看到的。当然,防崩溃层在软件架构里面其实也是非常典型的,我们可以把防崩溃层看作是客户模型的一个服务,它抽象了我们在一个范围内会如何去使用,它可以被理解为一个适配器,而这样一个适配器在包装之后就可以安全地裹住过往。

还有一个概念叫“安全网”,就像我们在高速路上会遇到旁边的滑坡,而这些滑坡上往往会通过铁丝网的方式固定住山坡的泥土,防止它崩溃下来。虽然这些“泥土”可能已经很散很乱,但是没关系,我们可以有勇气重新开始,每天都是一个崭新的开始。

我是如何艰难地克服「效率成瘾」的?

防止山体滑坡的“安全网”

「效率成瘾」药方总结

好,那么我已经把整个一篇文章“讲”完啦(为什么是讲呢?因为还有 B 站长视频版 🐶),最后让我们来总结一下。

  1. 第一个药方是玩具属性 vs 工具属性:我们要破除工具的执念。好的工具虽然会让我们有一种“代入感”,好像自己拥有了这样一个工具之后就会变得很厉害。但其实只有把它真正地当成工具用起来,才能够真正地推进项目,改变你的生活。玩的时候就好好玩,用的时候就要发挥工具的极致。
  2. 第二个药方是 Create Before You Consume:我们要尽可能在消费之前创作属于自己的东西,要更多地去发布,更早地去发布。那么创造其实是为了得到你自己更想消费的东西,也就是己所欲,先施于人。
  3. 第三个药方是重器轻用,自由组合:我们不要去想着在一款软件工具上 All in One,而是要用好每一款工具的最具特色的 20%,然后通过自由组合的方式让他们能够彼此配合起来。同时也呼应了第一点,我们也可以去尽可能使用更多的工具,满足自己的工具贪玩的心态。
  4. 第四个药方是流程化、标准化、自动化:当我们使用了各种各样的工具相互配合之后,我们要将它基于写作或者任务管理、目标管理等等的流程梳理出来,将它们标准化起来,形成 SOP。这样你才更有可能通过自动化工具将它们组合起来,每次做事情的时候就能够直达目标,减少不必要的浪费。我推荐大家可以用看板的方式把它梳理出来,然后尽可能缩短从第一步到最后一步的步骤。
  5. 最后一个药方则是建立防崩溃机制:我们通过 Daily Notes 的方式来让自己意识到每天都是一个崭新的开始,不用去担忧过往,过往都被安全地包裹了起来,让我们更加有勇气地出发。不管过去怎么样没关系,今天我们可以再次做到自己想做的事情,自己选择成为什么样的自己。

彩蛋:One More Thing

这篇文章参加少数派的2021 年度征文,也是我为了打造令人满意的个人知识工作流所做的一次尝试,也就是「先录视频,再写文章」。

录制视频发布 B 站 之后,再通过视频的语音自动化识别的方式产生的文稿,配合我记录下来的关键点而自动导出为一篇文章。至此,文章基本的结构已经成型,我只需要去补充跟它有关的一些内容和插图,插图可以直接来自我视频的截图,从而非常快速地产出这篇文章。

我是如何艰难地克服「效率成瘾」的?

【效率思维01】我是如何艰难地克服「效率成瘾」的?

那么我们下次再见,不要忘记三连 + 关注(少数派也要哦,年度征文要看数据的啦 👁),谢谢你!❤️

✇吕立青的博客

便签再思考:最好的工作便签,上下文优先

作者 吕立青

零·前言:上下文优先

决策的自由:Context, not Control

便签再思考:最好的工作便签,上下文优先

当下,全球爆火的现象级影视剧《鱿鱼游戏》由 Netflix(网飞)推出,在包括美国在内的 90 多个国家观看量排名第一。

这不禁让我对 Netflix 这家流媒体巨头公司有了更强的好奇心,为何 Netflix 能够持续推出像《纸牌屋》《黑镜》《鱿鱼游戏》这样的影视剧爆款?

便签再思考:最好的工作便签,上下文优先

在 Netflix CEO 哈斯廷斯出版的新书《不拘一格》(No Rules Rules)中,他提到管理的本质,就是激发和释放每一个人的善意,最终通过他人来达成结果。

其实,「自由与责任」文化贯穿了 Netflix 内部管理的始终。哈斯廷斯相信,有责任感的人因为自由而成长,也配得上这份自由:人才重于流程,创新高于效率,自由多于管控。

而来自 Netflix 的 「Context, not Control」(情景管理,而不是控制管理)理念,也直接影响了字节跳动的企业文化。

我们坚持的「context, not control」的理念,受到 Netflix 的直接影响。当然也很大程度上跟哈耶克关于 理性的自负 的论述有关,我认识到信息透明、分布式决策和创新的重要性。 —— 张一鸣《字节跳动 8 周年:往事可以回首,当下更需专注,未来值得期待》

张一鸣在《做CEO要避免理性的自负》演讲中将 CEO大脑 比喻成计算机,计算机有两种处理任务的方式:一种是超级计算机,用一台计算机处理很密集的任务;一种是分布式的运算,让很多机器共同来处理任务,把任务分解,把任务所需要的资源分解。

  • CEO决策好比超级计算机,单台机器处理很密集的任务,提出战略规划后自上而下逐级执行和汇报,充满审批和各种流程;
  • 群体决策好比分布式计算,由很多台机器来共同处理,将任务和资源分解细化,更多集体智慧自下而上涌现,过程中需要更多人基于上下文或者说场景(Context)来做出判断。由此最大程度地避免决策者「理性的自负」和决策延时。
便签再思考:最好的工作便签,上下文优先

具体来讲,Context 是指决策所需要的场景/情境信息的集合,包括背景是什么,市场环境如何,整个行业格局如何,优先级是什么,需要做到什么程度,以及业务数据和财务数据等等。

「不写,就无法思考」,也就无法制定决策

对于个人而言,管理是什么?来自 Herbert A. Simon 的一个定义:管理就是制定决策。

什么叫决策?决策其实是一系列的决定,决定是一个向目标不断迈进的过程。(via《决策思维》)

  • 第一是确立目标。也就是问自己 Why 为了什么而努力,否则你根本就不知道你要干什么。
  • 第二是分配资源。也就是问自己 What,为此可以付出什么?为了一个目标所分配相应的资源:不仅是金钱,还可以是投入的时间、精力等。

所以说,当你获取大量信息,记录笔记,积累知识,最重要的是为了思考,进而产生关键洞见。知识的意义是帮助你制定一个好的决策。

便签再思考:最好的工作便签,上下文优先

作为一名知识工作者,德国著名社会学家尼古拉斯·卢曼十分高产,出版了 58 本学术著作,发表了数百篇论文。

他的学术产出数量已经非常惊人,但更重要的是产出质量也很高,充斥着极为精彩的思考,其中《社会的社会》《社会的艺术》等著作成为新的学科经典,被称为「当代的黑格尔」。

便签再思考:最好的工作便签,上下文优先

 

有人评价卢曼说他担心的似乎不是字数不够,而是学术论文的篇幅无法装下他那么多精彩的思考。

当被问到自己为何如此高产时,卢曼的回答显得很谦逊,他说,「不是我想出来的,是卡片盒子想出来的」。

「不写,就无法思考。」(卢曼 1992,53)

在《卡片笔记写作法》书中提到,卢曼认为一条笔记的价值只取决于它的上下文(Context)——笔记的关联、关系和与其他信息的双向链接网络。他开发了一个基于纸质索引卡的简单系统,称之为「卡片盒」(德语为 Zettelkasten),用于将任意一条笔记与尽可能多的不同上下文(Context)联系起来。

卢曼的卡片最重要的是读书笔记,写在卡片上的不只是一些值得引用的文句,或者是誊写的段落。更重要的是,在上下文(Context)中产生了什么自己的想法。

卢曼的卡片盒逐渐成为他工作中的一个思维伙伴。卢曼把这个系统描述为他的第二记忆,另一个自我。这套系统不断给他带来惊喜,正因为如此,卢曼声称在他自己和卡片盒之间存在着「实际的交流」。

回到个人,如何构建 Context 参与决策?

如今很多公司都在推行目标管理工具 OKR(Objectives and Key Results,即目标与关键成果法),OKR 管理思想的精髓就是给到员工个人更多透明公开的Context,自上而下设立目标以及实现路径。

便签再思考:最好的工作便签,上下文优先

多提供 Context,减少 Control,决策指令不是单纯的上传下达,而是让同事之间通过提供上下文来对齐,通过内部信息透明来解决问题、做出决策、提高效率。

Context 让我们每个人都参与决策,想法从下往上涌现。这个过程中每个人需要基于背景信息做出自己的判断,而不是根据指令像机器人一样运转。

这种方式就很像前文所提到的计算机分布式计算,每台计算机都有 CPU,让很多机器共同处理任务,没有一个所谓的中央超级计算机。

「知识型组织中,每一个人都是管理者」——彼得·德鲁克 

我们从工业时代进入到知识时代,亲眼见证了人类历史上最重要的转换。最卓越的管理思想家之一,彼得·德鲁克(Peter Drucker)这样说:「这是历史上第一次,人们可以做出自己的选择,而且是越来越多的人可以做出选择。这是第一次,他们不得不自我管理。」

「而社会完全没有对此做好准备。」

作为知识工作者,所谓知识管理的输出,不是写文章,也不是日更公众号,这并不能解决实际问题,而是你需要运用知识来做出正确决策。

其次,输出不是单纯为了获得他人的关注,而是为了获得高质量的反馈,从而提高你制定决策的质量。

一·灵感瞬间,如何记录想法?

天下武功,唯快不破:什么是闪念笔记?

卢曼在卡片盒笔记法中将笔记分为 4 类:

  1. 闪念笔记(Fleeting Notes):这类笔记只是对收集信息起提醒作用,可以用任何一种方式来写,最后会在一两天内被扔进垃圾桶。
  2. 文献笔记(Literature Notes):无论你读什么,都要做笔记,写下你不想忘记的内容,或者你认为可能会在自己的思考或写作中使用的内容。文献笔记要非常简短,精心选择,并使用自己语言记录,对引文要格外挑剔,不要只是抄写,而不去真正理解其含义。
  3. 永久笔记(Permanent Notes):这种笔记以一种永久可以理解的方式包含了必要的信息,并且永远不会被扔掉。它们总是以同样的方式存放在同一个地方,或者是在文献管理系统中,或者按出版标准写好放在卡片盒中。
  4. 项目笔记(Project Notes):它们只与某一特定项目有关,保存在特定项目的文件夹内,项目结束后即可存档或丢弃。

平时记录灵感的卡片就是闪念笔记,只记录,不存档,有想法就记下来。过一段时间我们回来再看,也许自己有了更深刻的思考,和更好的想法,这时我们只留下有价值的笔记,完善一下卡片里的想法和表达,作为永久笔记保存在卡片盒里。

这样一来,卡片盒里留下来的主要是自己经过反复思考后的精华,因此卡片盒中的思想纯度更高,优秀的想法更加容易发生碰撞,产生更多的好想法。

按照卡片盒笔记法的流程整理过后,卡片盒可以成为我们产生新想法的有力武器。其实新想法从来都不会从天而降,需要我们在翻找卡片盒的过程中,不断去总结和发现。

「放翁本学西江者,其云:『文章本天成,妙手偶得之。』平昔锻炼之功,可于言外想见。」——刘熙载

工作场景中的钉钉便签

在「工作」这个上下文中,很多同事在电脑显示屏上都贴满了五颜六色的便签。传统的纸质便签在文具店随时都可以买到,从高考到职场,便签一直伴随着我们的左右,一写一撕一贴。

跟传统纸质便签一样,数字化的钉钉便签也可以用来快速记录碎片化信息,或者将紧急重要的信息贴到眼前,可以说在「钉钉」工作场景中,钉钉便签是你用来记录各种所思所想的首选应用。

有了新的随心记功能,无论你在哪里,无论你正在钉钉上做什么,都能随手捕捉闪现的灵感。这感觉,就像是直接在当前使用的应用上记笔记一样。

便签再思考:最好的工作便签,上下文优先

钉闪会、IM、文档中选取的页面内容、图片等,都能很方便得加到钉钉便签里,因此你能轻轻松松找到上下文信息,真正做到随时随地随心记。与此同时,我也在思考:如果在对应的钉闪会、IM、文档中,可以直接显示对应便签的反向链接的话,该有多棒?这样当你之后再次打开该应用时,你的便签缩略图会一直显示在其中。

灵感稍纵即逝,灵感这个东西很可能是异步的,也就是意味着是在你做某些事情的时候,或者是完全不相关的时候,突然就有了非常不错的想法,你想用最快的速度把这个方法记录下来,否则稍纵即逝。

从这个角度来说,唯快不破,钉钉便签就成为工作场景中最好的工具。启动速度非常快,而且还可以从钉钉或者桌面直接启动。并且,钉钉便签还支持将某个便签「贴到桌面」上,从而使得连续输入成为可能,因为灵感通常来说是相辅相成的,可能在一段时间内,围绕一个想法会有很多相关的灵感。

便签再思考:最好的工作便签,上下文优先

知识的流通:「钉钉便签,知识变现」

什么是知识?德鲁克认为:「知识是在特殊的⼯作和⾏动中,运⽤信息的能⼒。」对你来说,能够运用到工作和生活中的才是知识,能够帮助你改变行动的才是知识。

从个人到组织,知识沉淀与团队知识库,需要在工作中体现写作的价值,对于知识类工作的协同办公来说,写作可以推进项目。

写作的根本目的,是要给别人看,可以看作是一种对话。凡对话,就必须要有上下文。你的文字内容,要能嵌入到当前上下文的情景中。所以说,你得根据上下文来「翻译」你的「笔记卡片」到「写作卡片」,使之可以跟环境融合起来。

在记录「笔记卡片」的时候,你不需要有任何的认知负担和顾虑,但是在思索某张卡片嵌入写作上下文的时候,就一定要符合最终文章的情景。

「一事一文档,凡事有着落」,这其实就是工作场景下对于「靠谱」的定义,把工作中所遇到的想法记录下来,集结成文档,凡事都能及时追踪到底。

当然,便签还可以直接分享到聊天窗口,及时获取其他人的反馈。

便签向内,文档向外。在想法都记录到便签之后,可以快速选择卡片,拼接成钉钉文档,从而沉淀到组织的团队空间知识库。对这一点上来说,如果便签记录的不止是文字就好了,比如支持画图或者思维导图等其他形式。

二·让工作推动你前进:项目驱动式笔记

「解决问题」,项目驱动学习

只有当你以「解决问题」为目的来进行学习时,学习才最有可能被内化。「Life is problems. Living is solving problems.」 在工作场景中,项目驱动能够让你不断在实战中解决问题,获得成长。

搭建自己的问题树比知识树更管用,《内在动机:自主掌控人生的力量》在书中提出:目标导向去解决人生的问题会让你前进得更快,且更有方向感和掌控感,从而带来幸福。

问题也可以看作是强大的过滤器,只保存相关的信息,你未来的自己就可以依赖高质量的信息输入。带着主题去读书或学习时,都会思考是否对自己目前关注的这个问题有所帮助。

为什么是问题树而不是知识树呢?因为知识树往往会沦落为「再也不看」的无主题收藏夹,缺少自己的条理和总结,只是单纯的堆积。一个优秀的问题,能极大地扩展你的视野;而围绕某一领域的一系列深度问题(Why & How?),则能帮助你快速地对这个领域建立认知。

记录的想法要跟项目相结合

想法不跟项目 Project 和自己的领域 Area 结合,你就是空想,A goal without a plan is just a wish.

一手创造两家世界500强企业的稻和盛夫在书中不断提到,年轻人要在「修行」中找到自己真正的志向。而这一点,也可以和 P.A.R.A 方法相结合,我们要去主动匹配 Project 和 Goal 清单。

因为一个没有相应目标的项目被称为 hobby「兴趣爱好」。如果你没有承诺或还没有完全阐明你想要的结果,那你一定只是为了好玩而随便搞搞;而如果你有了目标而没有相应的项目,那就只能叫 dream「白日梦」,你可能会非常渴望达到这个目标,但如果没有一个一个项目来完成,实际上也不会有任何进展。

便签再思考:最好的工作便签,上下文优先

钉钉便签的多标签能力

一般来说,对于数字化笔记来说,检索信息有两种方式:

  1. 通过树形的文件夹层级体系,自顶向下,按照树形结构归类,一层一层检索;
  2. 通过更加碎片化的标签体系,使用关键词或功能性进行搜索,自底向上检索。

比如说,我会将钉钉便签的标签分为「重要、紧急」和不同字母开头的功能性标签,比如 #P~ 项目有关、#@ 跟人有关、#T~ 跟时间有关,这样在筛选信息时会非常直观,特别是在不同的上下文中有不同的视角。从这点儿来说,如果能够支持智能标签即标签的组合就更棒了,比如我只想查看所有在 10 月份(#T~10月)跟 P~钉闪会有关的内容。

便签再思考:最好的工作便签,上下文优先

有了内容关键词和对应标签,更进一步的思考是,其实我一直在期待人工智能在知识管理领域的落地,比如说比便签可以链接团队或公司知识库,自动推荐根据当前的文本内容推荐相关内容,真正将个人跟团队和组织的标签联系起来。比如 #造价 #土建 就可以推荐相关的资料,实时显示在写作时便签的右侧,从而实现人找资料,资料找人。

从宏观上来说,在一个组织中总有优秀的榜样(Role Model)供人学习,如果智能推荐可以在知识库中及时推荐一些优秀的项目模板,便是其他人可以向榜样学习的最好方式。本质上,价值观文化是组织的思维模型的一种抽象:团队就是组织文化的执行本体,文化也在影响着每个人的思考方式和行为模式。

从微观上来说,而写卡片是知识工作者的刻意练习,只有当你记下来自己的想法,才能获得持续不断的反馈。

「写下来」,能给人以动力,持续的反馈

有时候,我们会觉得工作正在消耗我们的能量,只有投入越来越多的能量才能前进。有时却恰恰相反,一旦我们进入工作状态,工作本身就好像获得了动力,拉着我们前进,有时甚至让我们充满活力。这就是我们所追求的动力。

只有当工作本身就是激励时,驱动力和奖励才能可持续动态循环,从而推动整个任务前进。写永久笔记就是这样,内置了一个非常重要的反馈循环:用文字表达自己的想法,会让我们思考自己是否真的想清楚了。

当你试图将其与之前写的笔记联系起来时,很容易发现矛盾、不一致或重复的地方。只有这种「写下来」的反馈是随时可用的,可以帮助你每天都有少许、多次的进步。而最好的一点是在我们学习和进步的同时,我们的笔记卡片盒也会变得更丰富。它也在成长,在进步。并且它越是成长,就越是有用,就越容易建立新的联系。

虽然这些内置的反馈循环并不能取代同行或上级的反馈,就像 KPI 绩效考核,如果你每隔几个月才能得到一次对已完成工作的反馈,这样的反馈并没有多大帮助。

三·便签卡片的常用操作与技巧

电子化便签的小技巧

技巧 1:IM 消息快速收藏

IM 聊天窗口快速收藏,这是一个惯常行为,但是重点不在于此,重点在于收藏之后要对笔记进行自我的二次加工,也就是后文提到的「写两遍」。

便签再思考:最好的工作便签,上下文优先

技巧 2:便签四象限视图

前文提到了钉钉便签「贴到桌面」的功能,进阶地,你可以利用四象限的方式来让自己高效工作,将工作分为「重要紧急」「重要不紧急」「紧急不重要」「不重要不紧急」四个方向,创建不同的便签颜色来更好的区分。

便签再思考:最好的工作便签,上下文优先

技巧 3:独立 Desktop 分屏窗口

因为便签设置了显眼的颜色,在切换 Desktop 工作台时,就能够很容易定位到便签的位置,一般我会设置快捷键将 Ctrl+3 快速打开独立的便签 Desktop,然后直达对应便签进行内容的更新。当然,如果你拥有第二块显示屏的话,你可以将便签直接放到第二显示器的底部,作为传统纸质便签的数字化模拟。

便签再思考:最好的工作便签,上下文优先

技巧 4:钉住窗口,随意贴

脑洞一下,如果能直接贴到跟同事的 IM 聊天窗口上,那就真的做到了上下文的完整性,每一次切换都能尽可能保护脑力。其实这个功能就类似在线下走到同事工位边,在他的电脑上贴上便利贴一样,可以直接贴到单聊里,方便提醒和协作。

便签再思考:最好的工作便签,上下文优先

经验 1:「少写一点」

写笔记卡片,不在于记录的数量(字数),而在于质量:

相比之下于动辄上百上千字的文档或周报日报,让我们去掉不必要的修饰及套路,拒绝不必要的浪费,明心见性,直指要点,写出有价值的卡片。

认知科学家比约克夫妇(Robert A. Bjork与Elizabeth Ligon Bjork)在1994 年提出的必要难度(Desirable Difficulty)理论:

以前人们习惯性地认为,记忆的速度越快,学习效果越好。但他们的实验发现了与常识相反的结论:「存储与提取负相关」,也就是说,记忆存储得越容易,提取出来越困难;反之,如果你存储记忆时越困难,知识提取时反而会更容易。

写卡片而不是整篇文档的价值在于,你会用自己的话记下来,这个刻意练习的过程能让你更好的思考。就像少楠说的,「没有任何创造是一蹴而就的,都是经历了大量的积累和缓慢的思考。」

卡片上的知识碎片就像乐高,虽然看上去没有完整文章那样华丽的措辞,但在需要用的时候,能选择需要的知识块拼成你想要的形状。

经验 2:「写两遍」

第一遍唯快不破,第二遍推进项目。

第一遍,不管你是在听课,还是在读书,亦或是跟同事聊天。遇到任何灵感都可以立即打开便签来记录。

第二遍,一定要用自己的话,以给同事讲解的方式,把你获得的这个洞见,用精炼的语言记录下来,也就沉淀成为了项目笔记,对工作中的项目有所推进。

  • 用自己的话。是因为你将来是要把它放在文章、文档或工作报告里面。虽然将来你会进行修改、润色和调整,但只有用自己的话才能让你更好的思考。
  • 给同事讲解的方式。这是因为,要把一个东西讲明白,你就必须搞懂它。这是用输出倒逼输入,让你深入理解一个知识点。这也恰恰是费曼学习法的精髓。
  • 精炼的语言。一则笔记如果记录内容过多,你的思维会被局限框定。况且如果笔记过长,形成的上下文就会过于具象。能和它建立链接的内容,数量上会大打折扣。

结语:「写下来」,「少写一点」,「写两遍」

一些想法和建议,对更好的工作便签的期望

更完善的全局入口:类似苹果系统的「快速备忘录」

最新版本的 macOS Monterey 推出了「快速备忘录」功能,相当于一个全局入口用于快速记录笔记,并且只需要将鼠标移动至右下角,便可看到当前「上下文」的相关卡片。

苹果「快速备忘录」系统级的全局收集能力,也体现出了系统级别的双向链接,即不同「上下文」本身之间存在联系。那么在钉钉便签这个工作场景中,上下文目标对齐在跨团队协作时尤为重要,比如说项目A需要项目B的支持,协商上线时间时便是一个对焦点,也就是双向链接发挥作用的地方。

便签再思考:最好的工作便签,上下文优先
使用「快速备忘录」搜集素材

同样地,如果钉钉便签打造一个工作场景下的「快速便签」,我们就可以在钉钉内任何 IM 聊天窗口或文档上,打开快速便签并记下笔记,有助于帮助快速捕捉灵感。而当你再次打开该 IM 聊天窗口或文档时,该便签便会自动弹出。而你又可以在便签应用中,找到所有关联了上下文的笔记,查看其相关的 IM 聊天窗口或文档。

这一功能对于日常工作需要频繁切换上下文,或聚合了很多文档资料的知识工作者,绝对是一项非常值得点赞的功能。

更多样的内容形态:文档高亮,画板,大纲,脑图等

如果你是进行一些简单的记录,那么只需要在备忘录中记录文本内容即可。但在更多的思考场景下,你可能需要更多形式的内容记录方式,比如自由的画板用于天马行空的想法关联,或者像幕布这样的结合大纲笔记和思维导图的头脑管理工具,能够帮你用更高效的方式和更清晰的结构来记录笔记、管理任务、制定计划甚至是组织头脑风暴。

另外,如果说便签是 writing tool for thought,那我们应该还需要一个 reading tool for thought:

  • 聚合所有的阅读来源,文档高亮成为第一优先级,评论也可以选择性存到自己的知识库一份
  • 关于阅读流程的一些想法:阅读器 -> 高亮 -> 个人知识库
  • 思考/笔记 -> 便签,然后共同组装和生成内容到新的文档

便签笔记的局限性在哪里?

便签不能代替你思考,不要总是收藏,要自己写下去。记住卢曼的箴言「不写,就无法思考。」(卢曼1992,53)。而在写作整篇工作文档时,没有人完全从零开始写作,我们可以借助便签中所记录的卡片快速产出。

让便签来辅助你的思考,记住我们的咒语:「写下来」,「少写一点」,「写两遍」

「人们高估了独立思考的能力。没有外部帮助,记忆、思维和推理都会受到限制......真正的力量来自于设计能够提高认知能力的外部辅助设备。」——唐·诺曼,全球最具影响力的设计师,《设计心理学》作者+

✇吕立青的博客

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

作者 吕立青

零、Roam Research 101 系列的初衷

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

欢迎来到 Roam Research 宫殿,Roam 的门槛其实很低,但是天花板特别高

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

Pantheon 罗马万神殿 “天使的设计”

最近一直在思考如何升级漫游研究所 Roam Newsletter(🆓 Substack 邮件订阅)的内容形式,想要更好地组织关于思维工具和知识创造的内容。

而且现在中文社区还没有一份完整的 Roam Research 系列教程,#roamcult 的社区氛围反而又难住了部分初学者。

0.1 Roam 的低门槛和高天花板

关于低门槛的内容,我想仿照 @少楠 的 Flomo 101 学院 做一个 101 系列,包括 Roam Research 入门干货和自我管理与知识创造的基本原则。

因为许多时候我们需要改变的不是工具,而是我们使用工具的思维方式。

突破天花板的事情,作为程序员的我一直都比较热衷,各种主题、插件玩得不亦乐乎,还有跟其他软件之间的互连互通,通过自动化相互联动。

当然,伴随 Roam 101 诞生与成长的,还有 RoamCN 微信群和 #roamcult 社区,我相信讨论能够激发出实际的知识创造的需求,以终为始,你能学到什么?我能得到什么?

0.2 自带方法论的工具才是好工具

我一直想写的都是带有普适性的文章,重点不在于工具,而在于使用工具背后的方法论和相关理论的最佳实践。甚至我有一个认识:自带方法论的工具才是好工具,就像我的 GTD 其实就是跟着 OmniFocus 学的,哪怕我最后并没有使用 OmniFocus。

虽然说一个厉害的人,有自己方法论的人用什么工具都可以,哪怕只是纸笔也能疯狂输出,但问题在于大部分人只是普通人。

工具在一定程度上给普通人赋能,就像自动驾驶等技术革命总是想让我们的生活变得更好,让我们的就业变得更充分,让人类的创造力得到更大的释放,人类没有必要去从事那些重复性的苦力型工作。

0.3 关于 Roam 101 专栏的内容规划

Roam 101 系列的每一篇文章大概会包括 3 个部分:

  1. Roam 官方邮件组的新手教程,我采取的方式是意译而非直译,切换上下文并结合实际使用场景练习(Context 上下文是使用 Roam Research 时最重要的概念)
  2. 结合新出版的《卡片笔记写作法》书中的内容来谈一谈我的个人体会,即关于卢曼的卡片盒笔记法相关读书笔记的摘要(Context 语境同样是 #Zettelkasten 最重要的概念之一)
  3. 我在 Roam Research 中有关「自我管理和知识创造」的最佳实践,就像现在这篇文章就是在 Roam 里面完成了卡片素材收集、大纲组织和正文书写等输出流程。

虽然是 Roam Research 专属,但依旧期望给使用不同工具的你以启示,比如 MOC: Map of Contents - 管理链接而非本体这个概念,让我意识手动创建位置固定的图像的重要性。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

既是我对 Roam Research 自动生成的双向链接 Graph 无用性的反思,也是更重视 Diagram 手动画图功能的开始。更有趣的是《卡片笔记写作法》中也有关于“文字是固定化结构的图像”的描述,也让我对中文方块字有了不一样的认识和理解。

让我和你保持“好奇心”,开始接下来的旅程吧!

一、“罗马不是一天建成的”:每日笔记和页面引用

虽说“罗马不是一天建成的”,但用十天的时间来打造属于你自己的罗马(Roam),听起来感觉怎么样呢?

Roam Research 101 系列就是想要帮助你学习 Roam 的所有主要功能,加入少数派专栏和 RoamCN 中文社区微信群参与互动,我相信你很快就会像 #roamcult 专业人士一样使用 Roam。

唯一的秘诀是:不要退缩,只要开始写!剩下的事情由 Roam Research 来做。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

1.1 Daily Notes 每日笔记

当你打开 Roam Research Graph 数据库时,首先映入眼帘的是 “Daily Notes”:一个空白的页面,上面是今天的日期,比如 [[July 16th, 2021]]。

那么你该怎么做呢?开始写呗!

你可以把 Daily Notes 每日笔记当成每天的独立空间,“每天都是一个崭新的开始”,在这里开始写下你的所思所想和所见所闻。没错,以前你会在其他任何地方,想要记下的任何东西都可以放进来,不要有任何压力:

  • Ideas 以前会记到笔记本里的想法,或者是涂鸦在便签纸上的想法
  • Emails 以前放在草稿箱里的电子邮件
  • Word 文档中的论文或摘要
  • Videos 哔哩哔哩或 YouTube 视频
  • Notes 备忘录,或是保存在 IM 应用中的“文件传输助手” 😉
  • Tasks 你会在手机应用中记录的任务
  • ……

1.2 Outliner “平平无奇”的大纲视图

Roam Research 拥有最好的大纲式编辑体验,我确实太过于喜欢“放大缩小”这个概念,就像摄影镜头焦距变化一样,我可以进入细节,但也可以着眼于全局。

大纲式笔记的子弹形式,加上缩进和不缩进的可能性,可以帮助你轻松构建一些“结构”。但是在最开始的时候,你没有必要按照任何层次或模板进一步组织。

“结构”、“联系”、“模式”将自下而上地出现:而且每天都是新的迭代!

网络化思维的魔力,将会由 [[]] 这个魔力符号来开启…

1.3 Page References 页面引用

将单词或短语(甚至是 Emoji 😍 表情符号!)放在一对方括号 [[]]之间,就可以创建一个指向新创建 Page 页面的[[双向链接]]。

当你通过点击链接进入页面时,你会在页面底部看到,该页面被引用的所有地方。

假设你在不同的情境下创建了[[睡眠]]这个页面:当你早上写日记的时候,当你阅读一篇关于睡眠健康的文章的时候,当你计划下一次自驾旅行的时候。所有这些引用都会以其原始语境(Context)出现在[[睡眠]]页面的底部。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

1.4 还有一些小贴士

  • 在搜索栏中输入 Page 页面名称来快速创建新的 Page 页面。
  • Shift+鼠标 点击一个[[]]链接,可以在右侧 Sidebar 打开一个页面。
  • 通过右键点击每个 Block 前的圆点,可以探索 Block 的格式化(即每个项目的信息)。
  • 输入/触发下拉菜单选择 “Current Time”命令,可以给你的想法快速打上时间戳。

二、《卡片笔记写作法》 读书笔记极简实操

2.1 小挑战一

这里有一个挑战,你可以亲自尝试一下,往后的每一小节都会包含一个复杂程度越来越高的新挑战。

现在开始每天的日记练习,在你的每日笔记中写下 [[晨间日记]] 页面(或任何其他标签)然后添加你的想法。

对于我自己来说,我觉得最有用的是间歇日记,每次停下来就写“间歇日记”:时间戳+感谢+行动。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

未来使人焦虑,过去使人抑郁。可以说是间歇日记的记录方式配合 Roam Research,治愈了我的 抑郁 和 焦虑。 同时,跟大家推荐一下相关的 3 本书:

  • 《为什么佛学是真的》
  • 《无为:自发性的艺术和科学》
  • 《被讨厌的勇气》

读书时最受用的一些概念,你也可以随手记录到 Daily Notes 每日笔记里面,一元化笔记 + 卢曼 卡片盒笔记法,一元化笔记可转化为具体的永久笔记放入卡片盒。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

via @Innis 😉

2.2 闪念笔记、项目笔记、永久笔记 示例

《卡片笔记写作法》所提到的几个概念,跟 Daily Notes 每日笔记最相关的,应该是闪念笔记(Fleeting Notes)。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

对于我来说,如果当下是有足够多的时间并且手边有电脑打开 Roam Research,那就无须闪念;如果当下是在读书的话, 直接记录的就是文献笔记,而读书的时候一定要拿上一支笔写写画画,我目前使用的是 iPad + Apple Pencil 的电子化组合。

  • 闪念笔记(Fleeting Notes)其实是可以不记的,只是信息的提醒,可以用任何一种方式来写,最后会在一两天内被扔进垃圾桶。
  • 项目笔记(Project Notes)只与某一特定项目有关,保存在特定项目的文件夹内,项目结束后可丢弃或存档。比如说,在 Roam Research 里面可以把当前的写作文章作为项目,我可以同时开启多个项目,跟着自己的兴趣走。
  • 永久笔记(Permanent Notes)我更愿意用 Evergreen Notes(常青笔记)来称呼它,这种笔记以一种永久可理解的方式、标准的格式包含了必要的信息,并且永远不会被扔掉。
“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

不过这里只是一个简要的介绍,后续的文章会再结合实例,仔细来讲讲卡片笔记写作法的每一个环节。

2.3 好的工具,帮助你减少对主要工作的干扰

好的工具并不是为你增加更多的功能,而是帮助你减少对主要工作的干扰。

你的主要工作是思考,而 Roam Research 就像一张张白纸,尽可能减少了页面跳转、鼠标移动、材料引用、动画刷新等功能或工具行为对思考的干扰。

对,就是写代码时“手指不离开键盘”般的爽快感。思考无干扰,但能创造无限结构。

同理,一个好的方法论也能帮助你减少对主要工作的干扰。

Zettelkasten 闪念笔记 Fleeting (Literature) Notes 是为了在你忙于阅读时快速捕捉想法,不打断你的阅读流程专注于一段文字。

此时在记录笔记时,要非常简短,要有极强的选择性,要使用自己的文字。

More is unnecessary, less is impossible. 多了没必要,少了不可能。

2.4 什么是原则?书中有哪些受用的原则?

瑞·达利欧在《原则》中传递的最重要的东西是一种以原则为基础的生活方式,是它帮助我们发现真相是什么,并据此如何行动。而其中最重要的便是拥有属于自己的原则,而《卡片笔记写作法》这本书同样帮助我构建了关于知识管理和知识创造的宗旨和原则。

举个例子:在挑选记录闪念笔记的工具时,我历经了从“一个人的 Twitter” 到 Roam Research 自带的 Quick Capture 功能,再到 Drafts vs Flomo 等 App 的漫长过程,最后基于书中“减少选择”的原则由此选定了系统默认的 Notes 备忘录。

特别是 iPadOS 15 为备忘录加入了非常重要的一项新功能 QuickNote 在全局右下角可以快速呼出 QuickNote,用户可以在这里进行手写、打字记录,Quick Note 窗口同样支持 Live Text 快速识别文本的功能,还可以左右轻扫快速浏览不同的 Quick Note。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

如果创建的 Quick Note 存在网页链接或者应用中的文本高亮内容,点击 Quick Note 还可以快速跳转至相应 App 中的特定内容位置快速定位进行查看,也就是说 Apple 在系统层面实现了双向链接,直接做到了天花板级别的用户体验。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

对于使用其他非 Apple 生态系统的同学,也可以基于“减少选择”的原则,推荐直接使用 Edge 浏览器的集锦功能即可。

三、我在 Roam Research 里面的实践

我在之前写过的 Obsidian 文章从卡片链接到大脑联想,基于 Obsidian 的卡片盒笔记法实践中引用过:

「人们高估了独立思考的能力。 没有外部帮助,记忆、思维和推理都会受到限制… …真正的力量来自于设计能够提高认知能力的外部辅助设备。」
—— 唐·诺曼,全球最具影响力的设计师,《设计心理学》的作者,苹果的前用户体验架构师《Things That Make Us Smart 让我们变聪明的科技: 在机器时代捍卫人类属性》

继 Obsidian 之后,Roam Research 是更好的一款能帮我提高认知能力的外部辅助设备,也可以称之为“第二大脑”,我会谈一谈为什么会在接触 Obsidian 之后再次选择 Roam Research 的背后原因。

最重要的原因在于,Roam Research 可以将文本的颗粒度拆分得更细。组块(block)是认知科学上的一个常用概念,而 Roam 每一个文本组块(Block)正是这个概念的具象化。我们都知道,当你记忆一个手机号码时,比如,13912345678,很难直接记住。当你把它拆成139-1234-5678这样三个组块时,就更容易记忆。

3.1 第二大脑的“抽象与再具象化”

《卡片笔记写作法》 在书中提到关于“抽象与再具象化”的片段:

要想与思想共舞,我们首先要通过抽象和再具体化的手段,把想法从原来的上下文中剥离出来。只有通过抽象和再具体化,我们才能将想法应用于独特的且总是不同的现实世界(Loewenstein, 2010)

这句话给我的启示同样是对 Obsidian 能做的事情进行抽象化,根据方法论寻找一款思考工具(A note-taking tool for networked thought)才是我的目的,而 Roam Research 则是符合这一愿景的再具象化,满足我对于笔记工具诉求的最佳输出方式。

我们在做文献笔记,并将其转换成符合卡片盒内上下文形式的时候,同样需要考虑这么做,将原文中的内容进行抽象化,然后再具象化到卡片盒内所关注的主题。

3.2 关注已完成而非未完成

前文我们已经接触到了如何记录间歇日记和读书笔记,不过都是以 Daily Notes 为入口记录的一元笔记。有了这些时间戳的闪念笔记,我通过 [[roam/js]] 插件把 Daily Notes 按时间顺序显示为一个 Calendar 日历视图,用于更好地回顾我过去所记下的笔记。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

这会让你更关注已完成而非未完成。现阶段所有的任务管理工具都是围绕未完成来做的,对于已完成事项的利用价值远远不够。而在 Roam Research 中所记下的间隙日记,你做事情是为了获取洞见,而不仅仅只是把事情做完。

哪怕是 Review,之前的我也总是在回顾那些未完成的项。从而导致自己很焦虑,与此同时我们也总是在自责,回避型人格,中国的传统家庭教育少了太多的鼓励。其实间歇日记或感恩日记,都是让自己重新关注那些已完成的东西,比如 Things 3 里面的 log 日志页面或 Flomo 的热力图 都让自己知道自己有多棒。持续积累素材到自己的数字花园,以此为动力,心情愉悦,马达轰鸣。

3.3 Roam Research 乃写作的“最佳后厨 ”

Roam Research 是文本类知识创作的最佳后厨,大纲式的编辑体验极佳,无往而不利。理想情况下,我认真筛选/整理/管理 Daily Notes 里面的内容放到卡片盒,精心编辑我的收藏内容,其目的都是为了在 Roam Research 里面方便调用,配合 Roam 最佳后厨专心负责拼装。或许,相比之下,我的 DEVONthink 更像是地下室,或者楼阁,一般不会去找,但如果要翻找,也能方便地搜索。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

我的 📝 Zettelkasten 卡片盒

那么接下来我会演示一下如何在 Roam Research 的具体页面中进行输出,只有知识创造才能发挥 Roam Research 的最佳价值,比如以本文的创作过程为例,我会创建一个 [[P/Roam Research 101]] 页面,进入某一个页面再进行写作,可以称之为项目笔记(Project Notes)。

在 Roam Research 里面左侧称之为「主页面」,而「侧边栏」则可以打开多个其他页面,由此进入到第一阶段,在主页面快速记录下自己能够想到的任何相关内容,然后在侧边栏 Sidebar 视图快速打开所需要的所有素材。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

将所有素材摆在一起之后,第二阶段便可以通过 /diagram 打开 Roam Research 内置的Diagram视图对内容进行排序处理,以线性的方式顺序排列组合出文章的大纲。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

通过 Diagram 视图产出大纲

最后的第三阶段,则是通过树状的句法,用线性的文字展开,即通过逻辑语句完整地描述想要表达的内容。至此,Roam Research 帮助我完成了整个写作流程,快写慢改,一篇文章最终新鲜出炉。

「写作之难,在于将网状的思想,通过树状的句法,用线性的文字展开」—— 史蒂芬· 平克
“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

这就是我对于一篇文章的创作流程的理解,即厨房的隐喻,Mise en place,在法语中的意思是指「在烹饪前,将所有的材料准备好,摆放在一个地方,让你一眼能看到」。这样做不仅仅是告诉观众需要哪些食材,更重要的是帮助厨师更好更从容地烹饪。厨房是知识型工作的终极隐喻,因为厨师必须在紧张的时间压力下,将精雕细琢的产品提供给苛刻的观众。

四、结语:知识创造而不是知识管理

4.1 我的 Roam Research 使用体验隐喻之 DIKIWI 模型

我在少数派[Matrix 圆桌 网状结构笔记工具是一阵风吗?](https://sspai.com/post/61886)中就提到了这段 Roam Research 的使用体验隐喻:
  • 你每天都在河边 Daily Note 玩耍,看着河里的水 [[Information]] 哗啦啦地流
  • 你拿出相机拍拍照 Block,每天会有新发现 Zettel,然后带回自己的花园 Digital Garden
  • 花园里种着一颗颗的种子 Theme,有些已经长大了,需要修剪 Iteration
  • 今天很特别,你在河里遇到了你前天拍过照的一条鱼 [[Insight]]
  • 于是你把它带了回去,到花园里摘摘菜 [[Knowledge]],做成一道糖醋鲤鱼 [[Wisdom]]
  • 然后拿出手机拍了张照片,并且分享到了微信群里 [[Impact]]

为什么是拍照呢?我们能看到的能记住的只能是知识的切片 Flash Card,因此要有 Version 即版本管理的概念,而 Roam 恰恰是支持的。我最喜欢 Roam 的一点就是「一处修改,处处更新」,而不断迭代 Iteration 和持续改进才是学习的关键。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

这个隐喻其实就对应着 DIKW 体系,它将数据、信息、知识、智慧纳入到一个金字塔形的层次体系中,从最底层的数据到最上层的智慧,它们之间既有联系,又有区别,同时整个过程也是双向通道,自下而上让数据加工成信息,再提炼为知识,最终形成智慧。也可以是自上而下,通过智慧消费产生知识、信息,最后又可以落到最底层的数据上。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

4.2 “没有写作,就无法思考”

卢曼说,“没有写作,就无法思考”。本质上,思考就是一种链接,而驱动我的原动力就是好奇心和创造点什么。

“创造力只是将事物联系起来。当你向有创造力的人询问他们是如何做某件事时,他们会感到有点内疚,因为他们认为自己并没有真的在创造性地做事,只是看到了一些东西而已。”(史蒂夫·乔布斯)

其实《卡片笔记写作法》对我最大的启发倒不是什么 Process 工作流,而是莫大的一种鼓舞:跟着兴趣走。

“罗马不是一天建成的”:Roam Research 101 系列之每日笔记与页面引用

✇吕立青的博客

创造的自由:低代码开发的时代,人人都是创新者

作者 吕立青
阿里云智能总裁张建锋在 2021 阿里云峰会上提到:“低代码开发时代,人人都是创新者,你只要最了解自己的业务,就能去创建应用,实现业务数字化。”

前言:“谁是我们的敌人?谁是我们的朋友?”

创造的自由:低代码开发的时代,人人都是创新者

互联网信息化高速发展的今天,一边是万亿市值互联网企业造富神话不断,另一边是六亿人均月收入仅 1000 元左右(李克强总理在 2020 疫情期间 十三届全国人大三次会议记者会 语重心长地强调)。

“谁是我们的敌人?谁是我们的朋友?” 周末在读毛选,一开篇就被震撼了!区分敌人和朋友,就是要抓主要矛盾,现在中国社会的主要矛盾是科技创新的速度(vs 美国) 赶不上人口红利的下降速度。每年都在下降的劳动力,反而倒逼产业创新,企业数字化、工业机器人和人工智能替换大量劳动力,才能加快或保持之前的生产效率。

创造的自由:低代码开发的时代,人人都是创新者

(劳动年龄人口持续减少,劳动力成本快速提升)

在互联网应用领域,特别是移动互联网,我们走在了世界和时代的最前沿。然而在面向传统企业的数字化转型时,广大中小企业依旧停留在纸质化流程办公阶段,稍有信息化意识的企业,也仅是在大量使用 Excel 或类 Excel 软件。“未来十年,最大的确定性就是数字化技术的普及,整个社会经济和生活必将全面数字化。“

创造的自由:低代码开发的时代,人人都是创新者

我们需要更多软件的搭建者,而不仅仅是软件的用户

“The real computer revolution hasn’t happened yet.”
“真正的计算机革命尚未发生。” —— 艾伦·凯(Alan Kay)

不管技术如何改变了我们的生活,仍然只有极少数人拥有软件开发所需的编程技能。当大多数人面对一个可以通过编程来快速解决的问题时,你不得不求助于其他拥有该技能的极少数人。想象一下,如果有更多的人拥有搭建自定义软件的工具,可以成为软件的开发者,而不仅仅是软件的用户呢?

我特别喜欢 Airtable 这句 We need more software builders, not just users. 本质上,每个行业都有其专属的业务逻辑,使用更小的细颗粒度组件配合低代码开发,无需编码或只需少量代码就可以快速生成应用程序。只有这样,才是真正的计算机革命。

创造的自由:低代码开发的时代,人人都是创新者

作为一款具有高自由度的 SaaS 产品,Airtable 期待造就更多软件的搭建者,而不仅仅是软件的使用者。任何人 —— 即使没有技术培训 —— 都可以创建完全符合需求的个性化应用程序,并受益于彼此共享的软件社区和平台生态。

阿里云智能总裁张建锋在 2021 阿里云峰会上提到:“低代码开发时代,人人都是创新者,你只要最了解自己的业务,就能去创建应用,实现业务数字化。”

这类 SaaS 产品,不只是帮助个人或企业搭建一个自己的内容或管理平台。产品的目标将通过解耦,把现有的产品打碎为最小的颗粒度,然后像乐高积木一样进行组件化、模块化的拼接,而这和我们打造自身知识管理体系的思路是一脉相承的。

就像笔记软件(Roam Research、Notion)中的 Block 一样,可视化编辑器则将基础组件和业务组件拆得更细,比如商品页面上的每一个元素都可以拆分组合,元素的交互逻辑、数据指标等等都拆分成最小的颗粒度,然后通过一个中台来统一管理,由运营专家或业务专家来搭建页面和逻辑形成功能,最终交付给客户的是一个个可执行的业务功能模块。

创造的自由:低代码开发的时代,人人都是创新者

(中美 SaaS 公司市值对比,客户习惯需要进一步培养,且依赖资源市场)

数据之间的联想能力,是软件难以取代人脑的地方

通过工具给用户赋能的产品很多,Notion 就被网友戏称为「新一代的 QQ 空间」。Notion、Roam Research、Airtable、Coda、钉钉文档、飞书文档、Vika 维格表、黑帕云等一系列产品,本质上都是一个简易的数据库,比传统的 Excel 更为方便的能展示不同维度直接信息的区分,还有数据的互相引用能够打破传统表格之间的数据孤岛。

对于中小企业老板乃至个体经济来说,其业务流程大部分都可以通过表格+表单的方式进行流转。一方面,通用型表格然后辅以丰富的模板就能够快速搭建我们现在想要做的系统,类似积木块无代码编码(low-code 低代码平台);另一方面,这类表格还可以根据字段自动生成表单收集器,这样就可以方便录入数据,应用之间还可以相互连接,实现数据互通。

数据间的互相引用,也特别像知识管理关于「分类 or 标签」的分歧,现在大家都在谈论双向链接,谈论网状笔记,其实这些都只是展现形态,更重要的其实也就是打破信息茧房,知识壁垒。让知识流动起来比单纯让知识建立联系,可能会更重要,也更能激发远程联想和创造力。

数据之间的联想能力,是任何软件系统都难以取代人脑的地方,如何把非结构化的信息通过结构化的方式表现出来,也是最难的地方。不确定性,可能才是真正创造力的来源;如果一切都是固定的程式,那这个世界就失去了生机。 —— @一顾

数据的可复用性与数据可视化

前文提到表格类似于乐高积木块,最小单元是 Cell 细颗粒度,基于更细的颗粒度才能实现信息/数据的复用,才能激发使用者的远程联想和创意,从而促进复杂决策,跨领域寻找解决方案。

Roam Research 创始人 Conor 就经常在 Twitter 提及 Excel,并且讨论过一系列关于 Excel 优弱点的 Thread。并且,连 Roam 的技术面试题都是打造一个小型 Excel,相关 Tweet “One of our interview prompts is building a tiny excel”

Roam Research 将笔记的最小单元视为 Block,而这种基于 Block 的深层技术优势让我们看到了各种可能性,在 Roam 的基本概念里,页面只是一种特殊类型的块(block)页面(page)段落(paragraph)一视同仁,两者都是 Blocks

Roam 数据库就像一片森林。每一页都是一棵树。树的根是页面(page),树的枝干是更高层次的段落(paragraphs);树的叶子(block)就是嵌套在页面(page)最深层次的段落(paragraphs)。 —— 深度解析 Roam 数据结构 —— 为什么 Roam 远不只是一个笔记应用 - 少数派

《程序员修炼之道:通向务实的最高境界》这本书中被归纳为一个概念叫正交性,组件越小越好,越有组合的可能性,只有当组件拆分越细,越有优化的可能性,性能越好。

  • 假设一个组件能做 M 件独特的事情,另一个能做 N 件。
  • 如果它们是正交的,组合起来就能做 M×N 件事。如果两个组件不正交,有重叠之处,结果就少一些。

组合正交组件能获得相当微妙的生产力提升,在正交组件不断组合的过程中,单个单元的性价比提高了。

根据反馈来不断改进,不断迭代 Build-Measure-Learn

我们亲眼见证了人类历史上最重要的转换。
最卓越的管理思想家之一,彼得·德鲁克(Peter Drucker):“这是历史上第一次,人们可以做出自己的选择,而且是越来越多的人可以做出选择。这是第一次,他们不得不自我管理。

“而社会完全没有对此做好准备。” 从知识付费的焦虑就可以看到,我们每个人充斥着对时间管理和知识管理的渴望,但是好像缺少了点什么?可视化反馈,我们需要打造一个属于自己的以作品为导向的个人管理系统。我在Serverless 实战:打造个人阅读追踪系统这篇文章提到过,稍后阅读永远读不完的痛点 —— 缺乏追踪:

随着时间的推移,Instapaper 里面的文章将会变得越来越多,就像我们在代码中所注释的 TODO: 可能就变成了 Never Do,稍后读也是一样地被人广为诟病:Read it Later = Read Never。
创造的自由:低代码开发的时代,人人都是创新者

我发现文章堆积的一个永恒痛点,即没有有效的方式追踪自己的阅读需求与能力,其核心原因就是因为读完的速度赶不上添加的速度。从而没办法可视化出来评估自己的阅读进度,合理安排阅读计划,也就没办法给予自己适当的奖励,进而失去了阅读的动力。

数据驱动:抓住引领性指标,提升滞后性指标

在《深度工作》这本书中所提到的原则 2:抓住引领性指标,指的就是引导你将注意力转化到提升短期内可以控制的行为上,并对长期目标带来积极影响,从而最终提升滞后性指标

通过引领性指标来衡量自己的成功程度,能够及时改变有助于滞后性指标的新行为。比如说滞后性指标是提升面包房的客户满意度,而引领性指标,就是接受免费试吃样品的客户数量。

对个人来说,更好的引领性指标记分板就是这个人当前的深度工作时间,可以帮助一个个体专注于深度工作。

你也可以每天统计一个指标 —— 「自我决定指数」。计算你一天中,完全兴趣驱动,没有任何外在动机驱使的时间所占比例。扔掉那些无聊的应酬,长期坚持去做一些跟利益无关的兴趣爱好,比如读书或写作。读书与写作本身就是享受,你并不需要得到格外什么,多年后,你反而得到最多。

其实就跟测试驱动开发(TDD)和精益创业一样,我们需要更多的关注人的本身,做适应性计划而非预测型计划。不是做了适应性计划就是敏捷,而是聚焦价值,持续改进,「以人为本」。

  • 预测型计划:传统的计划方式,典型的表现形式是甘特图,提前计划好什么时间做什么事情,A 依赖 B,B 就要放在 A 的后面。
  • 适应性计划:环境越不确定,越需要边走边看,这时过于详细的计划,就是浪费。较好的做法是,做一个比较粗的计划,把近期的计划做细一点,然后定期去回顾并调整计划。
创造的自由:低代码开发的时代,人人都是创新者

敏捷开发之 Adaptive Planning

“你的下一个软件应用,未必是程序”

程序的模块化,一方面得益于笔记型软件的不断升级与推陈出新,另一方面,也有对新型双链笔记软件 Roam Research 的批评,比如在少数派文章 你的下一个应用,未必是程序提到的“套娃”:

很多用 Roam 批注 Roam 教程,用 Zettelkasten 管理 Zettelkasten 心得的圆环套圆环场面,可谓当代版的邯郸学步。
即使真要关注逻辑和组织结构,也应是积累了一定数量的素材后再考虑的事。但大多数用户的实际情况是连记笔记的习惯都不曾有。

当然,现阶段请不要神化双链笔记 - 少数派所有方法都有其适用范围,卡片盒笔记法有优势也有局限。Roam Research 所提供的网络关系图最终可能都会变成一团乱麻:双向链接被吹捧过度,它所提倡的扁平化也非万灵药

“我能想到的场景是,用来发现与其他笔记关联最多的、付出精力最多的核心笔记。但这在日常使用中,并非一个高频需求,更像一个定期的分析回顾。因此这个网络看似酷炫,实际帮助不大。”
创造的自由:低代码开发的时代,人人都是创新者

创造的自由,软件的“矛与盾”并不矛盾

对于任何方法论或工具,都不要走向极端,而是走向融合(两者相击取其强,“矛与盾”并不矛盾)。我既要用到 矛 的锋利,也要用到 盾 的保护,即“小孩子才做选择,而我全都要”。

作为一个创造软件的程序员,而另一方面作为软件的用户,我的软件使用心得一直都是Unix 哲学:做好一件事;接口拼接组合。比如说#分布式 GTD的概念,要实施 GTD 或是 Zettelkasten,并不一定要 All in One,而是:

  • 使用多个软件配合,挑选各个领域的强者,取其功能精粹,把 20% 核心功能发挥到极致即可,打组合拳。
  • 反复练习,优化工作流,克制抵御工具的诱惑才最最要,或者要刻意区分软件的工具属性和“玩具”属性。
其实“软件”的分类或许不再重要,「软件」强调「非物理」的属性,可以指可执行的代码、也可以指不用于执行的文档等;其中可执行、用于完成实际任务的才是「应用」,而一个应用可能是由无数个只具有抽象功能的程序模块组成的。 —— 你的下一个应用,未必是程序 - 少数派

同样的,如果现有软件可以满足我的需求,我就直接用。如果没有,那我就可以自己创造一款软件:我可以利用某个软件的思路,在同一个 Airtable-like 表格产品的不同场景里面实现它。

自带“方法论”的软件才是好工具

比如社区有人会在 Roam Research 重新实现 OmniFocus,但其实更重要的永远都是方法论,e.g. GTD -> RoamToDo 思想在前,工具在后。甚至我们的目标是进入守破离的第三阶段“离”:在更高层次得到新的认识并总结,自创新招数另辟出新境界。

我之前有尝试用 Roam Research 来做 #燃烧清单(Burn List) 或者是实现单核工作法。Burn List 的概念可以参考我派文章:用一张白纸就能完成的任务管理——用完就「烧」的 Burner List - 少数派,文章作者 @DrSelfie 原本是通过 Notion 来实现的燃烧清单,后续直接自己上手开发了产品 BRNR List,而我当然就选择借助 Roam 生态 #Roam42 的 LIVE PREVIEW 和 DAILY NOTES POPUP 功能,同样实现了类似功能。

比如,你完全没有必要接受 HEY email 的高昂定价,也不妨试试看它聚焦待回复邮件、严格筛选来件、「钉」住常用信息等特色功能,然后在传统邮箱中通过过滤规则、旗标等功能变通实现。
创造的自由:低代码开发的时代,人人都是创新者

「偷师学艺」,借鉴其他工具的方法论创造属于自己的软件

模板即软件,而且是可个性化定制的软件

随着各种个性化的业务需求,丰富的模板(市场)就显得非常重要,因为模板即软件,而且是一种可进一步个性化定制的软件,因为你能够根据模块改造属于自己的软件。

模板同样意味着经验分享,即隐性知识的传递。这是一个富媒体时代,通过视频的形式能够极大得丰富信息传递的带宽,将某些无法口述或通过书面方式传递的匠艺完成传达。

另一方面,通过定制软件的方式,直接将知识附着于软件本身也是一种领域知识传递的方式,所以表格附件的支持也变得非常重要。比如说对于个人来说,管理文档文件等知识管理场景,或者是对于企业来说,财务/库存的电子收据等场景也需要考虑全面。毕竟,在全面细粒度数据化之前,我们还需要文件这种形态来作为中间件。

数据管理表格的多种“软件”视图

一条条的数据记录,通过视图改变数据视角,让关心的数据显示更加直观、简洁、美观,同时实现数据可视化。Dashboard(e.g. 销售额)其实就提供了 “BOSS” 视图,通过 Cube (维度 + 度量) BI 分析,可以为企业做到一定程度的决策支持:比如在价格调控上可以有更加精细化的数字化手段等。

对于个人来说,比较有趣的是@空谷在 Airtable + Wolai:打造量身定制的价值投资系统 - 少数派 这篇文章中提到了使用 Airtable 的 Query 和 CURD 等 API 的配合使用来追踪股票涨跌,帮助自己从数据库中发现价值洼地,让本来静态的笔记变成变成一个「活」的页面。

创造的自由:低代码开发的时代,人人都是创新者

作为行业从业者,最后的感叹(总结)

“‌ 普通人最应该学习的技能应该是 Excel,‌‌ 而程序员最应该学习的应该是 MySQL。” —— 鲁迅

作为一名程序员,敏捷开发的目标是更快地交付有价值的可工作的软件。为此,它有一个指标来度量这个「更快」,那就是 Lead Time,它度量的是一个 idea 从提出被验证,到最终上生产环境面对用户的时间。显然,这个时间越短,软件获得反馈的时间就越短,对价值的验证就越快发生。

但是个人和公司的经营效益和规模常常会受到流程和工具的限制。价值验证的流程无法形成闭环,数据无法打通成为常态,就更加无法幻想使用大数据分析、智能化决策等高附加值产品。

面对魔幻现实和未来的不确定性,在新基建铺开之际,我们每个人都应当利用自身懂互联网、懂技术、懂信息化的优势,改变这一现状。

创造的自由:低代码开发的时代,人人都是创新者

特斯拉的无人工厂,汽车制造工厂已经拥有了纯自动化的硬件流水线,那么软件呢?

One more thing.

今年的“十四五”两会期间,和一些代表年年坚持相同的提案不同,科技公司的大佬们每年的发言紧跟时代热点,过去几年是云计算、新基建,今年的主题已经换成了芯片、自动驾驶和科技适老化

雷军重点提到了科技适老化,而作为子女,也是可以通过创造软件来帮助父母更好得生活,来达到提醒和协助的作用。比如提醒父母吃药,或者是帮忙打理家里的生意等等,就跟当年父母和我们一起搭乐高积木一样,让我们和父母一起来搭建软件吧!

愿我们每个人,都能成为 software builders, not just users.


✇吕立青的博客

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

作者 吕立青

树状结构 vs 网状结构

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

最近使用 Roam Research 最大的感触在于「拆分阶段」,暂且分为「学习阶段」和「创造阶段」,不同阶段适合使用不同的知识结构。

  • 「学习阶段」以树状结构为主,此时构建大纲按图索骥利于理解,就像松鼠从树根一直往上爬树 🎄,构建体系,摘取果实。
  • 「创造阶段」以网状结构为主,此时借助远程联想、复杂决策、跨领域寻找解决方案,就像松鼠🐿在不同树林 🌲 间反复跳跃,网络交织,寻找关联。

不同阶段的侧重点不一样,但并不代表「学习阶段」就不能使用「网络结构」,通常来说不同领域的两棵树存在相似之处,通过比喻/类比可以快速学习新事物。

对于学习阶段,我们应该是在树状结构下进行理解和消化,甚至借助于其他树状结构进行类比/比喻,归类,组合,从而更快更好的学习新知识。当然,经过你自己的理解,你可以创造属于自己的结构,前提是你对当前学科有了足够全面的了解,否则会存在不恰到的横向引用。

其实卢曼的卡片盒笔记法在记录时也还是依照树状结构的方式来调节的,比如说 a2b3a24 其实蕴含的意思就是可能总共会有 1*2*2*3*1*24 = 288 条笔记。

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

而标记链接关系,其实也是为了检索,即通过 Index 关键词搜索/索引到想要看到的内容,每写一张新卡片都需要至少关联一张卡片。

Roam Research 中的双向链接

而对于现代化的笔记软件来说,我们可以从树状结构中直接 Link Reference 到其他树枝的树叶🍃,且支持信息源的回溯。

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

而对于「创造阶段」来说,「网络结构」带来跨领域解决方案时,也依然需要依托足够稳固的结构次序来实施,而非想到哪做到哪。

创造阶段,更需要组合(Compose)不同的旧的或新的东西,比如 iPhone,或者是八竿子打不着的深度 deeplink,比如冰山理论,你看不到的部分远比你想象的多。在这个阶段,当前学科领域的壁垒已经足够高,高处不胜寒,很难发现新机会,从而需要从其他领域来寻找新的灵感。尽情漫游,找出更多的链接,探索更多的可能性,发现更具前景的研究方向。

思想,在树上生长

「写作就是将网状的思考,通过树状的结构用线性的语言进行清晰的表达。」

不过在创造阶段,写给别人看的结构,依然是线性的语言,配合树状的结构,之所以用 Roam Research 来写书(rBook),也就是体验原本作者脑海中的网状海洋。

于是乎,新模型就出来了,原来是一个递归的过程,从别人的线性结构中学习,然后形成自己的网状结构,再输出为树状结构,所以 Roam Research 跟真实的大脑更配,都是网络链接之下的不断分形。(关于分形和 Roam Research,之后想展开讲一讲,太有意思啦。)

对了,XMind 产品所代表的理念:思想,在树上生长。

「ideas grow on trees.」

而世界本来是一个混沌的整体,如何学习和生存,就是要丰富自己的树状体系,然后去网状的世界寻找机会,即 Insight,从而创造 Wisdom 和 Wealth,然后积极影响世界。

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

小孩子才做选择,而我全都要。

Roam Research 的无限大纲树状结构和双向链接网络结构,完美满足了我对学习和创造的需求。

1. 无限(树状)结构

大纲 Outliner 的结构,不只是树状的,更可以是看板、表格(attr-table)也可以是卡片式(Roam Research 卡片式写作主题),更可能是 3D 的(Roam Portal),只是因为屏幕的限制,我们暂时只能在 2 维结构下去展示它。

但是稍加改变,也可以将 Outliner 取消缩进显示成 1 维线性,或是改变轴向形成横向的线性展开。树状结构说白了是更符合大脑认知的,而世界则是混沌的网状结构。

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

知识的另一种存在形式:知识网络。这种网络是由于大脑的生理构造决定的,不由人的意志所转移。但是在网络结构之上,有一层结构会使得知识组织更高效,而这种结构就是「树」。

树状结构的优势

树状结构的优势在于"提高了网络查找的效率",以及所有的知识有了层次,易于理解,传递关联关系,符合自然,利于群体传达。

MIT认知科学家 Josh 发表在 PNAS 的论文中,比较了抽象知识的不同表征结构,如星形结构、聚类结构、环形结构等等,最终还是意识到,人类的最佳知识结构是树形结构

只有树形结构,才是最符合人类认知特点的一种结构,从树的上一层到下一层,是具备唯一通道,便于大脑将知识从记忆底层快速提取出来,符合人类大脑是个认知吝啬鬼的特点;树又是兼具横向扩展与纵向扩展能力的最优雅的结构。

树状结构的劣势

树状结构的劣势:树状目录有个很明显的问题就是不同的树枝之间无法横向访问(比如下图中的①和②之间要联系起来还得经过根节点,路径非常长,效率也就不高)

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

我们人类在学习新概念时,尤其是抽象概念时,往往是通过类比/比喻等方式,与已有的概念联系起来的。例如,我们在学习黑洞概念时,往往就可以把它想象成一个漩涡。而这种类比/比喻,本质上就是在不同知识分支上进行横向关联。

例如,物理中核裂变需要一个最低的临界质量才能发生,而马克思主义哲学中也会有一个「质变和量变」的概念;而查理·芒格会把投资出手跟棒球手的击球出手联系起来。

2. 双向(网状)链接

网状结构也有一些其本身的拓扑结构所带来的优势和劣势。

网状结构的优势

网络结构中的知识点互相连接,两个节点之间的连接是比较健壮的(相邻的两个点如果直连断掉了,还能绕行其他路线)。

同时,网络结构非常易于扩展,一个知识点想加入,只要跟网络的任何一个知识点建立一条连接就可以了(这也就是为什么人类学习新知识是蛮高效的原因)。

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

比如说,上图中的①和② 知识点之间需要链接时,就是在构建树和树之间的网状结构,而这种结构会更加稳固,并且,随着链接的数量增加会加强其网络效应。

网状结构的劣势

节点和节点之间的连接是任意的,无规律的,它们之间也没有形成逻辑关系或者层次关系。

如果人的知识真的只按网状结构来组织,人类不可能建立如此有组织的文明。

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?

你在想到概念A时,可能会随机的跳跃到与概念A相连的某个(B1、C3、D5、Z8、X13)概念:

    1. 学习阶段,不聚焦,非常影响当前项目的进度。#ADHD

    2. 创造阶段,这一点就是非常有用的,能够激发灵感。

数据的双向链接有可能是有害的

在我看来,是的,单纯给现有软件的数据(并非「知识」)增加双向链接有可能是有害的,本质上有了双向链接(自动反向链接)才有了网络结构,否则应该只是有向图而已,且需要你手动主动去添加反向链接(可能是」知识」)。

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?
有向图

注意,反向链接只是连接笔记,没有连接知识,当你建立反向链接时,同样需要对知识是如何链接的加以说明,软件可以自动化,知识无法自动化。

Backlinking is just linking notes without connecting knowledge.

为了规避网络结构的问题,包括不必要的干扰,但是又要享受其好处,最好的做法应该是梳理树状结构,然后横向对比和建立链接。即在一棵棵树之间,通过类比来横向学习,通过远程联想来寻找创新,纵向学习,横向创意

思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?
「自下而上」网络:树状结构 vs 网状结构
思想,在树上生长:树状结构 VS 网状结构,如何搭建你的知识体系?
overlaps in Zettels 分支和分支之间的交叉连接

✇吕立青的博客

如何把 Roam Research 安利给你的另一半? | Roam Newsletter 漫游研究所周报 2021W12

作者 吕立青

Tweet by @Jimmy_JingLv on [[March 13th, 2021]]:

📮 Roam Newsletter 漫游研究所周报 #2021W12


#[[Roam 插件]] 我一直在寻找的 Chrome 插件,支持将 Roam Research 一直悬停在浏览器侧边栏

https://twitter.com/roamresearchFR/status/1370531473594408963


#[[Roam 插件]] #Roam42 支持新的 Jump nav 命令,能够快速跳转到父级或同级相邻 Block

https://twitter.com/roamhacker/status/1370637978121428992


#[[Roam 技术]] 基于 puppeteer 实现的 Roam Research 私有 API

https://twitter.com/artpi/status/1299754234863390720


#[[Roam 技术]] 在 HTML 元素添加 data-link-uid 属性,能够极大地方便开发者对 Block 内容进行查询或修改

https://twitter.com/roamhacker/status/1370864539386970112


#[[Roam 技术]] {roam/render} 将直接支持渲染 React 组件,直接通过 JavaScript 运行代码即可

https://twitter.com/roamhacker/status/1368312682504458243


#[[Roam 周边]] 可视化的数据处理流程,代码和结果共同展现

https://twitter.com/_paulshen/status/1371213300080336897


#[[Roam 用例]] Roam 是专为网状思维而设计的笔记工具,作者的使用经验分享

https://twitter.com/adam_keesling/status/1196864429695987713


#[[Roam 插件]] Roam Research OCR 插件,能够直接对图片内容进行文本识别

https://twitter.com/MitchSchwartzCo/status/1321632468735270914

https://twitter.com/cococ_rr/status/1371333171023855617


#[[Roam 用例]] 每天都是崭新的开始,Daily Notes 使用体验

https://twitter.com/wirtzdan/status/1371352813725487105


#[[Roam 用例]] 在 Roam Research 中学习语言的工作流

https://twitter.com/TheIndLang/status/1371206275774697474


#[[Roam 用例]] 作者指导学员使用 Roam Research 的经验分享

https://twitter.com/rjnestor/status/1371597262426673156


#[[Roam 社区]] Roam Research 生日蛋糕 🎂

https://twitter.com/ahmedlhanafy/status/1371227669858283525


#[[Roam 教程]] Roam Research 系列教程之 3:通过 Roam 在上下文中漫游

https://twitter.com/kvistgaard/status/1370427396478930944


#[[Roam 用例]] Roam Research 健身健康知识公开 Graph

https://twitter.com/tombielecki/status/1371955773434044419


#[[Roam 插件]] #Roam42 #SmartBlocks 新命令,支持垂直和水平的屏幕布局控制,类似 Tmux 的窗口管理体验

https://twitter.com/PascalPrecht/status/1371855289285246977


#[[Roam 洞见]] 不断迭代内容产出的形式:推文 -> 博客 -> 视频

https://twitter.com/cortexfutura/status/1372248564752125955


#[[Roam 用例]] “如何像 Power User 一样进行上下文切换”

https://twitter.com/roamhacker/status/1372279886119907333


#[[Roam 周边]] 梦想中的“文字处理器”,类似语法大爆炸的效果

https://twitter.com/elzr/status/1372391789332725763


#[[Roam 洞见]] Roam Research 就是创作者的“想法乐高”

https://twitter.com/JESSCATE93/status/1372718805957234691


#[[Roam 插件]] 通过 #SmartBlocks 自动移动 Block 的位置

https://twitter.com/roamhacker/status/1372806097933717506


#[[Roam 生态]] 在 Roam Research 里面直接制作和发布 Newsletter

https://twitter.com/roamreads/status/1372585116619317252


#[[Roam 周边]] Workflowy 终于支持图片和文件附件

https://twitter.com/WorkFlowy/status/1372581468770201600


#[[Roam 生态]] zoteroRoam 更新,支持从 Zotero 跳转至 Roam 页面

https://twitter.com/AlixLahuec/status/1372384259969851394


#[[Roam 模板]] 关于会议讨论和项目计划的有用模板

https://twitter.com/henry_cck/status/1372783124451524615


#[[Roam 洞见]] #ADHDd 最佳治疗方案是使用 Roam Research

https://twitter.com/Conaw/status/1263036306654785536


#[[Roam 社区]] 作者分享自己如何把 Roam Research 安利给自己老婆的有趣故事

https://twitter.com/MarcKoenig_/status/1372994139059580932


#[[Roam 教程]] 25 分钟的 Roam Research 技巧分享

https://twitter.com/MarcKoenig_/status/1361457957431615488


#[[Roam 插件]] 把 Roam Research 内容快速变成 Slides

https://twitter.com/danfinlay/status/1373033177707470850


#[[Roam 洞见]] 写作能够有助于研究,让读者和自己都能有所收获,且有更多的突破

https://twitter.com/danfinlay/status/1373033177707470850


#[[Roam 教程]] 用好 Roam Research 20%的基础功能,就能享受 80%的好处

https://twitter.com/pcsoundscaping/status/1373265546637156352


#[[Roam 教程]] 使用间隔重复 SR 进行学习的魔力

https://twitter.com/roamhacker/status/1373750089680875531


#[[Roam 图谱]] 知识管理第二大脑的双向链接动态变化图

https://twitter.com/pietronickl/status/1373632884830056454


#[[Roam 技术]] 从想法到项目,作者分享自己如何创造 Roam Excalidraw 画图插件

https://twitter.com/zsviczian/status/1373712129694560260

✇吕立青的博客

事物间丰富的关联,是我们抽象、感知和思考的重要部分 | Roam Newsletter 漫游研究所周报 2021W11

作者 吕立青

Tweet by @Jimmy_JingLv on [[March 9th, 2021]]:

📮 Roam Newsletter 漫游研究所周报 #2021W11


#[[Roam 教程]] “Blocks in Roam Research” 系列视频,帮助你了解什么是 Block,Page 和 Block 的类型,“Block” 是 Roam Research 的基石,[[Trees in the forest]]

https://twitter.com/roamhacker/status/1369522658677776384


#[[Roam 技术]] Roam Research API 已支持 Write 写操作,从技术上来说可以做很多有趣的插件和集成操作!比如说做一个类似 FlomoPlus 的数据导入插件 github.com/JimmyLv/roam-plus

https://twitter.com/roamhacker/status/1352553777790902274


#[[Roam 历史]] Conor 关于 Roam Research 最初的想法来源,“超链接 Hypertext” 之父 Ted Nelson 上都计划

https://twitter.com/azlenelza/status/1272600877493137408

https://twitter.com/Conaw/status/1369509424654557187


#[[Roam 生态]] Codex 编辑器想要打造的是 知识工作者的操作系统(the Knowledge Worker’s OS)

https://twitter.com/codexeditor/status/1369515923262992384


#[[Roam 技巧]] 通过特定域名查询关键词 {{query: {and: [[ethereum]] {or: “[medium.com](https://medium.com)” “[substack.com](https://substack.com)”}}}

https://twitter.com/RobertHaisfield/status/1343911948526612480


#[[Roam 技巧]] 通过 ``` 查找特定代码段,甚至包括特定语言的代码段

https://twitter.com/RobertHaisfield/status/1369420330968743941


#[[Roam 插件]] 直接在 Roam Research 里面运行 Python 代码, Alt + Enter 可运行当前代码块,Alt + Shift + Enter 可运行当前笔记本中的所有代码块。

https://twitter.com/adam_krivka/status/1367932251959353347


#[[Roam 用例]] 通过 Roam Research 学习希腊语,能够主动发现语言中的常见构造

https://twitter.com/KyleStratis/status/1369378108583927830


#[[Roam 洞见]] Conor 引用孙子兵法的「机不可失」来解释 Roam 为什么没有 Roadmap

https://twitter.com/Conaw/status/1369364863772921862


#[[Roam 社区]] 第二届 #RoamSummit Roam 峰会,美国东部时间 3 月 13 日,星期六,下午 2 点,主题是探索 Roam 编写的书籍

https://twitter.com/RoamBrain/status/1369357631194796040


#[[Roam 插件]] Roam Weather SmartBlock,可动态插入天气卡片,并支持手动更新

https://twitter.com/roamhacker/status/1369274865123999749


#[[Roam 技术]] 使用新的 Filesystem API 可以使 @RoamResearch 能够直接编辑本地的博客 Markdown 文件

https://twitter.com/adam_krivka/status/1368524087639826432


#[[Roam 教程]] 何时在 Roam Research 中使用页面,标签或属性?

https://twitter.com/yak_collective/status/1369230545125793793


#[[Roam 周边]] 使用 flowchart.fun 可以直接通过文本生成 五行 关系图

https://twitter.com/SteveYang331/status/1369543055922126849


#[[Roam 洞见]] 费曼学习法,写作即是思考

https://twitter.com/roamhacker/status/1369667930850537477


#[[Roam 教程]] 使用间歇日记替代 To-Do List 提高效率

https://twitter.com/roamhacker/status/1369917340847116289


#[[Roam 插件]] [[roam/js]] 插件 TODO 爆炸效果,快去把事情搞定吧!

https://twitter.com/artpi/status/1362813924802977797


#[[Roam 洞见]] Roam Research 最棒的一点在于 Composability(可组合性)

https://twitter.com/artpi/status/1358432819027058695


#[[Roam 洞见]] 事物之间丰富的联系(relationships, connections)是人们抽象、感知和思考的重要部分 —— @TedNelson

https://twitter.com/Jimmy_JingLv/status/1369543916832190469


#[[Roam 周边]] 想看看一篇天体物理学论文是如何诞生的吗?

https://twitter.com/realscientists/status/1369995661253480450


#[[Roam 教程]] 60s 极简 Roam Research 教程,第 8 期 Block Reference

https://twitter.com/markmcelroy/status/1370356478599704576


#[[Roam 插件]] 通过 Telegram Bot 自动发送内容到 Roam Research Daily Notes

https://twitter.com/arn4v/status/1370405473367695360


#[[Roam ]] #roamcult 学术界 Discord 社区,Academia Roamana

https://roamresearch.com/#/app/AcademiaRoamana

https://twitter.com/cortexfutura/status/1369740588015378433


#[[Roam 用例]] 在 Roam Research 做计划真的很简单:问自己三个问题:我想完成什么?我将如何开始?有没有什么障碍? [[WOOP]]

https://twitter.com/cortexfutura/status/1370325041578131458

https://twitter.com/cortexfutura/status/1370325020774428675


#[[Roam 生态]]roam.garden 数字花园也将支持 块折叠 功能

https://twitter.com/VladyslavSitalo/status/1370249616885653506


#[[Roam 洞见]] 磨刀记得砍柴

https://twitter.com/760mph/status/1370063171814297600


#[[Roam 教程]] 系列 Thread Tweets —— 什么是 Roam Research 的 Block?

https://twitter.com/roamhacker/status/1364296274468614151


#[[Roam 技巧]] Multibar 可以快速折叠文章段落,Roam 页面标题也可以加上背景图片 :D

https://twitter.com/roamhacker/status/1370041146169294853


#[[Roam 洞见]] 如果页面滚动时,其他部分的文本只是被压缩了 —— 即保持可见状态但不会消失在屏幕外,这样既能突出显示又能直接显示搜索字词的缩略图

https://twitter.com/azlenelza/status/1370159999691919364

✇吕立青的博客

【译】Roam Research 自定义组件 —— 跟 {{roam/render}} 来一次亲密接触!

作者 吕立青
Roam Research 采用的是 Clojure 技术栈的 Datomic/datascript Datalog 数据库,能够将内容同步到不同的设备,并管理非常复杂的撤销操作,还能够支持各种程度的自定义组件和插件功能定制,方便开发者利用 Reagent 渲染组件,并支持与 JavaScript 互操作。本文就将硬核解析 Roam 背后原理,发掘 Roam 基于 Block 的深层技术优势,帮助你迎接 Roam API 时代的到来!
原文地址:A closer look at {roam/render} —— Zsolt Viczián

Swiss Army Knife

Roam 就好像一把优秀的瑞士军刀,竟然包含一个完整的 ClojureScript 开发环境。在过去两周里,我逐渐熟悉了 ` {{roam/render}} `。这篇文章可以算作我自己的笔记,总结整理一下我的所见所学。

这篇文章是针对开发者和 Roam 黑客的。如果你还不属于这些阵营,你很可能会对这些内容感到吃力。

我并不是一个 Web 开发者,React、Clojure、Reagent 和 Datalog 对我来说完全是崭新的事物。我是一个典型的无知者无畏的终端用户,我知道如何构建一个基于宏的庞然大物,但却无法保持其健壮/可测试/可维护。在玩roam/render的过程中,有一次我几乎把我的整个 roam 数据库都毁掉了 —— 这与roam/render无关,一切都是因为我太笨了。请谨慎尝试我的结论和例子,欢迎在评论中分享更好的解决方案,或者联系我进行勘误。

什么是 roam/render?

` {{roam/render}} `是Roam中用于构建自定义组件的原生特性。这些组件可以是简单的表格、计算器、滑块,也可以是复杂的交互式工具,比如数据透视表、图表、流程图等。

roam/render 也是一个使用 Reagent 在 ClojureScript 中实现的 React 组件。你可以使用 Datalog 在 Roam 的 Datomic Graph 中访问你的数据。

其实就在几周前,以上两句话中的每一个单词对我来说都是陌生的。让我们先来快速看看每个词的意思:

  • React是一个用于构建用户界面的 JavaScript 库。*
  • Clojure(/ˈkloʊʒər/, 很像 Closure 闭包的拼写)是一种支持动态类型和函数式编程的 Lisp 方言。和其他 Lisp 方言一样,Clojure 将代码视为数据,并有一个 Lisp 宏系统。*
  • ClojureScript是一个针对 JavaScript 的Clojure编译器。*
  • Reagent是一个 React 的 ClojureScript 封装。它可以帮助你轻松创建 React 组件。Reagent 有三个主要的功能,使其易于使用:使用函数创建React 组件,使用Hiccup 生成 HTML,以及在Reagent Atoms中存储状态。Reagent 可以让你写出简洁可读的 React 代码。*
  • Hiccup是一个用于呈现 HTML 的 Clojure 库。它使用 vectors 来表示元素,使用 maps 来表示元素的属性。* 试着玩一玩HTML2Hiccup,可以帮助你更好地了解 hiccup 的工作原理。另外,你也可以直接在 Roam 中输入 hiccup,只要在一个空块中输入:hiccup [:code "Hellow World!"],看看会发生什么。
  • Atoms是 Clojure 中的一种数据类型,它提供了一种管理共享、同步、独立状态的方法。一个 Atom 就像其他编程语言中的任何引用类型一样。Atom 的主要用途是保存 Clojure 的不可变数据结构。 *
  • Datomic是一种新型数据库。Datomic 不是将数据收集到表格和字段中,而是由Datoms [entity-id attribute value transaction-id] 建立。这种架构为改变和扩展数据库 Schema 提供了高度的灵活性,而不会影响现有的代码。*
  • Datalog是一种基于 Prolog 的声明式、基于形式逻辑的查询语言。*我分享了一些简单的 Datalog 实例,在这里查看如何生成 Roam Graph 有关的基本统计数据。

入门指南

开启自定义组件

自定义组件功能默认是禁用的。在你搞事情之前,你必须在用户设置中启用它。

enable custom components in user settings

Hello World!

你可以通过在 Block 中添加以下代码来嵌入 roam/render: ` {{roam/render: ((block-ref))}} ` 其中 block-ref 指的是你的脚本代码的块引用。脚本代码必须至少有一个函数。如果这个 Block 有多个函数,那么在组件创建时只会调用最后一个函数。

被引用的代码块必须包含一个设置为 Clojure 类型的代码块。代码块的创建是通过使用三个反引号 ` ``` ` 来完成的。如果你不知道键盘上的反引号键在哪里,你也可以使用/菜单,然后选择 Clojure Code Block。

Hello World Roam Render Demo

一步一步来

  1. 在一个新的 Block 中输入: {{roam/render:((...))}}
  2. 当你开始在双括号之间打字时,Roam 会弹出 “search for blocks”。选择 “Create as block below”。这将在你当前 Block 下面创建一个 Block,并自动在括号之间放置一个块引用。
  3. 导航到新的 Block,并添加两个额外的反引号``来创建一个代码块。
  4. 将代码的语言设置为 Clojure。
  5. 最好给每个组件都有自己的命名空间(ns myns.1),虽然 Hello World 没有它也能工作。这将为你在以后的探索省去很多头疼的问题,因为当同名的函数相互竞争时,调试会让人非常头大。我遵循一个简单的模式,按顺序给我的测试命名空间编号。当我准备好了一个组件,我才会给它自己合适的命名空间。
  6. 代码块应该至少有一个函数:(defn hello-world [])
  7. [:div"..."] hiccup 这种写法等价于 <div>Hello World</div>
(ns blogpost.1)
(defn hello-world []
  [:div "Hello World"])

恭喜你!你已经使用 ClojureScript 成功创建了你的第一个 Roam 组件!现在你应该看到 Hello World 出现在代码上方的 Block 中。

接收 input 参数

当你开始为实际用例构建组件的时候,你很快就会意识到,如何知道当前组件正在运行的 Block 的 ID 呢?你需要这个 ID 来创建能够感知上下文的组件,即它们需要知道自己选择在哪个 Page 上,上级或上级有哪些 Block 等等。

我花了好几天的时间才发现如何做到这一点。我想让你省点力气! 当一个组件被调用时,Roam 会把 block-id 作为第 0 个参数传递给主函数(注意:你代码块中的最后一个函数)。当然,Roam 还会传递当你调用组件时,所输入的其他任何参数。

在新的 Block 输入下面的脚本,将产生以下输出。(当然,请注意,当你在自己的 Graph 中尝试这个脚本时,Block 的 ID ((Vy8uEQJiL))会有所不同,所以对应的 block-uid “eR7tRno7B “也会不同。)

{ { roam/render: ((Vy8uEQJiL)) 10 "input 1" ["input" "vector" "with" 5 "elements"] {:key1 "this is a map" "key2" "value 2" :key3 15} (1 2 3) #{"a" "b" "c"} } }
datatypes / arguments example

这里的内容很多。让我们借此机会学习一下 Clojure 数据结构。我正在向自定义组件传递六个参数。除了这六个参数之外,Roam 默认将 block-uid 作为第一个参数传递。如果你想深入了解 Clojure 数据结构,我推荐这篇文章

  • 第 0 个参数是block-uid。它是作为一个单一元素的 map 传递的。
  • 接下来,我添加到组件的第一个参数是一个 integer 整数。我可以简单地把它作为一个数字传递给组件。
  • 然后是一个 string 字符串。Clojure 只接受双 “引号” 标记的字符串。单个 ‘引号’(单引号)有不同的含义。使用'会产生一个不被计算的形态,下文还会提到如何在 datalog 查询中使用单引号。
  • 第三个输入参数是一个 vector。请注意,在 Clojure 中,你可以用空格隔开一个 vector 的多个元素。这个 vector 总共有四个元素,三个字符串,一个整数。
  • 接下来是一个有三个 keys-values 的 map。你可以使用 “string” 作为 key,就像在 JavaScript 对象中一样,然而,Clojure 还提供了使用:keywords 作为 key 的方式。关键词以 : 冒号开头。你可以使用 , 逗号来分隔 key-value 键值对,但这不是必须的。注意在输入中我没有使用逗号。
  • 第五个参数(Arg 4)是一个 list 列表。列表的主要用途是表示未被计算的代码,在你进行元编程时,用来编写生成或操作其他代码的代码。
  • 最后一个参数是一个 set 集合。set 和 vector 很像,关键的区别是 set 中的每个值都是唯一的。同样根据设计,set 中每一项的顺序是任意的。

代码本身是自解释的。你应该注意到我是如何使用[:b],相当于<b>...</b> 用来表示粗体文本。clojure.core/map-indexed将把输入向量 args 中的每个元素传给匿名函数fn[i n],其中i是索引号,n是正在处理的 vector 的当前元素。

(ns blogpost.2)
(defn main [ & args]
  [:div
   [:b "Number of arguments received: "] (count args)
   (map-indexed (fn[i n] [:div [:b "Arg " i ": "] (str n) ]) args)])

现在我们知道第 0 个参数总是带有 block-uid 的 map,我们可以稍微修改一下我们的代码,将 block-uid 接收到一个专用变量中。这是我在所有组件中使用的 “standard” 主函数声明。 (defn main [{:keys [block-uid]} & args]。将前面的例子用标准 main 函数稍微改写一下,就会变成这样。

(ns blogpost.2)
(defn main [{:keys [block-uid]} & args]
  [:div
   [:b "The block-uid is: " ] (str block-uid) [:br]
   [:b "Number of arguments received: "] (count args)
   (map-indexed (fn[i n] [:div [:b "Arg " i ": "] (str n) ]) args)])

一个简单的 Reagent 表单

Reagent 是表单交互的关键。它们允许你根据用户输入的数据,动态地改变组件的 HTML 渲染,无论是组件本身还是在 Graph 中的 Page 页面。

为了理解下一个例子,你首先需要了解 Clojure 变量。Clojure 中的所有变量都是不可变的,这意味着它们是作为常量创建的。变量可以有不同的作用域,也就是说,你可以在命名空间的层次上定义变量,或者只是在一个函数中定义变量。但是一旦设置,它们的值就不能改变。

有几个方法可以绕过这种不可变性。其中之一是通过使用 atoms。 atom 的工作原理我就不深究了(顺便说一句,就算我想解释也解释不清楚),Atom 就是对一个值的引用。使用 swap! reset!可以把这个引用改成一个新的值。在clojure.core/swap!中,你可以在给 Atom 分配新的值之前访问它的前一个值,在clojure.core/reset!中,你只需给 Atom 分配一个新的值,而不用去管它的前一个值。

roam/render中,我使用reagent.core/atom而不是clojure.core/atom。Reagent atoms 与普通 atoms 完全一样,只是它们会跟踪derefs(即访问它们的值)。Reagent 组件如果 derefs(解引用)发现其中的值发生变化,就会自动重新渲染。在实践中,这就意味着你可以根据数据的变化动态地改变组件。

我们将构建一个简单的表单,只包含一个输入字段。当你在 Graph 中输入一个页面的名称时,这个表单就会返回该页面的 UID。例如,你可以用这个来创建一个直接超链接到你的页面,URL 格式为 https://roamresearch.com/#/app/YOUR-GRAPH/page/9char-UID

(ns blogpost.3
  (:require
   [reagent.core :as r]
   [roam.datascript :as rd]))

(defn query-list [x]
  (rd/q '[:find ?uid .
          :in $ ?title
          :where [?e :node/title ?title]
                 [?e :block/uid  ?uid]]
        x ))

(defn main []
  (let [x (r/atom "TODO")]
    (fn []
     [:div
     [:input {:value @x
      :on-change (fn [e] (reset! x (.. e -target -value)))}]
     [:br]
     (query-list @x)])))

有几件事值得解释一下:

  • 请注意命名空间声明下的:require块。这些是我们代码中引用的命名空间。我稍后会分享一个简单的组件,你可以用它来探索 Roam 中所有可用的命名空间。使用:as你可以指定一个别名来引用你代码中的命名空间。
  • query-list函数中,我们使用 roam.datascript(rd) 命名空间中的q函数执行一个简单的数据记录 query。请注意查询'[:find ?uid .开头的单引号 '。另外,请注意?uid后面的点 .。这个点 . 将查询的结果转换为一个标量。我在这里使用它,是因为我想要找一个单一的 uid 值作为函数返回值。
  • 依然是 query-list 函数,请注意我们没有在函数的结尾有一个类似于 JavaScript 的 return的语句。在 Clojure 中,函数中最后一次调用的结果总是被返回。由于query-list只包含一次调用,所以在执行 query 时,将直接返回rd/q的结果。
  • 请注意,在main函数中,x 被定义为一个初始值为 “TODO” 的 Reagent atom。将声明放在(fn[]后面的匿名函数之外,可以确保在创建组件时,只会设置一次 atom,而不是在每一次往 INPUT 框输入任何文本时,都将其重置为默认值。

以上是由Conor的一个例子改编的。你可以在 Roam help 数据库 这里 找到 Conor 的版本。我的解决方案和 Conor 的解决方案之间的一个关键区别是,他使用的是roam.datascript.reactive,而不是仅仅使用roam.datascript。在这个具体的例子中,从我的理解来看它们是没有区别。如果我的理解是正确的,Datascript reactive 提供了一种创建查询的方法,当其结果集发生变化时,它可以自动识别。它们可以用于创建交互式组件,比如 {{table}}

如何存储组件的属性值

当你重新打开页面或关闭并重新打开 Roam 时,组件会被重新初始化。在大多数情况下,你会希望以某种方式存储组件的属性,这样当你下次打开页面时,你会发现组件处于你离开时的状态。

你可以选择将信息写入 Block 中,并决定写入哪一个 Block。你可以写到嵌套在组件下的 Block ,或者写到一个工具页面上的 Block 里面,例如[[my component/data]] 或者更新执行组件的那个 Block。最后一种选择涉及更新 {{roam/render: ((block-UID)) }} 与 input 参数,这与我们在前面的例子中打印 input 参数的方式有些类似。我将在一个非常简单的例子中演示如何做到这一点。

顺便说一下,我用datascript.core做了一个实验,将自定义实体写入到 Roam 数据库。我也能够执行查询,但是没有找到一种方法让 Roam 保存更改。手动编辑自定义实体到 EDN 文件中是可行的(演示),所以使用datascript添加自定义实体应该也是可行的。

(ns blogpost.4
  (:require
   [roam.datascript :as rd]
   [roam.block :as block]
   [clojure.string :as str]))

(defn save [block-uid & args]
  (let [code-ref (->> (rd/q '[:find ?string .
                              :in $ ?uid
                              :where [?b :block/uid ?uid]
                         	     [?b :block/string ?string]]
                            block-uid)
                      (str)
                      (re-find #"\({2}.{9}\){2}"))
        args-str (str/join " " args)
        render-string (str/join ["{{roam/render: " code-ref " " args-str "}}"])]
    (block/update
      {:block {:uid block-uid
               :string render-string}})))

(defn main [{:keys [block-uid]} & args]
  (let [some-value [1 2 "string" {:map "value"}]]
    [:div [:strong "args: "] (str/join " " args) [:br]
     [:button
      {:draggable true
       :on-click (fn [e] (save block-uid some-value))}
      "Save"]]))

这个组件将保存 some-value 的值。在这个例子中,为了简单起见,它是硬编码的,但当然,你可以构建任何你想要的数据结构来代替 some-value。请注意以下几点:

  • 我的 save 函数是在 main 函数中按钮的:on-click事件中调用的。在我的实验中,每次组件改变其值时自动调用 save 的效果并不好,因为每次覆盖 {{roam/render: ((block-UID))}} 的时候,组件都会重新初始化,使得无法填写表单,或者通过交互的方式使用组件。
  • 我在 save 函数中定义了三个变量。code-refarg-strrender-string
  • code-ref将保存 block-string 的当前值,因为我在执行 datalog 查询的时候,会读取:block/string属性的当前值,并通过block-uid过滤。
  • ->>是一个函数,它通过一组 (str)(re-find) 的形式来执行表达式。它的唯一目的是让代码更易读。
  • re-find中的正则表达式会找到 {{roam/render: 后面的((block-UID))
  • 一旦render-string准备好了,我就调用roamAlphaAPIblock/update 将 Block 更新为我的 string 文本。

下面是这段代码的运行情况:

Saving state

似乎还有一种方法,可以使用 Reagent 在 Form-3 Components 中所提供的:component-will-unmount事件处理器,来触发保存组件。虽然我还没有尝试过这种方法,但根据文档,这应该提供了一种方法来存储组件的属性,当你导航到不同的页面时,它就会从当前视图中消失。如果你对此感兴趣,你可以阅读这里

如何与 Javascript 互操作

ClojureScript 提供了一种调用 JavaScript 函数的简单方法。当你想访问 DOM document 属性或函数时,这就非常实用了。比如调用 roam42 函数或创建一个 JavaScript 钩子来处理roam/render组件的数据(可以节省你学习 Clojure 的时间)。

第一个例子是返回页面的 location 位置。

(ns blogpost.5)
(defn main []
  [:div (. (. js/document -location) -href)])

请注意 JavaScript DOM document 是如何使用js/document访问的。

属性是用-property符号来访问的。用于访问对象属性的 JavaScript . 点符号,需要转化为嵌套的小括号,每个括号都调用下一个属性或函数。

使用->可以使代码更易读,特别是在属性链特别长的时候。

(ns blogpost.6)
(defn main []
  [:div (-> js/document
          (.-location)
          (.-href))])

现在,我们将再做一遍上面的 Reagent 表单简单示例 (blogpost.3),但是将(defn query-list [x]替换为 JavaScript 来执行我们的 datalog 查询。

javascript interoperability

下面是 ClojureScript 的代码。

(ns blogpost.7
  (:require
   [reagent.core :as r]))

(defn main []
  (let [x (r/atom "TODO")]
    (fn []
     [:div
     [:input {:value @x
       :on-change (fn [e] (reset! x (.. e -target -value)))}]
      [:br]
      (.myDemoFunction js/window @x)])))

以及 ` {{roam/js}} ` 的代码。

window['myDemoFunction'] = function (x) {
  return roamAlphaAPI.q(`[:find ?uid .
                          :in $ ?title
                          :where [?e :node/title ?title]
                                 [?e :block/uid ?uid]]`, x);
}

如果你想把多个变量传给 JavaScript,你可以在函数调用(.myFunction js/window variable-1, @an-atom, block-uid)之后简单地列出这些变量。

Roam 已有的命名空间

roam/render 中有以下命名空间。

  • Clojure: cljs.pprint, clojure.core, clojure.edn, clojure.pprint, clojure.repl, clojure.set, clojure.string, clojure.template, clojure.walk。
  • Roam: roam.block, roam.datascript, roam.datascript.reactive, roam.page, roam.right-sidebar, roam.user, roam.util。
  • 其他: datascript.core、reagent.core。

这段代码将列出每个命名空间中所有可用的函数。

(ns blogpost.8)

(defn main []
  [:div (map (fn [x] [:div
              [:strong (pr-str x)]
              [:div (map
                     (fn [n] [:div (pr-str n)])
                     (->> (ns-publics x)
                          (seq)
                          (sort)))]])
          (into [] (->> (all-ns)(map ns-name)(sort))))])

Tips 和技巧

一些有用的链接

下面是我自己写的一些组件,因为我在继续深入研究roam/render。请在你的测试/开发 Graph 中尝试它,一定要格外小心。虽然我相信这些例子,应该可以在不损坏你的数据库的前提下工作,但如果出了问题,我概不负责哦……

你也可以随意浏览我的 Graph,里面有很多有关 Clojure 和 Reagent 成功和不成功的尝试。我会尽量把成功/不成功的解决方案都标出来。

调用组件

` {{roam/render: ((block-UID))}} 引用组件的形式不是很友好。它需要点击几次才能得到 block-uid` 并将其插入到渲染的 Block 中。我发现了两种选择。

你可以在 roam/templates 中创建一个简单的本地漫游模板,然后在那里用一个友好的名字添加你的组件。然后,当你需要它时,你可以使用;;template-name将组件插入到你的文档中。

你也可以 Hack 一下 block 的 UIDs。我在这里提供了一个解决方案。这将允许你用更友好的名字来创建组件,比如我的 query 查询组件。 ` {{roam/render: ((str_query))}} `。

前置声明

这个让我头疼了几个小时。 Clojure 采用的是单通道(single-pass)编译。这意味着,如果一个函数在声明之前被调用,编译器会抛出一个错误。在某些情况下,不可能按照函数的使用顺序来声明函数,比如在涉及两个函数的迭代中。这时clojure.core/declare就很用了,你可以做一个正向声明,编译器就会知道,在这之后会有这个函数的定义。

输出 Roam 的原生链接

如果你正在构建组件,当你想输出 Roam 原生链接时将会遇到一个问题。你可以直接点击链接,就会打开页面。你也可以shift-click的链接,就会在侧边栏中打开页面。我发现有三种方法可以实现输出这种可工作的链接。

最简单的方法是使用roamAlphaAPI创建一个 Block,并在这个 Block 字符串中放置一个page linkblock-ref。这将转换为一个正确的 Roam 链接。

另一种方法是创建一个包含 Roam 查询的 Block,并在查询参数中包含你想显示的链接: {{query: {or: page linkblock-ref}}

由于 Roam 在几天前发布了roam.right-sidebar命名空间,现在可以完全模仿 Roam 原生链接了。我还没有时间去试验这第三个选项,但它看起来是可行的。

如果你对此感兴趣,不妨到我的Graph中看看,也许从写这篇文章的时候起,我已经实现了解决方案。 我将创建一个响应点击事件的 Reagent 组件。在点击时,我将把浏览器导航到一个类似于下面 JavaScript 例子的链接。在shift-click时,我将使用roam.right-sidebar来打开链接。

function getRoamLink(uid) {
  if (window.location.href.includes('/page/'))
    return window.location.href.substring(window.location.origin.length + 1, window.location.href.length - 9) + uid
  else
    return (
      window.location.href.substring(window.location.origin.length + 1, window.location.href.length) + '/page/' + uid
    )
}

Debug 调试

我使用的是以下代码进行调试。通过将 slient 开关转为 true,我可以禁用console.log调试信息。可能无需多言,input 参数只是为了这个例子。

Debug demo
console.log
(ns blogpost.9)

(def silent false)
(defn debug [x]
  (if-not silent (apply (.-log js/console) x)))

(defn main [{:keys [block-uid]} & args]
  (debug ["(main)  block-uid: " block-uid "  args: " args])
  [:div "debug demo"])

一些限制

基于 Roam 是一个笔记应用这个前提,拥有 ClojureScript 环境当然很牛逼。但是,就像瑞士军刀的微型锯子一样,在某些情况下,它是很方便的。但如果你想砍一棵树,请去买一把电锯。

roam/render 有两个巨大的限制。它没有文档,更重要的是,它缺乏适当的调试工具。它确实会将一些错误信息输出到控制台日志中,如果有一致的调试信息,就有可能追踪到错误,但它严重缺乏基本的调试功能,如 breakpoints、watches 等等。当你排除 ClojureScript 代码故障时,就会比本来要花费的时间要长很多。

比较好的一点是,你可以将代码分别放到兄弟层级的 Block,这样就可以更好地添加注释了,利用中间的 Block 加入流程图、解释等,有点类似于 Python 中的 Jupiter Notebook。但是,你无法将可能频繁使用的函数,放到同一个共享的命名空间,以便在组件之间重用。我尝试将引用共享名称空间的 Block 作为组件的同级 Block,但不起作用。一个变通的办法是把所有组件的源代码放在同一个页面上,并放到同一个命名空间中。这样做是可行的,但如果你有很多组件,恐怕会变得很乱。这也会让你很难跟其他人共享组件。

Datascript 也有一些限制。你不能创建自己的转换函数。你不能在 Roam 数据库中创建自定义实体。还有一些 Clojure 命名空间和函数缺失。例如,clojure.string/lower-case无法使用。我想使用小写字母来支持对大小写不敏感的搜索,幸运的是,实际情况下配合 clojure.core/re-findclojure.core/re-pattern(?i) flag 有一个可以变通的方法。

最终结论

在笔记应用中拥有一个 Clojure 执行环境绝对是很酷的。但是,如果没有相应的调试工具和文档,开发组件的效率其实非常低。

比较好的一点是 roam/render 和 ClojureScript 可以用来输出渲染自定义组件,比如表单、数据透视表和其他交互工具。

基于我现有的知识,其实与 JavaScript 互操作似乎是最好的方式。你可以使用 roam/render,顾名思义,渲染输出的部分,然后你可以使用 JavaScript 来构建应用程序的逻辑部分。如果这样做的话,你就可以同时得到两个世界里最棒的部分了。你可以在 Reagent 中轻松地渲染响应式组件,这样就是在一个真正的开发环境中,使用满足需求的调试工具完成大部分的开发工作。此外,你可以使用你已经熟悉的语言进行开发(假设你已经具备了 JS 技能),你还能够在 JavaScript 中创建可重用的代码,这样还可以跟其他人共享复用代码。

✇吕立青的博客

为什么说 Roam 远不只是一个笔记应用 | Roam Newsletter 漫游研究所周报 2021W10

作者 吕立青

Tweet by @Jimmy_JingLv on [[March 2nd, 2021]]:

📮 Roam Newsletter 漫游研究所周报 #2021W10


#[[Roam 插件]] 增强版 PDF 扩展,作者分享了他的学术阅读工作流

https://twitter.com/cococ_rr/status/1366654227506991105


#[[Roam 用例]] 学术论文阅读的五个步骤:文献管理、论文阅读与瞬时笔记写作、永久笔记写作、永久笔记管理、笔记回顾

“双向链接的自动呈现大大简化了我的工作流,也加强了我构建网状知识库的意识。 ”

https://twitter.com/Jimmy_JingLv/status/1366674785636208644 %}


#[[Roam 特性]] 右上角添加了可调整内容区域大小的按钮

https://twitter.com/roamhacker/status/1368969582917132289


#[[Roam 生态]] @Airtable 标语:我们需要更多的软件开发者,而不仅仅是用户

https://twitter.com/airtable/status/1305491922258071554


#[[Roam 技术]] Roam Research 面试题之一就是打造一个小型 Excel

https://twitter.com/Conaw/status/1332814451368624129


#[[Roam 周边]] Readwise + Roam 集成的演示视频

https://twitter.com/RoamResearch/status/1367976244403261444


#[[Roam 特性]] Roam Research 删除页面时,提示当前页面的引用数量

https://twitter.com/roamhacker/status/1368171019861647360


#[[Roam 技术]]@craftdocsapp 写作软件的实现非常优秀,基于 macOS Catalyst 跨平台原生应用

https://twitter.com/andy_matuschak/status/1324769586697269249


#[[Roam 插件]] 跨 Block 思维导图的概念实现,配合 Stick Blocks Map 插件使用很有 Ginkgo 那个感觉

https://www.craft.do/s/wzKthqKQEz5NoM/b/451806EB-72C0-40E5-AE80-6D2AD32222E5/Block_Map

https://twitter.com/roamhacker/status/1367367351369400320


#[[Roam 周边]] 直接从大纲式纯文本生成 Graph 图例

https://twitter.com/SteveYang331/status/1367432144654495751


#[[Roam 洞见]] #知识管理 魔幻新词语

https://twitter.com/Jimmy_JingLv/status/1367394277530230791


#[[Roam 周边]] 可直接与 Roam Research 交互的播客笔记软件

https://twitter.com/jgoodhcg/status/1364225811709120512


#[[Roam 书籍]] 使用 Roam Research 进行专业的项目管理

https://twitter.com/Roamfu/status/1358766013215502340


#[[Roam 特性]] Roam Research 新增命令面板功能,可直接通过 Cmd+P 快速执行命令

https://twitter.com/roamhacker/status/1367354454316621824


#[[Roam 插件]]roamjs.com 新扩展:Timeline 模式 [[roam/js/timeline]] 可用来可视化特殊标签的事件时间线,比如 #Deadline

https://twitter.com/dvargas92495/status/1367249990171656192


#[[Roam 课程]] 学术笔记课程正式开课

https://twitter.com/LaptopLifeLisa/status/1367113625022967809


#[[Roam 特性]] Roam Research 官方内置的自动备份功能,再也不用担心数据丢失啦

https://twitter.com/Raz0r/status/1367308205701926913


#[[Roam 生态]] Flomo Plus 支持多种国内常用软件的笔记或高亮内容

https://twitter.com/plidezus/status/1367297192763879425


#[[Roam 用例]] 使用 Roam Research 网格 CSS 制作漫画

https://twitter.com/z9sx7wox/status/1366825424932790272


#[[Roam 洞见]] 记忆 vs 理解

https://twitter.com/visualizevalue/status/1366812844050759684


#[[Roam 技术]] 【译】深度解析 Roam 数据结构 —— 为什么 Roam 远不只是一个笔记应用

https://twitter.com/Jimmy_JingLv/status/1369206733122367489

✇吕立青的博客

【译】深度解析 Roam 数据结构 —— 为什么 Roam 远不只是一个笔记应用

作者 吕立青
随着 Roam Research 的大热,双向链接和基于 Block 的笔记软件层出不穷,而他们(葫芦笔记logseqAthens)无一例外都采用了 Clojure 技术栈的 Datomic/datascript Datalog 数据库,这不免让我感到好奇想要深入探索一番。本文就将硬核解析 Roam 背后原理,发掘 Roam 基于 Block 的深层技术优势,帮助你迎接 Roam API 时代的到来!
原文地址:Deep Dive Into Roam’s Data Structure - Why Roam is Much More Than a Note Taking App —— Zsolt Viczián

你想不想知道以下问题的答案?

  1. 你的 Graph 笔记库中最长的段落是那一段?
  2. 上周你编辑或者创建了哪些页面?
  3. 你的笔记库中总共有多少段文字?
  4. 在某个给定的命名空间下你总共有哪些页面?(例如:meetings/

(译注:问题 1 可通过 Roam Portal Chrome 插件 查看,问题 2 可查看 #Roam42 DB Stats,但本文将帮助你深入理解插件背后的原理。)

Roam Research 是一个全功能型数据库,相信你已经用上了 ` {{query:}} ` 的查询方法,但其实远不止如此,你还可以问它更多的问题。这篇文章会让你对 Roam 的底层数据结构基础有一个很好的理解。

上周我一直在深入研究 Roam 的数据结构,玩得非常开心,也学到了很多。这篇总结写给我自己,也分享给你,我尝试通过写作来加深我对 Roam 的理解程度。如果你发现这太过于技术向了,很抱歉,我会尽力用一种容易理解的方式来传达信息,从最基本的概念慢慢过渡到更为复杂的概念。

在我的探索过程中,我还构建了一组用于查询的 SmartBlocks,和相应的几个查询示例,你可以在这里找到它。虽然你不一定想要了解具体细节,但也会发现这些例子非常有趣。

随着我的深入,我对 Roam Research 的赞叹就更进一步,我也愈发相信 Roam 一定能够占领市场。在不久的将来,Roam 将以全文的形式保存你我所读到的一切:笔记、书籍和文章摘要等等,都将能够方便地追溯其原始出处,只需在一个系统中点击即可访问。“Roam” 未来可期!

我的文章也参考了很多极具价值的文章和参考资料。我特别想分享以下的几篇文章,如果你读了我的概述发现还想了解更多,那我强烈建议你继续探索:

而这篇文章,将会提到以上文章都没有涵盖的两个点:

  1. 对 Roam Research 数据结构的详细讨论,包括非常基础和复杂的介绍
  2. 一套基于 #42SmartBlocks 可以在 Roam 中执行高阶查询。如果你对基础部分不感兴趣,想要直接看 SmartBlock 部分的话,点击跳转

让我们开始吧!期望你像我一样享受这次旅程!

基本概念

Roam 基于 Datomic 数据库构建。简而言之,一个 Datom 是一个独立的 fact,它是一个带值的属性,包括四个元素:

  • Entity ID 实体 ID
  • Attribute 属性
  • Value 值
  • Transaction ID 交易 ID

你可以把 Roam 想象成一组扁平化的 Datoms 集合,看起来就像这样:

[<e-id>	<attribute>	<value>			        <tx-id>  ]
...
[4 	:block/children	5 			            536870917]
[4 	:block/children	9 			            536870939]
[4 	:block/uid 	    "01-19-2021" 	        536870916]
[4 	:node/title 	"January 19th, 2021" 	536870916]
[5 	:block/order 	0 			            536870917]
[5 	:block/page 	4 			            536870918]
[5 	:block/parents 	4 			            536870918]
[5 	:block/refs 	6 			            536870920]
[5 	:block/string 	"check Projects"    	536870919]
[5 	:block/uid 	    "r61dfi2ZH" 	    	536870917]

共享相同事务 id 的 Datoms 就是在同一个事务中添加的。其中,这种基于事务的方法使 Roam 能够将内容同步到不同的设备,并管理非常复杂的撤销操作。

具有相同 entity-id 的 Datoms 就是同一个 Block 的 facts。

如果你想基于块引用来查询一个 Block 的 entity-id,你就可以写:

[:find ?e-id
 :where
 [?e-id :block/uid "r61dfi2ZH"]]

从上面的数据可以看出,这个查询将返回值 5。

Attributes 属性

Roam 使用 :block/ 属性来存储关于段落(paragraphs)页面(pages)的 facts。页面段落之间有一些细微的差别,我在一分钟内就会解释。但是,你必须理解的基本概念是,页面只是一种特殊类型的块(block)。大多数情况下,Roam 将页面(page)段落(paragraph)一视同仁。两者都是 Blocks

区块 Block 的两个 ID

  • Hidden ID 隐藏 ID:

这个 entity-id 才是真正的 block-id,即使它在 Roam 用户界面是看不到的。这是用于将数据库中的信息绑定在一起的 ID。Entity ID 标识了有关 Block 的 facts,描述了父子层级关系和对 Block 的引用。

  • Public ID 公共 ID:

公共 ID 是段落(paragraph)的块引用,例如 GGv3cyL6Y,或者是页面(pages) 的 Page Title(页面标题)。请注意,页面(pages)还有一个 UID,长度也为九个字符串 —— 非常类似于块引用。例如,你可以使用它们来构造指向 Graph 中特定页面的 URLs。

(译者注:比如现在这篇文章在 Roam Research URL 中的 /page/mdz6JIWDD https://roamresearch.com/#/app/Note-Tasking/page/mdz6JIWDD

所有区块的公共属性

每个块都有以下属性:

  • :block/uid 公共 ID,即 9 个字符长的块引用
  • :create/email 创建块的作者 Email 地址
  • :create/time 以毫秒为单位的时间,纪元计时(1970 年 1 月 1 日 UTC/GMT 午夜)
  • :edit/email 编辑该块的作者 Email 地址
  • :edit/time 最新一次块的编辑时间
[10 :block/uid		"p6qzzKa-u"     536870940]
[10 :create/email	"foo@gmail.com" 536870940]
[10 :create/time	1611058803997   536870940]
[10 :edit/email		"foo@gmail.com" 536870940]
[10 :edit/time		1611058996600   536870949]

森林中的树木(Trees in the forest)

Roam 数据库就像一片森林。每一页都是一棵树。树的根是页面(page),树的枝干是更高层次的段落(paragraphs);树的叶子(block)就是嵌套在页面(page)最深层次的段落(paragraphs)

Page
* Branch
  * Branch
    * Leaf
    * Leaf
  * Leaf
  * Branch
    * Branch
      * Leaf
* Branch
  * Leaf
...

对于每个段落(paragraph),Roam 总是创建两个指针。 子级 Block 使用:block/parents 引用其父级的 entity-id,父级则使用: :block/children 引用其子级的 entity-id

[4	:block/children	5	536870917]
[5	:block/parents	4	536870918]

父级会在 :block/children 属性中保留其子级的列表。这个列表只会包含其直系后代的 entity-id,而不包括隔代的孙辈。一个 Page 只会将 Page 顶层的段落(paragraphs)作为子段落列出来,而不会列出嵌套的段落(paragraphs)。类似地,段落将只列出嵌套在它下面的块(block),而不是嵌套在嵌套块下面的块。嵌套中最低层级的 Block 块(叶子)则没有 :block/children 属性。

子级同样会在 :block/parents 属性中保留其父级的列表。与 :block/children 相反的是,父级列表包括所有祖先的 entity-id,即祖父母、曾祖父母等。嵌套的段落(paragraphs)将包含对父段落(paragraphs)页面(page)的引用。页面的顶层段落(paragraphs):block/parents 属性中具有页面(page)entity-id,而嵌套在另一段落下的段落(paragraphs)将具有更高层级段落的 entity-id 和当前页面(page)entity-id

页面 Page 独有属性

所有的页面都有标题属性,而没有任何段落会有标题。

如果要查找数据库中的所有页面,则需要查询 :node/title,因为此属性只包含页面的值。通过执行以下查询,你将得到一个包含两列的表格:?p 参数下每个页面的 entity-id?title 参数下每个页面的标题。

[:find ?p ?title
 :where [?p :node/title ?title]]

如果你还希望查到每个页面的九个字符的 UID,例如,要构造指向该页面的链接,则需要通过 :block/uid 属性来查找 ?p entity-id。下面是 query 查询语句的样子。注意 ?p 是如何出现在 where 子句的两种模式中的。这告诉查询引擎查找同一实体的 titleuid

[:find ?p ?title ?uid
 :where [?p :node/title ?title]
        [?p :block/uid ?uid]]

段落 Paragraph 的独有属性

每个段落都有以下属性:

  • :block/page 页面上的每个段落,不管它们的嵌套级别如何,都会引用他们的页面entity-id
  • :block/order 这是页面中块的顺序,或者是段落下嵌套的级别。你需要对这个值进行排序,以便按照适当的顺序检索出现在文档中的段落
  • :block/string 块的内容
  • :block/parents 段落的祖先们。对于顶层段落,它就是当前的页面。对于嵌套的段落,该属性会列出通向(包括)页面的所有祖先。

其他可选属性

Roam 只会在你改变特定块的默认值时才会设置这些属性(只存在于数据库中的段落),例如,你将块的文本对齐方式从左对齐改为居中。

  • :children/view-type 指定如何显示块的子元素。可识别的值是“列表”模式、“文档”模式、“编号”模式
  • :block/heading 你可以将块的标题级别设置为 H1、 H2 或 H3。允许的值是 1,2,3
  • :block/props 这是 Roam 存储图像或 iframe 的大小、slider(滑块)的位置、 Pomodoro 番茄计时器设置等信息的地方
  • :block/text-align 段落对齐的方式。值为“左”、“中间”、“右”、“对齐”

Roam 数据结构

如果你想知道如何查找数据库中存在哪些属性,我有一个好消息!使用一个简单的查询,你就可以列出数据库中的所有属性:

[:find ?Namespace ?Attribute
 :where [_ ?Attribute]
[(namespace ?Attribute) ?Namespace]]

以下就是所有属性的列表。说实话,上面的查询不会对值进行排序,也不会创建最后一列。我在可下载的 roam.json 文件中包含了稍微高级一点的查询版本,它将可用于排序。我在 clojure.core 文档中找到了namespace 函数。

Namespace Attribute :Namespace/Attribute
attrs lookup :attrs/lookup
block children :block/children
block heading :block/heading
block open :block/open
block order :block/order
block page :block/page
block parents :block/parents
block props :block/props
block refs :block/refs
block string :block/string
block text-align :block/text-align
block uid :block/uid
children view-type :children/view-type
create email :create/email
create time :create/time
edit email :edit/email
edit seen-by :edit/seen-by
edit time :edit/time
entity attrs :entity/attrs
log id :log/id
node title :node/title
page sidebar :page/sidebar
user color :user/color
user display-name :user/display-name
user email :user/email
user photo-url :user/photo-url
user settings :user/settings
user uid :user/uid
vc blocks :vc/blocks
version id :version/id
version nonce :version/nonce
version upgraded-nonce :version/upgraded-nonce
window filters :window/filters
window id :window/id

Queries 查询

如果你对如何编写 Roam 查询语句感兴趣,那么你应该仔细阅读 Learn Datalog Today 的九个章节。它的内容非常有趣,且包含对应的练习。

接下来,我将几乎逐字逐句地引用教程中的几段话,当然会改变例子以适用于 Roam。其余的内容,请访问上面的教程。

我还推荐以下 Stuart Halloway 的 YouTube 视频,它在 11 分钟内总结了 Datomic Datalog 查询语言的关键特性。

核心概念

查询是一个以 :find 关键字开头的矢量,后面跟着一个或多个模式变量(以 ? 符号开头,e.g. ?title)。find 子句之后是 :where 子句,它将查询限制在与给定的数据模式(data patterns)相匹配的 datoms 上。而使用 _ 符号作为通配符,则表示你希望忽略的数据模式部分。

例如,如果你想根据一个段落的块引用来查找文本,你需要这样写:

[:find ?string
 :where [?b :block/uid "r61dfi2ZH"]
        [?b :block/string ?string]]

根据本文章开头表格里面的例子,这个查询将返回 “Check Projects”

这里需要注意的是,模式变量?b在两个数据模式中都会使用。当一个模式变量在多个地方使用时,查询引擎要求它在每个地方都绑定为相同的值。因此,这个查询只会找到具有 uid r61dfi2ZH的块的字符串。

一个实体的 datoms 可能出现在不同命名空间的属性中。例如,如果我想找到包含r61dfi2ZH段落的页面的标题,我会编写以下查询。请注意,我首先读取页面的 entity-id?block/page 属性,并将其存储在 ?p 当中。 然后,我用它来定位页面的 ?note/title?block/uid

[:find ?title ?uid
 :where [?b :block/uid "r61dfi2ZH"]
        [?b :block/page ?p]
        [?p :node/title ?title]
        [?p :block/uid  ?uid]]

考虑到上面的例子,这将返回 “January 19th, 2021”“01-19-2021”

:in 子句为查询提供了输入参数,这与编程语言中的函数或方法参数的作用非常相似。以下是上一个查询的样子,注意其中有一个用于 block_reference 的输入参数。

[:find ?title ?uid
 :in $ ?block_ref
 :where [?b :block/uid ?block_ref]
        [?b :block/page ?p]
        [?p :node/title ?title]
        [?p :block/uid  ?uid]]

这个查询需要两个参数。$就是当前数据库本身(隐含值,如果没有指定:in子句),block_ref则可能是段落的块引用。

你可以使用 window.roamAlphaAPI.q(query,block_ref); 执行上述操作。如果没有为 $ 提供值,则查询引擎将隐式假定的是默认数据库。因为你将只查询你自己的 Roam 数据库,所以没有必要声明数据库。也许一旦 Roam 提供了跨数据库的链接,这将会变得非常有趣!

现在我将跳过本教程,以涵盖在 Roam 中稍有不同的几个主题。如果你对你错过了什么感兴趣,请阅读我跳过的详细教程。有一个关于元组、集合和关系(Tuples, Collections, and Relations)非常有用的讨论,它们提供了执行逻辑 OR 和 AND 操作的方法。

Predicates 断言

断言子句可以过滤结果集,只包括断言返回 true 的结果。在 Datalog 中,你可以使用任何 Clojure 函数或 Java 方法作为谓词函数。根据我的经验,在 Roam JavaScript 的实现中,Java 函数是不可用的,只有少数 Clojure 函数可以使用。

除了clojure.core命名空间之外,Clojure 函数必须是完全命名空间限定的。遗憾的是,在核心命名空间之外,我只找到了几个在 Roam 中能用的函数。这些函数包括clojure.string/includes?clojure.string/starts-with?clojure.string/ends-with?。另外一些来自核心命名空间的有用函数包括,返回属性命名空间的 namespace 和返回字符串长度的 count。一些无处不在的断言,也可以在没有命名空间限定的情况下使用,比如<, >, <=, >=, =, not=, !=等等。

这里有两个使用断言的例子。第一个函数指的是根据 block_reference 计算段落中的字符数。

[:find ?string ?size
 :in $ ?block_ref
 :where [?b :block/uid ?block_ref]
        [?b :block/string ?string]
        [(count ?string) ?size]]

第二个列出了在给定日期之后修改的所有 Blocks。

[:find ?block_ref ?string
 :in $ ?start_of_day
 :where [?b :edit/time ?time]
        [(> ?time ?start_of_day)]
        [?b :block/uid ?block_ref]
        [?b :block/string ?string]]

Transformation 转换函数

遗憾的是,我无法让转换功能在 JavaScript 中工作。只有当您在桌面上安装了 Datalog 数据库,并加载 Roam.EDN 进行进一步的操作时,这些功能才有可能工作。

唯一可用的变通方法是在查询后对结果进行后处理。下面的例子将过滤页面标题,以大小写不敏感的方式查找文本片段 (“temp”),然后按字母顺序对结果进行排序。此查询将返回包括 “Template”、”template”、”Temporary”、”attempt “等词的页面。

let query = `[:find ?title ?uid
              :where [?page :node/title ?title]
        	     [?page :block/uid ?uid]]`;

let results = window.roamAlphaAPI.q(query)
                     .filter((item,index) => item[0].toLowerCase().indexOf('temp') > 0)
                     .sorta,b) => a[0].localeCompare(b[0];;

Aggregates 聚合

Aggregates,则可以像预期的那样工作。有许多可用的 Aggregates,包括sum、max、min、avg、count。你可以在这里阅读更多关于 Aggregates 的信息。

例如,如果你不知道某个属性的用途,或者不知道允许使用哪些值,只需查询数据库就可以找到现有的值。下一个例子列出了:children/view-type的值。需要注意的是,如果你只在 Graph 中使用 bullet 列表模式,查询将只返回一个值:”bullet”。我使用了独特的 Aggregates 函数,如果没有这个函数,我将得到一个可能有数千个值的列表,每个指定了视图类型的块都有一行。

[:find (distinct ?type)
 :where
 [_ :children/view-type ?type]]

Rules 规则

你可以将查询的可重用部分抽象为规则,给它们起有意义的名称,然后忘记其实现细节,就像你可以使用自己喜欢的编程语言编写函数一样。

Roam 中一个典型的规则例子是祖先规则。这些规则利用:block/children来遍历嵌套块的树。一个简单的祖先规则是这样的。这条规则基于 ?parent entity-id 来寻找 ?child

[[(ancestor ?child ?parent)
 [?parent :block/children ?child]]]

第一个矢量称为规则的 head,其中第一个符号就是规则的名称。规则的其余部分称为 body。

你可以用(...)[...]将其括起来,但常规的做法是用(...)来帮助你的眼睛区分 head 和 body 的规则,也可以区分规则调用(rule invocations)和正常的数据模式(data patterns),我们将在下面看到示例。

你可以将规则看作一种函数,但请记住,这是逻辑编程,因此我们可以使用相同的规则,根据子 entity-id 找到父实体,根据父 entity-id 找到子实体。

换句话说,你可以在 (ancestor ?child ?parent) 中使用?parent?child作为输入和输出。如果你既不提供值,你将得到数据库中所有可能的组合。如果你为其中一个或两个都提供值,它将如你所期望的那样限制查询返回的结果。

[:find ?uid ?string
 :in $ ?parent
 :where [?parent :block/children ?c]
        [?c :block/uid ?uid]
        [?c :block/string ?string]]

现在就变成了:

[:find ?uid ?string
 :in $ ?parent %
 :where (ancestor ?c ?parent)
        [?c :block/uid ?uid]
        [?c :block/string ?string]]

:in子句中的%符号代表规则。

乍一看,这似乎并不是一个巨大的成就。但是,规则是可以嵌套的。通过扩展上面的规则,你可以使它不仅返回子树,而且返回?parent下的整个子树。规则可以包含其他规则,也可以自己递归调用。

[[(ancestor ?child ?parent)
 [?parent :block/children ?child]]
 [(ancestor ?child ?grand_parent)
 [?parent :block/children ?child]
 (ancestor ?parent ?grand_parent)]]]

例如,我们现在可以使用这条规则来计算一个给定块的所有子孙数量。

window.roamAlphaAPI.q(`
     [:find ?ancestor (count ?block)
      :in $ ?ancestor_uid %
      :where  [?ancestor :block/uid ?ancestor_uid]
              [?ancestor :block/string]
              [?block :block/string]
    	      (ancestor ?block ?ancestor)]`
      ,"hAfIHN6Gi",rule);

当然,在这个例子中,我们最好使用:block/parent属性,这样可以使查询更加简单。

[:find ?ancestor (count ?block)
 :where  [?ancestor :block/uid "hAfIHN6Gi"]
         [?ancestor :block/string]
         [?block :block/parents ?ancestor]]

Pull 拉

这篇文章已经太长,而且技术性太强。出于这个原因,我完全省略了关于(pull ) requests 的讨论 —— 尽管在 roam.json 中的例子中,我将会提到一部分。(pull ?e [*])是一种强大的从数据库中获取数据的方法。如果你想了解更多,这里有两个值得阅读的参考文献。

Datomic Pull in the Datomic On-Prem Documentation

Introduction to the Roam Alpha API on Put Your Left Foot.

Roam 查询 SmartBlock

我们可以在 SmartBlocks 内和浏览器中的开发者工具控制台中运行查询。然而,结果很难查看,因为它们是以嵌套的 JSONs 等晦涩的数据结构返回的。

2021 年 1 月 28 日更新:

同时我了解到,你也可以在 Roam 中使用块中的 :q 命令原生运行简单的查询。试试下面的命令:

:q [:find(count ?t):where[_ :node/title ?t]]

它不会像我的 SmartBlock 一样显示拉动或有页面链接,但仍然非常酷……

2021 年 2 月 22 日进一步更新

我使用 :q 创建了一个长长的统计查询样本清单。你可以在这里找到它们。


我想让查询体验更加方便,并将其集成到 Roam 中。因此,我创建了一组 SmartBlocks,它们可以帮助将查询嵌入到你的 Roam 页面中,就像你在文档中包含的任何其他组件一样。

这里是可以导入到 Roam Graph 中的 DatomicQuery.JSON 文件链接。包括两个页面,SmartBlocks 和大量查询示例。继续阅读,可以了解如何使用它们。

你可以选择简单查询和高级查询。简单查询不接受输入参数,也不能包含规则。当然,你可以直接在查询中包含输入参数,你可以在下面的例子中看到。而高级查询则可以给你更充分的灵活性。

页面链接与日期链接

我做的 SmartBlock 可以把 query 查询结果格式化变成表格。它使用::hiccup在单个 Block 中返回结果,这样就可以避免在 Graph 中创建不必要的 Block。还有个额外的好处是,我加上了一些简单的显示逻辑,将页面标题(page titles)转换为可点击的页面链接(URL),可以将时间转成相对应的 Daily Notes 页面的链接。

要使用页面链接功能,你需要以一种特殊的方式生成查询:

  • 通过在字段名后面添加:name来指定标题字段,例如:?title:name
  • 将 uid 放在紧跟?title:name字段的后面,并在字段名的末尾加上:uid,指定相应的 uid。例如:?title:uid
  • 在字段末尾添加:date,指定一个你想转换为 Daily Notes 页面链接的字段,例如:?time:date
[:find ?title:name ?title:uid ?time:date
 :where [?page :node/title ?title:name]
        [?page :block/uid ?title:uid]
        [?page :edit/time ?time:date]
        [(clojure.string/starts-with? ?title:name "roam/")]]
Query example

Pull 表达式

SmartBlock 还会将嵌套的结果显示为一个表格,在表格里显示得更整齐。当你执行包含(pull )语句的查询时,它的结果其实是一棵树,而不是一张表。所以我按照下面的逻辑来呈现查询结果。

  • 我会把结果集的顶层显示为表格的行,值为列。
  • 结果集中的嵌套层会交替以列或行的方式呈现。
  • 为了避免结果集过大,MAXROWS 默认设置为 40。在高级查询中,你可以更改这个数字。
  • 在嵌套层,我使用 MAXROWS/4 来限制显示的行数。即使这样设置,生成的表格也可以达到数百行。(40x10x10x…)

这是一个 (pull ) 结果所显示的表格。只拉取 1 个层级的深度:

Pull example - 1 level deep

拉取 2 个层级的深度:

Pull 2 levels deep

Query 查询模板

要为你的查询生成模板,请运行相应的 Roam42 SmartBlock

  • Datomic simple-template 简单模板
  • Datomic advanced-template 高级模板

一旦准备好你的查询,只需按下嵌套在查询下的按钮即可执行。

结束语

经过一周的时间,我还没有成为这方面的专家。如果我写的东西很傻,比如我的查询或 SmartBlock 有错误的话,请告诉我。你可以在下面的评论中联系我,或者在 Twitter 上@zsviczian

另外,我很想了解你是如何使用从这篇文章中学到的知识,以及如何使用 SmartBlock 的。请分享你的想法和成果。谢谢你!

✇吕立青的博客

超越效率:10x 提升阅读体验后,我有哪些反思?

这篇文章同步发表于少数派年度征文,活动评奖依赖用户反馈数据的奖金结算机制,充电、收藏和阅读量都将不同程度地影响文章的最终排名与稿酬倍率。

✇吕立青的博客

如何克服精神内耗与对抗分心?

如何克服精神内耗与对抗分心

  • 没有更多文章
❌