TL;DR

  1. Worse is Better 不是妥协 — 它是系统设计的元策略,在约束条件下追求最优解
  2. AI 正在加速这一范式 — 生成代码的”足够好”哲学,让迭代速度超越完美主义
  3. 好代码 vs 快代码是伪命题 — 真正的问题是”在什么阶段追求什么质量”
  4. 系统演进的新逻辑 — 从”设计完美系统”到”设计能进化的系统”

📋 本文结构

  1. Richard Gabriel 的经典论述回顾
  2. Worse is Better 的核心逻辑
  3. AI 时代的重新审视:好代码 vs 快代码
  4. AI 生成代码的”足够好”哲学
  5. 迭代速度与系统质量的平衡
  6. 反直觉洞察
  7. 实战指导
  8. 结语

Richard Gabriel 的经典论述回顾

1989 年的那场 Lisp 社区论战

故事要从 Lisp 和 C 的恩怨说起。

1989 年,Richard Gabriel(Lisp 程序员、诗人、Sun 公司工程师)写了一篇引发轩然大波的文章:《Lisp: Good News, Bad News, How to Win Big》。

在这篇文章中,他提出了一个令 Lisp 社区震惊的观点:

C 语言之所以赢了,正是因为它”更糟”。

当时的争论

Lisp 阵营的观点(The Right Thing):

  • 正确性第一:设计必须完美无缺
  • 完整性优先:所有功能必须完整实现
  • 一致性至上:整体风格统一
  • 复杂性可接受:为了正确性,复杂一点没关系

C 阵营的”胜利”(Worse is Better):

  • 简单性第一:实现简单比界面简单更重要
  • 正确性其次:大致正确即可
  • 一致性再次:局部一致就行
  • 完整性最后:不完整也没关系

Gabriel 观察到:Unix 和 C 正是靠着这种”将就”的设计哲学,击败了技术上更优雅的 Lisp 系统。

💡 Key Insight

技术的胜利不取决于技术本身的优雅程度,而取决于它的传播速度和适应能力。

一段被误解的历史

Gabriel 的原文标题其实是讽刺性的。他后来澄清:

“Worse is Better 是一种描述,不是处方。我在描述 Unix 为什么成功,不是在说’你们都应该这么做’。”

但历史开了一个玩笑——这个概念被广为传播,并被许多人当作设计准则。

我们的问题是:在 AI 时代,这个概念需要重新审视。


Worse is Better 的核心逻辑

四个维度的权衡

Gabriel 提出了软件设计的四个核心属性:

属性 The Right Thing Worse is Better 含义
简单性 界面简单 实现简单 用户易用 vs 开发者易实现
正确性 完全正确 大致正确 无缺陷 vs 可接受缺陷
一致性 整体一致 局部一致 全局统一 vs 部分统一
完整性 功能完整 覆盖主要场景 100% 完整 vs 80/20 法则

元策略的本质

Worse is Better 真正的洞见在于:

它识别了”适应度景观”(Fitness Landscape)中的局部最优陷阱。

想象你在爬山:

The Right Thing 思维:
必须找到全局最高峰,否则不登顶
    🏔️
   /  \
  /    \
 /      \
/________\_____
  全局最优

Worse is Better 思维:
先爬上一座小山,获得视野,再找更高的山
    🏔️    🏔️
   /  \  /  \
  /    \/    \
 /____________\_
  局部最优 → 迭代

The Right Thing 的问题:追求完美设计需要太多前置信息,等你设计完,市场已经变了。

Worse is Better 的智慧:快速获得一个可用的版本,在真实世界中学习,然后迭代。

复利效应

为什么”更糟”的系统往往最终”更好”?

时间 →

完美设计系统:
设计 6 个月 → 发布 1.0 → 难以修改 → 逐渐落后

Worse is Better 系统:
设计 6 周 → 发布 0.1 → 快速迭代 → 持续进化
            ↓
         用户反馈
            ↓
         发布 0.2 → 更多反馈 → 发布 0.3...
            ↓
         一年后:功能丰富、用户众多、生态繁荣

