首页 › programming › API即产品:程序员才是用户

概述

在人人都在喊"AI替我写代码"的2026年,很多新程序员恰恰缺一门老手艺:怎么把模块的边界划清楚,让别人用得舒服、自己改得安心。YouTube上有一条流传了十几年、至今仍被无数工程团队列为新人必修的讲座,补的就是这一课——Joshua Bloch的《How to Design a Good API and Why it Matters》(如何设计一个好API,以及为什么它重要)。Bloch是《Effective Java》的作者、Java集合框架的核心设计者之一。他全场不讲语法、不秀技巧,只回答一个问题:一个API——乃至一个函数、一个组件——到底怎样才算"好"?为什么说API一旦发布,就像钻石一样是永恒的?本文按视频的叙事顺序拆解它的主张,追溯这些主张背后的理论源头,再放到云原生和AI时代做一次批判性审查。没看过视频,你能读出它的完整骨架;看过视频,你能多懂一层它的来龙去脉。

视频基本信息

项目 信息
标题 How to Design a Good API and Why it Matters(如何设计一个好API,以及为什么它重要)
主讲人 Joshua Bloch(时任Google首席Java架构师,《Effective Java》作者)
频道 Google Tech Talks(Google官方技术讲座频道)
发布时间 2007年前后上传(据频道页面,精确日期未经实时核验)
篇幅 一小时左右的长讲座
热度 长期被各大工程团队与高校课程列为"API设计第一课",属于程序员圈的高频转引经典;具体播放量请以频道页面为准

需要说明:本文写作时未能实时抓取该视频页面,凡涉及发布时间与播放量的信息均以"据频道页面"标注,读者可自行检索标题核验。这也是它与其他"爆款"的不同之处——它不是靠算法推荐火过一周,而是靠工程师口口相传火了近二十年。

一、核心主张拆解:一小时讲透一件事

整场讲座的叙事非常线性,几乎是一条线拉到底:先讲API设计为什么重要,再给"好API"下定义,然后给出可操作的流程和原则清单,最后落在"API是永久承诺"这个让人后背发凉的结论上。

1. API即产品,程序员就是你的用户

Bloch开场的核心比喻是:API设计本质上就是用户界面设计,只不过用户从普通消费者换成了程序员。图形界面的用户靠按钮和菜单与你的系统打交道,程序员靠你的函数签名、参数和返回值打交道。界面设计师研究用户心智,API设计者要研究调用方的心智:他第一眼能不能看懂这个函数是干嘛的?他会不会猜错参数顺序?他犯错时能不能立刻得到清晰的报错?

这个比喻的杀伤力在于责任反转:多数程序员觉得"接口是给机器调的,能用就行",而Bloch提醒你,机器不会痛苦,痛苦的是坐在机器前的人。一个难用的API会以加班、线上事故和离职面谈的形式,把成本一分不少地还给团队。

2. 好API的三条标准:易学、易用、难误用

什么样的API算好?Bloch给出的判据朴素到近乎冒犯:易学——看名字和签名就能猜对用法;易用——不用读文档的角落也不会踩坑;难误用——想用错都难。他还补了一条常被忽略的:使用这个API写出来的代码应当是可读的,别人读调用代码时能直接理解业务意图。

反面的例子他在Java标准库里信手拈来:java.util.Calendar和java.util.Date这对难兄难弟,月份从零开始数、日期可随意修改、字段多得让人怀疑人生,是标准库历史上最著名的"误用制造机"。Bloch对这些设计的批评持续了二十年,后来干脆写进了《Effective Java》——包括那句著名的"如果没必要可变,就别让它可变",以及"别返回null,返回空集合"。

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

讲座中最具实操价值的部分是流程。Bloch反对"先实现、再暴露"的默认写法,主张倒过来:

这套流程后来有一个更广为人知的名字——"从调用方视角设计",也和测试驱动开发的"先写测试"异曲同工:两者都是强迫你先站在使用者的位置,把不舒服暴露在最便宜的时刻。

4. 原则清单:少暴露、不可变、快速失败

讲座的中段是一串可以贴在工位上的原则,这里挑最经久的三组:

