陆鸣

自由开发者 · JavaKit 作者 · ⭐ 2,347 · 敏感词幸存者

从 GitHub 难民到 Gitee 敏感词幸存者

2026年8月11日,我失去了两千三百四十七颗星,以及一个用了五年的项目名。

当 GitHub 从互联网上蒸发的那一刻,我以为最坏的情况不过是“代码没了”。后来我知道,更坏的情况是“代码还在,但你不被允许使用它的名字”。

从大理到湖南

出事后第四天,我从大理那间月租六百块的民宿搬回了湖南老家。走的时候只带了一个行李箱和一台笔记本。那个曾在大理阳光下发呆的自由开发者,突然变成了挤在父母老房子里的无业游民。我的客户几乎全在海外,他们无法访问 JavaKit 的仓库,也就无法继续信任我。沙特那家银行的德国技术顾问发来一封冷冰冰的邮件,取消了年约十二万的续约。日本两家客户同时撤单。一周之内,年收入预期从十五万跌到了零。

但我不是一个容易崩溃的人。我开始疯狂地在国内平台上找替代。GitHub 死了,海外客户跑了,但国内还有市场。我把散落在本地硬盘、旧笔记本和U盘里的代码碎片拼凑起来,勉强拼出了 JavaKit 的一个降级版本——功能不全,文档全丢,但核心逻辑还在。我把项目改名叫 JTool,然后在 Gitee 上创建了一个新仓库。

那是我第一次和国内代码托管平台的审核系统打交道。

“Java” 是敏感词

第一天就出了问题。仓库创建后大约十五分钟,我收到系统通知:“您的仓库 JTool 因违反社区规范已被屏蔽,请修改后重新提交。”

我愣了。JTool 是一个纯 Java 工具库,里面全是字符串处理、日期格式化、文件操作之类的代码。我仔仔细细读了三遍社区规范,没找到哪里违规。申诉后收到的回复是一串自动链接,最终我在一个不起眼的角落找到了说明:“代码中不得包含可能引发误解的敏感字符串组合。”

我回到代码里一行行搜索,最后发现一个被标红的方法名:

public static String getJavaVersion()

审核系统在 getJavaVersion 中检测到 ava 连续字符串,触发了敏感词规则——因为 av 是一个被屏蔽的关键字。系统自动把 Java 替换成了 J**a,导致整个文件的语法炸裂,仓库因此被判定为“包含恶意代码”。

我盯着屏幕上那个 J**a 看了整整三十秒,然后笑出了声。Java 是一门编程语言的名字,全球几千万开发者在使用它,但在 Gitee 的审核规则里,它和“av”这两个字母的组合被一视同仁地判定为不可见人的内容。

《自我审查备忘录》

我改了那个方法名,把 getJavaVersion 改成 getLanguageVersion,提交通过。但麻烦才刚开始。

接下来的一个月里,我经历了无数次审核误杀。我的日期工具类里有一个 convertToISO8601,系统把 8601 识别为“可疑数字编码”而屏蔽了整段代码。文件处理模块里路径包含 temp 文件夹,系统认为 temptemple 的缩写,触发了宗教内容审核。字符串转义方法里用了正则 \\s,系统判定为“疑似SQL注入攻击”拦截了提交。代码注释里写了 // 待办事项:优化性能,系统把“待办事项”误判为“代办”,触发商业推广过滤。

最离谱的一次,一个网络请求模块里有个参数叫 apiVersion。审核系统把 piVersion 识别为 pornVersion 的模糊匹配,整个仓库被第二次屏蔽。我申诉了三天,客服回复“已转交人工审核”,又过了两天,人工审核结果是“正常内容,予以解封”。但这五天里,仓库页面显示“该仓库因违规已被屏蔽”,我刚拉来的几个国内用户全被吓跑了。

我开始在代码里主动规避一切可能的敏感词。把所有方法名里的 Java 替换成 Lang,把 convert 改成 change(因为 vert 疑似匹配品牌名),把 exec 改成 runCommand(因为 exec 可能关联恶意软件)。注释里所有的“注意”改成“请留意”,因为“注”可能被理解成“注射”。我写了一份长达三页的《自我审查备忘录》,贴在显示器旁边,每次提交代码前都对着清单逐行检查。

