惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AI
AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google DeepMind News
Google DeepMind News
T
Tenable Blog
博客园_首页
S
Securelist
Spread Privacy
Spread Privacy
Google Online Security Blog
Google Online Security Blog
Forbes - Security
Forbes - Security
Engineering at Meta
Engineering at Meta
U
Unit 42
L
LINUX DO - 热门话题
量子位
T
Threat Research - Cisco Blogs
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
Google DeepMind News
Google DeepMind News
GbyAI
GbyAI
Martin Fowler
Martin Fowler
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Security Latest
Security Latest
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
I
InfoQ
Know Your Adversary
Know Your Adversary
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
V2EX - 技术
V2EX - 技术
T
Tailwind CSS Blog
月光博客
月光博客
Recent Announcements
Recent Announcements
G
Google Developers Blog
F
Full Disclosure
W
WeLiveSecurity
宝玉的分享
宝玉的分享
腾讯CDC
G
GRAHAM CLULEY
Vercel News
Vercel News
Simon Willison's Weblog
Simon Willison's Weblog
美团技术团队
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Help Net Security
Help Net Security

暗无天日

读:AI Agent 安全日志——从可见性与隐私的两难说起 - 暗无天日 AI写作的语言指纹——如何让文字不那么像机器 - 暗无天日 读:50 条 Claude Code 技巧——一个工程经理的六个月使用心得 读:AI 辅助开发为什么让 E2E 测试更有价值 - 暗无天日 读:在Emacs中使用Claude Code(Spacemacs适配版) - 暗无天日 Claude Code 背后的工程哲学——读 Agent Harness Engineering 读:Agent Harness Engineering——AI 智能体不只是模型,还有套件 - 暗无天日 browser-harness:让 AI 直接接管你的浏览器 - 暗无天日 读:Security-First CI/CD —— DevSecOps 自动化实践指南 TIL: 数字小键盘的小数点陷阱与行内算术求值 - 暗无天日 读:Immutability 不是万能药,它是一种权衡 - 暗无天日 Conducty:给 Claude Code 加上项目记忆和并行执行能力 - 暗无天日 读 — GitHub Trending 里的 Claude Code 技能包 读 — Prompt Caching 省钱指南 TIL: Emacs 中那些跟鼠标配合的冷门快捷键 - 暗无天日 读:Anvil——把 Emacs 变成 AI 的工具服务器 读:Emacs 代码折叠终极指南 - 暗无天日 读:Clojure 搭车客指南 - 暗无天日 git推送失败后恢复仓库损坏的完整记录 - 暗无天日 多智能体系统的两个有效模式——以及对 Claude Code 用户的启示 - 暗无天日 用 Org Babel 写 Literate 博文:扩展执行 + 定制导出 proced:Emacs 内置的进程查看器 - 暗无天日 从 proced 定制中学到的 Elisp 模式 读:让 Emacs proced 在 macOS 上显示 CPU 和内存 异步编程的函数着色税 - 暗无天日 链式调用的代价:JavaScript 和 Clojure 的共同教训 - 暗无天日 hyperfine:命令行基准测试工具 - 暗无天日 管道中的变量去哪了?——子 shell 作用域陷阱 - 暗无天日 开源包装器的信任陷阱:四个危险信号 - 暗无天日 程序员愿意为 AI 写文档,却不愿为同事写 - 暗无天日 mktemp: Shell 脚本中临时文件的安全陷阱与最佳实践 - 暗无天日 WSL9x —— 在 Windows 9x 里跑 Linux 内核 6.19 用 ox.el 做你想做的事 —— org-export 高级编程指南 读:Hot-wiring the Lisp Machine —— 用纯 Elisp 构建零依赖的 Org 静态站点生成器 Elisp 性能优化的六个实战教训 - 暗无天日 fcitx5 下 Emacs 无法切换输入法的排查 - 暗无天日 ERT 测试交互命令的三种方式 - 暗无天日 SEM Assistant: 当 Elisp 守护进程遇上 LLM 用 dmsg 给 Elisp 加上结构化调试日志 用 org-habit 追踪非每日习惯 - 暗无天日 Clojure X-Men:当编程语言特性变成超能力 - 暗无天日 TIL: 用 diff-hl 在 fringe 中显示 git 变更 读:llm-test —— 用 LLM agent 驱动 Emacs 测试 TIL: AI 时代的橡皮鸭调试 - 暗无天日 fcitx 启动后键盘输入卡顿的排查 - 暗无天日 TIL: 早期网页的图片热区导航 - 暗无天日 读 Seeing the Whole System 用 Emacs 自动生成每周链接推荐 - 暗无天日 读:ASCII control characters in my terminal 读 What to learn - 暗无天日 Lisp 的括号之痛——一个愚人节玩笑揭开的老伤疤 - 暗无天日 一本书该"线性读"还是"并行读" - 暗无天日 读 How to Monetize a Blog:一篇伪装成变现指南的讽刺文 Python Mock 第三方依赖的四种策略 - 暗无天日 Emacs Lisp 热重载实用指南 - 暗无天日 Prot 的 Emacs 配置哲学 - 暗无天日 TIL: 从直播对谈中学到的三个 Emacs 技巧 - 暗无天日 TIL: 自动使用项目虚拟环境的 Python - 暗无天日 TIL: 让 Help buffer 自动获得焦点 一条命令让本地开发用上 HTTPS —— slim 工具介绍 用 fsck 检查和修复 Linux 文件系统 排查Linux进程"卡死"实战:从strace到gdb全流程 - 暗无天日 PostgreSQL 索引:从基础到你可能不知道的高级用法 - 暗无天日 用 .pdbrc 自定义 Python 调试器 ANSI 转义码的标准化现状 - 暗无天日 终端程序的潜规则 - 暗无天日 PARA Org-mode 测试配置 - 暗无天日 AI越强越辣鸡?控制论说这是必然的 - 暗无天日 AI 越强越需要你盯着——反馈循环实操指南 - 暗无天日 你的AI代理正在偷你的密钥——四种你没想到的泄露通道 - 暗无天日 LLM 在 DevOps 中的三种角色 - 暗无天日 写作风格的反建议 - 暗无天日 反驳本质复杂性——Dan Luu 论为什么《没有银弹》错了 - 暗无天日 文件充满了危险——Dan Luu 谈文件系统的可靠性陷阱 - 暗无天日 AI 时代的 PARA 方法:用 Org-mode 和 AI 打造个人知识管理系统 Linux 数据去重学习笔记 - 暗无天日 创建跨平台 ZIP 文件的隐藏陷阱:Extra Field - 暗无天日 X11 Forwarding 排障指南 - 暗无天日 IP欺骗端口扫描:当别人冒充你去扫描别人 - 暗无天日 Linux 输入栈全景解析:从硬件按键到屏幕响应 - 暗无天日 Unix 系统中那些被埋没的配置开关——以 FontConfig 为例 - 暗无天日 在Linux上限制儿童使用电脑 - 暗无天日 GIF不仅仅是一种图片格式——用GIF流做些奇怪的事 - 暗无天日 Leiningen 学习笔记:Clojure 项目构建与管理从入门到实战配置 - 暗无天日 Google SRE Book 读书笔记 - 暗无天日 yes 管道 head 发生了什么 - 暗无天日 为什么 nohup 在 crontab 中不起作用 Bash中的Indirection与Nameref - 暗无天日 Linux PAM 简介 - 暗无天日 从Linux ISO文件启动计算机 - 暗无天日 用 Bash 打造一个Screen Locker 用GitHub Actions自动构建EGO博客 - 暗无天日 blocking I/O 的作用 - 暗无天日 mobileog 手机端同步提示Error:2 No such file 的解决方法 回收 WSL2 VHDX 文件占用空间 使用 org-mode columnview 生成任务列表 - 暗无天日 Emacs 作为 MPD 客户端 - 暗无天日 移动文件路径却不破坏org file link的方法 - 暗无天日 如何合理的导出help link 成HTML - 暗无天日 笑话理解之Biology - 暗无天日
读:Before GitHub - 暗无天日
2026-05-08 · via 暗无天日