少暴露。 类能多小就多小,方法能private就别public,模块能不给依赖就别给。理由是一个不对称的经济学事实:往API里加东西容易,往外拿东西几乎不可能。所以Bloch的名言是"When in doubt, leave it out"(拿不准就别放进去)——宁可让别人求你加功能,也别让自己跪着维护没人用的参数。

少可变。 能不可变就不可变。可变对象是并发bug、缓存失效和"谁改了我的数据"悬案的温床。不可变对象天生线程安全、可以放心共享、出错时责任清晰。

快速失败。 错误要尽可能早地暴露,能在编译期暴露就不要拖到运行期,能在入口暴露就不要拖到三层调用之后。返回null让调用方在深夜里空指针,就是把失败延迟到了最贵的时刻。

5. 钻石论:API是永久的承诺

全场最重的一句话出现在结尾附近:"公共API就像钻石,是永恒的。" 你几乎只有一次机会把它做对;想改一个已经广泛使用的API,现实的路径往往不是修改,而是推翻重来。因为环顾四周你会发现,别人早已依赖你接口里每一个可见的行为——包括那些你自己都没想到会被依赖的。这句轻描淡写的玩笑话,是整场讲座真正的份量所在。

二、理论与溯源:这些观点从哪里来

Bloch的讲座不是个人随想,它站在几十年软件工程的文献传统上,每一条主张都能找到学术与工程的双重根。

信息隐藏(1972)。"少暴露"的直接源头是David Parnas的经典论文《On the Criteria To Be Used in Decomposing Systems into Modules》。Parnas提出模块划分的标准不是流程步骤,而是"把难以预料的设计决策藏进模块内部",让每个模块只通过稳定接口与外界通信。这被公认为信息隐藏与封装思想的起点,也是Bloch整场讲座的脊柱。

抽象数据类型(1974)。Barbara Liskov与Stephen Zilles提出抽象数据类型(ADT),并在CLU语言中实践"接口与实现分离"。今天你写的每一个interface,概念上都是这场运动的直系后代。Liskov后来提出的替换原则(子类型必须能安全替换父类型),则给"难误用"标准提供了类型系统层面的支撑。

契约式设计(1986)。Bertrand Meyer在Eiffel语言中系统化了"契约式设计":函数的前置条件、后置条件与不变量就是调用方与实现方之间的合同。"快速失败"与"参数校验前移"都可以看作契约思想的大众版——违约就该当场报错,而不是给个null让对方猜。

《Effective Java》(2001)。Bloch自己的这本书把讲座里的原则展开成九十多条具体条目,至今出到第三版,是Java领域引用率最高的工程书籍之一。讲座与书互为表里:讲座给直觉,书给条例。

反面参照:Postel法则(1980)。网络协议领域的"对自己发送的内容保守、对接受的内容宽容"曾被奉为圭臬,但在API设计语境里,它恰恰是"难误用"的天敌——过分宽容的输入处理会接纳五花八门的错误用法,把问题积累到系统深处再爆炸。理解这对张力,比死记任何一条清单都更能帮你判断"这里该严还是该宽"。

三、批判性审查:十八年后,哪些还成立

诚实地说,这条讲座录制于微服务、云原生和大模型之前,逐条照搬会出问题。分开看:

证据充分的内核。 "先写调用方再写实现"、"一页纸规格"、"拿不准就别暴露"、"快速失败",这些主张在之后近二十年的工程实践中被反复验证。开源生态里流传最久的库(从Guava到各类现代语言标准库的后续设计)几乎都朝着"更小的暴露面、更多的不可变"演化。这一半内容,今天学不亏。

被高估的部分:"以后可以随时加"。 Bloch时代隐含的前提是:你控制着代码库,加方法是安全的,删方法才是灾难。但2012年前后,Google工程师Hyrum Wright总结出后来以他命名的海勒姆定律:当用户数量足够多时,你接口里所有可观察的行为,都会被某个调用方依赖——包括报错信息、执行顺序、甚至内存布局的副作用。云原生时代更是雪上加霜:你的"内部API"可能被做成SDK发布,你的私有字段可能被序列化框架和监控探针翻阅。换言之,现实比Bloch的警告更狠:不仅删不掉,连"加"都可能改变可观察行为。今天的对策是语义化版本、废弃期通知和多版本并存,而不是天真地"随时加"。

