第 474 期·中文精读

DHH:编程的未来、AI、Ruby on Rails、效率与育儿

DHH: Future of Programming, AI, Ruby on Rails, Productivity & Parenting

Ruby on Rails 创始人谈 AI 对开发者的冲击、编程的未来与远程工作方法,也聊为人父的体会。

官方音频00:00 / --:--
中文精读由 AI 基于原始访谈改写,非官方翻译,可能存在偏差或错误;表述以原音频与官方文稿为准。说明

全世界没有一个人认真相信 cookie banner 对任何人有好处,可就是没人能摆脱它。DHH(David Heinemeier Hansson,大卫·海涅迈尔·汉森)在 Lex Fridman 的播客里,用这句话给 GDPR 的十年做了判决。

GDPR 实施十到十二年,在 DHH 看来,它在所有可衡量的指标上彻底失败。唯一受益的是律师、会计师和官僚。他说欧洲在"善意导致恶果"这件事上做到了世界一流。

没有人相信 cookie banner 对任何人有好处,可我们就是无法摆脱它。它是善意直接通往地狱的纪念碑,而欧洲在这件事上确实是世界级的。(DHH)

他甚至推演了一个荒诞场景。坐马斯克的火箭去火星访问网页,依然会看到 cookie banner。火星到地球的 ping 延迟一百五十秒,页面加载完,还需要四十五秒才能点完那个弹窗。全世界都被它覆盖,无人能逃。

这个开场很能说明 DHH 是个什么样的人。他不关心一件事的初衷有多高尚,只关心它实际产生了什么。后面整场对话,无论是谈编程语言、谈云服务、谈苹果,还是谈家庭,他都用同一把尺子衡量:这个东西真的让人过得更好吗?

三次尝试,一次开窍

DHH 学编程,前两次都失败了。

六岁那年他想要一台 Commodore 64,父亲却带回一台 Amstrad 464。他从杂志上抄游戏源代码,一抄两个小时,常常因为一个拼写错误全盘失败。他理解了常量,却理解不了变量的意义。后来他发现了盗版游戏,干脆放弃学习。

十一二岁他拿到 Amiga 500,试了 EasyAMOS,学会了条件语句和循环,却连一个最基础的游戏都做不出来。他开始怀疑自己不够聪明,数学不够好。这种自我否定持续了很多年。

第三次是大约二十岁。九年级时他接触到互联网和 Netscape Navigator,用 HTML 让文字闪烁,第一次获得正反馈。他做游戏评测网站,先学 ASP.NET,后来转向 PHP。写 PHP 的时候,他开窍了。

十四岁那年,他在哥本哈根的小卧室里运营一个 BBS,接了三根电话线。父母知道他有电脑和电话线,但不完全清楚他在倒腾盗版软件。丹麦的成长环境里,没人对盗版有道德质疑。他曾经花一个月送报纸挣的钱,买一个 Sega Master System 游戏 After Burner II,六百克朗。他还坐火车从哥本哈根到日德兰半岛参加 demo party,拖着一台十四寸 CRT 显示器。

demo scene 是用 4KB 内存做出接近音乐视频的东西,通过邮寄 3.5 寸软盘来交换作品。那种极致的资源约束,和后来他追求的美学一脉相承。

PHP 给的那口甜

PHP 给 DHH 的东西很具体。九十年代末写 PHP,写脚本、FTP 上传、即时部署,不需要 web 服务器,不需要任何设置。他把这种体验称作 web 开发者人体工学的巅峰,整个职业生涯都在追逐那种快感。

我们是怎么丢掉这种敏感度的?让人能这样工作,还能把新人带进这个行业,给他们那种成功体验。(DHH)

他赞赏 Pieter Levels 至今还在用 PHP 加 jQuery 加 SQLite 运营多个业务。这证明那种方式真的能跑,跑得还挺好。行业后来把这条路弄丢了,而且丢得理直气壮。

JavaScript 的十年混沌

2010 到 2020 这十年,JavaScript 社区在框架和工具链上的更迭荒谬至极。一个用 Webpack 的项目,放下五分钟,它就编译不过了。DHH 的原话是"为什么所有东西永远在坏"。

JavaScript 社区,尤其是框架和工具,在 2010 到 2020 这十年里的更迭量,是荒谬的。(DHH)

浏览器技术本身也曾经停滞。IE5 赢了之后,微软解散了浏览器开发团队,整个 web 十年不动。是 Chrome 和 Google 把 web 重新推向前。DHH 承认复杂性有时候是桥,是过渡,但代价大得离谱。