这不是妥协,这是复利。


AI 时代的重新审视:好代码 vs 快代码

被混淆的两个维度

在讨论代码质量时,我们经常混淆两个独立维度:

            高代码质量
                 │
    理想状态     │     "过度工程"
    (高效+优质)  │    (完美但慢)
                 │
低迭代速度 ──────┼────────── 高迭代速度
                 │
    "技术债务"   │     Worse is Better
    (烂代码快)   │    (快但"够好")
                 │
            低代码质量

关键洞察:Worse is Better 不是右下角(烂代码+快),而是右上角(够好+快)。

AI 如何改变游戏

在 AI 时代,情况发生了根本性变化:

变化 1:生成成本趋近于零

传统时代:

写 1000 行代码 = 2 天工作量
重构 1000 行代码 = 1 天工作量
重写 1000 行代码 = 2 天工作量

AI 时代:

写 1000 行代码 = 5 分钟(AI 生成)
重构 1000 行代码 = 10 分钟(AI 重构)
重写 1000 行代码 = 5 分钟(AI 重写)

变化 2:迭代成本大幅降低

传统时代,”先发布再迭代”是有成本的:

  • 代码写得烂,以后改起来痛苦
  • 架构设计差,重构需要大规模改动
  • 测试覆盖低,不敢轻易修改

AI 时代:

  • 代码写得烂?让 AI 重构
  • 架构设计差?让 AI 重新设计
  • 测试覆盖低?让 AI 生成测试

💡 Key Insight

AI 让 Worse is Better 从”无奈之选”变成了”主动策略”。我们不再因为”改不起”而将就,而是因为”改得起”而快速试错。

案例分析:初创公司的技术债陷阱

场景 A:传统思维

某初创公司 founder 是技术大牛,坚持”The Right Thing”:

  • 花了 3 个月设计完美的微服务架构
  • 每个服务都有完整的测试覆盖
  • 代码规范严格执行
  • 文档齐全

结果:

  • 6 个月后才发布 MVP
  • 市场验证失败,产品方向错误
  • 所有”完美设计”都变成了沉没成本

场景 B:Worse is Better + AI

另一家初创公司:

  • 用 AI 1 周生成 MVP
  • 代码质量一般,但核心功能可用
  • 快速投放市场,获取用户反馈
  • 发现产品方向错误
  • 用 AI 1 周重写核心模块
  • 再次验证,找到正确方向

结果:

  • 3 个月内完成市场验证
  • 产品方向正确,获得融资
  • 随后逐步重构核心系统

反直觉结论:场景 A 的”完美代码”最终一文不值,场景 B 的”将就代码”创造了真实价值。


AI 生成代码的”足够好”哲学

什么是”足够好”(Good Enough)

“足够好”不是”随便就行”,而是:

        完美
          │
    优秀  │    ← 传统目标
          │
    良好  │    ← 新目标:"足够好"
          │
    及格  │
          │
    糟糕  │
          │
         ─┴─────── 不可用

“足够好”的标准

  1. 核心功能可用
  2. 无明显 bug
  3. 性能可接受
  4. 安全无漏洞
  5. 可维护性及格

不需要:

  • 代码风格完美
  • 架构设计优雅
  • 测试覆盖 100%
  • 文档事无巨细

AI 生成代码的现实

让我们看看实际场景:

场景:开发一个用户管理系统

AI 生成的第一版代码:

// 用户注册接口
app.post('/api/register', async (req, res) => {
  const { email, password } = req.body;
  
  // TODO: 需要添加输入验证
  // TODO: 需要检查邮箱是否已存在
  // TODO: 需要密码强度检查
  // TODO: 需要密码加密
  
  const user = await User.create({ email, password });
  res.json({ success: true, userId: user.id });
});

传统思维:这代码不能用!有这么多 TODO,太不专业了!

