Discourse

作者:Reuven Lerner

当我在 1988 年开始使用互联网时,有一个简单的方法可以获得技术问题的答案。您可以访问“Netnews”,也称为 Usenet,并在其中一个论坛发布您的问题。几乎每个可能的主题都有论坛或“新闻组”,从编程语言到宗教再到幽默。即使在当时,能够获得几乎所有问题的答案也令人惊叹。

但是,Web 被发明出来了,虽然花了一些时间,但 Usenet 变成了历史的遗迹。是的,我意识到 Usenet 在某种程度上仍然存在,但让我们面对现实,如果您正在寻找问题的答案或在线社区,Usenet 不太可能是您的首选。无论好坏,LinkedIn 和 Facebook 等公司已成为该领域的巨头,即使他们的群组和讨论软件仍有许多不足之处。

当然,还有其他类型的论坛软件。WordPress 已成为一个非常强大且灵活的 CMS 和平台,其核心是博客软件,这意味着它允许您发布到您的博客并接受评论。如果您想要比这更有趣的东西,Disqus 和 LifeFyre 等公司提供 SaaS 论坛,让您可以将任何页面变成(潜在的)社交社区。

然而,这些年来,我可能已经为各种客户实施了五到十次论坛软件,并且我也安装了大约相同次数的论坛软件。虽然论坛软件通常还算合理,但它并没有让我觉得“哇”。我为居住在我的城市莫迪因的人们运营一个电子邮件列表,它已经变得非常庞大,拥有 2,800 名订阅者,每天有 40-50 条消息;但是,我们都同意电子邮件远非完美的沟通方式。但是,电子邮件列表仍然比基于 Web 的论坛软件更可取,而 Web 论坛软件从未让我感到兴奋或有趣。

因此,当 Stack Exchange 的联合创始人兼著名“Coding Horror”博客的作者 Jeff Atwood 宣布他将制作更好的基于 Web 的论坛软件时,我个人反应平平,这不足为奇。毕竟,我已经使用和见过论坛软件多年了。它能有多大不同或更好呢?

好吧,我可以向您报告,即使 Discourse,Atwood 的开源论坛软件,仍然有些未完成,但作为用户和管理员,它已经远远超过了我使用过的其他论坛。它是开源的,基于 Ruby、PostgreSQL 和 Ember.js,这真是锦上添花,让已经很出色的软件变得更加出色。自从我开始使用 Discourse 以来,我已经看到了许多改进,而且似乎还在不断涌现。有史以来第一次,我相信 Web 论坛可以变得有用、用户友好且具有吸引力。

因此,本月,我将关注 Discourse——它是什么,它的目标是什么,以及它对于在线讨论以及面向消费者的开源项目意味着什么。

安装 Discourse

Discourse 是一个开源项目,托管在 GitHub(参见资源),根据 GNU 通用公共许可证第 2 版获得许可。它得到了 Atwood 的公司 Civilized Discourse Construction Kit, Inc. 的支持,其目标是通过安装和支持 Discourse 来盈利。

如果您像我一样,您会认为安装现代开源应用程序应该是下载、安装(可能首先需要一个单独的编译步骤)、配置,然后忘记它的事情。因此,意识到 Discourse 是一个复杂的应用程序,具有许多不同的活动部件,需要一些时间和精力来安装,这有点令人震惊。它使用 Ruby on Rails 和 Ember.js 编写,并结合使用 PostgreSQL(用于主数据库)、Redis 和 Sidekiq 进行排队。

所以是的,您可以“git clone”该应用程序,然后以这种方式安装该软件。但是,您几乎肯定不想这样做。我这样做是为了让 Discourse 在我的服务器上运行,尽管我使用这些技术多年,但这仍然是一项挑战。

幸运的是,您不必做太多工作。安装 Discourse 的首选推荐方法是使用 Docker 容器,这意味着您不再安装应用程序,而是安装一个完整的、预配置的虚拟机,其中所有设置都按照原始开发人员的意图就位。Discourse 说明描述了如何在 Digital Ocean 机器上安装该软件,但您可以使用许多不同的服务器托管公司。

