为什么我选择自由软件:个人工作流的选择与介绍

其实我本来打算针对自己用的工具各写一篇“为什么我选择Krita”、“为什么我选择Lisp”之类的系列的,但是想了想全都分开写一篇单独的文章还是太麻烦。尤其是我这种平时很少写文章,但写一次就习惯写很久,填很多内容的类型。

写在前面

其实我本来打算针对自己用的工具各写一篇“为什么我选择Krita”、“为什么我选择Lisp”之类的系列的,但是想了想全都分开写一篇单独的文章还是太麻烦。尤其是我这种平时很少写文章,但写一次就习惯写很久,填很多内容的类型。

于是我决定,将目前我想介绍的一些个人工作流的选择,以及其中的一些心路流程,试着用一篇文章就讲清楚。

为什么我选择Linux

其实使用linux的习惯,从中学时期就开始培养了。

我记得那时候我还想着要支持国产Linux系统,为祖国开发自己的操作系统,所以用虚拟机尝试安装了一份当时在试用版的国产操作系统,COS系统,从这里开始,算是我最早的Linux启蒙了。

后来因为Windows系统流行勒索软件风波,当时圈子里有一个学技术的网友就用Linux系统比Windows更安全的理由哄我入坑了Linux。

不过由于当时我还是技术小白,而且本身电脑配置也不好,所以依次尝试了多个Linux发行版。

最开始我是先尝试的Ubuntu和Linux Mint,这两个算是当时最流行的桌面系统发行版了,但因为图形界面的包管理器总是出问题,加上我那时候还根本不会换源。

于是又转向了国产的比较图形友好的操作系统——深度Deepin,然而换成deepin后,我发现Deepin配置需求挺高的,而我当时电脑是低配电脑,支撑不起Deepin系统的高配置需求。

加上我那时就觉得换回Windows反而会吃掉更多的运存和磁盘空间,所以最终我挑选了一堆发行版后,看中了一个足够轻量且运存占用稍低的Linux发行版,Manjaro。

事实证明,我当时选的这个确实算是一个不错的选择,虽然大家都觉得Manjaro底层的Archlinux稳定性不行,而且我确实也重装过几次Manjaro,但我实际上上手尝试发现这个发行版是唯一我能不用太多折腾就可以直接上手用的,加上Manjaro的Archlinux Wiki非常全面,使得这个操作系统成了贯彻我整个中学生涯的操作系统。

在这段过程中我不断摸索折腾过渡,也逐步掌握了Linux终端的操作和使用,到最后后面我发现还是用终端安装软件包更方便。

当然,玩游戏的问题其实根本不是问题,多折腾下Wine和跑Steam确实也完全能满足那段时期的玩游戏需求。

那段时期换了操作系统后我也像是发现新天地一样,不断在manjaro商店摸索和尝试各种有趣的自由软件,感觉简直就像是一股清风一样。

因为我以前用Windows经常被各种流氓软件绑架,这些软件总是不断地给电脑弹广告,随便下东西,所以久而久之也就爱上了自由软件生态的透明性。

在Linux生态,几乎没有流氓软件这回事,安装软件就是安装软件,只需要自己主动安装就行,安装的软件也不会随便给你下多余的东西。当然近期我也意识到Linux也有软件仓库被投毒的风险。

之后高中块毕业的那段时期,因为Manjaro滚动更新出问题的缘故,而且我也有了想要从更底层彻底掌握系统的欲望。随着我对自己的电脑的占有欲、控制欲和个性化欲望更加强烈,所以我之后就换成了Archlinux系统,也是第一次尝到了从底层一步步装操作系统,自己搭操作系统的乐高积木的味道。

就在最近几年,我因为觉得Archlinux不够稳定,毕竟ArchLinux的滚动更新对我而言就像是黑盒一样,我追求更多的稳定性和透明性,于是将自己的操作系统逐步从Archlinu迁移到纯本地编译的Gentoo,最后再迁移到可完全复现性构建的Guix。

