先锋 趋势 方法 投研 作者
DHH:编程的未来、AI、Ruby on Rails、生产力与育儿|Lex Fridman Podcast #474
返回节目精读

DHH:编程的未来、AI、Ruby on Rails、生产力与育儿|Lex Fridman Podcast #474

摘要

  • DHH 的核心产品理念是:开发者杠杆来自移除仪式感,而不是堆积架构。 Rails 8 的“无构建”路径,试图把现代能力与1990年代末 PHP 的即时性结合起来:修改文本文件、刷新页面,就意味着已经部署。Web 应用至今往往还是在数据库里创建、读取、更新和删除记录;他的挑衅性说法是,“CRUD 猿人”为了掩盖这一平庸现实,主动购买自己并不需要的复杂性。

  • Shopify 是 DHH 证明简洁、动态类型软件可以从一个创始人扩展到全球基础设施的最强案例。 他提到 Shopify 在 Black Friday 每秒约处理 1 million 次动态请求,占互联网电商商店约 30%,市值约 $120B,员工接近 10,000人,Rails 单体应用约 5 million 行代码。经济学上的区别很关键:延迟必须保持在约 300毫秒以内——他的目标是 100毫秒——但吞吐量可以横向扩展;而多数公司花在“湿件核心”上的钱,远多于 CPU 核心。

  • AI 已经提高了程序员的杠杆,但 DHH 认为,产出代码与获得能力之间正在出现危险分裂。 他持续把 AI 当作耐心的结对程序员、研究工具和新手指南,但会把它放在另一个窗口里,且经常亲手输入实现,因为“你是用手指学会的”。Lex 认为,迭代式提示和编辑可能成为一种严肃的新技能;DHH 更强硬的回答是,“编辑是奖励”,前提是你先成为一个真正有能力的执行者,同时他也承认,对于哪怕未来 6个月会怎样,“他妈的没人知道”。

  • 组织层面的推论是:只要沟通和管理开销接近于零,极小的技术强团队也能创造不成比例的企业价值。 Basecamp 第一版花了 DHH 约 400个计费小时,37signals 至今仍把大量工作组织成一个程序员、一个设计师、一个功能。他的反规模化公式很明确:不要拿增长资本,保留不被打断的时间,并记住,1,000名程序员会做出“1,000个人做出来的那种软件”,而不是把两个人做的东西打磨得更精致。

  • 离开 AWS,把基础设施纪律变成了 37signals 一项数百万美元的营业利润决策。 DHH 说,AWS 账单峰值约为 $3.2B–$3.4B;在略超过 6个月内把 7个主要应用迁到自有硬件后,基础设施支出下降约一半到三分之二,即每年节省约 $2M,预计 5年节省接近 $10M。他的限定条件很重要:如果需要在 15分钟内启动 1,000台机器,云的弹性无可匹敌;但对可预测的工作负载而言,长期租用往往不理性,尤其是在 AWS 利润率接近 40% 的情况下。

  • DHH 区分有生产力的平台力量与榨取型收费站:他反对 DOJ 拆分 Chrome,却赞赏 Epic 对 Apple 的斗争。 在他看来,Chrome 主要凭实力胜出,也帮助开放网络保持竞争力;Apple 的 App Store 则向那些既没有创建、也没有收购的企业收取 30%,HEY 上线后几乎因此被挡在门外。据报道,Epic 花费超过 $100M,才获得向用户提供网页支付链接的权利,这说明由创始人控制的公司,以及 DHH 所说的“不合理”信念,能够创造传统董事会永远不会承保的生态系统级回报。

  • 他的开源契约同样强硬:维护者是在明确许可证下赠送软件,而不是承担客服义务,也不是接受事后追索收入。 Rails 能持续发展,是因为 DHH 构建自己需要的东西,并接受兼容的贡献;宽松的 MIT 许可证实际上是在说:“你他妈想怎么用都行”,且不提供担保。这一原则支撑了他对 Matt Mullenweg 攻击 WP Engine 的批评:认为对方贡献不足,不能成为另一家公司成功后事后改写契约的理由。

  • 最深层的长期判断是:流动感、家庭与自主权,比最大化财富和永久加班更能产生有韧性的产出。 DHH 每周大约工作 40个有结构的小时,珍视“一张空日程表”,并说成为父亲后,他对满足感的量尺从 1–10 扩展到了 1–100;赛车则通过把人推到抓地力边缘、要求完全专注,提供可靠的心流。他最后刻意拒绝预测:文明总会不断制造并解决新问题,所以“我们在想象中承受的痛苦,比现实中承受的更多”;在确定性不可得时,乐观是更好的默认选项。

精读

1. 编程是在两次失败和一次微小成功后才真正入门

  • DHH 5岁时第一次接触 Commodore 64,是通过 Yie Ar Kung-Fu;后来父亲给了他一台 Amstrad CPC 464。他买不起游戏,便花数小时照着杂志上的源代码逐行输入,结果必然会输错,并收到一些当时只有6岁、只会说丹麦语的自己完全看不懂的报错信息。

  • 他最鲜明的概念性失败是变量:常量很好理解,可为什么要先赋值、之后再改变?盗版消除了他继续钻研编程的实际动力,因为复制来的游戏直接提供了他想要的结果,不再要求他掌握那项技能。

  • 11岁或12岁时,Amiga 500 和一门字面上就叫 Easy AMOS 的语言又把他吸引了回来。他学到了循环和条件判断,却连一个基础游戏都没做完,最后认定编程可能需要某种自己不具备的数学智力:“也许我不够聪明。”

  • 这段经历塑造了他对“第一次轻松成功”的执念。两次早期尝试都要求先准备数小时,最后才换来一个无法理解的失败;后来网页改变了他的轨迹,因为一个 HTML 标签就能立刻产生可见反馈。

2. Amiga 圈子先教会他网络,再教会他代码

  • DHH 至今仍称 Amiga 可能是自己最喜欢的电脑,部分原因在于,当时计算还没有全球同质化。Amiga 在欧洲部分地区占据主导,而 Apple II 对一个哥本哈根孩子几乎毫无意义;每个地区都有自己的机器、文化和审美。

  • 他着迷于欧洲的 demo 小组:他们把图形和 MOD 音乐组合进小至 4KB 的程序。由于无法追上那些写汇编的朋友,他转而加入周边的分发文化,在卧室里运行一个公告板系统。

  • 14岁时,他的 Amiga 4000 接了 3条电话线和几台不停闪烁的调制解调器,负责安装第三条线路的技术员对此困惑不已。他的父母理解硬件,却未必理解盗版软件交易;后来他带着年长黑客和一台14英寸 CRT 乘火车去参加 The Party,数千人并肩创作。

