xmotd: 编写自由软件

作者:Luis A. Fernandes

露西:“如果你练习钢琴 20 年,最终却没有变得富有和出名,会怎么样?”

施罗德:“乐趣在于演奏本身。”

—花生漫画

xmotd 是一个在 X Window 系统下运行的每日消息浏览器。它的编写是为了减轻本地系统管理员的负担,使其能够向多伦多瑞尔森理工大学电气与计算机工程系使用计算机网络的学生和教职员工发布日常通用信息公告。本文记录了我开发一个程序的经历,该程序最初只是一个简单的、单一用途的工具,后来发展成为一个拥有用户建议的众多功能的程序。

开发

那是在 1993 年 8 月下旬的一个下午,部门系统管理员 Nick Colonello 和我正在讨论过去的一学年,以及如果能够让登录系统的学生了解重要信息会是多么好。在离新学年不到一个月的时候,我吹嘘说我可以在大约 10 分钟内编写一个简单的消息浏览器,它可以由 xdm(X 显示管理器)在学生登录时自动运行。他同意这是一个好主意,我继续在不到 30 分钟的时间内完成了 0.1 版本;它被命名为 xbanner。(1) 从视觉上看,它由一个文本小部件(用于显示消息)和一个“关闭”按钮组成,该按钮位于窗口的左上角,用于关闭窗口。短暂的一瞬间,它看起来非常实用。但我并不满意——它看起来既实用又丑陋。(见图 1。)

图 1. xmotd 0.1 屏幕截图

在又过了半小时后,0.2 版本完成了,它进行了美学上的重新调整,包括一个显示标题的标签小部件、一个分隔符小部件(纯粹是装饰性的),用于将标题与文本分隔开,以及另一个标签小部件,用于显示位图(我们计算机网络的徽标)。这是第一个安装在我们系统上的版本。

几周后,计算机科学系的系统管理员 Luis Lopes 顺道来访,并表示有兴趣在他的系统上安装 xbanner。我感到非常荣幸,因为我认识的人竟然会觉得我写的东西有用。

在第二年的三月份,我在 comp.windows.x 中读到一篇帖子,询问如何在运行 X 和 xdm 时显示每日消息。我并没有意识到它会把我带向何方,只是天真地回复说,我已经拼凑出了这样一个程序,并且愿意分享它。几个小时内,我收到了两封电子邮件,第二天早上又收到一封,都要求提供 xbanner 的副本。现在我真的印象深刻了。

它的流行程度是始料未及的。就好像没有人想到世界需要这样一个程序。事实上,在开始开发 xbanner 之前,如果进行粗略的调查,就会发现存在一个类似的工具,只需进行少量修改,就可以轻松满足任何新的规格要求。然而,当时 Web 还处于起步阶段,而 archie事实上的、目光短浅的首选搜索工具。默默无闻和无知注定了有用的软件在世界各地的 ftp 站点上默默无闻。

重新发明轮子

我第一次了解到 xmessage 的存在是在 Vivek Khera 发给我一个 shell 脚本时,该脚本将 xmessage 与其他 Unix 程序结合使用,作为每日消息浏览器。xmessage 由 eX Consortium (2) 的 Stephen Glidea 编写,是一个通用工具,可用于浏览文本文件或显示消息。它由一个用于显示文本的小部件和一个位于窗口左下角的“确定”按钮组成。(见图 2。)

图 2. Xmessage 屏幕截图

实用软件的标准

请注意 xmotd 0.1 和 xmessage 之间显着的美学相似性。在拥有多个类似、功能丰富的工具的市场中,美学往往是用户做出决定的决定性因素。在最近的一次采访中,已故的西摩·克雷指出了美学的重要性:“我喜欢制造计算机的美学部分,因为你添加的任何额外的细微之处都清楚地是你个性的体现。”

除了美学之外,灵活性也在选择中起着重要作用。经验表明,用户更喜欢允许他们解决问题的应用软件,而不是通过解决程序员的问题来压制他们。通常,程序员编写程序是为了解决特定问题,然后将其免费发布,希望其他人能从中受益。典型的最终用户并没有发现这种软件有多大用处,因为它是由“程序员为程序员”编写的。它只执行一项工作——不多也不少。这种类型软件的常见缺点包括

  • 怪异的界面,设计时考虑不周(最小惊讶原则不适用)

  • 糟糕的选择默认配置,使软件外观丑陋

  • 缺乏自定义(这一方面进一步强调了怪异之处,因为用户无法用更合适的设置替换设置)

