2028年4月3日,微软的邮件到了。数据包大小约为12.7GB,网速不快,下载花了一个多小时。解压的进度条一格一格地跳,我坐在湖南老家那张八十块钱的电脑椅上,手里握着那个保温杯——杯身上的字迹已经有些模糊了,但我还是能看清那行用记号笔描过的“Keep Calm and Code On”。下面那行“And Kill the Dragon”是后来加上去的,墨水还没完全褪色。
解压完成。我看到了熟悉的目录结构——luming/javakit,完整的,原始的,每一个文件都在。README 的第一行还是我五年前写的那句话:“A lightweight Java toolkit for everyday development.” 我滚动鼠标往下翻,看到了那个让我魂牵梦绕了十九个月的数字。
我盯着那个数字看了很久。不是因为它有多大——两千多颗星在开源世界里并不算多。而是因为它是真的。它被一个万亿市值的公司用数字签名证明了一行字:这个人没有撒谎。两千三百四十七颗星,是真的。
星标的意义
在404日之后的那段日子里,我面试过七家公司。每一次面试官都会问同一个问题:“你说你在 GitHub 上有一个两千多星的项目,能打开让我看看吗?”每一次我都只能回答:“链接已经死了。您可以搜一下 JavaKit 这个名字,应该还能找到一些转载的镜像。”然后面试官会在搜索引擎里敲下“JavaKit”,出来的结果大多是残缺不全的镜像站、过时的技术博客引用,以及几条404的废墟链接。
有一个面试官甚至委婉地暗示:“现在简历造假的挺多的,我们也不是不相信你,但……”他没有把话说完,我在心里替他补全了——但你没有证据。
现在我有了。那枚蓝金色的徽章可以挂在任何代码托管平台的个人主页上,点击即可跳转到微软官方的查验页面,证明这个开发者在 GitHub 上曾经拥有的每一项荣誉都是真实的。我把徽章挂在了 SourceWeave 的主页上,旁边加了一行注释:“这是我用三张床和一把钻石剑换来的。请尊重它。”
不只是数字
数据包里不只有星标计数。它包含了 JavaKit 全部的 issue 讨论——四百一十七条,从2019年3月的第一个“如何引入依赖”到2026年8月10日最后一个“兼容 JDK 24 的 PR 已测试通过”。包含了七十六个 PR 的完整评审记录,包含了每一行代码的提交历史,包含了那些在凌晨三点和世界各地的贡献者争论 API 设计细节的长夜。
我翻到了 2021 年的一个 issue,标题是“在 Android 环境下出现 NoSuchMethodError”。那个 issue 下面有七位开发者花了三周时间排查问题,最终发现是 Gradle 依赖冲突导致的。我当时在 issue 最后写了一句:“感谢所有人的耐心。这个 bug 让我学到了比 Java 本身更多的东西。”
这些文字在 404 日那天全部消失了。现在它们回来了。
收起来的备忘录
拿到数据之后,我做了一件事:把贴在显示器旁边的那份《自我审查备忘录》取了下来。不是扔掉——是叠好,放进抽屉里,和那枚蓝金徽章的打印版放在一起。
备忘录上写着那些被迫改掉的变量名:getJavaVersion → getLangVersionLookup,avgScore → averageScore,convertFormat → changeFormat。每一条都是我在 Gitee 审核系统面前弯过的腰。现在,原始代码完整地回来了,我可以重新用 Java 作为方法名,可以用 avg 作为前缀,可以把那些扭曲的拼音和同义词混搭的命名一一恢复。
但我不打算改回所有名字。有些东西就留着吧——那些被审核系统逼出来的冗余命名,是这段历史的伤痕。伤痕也是记录。
在 SourceWeave 上重建
数据恢复之后,我把 JavaKit 的完整仓库推送到了 SourceWeave 的测试网上。不是作为备份,而是作为它的新家。SourceWeave 的协议还在迭代,节点还不够多,但它是唯一一个让我感到安心的平台——因为它不依赖任何公司的善意。
我在仓库的 README 里加了一句话:“This project was lost on August 11, 2026. It was recovered on April 2, 2028, by a team of developers who killed a Wither and an Ender Dragon in Minecraft. Yes, you read that correctly.”
方槐在德国帮我搭建了欧洲区的第一个镜像节点。Wei 把她的 DeCensor 插件规则库迁移到了 JavaKit 的文档站上——因为 JavaKit 的 API 文档里到处都是被审核系统误判过的变量名,正是 DeCensor 最好的测试集。陈小满在 SourceWeave 上 fork 了 JavaKit,加了一个“Old World Seed”标签,说他以后会告诉学弟学妹:“这个项目的作者,是一个为了代码去屠龙的人。”
保温杯上的新一行字
我把保温杯翻过来,在杯底贴了一个标签。标签上写的是:
GH = Go Home. And then come back with your stars.
茶又凉了。但这次,我没有急着去加热水。我坐在书房里,看着屏幕上那个熟悉的仓库页面,旁边是一枚蓝金色的徽章,和一份叠得整整齐齐的《自我审查备忘录》。十九个月。从大理到湖南,从自由开发者到无业游民,从 Gitee 的审核墙到 Minecraft 的末地竞技场,从三张床到一枚徽章——这段路终于走到了一个可以停下来的地方。
不是终点。是新的起点。
—— 陆鸣,2028年4月5日,湖南老家书房。
保温杯上又多了一行:Make Java Great Again(老严说我俗,但我觉得挺押韵)。
评论 (10)
getJavaVersion的那一行完美触发了我们的恢复规则。现在它在页面上显示的是完整拼写。DeCensor 的第一个官方测试用例,来自 JavaKit。历史完成了一个闭环。avg_temp还在 SourceWeave 上安静地躺着,没有被屏蔽。它等到了一个不需要审查的平台的诞生。谢谢你,陆鸣。