他这里埋了一个判断:复杂性本身没有错,错的是把它当成终点。一座桥你可以走过去,但如果所有人都住在了桥上,问题就大了。JavaScript 生态那十年,太多人把桥当成了家。

Chrome 不该被拆

美国司法部想拆分 Chrome,DHH 的反应只有一句话:这是场灾难。

在技术领域所有关于垄断的问题里,Chrome 是最不该动的那个。(DHH)

他的理由是,浏览器领域基本不存在垄断问题。有 Firefox,有 Safari,有 Chrome,用户有选择。Chrome 是给 web 开发者的完整礼物,Google 值得巨大赞誉。真正的问题在移动手机上那个收费站,也就是苹果的 App Store,不在开放 web 上。要反垄断,该冲着 Google 的广告业务去,而不是 Chrome。

这个立场和他后面谈苹果、谈 HEY 的那段故事,是同一个逻辑的两面。开放 web 是他眼里少有的、还站在开发者这一边的地方,他不想看着它被拆掉。

Ruby:为大脑定制的手套

DHH 是通过 Dave Thomas 和 Martin Fowler 在 IEEE 杂志上的一篇文章发现 Ruby 的。那篇文章用 Ruby 来解释编程模式,因为 Ruby 看起来就像伪代码。Ruby 由松本行弘(Matz)在 1993 年开始开发。

DHH 给自己两周时间写一个概念验证,结果一个周末就完成了。他被彻底震撼。

Ruby 像是为我的大脑量身定制的手套,而缝制它的人我从未见过。这怎么可能?(DHH)

Ruby 的核心设计目标是程序员幸福感(programmer happiness)。对比之下,James Gosling 设计 Java 时的哲学是:普通程序员是愚蠢的生物,不能信任他们使用复杂语言。两种世界观,导向两种语言,也导向两种工作方式。

Ruby 的美学,DHH 举了几个例子。5.times,数字 5 也是对象,可以调用方法。initialize 对比 Python 的 __init__(self),干净太多。if user.admin?,那个问号是给人类看的交流工具,对计算机毫无意义,但正是这种冗余让代码读起来像人话。user.downgrade unless user.admin?,用 unless 替代 if !,更自然。还有 5.days,是 DHH 通过 Active Support 加到 Number 类上的方法。

它读起来像诗。(DHH)

他还提到 Matz 的信任。一个来自丹麦的陌生人,去改动他心爱的作品,Matz 允许了。这种信任程度基本闻所未闻。

静态类型之争与 Shopify 的账单

DHH 誓死捍卫动态类型。他认为静态类型让元编程更难,美学上也令人反感。静态类型里写 User user = new User(),同一个词 user 出现三次,纯属浪费。他不用 IDE,不用自动补全,用文本编辑器徒手把代码凿出来。

我不是用工具写代码,我用文本编辑器。我用双手把它从屏幕上凿出来。我不用自动补全。(DHH)

他认为自动补全会提高你对样板代码的容忍度,因为你打得快,就不觉得它在浪费你的生命。

他也承认,千万行、几千个程序员的大型代码库需要不同的方法。他反对的,是把这套东西强加到个人项目上。

用你的帕加尼去 Costco 买杂货。那是个糟糕的交通工具。(DHH)

支撑他观点的是真实数据。Shopify 在黑色星期五达到每秒一百万动态请求,运行着全球约 30% 的电商店铺,它的单体应用约五百万行代码。如果换成 Go 或者 Java 写,同样功能需要两千五百万行。Shopify 约一万名员工,市值一千二百亿美元,每季度 GMV 两千五百亿美元。它的创始人 Tobi Lütke 曾是 Rails 核心团队成员,写了 Active Merchant 和 Liquid 模板语言。

Ruby 是奢侈品语言。最高级的奢侈品。它是编程语言里的香奈儿。(DHH)

扩展性其实是一道经济学题

DHH 把扩展性拆成两个维度。一个是运行时性能,也就是单请求的执行速度,目标三百毫秒以内,理想是一百毫秒。另一个是水平扩展,加服务器就行,Shopify 用一千台服务器处理每秒一百万请求。

真正的扩展难点是数据库,是 MySQL,编程语言根本排不上号。Twitter 从 Rails 切走之后,DHH 说它十年零创新,这是 Rails 最好的广告。

