第 14 章
贡献者的门槛
在GitHub时代,“贡献者”这个词变得廉价了。一个拼写修正,一次文档格式调整,甚至一个标点符号的修改,都可以让一个人的名字出现在贡献者列表里。这种机制有其民主化的价值——它降低了参与的门槛,让更多人感受到自己是项目的一部分。但它也制造了一种幻觉:仿佛所有贡献都是等价的,仿佛提交权限只是贡献数量的自然延伸。
但在Clojure社区,这个等式从未成立。把时间拨回语言诞生之初,这种差异就已经埋下了种子。里奇·希基创造Clojure语言的那两年半里,他独自一人工作。没有外部资金,没有团队,没有社区。他在一个房间里面对一台电脑,在Java平台上重新想象Lisp的可能性。
那是一段漫长的独处——一个人做所有的决定,一个人承担所有的后果,一个人既是立法者、执行者,也是唯一的裁断者。此前,他开发过类似但基于.NET平台的项目——dotLisp。在那之前,他还尝试了三次在Lisp与Java之间提供互操作:Common Lisp的Java外语接口、Lisp的外语对象接口以及Lisp友好的Java Servlet接口。
当他终于向Common Lisp社区的朋友发送那封宣布完成的电子邮件时,Clojure还只是一个创造者的作品,尚未成为一个需要裁决者、需要共识、需要划定边界的公共领域。
但语言一旦发布,就不再只属于创造者。它进入了一个由使用者、贡献者、批评者和旁观者共同构成的空间。在这个空间里,谁可以修改语言的核心,谁的意见值得倾听,谁被认可为“我们”的一部分——这些问题不会自动获得答案。它们需要被回答,被争论,被制度化为某种可操作的边界。
如果说裁定者坐在房间中央,那么谁有资格走近那把椅子,便成了社区身份政治的核心问题。这个问题在大多数开源项目中有一个相对直接的答案:贡献足够多、足够好,就会被邀请成为提交者。这条路径看起来像是一个公平的阶梯——你提交补丁,你的补丁被接受,你的名字出现在贡献者列表里,最终某一天,有人对你说,你为什么不直接提交呢?但在Clojure社区,这个答案从未如此简单。不是因为它更复杂,而是因为它遵循着另一种逻辑。
Clojure核心库的提交权限,长期维持着一种近乎手工行会的准入逻辑。这不是一个可以通过提交数量累积来跨越的门槛。一个人可能提交了数十个补丁,却始终停留在外部贡献者的位置,而另一个人只提交了三个补丁,却被邀请加入核心团队。这种差异不是随机的,也不是偏袒,而是基于一套从未被写成文档的评估标准:代码风格是否与语言哲学一致、在邮件列表中的讨论是否展现出对既有设计的尊重、面对批评时是否能够调整方案而非争辩到底。
换句话说,Clojure社区在意的不是贡献的数量,而是贡献所体现的判断力。判断力这个词,在工程文化中很少被公开讨论,因为它难以量化,难以辩护,容易被视为精英主义的托词。但Clojure社区的选择,恰恰是让这个难以量化的标准成为实际上的门槛。
为什么?要理解这一点,需要回到Clojure社区治理的一个根本特征:它不是一个民主政体,也不是一个纯粹的技术官僚体系。
它更像是一个判例法系统——每一个被接受的补丁、每一个被拒绝的提议、每一次邮件列表中的讨论,都在为未来的决策积累先例。在这样的系统中,提交权限不只是一个技术资格,它是一种解释权。拥有提交权限的人,不只是能够修改代码,而是能够在模糊情境中判断什么样的修改符合Clojure的设计原则。这种判断力无法通过选择题测试来验证。它只能通过观察一个人在一段足够长的时间内的行为来评估——看他如何回应设计讨论,如何修改自己的补丁,如何在遇到分歧时表达自己的立场。
这正是手工行会的逻辑:学徒不是通过考试成为师傅,而是通过师傅的观察和认可。
但这里有一个张力。手工行会逻辑天然倾向于保守和封闭。如果门槛只由已在门内的人决定,他们会不会倾向于选择那些最像自己的人?会不会用“判断力”这个模糊标准来排斥那些真正有新想法、但表达方式不同的人?这些问题不是一个假设。它们在Clojure社区的历史上真实地出现过,而且以不同的形式反复出现。
要观察这个门槛如何运作,最好的方式不是抽象地讨论标准,而是追踪一个具体的案例。
让我们回到2010年前后,追踪一位贡献者的历程——姑且称之为“K”。K在2009年开始在Clojure邮件列表中出现,最初是提问,然后是回答其他人的问题,再然后开始提交补丁。他的第一个补丁修复了一个文档中的错误。第二个补丁改进了某个函数的错误消息。第三个补丁涉及一个微小的性能优化。这些补丁都被接受了。如果按照GitHub时代的逻辑,K已经是一个“贡献者”了。但在Clojure核心团队看来,这些补丁只是展示了一个人能够理解代码库的技术层面。它们还没有展示判断力——那种在更复杂的设计选择中做出正确权衡的能力。K继续提交补丁。到2010年底,他已经提交了超过二十个补丁,涵盖了从错误修复到小型功能增强的范围。在邮件列表中,他的名字也开始被其他社区成员认识。但提交权限始终没有被授予。
某些社区成员开始私下询问:为什么K还不是核心提交者?Clojure的开发过程在Clojure JIRA项目网页由社区驱动并管理,任何人都可以提交错误报告和想法,而贡献补丁前则需要先签署Clojure贡献者协议。JIRA错误报告由一组筛选者处理,最终由里奇·希基批准更改。
他的贡献已经超过了许多拥有提交权限的人。答案在2011年初的一次设计讨论中浮现出来。K提出了一个关于某个核心函数行为修改的提案。从技术角度看,这个提案是可行的。它解决了K自己遇到的一个实际问题,而且不会破坏现有的测试。
但提案在邮件列表中引发了长达数周的讨论,讨论的核心不是技术可行性,而是设计一致性。在这次讨论中,K的回应方式暴露出某种与Clojure设计哲学的距离。他不是在曲解设计原则——他理解这些原则,也试图在原则框架内论证。但他的论证方式透露出一种倾向:将具体问题视为需要逐一解决的独立案例,而不是将其置于Clojure整体设计哲学之下进行考量。当他被质疑时,他的回应是加强论证,而不是调整方案。这恰恰是手工行会评估中最微妙的部分。核心团队不是在看K是否“正确”——事实上,他的提案在某些方面确实有道理。他们在看的是K在面对批评时的认知动作:他是否试图理解批评背后的设计原则,还是将批评视为需要克服的障碍?
他是否能够在讨论中展现出对既有设计传统的尊重,即使他认为那些传统需要改变?最终,K的提案被拒绝了。不是因为他错了,而是因为他的提案方式——以及更根本的,他参与设计讨论的方式——还没有展现出那种被核心团队视为提交权限前提的判断力。
K继续在社区中活跃,继续提交补丁,但在那之后的相当长一段时间里,提交权限的门对他仍然关闭着。这个案例揭示了一个令人不安的事实:Clojure社区的门槛不仅高,而且它的评估标准是不可见的。K在提交了二十多个补丁之后,仍然不完全理解为什么自己没有被接纳。核心团队从未公开解释过他们的评估标准——不是因为他们想要保密,而是因为这些标准本身就无法被完整地写成文档。它们存在于核心团队成员的判断中,通过他们在具体案例中的选择而显现。
这就引出了更深层的问题:这种不可见的门槛,是否本质上是排斥性的?它是否系统性地偏袒那些具有特定文化背景、特定沟通风格的人?
那些在邮件列表中不那么善于表达、但技术能力出色的人,是否会被这个门槛挡在门外?这些问题在Clojure社区内部也曾被提出过。2013年,在一次关于社区治理的讨论中,有人明确地质疑了核心团队选择提交者的标准。
质疑者指出,那些被邀请加入核心团队的人,几乎都拥有某种相似的特征:他们不仅技术能力强,而且在邮件列表中的表达方式高度符合某种特定的风格——谨慎、细致、尊重权威、倾向于引用既有设计原则而非提出彻底的新方案。这个观察是准确的。但问题在于,它是否构成了一种不公正的排斥?回答这个问题,需要区分两种不同的门槛:一种是基于能力的门槛,另一种是基于文化契合度的门槛。在理论上,前一种门槛是正当的,后一种门槛则可能沦为歧视。
但在实践中,这两种门槛往往难以清晰区分。一个人的沟通风格,在多大程度上是纯粹文化性的,在多大程度上反映了其参与设计讨论的能力?
Clojure社区的选择——或者说,它在这件事上实际形成的实践——是接受这种模糊性,而不是试图通过形式化的标准来消除它。这不是因为核心团队对排斥问题漠不关心,而是因为他们相信,降低门槛的成本可能高于维持现状的成本。这个成本不是指技术质量——技术质量可以通过代码审查来保证。成本是指共识的稳定性。
这里触及了Clojure社区治理中一个核心的紧张关系。社区依赖共识来运作,而共识的稳定性依赖于参与决策的人共享一套基本的判断框架。如果提交权限被授予那些尚未展示出这种判断框架的人,他们做出的决策可能会削弱共识的基础——不是因为他们做出了错误的决策,而是因为他们做出决策的方式与社区既有的判例积累不一致,从而制造出需要被重新审理的争议。
换句话说,高门槛不是精英主义的任性,而是判例法系统维持自身一致性的必要条件。在一个判例法系统中,每一个新判例都在为未来的决策设定参考。
如果判例的制定者不共享一套基本的判断框架,判例本身就会变得相互矛盾,系统就会失去提供稳定预期的能力。但这正是问题所在。如果判例的制定者必须共享一套判断框架,而这套框架又只能通过长期参与和观察来获得,那么新来者如何进入这个系统?
答案似乎是:通过一条漫长的走廊——先作为使用者,然后作为提问者,然后作为回答者,然后作为补丁提交者,最后,在某个无法被精确预测的时刻,被认可为判断框架的共享者。这条走廊是开放的。任何人都可以踏上它。但它也是漫长的——漫长到许多人会在中途放弃,或者选择停留在某个阶段,不再试图走向那把椅子。
这导致了两种截然不同的身份体验:对于那些走完了走廊的人来说,它是一种归属的确认——不是因为你被宣告为“我们”,而是因为你在行走的过程中,已经不知不觉地成为了“我们”;对于那些始终感到隔膜的人来说,它则是一种无声的排斥——没有人告诉你你被拒绝了,你只是发现自己始终无法到达那个房间。K的故事最终有一个转折。
在2012年底,也就是那个被拒绝的提案近两年后,K被授予了提交权限。是什么改变了?不是他的技术能力——他的技术能力在两年前就已经足够。改变的是他参与社区讨论的方式。在那些年里,他继续活跃在邮件列表中,但逐渐地,他的回应方式发生了变化。他不再将设计讨论视为需要赢得的辩论,而是开始更频繁地引用历史判例,更仔细地考虑反对意见中的设计原则,更愿意在无法达成共识时搁置提案而不是强行推进。
换句话说,他学会了用这里的方式敲门。这个“学会”的过程,是Clojure社区门槛文化中最核心也最有争议的部分。它不是一个正式的学习过程——没有人教K如何敲门,没有手册,没有培训。它是通过观察、模仿和试错来完成的。
K观察那些成功穿过门槛的人是如何做的,他模仿他们的方式,他在试错中调整自己的行为。这个过程本质上是经验性的,就像手艺人学习如何判断材料的纹理、工具的力度、成品的标准。
但这也意味着,这个学习过程对那些没有机会近距离观察、或者不擅长这种隐性学习方式的人来说,是不公平的。那些已经在门内的人,可以通过日常互动来传递这些隐性知识。那些在门外的人,只能通过邮件列表这样的公共空间来观察——而公共空间中的互动,已经被过滤掉了许多微妙的信息。一个在邮件列表中看起来简洁而果断的回应,在现实中可能伴随着一个微笑、一个耸肩、一句“这只是我的想法”的口头禅。这些信息在文本中消失了,但它们在判断一个人是否“理解了”社区的方式时,却可能是决定性的。
这或许就是Clojure社区门槛文化中最深刻的悖论:它的开放性在于,任何愿意走那条走廊的人都可以获得参与讨论所需的资源——代码库是公开的,邮件列表是公开的,设计原则被反复阐述,历史争论被完整存档。
但它的不平等在于,走完那条走廊所需要的投入——时间、精力、技术熟悉、对原则的认同——分布是不均匀的。那些拥有更多时间、更熟悉西方技术文化沟通风格、更早接触到类似社区的人,走得更快。
那些来自不同文化背景、不同沟通传统、不同时间资源的人,走得更慢,甚至走不到头。这种不平等不是Clojure社区独有的,但它在这个社区中以一种特殊的方式被放大。因为Clojure的门槛不仅要求技术能力,还要求一种特定的沟通方式和判断框架。这两者都不是中性的。它们都承载着文化假设——关于什么是好的论证,什么是尊重,什么是建设性的批评。这些假设在西方技术文化中被视为理所当然,但在其他文化传统中,同样的行为可能被解读为回避冲突、过于顺从或不够直接。
当社区成员讨论“判断力”时,他们实际上在讨论一种文化编码的能力。它不仅仅是技术上的判断,而是对社会规范的判断——知道什么时候该说话,什么时候该沉默,什么时候该坚持,什么时候该让步。这种能力在大多数人类组织中都是重要的,但Clojure社区的特殊之处在于,它将这种能力作为贡献者身份的核心标准,而不是一个可选的加分项。为什么这个社区会形成这样的标准?要理解这一点,需要回到它形成的历史条件。
Clojure社区在2008年到2012年间——也就是它最关键的成型期——是一个相对小型的群体。核心讨论发生在邮件列表中,参与者大多是那些已经具备类似技术背景和文化背景的人。他们之间的沟通可以依赖大量未言明的共识。当一个人说“这不符合Clojure的方式”时,其他人不需要他解释什么是“Clojure的方式”——因为他们已经通过数百次讨论内化了它。在这个阶段,高门槛不是一个设计选择,而是一个自然结果。社区不需要刻意设置门槛,因为门槛已经被共同的背景和持续的互动所自然形成。
问题出现在社区开始扩大之后。当2012年、2013年新成员涌入时,他们不再共享那些未言明的共识。他们读到的邮件列表存档是完整的,但存档中的微妙之处——那些在上下文中不言自明的假设——对他们来说是不可见的。他们看到的是结果,而不是过程;是判例,而不是判例背后的推理。于是,那些在早期阶段自然形成的门槛,在后期阶段变成了需要被解释、被辩护的制度性特征。
Clojure的开发过程目前由社区驱动,其作者里奇·希基则以终身仁慈独裁者的身份监督。
但解释和辩护是困难的,因为门槛本身从未被形式化。核心团队可以指出具体的案例——就像K的案例——来说明他们看重什么,但他们无法提供一份完整的标准清单。这导致了一个后果:新来者感知到的是一个不透明的、似乎带有任意性的筛选过程,而门内的人感知到的则是一个虽然模糊但始终如一的判断标准。
这种感知上的差异本身就是一个重要的历史事实。它解释了为什么在2013年到2015年间,邮件列表中关于贡献者门槛的讨论变得如此频繁和激烈。这些讨论不是关于技术问题——技术问题可以通过代码审查来解决。它们是关于身份和归属的问题:谁被认可为“我们”,谁来决定,依据什么标准。
在这些讨论中,出现了一些具体的提议。有人建议创建更详细的贡献者指南,明确列出获得提交权限需要满足的条件。有人提议设立正式的导师制度,由资深贡献者一对一地帮助新来者学习社区的方式。有人主张定期举办面向新贡献者的在线活动,降低他们参与讨论的门槛。
这些提议都试图将隐性的门槛转化为显性的制度,从而让它变得更容易被理解和跨越。但所有这些提议都面临一个根本性的限制:它们可以降低技术性的门槛——如何设置开发环境、如何提交补丁、如何理解代码结构——却很难降低判断力的门槛。因为判断力只能在实践中获得,而实践需要时间,需要精力,需要一种特定的学习方式。你可以教一个人如何写一个符合Clojure风格的函数,但你不能教他如何在面对一个全新的设计问题时做出正确的权衡——因为正确的权衡依赖于对Clojure设计哲学的内在理解,而这种理解只能通过长期的参与和反思来获得。
这大约就是Clojure社区治理中最诚实的真相:共识不是平等的,但它是开放的。开放在于,那个房间的门没有锁,走廊就在那里,任何人都可以走进去。不平等在于,走完那条走廊所需要的资源,不是每个人都能平等地拥有。这个真相令人不安,但它也解释了为什么Clojure社区的精英治理没有滑向封闭的小圈子——因为尽管门槛高,它始终是可见的。
每一个像K那样最终穿过门槛的人,都在向社区传递一个信号:这扇门是开着的,只是你需要学会用这里的方式敲门。但这里有一个更深的问题,在K的故事中只是隐约浮现,却在更长时间尺度上变得清晰:当判例积累得足够厚重,以至于新来者几乎不可能走完那条挂满历史判例的走廊时,社区的开放性是否会在实质上萎缩?K在2010年需要学习的设计判例,数量还相对有限。到了2020年,一个像K那样的新来者需要面对的是十五年积累的讨论记录、设计决策、微妙权衡。走廊在变长,而且变长的速度超过了任何人能够走完的速度。
这不是一个假设性的问题。在Clojure社区2018年之后的发展中,可以观察到一种变化:新获得提交权限的贡献者,越来越多地来自那些已经在社区中活跃多年的人,而不是真正的新来者。社区的门槛仍然是开放的,但穿过它所需的时间,正在从“几年”变为“多年”。
这种张力制造的两种身份体验——归属的确认与无声的排斥——并非Clojure社区独有的现象。任何依赖隐性知识的共同体,都会在边界处生产出类似的双重体验。但Clojure社区的特殊之处在于,它同时也在生产关于这些体验的公开讨论。
在邮件列表的存档中,在会议走廊的交谈中,在博客文章的字里行间,人们反复回到同一个问题:我们如何知道一个人已经准备好了?这个问题之所以被反复提出,恰恰因为答案始终无法被最终确定。每一次新的授予都是一次判例,都在微调那道门槛的位置和形状。而这些判例本身,又成为后来者试图解读的文本——他们从这些案例中推测,什么样的代码风格会被认可,什么样的讨论姿态会被视为尊重,什么样的坚持会被理解为固执。
这就形成了一个自我指涉的循环:社区通过授予提交权限来定义什么是判断力,而判断力的定义又被用来决定谁应该获得提交权限。这个循环在逻辑上是同义反复的,但在实践中,它却具有某种实在的筛选功能。因为每一次循环都不是在真空中运行——它发生在具体的补丁、具体的讨论、具体的设计争议中。那些参与循环的人,不是在应用一个抽象的标准,而是在每一个案例中重新激活他们对Clojure设计哲学的理解。
这种激活本身,就是一种持续的教育过程——不仅教育新来者,也在教育那些已经在门内的人。当一位资深贡献者必须向社区解释为什么某个补丁被接受而另一个被拒绝时,他被迫将自己内隐的判断转化为外显的论证。这个过程迫使他反思自己的判断依据,从而可能修正或深化自己的理解。
这大约就是为什么Clojure社区的门槛虽然高,却始终没有完全凝固。因为每一次解释都是一次重新打开——不是打开门本身,而是打开门背后的推理过程,让那些在走廊上的人能够看到,判断不是任意的,而是有迹可循的,尽管那些痕迹需要时间和耐心才能辨认。
但这种打开是有限的。它受制于一个简单的事实:解释需要时间,而时间是一种稀缺资源。核心团队的成员可以花时间审查代码、参与讨论、撰写设计文档,但他们不可能为每一个被拒绝的补丁提供详尽的解释。他们也不可能为每一个新来者提供一对一的指导。这意味着,那些能够从有限的公开解释中提取出判断框架的人——那些擅长在文本中读出言外之意的人——拥有明显的优势。这种优势不是被刻意赋予的,但它确实存在,而且它沿着特定的文化能力线分布。
这就将问题引向了一个更深的层面。Clojure社区的门槛文化,在多大程度上是技术性的,在多大程度上是社会性的?这个问题之所以难以回答,是因为在Clojure的设计哲学中,技术性和社会性本身就是交织在一起的。
这是判例法系统的一个内在趋势:随着判例的积累,掌握判例体系的成本上升,系统倾向于从那些已经内化了判例的人中选拔新的判例制定者。这并不一定意味着社区的封闭——它只是意味着,社区的身份生产机制,越来越倾向于在内部复制,而不是从外部吸收。那些已经在走廊上走了很久的人,最终会被邀请进入房间。但那些刚刚踏上走廊的人,会发现自己面对着一条比前辈们面对的更长的路。
这个趋势会如何发展,是Clojure社区在未来必须面对的问题。它关系到社区是否能够持续更新自己,是否能够在保持判断力一致性的同时,不让门槛变成围墙。而这个问题,最终指向了一个更根本的追问:一个依赖判例法系统运作的社区,在判例的规模超过个人能够掌握的范围之后,还能维持它的治理模式吗?
这个追问,眼下还没有答案。但它已经以具体的方式,出现在Clojure社区的日常实践中。那些在2010年进入房间的贡献者,到了2020年,自己也成为了判例的承载者。Clojure社区调查显示,2013年有47%的受访者同时使用ClojureScript,2014年增长到55%,2015年达到66%。
当他们面对新一代的K时,他们是否能够意识到,走廊在他们身后变长了?他们是否愿意为那些正在走这条走廊的人,缩短一些距离?这些问题的答案,不在某一个人的意愿中,而在社区作为一个整体如何演化它的治理实践。如果说裁定者坐在房间中央,那么裁定者不是一个人,也不是一个固定的群体,而是那套通过十五年判例积累形成的判断框架。当目光转向那把椅子时,回应注视的不是一个人的声音,而是那套框架的沉默回响。这道回响,正在变得太过厚重,以至于新来者需要花费越来越长的时间,才能从中分辨出可以跟随的旋律。