安装 Discourse 后,您需要对其进行配置。当您开始配置 Discourse 时,您会发现它与大多数开源项目截然不同,因为它旨在让用户的生活变得非常轻松。设计的周到之处在每个实例中都闪耀着光芒。该应用程序需要通过在 Discourse 应用程序中设置多个 Ruby 变量来配置,其中大多数变量都在配置文件本身中记录和描述。

配置应用程序并启动它后(我不会在此处详细介绍,因为安装指南对此有足够的描述),您将拥有 Discourse 的工作副本。确保您已正确配置 SMTP 服务器,并且您正在运行 Sidekiq 消息队列,以便当您注册为新用户时,您将收到电子邮件确认请求。

Discourse 中的许多东西都设计得非常好,从登录系统开始,该系统不仅允许您通过本地定义用户名和密码登录,还可以通过 Facebook 和 GitHub 等第三方服务登录。(您需要为您要以这种方式使用的任何服务注册 API 密钥。)一旦您登录到新创建的帐户,真正的乐趣就开始了,设置主题(帖子)可以放置的类别。您可以进行大量的自定义,也可以进行很少的自定义。开箱即用,Discourse 已经运行良好。

Discourse 的配置是通过管理员菜单完成的(使用一个稍微难以找到的位置的链接)。配置菜单非常庞大,让您可以使用 Web 浏览器来完成从设置页眉和页脚,到输入您的 Google Analytics 令牌,再到设置您的第三方服务 API 密钥的所有操作。

真正让我震惊的是,当我转到主管理页面时,出现了一个面板,告诉我我的安装可能出了什么问题。例如,它告诉我我正在使用的 Ruby 副本的内存使用率对于 Discourse 来说不是最优的。它告诉我我忽略了启动 Sidekiq,并告诉我如何启动它。它甚至告诉我,我还没有将徽标图形从原始默认值更改过来。

正如我之前提到的,Discourse 的设计表明,在小事上花费了大量的精力。当我在我的 Discourse 副本的页面中添加页脚时,浏览器内的 HTML 编辑器会自动在我输入的 <a> 标签之后添加一个结束的 </a> 标签。如果我只想更新单个字段,而不是更新配置页面上的整组字段,我可以单击复选框来完成此操作。

很高兴看到一个 Web 应用程序不仅对用户友好,而且对管理员也很友好。通过单击复选框,您可以定期自动备份数据库。如果您愿意,您还可以输入 Amazon S3 存储桶名称,您的备份将交付到该存储桶。像这样的周到功能列表不胜枚举。

然后,当然,您开始使用 Discourse 进行讨论,并发现他们添加的所有小功能,以改善用户体验。例如,您不能输入太短的标题或帖子,Discourse 会自动修复全部大写的主题标题。如果您使用 @用户名 语法引用某人,他或她的个人互动菜单将发光,表明有他或她应该回应的内容。如果用户未登录,或者在指定时间内未访问该站点,他或她将收到电子邮件,指示该引用。这在将内容保留在 Web 上和通过电子邮件邀请人们返回来保持人们的参与度之间取得了很好的平衡。

还有许多其他东西,有些大,有些小,它们都增加了用户体验。作为经常打开许多标签页并且有时忘记每个标签页中内容的人,我最喜欢的功能之一是 Discourse 会跟踪我的写作,即使我使用多个标签页也是如此。我不必担心在一个标签页中打开同一页面会以某种方式覆盖我在另一个标签页中已经开始的帖子。这种对细节的关注以及对人们实际如何使用现代浏览器浏览 Web 的理解令人印象深刻。

技术基础

从用户的角度来看,Discourse 是一件软件。普通用户、论坛所有者和版主都可以轻松配置和使用它。但 Discourse 也是一款编写精良的软件,专为可维护性和长期增长而设计。了解它的构建方式可以帮助您了解自己的工作,因为您尝试创建越来越有趣的 Web 应用程序。这是因为 Discourse 似乎是使用 Web 应用程序领域的大多数最新想法构建的。

