GitHub · circa 2012 · Kyle Neath · 中译 + 译注 + 体裁考

The Zen of GitHub

十四条产品箴言,和它所属的那个家族

"任何新增都会稀释其余一切。" Anything added dilutes everything else.

约 2012 年由 GitHub 设计负责人 Kyle Neath(@kneath)写下,以 Pull Request 的形式并入代码库——刻意让它成为组织的共同资产,而不是个人教条:可被修改,集体负责。
今天仍可 curl https://api.github.com/zen 随机取一条;GitHub webhook 的 ping 事件 payload 里也带一个 zen 字段。
本页:14 条逐条中译与译注 · 三组容易被漏掉的配对 · 与 Zen of Python / Zen of Go / Rails Doctrine / Unix philosophy 的体裁横向对比。
TL;DR · 速读

为什么这 14 条十几年后还有人在 code review 里引用

  1. 它讲的是取舍,不是美德

    "Responsive is better than fast" 只有做交互产品的团队说得出口。公司价值观页那种"客户至上 / 成长型思维"换成任何一家公司都成立,所以没人引用——可引用性来自具体性

  2. 箴言体的功能是降低引用成本

    设计原则写成长文档没人读,更无法在争论现场当武器。凝成一句短句后,才能被直接扔进 PR 评论:"这违反 anything added dilutes everything else。"

  3. 只给判断,不给论证——这是特性不是缺陷

    箴言不解释自己。它假设你在实践里撞过墙,撞过的人一读就懂,没撞过的人读了也没用。代价是容易被当教条挥舞。

  4. 故意容许内部矛盾

    Zen of Python 里 "Simple is better than complex" 和 "Practicality beats purity" 会打架;GitHub 这份里 "Approachable is better than simple" 和 "Anything added dilutes" 也会。不求形式自洽,求在具体情境里用得上。

  5. Zen of X 与「某某定律」是两个物种

    Zen of X:成组、项目内部人写、带审美判断、规范性。Law / Principle(Conway / Postel / Unix philosophy):多为单条、外部观察者提出、描述性。混着引用会出事。

Chapter 01

The Fourteen

十四条 · 原文 / 中译 / 真正在说什么
有几条不能直译 · 第三行是译注,不是原文的一部分
  1. Responsive is better than fast

    有响应胜过快

    这是两回事:fast 是总耗时短,responsive 是立刻给反馈。转圈的进度条并没让任务更快,但用户不会以为它死了。这条排在第一位,是因为它最容易被工程师误读成同义反复。

  2. It's not fully shipped until it's fast

    不够快就不算真正上线

    反对"先上再优化性能"。性能不是后续迭代项,是"发布"这个词定义的一部分。和第 1 条不重复:第 1 条讲感知,这条讲实际耗时,而且把它划进了 Definition of Done。

  3. Anything added dilutes everything else

    任何新增都会稀释其余一切

    全篇被引用最多的一条。锋利处不在"加东西有成本"——那是废话——而在加东西会让已经做好的东西变弱,因为用户注意力是零和的。新功能不是从零开始积累价值,是从存量里抽血。

  4. Practicality beats purity

    实用胜过纯粹

    整句直接借自 Zen of Python(那边原文是 Although practicality beats purity)。架构漂亮但用户用不上,不算赢。这条是留给架构洁癖者的刹车。

  5. Approachable is better than simple

    让人敢上手胜过简单

    simple 说的是结构少,approachable 说的是心理门槛低。一个功能极少但找不到入口的产品,是 simple 而不 approachable。这条隐含着对"极简主义"的一记回马枪:极简常常是设计师的自我满足。

  6. Mind your words, they are important

    措辞要讲究,它很重要

    文案是产品的一部分,不是上线前找人润色的装饰层。按钮上那个词决定用户敢不敢点——"删除"和"移除"在用户脑子里是两种不可逆程度。

  7. Speak like a human

    说人话

    别把系统内部术语端到用户面前。"Webhook 配置失败" 是说给自己听的,"我们没能通知到你的 Slack" 才是说给人听的。判据很简单:这句话你会对着同事的脸说出来吗。

  8. Half measures are as bad as nothing at all

    做一半等于没做

    "as bad as" 是刻意的强等号,不是"不如"。半成品功能比不做更糟:它占了位置、要维护、还给了用户错误预期,而这三样都会在你想砍掉它的时候变成阻力。

  9. Encourage flow

    别打断心流

    少弹窗、少二次确认、少强制跳转。每一个"你确定吗"都是设计者把自己的不确定转嫁给了用户。原文用的是 encourage(鼓励)而不是 protect,方向是主动铺路,不只是别添乱。

  10. Non-blocking is better than blocking

    不阻塞胜过阻塞

    第 9 条的工程实现版。界面不该等后端:乐观更新、后台提交、失败再回滚,而不是转圈锁死整个页面。GitHub 自己最典型的实践是 issue 评论——你点完就出现了,请求还在飞。

  11. Favor focus over features

    宁要专注,不要功能

    第 3 条的行动版。那条讲机制(为什么加会稀释),这条讲取舍(所以别加)。成对出现是有用的:争论现场先用第 3 条讲道理,再用这条下结论。

  12. Avoid administrative distraction

    别让人分心做管理杂事

    权限、配置、审批、成员管理这类"元工作"要压到最小。用户是来干活的,不是来管理干活这件事的。这条对 B2B 产品尤其毒:企业版功能清单几乎全是 administrative distraction。

  13. Design for failure

    按会出错来设计

    失败态是主流程的一部分,不是异常分支。网断了、请求挂了、数据脏了、第三方超时了——界面长什么样,要在画 happy path 的同一张稿子里想清楚,而不是留给工程师临场发挥。

  14. Keep it logically awesome

    让它在逻辑上依然漂亮

    刻意含混的收尾,GitHub 式的俏皮。通常读作:别为了炫效果牺牲内在自洽——酷可以,但要讲得通。放在最后是有意的:前 13 条都是硬判断,这条给整份清单留了一个不把自己当法典的出口。