实际上这段经历可以看出,我使用Linux的理由,并不仅仅只是因为Linux本身是自由软件,更多的是因为Linux作为自由软件,有足够开放的生态,能给我这种Windows深度受害者带来更好的体验。

我小学到初中那段时间算是折腾Window系统最多的时间吧,所以我对Windows系统的各种毛病非常清楚:

  • 运存占用总是莫名其妙常驻2GB起步。

  • C盘不断塞入各种垃圾和无用数据,当然之后我用linux的时候发现,其实塞垃圾最多的软件还是QQ。

  • 操作系统管理权限松散,插入DVD/U盘时自动加载非常容易中毒。

  • 流氓软件,弹窗广告到处都是,当然现在是安卓系统有这种感觉了。

  • 注册表机制、服务管理机制不透明。你根本无法像在linux那样从底层开始优化,也很难得知这些服务是干嘛的。

  • 强制推送更新打断用户工作流,Linux系统根本不用担心强制更新推送的问题,都是用户主动更新的。

  • 操作系统底层机制是黑盒,这其实是很致命的问题,因为底层是黑盒必然会有后门风险,用户也无法自由定制操作系统。

接下来列举Linux的好处,也是我使用Linux的理由:

  • 底层开源,运行机制透明,不用担心后门。

  • 内核极简,可根据需求任意定制系统或选择发行版,能完全掌控操作系统。

  • 性能节省,占用率低,满足节能和环保需求。

  • 有完全透明且比Windows更方便的、更自由的一整套工作流软件,后面我会举例介绍几个。

  • 不用担心广告和流氓软件打扰,黑客入侵和电脑中毒的问题因为入侵Linux系统门槛较高也更难碰上。

  • Guix的函数式哈希校验可严格用对准构建结果,避免库被投毒。

  • Guix函数式和声明式构建可完全复现操作系统,换机和重装系统不需要繁琐的重复配置和手动安装大量应用。

虽然Linux也存在自己的问题,不过这些问题个人觉得很大一部分还是现有生态造成的生态问题,并不是无法解决的问题:

  • 纯Windows用户转移有门槛,需要学习终端操作。

  • Windows常用软件在Linux上不能工作,很多游戏缺Linux版,需要折腾Wine。

  • 桌面环境生态割裂,分Wayland和X两大流派。

  • 部分硬件支持不友好,能玩的游戏少。

上述这些问题其实说白了都只是生态造成的问题,如果不是硬件厂商封闭固件源代码和操作说明,那么Linux社区的用户做的硬件适配不比官方厂商做的适配差。如果不是游戏和软件开发商只考虑Windows生态,以及封闭软件源代码,那么这些软件也必然会有第三方社区做Linux版。至于生态割裂问题,更多的也只是临时的路线争议,目前最稳的话X还是照样能用到底,虽然我是用的Wayland。

为什么我选择Krita

虽然我确实画得不太好,但在这里,我还是想大胆地且自信地声明,我用的绘画软件是Krita

为什么这么说?其实只是因为之前Ivon发了个动态表示高调使用Krita的用户很少见,提醒了我该高调点,自信点说出自己是用Krita的。

我的画廊里面的全部画都是用Krita这款软件画出来的,而且我特别喜欢的一个画师GreateWolf的作品集,也是用Krita画的。

我想了想发现我确实没怎么发关于我在使用什么软件,以及探讨我使用的软件好处的文章,其实只是单纯懒得写文章,但在群聊里面我还是挺乐意聊为什么我用这些软件来开发的。

我最开始用Krita的理由,其实很简单,不是因为Krita有多好用,而是因为Krita是Linux生态里面兼容最好且唯一符合绘画常用需求的绘画软件替代品,刚开始上手日系插画就是用的Krita学的,虽然教程都是默认你用Photoshop/Sai之类的,但好在我看的教程没有限制你用什么软件。

