写点什么

30 岁文转码:从哲学家变成知名软件项目核心开发

  • 2022-03-28
  • 本文字数:5411 字

    阅读完需:约 18 分钟

30岁文转码:从哲学家变成知名软件项目核心开发

“曾经的我对技术一窍不通,但现在我已经掌握编程能力、开始努力争取自己的计算自主权。虽然还有很长的路要走,但我至少已经迈开了步伐。”


近日,自由软件基金会(FSF)宣布了2021年自由软件奖得主。该系列奖项在 LibrePlanet 2022 会议上颁发,得奖者主要是为软件自由事业做出重大贡献的个人、团队以及社区。鼓舞人心的是,非技术出身的 Protesilaos Stavrou(简称“Prot”)今年获得了“杰出新自由软件贡献者”奖项(Award for Outstanding New Free Software Contributor),该奖颁发给对自由软件社区作出杰出贡献的社区新成员。


FSF 在给 Prot 的颁奖词中写道:自 2019 年以来,这位哲学家通过他的博客文章、会议演讲、直播视频和代码贡献成为 GNU Emacs 社区的中流砥柱。


是的你没看错,今天的主角 Prot 是热衷于研究哲学的文科生,出生于 1988 年,非技术背景,大学学的是人文学科,近几年才开始接触技术。因此,他对于自己获奖一事感到非常意外。


FSF 执行董事 Zoë Kooyman 表示:“Protesilaos 对于那些社区中刚起步的人来说是一个非常鼓舞人心的榜样。这表明,一个人不需要有几十年的经验也可以为自由软件做出贡献,甚至成为特定项目的核心。”


不少网友也表达了对 Prot 的祝贺和敬意:


Prot 是我遇到过的最能言善辩、谦逊、谨慎和健康的人之一。想到他在没有任何技术背景的情况下接触 Emacs 和 Lisp 并刚刚开始贡献,这简直是疯了。为你干杯,Prot!——gitrog


他在几乎没有背景的情况下拿起它(Emacs 和 Lisp)的速度是惊人的。2016 年学习 Linux/UNIX,2019 年才开始使用 Emacs。另一个有趣的事实:他做那些教程视频的主要目的是练习他的英语。——BeetleBGNU EMACS 是一个可扩展、可定制、免费、自由的文本编辑器。同时,它也是一个集成开发环境。根据 Prot 的自述,过去两年半里,他编写了几千行 Elisp 并为核心 Emacs 做出贡献,包括两个完整、辅助功能齐备的可定制主题——modus-themes。


“当我来到 Emacs 时,当我切换到 Emacs 时,当我两年半前加入这个环境时,我发现了我需要的一切。有高质量的文档,面向 GNU Emacs 的优秀程序,大量的博客和教程等等,当然还有与不同的人的互动,你总能从中学到新的东西。”Prot 在获奖感言中强调,“虽然这个奖项是授予个人的,但我认为这实际上是关于社区的——社区中所有的无名英雄,帮助着一个特定的人实现某些目标。”


“如果没有我们生活中的无名英雄,没有人会取得任何有意义的成就。”Prot 说。


以下内容节选自在 Prot 在 LibrePlanet 2022 会议上的演讲,他分享了自己为什么选择 Emacs 以及对于自由软件的体会和理解,希望能为读者带来启发。

成为 Emacs 的铁粉

这里我想聊聊自己为什么会成为 Emacs 的铁粉。种种高级功能和丰富的软件包当然很好,但这还不足以体现 Emacs 的精髓、特别是它真正的价值主张。毕竟目前大多数现代编辑器都具备插件系统,可以为用户提供几乎一切必要的临时功能,那 Emacs 的特别之处究竟在哪?


答案在于,Emacs 并不是真正的文本编辑器。它其实是一套可编程平台,文本编辑只是其中的主要交互点之一。


Emacs 是由 Lisp 的一种方言编写而成,名为“Emacs Lisp”、也叫“Elisp”。因此,它的绝大多数代码库以及用户配置也是用 Elisp 写成。这意味着对最终用户来说,Emacs 只涉及一种语言、只包含一种范式。于是乎,内置代码和用户开发的插件代码间没有任何区别,真正实现了语言风格上的大一统。


Emacs 的核心就是读取和运行 Elisp 的能力,这被称为评估「evaluation」。在评估 Elisp 时,Emacs 环境可以轻松使用与之对应的返回值。无需重新启动程序,这些扩展就能实时生效,帮助用户以交互方式即刻观察效果。


从这个角度来看,Emacs 相当于是 Lisp 机,可以用来执行任何类型的程序。这里的“程序”可以指代一切,包括 Org 或者 Magit 这样的大功能、也包括精简文本编辑和操作等小应用。