他算过一笔账。37signals 大约 15% 的运营预算花在 Ruby 应用服务器上。就算换一门快一倍的语言,也只省下七个百分点的预算。而如果 Ruby 和 Rails 能让程序员生产力提高 10%,那个影响远远大于省下的 CPU 周期。

关于 Ruby 扩展性的问题,本质是经济问题。(DHH)
不是 CPU 核心。是 web 核心,是人力的核心。是人理解和运转系统的能力。(DHH)

大多数关于语言性能的争论,其实都在讨论一个错误的成本项。机器贵还是人贵,答案早就摆在那了,只是争论的人不愿意承认。

AI 让能力从手指间流失

DHH 喜欢用 AI 协作,但有个硬规矩:不让 AI 驱动写代码,只在单独的窗口里用它当参谋。他觉得 AI 有点太慢,像回到需要等编译的时代。

他最大的担忧是,能力从手指间流失。

我能真切感觉到,能力正从我的手指间流走。(DHH)

他举自己写的 Omakub 项目,一个用 Bash 写的 Ubuntu 定制版。让 AI 写代码的时候,他没学到任何东西。自己一个字一个字打的时候,他学到了。

你是用手指学习的。你要学吉他,可以看无数 YouTube 视频,但你还是学不会弹吉他。(DHH)

他说 AI 让他每天聪明 0.5%,但让 AI 驱动的时候,他每天笨 0.5%。他把 AI 看成结对编程伙伴,一个可以问愚蠢问题而不会被评判的对象。

Anthropic 的 CEO 预测年底 90% 的代码由 AI 写,DHH 说他不止一点怀疑。

第一条规则,没人他妈知道任何事。没人能预测六个月之后会发生什么。(DHH)

但他也接受一个可能:编程也许会变成"马"。从交通工具,变成休闲活动。一个人承认自己热爱的东西可能被时代降格,需要勇气。

Rails 的九条信条

2012 年 DHH 写下 Rails 的九条信条,原因很简单:如果不把价值观记录下来,社区就会迷失。

第一条,优化程序员幸福感,致敬 Matz。接受美学和其他目标之间的权衡,允许模糊。IRB 里 exit 和 quit 都能退出,Python 里你打 exit,它会给你上一课。

第二条,约定优于配置。反对 Java 框架那种几百行 XML 配置。系统应该预装好,不用你从一盒乐高开始拼。

约定优于配置,本质是说系统应该预先组装好。我不是递给你一盒该死的乐高,让你拼千年隼。我给你的是一件成品玩具。(DHH)

第三条,菜单是 Omakase,厨师精选。Rails 是解决 web 问题的完整尝试,所有拼图预先配置。对比 JavaScript 生态,没有人负责菜单,N 乘 N 乘 N 种排列组合,没有保留的智慧。

第四条,单一范式。Ruby 的核心是面向对象,也借鉴函数式和命令式。Rails 同样把各种最佳理念重新混搭。

第五条,追求优美代码。class Project 继承 ApplicationRecord,belongs_to :account,has_many :participants,validates :name,presence: true。读起来像俳句。

第六条,提供利刃。反对 Java 那种"不给你 foot gun"的哲学。信任人类,允许危险操作,割伤一次就学会了。

第七条,价值集成系统。Rails 解决整个 web 问题,不做零散组件。

第八条,进步优于稳定。DHH 承认这条已经过时。Rails 8 对 Rails 7 用户基本是无操作升级。是 JavaScript 社区的混沌让他改变了看法。

第九条,隐含的:单体优于微服务。

分布式编程第一法则:不要分布式你的编程。(DHH)
微服务……当你把这个模式用到二十个程序员、五十万行代码的团队上,你就是个白痴。(DHH)

这些信条背后是具体的产品。Basecamp 约十万行 Ruby 代码,约四百二十个屏幕。HEY 也是约十万行。HEY 发布时前端只有 40KB,Gmail 压缩后约 6MB,未压缩 28MB。Basecamp 首版由 DHH 一人在 2004 年用四百小时完成,至今创造数亿美元收入。

四百小时,一个人,一个周末到几周的量级。工具选对了,小团队能做出后来几十年都在产生现金的东西。

SQL 为什么一直没死

ActiveRecord 这个名字直接来自 Martin Fowler 2001 年的《企业应用架构模式》,那本书里就有这个模式名。核心思想很简单:表对应类,行对应对象。

它没有把 SQL 抽象掉,反而让 SQL 更简洁,更适合构建领域模型。