虽然在换成Linux之前用过一段时间的SAI来画同人图,但我后面开始学习日系绘画的时候,一直陪伴我一步步进步的绘画软件就是Krita了。

我确实没用过别的软件,所以不好评价别的软件有什么好的,但我知道,画画最重要的其实不是软件的选择,而是专注练习基本功,Krita作为一款实用的自由软件,不需要花钱,格式开放,不需要受制于商业软件,而且画画需要和常用的功能都有,那么我也没有理由和动机去切换到那些封闭的商业软件了。

毕竟商业软件都有个通病就是,公司会倒闭,等公司倒闭后你的绘画软件最后也会跟着不能用,那么你保存的那一堆psd、sai格式的绘画最后都打不开了。

当然,就像这篇文章说的,或许也不用等公司倒闭,如果你不愿意给你的软件每个月续费缴月供,那么也会导致档案无法使用,当时Wiwi就吃过这个亏。

哼哼,其实我算是个技术保守派,在选择自由软件这一块倾向还是比较保守的。

为什么我用Emacs

其实最开始我的文档工作流是用的在线云文档的,毕竟这类文档软件确实方便。但当我把各种东西都放在云文档上的时候,我不知不觉地就对云文档的隐私问题和资讯安全问题产生了一定的顾虑。

特别是之前那段时间我将一切文档都搬到Notion上的时候,这种顾虑达到了一定的巅峰。

于是我尝试了下Obsidian,确实Obsdian用过一段时间后觉得很好用,但最后也觉得,这玩意确实不太适合管理项目,特别是需要多人维护的项目档案。

最终促成我换Emacs的契机是,之前换Gentoo的时候,无意中了解到了Wayland和键盘驱动桌面,当时感觉键盘驱动的操纵方式会很高效又很方便,于是我尝试着将桌面环境换成基于键盘驱动的Hyprland后,顺便尝试着将文档系统切换成了Emacs的Org Mode,当然后面熟练Emacs后将笔记功能迁移到了自己写的软件NNW上。

这一次尝试也顺便深入了Emacs的学习和使用,最终一发不可收拾,逐渐将大部分的文本工作流程都迁移到了Emacs上。

其中自然而然也包括文件管理器、写文档、代码、收发邮箱等各类文本工作流程。

可以说,自从用上Emacs之后,LibreOffice也都没怎么用了,不过说实话,LibreOffice确实目前是最好的WPS和Office套件替代品,之前装Linux的时候基本都是必备的,现在反而是因为用了Emacs之后,感觉不是必须还是不用比较好。

所以LibreOffice现在也就只是要看几个docx文档或者跑团填角色卡的时候偶尔会打开用下,装新系统都懒得预装了。

虽然说不定之后工作了,可能为了对接企业的办公软件流程也会考虑用吧,这个没办法。

继续说回来,为什么用Emacs,其实理由挺多的,不同人对这个软件也有各自不同的用法。

我个人而言,是把Emacs当作一个Linux的万能前端在用的,在Emacs可以通过键盘快捷键,借助肌肉记忆的方式进行各种方便地替代Linux终端操作的交互,以及方便管理自己的各种东西,对于熟练的使用情形下是相当方便的。

当然我也好像举例不出多少特别的理由……就是觉得这玩意用起来好用,方便,非常高效,可以根据自己的创作需求灵活定制工作流程,不需要在麻烦的UI迷宫中浪费宝贵的时间吧。

我的话就连文件管理器都懒得装了,直接用Emacs的Dirvish插件替代文件管理器,虽然相比正经的文件管理器,这玩意兼容性确实差了点,不过基本能用就行了。

为什么我用Lisp

最开始接触到Lisp的契机,实际上是接触了Emacs的配置方式,觉得类Emacs的这种配置方式虽然一开始学起来比较有认知门槛,甚至感觉有点反人类,但熟练后却感觉用起来非常方便。

后来在某个朋友的推荐下,我尝试了Guix,以Guix的配置语言Guile为契机,才正式踏入了Lisp系语言的这个大门。

