所以 OAuth 就是用户想通过某种机制,通过 Client 和 Authorization Server 交互来获得能够访问资源的 token。
对于 OAuth2.0 的授权流程,可以根据 grant type 来做个归类。下面的图示全部都来自 Auth0 的官方文档。
1. Authorization Code:用户访问 web app,web app 的后端请求 auth server,于是重定向到登录页面,用户输入登录信息,auth server 就给 web app 一个授权码,这个授权码通过 callback URL 返回,而这个参数一般放在这个 url 的参数中,比如:http://…/callback?token=TOKEN。之后 web app 就可以拿着授权码去取 token 了。这种方式不需要用户这边存放任何 secret,但是需要用户参与 consent,并且具备 web app 的后端,因为和 auth server 的交互主要都是 web app 后端完成的。
入职 Coupang 两个月了,第一个月主要上手和开发 BOS(Business Operating System)系统,第二个月开始调研选型 ML Workflow 平台。前者目前来说相对比较简单,后者对我来说是一个新坑,也比较有意思,随便写写技术上的体会。
先扯点题外话,其实这次求职有几个比较符合我预期的机会,可在思考之后,我基本上毫不犹豫就选择了 Coupang 这一家。最主要的原因,并非因为雇主,而是因为要做的事情。一个相当规模的团队,在大干一场的早期阶段,要在搭建起属于自己相当规模的 AI infra 来。
我觉得软件行业的巨大的变革,新世纪以来就三次,第一次是互联网应用的崛起,我太小没能做啥;一次是十几年前的 cloud,看着它从爆发式增长到如同水和电一样进入我们的生活,可我算是错过了它比较早期的阶段,即便相当长的时间内我在 Amazon,但是我却并不在 AWS;而这一次,当 AI 的浪潮再来的时候,我就很想行动起来,真正投身其中。程序员的一生能有几个赶这样大潮的机会呢,我不想再错过了。虽说我没有 AI 的技术背景,但我知道 ML infra 到 AI infra 却是个我可以切入的角度——从我最初接触软件开始,尤其是学习全栈技术的时期开始,我就认定,技术是相通的,这十几年来我一直在如此实践。因此在调查和思考之后,我觉得这是一个我不想错过,并且更重要的是自认为能够抓住的机会。
当然,就此打住,我目前只是这个领域的初学者,因此理解并不深入。
Why ML Workflow?
接着说正题,在这一个月之前,虽然我经历过不少关于 workflow 的团队,虽然我参与过从零写完整的 workflow 引擎,但这些都是针对于通用 workflow 而言的,我对于机器学习的工作流,也就是 ML workflow 可以说一无所知。于是在问题和需求调查的过程中,第一个关于它的问题就自然而然出现了,我们是否真的需要 ML workflow,而不是通用的 workflow 系统?
其实,这主要还是由于 ML 的生态所决定的。通用 workflow 可以完成很多的事情,但是在机器学习到 AI 的领域内,这个过程中最主要的目的就是把 raw data 给转换成经过训练和验证的 model,其中有很多部分都是有固定模式,因而自成体系的。举例来说:
ML workflow 关注数据处理和 ML 或者 AI model 的生命周期,但是通用的 workflow 往往关注将业务流程自动化;
Workflow 这样的系统,和很多 infra 系统不同的地方在于,它具有全栈的特性,需要从端到端从用户完整的 use case 去思考。回想起通用的 workflow,我们会想,用户会去怎样定义一个 Workflow,怎样运行和测试它,并且怎样部署到线上跑起来。这其中的前半部分就是 development experience,而后半部分则是 deployment experience。
首先,对于 development experience 这个角度,ML workflow 有它独特的地方,其中最主要的就是 Python SDK。
具体来说,很多区别但最重要的是两个:一个是 strong typing,其它两个都只支持 Python 类型的 hints,就这一点上,和一些 ML engineer 也讨论过,把问题发现在本地,是非常吸引人的;再一个是 multi-tenancy,对其 Flyte 有很多原生的特性支持,在平台完成之后,我们希望把平台上 ML 的能力开放出去,因此这是很重要的一个特性。此外,我也在考虑对于一个 control plane + 多个 data plane 这种 use case 的情况,这部分的需求还比较模糊,但是 Flyte 依然是这方面支持特性相对比较多的一个。
无论最后的结论为何,我希望我们能够比较灵活地部署选中的这个 ML workflow system,比方说,在 CLI 上,我们考虑在更高维度建立出一层,用户使用同样的命令,无论下面执行的 workflow 系统是什么,都不需要改变,这样一来,等到未来如果我们需要支持第二个,应该能够比较容易地整合进去。
不过后来这个兴趣点也在慢慢迁移,在加入 Amazon 之后,我陆续经历了两个大的 data platform 团队,一个是做销量预测(demand forecasting)的,一个是为 retail 一侧计算成本和利润的。在这两个 team 中,都要和大数据打交道,和 scientists 和 analysists 一起合作,而我作为一个 engineer 的基础工作,就是把 infra 维护好,提供好用的工具让他们的问题观测和分析更简单。也是从 Amazon 开始,我开始更关注一个模糊的目标,一个可以持续建设的 platform,关注一个 solution stack,而不是具体某个 service,或者某个具体技术。
差不多六年之后,在 Oracle,我带领的 team 则是侧重于 infra 了,依然是作为 engineer,主要为 cloud 管 datacenter 的两个东西,一个是 process automation,一个是 matadata storage。在这个比较大的 team 我获得了比较大的职业生涯成长,我们 own 一个非常完整的 solution stack,也越来越确定我关注的重点,以及未来发展的方向。虽然从一定意义上来说,做的事情依然是 full stack 的,但我开始更多地称呼自己 platform engineer,而不再是 fullstack engineer 了。
之后在 2022 年加入了 Doordash,从巨头转向更加敏捷的中型互联网公司,一开始在一个偏向于 infra 的团队,做 gateway platform,我还是比较享受这一年多的时间的。当时 team 里面有一个非常有经验和见解的工程师,我从他身上学到不少。后来因为 org 调整的原因,我选择抓住机会去做了很短一段时间的产品,回头看这个决定有些鲁莽,但至少也确认了一件事情,单纯做产品并不是我最喜欢和擅长的。
对于下一站,我的几个在考虑的选项中,无疑都是偏向于 platform 和 infra 的 team,其中有两个机会我尤其感兴趣,其中一个是维护开源的高并发 library 的,还有一个是做 AI infra 的。现在我正在努力做的功课,就是把它们前前后后都了解清楚,然后做出自己的选择。
Returns the current value of the most precise available system timer, in nanoseconds. This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary time (perhaps in the future, so values may be negative). This method provides nanosecond precision, but not necessarily nanosecond accuracy. No guarantees are made about how frequently values change. Differences in successive calls that span greater than approximately 292 years (263 nanoseconds) will not accurately compute elapsed time due to numerical overflow.
TrueTime
一般来说,我们都知道计算机的时钟有误差,可是这个误差是多少,差 1 毫秒还是 1 分钟,并没有任何严格保证。绝大多数接触到的时间 API 也是如此,可是,Google 数据库 Spanner 的 TrueTime API 却。它使用了 GPS 时钟和原子钟两种完全独立的机制来冗余某一个机制失败导致的时钟问题,增加 reliability。此外,它还有和 System.nanoTime() 一样的严格递增的特点。
整个 Windows 的文件系统都可以以 Linux 的方式访问。以往我一般在 Windows 上运行 Linux 命令都是使用 Cygwin 的,但是现在我了解到两者很不相同,WSL 是真正的虚拟化 Linux 环境,而 Cygwin 只不过把一些 Linux 命令编译成 Windows 的二进制版本。
While Product Engineers focus on building and enhancing features that solve end user problems, Platform Engineers focus on the infrastructure that supports the product.
随着 AI 进一步地融入我们的生活和工作,一方面编程能力越来越普及化,因其入门门槛越来越低;另一方面简单的编程劳动也逐渐被它代替,因此一个不断被拿出来问自己的朴素的问题是——“我的工作会被 AI 取代吗?” 作为软件工程师,唯有保持思考,保持对于技术的敏锐和创造力,我认为这是唯一的出路。如果发现每天开始套用同样的方法去机械地解决问题,去写无聊的样板代码,那它也许就是一个危险的信号了。
我在加入 Oracle 的时候,在 the first generation 失败以后,专门在西雅图成了 OCI,孤注一掷,从头开始做 the second generation,在西雅图的其中一个目的就是为了从当时的三大云巨头 Amazon、Microsoft 和 Google 砸大钱挖人,同时也想尽量保持 OCI 文化和运作的独立性,这其中的决心和雄心不可谓不大。当时觉得大家做事的氛围和风格还可以,可是后来就逐渐发现,企业文化这东西真不是那么容易改变的,尤其对于这样一艘巨轮来说,逐渐 Oracle 的一些缓慢和笨重的老毛病就慢慢散播开来了。团队之间的扯皮越来越多,一年中的 code freeze 时间占比越来越大,org 中开始有越来越多的 program manager 专门催进度……我觉得自己做得不够果断的是,我确实看到了这些问题,却没有足够警醒和趁早行动(其实也是因为懒……)。
从科技公司的角度来说,我认为长远看这是好事,省掉了大量的场地开销,人才招聘扩展到更多的区域,终于不用在湾区、纽约和西雅图这样的软件重地抢地盘了,地域优势真在逐渐淡化;从扎实的 IT 从业者的角度来说,这样也是好事,多一点可靠的基本功和硬实力,少一点速成和赶风口的心浮气躁。尤其对于那些行动不便的人来说,所有通勤的烦恼全省了。当然,好事指的是总体来看利大于弊,并非没有弊端,弊端有很多,以前我也谈到几次,每个人也都有自己的理解,这里就不啰嗦了。
这一次找工作和五年前不同,客观方面,又是裁员,又是 slowing down 或者 hiring freeze,这次市面上的机会明显少得多,而且我觉得僧多粥少的原因也让 hiring bar 高得多;主观方面,工作很忙,琐事很多,我也就没有那么多时间去准备,面的公司也少了不少。于是,最后我的选择也没有五年前那么多。
对于现在的大环境,每天都有裁员的新闻产生,我也陆续收到好几个求职方面的求助,对于那些职场上经验不深的工程师朋友们,如果你有能力做到未雨绸缪(注意,这是前提,毕竟只是 “站着说话不腰疼” 就太恶劣了),那么,我的建议就很简单了:第一,时刻准备着被裁,你有余粮,你有技能,你有经验,永远有你的 plan B;第二,经济周期就是这样,好好坏坏,心中不慌,淡定思考,把经济的低谷视作黄金机会。如果第二条觉得自己做不到,那很有可能就是因为第一条没有做到。“此处不留爷,自由留爷处”。