0%

它越是想往高处和亮处升上去,它的根就越发强有力地拼命伸向地里,伸向下面,伸向黑暗里,伸进深处——伸进罪恶。

引子 - 脆弱 (?) 的开源软件

近日 doom-emacs 的作者 Henrik Lissner 在消失了近半年后于 doom-emacs 的 Discord 频道发言说:

image

大意是:

大家好!我已经离开了这个项目和社区大约一个月左右,忙于处理家庭问题。如果算上去年我遇到的健康、网络和搬家问题,时间就更长了。更糟糕的是,我没有针对这些事情及时地告知你们(或者提前警告),我想在此道歉。加上过去几个月的几次失败的尝试,我已经开始让人们担心 Doom 的未来和它的 Bus factor 了。

明确一点:我不打算放弃 Doom —— 这只是我不幸而又分心的两年 —— 我希望这已经过去了。

在花了一周的时间赶上进度,合并 PR,并更新模块之后,我会在 Discourse 上发布一个更大的公告,详细介绍目前的情况,项目的发展方向,以及我未来如何解决巴士因子和沟通问题。

在此期间,你可以在 #development 频道找到我;如果你对项目有任何问题,或者最近给我发过私信/邮件(并期待回复),或者有任何准备好合并或需要我关注的 PR,请随时在那里联系我。

暂时抛开 doom-emacs 是什么这一点,Henrik 提到了一个很有意思的词:Bus Factor

维基百科对于这个词的解释是:

Bus Factor 巴士系数是软件开发中关于软件项目成员之间消息与能力集中、未被共享的衡量指标,也有些人称作“货车系数”、“卡车系数”。一个项目或项目至少失去若干关键成员的参与(“被巴士撞了”,指代职业和生活方式变动、婚育、意外伤亡等任意导致缺席的缘由)即导致项目陷入混乱、瘫痪而无法存续时,这些成员的数量即为巴士系数。

对关键成员的诠释为“对项目不可或缺”,即其掌握的项目消息(例如设计、源码、知识)并不被众多其他成员所熟悉、共享。在一个巴士系数很高的项目中,就算某个人突然不参与工作,也会有很多其他个人掌握相关的项目消息而足以接替他的位置。

而低 Bus Factor 其实是许多开源软件的通病,如果你常年逛 Github,应该会发现许多具有较高 Star 数量的项目因为无人维护而遭到了废弃。

最极端的例子是在 2022 年初知名开源工具 Faker.js 的作者 Marak 故意破坏了 GitHub 上的这个开源库,将项目所有代码清空,并在 commit 中留下“endgame”字样,以至于在当天,全世界各地的前端工程师上班的时候迷惑地发现自己的项目不能正常工作并且出现了一大段乱码。

image
Endgame 乱码

此外,他开发的另一个库 colors.js 也受到了影响。这两个开源软件库都是前端工程中举足轻重的基础,其中 colorjs 仅仅在 npm 上,每周下载量就超过 2000 万次(你可以理解为只要搞前端基本都会用到)。

Marak 老兄在 2020 年曾经面临过公寓失火导致自己无家可归的窘境,他从开源项目中获得的赞助不足以支撑他的日常开支。他的生活愈发困窘。以至于在 2022 年初他做了这个令人深感遗憾的无奈决定。

扩展一下,针对这个事件的有太多不同的看法了:
- 有人认为如果你不想大公司白嫖他的作品,就应该使用 GPL 乃至 AGPL 这样的传染性的 copyleft License 而不是使用 MIT License,MIT 这个 License 从一开始就授权给了所有人随意使用你的代码的权力。只是假如用了 GPL 的话整个项目还有没有如今的影响力就另说了(商业公司商业产品一般会在发布前组织法务来审查项目中的开源依赖以确定没有 GPL License 的依赖,否则全都得跟着开源)。
- 还有人认为项目发展至今,有无数开源贡献者为项目贡献代码,已经是整个开源社区的共同创作了,你没有权力把大家的努力变成 shit
- 支持 Marak 的声音也有,比如说有人说这些吸血虫吸我们的血太久了,至少你让他们感受到疼痛了!
- 还有一些人也从 License 的角度出发,虽然大家的确贡献了代码,但是纠结 License 的话,这本就是 Marak 的个人项目,MIT License 在授予了所有权利之后也相应的免除了作者任何额外的义务,所以 Marak 从法理上讲完全有权利这么做。

open source
_云基础设施的供应链现状 xkcd-2347_