此外,Emacs 还是自文档化的,意味着它能理解变量的值何时发生变化、并在对应的帮助缓冲区中通知用户。同理,Emacs 也能反映出各类函数的新值与当前状况的关联。


最后,Emacs 是纯免费软件,直接提供内置工具及所有已安装包的完整源代码。如此一来,文档中的显示内容就和实际程序的执行内容融合了起来,毫无隔阂滞碍。

我把 Emacs 当成集成计算环境

我是 2019 年夏天起开始用 Emacs 的,之前对 Lisp 没有任何了解,编程水平也不高。我上大学时学的是人文学科,所有硬核技术都是最近几年才逐渐掌握的。


Emacs 之所以吸引我,是因为 Lisp 机表现出了巨大的潜力。我想要的是一种不同于以往日常计算工具的集成开发层,我希望拥有统一的主题、精确的排版、相通的操作/交互模式。另外,我还希望能在不同上下文或界面之间建立联系:我的邮件客户端应该能跟任务调度器和文件管理器直接对话,我在编写文本时使用的配置也需要直接适用于编程界面等等。


Emacs 通过自身及第三方包/自定义代码全面满足了我的一切需求。如果大家愿意稍微学学 Elisp,那 Emacs 可以说是蕴藏着无穷无尽的可能。下面,咱们就一起来看几个无需多高技术水平就能实现的常见工作流程:


  • 使用补全框架对文件内容进行异步搜索,将结果放在专用缓冲区内并就地编辑。最后,把变更传播至所有相关文件。

  • 捕捉当前电子邮件内容并据此生成待办事项。任务还可包含一条返回原始消息的链接,并能够在议程当中显示相应的预定日期与截止日期。

  • 在 Dired 中标记某些文件,再将它们添加到正在撰写的电子邮件当中。Dired 可以逐个标记条目,也可以使用正则表达式和其他高级命令。

  • 记录一组以 Dired 为起点的操作(「键盘宏」),跳转至特定文件,执行某些变更、返回文件管理器,再在下一个文件中重复这个过程。在以上各种用例中,用户完全不需要学习任何新知识。例如,键盘宏等各类功能在哪里都能直接用。更重要的是,这些功能既能单独起效、也可以协同工作。


因此,Emacs 得以将各种界面连通起来,而且完全不会因为上下文切换而引起任何冲突。


Emacs 的最后一项优势,就是易用性和规模化使用时的便捷性。例如,我想用自定义代码制作本次演讲中的演示内容。因为画面只占据文档的一小部分,所以很多朋友会以为这是一张预先构建的 PPT。并不是,我可以直接编辑里面的普通文本。所以我用的其实是 Emacs 当中的极简化“专注模式”,这种模式在演示、阅读、写作和编程等场景中都有很好的表现。


而且我在 Emacs 中的所有操作都只需要实现一次。我不需要在电子邮件客户端里设置一个定制专注模式、再为文本编辑器/处理器或者议程规划器设置更多其他专注模式。完全不需要,使用同一个模式即可。另外,我也不需要单独的工具进行文本编写和呈现,所有功能都是统一且互通的,又好又简单!


除此之外,底层配置也全部在 Elisp 中完成,这又进一步简化了整体效果。在使用 Emacs 之前,我往往得为每个应用程序使用不同的范式和/或语言。例如,Thurderbird 和 Libreoffice 各自的设置菜单就不同,而且彼此间无法互通。Mutt 有自己的配置方式、Vim 和 Tmux 也是,终端模拟器还是,逼着人反反复复做无用功。


我并不是说应用程序就不该有自己的配置方式。我只是建议它们应该组合使用,而目前毫无关联、彼此割裂的状态肯定不够好。用户只能竭尽全力用一个个功能孤岛拼凑出整体系统。而且即使付出巨大的努力,其中仍可能存在不足之处甚至安全缺陷,毕竟这些程序并非来自同一平台、使用的也不是同一种语言。


而在 Emacs 当中,每个新的功能包都会自动获取其他包内的已有内容,例如相同的字体配置和主题、通用的操作和交互模式等等。以此为基础,我们就能极大加快工作流的推进速度。Emacs 内部发生的一切都存在于同一环境当中,所有上下文均可相互关联,用户也能够随意建立这种关联。这种高度集成化和独特的统一性体验,也构成了 Emacs 价值主张的核心。

一致性与自主性

就使用许可而言,Emacs 属于自由软件。但它为最终用户带来的自由绝不限于法律或者道德层面,更体现在实用层面——也就是前文提到的集成计算环境。


Emacs 的可扩展性,使得用户能够利用自己的计算设备真正执行极为广泛的处理任务。与此同时,Elisp 的统一特性降低了准入门槛,彻底消除了以往全方位知识库需要在缺少共通基础的前提下拼凑应用程序的困境。