允许无限自定义 (3) 的软件深受那些致力于阅读文档的用户的喜爱,因为它赋予他们完全的权力——与开发人员设计软件时感受到的那种创造力相同。

例如,xmotd 的可自定义位图是一个相对较小的编码负担(额外 10 行代码来读取和验证位图文件),它为最终用户提供了一种个性化的触感,否则它将是非常平淡的软件。EE 部门的徽标最初被硬编码为 xmotd 内部版本(现在已适当地重命名)中的默认图像。当我将 xmotd 上传到 eX Consortium 的存档时,我硬编码了 X 徽标。我收到的最早请求之一是能够更改徽标。我实施的一个不太理想(因此是临时的)解决方案是在 README 中修改指令,以便可以编译不同的位图。但是,我发现人们非常不愿意修改代码;他们更喜欢更简单的东西。然后我想到使用 X 徽标作为默认图像,并添加一个 -bitmap 选项,允许用户用自己选择的徽标覆盖默认徽标。

演变

“MIT 开发的每个程序都会扩展到可以读取邮件。” --佚名

用户总是会提出增强功能的建议,因为开发人员无法预测软件的所有用途。一个好的经验法则是,每有一个人要求增强功能,就假设有十个人没有提出。我决定实施建议的增强功能是基于编码时间与我认为将从该功能中受益的用户数量之间的权衡。例如,我猜测 -usedomainnames (4) 选项很少被使用,除非在提出该建议的用户的站点上使用。我添加它只是因为开销是在生成时间戳的函数中额外添加一行代码。

另一个例子:-wakeup 选项最初使用整数参数指定一个小时的时间段。当有人要求更精细的粒度(15 分钟睡眠时间)时,参数被更改为浮点数,其中小数部分用于表示分钟。

更改很简单,并且没有破坏先前版本中 -wakeup 操作的向后兼容性。当后续版本引入与先前版本的不兼容性时,用户往往会感到沮丧(甚至不想升级)。

如果实现了某个特定功能,明智的做法是添加一个选项来禁用该功能,因为很可能其他人可能不喜欢它。我添加了 -timestamp 以允许在用户请求后覆盖默认时间戳名称 “.xmotd”。简而言之——提供大量选项。

反馈

编写软件有一定的个人满足感,但当人们真正使用该软件时,开发人员会更快乐。现在 xmotd 中包含的许多功能都是其他站点(系统管理员)的用户提出的。来自用户的非主动请求的电子邮件是受欢迎程度的良好指标,并且对开发人员来说非常鼓舞。如果您喜欢使用某些软件(无论是否免费)并且知道作者的地址,我建议您给他写一个简短的便条。阅读感谢信带来的欣快感是难以言表的。作为一个基准,我收到了 107 封关于 xmotd 的电子邮件,而关于 xabacusxsecure 的电子邮件加起来只有 10 封(这是一对我在 xmotd 之前编写的 X 应用程序)。

我收到的关于 xmotd 的电子邮件可以归类如下(从最不鼓励到最鼓励排序;来自列表开头的邮件过多可能会让您想放弃编写自由软件)

  1. 你的程序无法编译。你知道为什么吗?

  2. 我没有阅读 README 文件,我该如何安装你的软件?

  3. 我懒得阅读文档,我该如何使用这个功能?

  4. 使用此功能的文档不清楚。

  5. 你能添加这个功能吗?

  6. 你的程序无法工作。

  7. 感谢你编写了这个很酷的软件。

  8. 使用此功能的文档不清楚,这是修复程序。

  9. 你的酷软件中有一个错误,这是补丁。

  10. 这里有一些代码,实现了新功能,让你的软件更酷。

动机

