为什么要构建知识体系?要构建怎样的知识体系?

众所周知,计算机领域的知识体系有这样的特点:

  • 领域众多,如计算机科学、计算机系统、软件开发、人工智能等等,继续细分又有无穷无尽的子领域;
  • 每个领域的知识量庞大而又碎片化,不同学说(开发者、研究者)都能够从基础理论构建各自的成果,诸如编程语言有千万种,不同语言之间各有异同;
  • 各种知识点之间的关联交错互通,远近不一,并且更新迭代迅速,旧的理论和技术很容易被淘汰……

事实上,只要你从本科阶段开始学习,就会意识到人力之有穷而知识之无涯,这对于计算机及之外的所有学科来说也是至理。因此,如何构建自己的计算机知识体系至关重要,而保障自己的知识体系的稳定、能够不断重用更新的关键手段就是做笔记

很显然,手写笔记已经远远不能满足我们的需要,因为:

  • 记录效率极低、
  • 不能插入图片等媒体资源、
  • 不能高效地重用和更新(指一处笔记不能被其它笔记引用,或者需要专门留白来处理未来的更新,这对笔记的排版要求很高)、
  • 不能方便地与他人分享和随时(多端)查看、
  • 不能方便地进行统计、整理脑图、分析与其它知识点的关联、
  • …… 唯一值得称道的是还算快速的随机查找(自己写的笔记就能够大概知道相关内容在笔记本的哪个部分),但这既不精确可靠,也非独占优势。

我如今正在探索使用双链电子笔记的方式来构建个人的知识库,这一整个工作流几乎能够弥补所有手写笔记的不足之处,并且又有自身的独特优势。在这个工作流中,我用到了这些软件(插件):

  1. 提高笔记记录效率:浏览器插件 SimpRead ;码字显然比手写更快,并且之后可以学习双拼打字法进一步提升码字效率
  2. 插入多媒体资源:markdown 格式的笔记天然能够完成这个任务
  3. 对笔记进行高效地重用、更新、统计、脑图提炼:Obsidian 及其插件
  4. 向他人导出、分享、发布:Obsidian+Quartz 博客框架+Github Pages 静态网页部署服务器
  5. 多端同步:Git 或 Syncthing 进行文件级同步

如何高效地将网页、电子书中的知识提取到自己的知识库中?

开始之前,我们先要明白从哪里去收集知识和信息。这里引用 CSDIY@HardwayLinka 对信息收集的来源和处理思路1

一开始我学习新知识时会参考中文博客,但在代码实践时往往会发现漏洞和 bug。我逐渐意识到我参考的信息可能是错误的,毕竟发博客的门槛低,文章可信度不高,于是我开始查阅一些相关的中文书籍。

中文书籍的确是比较全面且系统地讲解了知识点,但众所周知,计算机技术更迭迅速,又因为老美在 CS 方面一直都是灯塔,所以一般中文书籍里的内容会滞后于当前最新的知识,导致我跟着中文书籍实践会出现软件版本差异的问题。这时我开始意识到一手信息的重要性,有些中文书籍是翻译英文书籍的,一般翻译一本书也要一两年,这会导致信息传递的延迟,还有就是翻译的过程中信息会有损失。如果一本中文书籍不是翻译的呢,那么它大概率也参考了其他书籍,参考的过程会带有对英文原著中语义理解的偏差。

于是我就顺其自然地开始翻阅英文书籍。不得不说,英文书籍内容的质量整体是比中文书籍高的。后来随着学习的层层深入,以知识的时效性和完整性出发,我得出了一张 信息损失图 虽然一手信息很重要,但后面的 N 手信息并非一无是处,因为这 N 手资料里包含了作者对源知识的转化——例如基于某种逻辑的梳理(流程图、思维导图等)或是一些自己的理解(对源知识的抽象、类比、延伸到其他知识点),这些转化可以帮助我们更快地掌握和巩固知识的核心内容,就如同初高中学习时使用的辅导书。 此外,学习的过程中和别人的交流十分重要,这些 N 手信息同时起了和其他作者交流的作用,让我们能采百家之长。所以这提示我们学习一个知识点时先尽量选择质量更高的,信息损失较少的信息源,同时不妨参考多个信息源,让自己的理解更加全面准确。

现实工作生活中的学习很难像学校里一样围绕某个单一知识点由浅入深,经常会在学习过程中涉及到其他知识点,比如一些新的专有名词,一篇没有读过的经典论文,一段未曾接触过的代码等等。这就要求我们勤于思考,刨根究底地“递归”学习,给多个知识点之间建立联系。

提取网页中的内容,一般而言就是复制粘贴,除此之外笔者在 Google 插件商店中发现了 SimpRead 插件,可以对网页进行重排版,并方便地以不同笔记的格式导出,并且针对不同网页进行了独特的优化。SimpRead 能够提供丰富的功能,下如展示了其面板中提供的一键导入笔记、分享等功能:

关于电子书,Obsidian 插件仓库中有一个名为 epub-importer 的插件,可以将 Epub 格式的电子书一键导入到 Obsidian 库中,并且编纂好索引,这非常方便。另外 Epub 格式的电子书可以在 Zlibrary 等网站收集。

关于 PDF 格式的电子书,正如我在 11912 的备考经验贴 中所述,我个人在用并且推荐的阅读方法是——同时打开中英文两份文档,自己看一遍英文,如果理解没问题就直接做笔记;如果有些不明就里,就去看看中文文档是怎么翻译的。这样的方式能够在细细品读原作逻辑的过程中,非常深刻地理解知识点之间的关联

为什么要选择 Obsidian 作为笔记管理软件

工作流的骨架围绕 单个知识点多参考源,勤于提问给多个知识点之间建立联系 的底层核心逻辑建立。我们写论文其实就是遵循这个底层逻辑的。论文一般会有脚注去解释一些关键字,并且论文末尾会有多个参考的来源,但是我们平时写笔记会随意得多,因此需要更灵活的方式。

平时写代码习惯在 IDE 里一键跳转,把相关的函数和实现很好地联系在了一起。你也许会想,如果笔记也能像代码那样可以跳转就好了。现在市面上 双链笔记软件 就可以很好地解决这一痛点,例如 Roam Research、Logseq、Notion 和 Obsidian。

下面是一些关于 Obsidian 的个人使用技巧。

基本 Markdown 语法和 Obsidian Flavour 的介绍

Obsidian 一些提高笔记效率的插件推荐

如何将 Obsidian 笔记作为博客文章发布?——Quartz!

Quartz 是 Jacky Zhao 小哥开发的能够将 Obsidian Flavour 的 Markdown 笔记转换为 Web 博客内容的静态网页框架,其项目地址如下: GitHub - jackyzha0/quartz: 🌱 a fast, batteries-included static-site generator that transforms Markdown content into fully functional websites 。这个项目已经有 130 多位开发者共同参与讨论、开发、维护,不断扩充框架的解析能力,并且提供丰富的接口供用户自定义。在项目使用过程中,可以在 Discord 中相关板块与诸位开发者探讨: Discord

多端同步

这个我暂时没有使用需求,故还未涉及,读者可以参考这些方案:

  • 与多人同拼官方的同步方案
  • 使用 remotely save 等插件
  • 使用 syncthing 工具进行文件夹级同步

Footnotes

  1. 另外,CSDIY 中的这篇文章也非常好,我建议不妨一堵其思路。