> 林子昂的博客
状态:已通关 | 星云CMS v3.0 完整恢复

屠龙之后:我的星云CMS终于完整了

2028年4月2日晚上九点,我坐在深圳南山一家网吧的包间里,左边是老严,右边是后端的李哥,旁边还有前端的小赵、老严的两个朋友——一个游戏公司的主程和一个户外探险教练。我们六个人并排坐在六台电脑前,屏幕上不是代码编辑器,而是《我的世界》的末地竞技场。外面围了一圈同事和家属,有人举着手机录像,有人抱着星帆科技logo的灯牌——那是公司行政专门做的,上面画了一把像素风的钻石剑。

我们即将挑战凋零和末影龙的混战。不是随便打打,而是微软官方发布的全球挑战——赢了,就能拿回GitHub关闭前星帆科技所有仓库的完整数据,包括星云CMS v3.0那四个月的开发历史。输了,那些commit记录、issue讨论、PR评审,就永远留在微软的离线存储里,再也拿不回来。

这个挑战听起来很荒诞。但比它更荒诞的,是我为什么会站在这里。

> 从404日到屠龙前夜

如果你读过我之前的两篇文章——《我上班第一天,GitHub就死了》《404日一周年》——你应该知道这段故事的开头。2026年8月11日,我入职第一天,GitHub全球关停。星云CMS v3.0的开发分支、设计方案文档、API变更讨论,全部消失。我当天下午被HR通知“先回去等通知”,在地铁站接到我爸电话的时候,银行卡余额只剩下268块4毛。

一年后,老严用微信把我找回来,以远程外包的形式参与v3.0的重建。我们用手头能找到的一切碎片——本地.git文件夹里的部分提交、Slack聊天记录里的代码片段、Internet Archive上爬到的页面快照——拼凑出了一个退化的版本。但那些丢失的讨论记录和设计决策,永远留在了那个消失的平台上。我在commit message里写过一句话:“这里的逻辑不要改,原因见issue #2847”。那个issue的页面,我只在Internet Archive上看到过一个残缺的标题,后面的内容再也找不回来了。

所以当2028年3月15日,纳德拉在视频里说出“凋零和末影龙混战”的时候,我第一反应是骂了一句脏话。第二反应是打开Minecraft启动器。我大学打了两年游戏,其中有一年半就在打MC。我曾经在宿舍里带着三个室友建过一个全自动刷怪塔,被辅导员查寝的时候抓了个正着。现在这些经历突然有了一个荒唐但真实的用途。

当天晚上我就在微信上拉了个群,群名叫“星帆重建组”。老严第一个响应,他只问了一个问题:“你真的会打末影龙?”我说:“会。但没同时打过两只。”老严回了一个字:“练。”

> 训练:从团灭到诱饵水晶

我们在本地搭了一个模拟服务器,用命令方块生成了凋零和末影龙的复制体。前三天,我们连一只boss都打不死。李哥不会疾跑和跳跃同时操作,每次躲避龙息的时候都会掉进末地虚空。老严有严重的资源焦虑症,背包里塞了六组金苹果还觉得不够,导致负重超标跑不动。小赵反应最快,但太喜欢近战莽,每次冲上去砍凋零都被炸飞到地图边缘。

我自己的问题是走位。每次末影龙俯冲的时候我都来不及切换到疾跑状态,方块鱼——一个B站MC速通UP主,后来成了我们的战术顾问——在语音里专门给我开了一个“林子昂专属提醒频道”,提前两秒喊我的名字。即便如此,前五天的训练成功率是零。

转机出现在第二周。陆鸣——你可能听说过他,他是JavaKit的作者,2300颗星在404日全丢了——他在分析我们训练的录像数据时发现了一个规律:当凋零和末影龙同时存在时,凋零会优先攻击末地水晶。他把这个发现写成了一份战术文档,叫“诱饵水晶策略”。核心思路是:第一阶段故意留下两颗水晶不拆,然后诱导凋零的骷髅头轰炸去伤害末影龙,让两只boss互相消耗。我们只需要在夹缝中生存,等它们两败俱伤之后收割。

