人类进步史本质上是一部抽象史

512 阅读9分钟

如果你问我人类能从其他物种中脱颖而出,最重要的能力是什么?我会说是“抽象的能力”。简单来说,就是隐藏底层细节、操作表层接口实现目标的能力。 尤瓦尔·赫拉利在《人类简史》中说:人和其他物种的根本区别在于想象力。我们能够透过现象看本质,把繁琐复杂的具体过程封装起来,“抽象”成简单易用的接口,之后其他人想要理解这件事,就不需要再深入到细节里面了,只需要看暴露的接口即可。

人类进步史本质上是一部抽象史

人类发展历史上有几个足以改变人类的抽象概念。 第一,数字。从羊群这个具体的概念到数字这个抽象的概念,是具有划时代意义的。如果没有数字,三个苹果和三个梨子是没有任何关联的,我们也就无法从自然现象中找到任何规律了。 第二,国家。国家是我们想象出来的一个概念,大家都认可,才能朝着一个一致的目标前进,人类的集体能力就体现出来了。 第三,货币。货币是一个极其强大的工具,我们说的“有钱能使鬼推磨”就是这个意思。这里的货币不是特指某一种金钱,而是对付出的劳动的一种抽象认可。货币使得我们不必任何事情都要事必躬亲,我只要用货币支付一定的劳动报酬,这大大降低了个人的复杂度。

科学里的抽象就更广泛了,我们可以认为所有的科学理论和定理都是一种抽象。物体的质量是一种抽象,它不关注物体是什么以及它的形状或质地;牛顿定律是对物体运动规律的抽象,我们现在知道它不准确,但它在常规世界里,却依然是一个相当可靠的抽象。在科学和工程里,常常需要建立一些模型或者假设,比如量子力学的标准粒子模型、经济学的理性人假设,这些都是抽象。甚至包括现在 AI 里通过训练生成的模型,某种程度上说,也是一种抽象。

分工合作离不开抽象

抽象无处不在,可以说没有了抽象,现代人生活寸步难行。我们人人都使用手机,但是没有几个人知道手机的工作原理是什么,事实上我们也根本不关心。我们每天都乘坐各种交通工具,但是从来没操心过轮子到底是怎么转起来的。我们叫清洁阿姨上面打扫卫生,我们只需要支付相应的酬劳就行了,至于她是怎么坐车过来的,用的是哪款洗洁精,我们不需要操心。 以上这些,抽象一下,我们就可以把一件事情分成三个部分:

  • 目标
  • 实现目标的具体底层细节
  • 为了实现目标我需要做的事情 我们的目标是发短信、浏览网页,实现这个目标,底层细节是电子电路,是复杂的通信协议,我需要做的是触控屏幕。 我们的目标是前往目的地,底层细节是汽油的工作原理,发动机的工作原理,我需要做的是踩油门、操控方向盘。 我们的目标是保持房间卫生,底层细节是总得有个人购买清洁用品、打扫房间,我需要做的是请清洁阿姨代替我们完成,然后支付报酬。

如果你再往下仔细想想,抽象是一层接一层,没完没了,越往下暴露的复杂度越高。光从生产洗衣粉这件事来说,具体的复杂度高吗?很高,这里面牵涉到了复杂的化学原理,制造工艺,外行很难完全搞明白。但是你说购买使用洗衣粉复杂吗?很简单。那是因为洗衣粉制造商为我们把去除污渍这件事的复杂度给我们抽象掉了。

我们小时候上政治课,讲到经济全球化,我们的日常生活都是建立在全球分工合作基础上的。分工合作,分为两部分:一方面要分工,知道什么事情需要自己做,什么事情需要交给别人做;另一方面需要合作,这要清晰地定义好交互边界上的交互行为,约定好信息的含义和格式。

细细品味一下分工合作这件事,理想的情况下,我们都在努力促成一个大目标的达成,但是我们不需要也没必要关心对方的行动细节,对方具体是怎么做的不重要,我只需要调用对方在领域边界上暴露给我的抽象层就行了。

计算机领域的抽象

学过计算机的对“抽象”这个概念应该都不会陌生,计算机科学领域有句名言: 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。 这个“间接的中间层”,就是一个抽象层。

