HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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:332252
用户头像
罗燕珊 InfoQ中文站编辑

发布了 477 篇内容, 共 314.4 次阅读, 收获喜欢 792 次。

关注

评论

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

lambda表达式(3)-shawn,挑战大厂重燃激情

android 程序员 移动开发

Meterial Design常见控件的使用(五),移动端h5开发框架

android 程序员 移动开发

Okio—— 更加高效易用的IO库,一线互联网架构师Android框架体系架构

android 程序员 移动开发

Kotlin(五)深入理解Kotlin类与接口,androidndk开发视频

android 程序员 移动开发

ObjectBox 集成指南,建议细读

android 程序员 移动开发

超牛无损图片放大神器PhotoZoom,你值得拥有!

淋雨

PhotoZoom

LeakCanary源码学习二:LeakCanary,sw实战营文件下载

android 程序员 移动开发

MaterialDesign系列文章(十一)Google2018年大会新出的控件汇总集合

android 程序员 移动开发

Native开发工具之交叉编译移植(五),android开发基础教程视频

android 程序员 移动开发

Linux编程之权限系统与工具使用(二),【大牛系列教学】

android 程序员 移动开发

Kotlin系列三:空指针检查,万字长文总结Android多进程

android 程序员 移动开发

LeakCanary源码分析以及ContentProvider的优化方案,android移动开发

android 程序员 移动开发

Meterial Design常见控件的使用(一),安卓面试题2018中高级

android 程序员 移动开发

MVPArms官方快速组件化方案开源,来自5K star的信赖,安卓性能优化和内存优化

android 程序员 移动开发

offer求比较+部分大厂Android面经+真题解析,给2021的Android一些建议

android 程序员 移动开发

OkHttp踩坑记:为何 response,androidui设计

android 程序员 移动开发

Kotlin学习手记——注解(1),2021年字节跳动74道高级程序员面试

android 程序员 移动开发

Go语言HTTPServer开发的六种实现

FunTester

HTTP Fasthttp Server Go 语言 FunTester

Meterial Design常见控件的使用(八),【面试总结】

android 程序员 移动开发

OOM问题原理解析(二),android开发教程pdf

android 程序员 移动开发

Kotlin协程它不香吗?,kotlin开发游戏

android 程序员 移动开发

offer求比较+部分大厂Android面经+真题解析(1),覆盖所有面试知识点

android 程序员 移动开发

Native开发工具之应用开发编辑器&打包发布(一),kotlin构造器

android 程序员 移动开发

万人逐鹿、十强争霸!华为云GaussDB数据库两大重量级赛事圆满落幕

华为云数据库小助手

GaussDB 大赛 华为云数据库

《个人信息保护法》正式实施,企业如何保证数据安全合规?

腾讯安全云鼎实验室

数据安全

OkHttp 的 IO 操作和进度监听,android应用开发实训总结

android 程序员 移动开发

livedatabus详解,阿里是如何用他来做淘宝架构的?,android开发视频百度云

android 程序员 移动开发

Kotlin学习手记——注解,flutter下拉加载

android 程序员 移动开发

Kotlin的自定义View,实现带弧形的进度条,androidjetpack详解

android 程序员 移动开发

MVVM系列之三:ViewModel,最新Android开发进阶

android 程序员 移动开发

Kotlin学习手记--泛型、泛型约束、泛型型变,天呐

android 程序员 移动开发

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