这个战术听起来很美。但我们又练了两周,成功率才从零爬到百分之二十。最接近成功的一次,末影龙只剩最后一格血,李哥按错了键从高台上摔了下去,直接摔死。少了一个人的火力,末影龙回了一口血,全队团灭。那天晚上李哥在语音里沉默了整整十分钟,然后说了一句“明天继续”。第二天他买了一个新键盘。

方块鱼在他的B站频道上发了一系列训练视频,标题叫《我带五个程序员打MC是为了让他们夺回代码》。视频播放量最高的一期有两百多万,弹幕里刷满了“泪目”“J**a”“404”。有人评论说:“这是我见过最离谱的电竞理由。”也有人评论说:“加油,你们赢了就是我赢了。”

> 4月2日:十一分四十三秒

正式挑战那天,Twitch直播间同时在线人数突破了一百万。我们的队伍排在当晚第三场,队名是“星帆重建组”。方块鱼在B站开了转播,标题是“见证历史:程序员为代码而战”。

倒计时开始的时候,我盯着屏幕上的末地竞技场,忽然想起了很多事。想起第一天上班时那杯凉掉的美式咖啡。想起进度条停在73%的终端窗口。想起HR在会议室里说“先回去等通知”。想起银行卡里那268块4毛。想起老严说“绿萝我帮你浇水了”。想起过去一年半里我们用手工拼凑出来的那些代码碎片。想起issue #2847那个永远看不到的标题。

倒计时归零。末影龙的咆哮和凋零的嘶吼同时在耳机里炸开。

第一阶段很顺利。我们按照战术清理了七颗水晶,留下两颗。小赵稳稳地把凋零控制在龙池边缘。第二阶段开始出问题——末影龙的血量掉得比预期快,提前进入了狂暴模式,全屏龙息覆盖了整个竞技场。李哥的血量瞬间见底,小赵为了掩护李哥撤退被凋零的骷髅头连中两下,护甲碎裂。方块鱼在语音里吼:“别慌!按预案走!”

我们提前启动了第四阶段。我从背包里掏出最后三张床,冲进龙池正下方的死亡区域。末影龙正在俯冲,巨大的黑色翅膀遮蔽了整个屏幕。我把三张床一字排开,算准时机同时引爆。爆炸的冲击波把我的视角炸得剧烈晃动,血量从满格直接掉到了两颗心。但末影龙的血条也在同一瞬间从百分之十八直接被打到了百分之五,并且因为水晶被全部摧毁,它无法回血。

凋零还在狂暴。老严和方块鱼的血量都已经见底。方块鱼在击杀凋零的瞬间,把凋零死后掉落的下界之星扔向了末影龙。末影龙试图躲避飞行中的物体,结果一头撞上了残留在龙池边缘的爆炸残留伤害区域。那个区域里还有我之前引爆床时留下的火焰粒子效果,把末影龙最后一丝血量烧干了。

紫色的光柱从天而降。龙身化为无数光点消散在末地的黑暗里。屏幕上弹出两行金色大字:

凋零已击杀
末影龙已击杀

我摘掉耳机,发现手还在抖。旁边的李哥直接趴在键盘上哭了出来,一个三十多岁的大老爷们哭得像个小孩。老严眼眶红红的,站起来狠狠抱了我一下。小赵和主程大哥互相击掌,探险教练靠在椅子上长出了一口气,说了句“这辈子没这么紧张过”。包间外面的人全部冲了进来,有人开了香槟,泡沫喷得满屋都是。行政小姐姐用手机放着《我的世界》的主题曲,在C大调的像素风旋律里,我忽然发现自己的脸上湿了。

我是在哭。一年半之前,在南山科技园的写字楼下面,我想哭却哭不出来。现在,在深圳一家网吧的包间里,那些积攒了十九个月的眼泪终于找到了出口。

> 数据回来了

一天之后,微软的官方邮件到了。星帆科技的CTO亲自登录了数据恢复页面,把公司所有仓库的完整备份下载了下来。老严在Slack上发了一条消息:“全回来了。”

我打开那个让我心心念念了十九个月的仓库页面。v3.0分支的commit历史完整地躺在那里,第一条记录的提交时间是2026年7月3日,备注写的是“v3.0正式立项,祝我们好运”。我看到了自己第一天上班时还没来得及clone下来的那些代码文件,看到了那个让我耿耿于怀的issue #2847——它的完整标题是“修复多线程下的竞态条件,需特别注意数据库连接池的释放顺序”。下面有六位工程师长达三周的激烈争论,最终由老严拍板决定了一个方案。