在自由软件世界中,浪费性的重复是很常见的。鉴于 Unix 已经存在了四分之一多个世纪,很有可能已经开发出了解决问题的方案,你需要找到它。另一方面,商业软件拥有庞大的广告预算,因此平庸的软件通常也能保证商业上的成功。Web 的无处不在和全球性正在改变这种平衡。(当数字现金成为常见的交易媒介时,软件收费将变得容易。)

Web 允许软件拥有自己的主页,提供廉价的全球性广告,从而无需营销部门。(5) 新版本可以以不同程度的宣传声势发布。在某些情况下,像 GIMP 绘画程序或 Emacs 的 Gnus 新闻阅读器这样的重大项目,围绕一个由对讨论和实施增强功能感兴趣的忠实追随者订阅的邮件列表发展。自由软件目录对自由软件的开发者和用户都将大有裨益。[Sunsite 上的 Linux 软件地图很容易搜索,并且可以充当目录;但是,它并不总是最新的——编者注]

商业软件的奖励是金钱,通常还有名声。编写著名的自由软件的奖励是认可、声誉,充其量是狂热的崇拜。许多自由软件开发者都持有开篇题词中说明的观点。我们编写软件是因为它很有趣;当人们真正使用它时,它会更有趣。使其免费可用保证了最多的人会使用它。通常,对于那些以最少的资源管理庞大网络的管理员来说,免费工具是唯一的选择。

结论

“一件艺术品永远不会完成;艺术家只是放弃了它。” --佚名

三年(和 14 个版本)之后,我认为 xmotd 正在接近完成;也就是说,所有可能添加的选项都已经添加了。然而,自 1996 年 12 月以来,又提交了更多建议(这些建议将纳入 xmotd 1.15 版本),包括一个用于在 Intranet 中运行 HTML 版本并在单击 URL 时生成 Web 浏览器的建议。我应该注意到,当 xmotd 开始支持 HTML 时,它获得了普及。(见图 3。)

图 3. HTML 版本的 xmotd

我对渴望成为开发人员的建议是,首先,在开始编写软件之前,要确定是否存在类似的软件包(现在可以轻松搜索网络空间);如果存在,请考虑扩展它,而不是从头开始。其次,编写软件时要充分考虑纳入用户建议(不要忽视您的用户)和在第一个版本发布后修复错误(1.0 版本永远不是最后一个版本)。最后,编写与技术进步(例如 Java)保持同步的软件,否则将面临过时。只有当软件满足他们的需求时,人们才会开始使用它,并且只有当软件不断发展以适应他们不断变化的需求时,人们才会继续使用它。坚持不懈,直到有一天你编写的软件获得我们都梦想的世界范围的赞誉。

致谢

Per Abrahamsen、Derek Fedak 和 Lars Magne Ingebrigtsen 分享了见解,帮助塑造了本文的早期草稿。作者的照片由 Jason Naughton 提供,他的毅力使 Sun 摄像机正常工作。花生漫画 的引语来自查尔斯·舒尔茨,版权归 United Feature Syndicate 所有。

  1. 短编码时间的意义在于我使用了一个模板文件,其中包含一个 X 程序框架,包括必要的 include 语句、应用程序默认值、加速器和 X 资源结构、一个带有 XtAppInitialize() 调用的 main() 函数等等。

  2. eX 指的是已解散的 X 联盟(于 1996 年 12 月解散)。

  3. Emacs 编辑器完美地体现了这一原则:键盘上的每个字符都可以重新映射。

  4. -usedomainnames 可以在主目录在各个域之间共享(NFS 挂载)并且每日消息适用于整个网络的站点使用。

  5. 像 Emacs 编辑器、GNU/Linux、GNU C 编译器、Perl 和 X Window 系统这样非常流行的软件不需要主页——它的流行使其无处不在。它将被存档在任何主要的 ftp 站点上。

资源

xmotd: Writing Free Software
Luis Fernandes (elf@ee.ryerson.ca) 是一位黑客。在 Sun 的 Alpha Java 编程竞赛中获得荣誉奖是他一生中难以形容的时刻。他对乐趣的定义包括破解 X 和 Java;听音乐(特别是 1800 年之前创作并在那个时期的乐器上演奏的音乐);阅读异常优秀的书籍,以及通常做任何有创意的事情。
加载 Disqus 评论