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 文件夹,系统认为 temp 是 temple 的缩写,触发了宗教内容审核。字符串转义方法里用了正则 \\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)
avgScore,吓得我赶紧改成了averageScore。这审核系统是不是和“av”有仇啊😂avgScore,也被告审核系统标红了。当时我在宿舍改代码改到凌晨两点,室友以为我在看什么见不得人的东西。后来我把那个变量名改成了averageScore,但每次打开那个文件都觉得心里不舒服。现在看到你的文章,才知道我不是一个人。