首页 › programming › API如钻石:程序员必修的接口设计课

API如钻石:程序员必修的接口设计课

导语

在AI能一键生成整个项目的2026年,还有必要去啃一场2007年的Google技术讲座吗?答案是:太有必要了。这场由Joshua Bloch主讲的《How to Design a Good API and Why it Matters》(如何设计一个好的API,以及为什么它很重要),至今仍被无数资深工程师列为“API设计的必修第一课”。

为什么?因为工具越强大,“接口设计”这件事的权重反而越高。当你用LLM生成代码时,它生成的是实现;而决定这个实现能不能被别人(包括未来的你自己、甚至包括AI Agent)顺畅使用的,是接口。更进一步,2026年最火的"tool calling / function calling",本质上是让大模型成为你的API消费者——而模型是史上最缺乏常识、最容易误用接口的调用方。Bloch在近二十年前讲的“好API要易学、难误用”,在今天不仅没有过时,反而被AI时代加倍放大了。

更难得的是,Bloch不是纸上谈兵。他是《Effective Java》的作者、Java集合框架(Java Collections Framework)的设计者,也是java.math包的作者——Java生态里被调用次数最多的一批接口,就出自他手。这场讲座是他的经验浓缩,全文金句密度极高,看完你会对“写代码之前该想什么”有一个完整的框架。

视频背景卡片

项目 内容
视频标题 How to Design a Good API and Why it Matters
频道 Google Tech Talks
时长 约43分钟
播放量 长年累计约百万量级(长青技术演讲,撰写时未经实时核实)
发布时间 2007年上线(同名论文先期发表于 OOPSLA 2006)
核心主题 API设计的原则、流程与判断标准
主讲人 Joshua Bloch,《Effective Java》作者,Java集合框架设计者

核心内容拆解

1. 定调金句:公开API如钻石,是永久的

【视频原话】整场讲座最著名的一句:"Public APIs, like diamonds, are forever."(公开API如同钻石,是永久的。)你发布了API,就要几乎永远地支持它——因为一定有人在用它。改掉一个设计失误的代价极其高昂,有时甚至做不到。

【延伸分析】这句话的商业含义常被低估。API不是技术细节,而是长期合同。看看以API立身的公司就明白:Stripe、Twilio这类公司卖的就是接口本身,它们的API版本管理和弃用(deprecation)策略严谨到近乎苛刻,因为那直接是营收承诺。对你个人也一样:你写下的每个public函数,都是在替未来十年的调用者做承诺。这不是编码能力问题,是契约精神问题。

2. 什么是好API:好学、好用、难误用

【视频原话】Bloch给好API下的定义可以浓缩为几条:易于学习、即使不看文档也接近能用、难以被误用、用它写出的代码易于阅读和维护、功能足以满足需求但不冗余、易于演进而不用破坏调用方。

【延伸分析】注意一个容易被忽略的视角:他说“用它写出的代码要好看”。API的真正用户不是编译器,而是读代码的人。一个让调用代码变成绕口令的API,功能再强也是失败的。衡量标准很简单——打开一个用了该API的真实项目,闭着眼睛读调用侧代码,能读顺就是好设计。

3. 设计流程:先写调用代码,再写实现

【视频原话】这是全场最实操的部分。Bloch给出的流程是:先用例驱动收集需求,且带着健康的怀疑去筛选需求;然后写一页纸的规格(spec);接下来关键一步——在实现之前,先写出“假装这个API已经存在”的示例调用代码。他直言,如果先写实现再回头看API,几乎一定会设计错。

【延伸分析】这就是今天所谓的"contract-first"或"spec-first"开发的源头之一。现代工程里它演化成了各种形态:先写OpenAPI规范再生成服务端骨架,先写接口的单元测试再写实现。原理都一样:让“被使用”先于“被制造”。你坐在实现者的位置上时,知道得太多;坐在调用者的位置上,才看得清接口该长什么样。

4. 先写文档:写不出来,就是设计有问题

【视频原话】Bloch强调应该先写API文档再动手实现,并把文档当成设计的试金石:如果一个功能你很难用文档讲清楚,说明设计本身有问题,回去重新设计,而不是硬写文档硬写代码。

【延伸分析】这条在2026年有了全新的应用场景:给LLM写tool schema。当你要让AI Agent调用你的工具时,必须把参数、语义、边界条件全部写成文字——凡是文档含糊的接口,模型就会以概率最大的方式“曲解”它。可以说,模型是一个不带任何常识的“极端用户”,它把“文档即设计”这条原则变成了硬性强制:讲不清,就用不对。

5. 防误用设计:最小惊讶原则

【视频原话】好API“难以误用”的核心武器是最小惊讶原则(Principle of Least Astonishment)——接口的行为应该和任何使用者的直觉预期一致。此外要尽早校验参数、让错误尽快暴露(fail fast),并且不要让调用方做本该由库替他们做的事。

【延伸分析】“不要让调用方做事”值得单独说。判断方法:看调用侧是否总要重复一段“仪式代码”(比如每次调用前都要手动加锁、手动转格式、手动释放资源)。重复出现的仪式代码,说明库把责任推给了用户,而每个用户都会漏一次——漏的那次就是线上事故。

6. 犹豫时,果断砍掉

【视频原话】全场第二著名的金句:"When in doubt, leave it out."(犹豫时,就砍掉。)删掉功能随时可以再加回来,但一旦发布,你就永远无法去掉它。API宁可小而美,不可大而全。

