我个人一直是无纸化笔记的拥趸,一方面是因为手写笔记的字写得确实不好看,另一方面电子笔记的「功能性」始终优于纸质笔记。从高中买了自己的 iPad 偷偷带到学校做笔记开始,我就开始了对电子笔记的探索。前前后后,从 Apple Pencil 手写,到 word 和 PPT 做笔记,再到 OneNote,以及最近一两年的用 markdown 做笔记,也算是踩过不少坑,也有不少收获了。
线性笔记存在的问题
传统上来说,我一直习惯采用树状结构对笔记进行分类,即采用文件夹套文件夹的方式直至将 markdown 笔记分配到一个足够小的文件颗粒度。这种方法在绝大部分情况下可行性较高,但是随着笔记系统的不断发展,一些问题也开始浮现出来。
1. 归类困难
树状结构本身就像是一棵决策树,笔记的作者需要根据自己内心的一定的评价标准对所有笔记进行多层次的划分直至某一个节点(文件夹)内的笔记具有足够多的「共性」。在笔记较少的时候这种方法是很好用的,然而随着笔记数量逐渐增加,划分的标准也就成了一个大问题。
比如对于以下几个学科的笔记分类
- 随机过程
- 数字电路
- 数据结构
- 通信电子线路
- 微波技术基础
- 通信原理
- 电磁场与电磁波
- 数理方程
这些都是电子信息工程的学生的必修课,当学科只有八门时,可以很容易地将其划分在同一个文件夹下。但是注意到大学四年学下来的课程可能多达几十门,同一个文件夹下有几十个子文件夹时,这种划分方式就显得有些臃肿而难以管理,而且缺乏了学科间的内在联系。
一种解决方法是牺牲层级来换取直观,例如根据自己的先验知识对学科进行简单归类,例如
- 数学
- 随机过程
- 数理方程
- 软件
- 数据结构
- 硬件
- 数字电路
- 通信电子线路
- 物理
- 电磁场与电磁波
- 微波技术基础
- 通信理论
- 通信原理
这种分类方法稍微增加了直观性,但是带来了增加了一级层级,并不是非常优雅。如果课程数量进一步扩大,这样的分类方式并不能根本解决问题。
另一方面,一些学科的划分往往没有那么明晰。例如《电路理论》这门课应该被划分到「硬件」还是「物理」?此时的划分标准一定程度上取决于笔记的作者,由此不可避免地引入了主观判断。这是我们在构建笔记系统时应该避免的。
2. 知识关联
此外,这样的划分方式忽略了某些知识的内在关联。例如《通信电子线路》和《通信原理》的关系其实相当密切。《通信原理》是《通信电子线路》的理论基础,而《通信电子线路》是《通信原理》的物理实现。两门课程存在一定的知识重叠,例如「角度调制」的知识在两门课中同时有涉及,对于传统的树状结构,就不得不为每门课都在对应的文件夹下创建对应的章节知识,哪怕这些章节几乎完全一致。这引入了一定的不必要冗余。
可见,传统树状笔记在这两个问题上没有一个很好的解决方案。
图——非线性笔记的启发
我在北邮的 GAMMALAB 以科研实习生的身份参与过一段时间知识图谱的学习和开发,期间对「图」这种数据结构的认知得到了很大的提升。这不禁让我想,如果笔记能以图,而非树的方式组织,灵活性会不会大大提升呢?
于是我了解到了「非线性笔记」这一概念。笔记与笔记之间不应该被树的「父子」和「同级」关系束缚,而是应该有更自由的形式。「图」这种数据结构就允许我们以一种非线性的模式组织笔记。每篇笔记都是一个节点,而节点与节点之间以边相连。
不难发现,笔记之间的逻辑关联就可以用边来实现。这其实也与我们大脑的发散性思维是相吻合的。还是拿《通信电子线路》为例。假设《通信电子线路》是一篇单独的笔记,则我们可以将其与《电路理论》《模拟电路》节点相连,因为《通信电子线路》是基于《电路理论》《模拟电路》的理论发展而来的;另一方面我们也可以与《通信原理》连接起来,因为两者互为理论和实践。
这种笔记方式不再要求对每个笔记或更大的单位做主观的分类,而是遵从知识本身的内在逻辑。我认为这是实现个人笔记体系的一种很好的思路。
非线性笔记的实现
对于非线性笔记,从软件上来说需要着重实现的无非就是两个点,节点和边。其中节点是容易实现的,一个文本文档或一个文件夹就是一个节点,但是边的实现往往就需要依赖一定的软件支持来实现。
经过尝试,我个人比较喜欢的软件有两款,一款是 Obsidian,另一款是 mediawiki
1. Obsidian
这款软件主打的卖点是支持双链的 markdown 笔记系统。我之前管理 markdown 笔记使用的是 VSCode,因此从 VSCode 迁移到 Obsidian 几乎不需要任何时间成本,直接导入即可。也就是说,我可以直接在原始树状的线性笔记的基础上,通过添加双链的方式实现线性到非线性的过渡转换。
此外,Obsidian 的 UI 相对比较现代优雅,作为笔记软件应有的功能也一应俱全。为数不多的问题在于这是一个闭源商业化软件,虽然说正常使用不需要收费,只有官方提供的同步服务收费,但是这种命脉掌握在闭源商业公司的软件手里的感觉并不美妙。考虑到市面上并没有足够优秀的开源软件能够替代 Obsidian 的地位,因此短期内 Obsidian 将持续作为我的主力笔记软件。
至于收费同步的问题,可以通过第三方插件连接到自己的 Webdav 网盘来解决,由此实现了各个设备的互通。
2. mediawiki
Wiki 是一种相当经典的基于网络的信息共享平台,可以说是非线性数据存储结构的一种非常成功的应用。如果说 Wiki 是一个面向对象里的「类」的话,mediawiki 就是一个最经典的「实例」。知名的 Wikipedia 就是基于 mediawiki 实现的。
mediawiki 几乎可以满足我对非线性笔记的一切要求——它的功能真的非常强大。但是比起 Obsidian 这类本地软件,Wiki 站点的部署的技术门槛就高了不少。首先需要一个能被公网访问的服务器,然后需要搭建一个数据库服务,此过程需要有大量对应的后端和服务器运维和调试知识,才能勉强将此网站搭建起来。
截止至目前,我还是没能解决在 mediawiki 上正常渲染数学公式的问题。因为 mediawiki 需要调用 mediawiki 或维基百科提供的 API,而由于众所周知的原因,此时调用 API 就必须挂个全局代理。因为我服务器在老家,所以我不太敢远程贸然修改网络挂代理,怕全局代理出点什么问题就无法从学校访问服务器了,所以应该等到暑假回家了再尝试。
另一种解决方案是在本地直接部署所需的 API,但是技术难度较大,参考了几篇博文都没能配置成功,遂放弃。
此外,mediawiki 的格式与 markdown 略有区别。对于有数学公式存在的格式转换,我认为 pandoc 并不能完全满足我的需求,因此我开发了一段脚本来为我实现此转换。
Wiki 之于游戏策划
Wiki,或者广泛来说所有可以在线合作编辑的允许内链的文本集合,对于游戏策划来说也是一种很酷的工具。
从文案策划的角度来说,相比孤立文本的一篇篇单独的策划案,Wiki 可以以大量的外延连接,从任务、历史、角色、物品、环境等各个方面创建词条,从而迅速构成一个世界网,为文案策划设计开放世界带来了方便。对于合作者也可以通过查询 Wiki 更好地理顺各个游戏概念之间的关系,并且一起进行修改和完善。
对于关卡策划来说,一个关卡,甚至一个房间本身甚至可以做成词条,并且在词条中可以包括房间的环境设计,敌人,几何设计,然后用链接的方式连到游戏中实际相连的房间。从而将具象的关卡抽象为图,更能发现出现的「树」,「环」等结构,在设计路线时也会有更加清晰的认知。
这里的所谓 Wiki 并不局限于真正意义上的 Wiki,任何在线合作编辑的允许内链的文本集合都可以作为辅助策划工具,比如常见的各种云文档和工作空间也是一种合作的方式。
图结构作为笔记的不足
凡事都有好有坏,我在尝试从线性笔记过渡到非线性笔记的过程中也遇到了一些不太满意的问题
1. 缺少主干
我认为对我来说最大的问题就是缺乏一个所谓的「主干」。比如第二天要考《通信电子线路》,我该如何对这门学科的所有知识有一个总体的把握?比如树状结构的笔记就有很清晰的分界点和结构,我只需要按照「第一章-第二章-…-最后一章」的顺序,把《通信电子线路》下所有知识点过一遍即可。
但是对于非线性笔记来说,没有这样一个明确的父子和顺序结构,因此此时就会遇到复习笔记时缺乏一个主干脉络的问题,一切都需要靠着自己对知识本身的理解来走。
如果将自己的非线性笔记分享给他人,在对方没有足够的前置知识的情况下,往往会在复杂的网络中「迷路」。相比于「树」这种数据结构的遍历算法,「图」结构的遍历算法对于人类来说是相对不友好的,似乎有种缺乏秩序的感觉。
此外,非线性笔记在连接所有知识的同时,也模糊了学科之间的边界。对于刚刚说的只需要复习一门考试的情况下,在以发散的方式遍历笔记图的时候会不会不小心「越过边界」到了其他学科?
此问题的解决方法,一是为每篇笔记贴好标签,方便确认学科归属,另一个方面是设立一些具有父性质的笔记,能够充当主干作用引导思路。但是也需要注意设置的粒度,防止把图退化成了树。
2. 同义词问题
大部分非线性笔记系统在表征一个节点的时候,采用标题作为表示这个节点的唯一特征。但这也就意味着,在不同语境下的同一个单词,表达的是不同的含义,但是最终它们指向了同一个页面,我称这种问题为「同义词问题」。
比如我在一篇关于生物的笔记中指向了「苹果」这个笔记,指的是水果的苹果;但在另一个关于科技的笔记中也指向了「苹果」,但此时我想表达的是 Apple 公司。这就会一定程度上造成混淆。
针对这种问题 Obsidian 使用 alias 功能来解决。每个节点除了自身独一无二的标题外,Obsidian 还允许为节点设置多个别名,在其他文章中尝试引用连接时就可以通过「标题+别名」的方式实现引用。
例如 “[[苹果公司|苹果]]'' 指向的就是苹果公司,但苹果是苹果公司的一个别名,这条链接在渲染后呈现的结果只有苹果二字。而
“[[苹果]]” 就将指向标题名为苹果的节点
3. 打印
还是之前说的,非线性笔记的灵魂在于「链接」,而一旦这种链接形式被破坏,整个笔记系统就从一个高度关联的知识网络变成了一座座孤岛,此时笔记瞬间失去了生命。
比如笔记需要分享的时候,为了保证笔记系统的完整性,必须递归地将页面上的所有链接笔记分享出去。对于一个充分的笔记系统,这其实就无异于将所有笔记节点全部分享出去了。如果希望以打印的形式分享,这一过程绝对是一场噩梦。
类似于「缺少主干问题」提到的,如果希望选择性地分享笔记,恐怕最好的方法还是打好标签,并且将所有带某个需要的标签的笔记全部打印并分享。
这个问题似乎没有一个优雅的解决方案,因此我认为可能 mediawiki 这类在线服务器呈现的 Wiki 网站会是一个相对可行的方案。
这三个问题都有相应的解决方案,尽管有些并不是很优雅,但是通过这些 trick,可以构建出一种非常复杂的知识图谱,因此我认为非线性笔记仍然值得一试。
笔记分类哲学
由于非线性笔记的两个核心元素——节点和链接的设置都具有一定主观性,因此形成一套自己的划分标准是非常重要的。
连接的设置
对于「一个节点与另一个节点」是否相连这件事情其实是比较主观的,链接过少会导致知识图谱缺乏内在关联,链接过多会导致图非常混乱,我认为节点之间的连接应当基于逻辑和知识上的关系:
- 因果关系:如事件 A 导致事件 B。
- 层级关系:大主题下有细分的小主题。
- 相似性关系:处理相似问题或概念的不同方法或理论。
- 引用关系:一个概念引用另一个概念作为例证或者补充说明。
另一方面,每个节点的知识粒度划分也是个重要的主观判断标准。粒度太粗或太细都不利于构建有用的知识图。可以采用以下标准来判断:
- 独立性:每个节点所代表的知识点应该是相对独立的,能够单独作为一个话题进行讨论。
- 完整性:每个节点应详尽覆盖一个概念,不遗漏关键信息。
- 连贯性:在节点内的信息应该是连贯的,不应跨越太多分类层次。
- 功能性:节点的设立是为了便于复习与扩展,其粒度应适中,既不应过于宽泛,也不应包含太多细枝末节。
力导布局图与聚类
在《机器学习》和《数据挖掘》中有一个重要的概念——聚类。从定义上来说,聚类是按照某个特定标准把一个数据集分割成不同的类,使得类内相似性尽可能地大,同时类间的区别性也尽可能地大。有意思的是,如果将整个非线性笔记用“图”的数据结构表示,并且可视化出来,将有边相连的节点之间施加一定的力,就得到了所谓的「力导向图」。
力导布局图是一种用来呈现复杂关系网络的图表。在力导布局图中,系统中的每个节点都可以看成是一个放电粒子,粒子间存在某种斥力。同时,这些粒子间被它们之间的“边”所牵连,从而产生引力。系统中的粒子在斥力和引力的作用下,从随机无序的初态不断发生位移,逐渐趋于平衡有序的终态。这就是对力导布局图的直白解释。
以这种方式展示出来的图,就可以表现出了节点之间的内在链接。换而言之,力引导图可以完成很好的聚类,方便用户看出点之间的亲疏关系。通过力导向图表示的图就可以很直观地感知到各个节点关系。比如《概率论与数理统计》和《随机过程》在图上距离相近,而与《操作系统》的距离就较远。
最后,笔记只是手段不是目的。研究更好的笔记形态只是为了更好地自我提升。共勉。
发表回复