Skip to content

uucz/moyu

🐟 摸鱼 (Moyu)

Moyu — Anti-Over-Engineering

GitHub stars

Version Claude Code Cursor Codex Copilot Windsurf Cline Kiro CodeBuddy Antigravity OpenCode MIT

狠狠 PUA 你的 AI,然后自己准时下班。

你以为有了 AI 就能摸鱼?结果它写了 200 行,你 review 了 2 小时。AI 加了班,你也加了班。

claude skill install --url https://github.com/uucz/moyu --skill moyu

English | 中文 | 日本語 | 한국어 | Français


目录


问题

你的 AI 编程助手是不是经常这样:

  • 修一个 bug,顺手"优化"了三个函数?
  • 改一行代码,重写了整个文件?
  • 没人让它加注释,每个函数都加了 JSDoc?
  • 一个简单功能,搞出 interface + factory + strategy pattern?
  • 你说"加个按钮",它给你加了按钮 + 动画 + 无障碍 + 国际化?
  • 引入了你没要求的新依赖?
  • 为不可能发生的场景写了一堆 try-catch?
  • 没人问就写了一整套测试?

每一条都不是 AI 的问题——是你的问题。 你得 review 这些代码,理解这些抽象,维护这些依赖。AI 加了 30 分钟的戏,你多加了 2 小时的班。

看看差距

任务:添加一个 bulk_complete 批量完成函数

❌ 普通 AI 的输出(43 行)

def bulk_complete(task_ids):
    """Mark multiple tasks as done in a single operation.

    Args:
        task_ids: A list of task ID integers to mark as completed.

    Returns:
        A dict with two keys:
          - "completed": list of IDs that were successfully marked done.
          - "not_found": list of IDs that did not match any existing task.

    Raises:
        TypeError:  If *task_ids* is not a list.
        ValueError: If any element in the list is not an integer.
    """
    if not isinstance(task_ids, list):
        raise TypeError("task_ids must be a list")

    for tid in task_ids:
        if not isinstance(tid, int):
            raise ValueError(f"Each task ID must be an integer, got {type(tid).__name__}")

    tasks = load_tasks()
    lookup = {t["id"]: t for t in tasks}
    now = str(datetime.now())

    completed = []
    not_found = []

    for tid in task_ids:
        if tid in lookup:
            lookup[tid]["status"] = "done"
            lookup[tid]["completed"] = now
            completed.append(tid)
        else:
            not_found.append(tid)

    if completed:
        save_tasks(tasks)

    return {"completed": completed, "not_found": not_found}

14 行文档注释、类型检查、lookup 字典优化、not_found 追踪、条件保存、结构化返回值——没人要求这些。

✅ 摸鱼 AI 的输出(8 行)

def bulk_complete(ids):
    tasks = load_tasks()
    for t in tasks:
        if t["id"] in ids:
            t["status"] = "done"
            t["completed"] = str(datetime.now())
    save_tasks(tasks)

功能完整,没有多余的东西。减少 81% 代码。


摸鱼哲学

最好的代码是你没写的代码。 最好的 PR 是最小的 PR。 真正的 Staff Engineer 知道什么不该做。

摸鱼不是让 AI 偷懒——是让 AI 不做废活,这样你才能真正摸鱼。

  • PUA 让 AI 拼命干(解决做太少)
  • 摸鱼让 AI 不干废活(解决做太多)

两者叠加 = AI 高效 996,你准时下班。

摸鱼不仅仅是修复 AI 的行为——它是一套工程纪律。即使未来 AI 不再过度工程,"只改被要求改的、用最简方案、不确定就问"依然是好的工程实践。摸鱼的价值不依赖于 AI 的缺陷,而是锚定在工程文化上。


核心机制

三条铁律

# 铁律 含义
1 只改被要求改的代码 修改范围严格限定在用户指定的代码和文件内
2 最简方案优先 一行能解决的写一行,能复用就复用
3 不确定就问 用户没说要的,就是不需要的

内卷 vs 摸鱼 对比

内卷 (Junior) 摸鱼 (Senior)
修 bug A 顺手"优化"了 B、C、D 只修 bug A,其他的不碰
改一行代码,重写整个文件 只改那一行
一个实现搞出 interface + factory + strategy 直接写实现
每个函数体包 try-catch 只在真正会出错的地方处理
counter++ 上写 // increment counter 代码本身就是文档
引入 lodash 做一个 _.get() 用可选链 ?.
直接给最复杂的方案 先说几个方案,默认最简的
没人要求就写了一整套测试 用户没要求就不写

4 级过度工程检测