【延伸分析】这是对“功能蔓延”(feature creep)最简洁的防御。它的反直觉之处在于:拒绝需求方看起来像“不配合”,但对API来说,你多加的每个方法都是永久税负——文档、测试、兼容性、认知成本全都要为此买单。Bloch给出过一个务实的平衡术:拿不准的功能,先以私有或实验形态放出去验证,确认有价值再转正。砍掉是一票否决,不是永久否决。

7. JDK的反面教材:继承泄漏实现

【视频原话】Bloch毫不留情地解剖了Java标准库里的经典失误:java.util.Stack继承了Vector,导致你能从栈的中间位置随机插入删除——栈的语义被实现继承彻底击穿;java.util.Properties继承Hashtable,把内部存储方式暴露成了公共接口;java.util.Date的可变设计和大量废弃构造器更是折磨了Java程序员二十年。正面样本则是集合框架:用接口定义契约、用工厂隐藏实现、命名一致。

【延伸分析】Stack和Properties的病根是同一个:用继承来复用代码,结果把实现细节变成了公开承诺。组合可以随时换内脏,继承则把内脏钉在了橱窗里。这是“组合优于继承”这条经验法则最生动的出处之一——不是风格偏好,而是血淋淋的兼容性教训。

8. 封装与好名字:老原则,硬标准

【视频原话】Bloch收尾的原则:尽可能小的暴露面——类和成员的可访问性越低越好;实现细节绝不进API;好名字至关重要,如果一个东西你起不出好名字,多半是设计本身没想清楚;命名和风格要跨整个API保持一致。

【延伸分析】“起不出名字就是设计有问题”是我个人最受益的一条。名字是API的压缩包:调用方靠它建立预期,文档靠它自解释。当你在doProcess和handleData之间纠结时,问题通常不在命名,而在这个函数的职责根本没定义清楚——它不知道自己是谁,所以叫什么都不对。

知识结构图

flowchart TD
    A["如何设计一个好的API"] --> B["为什么重要"]
    A --> C["什么是好API"]
    A --> D["设计流程"]
    A --> E["核心原则"]
    B --> B1["公开API如钻石是永久的"]
    B --> B2["事后修改成本极高"]
    B --> B3["好API是资产坏API是负债"]
    C --> C1["易学易用难误用"]
    C --> C2["调用侧代码可读"]
    C --> C3["功能够用但不冗余"]
    D --> D1["用例驱动并怀疑需求"]
    D --> D2["一页纸规格"]
    D --> D3["先写调用示例代码"]
    D --> D4["先写文档再实现"]
    E --> E1["最小惊讶原则"]
    E --> E2["犹豫时果断砍掉"]
    E --> E3["最小暴露面与封装"]
    E --> E4["好名字即好设计"]

实战启示

给不同角色的行动清单:

写库/写框架的工程师:从今天起改一个习惯——任何新接口,先写五段“假装它已存在”的调用代码,贴在PR描述里让reviewer先看调用侧,再看实现侧。这一步能把一半的设计争论提前消灭。同时把“犹豫就砍掉”设为默认值:新功能先放内部实验命名空间,被真实使用满一个周期再转正。

做Code Review的工程师:新增一条评审维度——只看diff里的调用侧代码。如果调用代码读起来费解、需要注释才能懂、或者每个调用点都要重复一段准备代码,直接打回,不管实现多优雅。

用LLM开发的工程师:把Bloch的原则迁移到tool/function schema设计上。给AI的工具接口要做到:参数名自解释、语义在描述里一次讲清、边界条件显式声明、错误返回可预期。你在人类同事身上能容忍的“心照不宣”,在模型这里一个都不存在——这反而是好事,它逼你写出你本该写出的最好文档。

技术管理者:把“API是资产还是负债”纳入架构评审。一个内部服务被五个团队调用却频繁破坏兼容,它就在从资产变负债;此时投入做版本化和弃用策略,不是工程洁癖,是在止损。

所有人:养成“写实现前先写文档注释”的习惯。写不出来的那一刻,恭喜你——你刚刚在写代码之前发现了设计缺陷,这是整个流程里修复成本最低的时刻。

延伸学习路径

  1. Joshua Bloch《Effective Java》(第3版) — 本场讲座精神的完整展开,Java程序员的圣经,哪怕不写Java,前几章的接口设计章节也通用。
  2. 同名论文 "How to Design a Good API and Why it Matters"(OOPSLA 2006) — 讲座的书面版,结构更完整,适合做团队内部分享材料,标题可直接检索到。
  3. John Ousterhout《A Philosophy of Software Design》 — 从“深模块/浅模块”视角继续深挖接口设计,与Bloch的观点高度互补。
  4. Google AIP(aip.dev) — Google把API设计原则制度化的公开成果,看看一场讲座的理念如何长成一套企业级标准。
  5. Stripe API文档与更新日志 — 工业界API版本管理与弃用沟通的标杆示范,读它的changelog本身就是设计课。

一句话总结

好API不是功能清单,而是你对未来十年所有调用者的公开承诺——所以先写调用代码、先写文档、讲不清就重新设计,犹豫时,果断砍掉。

参考来源

  1. How to Design a Good API and Why it Matters — 本文分析的核心视频(Google Tech Talks频道,Joshua Bloch主讲);如链接失效,可在YouTube搜索原视频标题定位
  2. "How to Design a Good API and Why it Matters",ACM OOPSLA 2006 companion 论文 — 讲座同源书面版(标题可直接检索)
  3. Joshua Bloch《Effective Java》(第3版),Addison-Wesley — 观点体系的完整版本
  4. Google AIP(aip.dev)— Google API设计指南,用于延伸阅读

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入