类似的令人惋惜的事情还有不少,比如 Fakerjs 事件的主角 Marak 就提到了 Aaron Hillel Swartz,一位天才程序员,参与了初代 RSS 的开发,参与成立了 Reddit,他提倡知识开源,积极反对互联网盗版法案,为此他知行合一, 透过学院给予的访客账户,大规模系统性地下载 JSTOR 上的学术期刊并公开给大众访问。美国联邦检察官随后对他提起两项网络诈骗和十一项违反《电脑欺诈和滥用法》行为的诉讼, 他拒绝了联邦检察官提议其在联邦监狱服刑 6 个月的认罪协商,两天后,他被发现死在其于纽约布鲁克林区的公寓内,自缢而死。

image
Aaron Hillel Swartz

回溯历史,开源精神和开源软件可能是这个时代最不可思议的事情之一了:

一方面,开源软件运动自由软件运动,本身就不可思议,一群知识分子主动拆掉自己的专业护城河,很多情况下都是在反商业逻辑地践行着“人人为我,我为人人”的天下大同理念,为了什么呢?因为世界本该如此,为了整个社会的繁荣昌盛,因为这么做很酷,也因为编写软件本身给其作者就能带来无穷的乐趣——我自己毕业的时候也在想:哇,写代码还能 being payed,我的生活也太美好啦!

另一方面从事实上讲,不夸张地说,开源软件支撑起了当今整个软件行业,软件行业被开源彻底地改变了,以至于 MIT 计算机系著名的的开学第一课 6.001 - 著名的 SICP(Structure and Interpretation of Computer Program) 现在都已经停课,教授 GJS 说:“现代软件工程由于变得过于复杂,使得其相比于工程更像是科学,因为没人需要从头开始构建大型系统了——也很少有人有这个能力了”。

你可能会感叹说,事情变成今天这样,一群理想主义者有如此遭遇,真是理想的幻灭啊!

但事实真的如此吗?

开源软件的动力学

理想主义虽好,但理想必须要根植于现实才能生根发芽。让我们请出布迪厄的“场域-资本-习性”社会学理论,来更好地解释这一切。

[(习性) (资本)] + 场域 = 社会实践

简单来说,把某种特定的主题的由人创造和构建的社会空间(场域)当作一种游戏,而我们每个人都是玩家。

身为玩家,尽管在经验层面上讲我们常常觉得我们是自由的行动者,但我们每天所做出的各种决定有往往是基于可预见的、规定的行为以及他者的态度,也即在和这个游戏本身互动的过程中形成的一种惯用策略——一种习惯(习性)。

在这种习惯的影响下根据我们当前的地位(资本)依照游戏的规则规则和我们所采用的策略来进行博弈和斗争,以占取这个游戏中更有有利的地位;

以上的整套主客观一体的有机体就构成了(经由不专业的我总结的极简版的)布迪厄的社会科学世界观。

从游戏的比喻中回到现实世界,同样,没有任何一个人可以在不为了某种利益去行动,而这个行动的目标大概率是希望能够增加自己所持有的资本。

image
Oliveira 在 IEM 2023 上夺冠,从此人人都知道了李哥

你可能会觉得,如果这样讲的话,那么我们在生产、实践、生活中所见到的利他行为、在艺术、科学等领域的奉献精神,以及这篇文章所讲的开源精神又该作何解释呢?

按照布迪厄的定义,资本不仅仅是经济资本,还应该有包含文化资本、科学资本等资本在内的符号资本。意识到有不同形态的资本之后,布迪厄不认为社会的生产生活实践中存在任何无功利性的行为,他以一种类似博弈论的视角认为人的所有行为都是基于对于某种利益的计算为出发点的,为了攫取某种形态的资本而已——如果不是我们所认为的一般意义上的经济资本的话。

在不同的场域内,不同的资本起着主导作用——简单来说学术圈,就是科学资本,艺术和文化领域自然是文化资本,而不同的场域内的不同资本存在着某种汇率,所以我们可以经常看到一些政治或者文化精英通过发挥自己的影响力来攫取经济资本,反之亦然。

这里我希望荡开一笔,布迪厄理论的进步性在我看来,就是所有的场域都是由人类创造的,而不是涌现于人类社会中的,它解释了许多现象为何如此,同时也暗示了一些看似根深蒂固的思想观念和社会现象不必然如此,也就是说,这里不存在某种纯粹应然的“天理”,如此一来,就有了推翻并进步的可能性,历史没有终结。