Chapter 02

Three Pairings

三组容易被当成重复的配对
逐条读会漏掉的结构 · 每组都是"机制 + 取舍"或"感知 + 实际"

这 14 条不是 14 个独立观点。至少有三组是成对写的,拆开单读会觉得啰嗦,合起来读才看得见它在防哪种具体的错误。

顺带一提 · 第 9 条(Encourage flow)与第 10 条(Non-blocking)也构成一组,只是关系更松:前者是用户体验目标,后者是达成它最主要的工程手段。这一组之所以没列进上面三组,是因为它俩挨着放、几乎不会被误读成重复。
Chapter 03

The Family

同族横向对比 · Zen of X 与它的邻居们
Zen of Python / Zen of Go / Rails Doctrine / Unix philosophy · 谁写的、约束什么、还活着吗

把 The Zen of GitHub 放回它所属的谱系里看,才知道它继承了什么、又变异了什么。下面这张表的关键一列是"谁写的"——内部人写的和外部观察者总结的,是两种完全不同的文本,不该混着引用。

信条 年份 / 作者 条数 谁写的 约束什么 体裁
Zen of Python 1999 · Tim Peters 19 语言核心圈内部人 语言与代码的审美 判断句,半开玩笑
Zen of GitHub ~2012 · Kyle Neath 14 公司设计负责人 产品与交互决策 判断句,认真的
Zen of Go 2020 · Dave Cheney 11 社区名人,非官方 工程实践细节 祈使句,近乎规范
Rails Doctrine 2016 · DHH 9 框架创造者本人 框架的价值取向 宣言,每条一篇长文
Unix philosophy 1978 · Doug McIlroy 4(常压缩为 3) 系统作者事后总结 程序间的组合方式 描述性,近乎法则

The Zen of Python

Tim Peters · 1999 · PEP 20 · 终端里 import this 可见 · 19 条
  1. Beautiful is better than ugly.
  2. Explicit is better than implicit.
  3. Simple is better than complex.
  4. Complex is better than complicated.
  5. Flat is better than nested.
  6. Sparse is better than dense.
  7. Readability counts.
  8. Special cases aren't special enough to break the rules.
  9. Although practicality beats purity.
  10. Errors should never pass silently.
  11. Unless explicitly silenced.
  12. In the face of ambiguity, refuse the temptation to guess.
  13. There should be one-- and preferably only one --obvious way to do it.
  14. Although that way may not be obvious at first unless you're Dutch.
  15. Now is better than never.
  16. Although never is often better than *right* now.
  17. If the implementation is hard to explain, it's a bad idea.
  18. If the implementation is easy to explain, it may be a good idea.
  19. Namespaces are one honking great idea -- let's do more of those!

体裁源头。GitHub 那份的 "Practicality beats purity" 是整句搬过来的。这里有两个细节值得注意:第 14 条 "unless you're Dutch" 是在开 Guido van Rossum 的玩笑(荷兰人),说明作者自己都没把它当法典;PEP 20 正文只有 19 条,而文档里说有 20 条——第 20 条留白,官方从未补上。Tim Peters 本人说这是半开玩笑写的。

The Zen of Go

Dave Cheney · 2020 · GopherCon Israel 演讲 · 11 条 · 非 Go 官方
  1. Each package fulfils a single purpose 每个包只服务一个目的
  2. Handle errors explicitly 显式处理错误
  3. Return early rather than nesting deeply 尽早返回,别深层嵌套
  4. Leave concurrency to the caller 把并发的决定权留给调用方
  5. Before you launch a goroutine, know when it will stop 起 goroutine 前先知道它何时停
  6. Avoid package level state 避免包级状态
  7. Simplicity matters 简单性很重要
  8. Write tests to lock in the behaviour of your package's API 用测试锁住 API 的行为
  9. If you think it's slow, first prove it with a benchmark 觉得慢,先用 benchmark 证明
  10. Moderation is a virtue 节制是一种美德
  11. Maintainability counts 可维护性很重要

