📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

DHH discusses SQLite (and Stoicism)

Aaron Francis54:00

Transcription

您即将听到的是我与传奇软件开发者、赛车手、企业主 David Haner Hansen 的一次访谈。我们一开始谈论了 SQLite,然后谈论了斯多葛主义、概念压缩以及单人框架。我们谈论了这一切。如果您想了解更多关于 SQLite 的信息,我正在创建一个名为 highperformance sqlite.com 的课程,您可以在那里找到您需要了解的关于 SQLite 的所有信息。关于我说的够多了,让我们开始访谈吧。我大约一小时前给你发了推文,然后我们就这样了。我给你发推文是因为我看到 Daniel Vaso 谈论了他们的 Campfire 实例,我是他社区的成员。我看到他在 SQLite 命令行中运行东西,我想,是的,我应该这样做。这在我列表上很久了。我只是给他发了推文,我说,嘿,DHH,你想谈谈这个吗?你说,是的,今天就来吧。所以,我们就在这里了。非常感谢。是的,这是我的荣幸。这是拥有一个几乎空着的日历的一个好处,您可以随时处理突发事件。所以我对 SQLite 感到非常兴奋,我喜欢谈论我兴奋的事情,所以让我们来谈谈吧。说到这个,在我们深入之前,您的视频看起来很棒,您的音频听起来也很棒。这是您新组装的、完美工作的 Linux 机器吗?这是我的 Linux 机器。不过,我得归功于我的 Shure 麦克风和我的索尼相机。这两样东西都能直接插入,尤其是索尼相机,无需驱动程序,无需任何东西,只需通过 USB-C 直插,它就会在 Neo 中显示为网络摄像头,我就是这样运行的。但这运行在 Linux 上,而且确实令人惊叹,它就是能用,而且用得很好。太棒了。说到“就是能用”,SQLite,它很好。现在,它可能一直都很好,但现在我们又重新发现了它。你知道,写它的人是在 2000 年写的,我们终于发现了它。所以,我想和你谈谈的原因是,你们做了一个很大的事情,你知道,once.com,就像,“嘿,我们要再次改变一切”,而第一个产品是 Campfire,Campfire 捆绑了 SQLite。所以,我想听听您是如何做出这个决定的,以及它带来的一些后果。当然,我认为 SQLite 真正有趣的地方在于,正如您所说,它已经存在了很长时间,并且一直有它的利基市场。这是一种您会嵌入到独立应用程序中的数据库,该应用程序将只为一名用户运行,这在很长一段时间里一直是它的利基市场。人们已经用它做了很多其他事情,但我认为很多开发者都有这样的想法:除非我正在开发一个仅供一名用户使用的客户端应用程序,否则 SQLite 不适合我,因为您不能同时在多台机器上使用它,等等。然后,计算机变得非常快,而且在某种意义上变得非常宽,因为它们现在有很多核心,而且 SSD 驱动器非常快。突然之间,使用 SQLite 为多名用户提供服务的先决条件又回来了。我敢肯定,过去人们能够做到这一点,但现在它感觉更易于访问,以一种恰好在我们这里与 Once 完美契合的方式。所以,Once essentially 运行的是 SAS,在您自己的机器上运行 Web 软件,这将其设置在一个非单用户环境中,它是多用户的,这才是重点。您不会和自己聊天,您会和别人聊天,但它是单租户的。我认为这确实是转折点,正如我观察到的 SQLite 一样,现在有很多 Web 软件可以作为单租户软件在您自己的机器上运行,这更有意义。这显然是我们与 Once 正在探索的。还有另一条路径,我认为也很有趣,那就是在多租户设置的早期使用 SQLite,以消除很多复杂性,也许可以消除很多成本。我们可以谈论这两件事。但当我们开始做 Once 时,我们有很多未知因素。首先,我们如何将它放到人们的机器上?比如,他们需要特殊的机器吗?我们研究了 Docker,然后说,哦,实际上,如果我们围绕它构建一些工具,如果我们构建一个自动更新程序,就像您自动更新操作系统或您机器上的单用户应用程序一样,那就可以了。但是数据库呢?我们现在必须运行第二个 Docker 镜像来运行 MySQL 或 PostgreSQL 吗?如果它卡住了怎么办?只是有很多更多的活动部件。我们真正努力想用 Once 做的是让它变得如此简单,以至于它几乎不可能出错,因为如果它出错,人们就会给我们写信,而 Once 的商业模式根本不支持这一点。我们以 399 美元的单次付费价格出售 Campfire,没有太多空间让别人说,“你能帮我调试我的 PostgreSQL 实例吗?”不,我帮不了你。所以我非常热衷于我们即将移除活动部件的想法。我们如何移除更多活动部件?我们如何将其简化到只有一个 Docker 镜像,如果它不知何故卡住了,您只需重新启动它,而且没有依赖项,没有 Docker Compose,没有其他任何东西。而 SQLite 当然完美契合。所以我们很早就开始探索它,我们几乎放弃了它,因为我们深入研究了,尤其是在当时,我认为我们对 SQLite 并不熟悉。SQLite 数据库有一些默认设置,适合其历史用途,但不太适合 Web 应用程序。它的一大优点也是它的一大弱点,它具有极高的向后兼容性,而默认设置现在有点糟糕。是的,至少它们不适合多用户 Web 软件。防火墙默认未开启,还有一些其他事情需要您默认开启。所以,首先,我们必须找到这些东西是什么。这就是 SQLite 正在发生的事情如此有趣的地方。使用该数据库进行我们正在进行的此类工作的通用意识正在像野火一样传播。就像一年前,我还在试图弄清楚如何做这件事,关于那个特定用例的信息并不多,而现在信息多了很多,而且它还在扩展。我们正在尝试改变,而且我们已经改变了 Rails,使其开箱即用的 SQLite 配置方式正确,并且非常适合 Web 应用程序。所以,无论如何,我们必须经历这个过程。然后我们进行了一系列性能测试,发现有一些事情需要调整。这些事情与长时间运行的事务有关,还有其他一些事情,老实说,在 Rails 中有时是标准的低效做法。以一种与 MySQL 不会遇到的方式,尤其是在事务方面,您真的不想做,您真的永远不应该做,但您不想在事务中进行大量计算,您不想进行大量回调,您不想做任何需要花费大量时间的事情,因为一旦有人说,“我想要一个事务”,而且它是写入事务,就会发生争用。只有一个文件,我们必须做所有这些事情。这就是 SQLite 的局限性所在。但如果稍微改变一下思维方式,它们确实不是很大的限制。举个具体的例子,在 Rails 中,我们有一个叫做回调的东西,当一个新的模型被保存时,它可以回调,然后它可以做很多工作,而那个回调发生在您正在创建的事务中。所以,如果您回去,并在那个事务中做了很多事情,您从中获取数据,也许稍微处理一下,然后又回去,那就是长时间运行的事务。通常情况下,这对于 MySQL 或 PostgreSQL 来说并不重要,您不会注意到这些事情。但我们将一些以那种天真方式编写的回调调用切换到了使用 insert_all,这是一个新功能,但相对而言,它是一个最近才完善的 API,用于对 Rails 中的 ActiveRecord 对象关系映射器进行批量操作。所有事情都在一次执行中完成,对吧?我们没有获取大量对象,也没有要求它们获取数据,然后写入数据。它非常高效。所以,我们必须找到那些点,我们基本上是通过压力测试整个系统找到它们的。我们设置了一个完整的装置来模拟如果您在一台机器上有 10,000 个用户,并且他们都在同时聊天,争用点在哪里。我不知道花了多长时间,但并没有花太长时间就弄清楚了:好的,这里是热点,我们必须如何处理这些热点。现在我们知道了这些热点,并且我们已经识别了它们,SQLite 实际上不再是瓶颈了。它最终变成了其他东西的瓶颈,比如 WebSocket 连接的蜂拥而至,等等。但我们最终陷入了一种情况,这是一种梦想中的情况,我们可以想象一个非常活跃的聊天实例,在一台机器上有 10,000 个用户。所以,现在我们有一个范围,我们可以从我认为我们的最低要求是 1 个 vCPU,2 GB RAM,这可以支持我认为同时 500 个聊天者,或者类似的东西。这些都是相当激进的低基准数字,因为我们认为每个聊天者每秒在房间里说一句话,但大多数聊天者并不是这样的。但无论如何,我们可以从云虚拟机实例类型的东西开始,一直到您可以在一台机器上运行相同的软件为 10,000 个用户提供服务,因为这就是限制。SQLite 强加了限制,您不能有五个应用程序服务器都试图访问同一个文件,那行不通。但 SQLite 的进步是,10 年前,在一个可承受的、非异国硬件的水平上,我们能在同一台机器上支持多少用户?我不知道那个数字是多少,但我可以告诉你,肯定比 10,000 少。我只是说,您可用的核心数量以及所有这些其他硬件进步都不存在。所以,SQLite 的一些重新发现是,未来已经赶上了它的能力,它使得它的范围如此之大,因为计算机如此之快。这是我发现如此迷人的事情之一。我们已经用我们做的其他事情探索了这个领域,Solid Q 和 Solid Cache,现在它们不再使用 RAM 进行作业管理和缓存,而是使用 SSD,因为一些基本原理已经改变了。比如 10 年前的存储速度与现在的存储速度相比如何?我认为很多技术都没有跟上这些确实改变了的东西,但它们改变得相当缓慢,然后突然出现了一个新的功能,您就可以说,哦,SQLite 可以在生产环境中使用,可以在真实系统中使用,人们可以在那里与数千个并发聊天者聊天。这真是太棒了。我们能够利用技术进步来简化堆栈真是太棒了。我非常喜欢 MySQL,我使用 MySQL 已经 25 年了,它是一个很棒的数据库,对于 Basecamp 来说效果非常好,这些都是非常大的系统,我们有大量的应用程序服务。那很好,那还在那里,没有人拿走它。但现在我们得到了这个机会,一种软件风格,单租户软件,早期软件可以在 SQLite 中运行,而且几乎没有什么可抱怨的。我觉得您的职业生涯在很大程度上都专注于消除复杂性,尤其是非必要的复杂性。我不想谈论 TypeScript,但我们可以谈论 TypeScript,但消除复杂性。您有一个叫做“概念压缩”的概念,我觉得 SQLite 已经融入了 DHH 的世界以及您整个职业生涯中的叙事,尤其是现在随着云退出的到来。因为您可以想象,嘿,您购买了这个软件,但请确保您注册了一个云托管数据库提供商,然后您会说,哦,好吧,这有点违背了初衷。所以,我觉得这一切都与您当前和历史上的思维过程相吻合,它消除了堆栈中的整个复杂部分。这是否让您内心感到兴奋,就像,它只是一个文件,没有,它只是一个文件。是的,这太棒了,而且它之所以如此出色,正是因为您所说的原因,它概念性地压缩了数据库到底是什么,我需要考虑多少。我的意思是,如果您正在设置并运行一个守护进程,一个需要喂养、照料和关怀的长期运行进程,那必须在您的大脑中占据一席之地。那是一个气泡,在这里。而这个气泡,无论大小,都会占用空间。SQLite 不会以同样的方式占用空间。再次,您需要了解一些事情,并且需要进行一些设置,但从运营角度来看,需要考虑的事情少了很多,因为它只是那个文件。很多复杂的事情,或者需要更多学习或技能才能操作的事情,我差点称它们为历史数据库,听起来不像,但这些传统的 SQL 数据库,我们就这样称呼它们吧。能够弹出那个气球真是太棒了。当然,在此之上,还有一些用例,就像我们与 Once 一样,它简直是完美的契合。我们正在将软件提供给其他人运行,他们必须在自己的机器上运行它,它不能有活动部件,因为如果其中一个部件坏了,正如我们所讨论的,那将是一个支持负担,然后模型就不起作用了。所以,我实际上会说,SQLite 是我们能够做像 Once 这样的事情的支撑支柱之一。另一个支撑支柱是 Docker,我们能够将整个系统放入一个容器中。现在您可以运行它们了。有很多因素,我不会在 10 到 15 年前尝试 Once。我记得在早期,当我与 GitHub 团队谈论他们正在做 GitHub Enterprise 时,我看了看当时需要什么,在 Docker、SQLite 和所有这些东西出现之前,我只是觉得,哇,要拥有一个可以安装在客户自己电脑上的 Web 软件,这需要很多工作。我希望它没那么难,但我们不会触及它。事实上,多年来我们一直被无数次要求这样做。事实上,甚至在白宫,我想在奥巴马刚当选时,有人从白宫联系我们,说,“我们一直使用 Basecamp,我们能把它安装在白宫吗?”当时的情况是,这是非常爱国的事情,让我们支持我们的政府,让他们运行我们的软件。但我们不得不说,对不起,我们不能这样做,因为我们还没有准备好。所以,这真的对 Once 来说是恰当的时机,而且我认为对整个行业来说也是恰当的时机。我认为我们正被拉向两个方向。一方面,Web 在概念复杂性方面正在变得更糟,它变得更复杂,有越来越多的东西可以了解,可以深入研究,成为专家。这令人望而生畏。然而,与此同时,我们也在底层技术方面取得了根本性的改进,您几乎不需要知道任何东西就能获得好处。SQLite,在更快的硬件、更多的核心、SSD 的伴随下,就是一个例子。另一个例子,我一直是一个巨大的粉丝,那就是 No Build。这个想法是,仅仅在过去三年里,浏览器本身就变得非常出色。浏览器已经大大简化了前端开发所涉及的复杂性。我们仍然在追赶,我不知道,有些人比其他人快,或者有些人比其他人更愿意。也许你会说,我非常愿意让浏览器引擎处理一些我过去习惯于处理的前端复杂性,我很高兴看到更快的 SSD 和更多的核心正在消除运行数据库所涉及的复杂性。所有这些事情都在同时发生,而且它们必须发生,因为如果这些事情不能让我们压缩复杂性,人们的头脑就会爆炸,或者对于个人开发者来说,为 Web 构建将不再可行。对我来说,我将坚守在这一战线上,直到最后一点,最后的斗争,最后的复杂性大战。我们不能放弃互联网成为个人开发者可以构建并与之竞争的东西。我建立的整个 37signals 的业务,从 Basecamp 开始,都是基于这个前提,即我作为一个独立的开发者,可以了解足够多的东西,从而与世界上最强大的公司竞争。我认为,现在比以往任何时候都更重要的是,我们不要将互联网交给少数几家超级联合企业,它们拥有庞大的团队,拥有非常细分的专业领域,比如,“哦,我是一名前端框架工程师,等等”,我将是创造一个产品中的 19 个切片之一,在一个大公司里。而且,不幸的是,这是最有趣的地方,SQLite 显然是开源的。我们使用的许多其他工具也是开源的。但即使在开源领域,也存在一场斗争,很多开源软件来自大公司,这在某种意义上是很好的,对吧?我们希望大公司能回馈,我们希望他们为生态系统做出贡献。但也会发生的是,他们的思维方式,他们的观点也会被贡献进来,而我们最终会到一个我们实际上并不真正想去的地方,经过更仔细的思考。这就是我热爱 SQLite 的原因。我认为它背后的团队大约有三四个人,他们甚至不接受外部贡献,而且他们已经工作了 20 年了。我简直惊叹不已。像这样的东西不仅是可行的,而且对我来说,它代表了一种开发的高水位线。我的意思是,Rails 当然不是这样,我们有 6000 个贡献者,也许现在有 7000 个,这是非常不同的事情。但我喜欢 SQLite 能够如此出色,如此被普遍认可,而这仅仅是三四个人的工作。嘿,我希望您喜欢这个。提醒一下,您可以在 highperformance sqlite.com 上了解更多关于 SQLite 的信息。我不再打扰您了,回到访谈。这真是太疯狂了。如果您阅读文档,文档是由我猜想的唯一一个人 Richard Hipp 写的。他也用首字母缩写来称呼自己,所以你们有共同点。你们还有共同点的是,他写文档时有一种观点,它们很有趣,很健谈,而且很吸引人。尤其是在关于类型的部分,SQLite 就像,“嗯,你想放什么进去,我们都接受。”我们接受任何你想放进去的东西。在最底部,他说,“我们引入了严格表,基本上,如果你喜欢这种东西。”这就是他写的那种语气。所以我确实非常欣赏,我认为是三个人。所以我很欣赏他们对此的奉献。它是国会图书馆的档案格式,天哪。而且他们承诺支持它直到 2050 年。我猜他们会等到 2050 年,然后说,“哦,我们实际上不会放弃,我们只是觉得那还很遥远,所以我们这么说了。”这个故事对我来说最神奇的地方在于,它完美地反驳了开源正处于严重危机中的歇斯底里,而整个互联网却依赖于三个家伙,而这怎么会是糟糕的呢?不,这太棒了,我们应该感到幸运,有如此的奉献精神,以至于三个人就能形成一个被全球数十亿设备使用的东西的基础。这并不是一个缺陷,而是一种对人类创造力、独创性、承担有意义的负担以及所有这些东西的庆祝。我喜欢,至少在我看来,这是对这种歇斯底里的反驳,他们说,“哦,开源正处于危机之中,开源需要更多的钱,更大的团队。”不,他们不需要,我们需要更少。而 SQLite 对我来说,可以说是站在那个例子之上,就像,如果微软给了他们 20 名开发者加入团队,添加更多功能,SQLite 会更好吗?不,它会更糟。不是因为微软,而是因为某些软件的动态。我想到另一个软件,Redis,它很长一段时间也是由一个人运行的。然后发生了什么?然后他坚守阵地,然后他走上了街垒,其他人接管了,然后它走向了一个我不特别喜欢的发展方向。我希望 SQLite 团队永远不要这样做,他们似乎非常讲原则。所以,我认为,24 年后,我怀疑他们现在会把 SQLite 出售给微软。就像您谈到的单人框架一样,我认为您最近有一个主题演讲,其中一个大幻灯片是“单人框架”。那里面有一种纯粹的东西,我在 SQLite 中也发现了这一点。引用创造者的一句话是:“如果我知道你不应该写自己的数据库,我就不会写了。”但我不知道。我没有问任何专家,我不知道你不应该做这件事。我只是有需求和好奇心,然后我就自己写了。这感觉很老派。我想知道从您的角度来看,也许稍微脱离 SQLite,您谈到了浏览器、Docker 和单人框架。对于想要运行自己的“意大利餐厅”的一两个人团队来说,未来会怎样?您谈了很长时间,有无数的意大利餐厅,您不必征服世界,您只需要一个小东西。所以,您看到了什么?我想你们正在 Once 上执行一些这样的操作,你们又在享受双人乐趣了。但对于那些拥有这些新能力的个人来说,他们应该去哪里寻找,如果他们想在互联网上创建自己的小意大利餐厅?他们必须控制复杂性。复杂性是会击垮您并让您出局的东西。当您是一个小团队时,您无法做所有事情,您无法拥有所有这些活动部件,因为它们都需要润滑,都需要照料,都需要维护。您需要减少,减少,减少。这就是为什么 SQLite 如此让我兴奋。我的意思是,谈论没有活动部件,它们真的只是一个文件。我说一个文件,但现在是三个文件,当您运行它时,还有防火墙,但三个文件不算什么。这对我来说很美。No Build 也有同样的特质,对吧?如果只写 JavaScript,就像穴居人一样,写到一个文本文件中,然后那个文本文件直接发送到浏览器,就这样。如果您一年后回来,打开那个文本文件想添加一些东西,没有依赖项,它就会工作。它真的会工作。这就是互联网的美妙之处。如果您在 1995 年有纪律地构建事物,它今天仍然会运行,字面上是 30 年后,它仍然会运行。然后您看看在某些圈子里被认为是最佳实践的设置方式,它在五分钟内就无法运行,更不用说三个月了。一年后它还能运行,这是不可想象的,因为它已经通过依赖项的混乱而退化了。我投资了一些丹麦的初创公司,我看到了一些情况,我说,你们是一个小团队,不,那不是你们应该运行的东西,那不是你们应该花时间的事情。您应该花时间在创造客户关心的价值上。我其实讨厌这个词。您应该花时间编程客户会关心的功能。这才是让您脱颖而出的东西。您的速度将与一家大型公司截然不同,甚至与 37signals 相比。我们现在的速度比四个人时慢得多,我们可以做更多的事情,以不同的规模和更多的用户等等。但如果一个敬业的团队进来,选择非常简单的工具,并在三四人的范围内运作,并致力于其简单性,他们将超越几乎所有人。再次,不是在所有参数上,这是整个蓝海战略。您选择您要擅长的东西。但如果您选择“我们将深入研究简单性”,我们将专注于那些不会不断变化的工具,那么您所能做的就是令人难以置信的。这是一个伟大的二元分裂,西方男人。一方面,您有这条道路,它说,情况从未如此好过,浏览器从未如此强大,基本工具从未如此出色。Ruby,仅举一个我关心的例子,从未如此快过。语言本身自 Ruby 2 以来已经快了三倍,运行在比我 2004 年在单台机器上构建 Basecamp 时快了几个数量级的计算机上。所以,您今天拥有的能力和功能简直是令人难以置信的。然后第二条路是,哦,如果我们把所有这些战利品都浪费在赌场、扑克和二十一点以及其他乱七八糟的事情上呢?然后您就陷入了这样一种境地,您说,不,您把所有战利品都浪费掉了,最后什么都没有剩下,大多数用户关心的是什么。这是我经常在 Twitter 和互联网上争论的话题之一,有时是关于简单性的话题。有些人会指出,“哦,您在前端运行 No Build,这意味着您有 100 个文件,这会很糟糕,会很慢。”我只是说,不,如果用户感觉很快,那就意味着您已经考虑了所有因素,下载等等。他们不会在乎。您会在乎,我会在乎,因为对我来说,简单性是让我能够做所有我关心的其他事情的赋能因素,比如运行只有两个人的功能团队。那是我关心的那种事情。如果其结果如此之好,以至于大多数人注意不到区别,或者他们注意到区别但并不重视,以至于他们会选择一个或另一个。我不是说,让我们回到石器时代,我们将像 Craigslist 一样构建一切。虽然 Craigslist 我确实认为是一个例子,说明了自 1995 年以来不改变事物的惊人韧性。它看起来几乎一样,对于我遇到的大多数使用 Craigslist 的人来说,我从未听过有人说,“我希望它有一个紫色渐变。”或者一个加载,或者一个加载骨架,或者任何这些其他东西。所以,我认为很多这种痛苦和存在主义的恐惧,尤其是在 Web 开发的某些领域,都是自我造成的。这并不意味着绕过它很容易,但这确实意味着从根本上来说,它是可选的。与开发移动应用程序(例如 iOS)形成对比,那里有一个工具链、设置和框架交给您,您对此表示怀疑,祝您好运。您将接受您所得到的东西,并且您必须用它来构建一些东西,而您没有太多选择。Web 如此令人惊叹,因为无论您想要 PostgreSQL、MySQL 还是 SQLite,没有人会更明智。所有东西都会被编译成 HTML,然后发送给用户。如果这段 HTML 足够快,设计得好,解决了有趣的问题,他们就会鼓掌,然后拿出钱包里的信用卡,放在您的表单上。这太令人惊叹了,在计算史上,尤其是在今天的计算史上,这是独一无二的。我经常对事实缺乏欣赏感到震惊,以及我们集体为拥抱它所做的努力有多少。您能编写 Ruby、Python、Go、Elixir、JavaScript,所有这些语言,连接到 SQLite,连接到 MySQL,有无数种组合堆栈的方式,这不是很棒吗?有些人看着它说,“太糟糕了。”如果只有一个独裁者在上面,也许是史蒂夫·乔布斯,他可以决定什么对每个人都应该正确。不,不,不,绝对不行。令人惊叹的是传输层是 HTML,是 HTTP,是这些协议集,它们允许我们使用任何我们想要的东西,允许我们重新发现像 SQLite 这样的东西,这个在开发社区的一个角落里隐藏了 20 年的宝石,然后突然社区的另一个角落说,“你那里有什么?那是一颗多么强大的宝石,我能尝一口吗?”所以,我认为我的一个问题是,您是如何在现阶段保持这种状态的?您是如何保持这种状态的?您是如何不断消除复杂性的?我觉得很多开发者都被吸入了“博格”,他们会去工作,不管是谁,他们会去工作,正如您所说,他们所操作的堆栈部分是,比如说,JavaScript 构建,仅此而已。他们不做前端,他们不做,他们只做 JavaScript 构建。而您在这里,无论您职业生涯有多少年,您都没有被吸入复杂性的“博格”。我觉得很多开发者喜欢玩乐高积木,他们喜欢这样组合,然后那样组合,只是为了好玩,这本身并没有错。但如果您想交付一些东西来赚钱并改变您的生活,那么您应该专注于这一点。那么,您具体是如何不断地消除复杂性的?我一直认为我现在所做的事情将彻底失败。我不是这样想的,我把它当作一种技巧。这在斯多葛主义中叫做消极可视化。我设想我现在做的事情将彻底失败。我不知道,公司一直在倒闭,这是最常见的事情。从长远来看,一家公司最常见的事情就是倒闭。很少有公司能存在五年以上,很少有公司能像我们 37signals 一样存在 25 年。我们很幸运地度过了很长一段时间,但随时可能结束。我认为,我想做好准备。我想为它结束的那一天做好准备。而当它结束的那一天,我必须做一些新的事情,我必须从头开始。我想用这两台设备,这两只手从头开始。我只想能够做到,至少不比我 2004 年时差,那时我用这两只手创建了 Basecamp 的技术基础设施,并以那种方式进行了设置。所以我一直在准备。我不会介意借用这个词,我正在为我这个小世界中的商业末日做准备。它可能是一个更广泛的世界意义,可能同时发生更多事情,但我只是为自己做好准备。我发现,通过信任自己的能力,以及定期锻炼我拥有的构建能力,用非常非常小的团队构建东西,我感到非常满足。当我说是小团队时,我指的是一个人,两个人,最多三个人。因为我可以在脑海中想象,如果这件事破产了,比如我再次破产,事情总是会发生,人们总是会破产。我必须从头开始,我没有资本,我没有公司,我只有我脑子里有的东西,还有我这两只手。我能做什么?我能重新站起来吗?我能创造有价值的东西吗?等等。我想确保这是真的,因为如果我确保这是真的,我就可以睡得更香。它本身也很有趣。我就是喜欢有能力,感觉有能力,培养能力,然后显然是把它交给那些真正需要它的人,那些除了头脑和两只手什么都没有的人。看到这一点真的很有回报。但这也是我能够回顾我 37signals 的毕生工作,然后说,“你知道吗,这是一段很棒的经历,但如果明天就结束了,我不会被打垮,我不会被击垮,我将能够做到。”而且,在经历了这件事的创伤和舔舐伤口之后的一周,我会回到它,我会构建更多东西。我不会让火车从我身边溜走,因为我见过,我见过一些企业家,他们有一个成功的事情,有时甚至不是灾难发生,而是一个庆祝,他们卖掉了公司,现在他们又回到了起点,必须从头开始,火车已经离开了他们的站台,他们落后太多了。哦,我以前知道这件事,我现在不知道了。所以,现在对我来说,即使是开始,我也必须找一堆人,我可能必须找一些投资,因为我不会冒着我所有的资本,所有这些事情都会发生,就像,“哦,天哪,不,我不想要那样。”我希望我的个人能力保持完好。我希望我身体健康。我希望我身体健康,就像突然我必须逃离一只老虎一样。我不知道,也许这是某种 DNA 编程?你有没有想过,我可能会变得又胖又懒,智力上。然后突然,如果一只剑齿虎出现,我就会完蛋。是的,我必须说,我没想到你会去那里,但我喜欢。这太棒了。你还有时间问两三个问题吗?当然。好的。所以,您谈到了……您得原谅我,因为我不是 Rails 开发者,我是 Laravel 开发者,所以精神上我们是表亲,但我不知道具体细节。您谈到了 Solid Q、Solid Cache,然后提到了 Redis 和他们最近的whatever。是否有计划或已经存在从 SQLite 中驱动任何排队或缓存?因为这是我在 Laravel 方面正在考虑的。我们有与数据库通信的队列驱动程序,我认为对于一个单独的 SQLite 数据库来说会很棒,这样就不会有冲突,一个单独的数据库。甚至对于缓存,我们也可以这样做。所以,您对进一步消除外部东西的想法是什么?这就是我们所做的。所以,SQL Cache 或 Solid Cache 使用任何兼容 ActiveRecord 的后端,包括 SQLite,作为缓存的存储。这是直接来自于存储速度有多快。它已经足够快了,以至于 RAM 的优势在提供缓存方面实际上并不重要,以毫秒为单位。我们对此进行了大量的研究和测试,因为您获得的另一个好处不仅仅是复杂性,您不必运行一个秘密进程,您还可以获得更多容量。存储仍然比 RAM 便宜几个数量级,所以您获得了几个数量级的更多容量。这意味着,比如说,您在这里启动一个实例,它有 2 GB 的 RAM,是的,但它可能有 50 GB 或 100 GB 的存储空间。有很多空间可以存储计算,这样您就不必重新计算了。这就是 Solid Cache。我非常希望将其设置为 Rails 8 的默认设置,即 Solid Cache 默认使用 SQLite。正如您所说,它使用一个单独的文件,所以您不必将缓存的东西与记录系统混在一起。但您可以使用相同的简单性,而且不必运行单独的设置。我们也在对 Solid Job 做同样的事情。Solid Job 也是如此。让我们采用一个通常针对 Redis 或其他内存存储运行的基础设施。让我们将其指向一个数据库。它实际上为我们提供了很多优势。有更大的内省能力,您可以使用标准化的工具,有更多的空间来做这件事。它在操作方面也有一些权衡。而那里,也许有点落后。PostgreSQL 和 MySQL 8 及更高版本有一些优势或进步,允许一些您需要的查询结构,用于作业引擎,稍微更有效率。但在低端,它也不重要。所以在早期阶段,尤其是在实验和小规模部署中,您仍然可以使用 SQLite 数据库作为队列的后端,Solid Job 就是这样做的。所以,这是一种双管齐下的方法,试图解决现代 Web 应用程序的两个关键组件:缓存和作业运行。您知道吗,您不需要内存存储来做这件事,您不需要 Redis 来做这件事。您可以将其放在与您用于所有其他事情相同的数据库中,无论是 MySQL 还是 SQLite,使用单独的文件。天哪,我很高兴我问了。我太喜欢了。我想强调一下,也许五年前,如果您告诉 Hacker News 的某个人您将任何数据库用作队列驱动程序,他们会说您做错了所有事情。而现在,我们不仅在这样做,我们还在将其推向 SQLite,宝贝。我们已经走了多远,能够使用那种东西。我喜欢它,因为 Laravel 11 的默认驱动程序现在是 SQLite,这使得入门故事更容易。是的,您可以,如果您需要的话,我不知道您是否会。如果您需要,您可以升级。SQLite 的一个好处是,您在那里所做的一切很可能在 PostgreSQL 或 MySQL 中也能正常工作,也许有一些细微的差异,但 ORM 应该能抽象掉所有这些。但它让您能够开始,并且您已经开始了。您不必启动 MySQL 或 PostgreSQL 或 Redis 或任何东西。所以我确实喜欢听到这个。这是我们在 Rails 社区中早期拥抱的。我忘了我们什么时候做的,但现在已经很多年了,SQLite 成为了 Rails new 的默认设置,正是出于这个原因。您可以执行 Rails new,然后开始工作,而无需了解其他东西,无需了解如何设置 MySQL,以及如何做所有其他事情。因为我认为,概念压缩的一个好处是,它有利于那些想要做所有事情的人,那些想成为一个人的商店的人。他们需要了解很多东西。但它也真正有利于那些刚刚开始的人,那些一无所知的人,那些最需要的是一些成功的经验,他们敲击键盘,屏幕上就会出现东西,然后他们会说,“哇,我做到了,我构建了它。”我记得 1994 年,我上九年级的时候,我去了大学的一个连接到互联网的计算机实验室。您知道他们让我们做什么吗?不是浏览互联网,而是制作自己的网页。