image
就你小子认为历史终结了是吧,现在我就告诉你历史的终结终结了

回到主题,在这套理论框架下看待开源精神,就可以被解释为:在开源软件场域内,黑客们(请注意,黑客 Hackers,喜欢通过智力和创造性方法挑战难题的人,绝非骇客 Crackers,计算机犯罪者,中文互联网常常将这两者混淆,造成了黑客一词的污名化)为了诸如“声誉”等文化资本的积累,来为这个世界贡献开源代码。

这其实和农业社会出现之前,我们的祖先所生活的小型狩猎采集群体中常常出现的一种礼物文化一脉相承。在大自然丰富的物产馈赠之下,社会关系由这种礼物文化所支撑,部落酋长们常常会公开地进行一些慈善行为。正如《大教堂与集市》这本著名的黑客文化文集中说的那样:在开源软件这个场域内,没有非常稀缺的“生存必需品”,早期的软件是自由共享的,这种物质充裕导致了成功的唯一标准就是同侪中的声誉。

但黑客文化和软件终究没有止步于一个物产丰富的小圈子,不同于冯·诺伊曼教授的预言“这个世界只需要大概 5 台计算机就够了”,如今,软件的确在吞噬整个世界,这很好,说明在人类的生产生活实践中软件发挥了无可替代巨大作用。另一方面,在资本主义的作用之下,软件行业对于其他行业的渗透也必然导致场域的交叠和融合,从而使得这个行业必然要在某种程度上服从资本主义世界的逻辑——当计算机技术和软件行业从一群不愁吃喝的美国中产阶级黑客的小圈子文化中走向整个世界,成为人类生产生活实践中不可或缺的一部分时,开源精神的原始内核必将遭到挑战。

因此,开源软件势必要从最初那种乌托邦式的,只属于少部分技术精英的田园牧歌走向大众,开始拥抱支撑着这个世界 70 亿人的资本主义和商业逻辑。

无数的历史已经说明生产关系到另一种生产关系的变化必然伴随着阵痛,但作为历史唯物主义者,我们不认为从古希腊城邦的雅典式民主一路走向资本主义是开历史的倒车,相反,这是一种极大的进步。

开源软件的现状及其典型商业模式

自从曾经的微软以它臭名昭著的 “拥抱,扩展,灭绝” 战略绞杀了当时的明星软件 Netscape 赢得了浏览器大战后 Netscape 浏览器以 Mozilla Firefox(就是今天的火狐)的名义重生,同时带来了开源运动起,到开源厂商 RedHat 于 1999 年成功上市,再到如今的 Microsoft Love Linux(TODO:图),以开源软件驱动的创业公司层出不穷,我认为可以说至少到今天为止,即使拥抱了它所“鄙夷”的资本主义商业逻辑,开源运动离失败二字也相差十万八千里。

image
CNCF landscape,里面列举了云原生领域的一整个生态的各种软件项目

然而开源软件的确已经分化出两种不同的形态:

第一种是原初的,由黑客从自身需求出发,编写软件并开源给更多其他黑客一同共建的乌托邦式的第一代开源软件,像是 Vim、Emacs、Python、Linux、PostgresQL 这类经过时间的沉淀,留存到今天的鼎鼎大名的这类开源软件基本上已经成为了开源软件的符号标识为人们所敬仰和歌颂。

我接触 Emacs 就是因为觉得 Notion 实在太好用了,好用到开始审视自己的文档工具,进而催生了一个问题:我真的要把这些可能伴随我一生的笔记数据托管给这个虽然红极一时但是大概率没有我活得长的商业公司吗?然后转而有意地考察并使用了 Emacs 的 Org-mode 来进行笔记的写作和任务的管理,然后发现对我来说 Ord-mode 比 Notion 不知道高到哪里去了;但是这种需求相比之下还是太小了,人类对于软件的需求更多是更快、更好、更便宜地解决当下遇到的问题,所以诞生了第二种开源软件。

第二种是新生的,有商业逻辑驱动,除了践行“人人为我我为人人”的大同理念以外,将开源作为一种战略考量和市场策略的开源软件(和它们背后的商业公司),像是如今的 MongoDB、ElasticSearch、Akka、RedHat、Ubuntu、GitLab、HashiCorp stack 等等,例子数不胜数,到今天围绕着开源软件也形成了数套经过验证的切实可行的商业模式,如今的创业者甚至不需要说服熟悉开源的 VC 为什么开源创业有可能成功。举例来说:

围绕着上游核心开源软件做发行版或者解决方案,售卖 License 或者软件订阅服务,换取运维层面的方面或者软件可用性保障,这方面的例子有 Ubuntu、RedHat 之于 Linux,各家公有云的 Kubenetes 容器服务,各家公有云的数据库服务(搞得 MongoDB 被白嫖到修改开源协议来禁止商业竞争)。

基础功能免费开源,高级的商业团队特性闭源收费,这方面的例子有 GitLab、InfluxDB、Grafana、Envd/Modelz,HashiCorp Stack。

围绕着 Linux、Kubernetes、PostgresQL、Prometheus 这种复杂的大型开源软件做咨询服务的。

开源的商业模式能够走通的原因在于软件源码并不等于围绕着这个软件的所有知识:包括软件的设计思想、架构演化的历史、以及最重要的稳定运行的运维知识;这些对于需要稳定运行在上面的上层应用而言非常重要的知识往往只掌握在核心的开发者手中,就构成了商业化的基本逻辑。

举个例子,一家主营业务不是公有云各类服务的企业因为需要使用云服务器、数据库、容器服务等技术就自己从头搭建机房开始手搓一套云基础设施而不用 AWS 或者阿里云之类的公有云服务,这显然是不现实的。

你可能会问,既然业务不同,也不关心源码,那么是不是开源软件还有什么要紧?

在这些领域内如果有商业公司想要通过售卖自家的闭源软件,比如说一套兼容了 POSIX 接口协议的操作系统,那么他们必将受到这样的质疑:你的软件相比于经过了 30 年检验的 Linux 到底好在哪里?我们发现在现在,根本没有企业试图去和 Linux 竞争,相反大家都只会去做差异化的部分。


对于开源软件乃至软件行业的这样的变化,我感到十分兴奋。
为什么这么说呢?

尾声 - 人民史观 vs 英雄史观

在文章开头提到的 Henrik 无疑是那个群星璀璨的乌托邦时代在今天的继承者,是绝对意义上的英雄,是 Henrik 编写的 doomemacs 让我这个 Vimer 在 Emacs 的世界中有了立足之地,甚至获得了比 Notion 还好不少的文档编写体验;是 Henrik 引领我发现了神奇的 NixOS,从此彻底告别无止境的系统配置和痛苦回滚。

虽然针对这次的 Bus Factor 的小小风波 Henrik 表示他绝对不会放弃 Doomemacs,也承诺说会给社区一个交代。但或迟或早,英雄总会迟暮,到了那个时候,追随着英雄的脚步的我们该如何呢?

image
The net is vast and infinite. 我很喜欢最后素子消失在网络中这个结局。观众不需要作为偶像的素子,素子也不需要用自我来束缚自己

就文档领域而言,从 emacs / org-mode 的繁荣社区中,站起来了 LogSeq 这样的好用的文档工具和创业公司(种子轮 4.1M$),在 Notion 的阴影下也诞生了开源的 AFFiNE(Pre-A 轮上千万美元融资)这样的明星团队。

类似的事情如今在软件行业的各个领域都层出不穷,而这一切都是一代代开源软件和理想主义者前辈为如今的世界铺下的坚实基础设施,这个行业的巨头几乎已经无法像二十年前那样轻松地就能垄断一整个行业。我相信,基础设施的进一步完善,在未来将会打破社会精细化分工这一虚假的神谕,每个人都可以自由地运用这些工具做点什么有趣的事情。

英雄虽然会迟暮,但不同于历史上的一些其他悲剧,开源软件场域内的人民没有背叛英雄,相反,他们沿着英雄们开创的路真正地改变并改造了这个世界,如今,开源软件曾经的“敌人”微软,也成为了开源软件和开源运动的践行者。

开源软件从大学的象牙塔走向资本的拥抱是历史的必然,开源精神的理想没有随着这种转变而磨灭,相反,它催生出一个人们不把全部希望寄托在英雄身上的崭新世界。希望我们的理想都能像开源软件般在坚实的土地上生根发芽,伴着世界的污泥,从中吸取养料,茁壮成长,长成一棵参天大树。