3. HTML 和 PHP 提供了他至今仍在追求的操作快感

  • 约在1995年九年级的一次大学参访中,DHH 得到一个文本编辑器、一个早期浏览器,以及创建网页的许可。让文字闪烁、改变字号,并意识到德国有人无需任何人批准就能看到它,形成了他此前编程尝试所缺失的正反馈循环。

  • 他与当年 demo 圈的熟人一起做游戏网站、写评论,还把自己包装成15岁记者,向商店借 PlayStation 游戏。HTML 不完全算编程,但“闻起来像”:他是在向电脑下指令,同时向全球发布内容。

  • 早期用 ASP 做动态网页后,PHP 终于让变量、循环和条件判断连成了一个整体。它在1990年代末的工作流成了他的操作基准:写一个脚本,通过 FTP 上传到带 mod_php 的 Apache,刷新页面,然后“砰,它就在那儿”——没有构建流水线、框架仪式感或服务器配置。

  • Lex 开玩笑说,DHH 的职业生涯因此要归功于 PHP;DHH 回答:“100%,确实如此。” Pieter Levels 让他相信,这种旧模式并不只是怀旧:一个人至今仍能用 PHP、jQuery 和 SQLite 经营真实业务,只是团队最终会需要版本控制等协调工具。

4. Rails 8 把复杂性视为选择,而不是进步

  • DHH 对 Web 开发者的诊断刻意尖锐:很多人仍是“CRUD 猿人”,他们构建创建、读取、更新和删除数据库记录的表单,然后把这项朴素任务过度复杂化,以缓解承认其平庸时的存在主义不适。

  • 他的目标不是字面意义上回到1990年代,因为那时的工具同样问题重重。Rails 8 的“无构建”方向,是在保留20年改进的同时,找回修改文本文件、刷新浏览器就能看到结果的即时性。

  • 他认为,更快的电脑本应让开发比1990年代更简单,但这个行业把人体工学拱手让给了“复杂性的商人”。Rails 想做的是让复杂系统预装就绪,同时不缩短从新手项目走向严肃业务的跑道。

5. JavaScript 的构建时代是一座桥,不是终点

  • DHH 称 JavaScript 是自己第二喜欢的语言——与 Ruby 的距离非常遥远——并为现代 ES6 辩护,尤其是其真正的 class 语法。他批评的不是 JavaScript 那些臭名昭著的类型强制示例:“你为什么要这么做?别这么做就行了。”

  • “黑暗时代”始于浏览器无法执行开发者真正想要的那种愉快方言,于是转译器、Webpack 和依赖流水线变得有其合理性。但整个体验最终荒谬起来:他离开一个 JavaScript 项目“整整5分钟”,回来时它可能已经无法编译。

  • 大约从2010年到2020年,框架更迭如此之快,以至于3个月前的知识都会被当作能力不足的证据。DHH 称之为一座“疯人院”,身处其中的人不断为重写寻找合理性,因为只有被困在里面的人,才会把持续崩坏视为正常。

  • 他较为宽厚的修订是:部分复杂性确实是一座桥。Microsoft 凭 IE5 获胜、几乎冻结浏览器发展后,Firefox、再到 Chrome 重新启动了浏览器进化;如今浏览器可以直接从文本文件执行出色的 JavaScript,许多流水线因此已经可以被淘汰。

6. Chrome 挽救了开放网络,但浏览器单一化仍然危险

  • 浏览器兼容性是一项非凡的隐性成就:DHH 九年级做的页面,约30年后仍然可以正常渲染。要支持几乎所有曾经发布过的网页,相当于一项“阿波罗计划”,这也解释了为什么 Microsoft 最终让 Edge 采用 Chromium。

  • 他支持独立的 Ladybird 浏览器,因为单一引擎垄断会威胁网络。但与此同时,他也把 Chrome 视为“送给 Web 开发者的一份完整礼物”:Google 的业务有足够多价值建立在开放网络之上,从而阻止 Apple 和 Microsoft 把网络变成受控原生平台的流量入口。

  • 尽管总体上同情反垄断执法,DHH 仍反对 DOJ 推动把 Chrome 从 Google 拆出去。Firefox 和 Safari 提供了替代方案,Android 允许使用独立引擎的浏览器,37signals 的客户也从不会被强制通过 Chrome;因此他认为 Chrome 是“凭实力赢的”。

  • 在他看来,更强的垄断案例涉及移动端收费站,以及 Google 同时控制广告的供给和需求。Lex 同意 Chrome 在技术和竞争上的贡献无法衡量;两人的共同警告是,干预可能让一个并不完美的系统变得更糟。

7. Cookie 弹窗是 DHH 对监管失败的纪念碑

  • DHH 把 GDPR 时代的 cookie 弹窗视为“好心一路通向地狱”的典型案例。在他看来,它消耗人的时间,却没有保护隐私,反而让律师、会计师和官僚获利,并让整个网络变得更加丑陋。

  • 更深层的控诉是制度僵化:大约10年或12年过去后,“任何地方认真思考的人”都不认为这些弹窗有帮助,但政府就是无法把它们移除。它们的覆盖范围提供了他最好的喜剧式总结:即使在火星上,面对漫长通信延迟,用户仍然会等着接受 cookies——“宇宙里没人能躲过这场胡闹。”

8. Basecamp 打开了 Ruby 进入 DHH 生命的入口

  • 2001年,DHH 在哥本哈根给芝加哥的 Jason Fried 发邮件,回答一个 PHP 问题,两人由此认识。他们从通信发展到付费客户工作,24年后仍是合作伙伴;DHH 把这视为无许可互联网创造的小奇迹。

  • 他们的客户总是从邮件开始项目,随后上下文散落在新参与者、FTP 目录以及名为“final final V6 2.0”之类的文件里。在接连丢掉重要事项后,他们开始思考:能不能把博客和待办事项合成一个项目系统,简单到只需要登录,而不需要参加培训课。

  • Basecamp 是 DHH 第一个真正掌控技术的项目。Dave Thomas 和 Martin Fowler 的文章把 Ruby 当作设计模式的可读伪代码,促使他研究这门由 Matz 于1993年开始设计、10年后在西方仍然鲜为人知的语言。

  • DHH 给自己两周时间,证明 Ruby 可以查询数据库并显示 HTML。结果一个周末就完成了:Ruby“像一只完美量身定制的手套”一样适合他的思维;与 PHP 不同,它让他把自己认作程序员,而不是一个不断敲打电脑、直到应用程序出现的人。

9. Ruby 最小的表达式,揭示了它最大的设计承诺

  • DHH 第一眼注意到的是 Ruby 没有的东西:分号。分号的缺席意味着有人在为人类优化,而不是为了让解析器工作得更方便;这揭示出,代码审美可以成为明确目标,而不是偶然偏好。

  • 他最具代表性的例子是 5.times:整数是一个对象,调用 times 就能让一个代码块迭代5次。Lex 的反应——“真不错”——概括了 DHH 看重的效果:一个概念被压缩成一个再也删不掉多余部分的表达式。

  • Python 与 Ruby 共享动态、解释型、以生产力为导向的理念,但 DHH 不接受 Python 的审美。他拿 Python 的 __init__(self, ...) 与 Ruby 的 def initialize 对比,认为最重要的初始化器不该被下划线、缩写或强制标点包裹。

  • Ruby 的条件语法进一步放大了这种效果:if user.admin?,把 if 放在语句后面,或者写成 user.downgrade unless user.admin?。问号只向人传达信息,而 unless 消除了否定;机器收到的是等价指令,但人看到的东西接近诗歌。