最像"规范"的一份,也因此最不像禅。它明确讨论 goroutine、package、benchmark 这些具体机制,可执行性最强,但也最容易过期——语言一变,第 6 条第 4 条就要重写。相比之下 GitHub 那 14 条十几年不用改,代价是它不告诉你怎么做。抽象度和保质期是一对交换。

The Rails Doctrine

David Heinemeier Hansson · 2016 · 九根支柱 · 每条配一整篇论述
  1. Optimize for programmer happiness 为程序员的幸福感优化
  2. Convention over Configuration 约定优于配置
  3. The menu is omakase 菜单是主厨定的(全家桶,别单点)
  4. No one paradigm 不奉行单一范式
  5. Exalt beautiful code 推崇漂亮的代码
  6. Provide sharp knives 提供锋利的刀(不为防呆而阉割)
  7. Value integrated systems 看重一体化系统
  8. Progress over stability 进步优先于稳定
  9. Push up a big tent 搭一个大帐篷(容纳分歧)

严格说这不是箴言体,是宣言体。每条背后都有一整篇长论述,读起来是"为什么我们这样选",而不是"你该这样做"。它是解释性的,Zen 是断言性的。第 3 条 omakase 和第 6 条 sharp knives 尤其能看出差别——这两句离开上下文根本无法引用,而 "Speak like a human" 可以裸着扔进任何一场争论。

The Unix Philosophy

Doug McIlroy · 1978 · Bell System Technical Journal · 4 条原文,流行的是 3 条压缩版

McIlroy 原文四条:(i) Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new features. (ii) Expect the output of every program to become the input to another, as yet unknown, program. (iii) Design and build software, even operating systems, to be tried early, ideally within weeks. Don't hesitate to throw away the clumsy parts and rebuild them. (iv) Use tools in preference to unskilled help to lighten a programming task.

  • Write programs that do one thing and do it well. 一个程序只做一件事,做好
  • Write programs to work together. 程序之间要能协作
  • Write programs to handle text streams, because that is a universal interface. 用文本流,因为它是通用接口

它跟前三份不是一个物种。Zen of X 是内部人写给自己人的规范性文本("应该这样");Unix philosophy 是事后对一个已经成功的系统做的描述性总结("它之所以成,是因为这样")。同族的还有 Conway's Law、Postel's Law、Rule of Least Power——都是单条、外部视角、可证伪。
把它们混着引用的典型翻车:拿 Postel's Law("接收时宽容")当设计准则,结果做出一个谁都猜不透行为的 API——而它原本只是对 TCP/IP 为什么能活下来的一句观察。

Chapter 04

Why Aphorisms

箴言体这个体裁本身 · 它买到了什么,又付了什么
三个文体特征 · 一个功能 · 一个代价

先说"zen"这个词在这里到底什么意思。不是禅宗教义,而是技术圈已成惯例的一个文体名 = "(某项目的)设计箴言集"。词源链是:梵语 dhyāna(禅那,静虑)→ 汉语「禅」→ 日语「禅」zen → 英语 Zen。英语拼作 zen 而不是 chan,正因为借的是日语读音——20 世纪经日本禅宗西传,铃木大拙的著作加上 1950-60 年代 beat generation 的推广。在英语里它的语义早已漂移成"极简、直觉、不靠繁复论证的风格",还形容词化了(be zen about sth = 对某事很淡然)。

三个文体特征。①短句、对仗、可背诵;②只给判断不给论证——要求读者在实践中自己撞到才理解;③故意容许内部矛盾。第三点最反直觉:Zen of Python 里 "Simple is better than complex" 和 "Practicality beats purity" 摆在一起会打架,GitHub 这份里 "Approachable is better than simple" 和 "Anything added dilutes everything else" 也会——你为了让新用户敢上手加的那个引导层,正是在稀释其余一切。这恰恰是禅宗式的:不求形式一致,求在具体情境里用得上。

为什么选箴言体而不是长文档。设计原则写成长文没人读,更要命的是无法在决策现场引用。凝成 14 条短句之后,它才能在 code review 和产品争论里被当作共同语言直接抛出来:"这违反 anything added dilutes everything else。"箴言体的功能是降低引用成本,不是显得高深。

代价也很明确。缺上下文,因而极易被当教条挥舞——用 "Half measures are as bad as nothing at all" 去否掉一个合理的 MVP,是这份清单最常见的滥用方式。Tim Peters 自己说 Zen of Python 是半开玩笑写的;GitHub 把第 14 条留成一句刻意含混的 "Keep it logically awesome",大概也是同一种自我提醒:别把自己写的东西当法典。

一个可操作的判据 · 想知道一份"价值观"是不是活的,看它能不能被裸着引用。"Speak like a human" 可以直接扔进一条 PR 评论,对方立刻知道你在说什么、该改哪儿。"客户至上"不行——它需要你先解释一遍你说的客户至上是指哪一件具体的事。
差别不在真诚度,在具体性。只讲美德的信条无法执行,因为没人会反对美德。