Table of Contents

  1. 开始前的准备
    1. 为什么是 Harbor-Operator
      1. Worse is Better?
        1. The right thing
        2. Worse is better
      2. Golang - the language
      3. Kubernetes - the platform
  2. 目标
  3. 源码阅读
    1. 静态结构
      1. 目录结构
      2. 关键接口
      3. 系统架构
    2. 抓大放小:HarborCluster
    3. 解决资源间的依赖关系: Dependency Graph
      1. AddResource
      2. Run
      3. 初始化
    4. 将代码复用率提高到极致:Controller
      1. 数据结构
      2. Reconcile 逻辑
    5. 代码即配置:ResourceManager
    6. 最后的迷团:ProcessFunc
Read more »

Hi everyone! It’s been a looooong time since we met the last time, how have you been?

I’ve been very busy with my new work at Bytedance, and why am I write this lil blog post in English? I’ll explain.

Read more »

本文的目标读者是刚刚开始接触监控系统,以及对 Prometheus 知之甚少的弱势群体(一如写就本文时候的笔者)

本文中用于搭建 Prometheus 的环境:

  • K8s version: 1.19.3
  • Prometheus version: 2.22.0
  • 操作系统:Archlinux at 2020.11
  • 配置了 hosts,Devbox 的域名为 devbox

⚠️ 请注意:本文列出的命令行参数需要根据当前环境稍作调整(比如 Prometheus 二进制包版本等)

这里列出了一些推荐的前置阅读项:

  1. 可观测性:概念和最佳实践 在其中介绍了可观测性的各类基本概念
  2. 初步认识 Prometheus 介绍了 Prometheus 项目
  3. Prometheus 官方网站的介绍

目标

既然是在 K8s 上手动搭建 Prometheus,那我们在这里有两点规约

  1. 刻意不去使用 Helm-Chart,Prometheus Operator 之类的快捷部署方式,这里列出来供参考:

    1. Prometheus 社区维护的 Helm chart
    2. Prometheus Operator
    3. Kube-Prometheus
  2. 在 K8s 上搭建 Prometheus,即 K8s 负责管理 Prometheus 服务,和上面提到的 Prometheus Operator 不同的是,在这里我们要自己写相关的各类 YAML 配置文件。
  3. 列出如下监控目标:
    1. Prometheus
    2. Node exporter
    3. Kubelet
    4. Cadvisor
    5. ApiServer

那我们开始吧!

Read more »

前段时间我回到了苏州,葡萄没有跟着我回来,在关灯准备睡觉的当口发现在窗帘上有几处深深的小爪印,我终于没忍住,深夜中从床上爬了起来,思量起葡萄独自在家的大半个月——时间以及伴随着时间流淌着的,在生活中影响了我的事物。

Read more »

“喝吧!等离子蛋蛋,这是你们一族的命运!”刚刚洗完澡给地上的赤皿添满水的Bryan提着劲吐出雄浑的音色说到。

等离子蛋蛋和Bryan语言不通,事实上,在他们两个中只有一个人会说话。虽然讲得有些离谱,但Bryan说的至少是实话——谁不需要喝水呢?

Read more »

Bryan没有想到,悲哀竟也具有延时性——过去的鬼魂又找上来,而这一次,他再也没有力气抵抗。

Read more »

还差几顿散伙宴席,几件待取的物品,几天后我就真正毕业了,离开甜睡梦乡,再度踏上现实的土壤。

适才和大班长聊天,我们心里都清楚这大概是毕业前最后一次聊,聊的无非是前程,最后止于一个暗号似的短语,我发出去,他又发回来:为世界之光

它出自西安交通大学校歌。

美哉吾校,真理之花,青年之模楷,邦国之荣华,

校旗飘扬,与日俱长,为世界之光,为世界之光。

美哉吾校,鼓舞群伦,启发我睿智,激励我热忱,

英俊济跄,经营四方,为世界之光,为世界之光。

美哉吾校,性灵泉源,科学之奥府,艺术之林园,

实业扩张,进步无疆,为世界之光,为世界之光。

美哉吾校,灿烂文明,实学培国本,民族得中兴,

宇土茫茫,山高水长,为世界之光,为世界之光。

毕业在即,很多事情很多人都来不及处理和告别,自己就要随着时代的洪流匆匆离去,或是被拍打在更广大的命运的岸堤上,或是乘风破浪,砥砺前行,成为时代的领航者。且不说有句说烂了的漂亮话:”我们的征途是星辰大海“;雄心壮志总是有的,尤其是这个时候——分别的时候——结束的时候——新开始的时节。这种心情,我想惟有我这又爱又恨并且即将要离开的母校的校歌中的这句“为世界之光”能表达。

Read more »