咱们中国人设计 API,为什么喜欢用 {code, data, message}?
在互联网行业工作了 10+ 年,我不知道大家是否注意到一种现象,就是 API 设计的时候,这个返回包体,很喜欢用 {code, data, message} 这种结构?
说实在的,我以前根本没有思考过这个问题,我只知道,这么设计是没问题的,理解简单,实现起来也没什么障碍,学习成本也非常低。最后,这种设计思路甚至也内化成为我的一种习惯,如果不是有人挑战这一点,我甚至不会去审视,这种思路的来源。
但是,当我仔细去思考,为什么会这么设计的时候,发现了一些有趣的事情。
为什么不用 HTTP Status Code
我这里说的 API,其实说的是 Web API,也就是运行在 HTTP 协议上的 API,而 HTTP 协议,自己明明有 Status Code,就能承载正确(200)或者错误(4xx、5xx)的能力,为什么大家不去用它呢?
有人提出,这主要是源于整个行业的大规模研发公司,比如阿里巴巴,用了 Java 作为技术栈,也有很深的架构层次,这些架构组件在体系内部路由协议包体的时候,因为不同架构组件,或者硬件的 Lagacy 问题,可能会把自定义的 Status Code 或者错误的 HTTP 包,给处理或者路由到不可知的地方去,因为比较架构太庞大了,很容易出此类问题。
于是解决方案是,大家统一返回 Status 200,因为对于所有架构组件和硬件来说,这个状态码都是正确的意思,并且可以通行。
这带来一个明显的好处,就是大家可以节省大量的学习成本,不必学习每个架构组件,或者硬件的各种手册(那些东西可能都是英文的),能节省大量的时间,只要对面要用这个包体的人,自己能解释出来 code 是什么意思就行了,避免因为传输环节的异常,导致的额外时间消耗。
而阿里的规模和巨大成功,又向社会海量输送了人才,所以,把这种风气带到了千家万户。
海外的人用不用 code data message?
这个是我询问 AI 的问题,GPT 回答说,其实欧美流派是普遍不用的,所以,这个竟然只是中国人的习惯。因为确实举证了很多欧美系大厂的 API 文档,人家真的不用。
难道人家就没有架构组件和网络硬件路由的问题么?当然有,但是那些东西本就是人家写的,英文阅读也没什么问题。所以,当然也就不存在什么学习成本,反正没有我们中国人高。如果出现了意料之外的路由,就检查一下就行了。
网关导向和框架导向假说
这个也是 AI 回答我的,在很多大厂,喜欢用统一的框架,以及用网关来统一处理一家公司的网络传输包体。这种统一性,就要消除各个部门之间的特性,而有一个最小集合的共性。
比如,在框架层面,你很容易理解,你的老大写了一个统一的 Response 类,要求每个人的返回,都继承 Response,然后,直接给里面的各种 key 赋值就行了。然后,框架层在 return 的时候,就会进行 code,data,message 的封包。有时候,甚至全公司都是这么用的。
又比如,网关层面,统一处理 API 的鉴权,限流,甚至有时候统一处理封包的问题。
这一系列做法,真的很像中国公司的习惯。我以前面试过不少程序员,我发现很多人,对自己工作只有一知半解,比如我面试过很多 PHP 程序员,甚至没有摸过 Linux 运行环境,以及不了解用的什么数据库,更不懂 SQL 怎么优化。
框架是老板、架构师定的,数据库是 DBA 管理的,上线是运维操作的,那你呢?就是本地 check out 代码,写写代码,本地验证,然后 push。
这很中国,少数精英带领大量的 CRUD boy。甚至可能我都不用求证,你都有点信了,是不是?
在中国互联网大发展的那些年份,中国的人才供给还没有像今天这么过剩,所以,上述的画面,很可能发生的。
少数的精英人才,自然用在网关,框架这种核心生产工具上,剩下的人,写得不好,业务也能用,只要靠集成测试保障就行了。甚至我司现在都养着大量的集成测试人员,就是从界面最外面,点击,然后确认业务整体是否正常的人。至于里面的细节,到什么程度?怎么确定呢?又没有单元测试,没有覆盖率测试,没有白盒测试,大概率是没法保证更高质量的。
其实,我以前提过一个问题,为什么没文化的农民工可以盖摩天大楼,而且质量那么稳定呢?架构师好伟大。工程管理好伟大。我甚至一度批评,中国软件开发这个行业,简直就没有架构师和工程管理。
现在看来我大错特错。我们把最精英的人,集中在网关,框架开发,DBA 和 运维上面,剩下只要找一些农民工一样的程序员,就可以把各种业务 quick and dirty 地跑起来,不正是一种伟大的架构和伟大的工程管理么?所以,中国才能用那么多低薪的程序员把整个互联网行业做得超过欧美。
所以,code data message,其实前辈牛人给出的解决方案,简单,直接,有效。
欧美既没这个困扰,也没这个习惯
欧美的人口就少,公司也少,人均受教育程度高,发展得也比我们早。每个人,人格更加成熟,独立,知识水平平均也更高。大家都更愿意思考。
这种时候,到底怎么才能团结起来做事情呢?标准化组织,或者委员会。
他们采用一种民主协商制度。你会发现,任何人都是一个平等独立的个体,谁都不会简单去服从另一些人,哪怕是老板也不行。所以必须是道理先行。
于是,一些专家出来,密集讨论,以理服人,然后制定一套规范,并广而告之,大家觉得有道理自然遵守。觉得没道理,标准化委员会或者组织也提供了口径,允许提交议案和流程,帮助新提议的落地。
整个软件行业,协作,都是在通过这种形式固定和落地。往往是旷日持久,有多久,可能落后现实3-5年,10年都不奇怪。
大家真的最后共同遵守了么?显然没有,只是一定程度上遵守了。但是这个一定程度上,就是真正认真遵守了。
在中国,完全没这个问题,在同一间厂里,只要一声令下。老板态度坚决一点,就解决了。不需要讨论,不需要论证,就可以执行到位。但是只能执行简单命令,比如 code data message。而像 HTTP Status Code 这种需要自由裁量,还要一些创造性的改造的,反倒不容易推。
结论
欧美当然也有网关,也有硬件,但是其网关,就是网关,没有集中处理什么逻辑的义务,也没有代劳一些什么事情的,框架也有,但是各个团队成员都会遵守约定,用协议去合作。
而中国,是因为成员平均能力低下,只要去服从简单命令,就可以把工作做好。
所以,code data message,是一个符合中国国情的设计,也是一个伟大的工程层面的创举。不优美,但是奏效,执行容易。
而这种东西,各折射出深层次的社会组织原理,国情发展现状,实在令人唏嘘。
当然,也可能以上全是本人臆测和胡扯,并未经过严谨证明,仅供看官一乐。