本文是 Armin Ronacher(Flask、Jinja2 的作者)在个人博客 lucumr.pocoo.org 上发布的 Before GitHub 一文的读后笔记。Armin 在开源社区泡了二十多年,从 SourceForge 时代一路走到 GitHub 时代,亲眼见证了开源世界的运转方式如何被 Git 和 GitHub 彻底重塑。这篇文章是一个老兵的回忆录兼诊断书:GitHub 曾经扮演了什么样的角色,现在出了什么问题,分散化之后我们可能失去什么。

GitHub 之前的世界:声誉驱动,充满摩擦

Armin 最早的开源项目放在 SourceForge 上,后来他跟 Georg Brandl 一起搞了个叫 Pocoo 的团体,自己搭 Trac、管 Subversion 仓库、维护邮件列表、发布 tarball,自己当系统管理员。在那个时候,你想发布软件,就得同时学会运维。

这不是个别现象。SVN 是中心化的版本控制系统,天然需要一个服务器,所以每个项目都有一个"家":一个主机名、一个目录、一个 Trac 实例、一个邮件列表归档。项目有地盘,地盘有人管。

这种高摩擦带来了一个副作用:开源的"人际信任网"。你知道哪些项目维护了很久,你知道维护者是谁,你熟悉那些邮件列表,你知道谁在社区里混了多年攒下了信誉。Debian 的人会跑来挑你许可证的毛病、检查版权头是否合规。烦人是烦人,但这也意味着有人在把关。