10. Matz 围绕对程序员的信任设计 Ruby

  • DHH 把 Matz 所说的“程序员幸福”与 James Gosling 对 Java 的描述进行对比。按 DHH 的理解,Gosling 是为可能误用复杂能力的普通程序员设计 Java;Matz 则假定人可以学习、进步,也配得上“锋利的刀”。

  • Ruby 允许陌生人扩展基础类。Rails 的 Active Support 给数字增加了 days,所以 5.days 可以表示5天缓存过期时间对应的秒数;DHH 写的代码,看上去可以与 Matz 写进语言本身的代码毫无区别。

  • Lex 反驳说,压缩本身可能变成 Perl golf:短,却难以阅读。DHH 同意,并把 Ruby 的优势部分归因于 Matz 研究了 Perl、Python、Smalltalk 和 Lisp,再把它们最好的想法重新编辑组合;令人惊讶的是,他认为 Ruby 第一版设计至今仍有约 90% 保持不变,已经超过30年。

11. 元编程让 Rails 像每个领域自己的语言

  • DHH 形容,元编程是把 Ruby 的开放性“开到11”。在 Active Record 中,User 类可以声明 has_many :comments;这一行代码会创建关联、访问、创建和更新行为,同时看起来像一个原生关键字。

  • Rails 通过这些声明形成领域专用语言:has_manybelongs_to、验证以及其他构造,把业务关系翻译成可读的类定义。对 DHH 来说,成就不在于发明元编程,而在于消除了其他地方会暴露其内部机制的行噪声。

  • Lex 为 Lisp 辩护,称它是自己的初恋,并指出 Lisp 早已开创了类似能力。DHH 承认自己从未写过严肃的 Lisp,开玩笑说“我有两只眼睛”可以用来评价它的括号;他承认这是自己的局限,同时表示 Smalltalk 已经教会他很多编程语言史。

12. 动态类型与 Ruby 的交易不可分割

  • DHH 愿意“至死捍卫动态类型”,因为静态声明会阻碍元编程,并重复 Ruby 本可以压缩掉的信息。他的讽刺例子是:先写类型 User,变量名写 user,之后又写 User.new,同一个概念重复了3次:“我没时间干这个。”

  • 他尝试通过 TypeScript 的类型系统编写元编程后,把 TypeScript 从 Turbo 中移除了。JavaScript 的动态性让他觉得像 Ruby;TypeScript 加入类型体操、额外字符,以及频繁退回 any,换来的自动补全和编辑器保证并不是他个人看重的东西。

  • 这种拒绝与工具选择有关。DHH 使用文本编辑器,不用自动补全,因为亲手输入每一个字符,会对样板代码形成压力:一旦语言让重复代码变得轻松,整个社区就会容忍更多重复。

  • 他完全承认另一类场景的合理性。拥有 5 million 或 50 million 行代码、数千名贡献者的系统,可能需要更强约束;但把 100,000名程序员系统的方法强加给一个在卧室里做应用的人,是“彻头彻尾的胡说八道”。

13. Shopify 展示了 Rails 异常漫长的成长跑道

  • DHH 曾经像传教士一样鼓吹 Rails,仿佛所有 Web 程序员只需听到福音就会明白。现在他接受人的思维方式不同:有些人需要 IDE 和编译器的安全感,而他的头脑适合动态鸭子类型和文本编辑器;他反对的只是把某一种气质宣布为普遍正确。

  • Shopify 是他反驳“Rails 无法扩展”这一绝对判断的证据。他提到 Shopify 在 Black Friday 每秒约处理 1 million 次动态请求,占互联网电商商店约 30%,员工接近 10,000人,市值约 $120B,年商品交易总额接近四分之一万亿美元。

  • Shopify 的 Rails 单体应用约有 5 million 行代码,这是任何语言都会碰到人类极限的边界。DHH 估计,等价的 Go 或 Java 代码可能要占 25 million 或 50 million 行;这或许换来局部安全,却也把人们必须理解的整个系统放大了数倍。

  • 更重要的目标是 Shopify 之前的 Shopify:Tobi 构建 Snowdevil,那家滑雪板商店后来才发展成平台。Rails 首先服务的是那个生产力足以创造种子的个人;它提供足够长的成长跑道,即使种子最终变成关键基础设施,也不必被丢弃。

14. 扩展性争论混淆了延迟、吞吐量和经济学

  • 由 Shopify 开发的 YJIT 显著提升了 Ruby 的执行效率;在 Shopify 的规模上,哪怕 5% 或 10% 都很重要。但 DHH 强调,Shopify 在 YJIT 之前就已经存在,最初运行在 Ruby 1.8.6 上;按他的记忆,那一版大约比今天的实现慢10倍。

  • 性能首先意味着请求延迟:响应耗时 1.5秒就会让人觉得系统坏了,所以 DHH 要求至少低于 300毫秒,个人目标是 100毫秒。吞吐量意义上的扩展则不同:如果一台机器每秒处理 1,000个请求,增加机器就能把系统推向每秒 1 million 个请求。

  • 语言通常都能横向扩展;更难的约束在共享状态,尤其是 MySQL 之类的数据库,以及全球范围内的一致性和性能问题。Ruby 变快,主要改变的是应用服务器的数量和成本,并不决定系统能否横向增长。

  • DHH 称 Ruby 是“编程语言界的 Coco Chanel”,某些超低价值请求确实负担不起这种奢侈。但对 99% 的业务应用来说,昂贵资源是“湿件核心”:当 Ruby 服务器约占 37signals 运营预算的 15% 时,适度的人类生产力提升,价值超过了哪怕大幅节省算力。

15. 对 DHH 来说,AI 最有用的身份是高带宽结对程序员

  • Lex 认为,AI 协作会提升可读代码的价值:如果模型生成的是 Perl golf,那就无法构成协作,因为人类无法检查或修改。DHH 同意,Ruby 每个字符能压缩更多概念,因此增加了模型与程序员之间的通信带宽。

  • 他把 AI 放在单独窗口,而不是让 Cursor 或 Windsurf 驱动自己的编辑器。Claude Code 是他偏好的终端代理式界面,但在20年没有编译等待之后,它有时显得太慢:AI 思考时,他会变得不耐烦。

  • AI 作为研究伙伴已经不可或缺。它能解释 API、提供第二意见、起草方案,也能回答“蠢问题”,不用面对 Stack Overflow 的评判;DHH 估计,这类学习可能让他一天结束时聪明 0.5%,而这种增量可以复利。

  • Lex 补充说,模型持续不断的积极反馈让编程更有趣:它像一个聪明的鼓劲伙伴,被纠正时不会自尊受损。DHH 认出了传统结对编程的好处,却不必承受与人协作时的社交暴露;作为内向者,他与真人结对大约只能坚持5分钟。