DHH 批评其他 ORM 试图活在纯对象世界里,然后发明一套复杂机制来回翻译。他认为程序员应该理解 SQL,哪怕用着 ORM。

SQL 是那些经受住 NoSQL 冲击、至今仍然统治的东西之一。(DHH)

这句话放到今天依然成立。当年喊着要取代 SQL 的一批数据库,大多已经变成了 SQL 数据库。持久的东西往往跟时髦无关,靠的是把问题切得准。

不要经理,要小团队

DHH 反对工程经理这个角色。他做过两年实验,雇了很优秀的工程经理,结论是:我原来是对的,我们不应该有经理。

经理的问题在于很快失去技术手感,变成"尖头发老板"。最好的反馈来自比你更擅长你工作的人,经理给不了。

37signals 的默认配置是小团队,两个人,一个程序员加一个设计师。没有经理,就不需要计划,可以跟随从代码里涌现的真相。小团队本身就是目的,不必把它当成通往大团队的垫脚石。

你没法用一千人的团队做出 Basecamp 这样的软件。你会做出一千人做的那个软件,那完全是两回事。(DHH)

他也反对 VC。拿别人的钱,意味着他们要回报。

不要拿风险投资。(DHH)

37signals 有个数据很有意思:十九年没有全职财务人员,后来因为没有收销售税被罚五百万美元,才不得不雇。他们还曾有过十年全职数据分析师,后来选择用财务人员替代。这种近乎偏执的精简,和他在云服务上的做法是同一种性格。

Jason Fried、Bezos 与一段被当成理所当然的信任

DHH 和 Jason Fried 合作了二十五年。两人住在不同城市,每周直接交流不到两小时。早期产品讨论激烈到员工担心公司要散架,但争论针对想法而非个人:Jason,你是个白痴,你是个白痴是因为你看这个问题的方式错了。

两人各有明确的能力领域。Jason 信任 DHH 的技术决策,DHH 信任 Jason 的设计和产品方向。他们刻意避免把彼此耗尽,因为关系有有限的交换量。两个人都喜欢做具体工作,DHH 编程,Jason 设计,不满足于只是头脑风暴。

Bezos 通过私人办公室买了二级股份,金额几百万美元,从 DHH 和 Jason 个人手中买,钱没进公司账户。DHH 说这是疫苗,让他们有底气拒绝 VC。

写投资提案的时候他们大笑,故意写了个疯子才会接受的价格。Bezos 的投资团队说这毫无经济意义,Bezos 说:我不在乎,我想投资这个人。

Bezos 每年和他们会谈一次,说的话是:你们在做很棒的事,继续做。我不懂怎么经营你们的业务,你们懂。

DHH 从 Bezos 那里学到长期信念和 disagree and commit。他对这段关系有一些遗憾,因为曾把这种信任视为理所当然。他还说,会议有毒。

会议有毒。(DHH)

恨意是热爱的副产品

DHH 引用 Kathy Sierra 的博客 Creating Passionate Users。如果你创造出有价值的东西让很多人喜爱,必然产生等量的反作用力,也就是恨你的人。

如果你在创造有价值的东西、让很多人热爱它,你必然创造出等量而反向的恨意力量。唯一逃脱它的方式是平庸。(DHH)

任何试图讨好所有人的人,最后只能平庸。反过来说,如果身上一点争议都没有,可能该反思自己到底做了什么。

流、自行车与 top 5%

DHH 引 Mihaly Csikszentmihalyi 的《Flow》。这本书的研究起点是"为什么有些人幸福、什么时候幸福"。结论是,人最幸福的时刻,是能力被拉伸到略超当前水平的时候,而不是坐在 Mojito Island、没有义务和责任的时候。

流状态里人会忘记时间空间。编程一个难题,你以为过了二十分钟,实际过了三小时。人回望这些时刻会感到最大的快乐。如果移除所有问题,人会抑郁。

成功卖掉公司后,退休两周就会无聊到极点。失败则后悔过去十年。继续经营也永远不会更容易。如果只留下工作,会全面失败。DHH 想要流带来的幸福,但要以能持续四十年甚至五十年的方式做。

第一次体验只发生一次,大多数人无法第二次复制成功。Basecamp 是 lightning in a bottle,第二家公司很少能同样成功。创始人容易傲慢,认为成功只因自己厉害,但有时只是时机之门打开又关闭。

如果问他想对年轻的自己说什么,他说不会说任何话,不会剥夺因无知而获得的人生经历。智慧要一次一次摔碎再重建。新起点最大的祝福,就是不知道会有多难,不知道自己不知道什么。