依赖也不是随便加的。加一个依赖意味着你得搞清楚它从哪来、谁在维护、有没有持续发布。很多依赖干脆直接 vendoring 到自己的 SVN 树里,因为那个年代的自动化抓取脚本太痛苦了,与其依赖别人的服务随时在线,不如把代码拷进来。

GitHub 出现之前的开源世界,摩擦本身就是一种筛选机制。你不付出一定成本,就没资格在开源圈子里刷脸。

Git 本该去中心化,结果反而养出了最大的中心

当 Mercurial 和 Git 出现时,它们在哲学上是 SVN 的反面。分布式意味着每个人都有完整仓库,每个人都可以有自己的分支、自己的历史。按理说,分布式版本控制系统应该降低对单一中心的依赖。

但现实走向了完全相反的方向。

GitHub 成了那个中心。全世界标准化了一个巨大的中心化服务来托管分布式的 Git。这是 Armin 眼中现代开源最大的反讽:分布式版本控制系统赢了,然后所有人选了一个超级中心来用它。

这不是 Git 的设计缺陷。Git 本身是为"多个家"设计的。是 GitHub 的产品体验太好,好到所有人都愿意把家搬过去。

GitHub 真正做了什么

Armin 列了 GitHub 的一串贡献:降低创建项目的门槛、让项目可被搜索发现、让不熟悉邮件列表的新人也能参与协作、提供 issue tracker、pull request、wiki、CI、API、webhook。这些贡献实实在在,但 Armin 认为 GitHub 最被低估的是另一件事:

它成了一座图书馆。

因为 GitHub 是中心,所有开源代码都放在同一个地方,它自然成了整个软件世界的统一目录。即使是废弃的项目仍然可以被找到,fork 关系清晰可见,旧 issue 和讨论永远在线。这种"可发现的记忆"不是任何去中心化系统天然具备的。Armin 自己的早期项目看起来还在 PyPI 上,但实际包文件早已随着他的旧服务器一起消失了。在 GitHub 之前,这是常态:域名过期、VPS 关停、开发者去世,他们维护的服务也跟着消失。

GitHub 的领导层曾经认真对待这件事:即使在最严厉的美国制裁下,他们也努力让伊朗开发者能继续访问 GitHub。

集中化带来了可发现的记忆。去中心化则意味着每个项目独立维护自己的历史,而历史很容易被遗忘。