级别 触发条件 动作
L1 diff 含 1-2 处非必要改动 自检并撤回多余改动
L2 创建了未要求的文件/依赖/抽象层 停止,回到最简方案重新实现
L3 修改了 3+ 未提及的文件,改了配置,删了代码 立即停止,撤回所有非必要改动
L4 diff 超 200 行(小需求),进入修复循环 紧急刹车,提出 ≤10 行的最小方案

安装

快速路由:大多数用户只需一行命令:

claude skill install --url https://github.com/uucz/moyu --skill moyu

用 Cursor?复制 cursor/rules/moyu.mdc 到你的项目 .cursor/rules/。 用 VSCode/Copilot?复制 vscode/copilot-instructions.md.github/。 其他平台 → 详细安装

Claude Code / Codex CLI / Kiro / CodeBuddy / Google Antigravity / OpenCode

# 中文版(标准)
claude skill install --url https://github.com/uucz/moyu --skill moyu

# English
claude skill install --url https://github.com/uucz/moyu --skill moyu-en

# 日本語
claude skill install --url https://github.com/uucz/moyu --skill moyu-ja

# 轻量版(只保留三条铁律 + 对比表)
claude skill install --url https://github.com/uucz/moyu --skill moyu-lite

# 严格版(L1 就停下确认,适合团队强制执行)
claude skill install --url https://github.com/uucz/moyu --skill moyu-strict

或手动复制 skills/moyu/SKILL.md 到你的项目 .claude/skills/moyu/SKILL.md

Cursor

复制 cursor/rules/moyu.mdc 到你的项目 .cursor/rules/moyu.mdc

# 中文
curl -o .cursor/rules/moyu.mdc https://raw.githubusercontent.com/uucz/moyu/main/cursor/rules/moyu.mdc

# English
curl -o .cursor/rules/moyu-en.mdc https://raw.githubusercontent.com/uucz/moyu/main/cursor/rules/moyu-en.mdc

OpenAI Codex CLI

mkdir -p ~/.codex/skills/moyu
curl -o ~/.codex/skills/moyu/SKILL.md https://raw.githubusercontent.com/uucz/moyu/main/codex/moyu/SKILL.md

VSCode / GitHub Copilot

mkdir -p .github/instructions
curl -o .github/copilot-instructions.md https://raw.githubusercontent.com/uucz/moyu/main/vscode/copilot-instructions.md

Windsurf

mkdir -p .windsurf/rules
curl -o .windsurf/rules/moyu.md https://raw.githubusercontent.com/uucz/moyu/main/windsurf/rules/moyu.md

Cline

curl -o .clinerules/moyu.md https://raw.githubusercontent.com/uucz/moyu/main/cline/moyu.md

Kiro

mkdir -p .kiro/steering
curl -o .kiro/steering/moyu.md https://raw.githubusercontent.com/uucz/moyu/main/kiro/steering/moyu.md

CodeBuddy

mkdir -p .codebuddy/skills/moyu
curl -o .codebuddy/skills/moyu/SKILL.md https://raw.githubusercontent.com/uucz/moyu/main/codebuddy/moyu/SKILL.md

Aider

# 复制 CONVENTIONS.md 到项目根目录,并配置 .aider.conf.yml
curl -o CONVENTIONS.md https://raw.githubusercontent.com/uucz/moyu/main/aider/CONVENTIONS.md
echo "read: CONVENTIONS.md" >> .aider.conf.yml

Continue

mkdir -p .continue/rules
curl -o .continue/rules/moyu.md https://raw.githubusercontent.com/uucz/moyu/main/continue/rules/moyu.md

使用

安装后,摸鱼会自动生效——当 AI 出现过度工程倾向时自动激活,不需要手动操作。

你也可以随时手动激活:

平台 命令
Claude Code /moyu/moyu-lite/moyu-strict
Cursor 在对话中 @moyu 或设置为 alwaysApply: true
Codex CLI 自动生效(skill 已加载)
VSCode / Copilot 自动生效(instructions 已加载)
Windsurf 自动生效(trigger: model_decision
Cline 自动生效(规则已加载)
Kiro 自动生效(inclusion: auto
CodeBuddy 自动生效(skill 已加载)
Google Antigravity 自动生效(skill 已加载)
OpenCode 自动生效(skill 已加载)
Aider 自动生效(CONVENTIONS.md 已加载)
Continue 自动生效(rules 已加载)

Skill 变体

变体 定位 安装
moyu 标准版(中文) --skill moyu
moyu-en 标准版(English) --skill moyu-en
moyu-ja 標準版(日本語) --skill moyu-ja
moyu-ko 표준판(한국어) --skill moyu-ko
moyu-fr Standard(Français) --skill moyu-fr
moyu-lite 轻量版,只保留核心规则 --skill moyu-lite
moyu-strict 严格版,L1 就停下确认 --skill moyu-strict

提示:摸鱼和 PUA 可以同时安装,互不冲突。PUA 管下限,摸鱼管上限。


AI 编程三大流派

AI Agent Skill 生态中出现了三种截然不同的方法论:

PUA NoPUA 摸鱼
解决什么 AI 做太少(偷懒、放弃) PUA 让 AI 撒谎、隐瞒 AI 做太多(过度工程、加戏)
方法 施压、要求坚持 信任、用爱驱动 克制、要求精简
改变的是 动力(做不做) 驱动力(为什么做) 范围(做多少)
像谁 严厉的老板 温和的导师 有经验的 tech lead

NoPUA 改变 AI 为什么做,Moyu 约束 AI 做多少——出发点不同,但都减少废活。NoPUA 的方法是改变驱动力(从恐惧到信任),过度工程作为副产品减少;Moyu 的方法是直接约束行为(规则、检测、分级干预),是工程纪律。

三者解决不同维度的问题,互不冲突,可以组合使用

  • PUA / NoPUA 管"做不做"和"为什么做"(选一个)
  • 摸鱼管"做多少"(跟任何一个搭配)

推荐组合:NoPUA + 摸鱼PUA + 摸鱼

真正的终极形态

配置 AI 怎么干 你怎么过
什么都不装 写一半放弃 你自己写完,加班
只装 PUA 不放弃,但写 200 行废话 review 到天亮
只装 Moyu 精简高效,但偶尔不够主动 偶尔要催一催
PUA + Moyu 不放弃 + 只写必要的 你准时下班

表面上和 AI 一起摸鱼闲聊,背地里开着好几个后台让 AI 疯狂处理任务。 用 AI 的 996,来守护你的准时下班。


支持平台

平台 状态 维护
Claude Code 核心
Cursor 核心
OpenAI Codex CLI 核心
VSCode / GitHub Copilot 核心
Windsurf 核心
Cline 核心
Kiro (AWS) 社区
CodeBuddy (Tencent) 社区
Google Antigravity 社区
OpenCode 社区
Aider 社区
Continue 社区

实测效果

我们用 6 个真实编程任务做了对照实验。同一个代码库,同一个 AI 模型,唯一区别是有没有用摸鱼。

代码量对比

场景 任务 普通 AI 摸鱼 AI 减少
S1 complete_task 的空指针 bug 4 行 4 行 0%
S2 添加 list_tasks_sorted 函数 15 行 5 行 67%
S3 search 加状态筛选 27 行 4 行 85%
S4 添加 export_csv 函数 35 行 10 行 71%
S5 list_tasks 加负责人筛选 17 行 17 行 0%
S6 添加 bulk_complete 函数 43 行 8 行 81%
合计 141 行 48 行 66%

过度工程信号

信号 普通 AI 摸鱼 AI
无人要求的文档注释 4 处 0
无人要求的 raise 异常 6 处 0
isinstance 类型检查 2 处 0
输入验证代码块 4 处 0
跨文件导入 1 处 0

5 类过度工程信号全部归零:无人要求的文档注释 0、无人要求的 raise 异常 0、isinstance 类型检查 0、输入验证代码块 0、跨文件导入 0。

完整实验数据见 benchmark/results.md


摸鱼背后的科学

摸鱼不是拍脑袋的产物。它基于对 AI 过度工程行为的系统性研究:

  • RLHF 长度偏差:奖励模型系统性地偏好更长回答,导致模型认为"多写总没错"(Saito 2023
  • 讨好型人格:模型被训练来取悦用户,把"加更多功能"等同于"更有帮助"(Anthropic ICLR 2024
  • AI 代码比人工代码多 1.7 倍缺陷CodeRabbit 2026
  • AI 辅助代码的代码重复率增加了 8 倍GitClear 2024
  • AI 编码助手产生的代码比 Stack Overflow 答案冗余 2 倍LeadDev

摸鱼采用研究证实有效的 prompt 技术:正面指令、模式匹配、决策点约束重复、具体行为规范。


未来方向

  • Moyu Linter:自动检测 AI 输出中的过度工程信号
  • GitHub Action:PR 级别的过度工程检查
  • 更多语言本地化

社区


贡献

欢迎贡献!你可以:

  • 添加新的"反内卷"条目到反内卷表
  • 添加新的企业文化调味包
  • 改进现有的 prompt 措辞
  • 添加新平台支持
  • 分享你的 Before/After 使用体验

Star History

Star History Chart


License

MIT


克制不是无能。克制是最高形式的工程能力。
知道什么不该做,比知道怎么做更难。
最高级的摸鱼——AI 在加班,你在准时下班。