之后以此为契机,我了解了一下Lisp系语言这个门类,然后我试着深度了解了下Lisp的分类,我发现Lisp目前有许多不同的类型的方言:

  • Common Lisp:工业级Lisp方言,有很强大的CLOS类型系统,

  • Clojure:可以编译成JVM的Lisp方言,能替代Java写可编译JVM的程序。

  • Fennel/Hy:这类是基于现有语言做的风格修饰语言,我习惯将它看作Lua和Python的Lisp风格脚本。Fennel可以和Lua互操作,Hy则可以和Python互操作。

  • Scheme/Racket:这类是基于Scheme规范发展的Lisp方言,有许多不同的实现,现在也是学术界研究PL常用的语言。

我用的Guile就是上面方言中的Scheme的一个实现,作为GNU通用的脚本语言。

现在我个人的偏好倾向于尽可能使用Lisp系,或者类Lisp的编程语言来开发自己的个人项目。

我喜欢Lisp的理由如下:

  • Lisp的核心特性是代码即数据,在运行时可以将任何代码片段当作数据编辑。

  • Lisp拥有优雅的的闭包和强大的函数处理功能,而这些特性现代编程语言后期才加入,其中许多特性至今也没编程语言能完全实现。

  • Lisp的宏特性仍然是独一无二的,大部分编程语言至今也没能完整实现类似Lisp宏的特性。

  • Lisp拥有很高的灵活性,可以任意定制自己的语法,实现很多实用的个性化功能。

  • Lisp系语言拥有许多别的语言望尘莫及的实用功能,宏定义、模式匹配、函数组合,这些功能用于个人创建复杂项目的情形非常方便,能节省大量维护成本。

  • Lisp的函数式特性,使得限制副作用和赋值,实现复杂的项目管理。

  • Lisp的S-exp天生是树状结构,非常适合定制复杂的行为树、游戏AI和条件匹配等情形。

  • Lisp系语言的核心非常简洁,核心的常用原语很少,没有主流语言那样特别多的语法概念和规则,只需要懂S-exp,任何语法一眼就能看出大概轮廓。

  • Lisp系作为一个理论上完备的语言,核心标准很少频繁改动,主要的标准争议只是围绕在核心库的范围界定,不会频繁改变或增删语法特性。

  • Scheme作为Lisp方言独有的特点是语义清晰优雅,命名规范使得许多函数功能用途分类明确。

  • 函数式编程语言风格鼓励你思考如何限制复制和副作用,天生鼓励你设计更优秀的程序架构,而且做到这点的成本更小。

  • Lisp,至少Guile语言本身的稳定性都很好,不用担心隔三差五推破坏性语法更新,生态往往注重向下兼容。

而且由于上述Lisp的这些特性,我能推导出Lisp最适合的用途,就是作为游戏开发的脚本语言和领域专用语言,因为Lisp强大的特性使得它在作为DSL的情形,用于游戏开发或其它领域专用语言的情形都有非常大的优势。

当然,对个人而言,Lisp也是最适合做个人项目的编程语言,而且我最终选择的是Scheme系来做个人项目,其实这么选择单纯是觉得CommonLisp用起来没有Scheme舒服,然后Fennel和Hy这类修饰语言用起来又太受限了,Clojure虽然能剽窃Java库,但JVM虚拟机的问题就是太臃肿了。

Scheme做个人项目最大的优势是,因为个人项目通常只需要靠自己来维护,那么Lisp系的许多方便的功能,都能极大地锻炼个人的创造性思维和降低维护项目的维护成本,尤其是Scheme系强大的模式匹配和函数组合特性我非常喜欢用。

最近一段时间我一直在摸索如何使用Lisp系语言来开发自己的游戏项目。

之前试过了基于Common Lisp的Trial引擎,个人体验是,虽然这个游戏引擎协议相当宽松,而且CommonLisp的混入类和钩子机制确实也相当实用和强大。