日常生活中的自由极可宝贵,而 Emacs 这款工具正是自由向往的代表,也帮助我们尽可能拉近了开发目标与计算机呈现结果之间的距离。


软件的自由,体现在计算手段的所有权当中。基于灵活的所有权,我们才能在计算空间中自主发展。这种自主性让我们能够随意为既定目标选择工具,摆脱由硬编码、甚至是固定实体服务带来的种种束缚。


在我看来,日常使用的各种应用程序间的集成性缺失绝对是个值得关注的大问题。我觉得自己在其中得不到应有的权利,也无法让工具充分按自己的意愿行事。于是最大的矛盾出现了:自由软件反而限制了我的自主性、让我变得不自由。这就造成了 1+1<2 的窘境。不同程序间的不一致性、或者叫异质性,已经损害了用户的权益。虽然我们在纸面上获得了自由,但实际结果只是算是部分自主,距离真正的自由和自主还远着呢。


换句话说,这些工具在“教我们做事”,而作为用户的我们完全影响不到这些“教条”的制定。


但在 Emacs 的帮助下,我终于在自己的日常计算中消除了这些异构性与异质性元素。现在,我的几乎一切创作都在 Emacs 上进行:读写、文件管理、任务规划组织、电子邮件往来、音乐收藏与播放、互联网浏览等等。唯一的例外,就是我确实还离不开图形网络浏览器。


再聊点抽象的。自由这个概念包含两个层面:名义自由与实质自由。前者体现在代码库遵循的许可上,后者则体现在代码库自身的内容——即整个使用感受,以及代码库如何与特定环境中的其他程序或工作流程相匹配。


我觉得软件自由这个议题特别有意思,值得深入发掘。正确性、可组合性和可扩展性都是软件代码的基本属性,只有把这些属性有机结合起来、才能让程序在实践当中充分发挥能力。所以我们需要的是实质自由,而不只是许可条款层面的名义自由。


假定有这么一款程序,它既没有任何说明文档、代码的编写方式也极难理解。虽然它遵循自由许可,但种种现实却在提醒我们,它在用户体验层面跟自由自主没有任何关系。用户很难理解这款程序的内部运作逻辑、自然看不懂它为什么会给出最终结果。结合个人经验,我觉得这就是典型的名义自由——只存在于许可条款当中、在实际体验中完全不见踪影的“自由”,绝对不是真正的自由。


使用 Emacs 的经历还让我意识到,作为软件技术社区,我们的关注点必须始终投射在最终用户身上,我们就不该发布那些用户无权操作的代码。相反,我们应该放开手脚,允许用户自主管理计算方式。自由软件不只是要替代专有代码,它更重要的象征意义在于激励人们改变对于自主思想的态度。社区和用户间的关系不仅仅是予取予求,还应该引导用户习惯于争取自由、承担责任。


而这样做的终极目的,就是让人们从曾经长期束缚我们的版权制度中解放出来,将权利交换给用户。是的,代码本身并不是终极目标,所以开源社区一定得勇于从公式化的版权文件中走出来。“要么接受、要么放弃”的一刀切方法既不能赋予用户权利,也无法培养他们的自主性。一个优秀的项目,不仅应该易访问、可配置、配备完善的说明文档,同时也应该为自由事业的发展做出贡献。


而推进这项事业的第一步,就是打通软件壁垒、让一切程序都能协同工作。最终,用户将学会如何掌管自己的整台计算机,这样每个人才能真正成为自由软件新时代的一分子。

Emacs 社区和我的社区贡献历程

说了这么半天 Emacs,其实我们也有自己的社区。Emacs 社区欢迎新人的加入,希望借此传播知识、分享观点。Emacs 社区对开发质量一直有着极高要求,并把这当成关乎用户自由与否的大事。目前,正规 Emacs 软件包均提供详尽文档,允许用户通过多种选项配置出自己想要的使用体验。


Emacs 社区很清楚,我们不能对最终用户的主动性施加控制。因此,所有相关代码都具备良好的可扩展性与定制空间。社区始终抱持这样的观点——自由是一种主体间的体验展开,因此单从法律层面放开约束还远远不够。于是,Emacs 提倡一种强大的文档文化,每份 Elisp 表单都必须用自然语言解释其作用,每个功能包都必须提供使用与配置说明。我们希望用这样的方式保障最低限度的计算自由。