原来那个方案的结论是“使用连接池的信号量控制”。我们后来在重建v3.0的时候,凭记忆重新实现了这个逻辑,但实现方式和原始方案完全不同。现在回头看那些讨论记录,发现我们走了不少弯路。但没关系——那些弯路本身也是重建的一部分。

🛡️
微软GitHub档案系统 · 星标认证
星云CMS · 星标数量:已恢复
验证哈希:a1b2c3d4e5f6...7x8y9z · 数字签名有效 · 2028-04-03T09:15:22Z

微软还给每个参与挑战的团队发了一个蓝金色的星标认证徽章。这个徽章可以挂在任何代码托管平台的个人主页上,点击即可跳转到微软官方的查验页面,证明这个开发者在GitHub上曾经拥有的项目是真实的。我把这个徽章挂在了SourceWeave的主页上,旁边加了一行注释:“这是我用三张床和一把钻石剑换来的。请尊重它。”

> 绿萝

挑战赛结束后的第二周,老严正式通知我回公司签合同。不是远程外包,是正式员工。工位还是当年那个工位,靠窗第三排,能看到深圳湾。桌上那盆绿萝已经从小盆栽长成了垂到桌腿的大株植物,老严说这十九个月他每天浇水,一片叶子都没少。

我签完合同,在工位上坐了很长时间。打开终端,敲了一行命令:

> git log --oneline --since="2026-08-11" --until="2028-04-03"

屏幕滚动出一条长长的提交历史。有些是我写的,有些是老严写的,有些是李哥写的。从v3.0的废墟重建,到诱饵水晶策略的模拟脚本,到战斗当天凌晨的最后一次演练记录。这些commit散落在不同的仓库里,但此刻它们被同一个时间区间串联在一起,构成了我十九个月的全部人生。

我想起方块鱼在挑战结束后发的一条动态。他说:“你们程序员是我见过最离谱的生物。你们会为了代码去屠龙,屠完之后第一件事不是庆祝,而是检查commit记录有没有丢。”下面有人回复:“这不是离谱,这是创伤后应激障碍。”方块鱼又回了一句:“不,这是爱。”

我以前觉得“热爱代码”这句话很矫情。现在我觉得方块鱼说得对。我们不是为了什么宏大的理想去屠龙的。我们只是想让那些丢失的commit回来,想让issue #2847的讨论记录重见天日,想让v3.0的提交历史不再是一串匿名者的幽灵记录。我们想让自己的代码,完整地、有尊严地,继续存在下去。

> 后来

2029年8月11日,SourceWeave正式上线。星云CMS的仓库被完整迁移到了这个去中心化的平台上,所有commit记录、issue讨论、PR评审都通过内容寻址重新锚定,不再依赖任何单一服务器。李哥在迁移完成之后发了一条消息:“以后再有404日,我们的代码还在。”老严回了一个啤酒emoji。

我的博客也跑在SourceWeave上,同时备份在三个不同的节点。博客的页脚加了一行字:“纪念 github.com (2008-2026) - GH = Go Home”。每次看到这行字,我都会想起那个73%的进度条,想起那杯凉掉的美式咖啡,想起网吧包间里李哥趴在键盘上哭的样子,想起方块鱼吼出的那句“我们赢了”。

那盆绿萝现在有六十三条叶子。上个月行政小姐姐给它换了一个更大的花盆,放在公司休息区的角落,旁边贴了一张纸条:“星帆重建组·纪念植物。浇水请适量,它已经比我们所有人都坚强了。”

他们删掉的不是代码。他们删掉的是一个可能的未来。但我们用三张床、一把钻石剑、和六个人十九个月的时间,把那个未来又夺了回来。

——林子昂,2028年4月3日,深圳南山。

最后编辑于:2029-08-12(补充了SourceWeave上线后的后续)

            ⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣶⣶⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀
            ⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀
            ⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀
            ⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀
            ⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆
            ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
            ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
            ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
            ⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
            ⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇
            ⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀
            ⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀
            ⠀⠀⠀⠀⠈⠙⠻⣿⣿⣿⣿⣿⣿⠟⠋⠁⠀⠀⠀⠀