示例的老化。 讲座里的长参数列表之痛,在现代Java里已被record、builder库和命名参数式的语言特性大幅缓解;一些当年要靠纪律守住的规则,如今编译器和静态分析工具会直接替你把关。这不是原则错了,而是实现原则的成本变了——原则没失效,是它内置进了工具链。

一个2026年的新变量:AI是API的第一大用户。 这场讲座最有意思的时代回响是:今天大量代码由大模型生成,而模型恰恰是通过"读API表面"来使用API的。一个易猜对、难误用的API,AI能一次写对;一个陷阱重重的API,AI会把陷阱以工业速度复制到一千个调用点。换句话说,"程序员是你的用户"这条原则不但没过时,反而在AI时代被放大——只不过"用户"里多了几亿个不知疲倦、且极擅长以表面模式做推断的新用户。你写得越含蓄,AI错得越整齐。

公允的结论是: 讲座的原则层(为使用者设计、最小暴露、快速失败)经受住了时间考验;策略层(具体到Java语法的技巧)应结合现代语言特性和版本管理实践重新校准。把它当"API设计的世界观"来学,而不是当"操作手册"来抄。

四、认知提升与实用启示

1. 本周就做一次"暴露面审计"。 挑一个你最熟的模块,数一数public方法:过去一个月里被外部真正调用过的有几个?其余的全部降级private或合并。你大概率会发现,三分之二的暴露面是"以防万一"的遗物——它们正是钻石论里"以后永远拿不掉"的那部分。删不动没关系,先停住新增。

2. 下一个函数,从调用方写起。 强迫自己换序:写实现前,先在新文件里写下理想中"最好用的调用姿势",哪怕三行示例也行。凡是写着别扭的地方——参数超过三个、布尔参数含义不明、需要先调用某个初始化方法——都是API在向你报警。这一招零成本,却能在签名阶段消灭未来百分之八十的返工。

3. 把"返回null"列为你个人代码的禁手。 这是最小、最快见效的一条:所有集合和容器类型的返回值,改成空集合;可能失败的操作,改成抛异常或返回显式的Optional/Result。你的调用方(包括未来的AI)会少掉一整类空指针事故。一周之内就能见效,且可以推广到你团队的代码评审清单里。

五、一张图看懂它的论证结构

flowchart TD
    A[API设计第一课] --> B[核心比喻<br/>API即产品]
    B --> C[程序员就是用户]
    C --> D[好API三标准<br/>易学 易用 难误用]
    D --> E{怎么做到}
    E --> F[流程三步<br/>用例 一页纸 先写调用]
    E --> G[原则清单<br/>少暴露 不可变 快失败]
    F --> H[结论<br/>API如钻石 永恒]
    G --> H
    H --> I[理论源头<br/>Parnas信息隐藏]
    H --> J[时代修正<br/>海勒姆定律]
    H --> K[2026新变量<br/>AI是最大用户]

延伸阅读

  1. 《Effective Java》(第3版),Joshua Bloch著——把讲座原则展开成九十余条可直接执行的工程条例,Java程序员的书架必备。
  2. 《Software Engineering at Google》——Google官方开放全文的工程实践书,其中对海勒姆定律与"API会以你想不到的方式被依赖"的展开,正好补上这条讲座的时代注脚。

参考来源

  1. How to Design a Good API and Why it Matters(Google Tech Talks) — 本文解读的主角,可在YouTube按标题检索官方频道版本观看
  2. Information hiding - Wikipedia — Parnas 1972信息隐藏思想溯源
  3. Hyrum's Law — 海勒姆定律官方页面,"所有可观察行为都会被依赖"
  4. Effective Java - Wikipedia — Bloch著作条目,讲座原则的条例化版本
  5. Joshua Bloch - Wikipedia — 主讲人背景与Java贡献生平

本文由「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学通信知识星球海报-扫码加入