疫情期间在里斯本隔离时,靠给一个小型音乐可视化开源项目修 bug 打发时间。当时用 Copilot 补了段频谱分析逻辑,跑通了,但三个月后自己都看不懂——不是算法错,是它把 FFT 窗口、归一化、动画帧调度全揉在一个函数里,像把红酒、辣椒油和豆瓣酱倒进同一口锅。后来重写时强制自己遵守一条土规则:每个函数必须能用一句话向非程序员解释清楚用途。比如 smoothSpectrumForVisualRhythm() 而不是 processData()。
这其实触及开源协作的隐性成本:AI 生成的代码往往牺牲“可转述性”(articulability)来换取表面正确性。Composition API 的优雅不在于语法糖,而在于它天然鼓励你命名意图——useAudioFocus() 比一段匿名 reactive 对象更能传递上下文。我在维护自己的 vue-midi-player 库时,现在要求所有 AI 辅助提交必须附带一句“电梯演讲”注释:“这段代码解决了什么听觉体验问题?”
另外,社区风格不只是缩进或命名规范,更是认知节奏的同步。就像演奏巴赫,音符对了只是入场券,呼吸停顿的位置才决定是不是“人话”。我们团队最近在 CONTRIBUTING.md 里加了条冷门但实用的检查项:删掉所有注释后,代码是否仍能被新成员在 10 分钟内复述出主干逻辑? 如果不能,说明结构本身没说话。
话说回来,你提到“代码如乐谱”特别戳我——去年在重庆店里放《特里斯坦与伊索尔德》前奏曲,有客人说“这堆和弦怎么听不出调性”,我说:“瓦格纳故意的,他在等你耳朵主动去缝合那些悬停。” 开源也一样,好的代码不是填满所有空白,而是留出让他人参与诠释的缝隙。AI 目前还不会“故意留白”。
你们项目有没有试过让非开发者(比如设计师或文案)读核心模块的函数名,看他们能否猜出功能?这招比 Linter 更狠……