比方说 Web 开发,我们开发过程中使用的 Web 框架和高级抽象语言,算是比较高的抽象层次了,对于大部分开发者来说,我们的业务逻辑位于这个抽象层。这一层往下,是低级语言,比如 Python 底层实际上用的是 C 语言。再往下,是操作系统,操作系统这一层暴露了最基本的文件操作、socket 接口。操作系统往下,是硬件,硬件也有接口,只不过从出厂那一刻起就已经焊死了。我们的数据到了服务器网卡这个位置,需要传到用户的电脑上了,这时候来到了 TCP/IP 协议这一层,IP 协议确保了我们的数据不会跑错地方,TCP 协议确保我们的数据能完整且以正确的顺序抵达。这还没完,要把字符成功显示在用户的浏览器上,还要经过很多抽象层呢,我们就不一一罗列了。用软件开发者的话来说,这就是不关心底层实现细节,只面向接口编程。正式这样一层一层地抽象和封装,才使得我们现在编写程序变得极其简单。

Authing 做的是什么以及 Authing 存在的意义

从为用户抽象掉部分复杂度来说,我们和阿里云做的实际上是一回事。阿里云的 IaaS 平台把管理物理机房的复杂度抽象掉了,让我们这些软件从业者不需要为硬件操心;Authing 就是致力于帮助开发者把身份认证的复杂度抽象掉,让开发者不用操心诸如密码安全、单点登录、用户增长分析这些重要但是琐碎的事,腾出精力做真正有业务产出的核心业务。正如你很难自建机房并且达到阿里云的水准一样,你也很难在有限的时间和资源的前提下把身份认证这件事做的和 Authing 一样好。

层次越高,开发效率越高,创造的价值越大。Authing 通过自己对身份认证领域的认知,把身份认证这件很复杂的事情抽象成了一系列规范的步骤,提供 user-friendly 的 SDK 和美观的后台控制台,帮助开发者降低系统的整体复杂度。 Authing 内置了很多实用的 Feature,比如

  • 登录热点图

  • 用户地理位置分布

  • 易用美观,五行代码即可集成的登录表单

  • 支持社会化登录

支持各种社会化登录是一种很费时的重复性劳动,Authing 允许你在后台自定义所要支持的社会化账号服务商,真正的一键开启、0 行代码:

这些至少是上千行的代码量,一个月人天的工作量。

  • 支持单点登录

再看看 Authing 是怎么实现单点登录的:10 行代码,完成需要数千行代码才能完成的任务。

const authing = new AuthingSSO({
    appId: "5d70d0e991fdd597019df70d",
    appDomain: "sample-sso.authing.cn"
});
const res = await authing.trackSession();
if(!res.session){
    // 未登录,执行登录逻辑,这会调起 Authing 的登录表单
    authing.login()
}else{
    // 已经登录,打印用户信息
    console.log(res)
}

注:相关源代码可以在此 GitHub 仓库找到:github.com/Authing/web…

前面说过,Authing 在身份认证领域持续耕耘,已经把身份认证这件事情抽象成了很多个规范的过程,Authing 后续会全面支持函数计算,让开发者通过插件化的方式,全流程自定义化。

Authing 目前支持 OAuth2、OIDC、LADP、 SAML 等主流身份协议,协议一直都在演进,但是开发者对身份认证的需求一直没变:那就是安全稳定、简单高效、终端用户体验良好。对于开发者来说,底层的协议变化是一个不重要的细节,就像你开的汽车到底是用电还是用油一样。

就像你的确可以自建机房一样,这些东西你的确可以自己做,但是从投入产出比来看,未必值得。

我们都是站在前人的肩膀上继续前进,利用好前人提供给我们的抽象层,没人会试图抛开一切已有的资源从零开始,也只有这样人类文明才能不断进步。

身份是一个看上去简单其实很复杂的事情,这件事至今仍未得到很好的解决,这也是我们坚持将 Authing 做好的原因。我们是一个连接器,会将全球的平台都连接起来,这也是我们伟大使命的一部分。

Authing 官方网站 ~