例如,虽然 Web 应用程序传统上在服务器上完成大部分工作,将完整的 HTML 页面发送到用户的浏览器,但现在情况已不再如此。JavaScript 在现代 Web 应用程序中发挥着越来越重要和主导的作用,而 Discourse 在这方面全力以赴,使用开源框架 Ember.js,该框架旨在让在浏览器中编写复杂的应用程序变得容易。

因此,在 Discourse 中几乎所有情况下,请求 URL 都不会导致将完整的 HTML 页面发送到您的浏览器。相反,您通常会获得一个没有任何内容的 HTML 页面。然后,由 Ember 发起的第二个单独请求将请求应填充该页面的数据。因此,页面刷新通常会导致 HTML 请求,然后是 JSON 请求。但是,如果您单击按钮或链接,您可能不会导致完整的页面刷新,而是 Ember 操作,这将导致对服务器的 Ajax 调用,然后是 JavaScript 驱动的对 DOM 的更改。但就浏览器而言,您始终停留在同一页面上。

对 Atwood 的采访表明他非常关心性能,这在整个站点中都很普遍。虽然 Ruby on Rails 长期以来允许您使用简单的“render json”调用将对象转换为 JSON,但事实证明(并在 Discourse 源代码中记录)这比自己调用 JSON 转换方法慢 20%。大多数应用程序可能从未注意到这个问题,但 Discourse 为了追求速度,已经识别、基准测试、改进并记录了此类问题。此外,Discourse 论坛的管理员会自动使用 rack-mini-profiler 运行它,rack-mini-profiler 是著名的 JavaScript 插件的 Ruby 兼容版本,用于测量页面和从中执行的各种 Ajax 调用的加载速度。

结论

如果您需要基于 Web 的论坛或正在考虑启动在线社区,我认为您应该使用 Discourse。尽管版本号很早,但它稳定且有用,并且当有新版本要检索时,它会自动提醒您。

Discourse 最引人注目的部分也许是其对用户设计细节的关注。在开源世界中,我们习惯于用所谓的实用术语来思考,常常说美学不是必要的,或者至少它们可以在正确的技术解决方案之后出现。Discourse 在许多方面证明了相反的观点——您可以从相对有限的功能集开始,但只要您考虑用户想要什么,而不是您想要什么技术功能,您的产品就会成功。

事实上,如果说这些年来我学到了什么重要的教训,那就是人们对功能不感兴趣,而是对他们需要什么来使他们的业务、学校或家庭更有效率感兴趣。功能的重要性仅在于它们是否能解决迫切的需求。

总而言之,我鼓励您快点尝试 Discourse。无论您是在站点上使用它,还是只是阅读代码以了解 Ruby 和 Ember 如何协同工作,我都希望您能从中获得很多收获。

资源

Discourse 主页是 http://discourse.org。除了提供一些文档和背景信息外,该站点还提供了一个实时的 Discourse 站点,因此您可以查看、试用并了解其中涉及的内容。但是,如果您想下载代码,则需要从 https://github.com/discourse/discourse 克隆。

Discourse 是使用 Ruby on Rails、Ember.js、PostgreSQLSidekiq 的组合编写的,Sidekiq 依赖于 Redis

Jeff Atwood 的博客位于 http://codinghorror.com。关于 Discourse 的两个很好的采访来自 Ruby RoguesThoughtbot 播客

Reuven M. Lerner 是一位资深的 Web 开发人员,提供 Python、Git、PostgreSQL 和数据科学方面的培训和咨询服务。他撰写了两本编程电子书(《Practice Makes Python》和《Practice Makes Regexp》),并为程序员发布免费的每周新闻通讯,网址为 http://lerner.co.il/newsletter。Reuven 的 Twitter 账号是 @reuvenmlerner,与妻子和三个孩子住在以色列的莫迪因。

加载 Disqus 评论