对于用CommonLisp做游戏开发有什么好处,我之前这篇文章有提到:Trial与CommonLisp

但由于这个引擎的代码风格太过Shinmera个人色彩,而且文档和一些高层功能实现完善并不全面,基本一直都处于只能依靠Shinmera一人维护的尴尬局面,未来也不太有希望建立起比较好的生态和社区。

而且CommonLisp的代码风格总体而言也有点太过老式,代码总体的语义也不够清晰,所以这也是我最终放弃用Trial开发自己游戏项目的理由。

之后我又试过了用Hy开发Evennia,但最终的结果是,我必须被迫接受并学习Evennia的那套啥都必须建个对象的思维,即便我用了Hy,但因为底层的数据还是Python风格,以至于我还是不得不顺着Python的感觉来思考代码,反而总是感觉处处受限制,没有像是用Scheme那样的畅快感。

因此最终我还是决定选择用Guile开发游戏,因为Guile生态中有一个Spritely的圈子,而这个圈子里面有Chickadee这个游戏引擎项目,虽然现在一样也很小众,但确实Lisp Gamejam上很多人都在用Chickadee配合Guile Hoot做游戏开发。

现在Guile有一个很通用的适用范围,就是Guix,毕竟Guile背后有GNU项目背书,生态肯定也不会太差的,而是长期保持一个小众但高质量的状态。

所以我个人直觉预感就是,未来Guile这门语言很可能会发展成一个不错的圈子。

我看过的Chickadee文档,它给人的感觉和其它GNU项目和Guile项目的文档一样,非常有学术范,而且也写得足够清晰和通俗易懂,因此我对Chickadee这个游戏引擎的未来还是很看好的。

所以对我而言,投注Guile生态毫无疑问是目前为止最值得的投资,因此我倾向于尽可能将个人项目都用Guile写,毕竟对个人而言用Guile写东西比用别的语言写东西都更舒服。

此外,Guile由于背靠GNU生态,自然也有很强的向下兼容能力和稳定性,我也不希望我的项目每次主流的语言版本更新就都不能用了。

这是也是我之前用Godot4.0的前车之鉴,Godot4.0因为不能向下兼容,大规模破坏性更新,加上Godot4.0本身发布的时候就不是什么很稳定的版本,导致我迁移花了很多功夫,而且还承担了每次更新版本都要改一次语法和修一堆新bug的代价。不用其它编程语言的理由又多了一个。

当然我承认,Lisp系和Emacs遇到的问题一样,都是上手的学习门槛陡峭。

但其实,想一想就知道,哪怕是让一个从没接触过计算机的成年人去上手计算机,学习门槛一样非常陡峭。

但计算机就像是Lisp系和Emacs一样,对于熟练的人来说都是非常好用的利器。

所以我一直觉得,Lisp系和Emacs之所以难入门,就像是五笔输入法那样,没有从小就开始学。五笔输入法从小就开始学的都觉得比拼音输入法更简单更实用,而对于从没学过的门槛自然很高。

汉字也是一样,曾经的知识分子都觉得汉字之所以无法普及是因为汉字难学,但现代进行教育体系改进后,中国的文盲率现在也很低了,这说明并非是汉字本身难学的问题,而是教育资源投入不足问题。

因为我们从小学习和练习的编程语言都不是Lisp系、不是终端机和Emacs这类工具,久而久之就无法滚起来这个生态的雪球,自然而然Lisp系、终端机、Linux、Emacs这类工具就沦为了一个小众的东西,和主流体系有一个相当大的认知壁垒。

为什么我用开放格式

理由很简单,开放格式不用受制于任何特定的专有软件。

对于那些受制于特定专有软件软件的格式,一旦企业停止提供对该软件的服务、维护和授权,一旦你再也找不到能打开这个格式的软件,那么你留存的这些格式的档案也必然都会在也无法使用。

所以,尽量用开放格式吧!

阅读