我在开发本地版「语雀」(上)
欧雷 发表于
元旦过后,我再次开启时隔差不多 9 个月的对 KnoSys 体系的建设——去年 Q1 做的是生成静态网站相关的,这次则是搞基于 Web 的 all-in-one 知识管理 GUI 应用。
在这不到一个月的时间里,我断断续续地抽空写代码,该应用目前虽未达到可用状态,但我已经迫不及待地想专门介绍下它!
问题与需求
做事的动机很重要,明确且清晰的动机会令人拥有强韧的意志力与将想法实施落地的执行力。
公有云不可信
我一直认为,如果有人乐观地前赴后继去使用各种云服务,是因为他们不把由自己产生的数据视为重要资产,或被平台方伤得还不够深。
作为拥有接近 20 年网龄的老网民,可以说我已经被那些提供云服务的平台给伤得够儿够儿的了——
云服务上线的初期,为迅速积累用户数,拿到用户信息及其产生的数据,平台方会在一段时间内完全免费提供服务,还可能有各种优惠活动。
当大多用户已经产生大量数据并对平台有所依赖时,就是平台方开始收割的好时机——对原本免费使用的功能收费,或限制/降低原本免费可使用的资源数量。
有些平台在对用户产生的数据进行封禁或删除处理之前不会通知,完全没有备份的时间;更有甚者,就连服务要下线了也不会提前通知用户,直接跑路!
云服务关停或其背后的公司倒闭是迟早的事,当有要深度使用某个云服务的倾向时,就存在被挟持的风险。
被割裂的「人」
当前的内容平台、社交媒体都有自己的账号体系,皆有打造成封闭的信息孤岛的倾向——既不与其他平台和服务进行打通,也不提供(相对)开放的数据获取 API。
它们的这种行径是只考虑自己的商业利益所驱使的,而无视用户的需求与体验,逼迫用户只能通过应用内的「关注」去获取感兴趣的人的信息更新
我就特别不喜欢只是因想看内容而去「关注」谁!
它们中也有做得稍微好点的,如 Twitter 的「列表」功能就解决了我不想「关注」某人但依然可以接收信息更新的需求。
不过,即便如此,依然是无法自己以「人」为维度进行跨应用跨平台订阅的。
蹩脚文件管理
博客、API 文档等的最终产物都是静态页面,它们的数据源就是符合一定标准、格式的本地文件——可将这些文件视为「常规数据」与「元数据」的混合体。
当文件多了、站点复杂了之后,单纯的本地文件形式存在几个重要痛点:
- 无法方便地知道自己有哪些文档;
- 查找与编辑不方便;
- 文档间的关系不明了也无法管理。
需要一种方式,能够像中后台业务系统一样管理本地文件,并能通过某种方式将本地文件的数据进行转换。
我的奇葩需求
我最大的癖好是「收集」并「整理」感兴趣的东西,这会使我有很强的充实感、掌控感和安全感。
从小到大,我收集了多个方面的很多实物,如磁带、光盘、漫画、游戏、邮票、货币等;除此之外,方便无限扩张的虚拟的数据、信息等的收集更是令我痴迷!
在我浅薄的认知中,自宇宙诞生以来,没什么东西是孤立存在的,事物间或多或少存在着关系——找到并加以利用是超有价值的事情!
对收集到的数据、信息等建模,相互之间进行有效关联并形成网络,从而做到:
- 将机械化的事务流程标准化并自动化;
- 根据需要快速找到现状与目标间的最优路径;
- 基于当前的生命、生活、工作等状态智能地给出适合且恰当的建议。
我的这些需求是在使用云服务或其他应用时很难达到的。
功能与特性
为方便理解,我把自己开发的这个 GUI 应用比作本地版的「语雀」,但不像语雀那样能与他人协作,仅支持个人本地操作。
下面简单介绍下核心的功能特性。
知识库
在 KnoSys 体系中,「知识库」这个词有广义与狭义之分——广义上,遵循 QiiDB 数据规范的都是;而狭义上,则与数据集基本等同,该 GUI 应用中的即是如此。
以用户设置的本地文件夹作为数据源,按 QiiDB 数据规范遍历子文件夹并读取文件内容,从而在界面中通过列表页的形式呈现。
列表中的每条记录都对应着像 YAML、Markdown、图片等的真实文件,也就是说,界面中的 CRUD 实际上就是在对文件进行读写操作。
除了上述对「常规数据」的操作外,还能够可视化地修改「元数据」:定义字段的名称、数据类型、校验规则等;配置列表页、表单页、详情页等界面相关展示形态。
多应用
本 GUI 应用中的「应用」类似于语雀的「空间」,是上文中提到的广义的「知识库」;理论上每个「应用」有相应的本地 Git 仓库,在一定程度上起到数据隔离的作用。
一个「应用」所对应的文件夹下可以是一个或多个数据集,也可以包含一些除数据集之外的不符合 QiiDB 数据规范的文件——这些文件会被忽略而不做任何处理。
界面中对数据的修改和删除等可变操作限制在某个「应用」内,不能对其他「应用」内的数据进行变更;但某个「应用」的数据可作为其他「应用」的外部数据源读取。
举个例子——
我有两个「应用」,一个是像豆瓣那样包含书影音基本信息的,另一个是我的创作和一些个人记录——就叫它「外脑」吧。
假如我正在看《绝命毒师》并想记录观看进度,那就得:
- 在「外脑」中添加书影音那个「应用」为外部数据源,并与「外脑」的某个/些「知识库」相关联;
- 在书影音那个「应用」中新增一条包含《绝命毒师》相关信息的数据;
- 到「外脑」中读取书影音数据,找到《绝命毒师》后将其标记为「在看」,会在关联的「知识库」中生成相应数据;
- 后续在关联的「知识库」中找到《绝命毒师》标记看到哪集。
可以说,「应用」就相当于数据库。
信息订阅
在语雀等平台中,关注了某个账号就会收到相应的信息推送,这是一种信息的订阅方式;该 GUI 应用中的信息订阅将打破「常规」,以「人」的维度接收信息。
这里的「人」是指在虚拟身份背后可被识别的具有同一性的存在——
我在语雀、知乎等的账号叫「欧雷」,而在掘金、微博等的账号叫「欧雷殿」,但它们都共同指向「欧雷」这个虚拟人格——「欧雷」和我本身都算是那个「人」。
「人」既可以是个人也可以是组织,在该 GUI 应用中的主要体现形式为聚合了多个平台账号或网站 feed 等的统一信息源。
也就是说,在该 GUI 应用中订阅了「欧雷」这个「人」的信息,就能收到「欧雷流」网站和在其他平台的内容更新推送。
扩展市场
衡量应用软件是否好用的一个方面就是其可扩展性,作为开源且免费的基于 Web 的 all-in-one 知识管理 GUI 应用,必须得具备(较为)强大的可扩展性!
该 GUI 应用的主要可定制点有:
- 囊括字体、颜色、间距、整体布局等的界面风格主题;
- 「知识库」的列表页、表单页、详情页等界面相关展示形态;
- 「知识库」数据的 CRUD 钩子与界面操作自定义;
- 在「首页」展示的「小部件」(参考 iOS、macOS 等操作系统)。
其中,「知识库」相关的扩展可打包成「模板」一同安装。
结语
每当我跟别人说自己在开发一个知识管理工具时,就会被问到:「不是已经有 Obsidian、思源笔记、吧啦吧啦吧啦了吗?你这个跟它们有啥区别?」
如此迫切地想写文章介绍,解答此类问题也是重要的原因。
本文就是挑重点说下我开发这个 GUI 应用的缘由,以及它的核心功能有哪些——有的已经实现了,有的在实现的路上或规划中。
下篇将进一步阐述背后的思想理念和更高远的遐想与意义。