16. 让 AI 输入代码,可能制造产出,却消耗能力

  • 构建 Omakub 时,DHH 让 AI 生成自己从未真正学会的 Bash。因为没有亲手输入,他反复要求 AI 生成同一种条件语法,却始终没有记住它;这段经历让他害怕:“这就是学习的终点吗?”

  • 他的折中方案是向 AI 索要解释、API 和草稿,然后自己输入实现。类比起来,就像看吉他教学无法让手指真正学会弹奏;编程同样包含只有亲自做过才能获得的运动与认知模式。

  • 在 AI 之前,DHH 就见过资深程序员逐渐失去手感:升职后日程被会议填满,键盘消失,技术直觉迅速衰退。编程不只是通往软件的经济路径;就像即使有一份完美录音,人仍然会想亲手弹一遍《Stairway to Heaven》,掌控乐器本身就提供了人类价值。

17. Lex 与 DHH 对 vibe coding 能否成为持久技艺存在分歧

  • Lex 拒绝把 vibe coding 简化为不断点击“是”。迭代式提示、理解模型的风格,以及学会修复生成的系统,可能会成为一种独立的编辑技艺;其中最优秀的人,表现或许会超过从零开始写每个文件的人。

  • DHH 的回答是绝对的:“编辑是奖励”,只有先成为优秀的写作者或执行者才能获得它。他认识的每一位强编辑都具备写作能力,因为诊断一个有缺陷的方案,通常要求你自己知道如何产出正确方案。

  • 不过,他接受自然语言生成软件很快可能会非常有效。那个未来会比“提示词工程师祭司阶层”更民主:普通人可以说出混乱的意图,得到软件,修改自己的意图,再重复这个循环——这正是客户历史上与程序员合作时所做的事情。

  • 在 DHH 看来,目前的 vibe-coded 产品会在令人信服的外观之下很快失败。他提到 API 密钥泄露、明文密码等症状都能解决;更深层的问题是,代理会迷失在自己构建的迷宫里,修好一个行为却弄坏另外5个,直到系统“不断咬自己的尾巴”。

18. 没人知道手工编程究竟是马,还是飞机

  • DHH 把“他妈的没人知道任何事”视为第一原则。在本地运行 DeepSeek、看着它显露推理过程时,他感到诡异的人性化,甚至有些恐惧;但当下能力非凡,并不能说明未来6个月会是什么形状。

  • 他的反例是1995年的电影 The Lawnmower Man,它曾让他相信沉浸式虚拟现实距离我们只有5年。30年后,VR 在 Gorilla Tag 等游戏和一些专业工作中很重要,但还没有成为大多数人每天生活的环境。

  • 航空业走出了另一条曲线:从 Wright brothers 到喷气式飞机大约用了40年,之后客机设计在1950年代后基本进入平台期。技术早期的几个点,恰恰会让人想做线性外推,而技术可能正要趋于平坦。

  • 手工编程可能变得像马匹运输:经济上退居小众,却仍被人喜爱为娱乐。DHH 怀疑 Anthropic CEO 据报道所称的“到年底 90% 的代码将由 AI 编写”,但他谦逊地承认,社会可能不再重视自己所做的事,而他仍然会享受其中。

19. 年轻程序员应当在不确定性中优化学习

  • DHH 的建议很简单:如果编程吸引你,就去学,哪怕没人能保证它永远是一份职业。AI 可能先冲击艺术家,再冲击水管工;也可能 Tesla 的机器人把顺序倒过来。只选择所谓安全的职业是不可能的。

  • 他建议,学习时间应更多用于从零写代码,而不是 vibe coding。AI 辅助的产出可能是让人感觉自己在学习的“空热量”;真正的能力必须靠自己在程序中挣扎出来,就像健身需要实际锻炼,而不是观看健身视频。

  • 更广泛的对冲是:选择即使市场变化,旅程本身仍值得的事情。37signals 开始一个产品时,DHH 看重所有结果:失败仍然换来一个绿地问题和漂亮的 Ruby 工作;中等需求可以支付工资;爆发则带来更广泛的影响。

20. Rails 把自己的价值观记录下来,以免成功将其抹去

  • DHH 大约在2012年写下 Rails Doctrine,因为社区会忘记围栏当初为何存在。没有明确价值观,新来者自然会带入自己的偏好,直到整个机构失控;Chesterton 的围栏之所以重要,是因为在理解它之前就拆掉它,可能会放狼进来。

  • “优化程序员幸福”排在第一位,是向 Matz 致敬。它允许模糊性和人类同义词:交互式 Ruby 会同时接受 exitquit;而按 DHH 的说法,Python 提示符拒绝直接输入 exit,反而教训用户要加括号或使用 Control-D。

21. 约定优于配置,给开发者的是一件完成的玩具

  • 早期 Java 框架需要数百乃至数千行 XML,才能确定外键命名等细节。DHH 反对的不是配置缺乏表达力,而是几乎没人关心列名究竟写成 post_idpostID 还是其他形式。

  • 选定一个答案并依赖它,这个答案就成为不再需要配置的约定。因此 Rails 是预装完成的:“我不是递给你一盒他妈的乐高,让你自己搭 Millennium Falcon;我给你的是一件完成的玩具。”

  • 开发者仍然可以拆开玩具、替换零件。这样做的目的,是把定制欲望提升到更高的层次,转向真正区分产品的决策,而不是那些不会给用户带来价值、只有替代方案的底层选择。

  • “菜单是 omakase”把这个理念扩展到了整个框架。与可能有25种控制器选项、再乘以数据库和渲染选择的 JavaScript 生态不同,Rails 提供的是由厨师设计的菜单,所有组件都被挑选出来并作为一顿完整的饭共同测试。

22. 单体应用在规模真正击穿理解能力前保留可理解性

  • 从 microservices 这个词出现起,DHH 就一直反对它。在 Netflix 的规模上,数千名工程师和 millions 行代码可能确实需要拆分;但如果只有20名程序员和 half a million 行代码,把方法调用改成网络请求就是“过早拆分”。

  • 他对分布式编程的第一条规则是:“不要分布式地编程。”网络会带来部分失败、延迟、部署协调,以及本地调用不存在的状态;在产品复杂度真正要求这种取舍之前,一切只会先变得更难。

  • Basecamp 和 HEY 各自只有略超过 100,000 行 Ruby,但 Basecamp 展示约420个页面。DHH 认为个人可以理解这个规模的系统,甚至可能理解大两三倍的系统;超过约 half a million 行后,心智模型开始崩溃。

  • 他还把整合延伸到前端和后端。据报道,Gmail 发布约 28MB 未压缩 JavaScript,压缩后约 6MB;HEY 上线时约为 40KB。在他看来,把浏览器和服务器分开,帮助制造了不必要的边界,以及 GraphQL 之类的机制。