责任是意义的关键。Jordan Peterson 教他表达这一点,Viktor Frankl 在《Man's Search for Meaning》里说,只要有理由,人能忍受任何苦难。

二十岁、三十岁、四十岁都不可回。Derek Sivers 有个自行车的比喻:全力骑十九分钟,或者享受风景慢 5% 用二十一分钟,只差两分钟。

如果想成为世界第一,必须牺牲一切,痴迷于一件事。DHH 不追求第一。他自认不是最聪明、最好、最有天赋的,但能组合不同领域。top 5% 比 top 0.1% 容易二十倍或一百倍,你可以在五件事上同时做到 top 5%:写作、赛车、编程、经营公司、家庭。

Karl Marx 描述过早上钓鱼、晚上锤铁、周末画画的生活。DHH 无法忍受单一隧道视野带来的异化。深度编程数周甚至数月之后,必须浮上来做别的事,再以全强度回来。

从云端搬回自己的机房

批评者说,如果 37signals 追求 moon、VC、AI,可能大一百倍。DHH 承认机会成本真实,但以公司这个规模来看,每年省下两百万美元基础设施账单,其中一半到三分之二直接进入底线,归所有者和员工分红,这笔账值得算。

他反对硅谷那种"成本不重要"的思维。低效业务和低效程序一样像脑中刺,看 expense report 里的浪费让他不适。

AWS 曾经用于一切,包括 HEY,总云账单峰值约三百二十万到三百四十万美元。云的推销话术是更快、更容易、更便宜,DHH 曾经相信,决定不再拥有服务器。后来他发现 AWS 运营着约 40% 的毛利,云的那套话术在他看来根本站不住脚。

AWS 也没有更容易。IAM 规则、access parameters 之类的东西复杂得很。迁出自有硬件后,没多雇一个人,团队不变。

"更快"只在需要十五分钟内上线一千台机器时明显,日常用不到。买服务器便宜得多,可以买更多机器,不必追求自动缩放的极致效率。

2023 年初他受够了账单,六个月内把七个主要应用从云端迁到自有服务器,包括 compute、caching、databases。服务器从 Michael Dell 那里买,Dell 已经营业四十一年。S3 因为四年合同继续使用,云里拿到好价格通常需要多年合同,compute 常是一年合同。

他预计五年省约一千万美元,基础设施支出降一半到三分之二。

DARPA 原设计是分布式网络,没有单一节点控制一切。US-East-1 宕机时,看似三分之一互联网离线,这是对 DARPA 设计的侮辱。

自有硬件现在完全可行。现代 CPU、1U 机器的内存容量、TSMC 和苹果推动的进步,年增 15% 到 20%。NVMe 和 SSD 改变了系统设计。摩尔定律本应让价格下降,云却反着来。

自有机器有痛点。计算机固有痛苦,需要机架、网络、专业 know-how。但整个互联网曾经就是靠插以太网、插电源、启动 Linux 建成的。

数据中心用 Summit,前身是 Deft,白手套服务,DHH 不亲自去。看到 IP、drives 上线,体验类似云,但便宜很多。

他还提到 homelab:个人服务器、家庭光纤 5 gigabit。2004 年的技术和 100 megabit cable 就能支撑 Basecamp 数百万 MRR。从卧室就能启动公司。

xAI 不租对手的 GPU,自建十万块 GPU 的帐篷,以创纪录速度搭起来。拥有硬件在小型、中型、前沿计算三个尺度上都有优势。

招聘、Elon、苹果与 HEY 的那场仗

DHH 招聘不看简历、学校、成绩、血统,看 cover letter 和编程测试。远程工作要求好写作,编程测试模拟真实工作。他多次被代码质量颠覆预期:简历完美的人代码不行,看起来不确定的人代码极好。

Elon 不是在找人才,是在吸引人才。使命足够大胆、清晰,人才因为使命而来。Elon 懂很多东西,能评估工作产品的质量,快速分辨谁在胡说,能押注在能去火星的人身上。他能简化问题,需要愿景加现实锚定,加对结果的激情。

苹果早年,DHH 是死忠。2000 年代初苹果以 Unix 为底,他从微软逃离。在哥本哈根商学院用第一台白色 iBook,转化了半个班。2004、2005 年他和 Jason 做苹果开发者广告。Mac 用户二十年,2007 年和 Jason 排队五小时买第一代 iPhone。

转折在 iPhone

本集资源与出处