而且它在这个编辑器里打开了 HTML,我加了一个小小的闪烁标签,然后保存,然后我去了浏览器,就像,天哪,文字在闪烁,我做到了闪烁,我让它成为一次改变人生的体验,一次改变人生的体验,我认为这是我在 Rails 设置中真正重视的事情之一,我们应该让更多人获得这种改变人生的体验,这并不意味着每个尝试 Rails 的人都会成为一名专业开发者等等,但他们将获得一种力量的体验,我认为这种体验对任何人都很有启发,就像我做了一件事,一件事发生了,这真的是一份可以送给别人的礼物,而 SQLite 在这方面提供了巨大的帮助,是的,不是每个坐下来做 Rails 的人都会成为一名专业开发者,但原因不会是因为他们无法让 mySQL 工作,或者他们无法让 postris 工作,原因可能是其他一些事情,这很好,但不会是因为这个,好的,在我让你离开之前,最后一件事,你们刚刚发布了,或者预告了,或者揭晓了你们新的 on.com 产品,它看起来超级有趣,我自己也写了很多东西,所以我很想听你解释一下这个新 on.com 产品的愿景,是的,这是 On 的第二个产品,第一个产品是 Campfires,我们谈论过,那个产品是,而且是 3.99 美元,这个新产品,我actually会把它放在引号里,它是一个产品,这是一个产品公司制造的产品,但我们免费赠送它,所以它叫做 Workbook,它的目的是解决我们遇到的一个问题,互联网上有很多软件允许你发布一页,你可以把它放在 gist 上,我写给世界,有新闻通讯,有博客文章,这是一个非常受欢迎的领域,但如果你想发布多页内容,并且这些内容属于更广泛的上下文,那么这个领域就不那么受欢迎了,我们通常称之为一本书,这里有一个概念我想向你解释,例如,它将需要大约 90 页,我们已经在 37signals 写了很多书,最早可以追溯到 Getting Real,实际上在那之前还有另一本书叫做 Defensive Design,但如果我们以 Getting Real 为例,它于 2006 年在互联网上发布,是自出版的,它正是我们想让它更容易解决的那种问题,因为我们当时使用了我认为四种不同的平台来创建这类网络书籍,无论是 Getting Real,它在 getting.bam.com 上,还是我们的员工手册,它也是一本书,我不知道,里面有大约 25 页,或者类似的东西,我们写了很多其他书籍或手册,我们为 Kamal 或部署工具或一些 Hotwire 的东西写了手册,而且所有这些东西的设置都很复杂,充满了配置和技术细节,我们只是想,为什么它不存在,就像一个独立的包,一个包,你安装它,而不是软件即服务,对吧,也许有一些软件即服务的东西可以做到这一点,但我甚至不感兴趣,我不会在别人的东西上运行像 Getting Real 这样的东西,当然,我想在自己的服务器上为互联网发布,因为我知道并相信我可以让它运行几十年,而不是衰退,但我想让它更容易,这就是我们用 Workbook 所做的,或者正在做的,我们正在创建它,我认为我们自己有大约七本书,从 Getting Real 到 Workand Books 到内部手册,比如我们的 Ops run book,我们的程序员手册,我们有很多内部手册,其中一些实际上只是保存在 GitHub 上,作为 markdown 文件,我们用它来导航,这实际上是一个令人惊讶的强大解决方案,虽然有点简陋,不太好看,还有一些其他缺点,但这就是 Workbook 的前提,让创建互联网书籍变得容易,多页内容属于一起,并且可以在一个地方发布,我们将像 Campfires 一样提供它,它将是一个可以在你自己的服务器上运行的命令,你将设置好 Workbook,你可以直接登录,并完成你所有的写作和设置,它不会花费你任何钱,而且源代码是包含的,所以就像 Campfires 一样,我们也提供源代码,我故意在这里不说开源,尽管我真的很喜欢开源这个词,因为我们不一定想启动另一个社区项目,在那里我们接受 pull requests 并需要维护它等等,也是因为 On 的理念是完成的软件,不一定是一开始就如此,但有一个原则,我们可以得到一个完成的软件,它就是完成的,它不需要更多功能,它不需要更多东西,它偶尔可能需要安全更新,好吧,那很好,你仍然可以推送它,但它的概念性的体现已经完成了,就像它一样,它不会有更多的按钮,更多的铃铛,更多的哨子,而 Workbook 希望能够比 Campfires 更快地达到这一点,然后我们可以免费赠送它,而且对我们来说维护它不会是一个巨大的负担,尽管当然,如果出现问题,我们会处理,而且我们也在为它构建大量新颖有趣的技术,我们正在构建一个名为 House 的新的 markdown 文本编辑器,我今天在 Twitter 上宣布了它,这与我们通常在产品中使用的不同,我们使用一个叫做 Tricks 的所见即所得编辑器,我们自己也构建了它,它通过 Action Text 内置在 Rails 中,所以你可以非常容易地设置所见即所得编辑器,带有拖放和文件上传等所有这些东西,但有很多,尤其是技术 minded 的人不喜欢所见即所得,他们喜欢 markdown,我也是其中之一,我真的很喜欢 markdown,我为自己的写作,我们将把它放入这个产品,然后也作为开源的礼物送给世界,那就是 Workbook,我没有具体的发布日期,但 on.com 将会有所有关于它何时发布的更新,你当然也可以在那里查看 Campfires,我们将尽可能多地分享关于它的信息,我认为让我对整个 On 品牌感到兴奋的另一件事是源代码包含,在开源世界中,你经常可以找到数百万个关于基础设施软件的源代码示例,或者你想了解对象关系映射器是如何构建的,太好了,这里有大约 12 个不同的存储库供你深入研究,你想了解一个商业上具有弹性的产品是如何构建的,哦,不,抱歉,绝大多数都是闭源的,它是专有的,我的意思是,我们也是,Base Cam 也不是开源的,我们没有任何计划让它们开源,那些是我们的商业秘密,我的意思是,不是真的,但就是这种感觉,在基础设施层面有大量的开源软件,在应用层面则少得多,这是我在 Campfires 中真正享受的一件事,对于购买产品的客户,他们显然会得到源代码,我们录制了 Ruby 层面和 CSS 层面的 walkthrough,购买 Campfires 的人可以访问,我们可以为 Workbook 做更多,因为部分原因是它没有票务费,所以有人至少可以得到那个,我的意思是,Workbook 是一个比 Campfires 小得多的产品,Campfires 是一个功能非常齐全的聊天工具,要在现代竞争激烈的环境中构建它,它可以是 Slack 的替代品,实际上是一项重大的工作,Workbook 的野心稍微小一些,这并不意味着它解决的问题不那么宏大或不需要,它只是意味着它的技术范围稍微小一些,但无论如何,我热爱开源,我热爱查看源代码,我的意思是,我学到了很多,正如我所说,我第一次接触互联网,就是先让我的标签闪烁,然后我真的去了,我想是 yahoo.com 或类似的地方,然后查看源代码,他们是如何做到那个的,哦,你可以使用一个表格,你可以放一些小的 1x1 的间隔 GIF 来对齐东西,太棒了,我惊呆了,现在我们没有这些了,例如,前端,太多的操作正在使用最小化,混淆,web packing,分块,es 构建,只是一个大杂烩,你得到一个大杂烩,哦,我要请求,或者我想了解他们是如何构建 Gmail 的,是的,祝你好运,去整理 22MB 的混淆过的 JavaScript,你什么也学不到,例如,有了 Hay,我们走了相反的路,Hay 在 JavaScript 端完全是无构建的,这意味着所有单独的文件都在那里,没有 source map,只是可读的单个文件,而 Workbook 和 Campfires 将这一点进一步推向了极致,就是查看源代码,但对于后端,是的,我喜欢你们这样做源代码可用,我喜欢,我认为很多人购买 Campfires 只是为了看看 dhh 是如何编写 Rails 应用程序的,我的意思是,这是一个很棒的学习体验,你知道,如果 Taylor 发布类似的东西,Taylor Awad,我会毫不犹豫地购买它,只是看看它,然后说,哦,原来他就是这样做的,我认为这是一个很棒的教学方式,太棒了,同样,我的意思是,有很多商业软件,我会想,我想知道他们是如何构建的,我希望我能查看更多东西的源代码,所以希望这至少能开始,在前端,我觉得这不需要太多技巧,这也是我为什么对不构建并摆脱所有这些转译器,编译器,构建,杂乱无章的东西感到兴奋的原因,因为我们可以回到查看源代码,至少可以学习网络是如何工作的,你可以通过查看成功的,主要的,主流的东西来学习网络是如何工作的,并意识到,哦,它实际上并不像他们那样复杂,哦,好的,是的,我也可以做到,嗯,从 SQLite 到斯多葛主义,到无构建,到在破产中失去一切,这真是一次愉快的经历,我无法表达我有多感激你当时说,是的,我们现在就做吧,是的,所以非常感谢你,如果人们还没有关注你,他们想关注你,我想 Twitter dhh 可能是个好地方,那是个好地方,我几年前从 Twitter 上休息了一下,但现在我又回来了,我不知道我对此感觉如何,但现在我又回到了 Twitter,而且我确实发了很多推文,但除此之外,我还有 dhh.la.gov,好的,谢谢。