npm 和依赖爆炸

微依赖问题不只是因为有人喜欢发 11 行的 npm 包。GitHub 和 npm 的组合降低了发布、发现、安装、依赖每个环节的摩擦感。当一切几乎零成本,包的依赖图就能以超出任何人推理能力的速度膨胀。

在 GitHub 之前,声誉和寿命几乎是被动融入依赖选择过程的。你得认真考虑是否要添加一个依赖,因为自动化程度低,加依赖很麻烦。在npm 生态里,这个功课被跳过了。GitHub 后来试图弥补这一点,措施包括通过 terms of service 澄清 license 问题,通过 trusted publishing 确保包的来源可信,但这些都是在一个已经膨胀起来的系统上修修补补。

更微妙的是,GitHub 慢慢成了信任体系的一部分:你看到一个 npm 包,会去看它的仓库,看维护者还在不在、issue 有没有人回、最近有没有改动、有没有别的项目在用。当 GitHub 本身的可信度在下降,影响的不只是源码托管,而是围绕它形成的整个供应链文化。

GitHub 正在衰退

Armin 的话说得很直接:GitHub 正在慢慢死去。他认为问题不出在个别产品决策上,而是系统性衰退:产品不稳定、功能瞎折腾、Copilot AI 的噪音盖过一切、领导力缺失。

跟几年前不同,现在离开 GitHub 的不再是边缘项目或激进自由软件信徒。Mitchell Hashimoto 宣布 Ghostty 将离开 GitHub,Strudel 和 Tenacity 搬到了 Codeberg。Armin 说他发现自己最近访问非 GitHub 属地的频率明显比一年前高了。

他的态度很微妙:一方面认为去中心化对开源是健康的,Git 本来就是为多个家设计的;另一方面也清醒地知道,回到多 forge 时代意味着大量信息会再次丢失。

分散化的真正代价

如果项目搬回自建的 forge、自己管的 Mercurial 或 cgit 服务器,代码在理论上仍然是分布式的(因为 Git),但社交上下文不是。Issue、代码审查讨论、设计决策、发布说明、安全公告、旧 tarball 链接,这些东西是脆弱的。邮件列表曾经承载了这些功能,但已经跟不上今天的协作需求,而且对普通用户极度不友好。

回到多中心意味着自主权回来了,不受微软领导层的喜好左右,不同社区可以选不同工作流。但代价是:网络会再次遗忘。

我们需要什么样的档案馆

Armin 提出了一个也是他整个论述落点的诉求:需要一个公开的、沉闷的、资金充足的存档机构。它的目标不是去做最好的开发者工具、抢占市场份额,只是确保最重要的东西不会消失。源代码归档、发布制品、元数据,再加上足够的项目上下文让人理解来龙去脉。这些不该绑在一家公司的商业模式或领导层心情上。

GitHub 意外地成了那个档案馆,因为它是开源活动的中心。一旦 GitHub 不再是中心了,别指望会自动蹦出另一个档案馆来接替它。Google Code 和 Bitbucket 的结局就是前车之鉴。

Armin 说他真心希望 GitHub 能恢复过来,毕竟大量历史存在那里,而且依然留在 GitHub 的人继承了一件真正重要的东西。但他不再认为把开源的持续记忆押在 GitHub 一家公司上是个负责任的选择。

读完全文,我印象最深的是"摩擦"这个词的反复出现。在 GitHub 之前,开源世界的摩擦系数很高:建项目有门槛、加依赖有成本、参与协作要懂邮件列表礼仪。这些摩擦让人不爽,但也迫使人在行动前多想想。GitHub 用十年时间把这些摩擦磨平了,然后我们发现自己面对一个新问题:当一切都变得太容易,质量、信任、记忆这些"副产品"该由什么机制来保障?Armin 不想要回到那些断链的 tarball 和废弃的 Trac 实例。他想要的是在前二十年教训上搭建的下一代:把开源的历史留住,但不再把这份记忆押在某一家的服务器上。