Worse is Better + AI 思维

  1. 核心功能可用 ✅
  2. 先发布,获取反馈
  3. 用 AI 逐步修复 TODO

修复后的版本:

// 经过 AI 多轮迭代后的版本
app.post('/api/register', async (req, res) => {
  const { email, password } = req.body;
  
  // 输入验证
  if (!email || !password) {
    return res.status(400).json({ error: 'Missing required fields' });
  }
  
  if (!isValidEmail(email)) {
    return res.status(400).json({ error: 'Invalid email format' });
  }
  
  if (password.length < 8) {
    return res.status(400).json({ error: 'Password too short' });
  }
  
  // 检查邮箱是否已存在
  const existing = await User.findOne({ email });
  if (existing) {
    return res.status(409).json({ error: 'Email already registered' });
  }
  
  // 密码加密
  const hashedPassword = await bcrypt.hash(password, 10);
  
  const user = await User.create({ 
    email, 
    password: hashedPassword,
    createdAt: new Date()
  });
  
  res.json({ success: true, userId: user.id });
});

关键区别:传统思维要求第一版就完美,Worse is Better 允许渐进式完善。

“足够好”的三个层次

层次 标准 适用场景 质量目标
Level 1: 原型 能跑通主流程 内部测试、概念验证 无崩溃,核心功能可用
Level 2: Beta 无明显 bug 小范围用户测试 边界情况处理,基本安全
Level 3: 生产 可靠可维护 正式用户 完整测试、监控、文档

反模式:每个层次都追求生产级别的质量。


迭代速度与系统质量的平衡

误解的澄清

Worse is Better 经常被误解为”为了速度牺牲质量”。

正确的理解

        高质量系统
              │
              │    🎯 目标区域
              │    (高迭代 + 高质量)
              │
              │
低迭代 ───────┼──────── 高迭代
              │
              │    ❌ 陷阱区域
              │    (为了速度牺牲质量)
              │
        低质量系统

关键洞察:AI 让我们可以同时在两个维度上提升。

新的平衡公式

传统时代的权衡:

质量 × 速度 = 常数

提升质量必然降低速度,反之亦然。

AI 时代的新公式:

质量 × 速度 = AI 辅助系数 × 团队能力

当 AI 辅助系数足够大时,质量和速度可以同时提升。

实战中的质量关卡

即使在追求速度时,也需要守住底线:

红线(不可妥协)

  • 数据安全(密码加密、SQL 注入防护)
  • 核心功能正确性(关键业务逻辑无 bug)
  • 系统稳定性(不会无故崩溃)
  • 法律合规(隐私、版权)

黄线(可以将就)

  • 代码风格一致性
  • 测试覆盖率
  • 文档完整性
  • 架构优雅度

绿线(无需关注)

  • 性能优化(除非有瓶颈)
  • 功能完整性(MVP 可以砍功能)
  • 界面美观(能用就行)

案例:Cursor 团队的实践

Cursor(AI 代码编辑器)团队在早期的发展中展示了这种平衡:

阶段 1:原型期(Week 1-2)

  • 用最快的方式实现核心功能
  • 代码质量一般,但核心 AI 功能可用
  • 目标:验证用户是否真的需要这个产品

阶段 2:验证期(Week 3-6)

  • 获得用户反馈,发现方向正确
  • 开始逐步重构核心模块
  • 同时保持快速迭代新功能

阶段 3:增长期(Month 2-6)

  • 代码质量提升到生产级别
  • 完善测试和监控
  • 但核心架构保持稳定(因为早期选对了)

结果:从想法到市场验证只用了 6 周,从验证到规模化用了 6 个月。


反直觉洞察

洞察 1:完美是完成的敌人

帕金森定律的变体

“完美代码会膨胀,直到填满所有可用时间。”

传统项目管理:

预计 2 周完成 → 实际 4 周 → 因为"可以做得更好"

Worse is Better + AI:

预计 2 天完成 → 实际 2 天 → "够好就行,有问题再改"

当你知道修改成本很低时,你就不追求完美了。