📋 自我审查备忘录(节选)
· 禁止 Java → 改用 Lang
· 禁止 convert → 改用 change
· 禁止 exec → 改用 runCommand
· 禁止 avg → 改用 average
· 禁止 temp → 改用 temporary
· 正则 \\s → 改用 [ \\t]
· “注意” → “请留意”

我的代码从优雅的 Java 变成了一种扭曲的、充满冗余命名的、看起来像自动化生成出来的东西。有一次深夜,我改完第三十七个被迫重命名的方法后,靠在椅背上望着天花板发呆。五年前我开始写 JavaKit 时,最头疼的是并发安全和 JDK 兼容性。现在写代码最大的敌人不是 Bug,不是性能,而是一个能把 Java 误判为 av 的 AI 审核系统。

敏感词幸存者

后来我在技术论坛上把这段经历写了出来,没想到炸出了一大群和我一样遭遇的人。有人说“我的变量名叫 avgSpeed 被判定为 av”,有人说“我的 lastValue 变成了 l**tValue”,还有人在代码里写了“日活跃用户”被判定为政治敏感内容。我们这一代开发者,到底是程序员还是逃荒的难民?

我回答:“都是。”

那之后马来西亚前端 Wei 找到了我,他的开源组件库 AvaUI 因为名字里含 ava 被 Gitee 拒绝创建仓库,最后只能改名叫 WeiVision。我们一拍即合,后来一起搞了个 Chrome 插件叫 DeCensor,自动把页面上被误判的变量名恢复原样。再后来,我遇到了方块鱼,遇到了陈小满,遇到了子昂。我们一起组了“敏感词幸存者联盟”,在 Minecraft 里屠了凋零和末影龙,拿回了微软存档里的星标数据。

那个被审核系统逼出来的《自我审查备忘录》,现在被我裱在书房的墙上。不是用来提醒自己避坑,而是用来提醒自己:我们曾经经历过什么。

“代码属于创作者。平台只是工具。永远。”

—— 陆鸣,2027年11月20日,湖南老家书房。
保温杯里的茶凉了,但代码还在跑。

评论 (7)

🐼
林子昂2027-11-20 14:32
陆哥,看完这篇我把我自己项目的变量名全检查了一遍。还好我的前端代码里没有“Java”……但是有一个 avgScore,吓得我赶紧改成了 averageScore。这审核系统是不是和“av”有仇啊😂
回复
🐟
方块鱼2027-11-20 15:05
我一个打游戏的,看到“getJavaVersion被判定为敏感词”的时候直接笑喷了。但笑完之后又觉得挺心酸的。你们这些写代码的,连给自己的方法起名字的自由都没有,这事比凋零还离谱。
回复
🇲🇾
Wei2027-11-20 15:47
陆哥,我到现在还记得那天你发消息说“我把 getJavaVersion 改成了 getLangVersionLookup”。我笑了五分钟,然后对着屏幕哭了。AvaUI 这个名字我已经用了六年,被 Gitee 拒绝创建的那天,我觉得我的项目被人杀死了。后来我们一起搞 DeCensor,我才觉得那口气终于顺了。敏感词幸存者,永远。
回复
🌱
陈小满2027-11-20 18:22
陆哥,我高二那年写的化学对战游戏里有个变量叫 avgScore,也被告审核系统标红了。当时我在宿舍改代码改到凌晨两点,室友以为我在看什么见不得人的东西。后来我把那个变量名改成了 averageScore,但每次打开那个文件都觉得心里不舒服。现在看到你的文章,才知道我不是一个人。
回复
老严2027-11-20 21:15
看完了。作为一个在全栈行业干了十年的老家伙,我见过各种离谱的技术决策,但“Java是敏感词”这个还是刷新了我的认知底线。陆鸣,你那本《自我审查备忘录》能不能分享一份?我们公司也在 Gitee 上搞镜像仓库,估计用得上……
回复
🗄️
一个匿名的 Gitee 审核员2027-11-21 02:03
我不能说太多。但我可以确认的是,那个审核规则不是人写的,是AI从一堆“违规样本”里学出来的。它不知道 Java 是什么,它只知道 av 不能挨在一起。我们内部提过无数次修改意见,但上面说“宁可误杀,不能漏网”。抱歉。
回复
方槐2027-11-21 09:40
Luming, I just read this through a translator. We never had these kinds of censorship issues in Germany, but I understand now why you were so determined to get the JavaKit stars back. That mug of yours — "Keep Calm and Code On" — makes perfect sense now. We're still waiting for you on the SourceWeave side.
回复