Skip to content

필사 모드: 重返终端的创业者 — Hashimoto 的 Ghostty、Zig 这场豪赌,以及“没有义务”的开源

한국어
0%
정확도 0%
💡 왼쪽 원문을 읽으면서 오른쪽에 따라 써보세요. Tab 키로 힌트를 받을 수 있습니다.

引言 — 成功的创业者再次回到底层

Mitchell Hashimoto 是一个不需要过多介绍的名字。Vagrant、Packer、Consul、Terraform、Vault、Nomad、Waypoint —— 过去十来年里的许多基础设施工具都出自他之手,他还联合创立了 HashiCorp。这样一个人现在在做什么呢?在做一个终端模拟器。而且用的还是至今尚未发布 1.0 的 Zig 语言。在最近公开的一次采访(alexalejandre.com)中,他相当坦率地道出了这个选择背后的理由。

本文以那次采访为依据,梳理三点。成功的创业者为什么会再次回到底层代码,Zig 这场豪赌的实际代价是什么,以及他对开源维护给出的那个明确的 —— 对某些人来说会不太舒服的 —— 立场。最后,会把这个博客不久前讨论过的“好的工具是看不见的”这一主题与终端叠在一起看。因为像终端这样看不见的工具,实在不多。

为什么是终端 — 重新磨砺变钝的手感

他的动机与其说是野心,不如说更接近好奇。他说,自己想要重新磨砺那份因为搁置而变钝了的技术手感。具体来说是三个领域:AI 出现之前那种方式的 GPU 编程、桌面与单节点的系统编程,以及学习 Zig。终端模拟器正是一个能同时触及这三者的项目。

有一个令人印象深刻的坦白。他做了 15 年的 CLI 工具,却并不知道终端内部究竟是如何运作的。Ghostty 最初的目标并不宏大。用他的话说,那是一个“让它自己构建自己,然后扔掉(have it build itself, then throw it away)”的实验 —— 大概就是在里面跑一跑 vim 和编译器。可当他在 Discord 上给朋友们展示时,真有人说愿意一直用下去,于是他经过漫长的非公开 Beta,把这个本该扔掉的东西养成了一个真正的项目。

这里有一处需要诚实点出的地方。这并不是人人都能做的选择。把好几年时间投入到赚不到钱的底层开源上,对于一个已经获得财务自由的人来说要容易得多。他说自己如今照顾着一个出生仅六周的婴儿,每天坐在电脑前也就三个小时左右。这份从容,正是后文要谈的“没有义务”哲学的背景 —— 想要公平地解读他的主张,就得把这一点一并放在旁边。

Zig 这场豪赌,以及它的代价

Zig 至今仍在 1.0 之前。这话听着体面,但在实际工程里很快就意味着破坏性变更。他说 0.15 改掉了“输出接口,乃至一切会输出东西的代码(the writer interface and thus anything printing anything)”。也就是说,凡是用到打印这一类操作的代码几乎全被撼动了。有意思的是,他把这件事当作称赞而非抱怨来讲 —— 他说新的 API 要好得多。

他为 Zig 辩护,靠的不是稳定性,而是对方向的信任。Zig 的 BDFL、Andrew Kelley 一旦判断某个变更是必要的,就毫不退让地推进,这种态度是他所欣赏的。对编译速度的执着也一样。用他的话说,明明可以把整个 libghostty “即刻”构建完成,Andrew 却“觉得连那点毫秒都太慢了”。一门语言不只是不断往上加功能,还会为了编译速度而删掉功能 —— 这一点在他看来是一种美德。

正因如此,他对 Rust 的态度也在意料之中。他说自己不喜欢 Rust 的文化,还补上一句“我也不喜欢足球(I also don't like soccer)”。这是一种刻意的轻描淡写 —— 喜好不需要理由。他送给 Zig 最深情的一句话,是说它“毫不心虚地古怪(unapologetically weird)”。每一门语言都缺少别的语言所拥有的某些功能,而他反倒欢迎这一点 —— 因为正是这样的约束,才孕育出创造力与文化。

若要加上我的评判,这是一场真正的豪赌。想到他早年就很早采用了 Go 的经历,这算是一种模式的重演,但选择一门 1.0 之前的语言,代价是实实在在的。每一次发布都会甩来一份迁移的作业。他把这份作业称作“好的变化”,可它归根结底也是他自己选择承担的维护税。

没有义务的开源 — 在原则与特权之间

这次采访中最具争议的部分,是关于维护的那一段,而他的立场很坚决:开源维护者对用户不负有任何义务。依据就是许可证本身 —— “开源许可证的第一行写的就是‘按现状提供,不作任何担保(as is, no warranty)’”,而那就是契约。他说,如果你想要更好的保障,那就花钱去买软件。只有当供应商与客户的关系成立,你才终于有资格去要求些什么。

他并不只是把这条原则当作防御的盾牌,也把它当成守护方向的工具。他说,如果每天只盯着用户提的 issue 看,软件大概就会变成“稳定却停滞(stable, stagnant)”的东西。实际上,他曾经把用户各自单独提交的三四个功能请求,用一个更好的功能一次性全部关掉。他没有照着每个人的要求原样实现,而是选择了一个能贯穿这些需求的统一设计。

他对分叉(fork)的看法也同出一源。他说自己一直相信,“无论是自用的还是长期维护的,都应该存在多得多的分叉”。这不只是一句口号,原因在于架构。Ghostty 把整个终端包进一个叫 libghostty 的库里,再在其上搭建应用。一旦干净地拆成了库,用户就可以不必向上游请愿,而是按自己的方式去包装或分叉。要让“没有义务”不至于滑落成不负责任,就得给用户一个能自行解决问题的接触面 —— 而库优先的设计,正是那个接触面。

尽管如此,我还是想在这里加上一句限定。“没有义务”在原则上是对的,但能够轻松说出这句话的位置,并不是均等的。当一个像 Ghostty 这样早已备受喜爱的项目,是由无需以生计为赌注的维护者来打造时,这句话是一种解放。可对于那个独自扛起某家公司所依赖的库、被夹在倦怠与愧疚之间的维护者来说,同样一句话更像是一个难以企及的理想。他的原则是健康的。只是,能够去践行这条原则的那份从容,并没有被均等地分配。

结语 — 终端,最看不见的工具

终端是工具中的工具。做得好的终端,一整天悬在眼前,却让人意识不到它的存在。不久前,这个博客讨论过 gingerBill 的“好的工具是看不见的”(那篇文章),而像终端这样恰好印证那个主张的对象,实在不多。Hashimoto 的 Ghostty 哲学也有相通的纹理。他区分“功能丰富”与“臃肿” —— 用不到的功能只是占用一点磁盘和内存,并不会被执行,用他的话说,那是“免费的功能(a free feature)”。此外,他还强调,基于终端的应用程序在组合(composition)上更有优势,也就是说,一个更好的终端会带来更好的自动化与脚本化。

从这个成功的创业者再次回到底层的故事里,我带走的不是结论,而是态度。他承认了自己在其上耕耘了 15 年却仍不了解的东西,把赌注押在方向而非稳定上,面对维护的负担,他讲的不是好听的漂亮话,而是自己的原则。你不必对那条原则照单全收。只是,能把自己要做什么、又决定去承担什么说得这样清楚的人并不多见,而这份清晰本身,就值得学习。

参考资料

현재 단락 (1/19)

Mitchell Hashimoto 是一个不需要过多介绍的名字。Vagrant、Packer、Consul、Terraform、Vault、Nomad、Waypoint —— 过去十来年里的许多基础...

작성 글자: 0원문 글자: 3,221작성 단락: 0/19