洞察 2:技术债是战略投资

传统观点:技术债是坏事,要尽快还清。

Worse is Better 观点:

技术债类型:

战略债务    ✅ 好的债务
- 为了抢占市场而妥协
- 明确的还款计划
- 收益 > 利息

愚蠢债务    ❌ 坏的债务
- 因为懒惰而妥协
- 无还款计划
- 利息 > 收益

意外债务    ⚠️ 不可避免
- 认知局限导致
- 边做边还
- 学习成本

AI 时代的不同:

  • 战略债务的成本降低了(AI 帮你还债)
  • 愚蠢债务减少了(AI 不偷懒)
  • 意外债务更容易发现(AI 帮你审查)

洞察 3:”好代码”的定义正在改变

传统定义的好代码:

  • 遵循设计模式
  • 高内聚低耦合
  • 易于人类阅读
  • 完美注释

AI 时代的新定义:

  • 易于 AI 理解和修改
  • 意图表达清晰
  • 上下文完整
  • 测试覆盖关键路径

关键变化:代码的主要读者从”其他程序员”变成了”AI 助手”。

💡 Key Insight

当你知道代码会被 AI 重构时,你写的不再是”终极版本”,而是”意图的表达”。可读性让位于可修改性,优雅让位于明确。

洞察 4:系统设计的终点不是设计,是演化

The Right Thing 思维假设:

  • 我们可以预见所有需求
  • 完美的初始设计可以减少后期修改
  • 一次做对是最有效率的

现实:

  • 需求永远在变
  • 初始设计总是部分错误
  • 能快速演化的系统胜过完美但僵化的系统

AI 时代的启示

传统系统架构:
设计 → 实现 → 维护 → 重写
          ↓
      修改成本高 → 系统僵化

AI-Native 系统架构:
设计 → 实现 → 演化 → 持续演进
          ↓
      AI 辅助修改 → 系统保持活力

实战指导

如何在团队中实践 Worse is Better

原则 1:定义”够好”的标准

不要空谈”质量”,要明确定义每个阶段的退出标准:

## 原型阶段退出标准
- [ ] 核心用户流程可完整走通
- [ ] 无导致崩溃的严重 bug
- [ ] 基本的安全防护(SQL 注入、XSS)
- [ ] 数据不会丢失

## Beta 阶段退出标准
- [ ] 边界情况处理
- [ ] 基本监控和告警
- [ ] 用户反馈渠道
- [ ] 回滚方案

## 生产阶段退出标准
- [ ] 完整测试覆盖(关键路径)
- [ ] 性能基准测试
- [ ] 运维文档
- [ ] 灾难恢复方案

原则 2:建立快速反馈循环

想法 → AI 生成 → 测试 → 反馈 → 改进
  ↑                               ↓
  └──────── 小步快跑 ─────────────┘

每次迭代控制在 1-2 小时内:

  • 太长:失去迭代节奏
  • 太短:无法完成有意义的改进

原则 3:保留重构时间

在排期中明确预留技术债偿还时间:

传统排期:
Week 1-4: 开发新功能
Week 5: 修复 bug
Week 6: 发布

Worse is Better 排期:
Week 1-2: 快速原型
Week 3: 验证 + 重构核心模块
Week 4-5: 功能完善
Week 6: 代码审查 + 重构 + 发布

原则 4:使用 AI 作为质量守门员

让 AI 帮你守住底线:

# 代码审查提示词模板
cat > review-prompt.txt << 'EOF'
请审查以下代码,检查:
1. 安全风险(SQL 注入、XSS、CSRF)
2. 明显的逻辑错误
3. 性能陷阱(N+1 查询、内存泄漏)
4. 错误处理缺失

如果是红线问题,必须修复。
如果是黄线问题,可以标注 TODO。
EOF

原则 5:建立”还债日”

每周固定时间偿还技术债:

## 周五下午:技术债时间

可选任务:
- [ ] 重构上周写的"将就代码"
- [ ] 补充缺失的测试
- [ ] 优化性能瓶颈
- [ ] 更新文档