这就是 Emacs 的行事风格,而且一路延伸至核心应用。作为 Lisp 机,Emacs 在设计之初就充分为最终用户赋权,重新审视一切既有规则。例如,我的 Elisp 学习之路就是从编写小型函数封装开始,用于调整某些默认操作的执行方式。我想补充“move down a line”(下移一行)命令的功能,让它能支持下移特定多行。Emacs 则可以实时评估代码,而且开放完整的源代码及相关说明文档。正是有了这样的开放性,我才能了解如何定义函数,再通过反复试验编写出人生中第一条自定义 Elisp。


之后,我又继续调整 Emacs,希望实现有益于自己日常工作的微小优化。在此期间,我逐渐掌握了 Elisp,并运用这些新知识得心应手地操作 Emacs。过去两年半里,我编写了几千行 Elisp 并为核心 Emacs 做出贡献,包括两个完整、辅助功能齐备的可定制主题,这就是 modus-themes。


换个角度来看,我在成为 Emacs 用户的头三个月里,学到的编程知识要比自己之前三年参与自由软件社区中还多。对我来说,这就是社区引导最终用户成长、满足最终用户需求的最佳案例。曾经的我对技术一窍不通,但现在我已经掌握编程能力、开始努力争取自己的计算自主权。虽然还有很长的路要走,但我至少已经迈开了步伐。


参考链接:


https://protesilaos.com/codelog/2022-03-22-libreplanet-emacs-living-freedom/


近日 InfoQ 将对 Prot 做一次采访,如果读者朋友有想要了解的内容或提问,不妨在评论区积极留言。

2022-03-28 14:332180
用户头像
罗燕珊 InfoQ中文站编辑

发布了 460 篇内容, 共 292.2 次阅读, 收获喜欢 784 次。

关注

评论

发布
暂无评论
发现更多内容

TCP 协议灵魂问题,巩固你的网路底层基础

前端学习总结,经验分享,项目经验分享过程

我是哪吒

学习 程序员 Vue 大前端 2月春节不断更

Kafka.01 - 简介

insight

kafka 2月春节不断更

如何读懂CNN、BBC、经济学人、卫报、纽约时报?看完这本经典即可事半功倍!

wbliu85

学习 英语

DPDK大页内存原理

赖猫

Linux DPDK

对DevOps的九大误解,是时候纠正了!

禅道项目管理

开源 DevOps 敏捷 自动化 持续交付

技术秘籍 | 如何简单优雅的适配textview行间距?

百度开发者中心

大前端 TextView

最新Hadoop的面试题总结

大数据老哥

15. Python 程序运行速度如何提高十倍?第一遍滚雪球学 Python 收工

梦想橡皮擦

Python 2月春节不断更

CoralCache:一个提高微服务可用性的中间件

华为云开发者联盟

数据库 微服务 中间件 内存 CoralCache

【LeetCode】最大连续1的个数三Java题解

Albert

算法 LeetCode 2月春节不断更

翻译:《实用的Python编程》01_06_Files

codists

人工智能 后端 python 爬虫 数据结构与算法 文件操作

linux内核协议栈 邻居协议之ARP协议处理初始化

赖猫

Linux 协议栈 Linux内核

架构师week12心得

Geek_xq

开源数据库管理系统现在比商业产品更受欢迎

PostgreSQLChina

数据库 postgresql 软件 开源社区

使用 Tye 辅助开发 k8s 应用竟如此简单(三)

newbe36524

Docker 微服务 k8s dotnet

地表建筑物识别Dayo1

IT蜗壳-Tango

七日更 2月春节不断更

日记 2021年2月19日(周五)

Changing Lin

2月春节不断更

【STM32】ST-LINK下载器下载后需复位,程序才运行的问题

AXYZdong

硬件 stm32 2月春节不断更

架构师week12作业

Geek_xq

如何提升网页核心指标

Vincent

Elasticsearch Search API 基础语法

escray

elastic 七日更 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

Hive HMS Canary 时间较长异常分析

kwang

大数据 hadoop hive

LeetCode题解:1143. 最长公共子序列,动态规划,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

竞猜商城系统软件制作

v16629866266

GitHub上爆火的Java性能优化100+小技巧!(干货建议收藏)

Java架构师迁哥

一、MongoDB简介

Kylin

数据库 mongodb 学习 七日更 二月春节不断更

数据中心决策如何快人一步?一块大屏轻松实现3D数据可视化

一只数据鲸鱼

物联网 数据中心 数据可视化 IDC 机房管理

万字长文:解读区块链7类共识算法

华为云开发者联盟

区块链 公有链 拜占庭容错 共识算法 公式算法

技术需求文档,应当这么写!

穿甲兵

需求 文档

让虞书欣、李诞拍到停不下来!AR+AI双引擎的互动小游戏,如何打开IP新玩法?

爱奇艺技术产品团队

30岁文转码:从哲学家变成知名软件项目核心开发_文化 & 方法_Protesilaos Stavrou_InfoQ精选文章