23. Active Record 降低 SQL 摩擦,但不假装 SQL 已经消失

  • DHH 称 Active Record 是 Rails 的皇冠明珠。Martin Fowler 的 Patterns of Enterprise Application Architecture 同时提供了模式和名称:表变成类,行变成对象,关系仍然扎根于负责持久化的关系型数据库。

  • 他反对那些保留一个想象中的纯对象世界、再发明复杂转换把对象映射到存储层的对象关系映射器。Active Record 直接接受不纯粹:属性对应列,记录存在 SQL 表中,领域行为可以围绕这个事实叠加。

  • DHH 说,SQL 本身可读,但很啰嗦——每次 INSERT 都要列出列名和对应的值。Active Record 去除重复,把查询组合成方法;它并不允许你不了解 SQL 或数据库行为。

  • Lex 问,简单的生成器是否会让用户变懒。DHH 的回答区分了入门和掌握:Rails 可以在学习者还不理解系统时,就把一个能运行的博客放进浏览器;但这是一张通往下周 SQL 课程的邀请,不是继续无能的许可——这是“一条软跑道”,而且跑道可以无限延伸。

24. Rails 组合多种范式,如今比其教义承认的更看重稳定

  • “没有单一范式”意味着 Ruby 从根本上仍是面向对象,同时在合适的地方借用函数式和命令式技巧。DHH 欣赏函数式编程能够优雅表达一个问题的 90%,但如果剩下的 10% 确实需要可变状态,他就拒绝为此强行扭曲。

  • “提供锋利的刀”是在拒绝 Java 的保护性黄油刀。Rails 接受程序员可能割伤自己,但也能学习并恢复,因为虚拟手指还会重新长出来;强大工具让更深层的能力成为可能,也让学习曲线继续向上。

  • “进步高于稳定”是 DHH 想要重写的教义条目。看着 JavaScript 庆祝3个月一次的变化后,他更加尊重持久性:Rails 7 升级到 Rails 8 几乎无事发生,Rails 6 升级到 Rails 7 也是如此。

  • Lex 认为,技术通常以冰川般速度移动;他职业生涯中的重大转折可能是1995年前后的 Web、2007年的 iPhone,以及今天的 AI。DHH 同意,大多数事情并不会快速变化。Basecamp 最初的 Rails 代码仍在运行,仍然带来 millions 的 ARR,而且依然清晰可辨。

25. 37signals 试过职业化管理,最后又回去了

  • DHH 曾经拒绝工程经理,后来又怀疑每个程序员是不是都需要每周一对一,并连续几年雇用了能力不错的管理者。这个实验让他重新改变主意:“不,不,我当初是对的”——大多数程序员不需要定期治疗式谈话、集体碰头和状态会议。

  • 随着人数增加,管理的理由会变强:初级员工需要指导,协调工作不断累积,也总得有人解决模糊问题。但他的实际发现是,这套结构经常制造出比消除的更多工作和打断。

  • 决定性问题在于,反馈是否来自一个在这门手艺上更强的人。经理可以教人礼貌和沟通,但一旦失去技术手感,就无法深化程序员的工作;DHH 更看重与强实践者一起学习,而不是接受一个从实践者变成身份收集者的人进行职业指导。

  • 他拒绝得出“能力可以为残酷开脱”的结论。他更狭窄的主张是,技艺通过向能够评价工作的人学徒式学习而前进;而当会议取代了自己的编程之后,工程经理很快会变成“尖头发老板”。

26. 两人团队消除了对管理复杂性的需求

  • DHH 认为,John Carmack 领导的 id Software 小团队打造 Quake,代表的不是例外,而是常态:重大突破反复来自个人或小团队。Gmail 同样始于 Paul Buchheit 的副业项目,而不是由层层管理者维护的路线图。

  • 在 37signals,默认单元是一个程序员、一个设计师和一个功能。两个人可以在没有复杂规划、路线图或管理的情况下完成、检查并修改一个东西;他们可以跟随产品中实际浮现的事实,而不是18个月前做出的预测。

  • Basecamp 第一版耗费 DHH 约 400小时劳动,因为他向 Jason Fried 收费,所以这些时间被记录下来——最初约 $15/小时,后来涨到“光荣的” $25/小时。这个单程序员的工作,最终变成了一款累计收入数亿美元的产品。

  • “小不是垫脚石”是业务层面的结论。1,000名 Microsoft 开发者无法靠堆人重做 Basecamp;他们不可避免会创造“1,000个人做出来的那种软件”,拥有不同的范围、妥协和沟通成本。

27. 避免外部资本,保住了 37signals 停止增长的权利

  • DHH 防止被迫扩大规模的第一条防线很直接:“不要拿风险投资。”投资者理所当然地追求最大化财务回报,而 B2B SaaS 的标准剧本会把产品市场匹配变成企业销售,抛弃小客户,扩张销售队伍,最后变成一家拥有1,000人的组织。

  • Jeff Bezos 的投资在结构上不同。他直接从 DHH 和 Jason 手中买了老股;钱没有进入 37signals,两位创始人各自拿到几百万美元,足以获得个人安全感,可以拒绝更大的支票,而不用担心6个月后公司崩溃、自己一无所有。

  • 据报道,Bezos 的投资团队认为价格在经济上不合理,但 Bezos 说自己仍然想支持这两个人。每年的交流带来的是鼓励,而不是运营要求:他告诉他们,他们理解自己的业务,应该继续做他欣赏的工作。

  • DHH 后悔自己曾把那份支持视为理所当然,却又公开批评 Amazon。他持久的教训是 Bezos 非凡的信念:在互联网泡沫破裂前后,Amazon 看起来不理性、也不受欢迎,但 Bezos 追求的时间跨度之长,让 DHH 称自己的长期思维都像“儿童游戏”。

28. 当信任足够深、接触足够少,合作关系就能持续

  • DHH 和 Jason 早年确实在言语上试图“谋杀彼此”;争吵声音大到员工担心公司正在解体。但争论始终围绕想法,情绪强度代表的是寻找更好答案,而不是人身鄙视。

  • 不同的能力边界让信任成为可能。Jason 对设计和产品方向拥有最终决定权,DHH 对技术拥有最终决定权;业务、写作和营销则存在重叠。两个创始人如果专长相同,可能一生都在争论谁更优秀。

  • 当共同领域出现僵局时,Bezos 的“有分歧,但要承诺执行”提供了规则。一方可以认为某个选择是错的,明确记录自己的反对意见,然后支持决定,而不是从内部破坏它。

  • 地理分离帮助他们避免消耗关系。在芝加哥、Malibu、西班牙和哥本哈根之间,DHH 估计他们每周直接交流通常不到2小时:“弹来弹去太多,真正得分太少。”