原则:
- 不开发新功能
- 不修复非关键 bug
- 专注提升代码健康度

决策框架:什么时候该完美,什么时候该将就

                    高业务价值
                         │
    重构优化    ←────────┼────────→  追求完美
    (现有系统)           │          (核心功能)
                         │
低修改成本 ──────────────┼────────────── 高修改成本
                         │
    快速实现    ←────────┼────────→  战略债务
    (实验功能)           │          (关键基础设施)
                         │
                    低业务价值

决策树

  1. 这是核心功能吗?
    • 是 → 追求完美
    • 否 → 继续下一步
  2. 修改成本高吗?
    • 是 → 战略债务,谨慎将就
    • 否 → 快速实现,有问题再改
  3. 业务价值明确吗?
    • 是 → 重构优化
    • 否 → 实验功能,快速验证

常见陷阱与规避

陷阱 1:”先用 AI 生成,以后再说”变成永远不说

症状:

  • 代码里满是 TODO 注释
  • 没有重构计划
  • 技术债持续累积

解药:

  • 每个 TODO 必须有截止时间和负责人
  • 每周审查技术债清单
  • 超过 1 个月的 TODO 必须解决或删除

陷阱 2:AI 生成的代码质量太差,改不动

症状:

  • 一团 spaghetti code
  • 修改引入更多 bug
  • 重构成本高于重写

解药:

  • 设置最低质量标准(AI 生成的代码必须可审查)
  • 关键模块人工 review
  • 复杂逻辑用 AI 生成多个版本,择优

陷阱 3:在错误的时间追求完美

症状:

  • MVP 阶段讨论微服务架构
  • 原型期写完整的单元测试
  • 用户量 100 时优化数据库分片

解药:

  • 明确当前阶段的目标
  • 问自己:”如果不做这件事,最坏结果是什么?”
  • 拥抱”够好就行”的心态

结语

回到原点

30 多年前,Richard Gabriel 写下那篇引发争议的文章。

他当时想说的是:技术的成功取决于演化能力,而非初始设计的完美程度。

今天我们重新审视这个概念,发现它比我们想象的更有预见性。

在 AI 时代:

  • 演化成本大大降低
  • 迭代速度大幅提升
  • “够好就行”从妥协变成了策略

三个核心教训

教训 1:完美是动词,不是形容词

完美不是一次达成的状态,而是持续改进的过程。

AI 让这个过程加速了 10 倍。

教训 2:技术是手段,价值是目的

不要为了优雅而优雅,不要为了质量而质量。

代码的价值在于它解决的问题,而非它本身的美学。

教训 3:系统会死去,能力会留下

任何具体的技术决策都可能过时:

  • 你选的框架会过时
  • 你的架构会被推翻
  • 你的代码会被重写

但你在快速迭代中培养的能力不会过时:

  • 识别核心需求的能力
  • 快速验证假设的能力
  • 在约束中做决策的能力

给 AI-Native 开发者的建议

  1. 拥抱”够好就行”:第一版不需要完美,需要可用
  2. 投资迭代能力:让系统易于修改,比让系统完美更重要
  3. 守住底线:知道什么可以妥协,什么不可以
  4. 利用 AI:让 AI 处理重构和优化,你专注方向和价值

最后的话

Worse is Better 不是给懒惰的借口, 不是对质量妥协的辩护, 不是技术债务的免责条款。

它是对复杂现实的诚实承认:

我们无法预见所有未来, 我们无法一次设计完美, 我们只能在迭代中逼近目标。

AI 给了我们前所未有的迭代能力。 别把它浪费在追求完美上。


💡 最后的 Key Insight

在 AI 时代,Worse is Better 的终极形态是: “第一版够好就行,因为我们知道,如果有需要,AI 可以在 5 分钟内让它变得更好。”

这不是降低标准,这是重新定义了什么是”好”。


系列关联阅读


AI-Native软件工程系列 #63

Published on 2026-03-15