Fern发布了第三个版本v1.1.0。如标题所言,Fern是一个使用Go开发的桌面端写作软件,今天我们就来聊聊开发Fern背后的那些事。
关于Fern Note
Fern是我的个人项目,开始于2023年9月份,目标是成为一个跨平台的本地优先的写作软件。这也是我第一次尝试GUI的开发,期间遇到过不少棘手的问题,好在目前大部分都被解决了。下面是我整理的一些问题,以FAQ的形式逐一给出我的一些思考。
为什么要开发Fern?
长的回答: 文本编辑器或富文本编辑器领域有不少竞品,即是是缩小到笔记App这一领域,当下也有相当多的优秀产品,比如国外的Notion, Obsidian, Logseq, Zettlr, OneNote, Bear, Typora,更别说国内大家熟知的有道笔记,石墨文档,为知笔记,语雀、飞书文档, 腾讯文档等等。作为一个用户,我们的写作或者记录需求总能被这些产品中的一些所满足。但是当你考虑诸如数据所有权、数据安全、隐私、多设备同步、跨平台、迁移成本、使用成本等因素的时候,似乎没有一款产品能满足你。偶然间我看到了AnyType, 一家位于瑞士的公司正在开发的产品。AnyType的设计理念非常前卫,第一眼就吸引住了我:本地存储,用户对数据有自主权,使用p2p网络(实际上是独立于IPFS的网络)在设备间通信,无中央服务器的协作等等。这实际上是Martin Kleppmann等人提出的Local-first software概念的践行。AnyType是个野心勃勃的产品,产品功能设计上,它貌似是在复制Notion,从实际使用来看成熟度还不高,作为基础的协议部分还有缺失。基于的AnyType的兴趣,开发Fern的想法萌生了。
短的回答:实际的情况是,当时我准备找一点可以干的事情,基于前面的一些想法,再加上一些对于工程问题的大致调研,就开始干了。Fern从一开始就是我为自己写的一款软件,没有雄心勃勃的计划。如果刚好有其他人愿意使用,当然是更好的结局。
Fern使用什么技术栈?
Fern是一个使用Golang构建的软件, 目前包括了两部分,一个是包括Windows、MacOS、Linux的桌面端软件,一部分是云端的基础设施。桌面端和云端的都是Go编写的。技术背景的朋友可能会比较好奇,为什么使用Go来实现桌面端软件?在保证能够跨平台的前提下,Electron、Flutter等大框架应该是更有保障的选择,而使用Go(确切来说是一个Go实现的GUI图形库Gio UI)来构建GUI的貌似鲜有耳闻。Google尝试过Gomobile, shiny等项目,但是未见有后续,Go社区的GUI图形库也是良莠不齐,甚至可以说鲜有成熟的。
实际的情况是,这又是我的一次任性。Gio对系统层有很少的依赖,除了图形层和窗口管理,没有太多的其他依赖。另外Gio社区也很小,邮件列表只有零星的邮件来往, 更严重的是很多控件都是需要自己造轮子。与基于web技术的Electron等框架相比,UI层的开发难度大非常多,比如在编辑器实现的过程中,连字体排版的细节都需要处理。更高阶的富文本渲染也是其中一个不容易处理好的难题,因此目前还是通过内置的Server渲染出HTML后交给浏览器显示。
Fern存储层使用了两种类型的存储,一种是文档数据和元数据的存储,当前使用的是Boltdb, 而块数据则使用了自己实现的一个简单的blob store,来对数据进行索引。
为什么不做开源?
开源运动的初衷是促进软件开发的协作过程,但是当下有太多商业公司借此名义把开源变成了一种商业模式。如果以商业化为目的,不如让我们直接点吧。大量的开源软件库构成了现代软件供应链,每个复杂软件的背后都有开源软件的存在,与其纠结Fern是否是开源的,我认为不如在合适的时机向社区回馈有价值的代码或想法吧。当然支持开源的人的另一种想法是,不开源的软件,公众如何审查代码,如何确保Fern不做违背承诺的坏事。这个问题目前我没有答案, 就像我们看到的其他公司的行为,一纸承诺终究只是一纸承诺。
Fern的下一步计划
下一步主要是实现软件内的富文本渲染, 完善文档PDF、HTML等格式的导出。同时也会对CRDT/IPFS生态相关的技术进行持续研究,为实现多端同步、协同编辑做准备。
以上。感谢你的耐心阅读。如果对Fern感兴趣?不如去看看吧!fernnote.vip