29. 完整的人生,让一家25年的公司成为可能

  • Lex 承认,远程工作有时会让他因为孤独而主动寻找会议。DHH 真诚又带着调侃的处方是:“找个妻子,生几个孩子。”人需要关系,但工作没必要每周提供40小时亲密感。

  • DHH 和 Jason 约定,如果想让公司存在20年,而不是用5到7年冲刺退出,工作时间大约40小时就够了。家庭、朋友、健康和爱好不是成功之后才领取的奖励;它们是支撑长期工作生活稳定的另外几条腿。

  • “Mojito Island 是海市蜃楼。”有创造力、有野心的人不会享受永久退休;Mihaly Csikszentmihalyi 的 Flow 让 DHH 明白,幸福来自把能力拉到略高于当前水平,而不是消灭所有问题和责任。

30. 广度可能比单项伟大更适合作为人生策略

  • DHH 接受,成为世界第一通常需要痴迷:Ayrton Senna、Michael Jordan 和 Max Verstappen 不会平均分配注意力。他只是从未需要这种交易,也把早期编程失败视为自己不会成为世界最强程序员的证据。

  • 他更偏好的学习交易,是在多个领域达到前 5%,而不是在一个领域达到前 0.1%。他可以写作、编程、赛车、经营公司和养育家庭;在5个领域达到较强能力,远比在一个领域达到绝对精通容易。

  • 创始人很少能复制第一次突破。Basecamp 是 DHH 的“第一个孩子”,后续产品取得了不同程度的成功,却没有重现那道闪电;经验也会消除让第一次冒险变得可以承受的无知,所以如果能告诉年轻时的自己,他什么也不会说,也不愿提前剧透这部电影。

  • “灵感是会腐烂的”,这是他最喜欢的 Rework 文章标题。计划可能杀死动量。DHH 和 Jason 正在构思的新书,讨论信任职业生涯积累出的直觉:创作往往在写作或编码过程中才发现自己的论点,而独立所有权允许人在分析无法表达证据时说“因为我就是想这么做”。

31. 37signals 退出云端,把怀疑转化成了持续利润

  • HEY 最初完全运行在 AWS 上——算力、缓存、存储和数据库都在上面——37signals 的其他服务也使用这一平台。AWS 支出峰值约为 $3.2B–$3.4B,这个数字让 DHH 无法与持续变快的商品化电脑相互解释。

  • 他曾经相信云计算的三段式承诺:通过超大规模供应商的规模经济,变得更简单、更便宜、更快。AWS 在即时配置容量方面仍然无可匹敌,但对稳定工作负载而言,DHH 发现它既没有更简单,也没有更便宜;他还指出 AWS 自己的利润率接近 40%。

  • 从2023年初开始,团队在略超过6个月内,把 7个主要应用的算力、缓存和数据库迁移到购买的 Dell 服务器上,没有再雇一个运维人员。基础设施成本下降约一半到三分之二,每年节省接近 $2M。

  • 预计5年收益约为 $10M,具体取决于会计假设。DHH 接受机会成本的论点:工程师本可以用这些时间开发功能;但他认为,节省直接流向所有者和员工利润分成,因此这种效率在经济和审美上都值得。

32. 拥有硬件,同时恢复自主权与技术直觉

  • 存储迁移花了更久,因为合理的 S3 价格要求客户为 petabytes 级客户文件承诺4年。这削弱了云计算完全灵活、按日使用的形象:真正大的折扣,往往要求客户作出长期承诺。

  • 购买的机器放在专业管理的数据中心,而不是员工桌下。白手套式运营商会更换故障 SSD、把机器装进机架;37signals 看到的是 IP 地址和硬盘上线,体验与云客户相似,但设备属于自己,而且要用上数年。

  • DHH 也看重互联网最初的分布式拓扑。当 AWS us-east-1 故障、网络大半消失时,结果会冒犯 DARPA 所设想的韧性网络;他可以赞赏 AWS 在虚拟化和自动化上的进步,同时拒绝把超大规模云厂商视为最终架构。

  • 他的下一项实验是字面意义上的家庭托管。5Gbps 光纤连接和现代小型服务器,完全可能让 Basecamp 走过很长一段增长期;家庭实验室让车库创业在物理层面复活,而 NVMe 和 SSD 也显示出,硬件进步往往已经悄悄推翻旧假设,旧假设却仍然留在行业里。

33. 技术扎实的领导者能识别人才,也能要求简单

  • DHH 认为,Elon Musk 吸引人才多于发现人才。Lex 说,登陆火星、电动化交通、用互联网覆盖地球等使命,会成为那些寻找大胆冒险的人眼中的灯塔;DHH 同意,这种大胆会激励人。

  • DHH 补充的重点是,Musk 具备足够能力直接评价工作。理解底层技术工作的领导者,能辨认谁在“胡说八道”,把所有权交给有能力的人,并告诉团队,设计可以更简单,同时增加实质内容,而不是只说“做快一点”。

  • Steve Jobs 也代表了类似组合:品味、对可能性的切实理解,以及对平庸结果的个人冒犯。这个标准当下可能让工程师感到渺小,但 DHH 认为,它有时会释放出团队最初认为不可能的解决方案。

  • Lex 提到 Musk 会把领导权交给没有传统履历的人;DHH 强调,37signals 也在小规模上采用同样做法。履历和名校背景不是决定因素:量身定制的求职信能证明远程工作所需的写作能力,而真实的编程测试则能让 DHH 判断,自己是否愿意在5年后继续维护这个候选人写的代码。

34. Apple 的收费站,破坏了一段建立20年的关系

  • 2000年代初,Mac 采用 Unix 底层后,DHH 成了 Apple 传教士,因为这让他逃离了那个“切断 Netscape 氧气供应”的 Microsoft。他说服同学、出现在 Apple 开发者广告中,并预期自己会永远使用 Mac。

  • 2007年第一部 iPhone 发布时,他排队约5小时,也参与了员工为买家鼓掌的仪式。后来他才意识到,iPhone 不只是一部手机,而是软件企业必须触达大多数客户的主要电脑。

  • App Store 把这种访问权变成许可,并设置了 30% 的收费站。DHH 的反对既涉及钱,也涉及控制权:Apple 掌握客户的账单关系,使退款、折扣、支持,以及客户在 iOS、Android 和 Web 之间迁移都变得复杂。

  • HEY 花了2年和 millions 美元打造,因为 DHH 想在同时控制服务器和客户端的情况下重新思考电子邮件。他原本以为 Gmail——按他的估计,负责美国约 70% 的电子邮件——会是无法挑战的对手;没想到 Apple 先成为迫在眉睫的生存威胁。

35. HEY 通过让拒绝的代价高于批准活了下来

  • Apple 在 HEY 2020年上线前批准了其初始 iOS 应用,却拒绝了第一个 bug 修复更新,并以缺乏应用内购买为由威胁下架。Basecamp 多年来一直只是供网页订阅客户使用的伴侣应用,这次政策逆转让 DHH 感到规则是临时编造且带有歧视性。

  • DHH 拒绝让步:他不会把 30% 交给 Apple,也不会放弃直接客户关系。距离 WWDC 只剩一周,37signals 又拥有公开平台,于是他“把音量开到11”,让 Apple 关于关爱开发者的宣传,不得不与“摧毁独立开发者”的鲜明故事竞争。

  • 最初的冲突持续了几天,之后变成一场为期两年的拉锯战,最终以不体面的停战结束。HEY 保留外部支付并继续留在商店,同时构建了一个虚拟账户体验,让下载应用的用户在已有客户登录前,至少能完成一些操作;DHH 说,这条规则似乎是 Phil Schiller 在媒体压力下制定的。

  • 他的愤怒真实到曾表示宁愿烧掉整个业务,也不会屈服。他称这种愤怒是一种挥发性化合物,因为员工和客户也承担风险;但他相信,除非创始人能够可信地拒绝一个经济上很有吸引力的屈服方案,既有平台不会真正妥协。

