当开发人员从事技术项目时,我们经常想知道它会如何塑造未来。我们可能会认为我们将做出的最重要的决策将是关于产品设计、技术架构或我们使用的堆栈。根据我的经验,这些是我们在项目的早期阶段最常发生激烈争论的话题。
但是随着我对软件工程的历史越来越感兴趣,我的视野也变得开阔了。这种兴趣是必要的:当我们试图建设未来时,回顾过去是非常有帮助的。在我研究分布式社交网络软件和协议的某个时候,我发现有必要回顾一下网络的发明,以及它最早的协议。在这项研究的过程中,我逐渐相信API设计是最有可能对智能技术的未来产生持久、广泛影响的工作。
API定义松散,是一个软件组件和另一个软件组件之间的接口。这也是一项协议:如果您正在制作与我的软件对话的软件,我们双方都同意我的服务器将接收特定的请求并返回特定的响应。虽然从某种意义上说,API是两项或更多技术之间的契约,但它最终也是两个或更多人之间的契约。这种理解必然是面向未来的:我们不能改变过去,但我们可以就未来如何表现达成一致。
我想以1971年达成的一项协议为例来说明这一点。它起源于一项你可能从未听说过的ARPANET技术,但它最终影响了Web开发人员仍然每天处理的一些数据:HTTP状态和代码。
如果您曾经使用过rest API,那么您可能熟悉HTTP状态代码:200OK、301 Moved Permanent、401 Authorded和500 Internal Server Error。即使是不经意的互联网用户也知道可怕的404没有找到。
互联网号码分配机构分配了60多个官方HTTP状态代码。如果你对这类事情特别着迷,你可能会意识到代码的编号方式有一个整体的逻辑:100s的代码是信息性的,“200s的代码是成功的”,300s的代码意味着重定向,“400s的代码意味着客户端错误”,而500s的代码意味着服务器错误。
但是为什么会有这些数字呢?HTTP的故事又长又复杂(在其他地方也有文档记录),但是1991年的第一个HTTP0.9原型甚至没有指定状态代码。它们第一次出现在1992年的一份升级原始HTTP协议的提案中,当它后来被实现时,甚至没有分配给它的版本号。与许多与技术规范相关的事情一样,真相变得有点奇怪。
高级研究计划局网络项目,简称ARPANET,被普遍认为是今天由美国军方资助的互联网的前身。但这并不是故事的全部。让我们回到20世纪60年代末和70年代初:几十个网络在世界各地运营,所有这些网络都以自己的方式为互联网的发展做出了贡献。甚至远程计算机连接的想法也至少可以追溯到1965年,当时工程师们将加利福尼亚州系统开发公司的一台计算机连接到3000英里外的马萨诸塞州麻省理工学院林肯实验室的一台计算机上。Arpanet在这段历史中占有特殊的地位,因为它是第一个可运行的远程分组交换计算机网络,允许具有不同硬件和操作系统的计算机相互通信。它在很多方面类似于今天的互联网,它最终将托管各种服务,这些服务在功能上类似于我们今天使用的Web API。
1969年春,斯坦福大学、加州大学洛杉矶分校、加州大学圣巴巴拉分校和犹他大学的计算机程序员与波士顿的研发公司BBN合作,成立了临时网络工作组(NWG),并创建了ARPANET的基本基础设施。该组织是为了促进大学、公司和从事ARPANET项目的政府机构之间的非正式信息共享而创建的。在电子邮件之前,协调分布在美国各地的机构之间的开放式、异步对话是一项壮举。在几个月的时间里,小组成员开发了一种名为主机-主机协议(Host-Host Protocol)的东西,它允许两台计算机打开一条从一台到另一台的链路,这条链路将通过BBN的接口信息处理器网络进行路由,并将所有东西都连接到国家电话系统。(可以把它看作TCP/IP的前身,TCP/IP将在十年后由国防高级研究计划局的Vint Cerf和Robert Kahn发明。)。同年9月,NWG成员史蒂夫·卡尔(Steve Carr)也提出了Telnet的第一个版本-是的,就是你今天偶尔不得不除尘和使用的那个版本。
1970年,当NWG的成员努力为ARPANET奠定基础时,他们并没有为该网络发布很多应用程序。但在1971年初,网络上的新应用程序数量呈爆炸式增长。这是因为ARPANET参与者受到NWG半正式负责人史蒂夫·克罗克(Steve Crocker)的鼓励,在即将到来的春季联合计算机会议(Spring Joint Computer Conference)上演示他们正在进行的工作,这是当时世界上最大的计算机界聚会。克罗克告诉每个人,他们需要在5月1日之前提交论文,才能被列入议程。
1971年5月1日的最后期限导致了当年1月至4月间发布了大约12个软件和协议,其中许多将对网络计算的未来产生重大影响。例如,在1971年的头几个月,加州大学洛杉矶分校(UCLA)和加州大学圣巴巴拉分校(UC Santa Barbara)的两个远程作业录入(RJE)系统上线,允许用户连接到远程计算机并提交他们的FORTRAN或其他代码。计算机将运行此代码,然后发布结果以供用户在方便时下载。
仅在1971年4月的第三周,就在提交截止日期之前宣布了三个主要版本。一种是一台计算机登录另一台计算机所需的初始握手,在非正式实施18个月后,NWG将其正式命名为“初始连接协议”(ICP)。另一个是有史以来第一个文件传输协议规范“,由麻省理工学院的Abhay Bhushan发布,并发送给NWG征求意见。(是的-与Telnet一样,这基本上与2020年您可能偶尔用来传输文件的FTP相同。)。第三份是一份文件,由NWG的一个小组委员会制作,概述了一个“数据重新配置服务”。这项可在网络上访问的服务可以由任意数量的服务器托管,只要它们遵循规范,并允许用户以特定于域的语言向其提供指令,告诉它如何将数据流从一种格式转换为另一种格式。然后,用户将数据流提供给它,它将在一段时间后返回结果。
在单一会议截止日期的启发下,服务的突然激增意味着对ARPANET计划之间的互操作性有了新的需求。到1972年,制定ARPANET标准的任务已经变得足够复杂,需要针对不同网络功能子领域的正式工作组。同年3月,其中一个工作组宣布将于下个月在麻省理工学院举办一个数据和文件传输研讨会,目的是为ARPANET数据和文件传输达成一个统一的公约。研讨会的官方说明提到了标准错误代码和错误响应的创建。
FTP和RJE是1972年初使用最广泛的数据传输协议,本次研讨会的主要成果是发布了这两种协议的最新规范。第一本是针对RJE的,出版于1972年6月24日。这个新的RJE规范定义了来自RJE服务的回复应该是什么样子:
前导3位数字代码,后跟空格,后跟消息的文本说明。数字代码按组分配,以备将来扩展,以有望覆盖除RJE以外的其他协议(如FTP)。数字代码是为便于不同进程解释而设计的。
该规范接着指出,可以将三个数字中的第一个数字设置为值0到5,其中0表示信息性推送消息,1表示信息性回复,2表示肯定确认(其中200表示一般好),3表示不完整信息(例如,用户中途停止发送消息,服务器需要其余部分),4
虽然RJE在HTTP出现之前就已经消亡了,但是这个状态代码模式在两周后被合并到新修订的FTP规范中,并且从那时起就一直是FTP的一部分。在20世纪90年代初建立HTTP状态代码的人非常熟悉FTP,并将他们的HTTP状态代码基于早期的FTP代码。
因此:1972年,20人聚集在麻省理工学院参加一个周末研讨会。第二天,在分组会议上,一些人认为在两个服务之间标准化传输数据的错误消息是一个好主意,即使这两个服务不一定计划彼此交谈。一件事导致另一件事,现在404是我找不到最重要的东西的代名词。
RJE令人印象深刻的是它的时代,有点像早期的云计算系统,它允许您付费在您的组织甚至不拥有的机器(可能非常遥远)上租用计算时间。今天,它在很大程度上已经被遗忘了,但它的遗产是其状态代码的API设计。毕竟,有效的协议往往会传播,甚至超过最初参与的个人的任期。
HTTP状态码在很大程度上是历史的偶然。想出它们的人并不打算定义一个能持续半个世纪的数字命名空间,也不打算以它的方式进入流行文化。在科技史上,你会一遍又一遍地看到这种模式。一个简单的例子是换行符,由于打字机的机械限制,换行符被编码为<;CR&>;<;LF>;而不是<;LF>;<;CR>;:前者在电传打字机上执行起来稍微快一些。在一种流行的电传打字机型上,稍微调整一下,每秒就可以多打印几个字符,这就是许多程序员不幸地不得不记住的助记符(或者至少要查一下!)。在2020年完成他们的工作。
因为技术不能幸免于历史偶然性,所以作为工程师,重要的是要记住,长期的技术拐点随时都可能出现。有时候,当我们做出决定时,我们知道这些决定很重要。其他时候,它们看起来非常微不足道。我并不是说你需要对待每一个微小的技术决定,就好像它可能改变世界一样。你永远不会完成任何事情,而且你不应该过度设计你的软件来服务于你永远不会达到的完美。相反,如果您发现自己在做产品决策时却在从事API设计,请记住简陋的RJE状态代码。建设未来的工作既属于最大、最华丽的软件版本,也属于这些关于互操作性的小决策。