代码诗人 DHH:我们是如何把简单的网页开发搞得一团糟的?
在科技圈,David Heinemeier Hansson(更广为人知的名字是DHH)是一个传奇。他是著名Web框架Ruby on Rails的创造者,是37signals公司的联合创始人和CTO,是《重来》(Rework)等多本畅销书的作者,也是一位在勒芒24小时耐力赛中获得过冠军的赛车手。 DHH以其犀利、坦率且充满激情的观点而闻名。在与Lex Fridman的深度对话中,他从自己坎坷的编程入门经历聊起,一路剖析了现代软件开发的“病症”、Ruby语言的美学、37signals独特的经营哲学,以及他为何不惜与苹果和亚马逊云这样的巨头“开战”。 这不仅仅是一次技术访谈,更像是一场关于代码、商业与人生的哲学思辨。 一段“屡败屡战”的编程缘起 你可能很难想象,这位编程界的“大神”,最初学编程时却是个不折不扣的“学渣”,而且失败了不止一次。 故事的开端,是上世纪80年代风靡一时的Commodore 64电脑。五六岁的DHH,在邻居家孩子的房间里,第一次玩到了格斗游戏《Yie Ar Kung-Fu》。那块小小的屏幕仿佛有魔力,让他着了迷,他缠着父亲也想要一台电脑。 终于有一天,父亲带回一台电脑,但并不是他心心念念的Commodore 64,而是一台让他大失所望的Amstrad 464。不过,有总比没有好。很快,自带的两款游戏就不够玩了。那个年代,想玩更多游戏又不花钱,最“硬核”的方式就是——照着电脑杂志自己把代码敲进去。 小DHH花了无数个下午,对着杂志敲了两小时代码,结果往往因为一个拼写错误,整个程序就崩溃了。更要命的是,他当时完全搞不懂“变量”(variable)到底是个什么鬼。为什么一个东西被赋予了一个值,之后又可以变成另一个值?这太反直觉了!相比之下,“常量”(constant)对他来说就好理解多了。 第一次尝试,以失败告终。幸运的是,他很快发现了“盗版”这个神奇的东西,对编程的热情也就暂时被搁置了。 几年后,大概十一二岁时,DHH拥有了或许是他至今最爱的电脑——Amiga 500。这台在欧洲风靡一时的机器,以及一个名为“Easy AMOS”(简单的AMOS)的编程语言,再次点燃了他的编程梦。“既然都叫‘Easy’了,能有多难呢?”他心想。 这一次,他更努力了,学会了条件判断、循环,但最终还是没能做出一个像样的游戏。他开始怀疑自己是不是不够聪明,或者编程需要太多数学天赋,而他并不是那种“数学怪才”。看着朋友们用汇编语言在Amiga上创造出炫酷的Demo(一种结合了图形、音乐的演示程序,在极小的内存限制下展示编程技巧),他既敬佩又沮丧。 那个年代,在没有互联网的欧洲,Amiga的Demo场景异常火爆。成千上万的年轻人,会扛着自己笨重的CRT显示器和电脑,坐火车去参加名为“The Party”的大型线下聚会,现场编程、竞赛、交换软盘。DHH也曾是其中的一员,尽管他自己不会编程,但他深深地被那种创造氛围所吸引。 为了融入这个圈子,14岁的DHH在自己哥本哈根的小卧室里,拉了三条电话线,搞起了BBS(电子公告板系统)。这在当时既是Demo作品的交流中心,也是盗版软件的集散地。他回忆,当电话公司的技术员来装第三条电话线时,看着满屋子闪烁的调制解调器,脸上写满了困惑:“这孩子到底在搞什么鬼?” 他的父母对此也只是知其一二,并不完全理解其中的“非法交易”。在当时的丹麦,盗版似乎并不是什么道德问题,对于一个没钱又想玩大量游戏的孩子来说,这几乎是唯一的方式。毕竟,他送一个月报纸挣的钱,只够买一款正版游戏。 真正的转折点,发生在他接触到互联网之后。 1995年左右,学校组织的一次活动让他第一次用上了网景浏览器(Netscape Navigator)。当他用简单的HTML标签让网页上的文字闪烁起来时,那种即时反馈的成功体验,与之前编程屡屡受挫的经历形成了鲜明对比。他意识到,他可以在互联网上创造东西,全世界的人都能看到,而且不需要任何人的许可。 “这太酷了!” HTML为他打开了一扇门,随后他开始学习PHP。正是PHP,让他终于贯通了编程的任督二脉——变量、循环、数据库交互,一切都变得清晰起来。 我们是如何把开发搞得一团糟的? “可以说,没有PHP,就没有今天的DHH。”DHH毫不讳言,“我百分之百亏欠于PHP。” PHP不仅是他的启蒙老师,更为他树立了一个关于“开发者体验”的黄金标准。他至今仍在怀念90年代末用PHP开发网站的感觉: 你写好一个脚本,用FTP上传到服务器,刷新一下浏览器,它就立刻生效了。没有复杂的构建流程,没有繁琐的配置,几乎是零门槛。 我们今天的电脑比那时快了无数倍,但Web开发却似乎变得越来越复杂。这让他感到困惑和惋惜。 他尖锐地指出,许多Web应用,本质上和20年前没什么区别,核心仍然是围绕数据库的增删改查(CRUD - Create, Read, Update, Delete)。许多开发者内心深处对这种“CRUD猴子”的身份感到不安,为了补偿这种存在主义的恐慌,他们倾向于把事情过度复杂化。 这也是为什么DHH对过去十几年JavaScript社区的“军备竞赛”颇有微词。他并不讨厌JavaScript这门语言本身(他甚至开玩笑说这是他第二喜欢的语言,虽然和第一名Ruby差距巨大),但他厌恶的是那套复杂的构建流程。 从2010年到2020年,JavaScript社区简直像个精神病院。各种框架和工具层出不穷,你刚学会一个,三个月后就被告知‘那玩意儿已经过时了’。你不得不扔掉所有东西,从头再来,否则你就是个傻瓜。 他认为,这种疯狂的“内卷”背后,有几个原因: 浏览器技术停滞:IE浏览器的垄断导致Web标准发展缓慢,开发者不得不发明各种预处理和编译工具来使用现代JavaScript语法。 大公司的组织结构:像Facebook(现Meta)这样的大公司,将开发岗位切分得越来越细(前端工程师、构建流程配置师……),导致原本一个Web开发者能搞定的事,现在需要一个庞大的团队,沟通成本和系统复杂度急剧上升。 优先级错位:许多聪明的开发者和公司涌入Web领域,但他们的首要目标并非“程序员的幸福感”,而是其他商业指标,这让他们可以容忍甚至合理化他们所引入的复杂性。 幸运的是,随着Chrome等现代浏览器的崛起和标准化,我们正走出那个“黑暗时代”。浏览器本身已经足够强大,开发者可以直接编写优雅的现代JavaScript,无需复杂的构建步骤。 这正是DHH在Rails 8中追求“零构建”(No-Build)的初衷——试图将90年代的简单便捷与过去20年的技术进步结合起来,找回开发者最初的幸福感。 Ruby的福音:为程序员幸福而生的语言 如果说PHP是让DHH入门的工具,那么Ruby就是他的信仰和“真爱”。 2001年,DHH开始和远在芝加哥的Jason Fried(他未来的合伙人)远程合作。他们最初用PHP做项目,但在协作中遇到了很多麻烦。终于,在决定为自己公司开发一款名为Basecamp的项目管理工具时,DHH第一次拥有了完全的技术选择权。 那时,他通过《IEEE》杂志等渠道,读到了Martin Fowler和Dave Thomas等大师的文章。这些大师在阐述设计模式时,不约而同地使用Ruby作为示例代码,因为它简洁、优雅,几乎就像伪代码一样易于阅读。 DHH被这种语言的美感深深吸引,他决定花两周时间尝试用Ruby来构建Basecamp的原型。结果,只用了一个周末,他就彻底“入教”了。 “Ruby就像是为我的大脑量身定制的手套,我从未见过这样的语言。这怎么可能?” Ruby的美学和哲学体现在每一个细节上。DHH举了几个例子来阐释这种“为程序员幸福而生”的设计理念: 消除“代码噪音”: 没有分号:Ruby抛弃了C语言家族中无处不在的分号,因为人类阅读代码时根本不需要它。 可选的括号:如果方法调用没有歧义,括号也可以省略。 清晰的循环:5.times { ... } 这样的语法,将循环五次的意图表达得淋漓尽致,而且数字5本身就是一个可以调用方法的对象。 人性化的条件判断: if user....