36. Epic 狭窄的法律胜利,重写了移动支付经济学

  • DHH 认为,Tim Sweeney、Mark Rein 和 Epic 对 Apple 的 App Store 体系造成了唯一一次真正严重的创伤。据报道,Epic 花费远超 $100M 的法律费用,印证了律师此前对 37signals 的警告:一场诉讼至少要花 $10M,并耗时5到7年。

  • Apple 最初在11项指控中赢下约10项;Epic 的狭窄胜利确认开发者可以把用户链接到外部支付。DHH 认为,Apple 本可以接受这一结果,却选择进一步阻挠,最终激怒法官并触发刑事藐视法庭转介,把一场小败转化成了更广泛的救济。

  • HEY 计划立即使用这项规则:iOS 用户可以开始注册,点击链接去网页输入银行卡,再回到应用里;这样在 Android 和桌面端都保留同一个直接订阅,不用向 Apple 支付 30%。

  • DHH 认为,只有创始人控制的公司才可能发起并维持这种斗争。传统董事会不会批准花费超过 $100M,把一个赚钱的特许经营业务押在原则上;Sweeney 愿意“把整家公司他妈的都赔进去”,却为从未资助这场诉讼的开发者创造了价值。

37. Apple 仍然非凡,但累积的账单已经到期

  • Lex 反驳说,30% 的争议只是一个切片,而 Apple 在硬件和设计上仍然无人匹敌。DHH 同意,并称失望与欣赏成正比:Apple 收购 PA Semi、坚持 Arm,最终带来了 M 系列芯片,也加速了硬件进步。

  • 他的批评是,收费站经济学损害了开发者信任。他认为 Vision Pro 生态疲弱,部分原因在于开发者已经不再主动把最好的工作交给 Apple;这说明,一个平台暂时可以握有所有牌,却可能同时破坏推动下一个品类所需的关系。

  • DHH 曾认为,Tim Cook 非凡的运营表现证明,一个物流型领导者可以无限期保留 Jobs 的体系。现在他认为,账单只是被延迟了:软件质量正在下降,Apple 落后于 AI,而使用 TSMC 的竞争对手已经可以逼近其制造优势。

  • 他还指出了继任风险:按他的说法,Apple 董事会平均年龄约75岁,高管年龄超过60岁。45岁的 DHH 已经必须强迫自己成为 AI 新手;他怀疑一个年龄大得多的领导层,能否在没有创始人那种“不合理的好奇心”时拥抱范式转变。

38. 做父亲扩大了 DHH 对美好人生尺度的感知

  • 在认识 Jamie 前,DHH 不确定自己是否想要孩子。Jamie 明确想结婚并生3个孩子,她的确定性把模糊的“以后再说”变成了决定;回头看,他把没有孩子的那条人生分支视为一种可能具有存在主义性质的遗憾来源。

  • 育儿带来了一条语言无法传达的真理,尽管每个父母都公开重复过它。看着孩子理解或完成某件事,他才发现自己的满足感量尺不是从 1 到 10,而是“从 1 到 100”;此前他误把低端区间当成了全部世界。

  • 他过去对别人的婴儿没有太多感觉,因此没有情绪上的类比。对自己孩子的爱在孩子还不会用语言回应之前就已经到来;不一定是瞬间发生,但一旦发生,“就像被马踢了一脚”。

  • DHH 愿意“毫不犹豫地”用软件、公司、赛车以及其他所有成就,换回自己的3个儿子。因为这句话听上去像陈词滥调,他认为父母有义务重复说明它是字面意义上的真实,尤其是在社会上有更多、更善于表达的反婚姻和反生育论述时。

39. 移除家庭制度,制造了社会没有计价的二阶效应

  • DHH 和 Lex 认为,西方家庭形成率下降的背后,是一套失灵的配对系统。技术似乎改善招聘的程度,超过了它改善友谊和浪漫匹配的程度;约会工具扩大了理论上的选择,却让稳定结合变得更难。

  • DHH 说,选错伴侣的代价可能很高,同时也提到一位离婚的朋友仍然爱自己的孩子,并让这种局面运转下去。他并不是说所有情况下都应避免离婚,但表示自己不知道那种离婚是否会摧毁自己。

  • 他把婚姻、宗教和继承下来的规范视为 Chesterton 的围栏。更容易离婚或宗教信仰衰退,可能移除一些旧约束;但文明也把承重型协调机制编码进制度里,而社会经常在建立替代品之前,就先删除了旧软件。

  • DHH 并不信教,却“有点希望自己信教”,因为他如今把宗教看作个人和社会的操作系统。就像没人完全理解、却不能安全替换的遗留 COBOL,一些规则是过时遗物,另一些则维持系统运行;而现代替代品往往更糟。

40. 孩子把工作限制在时间盒里,而不是消灭生产力

  • DHH 的家庭结构很重要:Jamie 离开了公司工作,承担了大量日常育儿,他不愿把这简单描述成无偿劳动。养育孩子本身可以是有价值的工作,而不是雄心失败;但他把这种安排呈现为个人选择,不是普遍处方。

  • 他每天约 6:30 起床,打1到2局 Fortnite,8点前送孩子上学,再从约 8:30 或9点工作到 5:30 或6点。晚餐和阅读结束工作日;未完成的任务留到明天,而不会渗入夜晚。

  • 这条边界没有减少他约40小时的工作量,却让这个数字更诚实。那些声称每周工作80或100小时的人,通常把会议、分心和低价值移动也算进去;3到4小时不被打断的时间,可以把一个有意义的问题推进很远。

  • 家庭也创造了共同游戏,而不只是义务。自2019年以来,DHH 玩 Fortnite 约 1,000小时,几乎都和孩子一起;现在他还会看着大儿子提高卡丁车水平——这些经历让再多发几封邮件,都显得不值得用来结束一条延续了30,000年的血脉。

41. 赛车成了 DHH 进入心流的可靠机器

  • DHH 在哥本哈根长大,那里汽车税高到实际上让买家付3辆车的钱才能得到1辆车,所以他直到25岁才拿到驾照。赛车游戏更早提供了这种迷恋;搬到美国后,他才真正需要开车。

  • 两年后,一位朋友带他去芝加哥附近的 Autobahn Country Club,让他坐进一辆老式单座 Mazda 赛车。大约20圈后,他获得了与 Ruby 带来的近乎宗教式确认相同的感受:裸露的车轮、坚硬的光头胎、路面起伏和暴露感,让速度变得可触可感。

  • 这种陶醉发生在“抓地力边缘”:轮胎只滑动几度,车辆就能最快旋转。再多一个极小的输入,就可能开始打转,甚至撞墙;DHH 把其中的风险比作赌博,因为可能失去真实东西,会改变心理游戏。

  • 编程的心流取决于找到恰到好处的问题。赛车几乎可以按需制造这种问题,因为高速生存会占据他 100% 的注意力:没有晚餐、会议或发布,只有“你和下一个弯”。

42. 勒芒的掌控力来自重复、数据、神经与被接受的危险

  • DHH 在2009年开始严肃参赛,2012年参加 24 Hours of Le Mans,灵感来自同为丹麦人的 Tom Kristensen——后者创纪录地赢了9次。比赛由3名车手共同完成;规则规定一名车手在6小时内最多驾驶4小时,而 DHH 个人最长的一次连续驾驶约为两个半小时。

  • 一辆 LMP2 赛车要在约60辆车中穿行:超越更慢的 GT 赛车,同时被 hypercar 超越。DHH 试图“变成一台机器人”,为每个弯道加载一套程序——刹车点、压力曲线、转向、油门——然后与职业队友对比遥测数据,精确到 100毫秒的损失。

  • 轮胎约在40分钟后可能明显衰退,天气会改变抓地力,而一辆约 2米宽、5米长的车必须在后视镜很差的情况下,与对手在几英寸的距离内完成超车。职业车手结合心中的空间模型和约 200毫秒的反应速度;哪怕 10毫秒或20毫秒,也可能决定起步或挽救一次侧滑。

  • 危险仍然是承重结构。DHH 描述过队友的重伤,以及一位丹麦车手在他赢得组别冠军前一年遭遇致命的 90g 撞击;驾驶时他不会有意识地思考死亡,因为那会阻止他保持速度,但无法按下重置键这一事实,正是吸引力的一部分。

43. 个人技术栈让每次交互都即时且有触感

  • 约20年来,DHH 的答案一直是 Mac、Apple Magic Keyboard、一块大显示器和虚拟桌面。离开 macOS 后,他仍使用 Apple 的 32英寸 6K XDR 显示器,因为还没找到更好的屏幕。

  • 他目前的机器运行 Ubuntu 和 Omakub,这是一套可复现的配置,能在不到30分钟内配置好一台全新的 Linux 电脑。Linux 更接近他的服务器,允许更多个人表达,还能在大约一个屏幕刷新时间内切换虚拟桌面,不必承受 macOS 的动画。

  • 硬件很重要,因为程序员整天都在触摸它。使用 Apple 低行程键盘多年后,Lofree Flow 84 机械键盘让他产生了“天使在歌唱”的反应;鼠标则配 Logitech MX Master 3S,他喜欢它的手感胜过外观。

  • TextMate 由他的老朋友 Allan Odgaard 创建,DHH 早期也曾鼓励他,这款编辑器延缓了 DHH 离开 Mac。Neovim 最终在3天咒骂和一周转换后取代了它;LazyVim 提供了成熟发行版,因此采用 Vim 不必阅读17篇配置教程。

44. DHH 按领域推荐语言,并把自己认作软件写作者

  • 对于面向 Web 的初学者,DHH 的选择顺序是 Ruby、JavaScript、Go。Ruby 移除了基础概念上的仪式感;JavaScript 不可避免,因为 Web 是“有史以来最伟大的应用平台”;Go 则适合 HTTP 代理等底层 Web 基础设施。

  • 如果学习者想做 Web 应用,他建议立刻转向 Rails,因为真实欲望比抽象语言规范更能驱动学习。Ruby 不适合 3D 引擎或 Unreal 的 Nanite,正如 Go 的速度和原语也不会让 DHH 选择它来编写业务领域逻辑。

  • Lex 说自己从未用纯函数式语言构建过真实东西,觉得这有点丢人;DHH 同意,他自己的问题是找不到一个真正想构建的项目。对象仍然是 DHH 切分业务领域的方式,而函数式技巧则是他在局部问题上借用的工具。

  • “软件工程师”并不准确描述他的工作。DHH 称自己是软件写作者:在 Ruby 中,解决问题与表达问题是同时发生的,就像博文往往在写作过程中才发现论点;他和 Lex 认为,AI 可能让这一人类可读、具有文学性的层面更重要,而不是把它消灭。

45. 可持续的开源始于自利,而不是客户义务

  • Rails 让 DHH 明白,把用户当成付费客户,是通向倦怠的捷径。早期有人要求支持 Oracle,并威胁说否则 Rails 永远只是玩具;他在一张臭名昭著的会议幻灯片上回答:“去你的”——这个项目是礼物,不是供应商合同。

  • 用户可以根据许可证拿走、分叉并改进代码,维护者也可以选择自己的优先级。DHH 引用 Adam Smith:他构建自己需要的功能,因为自利会产出更好、更聚焦的软件,而不是去履行那些自己无法亲自评估的问题所带来的假想用户义务。

  • 因此,开源并不会仅仅因为维护者没有获得普遍资金就陷入危机。大多数开源工作本来就来自商业公司贡献自己需要的基础设施;任何需要报酬的人,都可以出售软件,或从事能够资助开源开发的工作。

  • 他偏好 MIT 许可证而不是 GPL:按他的转述,它是在说软件不提供担保,用户不能起诉,而且可以“他妈的想怎么用就怎么用”。资金和捐赠模式可以共存,但事后期待会污染那种清晰性;正是这种清晰性,让商业软件和开源软件停止互相敌视。

46. WordPress、财富与乐观,最终都归结为尊重最初的交易

  • DHH 称 WordPress 是互联网最伟大的开源项目之一,也赞赏 Matt Mullenweg 让大范围建站成为可能。但他谴责 Mullenweg 与 WP Engine 及 Silver Lake 的斗争:把代码按许可证发布,不代表后来可以因为接收者变得成功,或贡献低于预期,就要求对方支付赎金。

  • 个人背叛感或许可以解释愤怒,却不能凌驾于许可证之上。DHH 敦促 Mullenweg 承认自己押错了,然后放下剑;一个“疯王”威胁的不只是 WordPress 的信任,也威胁每一家正在评估开源基础设施的企业,因为它们会担心未来有人要求分走收入。

  • 据报道,Rails 已经驱动超过 1 million 个应用,但 DHH 并不后悔没有向每个受益者收费。Basecamp 已经给了他足够多;最大化每一块可得美元,会牺牲心流和“涅槃”般的空日程。所有财富层级的人都想象自己需要正好两倍的钱,这说明终点会不断后退。

  • 他的文明层面结论同样要求谦逊。核武器可能阻止了大国直接战争;气候干预可能有帮助,也可能适得其反;疫情专家已经证明,资历并不能保证远见。既然他无法知道结果,DHH 选择乐观:人类总能不断构建解决问题的方式,而“我们在想象中承受的痛苦,比现实中承受的更多”。