我是塞巴斯蒂安·拉米雷斯,或者说蒂安格洛。我是 FastAPI 的创建者,现在也是 FastAPI Labs 这家新公司的创始人。我喝卡布奇诺咖啡,而且喝很多。欢迎回到 MLOps 社区播客。我是主持人迪米特里奥斯,今天我们请到了留着胡子的男人本人,蒂安格洛先生。你好。
也就是 FastAPI 的创建者,我相信你们中的一些人正在使用并喜欢它。我们讨论了构建软件时关于开发者体验的所有内容。我们还讨论了他如何思考抽象。让我们直接进入这次对话,因为我和我的朋友塞巴斯蒂安先生玩得很开心。你知道我想告诉听众什么吗?我想从……
事实上,我们举办了一次黑客马拉松,获胜者来自哥伦比亚。哦,对了,对了。我忘了那件事太有趣了。我们是评委。最有趣的部分是你来自哥伦比亚。获胜者来自哥伦比亚。之后,我们开了各种玩笑,比如他们收买了评委。是的,是的,是的。这是什么?
因为他们想出的东西相当酷,但我感觉我是哥伦比亚人。我不能投票。我只是,你知道的,像其他两位评委一样,你决定我不能。你太有荣誉感了。但我也记得,当我们只是闲逛,每个人都在黑客攻击时,有人,你在和某个人说话,出于某种原因,
Pydantic 出现了,他们不知道 Pydantic 是什么,你看着他们说:“你不知道 Pydantic 是什么?哦,让我告诉你关于它的一切。”那么,你为什么这么喜欢 Pydantic 呢?我认为 Pydantic 太酷了。问题是 Pydantic 使验证数据、获取自动完成和处理代码中数据的线性错误变得非常简单。
有趣的是,在 Bydantic 像现在这样广为人知之前,它就像一个用于数据验证的库,但我认为,你并不需要进行数据验证,你需要验证数据,你需要正确地构造它,序列化它,转换它,记录它。这不再是显而易见的事情了。
有很多代码只是浪费在进行自定义验证上。仅仅是因为,你知道的,如果你不知道有这个选项,你最终会写很多代码来检查它是否真的是一个整数。或者也许这是一个 JSON 对象,或者我不知道。所以我认为 Pydantic 在这方面做得令人惊叹。只是你从中获得如此多的好处并不明显。
对于 FastAPI 来说,它是进行所有数据验证、序列化、解析文档等工作的关键组件,并使其变得非常简单和直观。我想这也是为什么它帮助 Avid 展示了,嘿,Pydantic 在这里。你可以将它用于这些类型的事情。然后我认为人们慢慢地掌握了它,并开始将其用于更多的事情。
但我认为人们实际上花了一段时间才开始以许多其他方式探索 Pydantic。我记得我当时就是这样。我当时正在为所有事情推荐 Pydantic,因为我当时使用 Pydantic 进行所有数据处理。我有一堆自定义的 GitHub 操作,它们几乎只是一个 Pydantic 模型,它从环境变量中提取数据,并只给我正确的数据,然后调用就非常简单了。
它实际上甚至不涉及 FastAPI 或任何其他东西。它就像纯粹的 Pydantic。所以,是的,我认为这是一个很棒的工具。你在那股潮流中非常早。所以感觉你有点预见到了,然后你把它整合到了 FastAPI 中,对吧?是的,是的。问题是,我当时正在寻找一个类似于我正在使用的其他工具的东西。但到那时,我意识到我想拥有
尽可能最佳的开发者体验,这需要利用类型注释。类型注释非常新。它们只有一年左右的历史。所以没有工具使用类型注释,至少没有正确使用。我认为 Pydantic 是当时唯一一个使用它们的人。
除了数据类,那是标准库中的。但是数据类不执行任何数据验证、实现、转换。但它有点类似的风格。我正在寻找一个可以执行此类操作的工具。当时我看到有一个之前的工具叫做 Marshmallow。Marshmallow 很好。只是在我们拥有类型注释之前就是这样。所以它没有办法利用它们。
我试图寻找类似的东西,它将基于类型注释。所以我已经对我的需求有了想法。然后我找到了 Pydantic。我想,好吧,这是正确的东西。
但是 Pydantic 的文档主要关注的是管理设置和处理应用程序的设置。我们想,好吧,但是这是……所以我当时想,你知道的,这是我需要的东西吗?但是后来,我继续深入挖掘,然后我发现,是的,这正是我需要的。只是……
它可能并不明显,它可以完美地用于所有这些其他用例。所以是的,就像开始利用它并烦扰 Samuel 一样,嘿,这里还有一个 PR。是的,Samuel,太棒了。他一直都很好,他们是整个社区的伟大守护者。很高兴看到 Pydantic。就像你说的,它有这种滞后效应,但现在感觉它已经处于最前沿。
而且人们理解了它的价值,我认为这部分要归功于你对 FastAPI 所做的大量工作。
很好。你知道的,我认为我帮助人们了解 Pydantic 是一种荣幸。现在 Pydantic 也被广泛使用,你知道的,所有主要的 LLM 提供商、SDK 或工具。它们都是基于 Pydantic 构建的。这太棒了,因为我认为它就像,是的,它是我们构建在其之上的所有东西的惊人的构建块。
所以有两件事我想从我们上次的谈话中谈起,我认为那是三年前到现在的,我发誓如果我们再次谈话,我必须问你这些事情。第一个是,我以前因为没有问你关于你在 ML 中的经历而受到了一些批评。
人们说,是的,但是塞巴斯蒂安做过 ML 的事情。你们在播客中根本没有谈论过这件事。那么,你能分解一下你所做的 ML 工作,并给我们一些,我认为你是一个秘密的 ML/AI 人,你伪装成 FastAPI。但是 FastAPI 是为 ML 构建的吗?
以及现在的用例?是的,没错。你抓到我了。所以我开始使用 Python 来做 AI 和 ML。这就是我开始使用 Python 的原因。这是伯克利的 Edex 的 AI 课程中的一个先决条件,大约 10、12 年前。所有这些。是的。是的。
这就是我开始使用 Python 的方式。然后我开始工作,我正在做计算机视觉方面的事情。然后是没有任何深度学习、没有任何神经网络的计算机视觉。它就像,你知道的……
非常复杂的算法,比如 SIFT,然后匹配东西,比如卡尔曼滤波器,以及一堆非常复杂、难以获得良好结果的东西。然后,你知道的,现在你只需要在上面加上深度神经网络,就可以获得很多价值,而无需,你知道的,无需过多地摆弄。太棒了。
但是是的,我开始接触它,我参加了很多在线课程,但我对机器学习和 AI 非常感兴趣。然后 FastAPI 就从那里诞生了。然后,是的。所以我开始在一家公司工作,我们正在做机器学习方面的事情,并且与之相关。但我们总是需要构建应用程序。我的意思是,在所有情况下,我们都需要在事物之上构建一个 API。
所以我一直在努力,一直在绊倒构建 API 的问题,而我手头上的工具。我认为这是其中一件事情,一种不断重复出现的模式,以及一种必须反复解决的事情。我没有找到一个很好的解决方案,以及一个能很好地工作的东西。我找到了一个可以工作的解决方案,我想出了如何让它工作,但这太复杂了。而且,你知道的,
这很难,然后我和我一起工作的团队,他们都在努力,就像,是的,这只是复制粘贴塞巴斯蒂安所做的任何事情,它就能工作。而且是免费的。是的,这不是最好的开发者体验。所以继续走这条路,我使用了这个设置相当长的一段时间,但我一直在调查和研究不同的框架和东西,直到我最终进入 FastAPI,然后我就被困住了。
在 api 中,但我开始使用 python 是因为我将要进行 ai 和 mm,你错过了那趟车,你非常早,然后你进入了 api 的兔子洞,最终为互联网的一半提供了动力,这太棒了,这太疯狂了,就像你知道的,这让我感到非常……自豪和谦逊,以及同时的一切,看到如此多的 ai 应用程序,以及你知道的……
许多,你知道的,像 AI 中顶级声音和顶级意见领袖一样,喜欢并使用 FastAPI,对我来说,这是,你知道的,这是令人难以置信的。好吧,我记得你告诉我们,你听说过的一个更大的使用它的是 NASA,他们正在为宇宙飞船提供动力,或者类似的东西。这让我大吃一惊,就像有一些
非常酷的用例。当然有,因为你将 API 用于所有事情。所以它并没有以这种方式被包含在内。你可以在任何地方使用 API。就像你说的,你对开发者体验的承诺一直是,我认为,使 FastAPI 闪耀的原因。所以我想要问你的第二件事也是我上次与你交谈时受到批评的原因,
那时人们说,你为什么不问他为什么文档中有这么多该死的表情符号?这是在 ChatGPT 之前。你在这股潮流中也很早。是的,这很有趣。就像,你知道的,在某些时候,我不知道你对 Reddit 的了解有多少。我现在试图避免它,因为在很多情况下,它是一个黑暗的地方。这是一个非常黑暗的地方。
在某些时候,我记得在这些 Reddit 或我不知道,Fast API 或 Python 或其他什么地方进行了一些对话。有人说,哦,不,不能信任 Fast API。就像,你知道的,哦,不,不能信任。就像,这是一个单身汉。就像,你怎么能相信他们?就像,你知道的,人们没有意识到他们使用的大多数开源项目都是由一个人或几个人构建的。
即使他们是大型公司,对于大多数开源项目来说,这仍然主要是一两个人。但无论如何,他们说,不,不,你怎么能相信一个人呢?或者你为什么说他是个精神病患者?这个人说,他显然吸食非常严重的毒品。
什么?你怎么知道?因为表情符号。所有表情符号。它泄露了一切。是的,是的。这就是告诉人们,我喜欢吸食非常严重的毒品。就像,好吧,我喝很多咖啡。也许这算数。是的。
哦,伙计,这是最好的 Reddit 线程。我们必须尝试找到它来向人们展示,因为,是的,这就是互联网。当你获得一定程度的知名度时,你可以期待这一点。你会得到这种随机的猜测。但这很有趣。你知道的,重点是,我想。
好吧,过了一段时间。起初,就像,哦,你知道的,你感觉很奇怪,也许像被攻击了,或者我做错了什么,或者它像什么坏事一样。但是后来,过了一段时间,你意识到你所能产生的影响范围越大,
你更有可能遇到某个随机的人只是唠叨一些没有多大意义的随机事情。所以我猜……这是蓝色的家伙。是的,试图把它当作赞美,我想。你知道的,当有人如此糟糕地批评你时,就像……
我们怎么能走到这一步?你知道的,我是一个在世界另一端的互联网上的随机人。这个人怎么能如此如此地恨我?因为你在文档中使用的表情符号。所以,是的,我不知道。我也收到了一些报告。我认为不止一两个,超过一两个,说,嘿,FastAPI 文档已被黑客入侵。
因为全是表情符号。只是他们放了 URL 运行,因为有一个版本。所以 FastAPI 被翻译成几种语言。其中一种语言是表情符号。
这只是一个愚人节玩笑。它只是停留在那里,仍然在那里。你可以找到用表情符号写成的完整文档。哇。它实际上是由其他人完成的。不是我做的。它是由其他几个人完成的。我认为这是我在 Fast ATI 中获得最多批准的 PR。
所以当人们喜欢,你知道的,像复活节彩蛋和愚人节玩笑一样,他们真的会全力以赴。所以它仍然在那里。但是偶尔人们会遇到带有表情符号前缀的 URL,他们只是看到所有表情符号,然后说,哦,不,它被黑客入侵了。然后他们在 Twitter 上标记我。就像,是的,不,你使用的是错误的语言。难以置信,伙计。想想这件事太有趣了。好吧,还有另一件事,
我只是无法停止思考表情符号部分以及表情符号会引起多少争议,基本上什么都没有。当我……的时候,我也会那样。
在我们虚拟会议或我过去为虚拟活动做吉他介绍的虚拟会议中弹吉他,我们把它们上传到 YouTube 上,我会告诉你,YouTube 上的一些人……他们有一些创造性的方式来谈论垃圾,我就像你一样,我会想,该死的
我有一种荣幸的感觉,因为他们花时间谈论垃圾。我想我在这里可能会感到有点羞愧,但是不,我要把它当作赞美而不是威胁或只是贬低我。所以无论如何,我想和你谈谈的事情,你……
已经创建了一家新公司。我还听说或看到你从红杉资本那里获得了一些资金。我知道在过去的一年左右的时间里,你一直在做一些非常酷的事情,红杉资本正在赞助,这就像,这几乎就像企业家驻场,但事实并非如此。所以也许你可以分解一下你正在做什么,然后为什么你最终选择了红杉资本。
Fast API Cloud 或 Fast API 的专业版,因为我知道以前当我们举行聚会,然后在柏林聚会结束后出去玩的时候,人们说,哦,所以你要开始一家公司。你要做一些关于 Fast API 的事情。你当时说,我不这么认为。我不知道。也许我们会看到。我很开放。但这也是四年前的事了。所以很明显很多事情都变了。给我一个分解和导致这一切的过程。
你知道的,我记得在聚会后的那次谈话中,其中一个人走过来问我,好吧,你打算全职做这个吗?因为那时我仍然没有全职从事 FastAPI。是的,你有一份工作。我忘了。我想我有一份兼职工作,我要求他们兼职,因为我想花更多的时间在开源上。
他说,我记得这个人说,嘿,你全职从事 FastAPI 吗?就像,不,但是,是的,你知道的,我没有产品或其他什么东西。你为什么不成立一家公司呢?不,是的。我记得他说,你应该,你应该成立一家公司或做一些事情,为开源构建一些东西,因为我们都需要它。就像,你知道的……
我们都从中受益,如果我们不能得到更多的东西,那将是一件憾事。你知道的,它就像这样,哦,这太糟糕了。这太,你知道的,一方面让你感到非常感激。另一方面,这有点像责任,你知道的,就像,你知道的,这对人们非常有用,我有机会和能力
通过改进它来帮助更多的人,就像你必须做的事情一样,所以是的,我记得我记得那一点,那一刻,那个人,我想我记得你在说什么,那个人,因为我清楚地记得我们在酒吧谈话的时候,他告诉我,伙计,是的,也许你可以开一个
课程,或者你可以用这个社区做一些事情,比如证书,我看着你,我说,是的,也许你也可以开一个课程,或者一份新闻通讯,他看着我说,这是塞巴斯蒂安,他创建了 Fast API,他不会开一个课程,他有一家公司要开,我说,好吧,伙计,谢谢你的这个含蓄的赞美
我笑得那么厉害。我不记得那个家伙的名字是什么,但我打算去找他,我们会一起开怀大笑。但无论如何,然后你受到了这种压力。是的,但之后,我不知道是不是下一年或一年之后,我不记得了。可能是那之后的一年。那是 2023 年,红杉资本启动了开源奖学金。所以它就像……
这是一个陡峭的结束,以支付我的费用,所以我将全职从事开源工作。我认为在那段时间里,我们举办了黑客马拉松,我帮助评判,以及那些事情。但那是因为那是之前的活动之后。而且你没有得到报酬,对吧?我记得你告诉我你有捐赠的选项。
在 GitHub 页面上,但是 FastAPI 的赞助商,对你来说还不够维持生计。是的,是的。你知道的,这很有趣,就像人们来,有时人们来赞助,他们得到了一些钱,每月 5 美元,10 美元,诸如此类。而且,你知道的,我非常感激,这感觉非常令人鼓舞。
但是这样很难获得可持续的收入,因为你得到,你知道的,你得到一百个一百个人每月支付 5 美元,那就是每月 500 美元。这不够……
维持生计。然后那些投入最多的人是那些获得一些回报的人,比如狗身上的徽章,或者咨询时间或诸如此类的东西。但最终,这是一种交易,你知道的,
你放弃了一些额外的东西来让他们给你一些回报。有时,你知道的,对于公司来说,也很难证明向,我不知道,赞助开源的东西而没有得到一些回报来向财务部门和投资者展示,以及所有这些事情。
是的,我想这就像,很难平衡。有些事情,例如,现在的开源承诺,我认为这太棒了。从 Sentry 的人开始,还有 Astral 和 Pydantic 的人加入,以及其他一些公司加入。他们,你知道的,承诺为他们拥有的每个员工提供一定数量的开源。每年一定数量的开源或类似的东西。
但问题是,你知道的,开源赞助通常并不非常非常有意义,至少对于大多数项目来说是这样。所以它就像,它是一些东西。但最终,它也是一种服务、产品或交易,你必须放弃一些东西。它就像狗身上的徽章或类似的东西。
但是是的,有了开源奖学金,他们将支付我的费用,然后我将能够全职从事开源工作。他们会不时地问,嘿,你对这家公司有什么看法?但这就像,我不知道,一年四次左右。所以很少。它实际上主要关注的是你的开源。
而且它也不像,你知道的,这里有一个项目经理。你必须处理这些问题,或者你必须做这或那件事。它就像,你做你的事情。我们只是相信你。去构建你的东西。你知道该怎么做。去做吧。所以这非常有用,因为我能够工作,并处理需要大量持续专注时间才能完成的非常困难的事情。
而且结果和价值只有在完成后才能看到。例如,在 FastAPI 中迁移或支持 Pydantic 版本 2。
FastAPI 目前支持版本一和版本二,具体取决于你安装的是哪个版本,FastAPI 支持那个版本。所以人们可以在那上面进行迁移。但是,做到这一点,达到这一点需要大量的工作。如果你只是在晚上花一两个小时,然后在周末花一点时间,那就很难做到这一点。很难保持节奏和保持上下文。所以这太棒了。
你仍然在做这件事。是的。那是开源奖学金。那是 2023 年。到 2023 年底,我看到有一些公司试图为 FastAPI 构建云,为 Python 构建云,并试图获得该功能,试图让它运行。为什么其他人要构建它?为什么我不构建它?
因为一方面我可以确保它拥有,你知道的,Fast API 最佳的开发者体验,因为我是 Fast API 的第一位用户,我为自己构建了 Fast API 以供自己使用,然后构建云,我为自己构建它,我只是,这只是每个人都能享受的自我满足,但是,你知道的,我正在为自己构建它,就像我希望它存在一样,然后
它也像,你知道的,社区已经存在了,我可以让它与 FastAPI 集成起来非常简单,以便轻松集成 FastAPI。我还可以确保,你知道的,FastAPI 正在,这对我来说非常重要,FastAPI 是完全开源的,具有所有功能,例如你可以在任何地方部署,无论你如何部署。
我只是要确保你拥有 FastAPI Cloud 的惊人开发者体验。所以你想尝试 FastAPI Cloud 并留在那里。但是,你知道的,你仍然可以按照你想要的方式使用它。
这是有道理的,而且也像,你知道的,如果我可以从我多年来在开源方面所做的所有工作中获得一些成果,我想至少获得一部分。所以,是的,这也很有意义。并找到一种方法,一种可持续的方式来为开源项目提供资金。
这是我多年来一直在努力想出如何做的事情。开源奖学金很棒,但这不是我可以感觉到的东西,哦,我将永远留在开源奖学金中。他们可能不想永远只付钱让我待在那里。他们愿意延长它,但这就像……
你知道的,我应该可能做一些事情来确保所有这些事情都能继续运作。这样我也可以继续工作,并且让人们参与开源项目,Fast API、Type、SQL 模型、Async,以及我构建的所有已经存在的东西。所以它就像,你知道的,只是所有东西的平衡。你不能无限期地依赖善意
你必须在某个时候弄清楚什么是更可持续的方式。这感觉就像是从你兼职做这件事到它成为你的全职工作的一个很好的桥梁。
现在你有了这种可持续的方式来保持它成为你的全职工作。是的。所以这很有道理。我想谈谈你使用 FastAPI Cloud 获得的不同之处或内容,以及你如何考虑哪些功能或哪些部分用于开源,哪些部分现在用于公司,以及围绕该决策的所有内容。是的。
这实际上,这是我认真思考过的事情。构建云并非像,你知道的,并非我试图构建云。那感觉令人望而生畏,而且确实令人望而生畏。我们一直在做很多工作。这就像,我不能做一个,你知道的,像一个简单的产品或什么吗?但每次我想出什么东西,把它开源就很有意义。Typer、SQL 模型、Asyncer。这就像,是的,好吧,这必须是开源的。
构建云是一项艰巨的任务,工作量很大,我需要一个团队,也需要资源。但它有一个非常好的细节,一个特点,那就是开源和云之间的重叠和利益冲突非常大。
是最小的。你知道的,就像你的开源是这样,然后云是那样,它就像它们只是互相交叉。但开源并没有真正影响那么多。事实上,它实际上非常吻合。如果 FastAPI 更好,你获得更多功能,你可以用 FastAPI 做更多的事情,你更有可能想要普遍使用 FastAPI。如果你普遍使用 FastAPI,那么你最终想要尝试 FastAPI Cloud 的可能性就更高,
尝试一下这项服务。所以,你知道的,就像做一些与所有开源尽可能减少摩擦的事情是有意义的,因为它也简化了所有这些
冲突和那种关于专业版中包含什么、核心是什么、是什么的流程……现在,FastAPI 全部都是专业版。你可以免费获得专业版。如果你想在 FastAPI Cloud 中部署,你可以直接部署到 FastAPI Cloud。但开源的事情就像你获得所有现有的功能以及我们将构建的所有新功能。就像我们将确保我们所做的所有新东西一样
FastAPI 尽可能好,我们不断改进它,那么无论你如何部署,你都将能够获得这些好处。
另一方面,我们可以确保在 FastAPI Cloud 上部署是最好的开发者体验。它就像,你知道的,像部署东西最强大、最可靠的方式,你得到的东西是即时的。就像你不必思考或弄清楚或,你知道的,像调整一堆配置并在其他语言中调试错误。而且,你知道的,像所有这些过程一样,很多,对吧?
你经历过。是的。是的。这也是我意识到并决定构建云产品是个好主意的原因。在此之前,我非常倾向于自己学习构建所有东西,就像,你知道的,像自己安装 Linux 机器,像自己构建和设置集群,然后在那里部署你的东西。
事实上,我有一个最著名的网站来解释如何使用由……创建的 Docker 的替代品,对不起,由 Docker 创建的 Kubernetes 的替代品。它被称为 Docker Swarm,Docker Swarm 模式。是的。这是一个很棒的产品。它相当精简。但最终,它对他们来说不起作用,他们把它卖给了另一家公司,该公司……
在他们的 Kubernetes 框架下。所以,你知道的,Kubernetes 不管怎样都赢了。但是 Kubernetes 太大了。它是一个庞然大物。仅仅学习 Kubernetes,使用它,管理它,你只是这样做,然后你只是触及了表面。这只是很多,很多工作。所以,你知道的,像看到那样,看到我……
在此之前,我可以告诉人们,嘿,去安装这个东西,然后你就好了。你在一周内,几天内就有了第一个可用的版本。但如果我告诉他们,好吧,你有你的 FastAPI 应用程序,现在去学习六个月的 Kubernetes,或者尝试这个产品或那个产品,或者也许这个产品效果会差一些。
这不是一个好故事。这也让我相信,也许拥有一个专门针对此类应用程序的东西并且让用户超级轻松地部署 FastAPI 应用程序,能够专注于代码和产品而不是部署的所有细微之处是有意义的。是的,所以……
一切都融合在一起,并达到了那一点,就像,是的,好吧,这可能是最好的方法。这是我能对人们的代码以及他们能够取得的成就、他们能够做的事情和构建的事情产生最大影响的方式,以及帮助开源和其他产品的人,以及所有的一切。所以,是的。
你让我想起了那家名为 Base 10 或 Base Camp 的公司的创始人。不,Base Camp 就是它。而且他们,我听过一些关于他的播客。他谈到当他看到或使用时
设计糟糕或考虑不周的软件,这会让他发疯。让他发疯到他创建了几家不同的公司来对抗设计糟糕的软件。我认为其中一家甚至是一个停车场。
他的业主协会或他的公寓大楼使用的停车场软件。他非常讨厌它,所以他去创建了一个新的,如果我没记错的话。这让我想起了你,你经历并说,哇,这个开发者体验很痛苦。然后你
我相信有一段很长的时间你忍受着这种痛苦,它持续地让你痛苦,但它以某种方式吞噬着你的灵魂,对我们中的一些人来说,我们只是忍受它。但对你来说,你就像,我必须围绕这个创建一个产品。是的,也许,也许有点像那样。就像,你知道的,像有很多工具很棒,但它们也很……
超级复杂或处理很多细微之处,这就像某种抽象层,然后有时你不得不处理它就像它太复杂了,就像你知道的,如果你不得不去购买发动机、轮胎和车门来最终组装你自己的汽车,这就像太多了,你只需要买一辆车
是的。所以,是的。我认为在许多情况下,当你的业务不是组装汽车时,组装你自己的汽车并没有真正意义。你的业务是做一些事情来驾驶它们,或者甚至不驾驶它们。也许你只需要它们才能把东西运过去。但你需要一辆车才能做到这一点。就像,是的,就像我觉得对于很多很多用例来说,能够直接买到车,而不用处理这些事情是完全有意义的。
是的,你甚至不需要创建 Uber,你甚至不是每天都使用你的车的 Uber 司机。只是你坐上车,它把你从 A 点带到 B 点。我喜欢这个比喻,因为最终,每个人都需要在他们正在构建的软件中使用汽车或使用 API。那么,你如何才能使获得某人正在寻找的结果的摩擦最小化
或最容易。是的,完全正确。你知道的,这就是 FastAPI 的精神。你如何才能做到让你以对你来说最直观的方式编写代码,然后它默认情况下做正确的事情并做你需要它做的一切事情。数据验证、文档,所有这些都是默认完成的。
它只是避开了。所以你可以专注于你的代码。当你看到一个 FastAPI 应用程序时,
FastAPI 代码的数量很少。它主要就像实际的业务逻辑代码。这就是试图使工具超级易于使用,并且,你知道的,像不阻碍你构建你需要构建的东西的想法。自从我们上次交谈以来,我一直在思考很多,因为我认为在我们第一次谈话中,我们谈到了你如何看待
要使用的抽象层以及做出该决定的方式或你如何考虑做出该决定。自从新的 LLM 热潮以来,这变得越来越重要。
因为所有这些新工具都涌现出来,试图抽象掉 LLM API 调用的不同部分,或者可能是编排,或者可能是你在使用 AI 构建时围绕系统的东西。你有没有想过,不一定是关于 AI 系统的抽象,但你如何处理
这些抽象以及思考这里最好的抽象是什么?你是否有时会创建一个抽象,然后将其回滚并说实际上不不不,它是你正在使用的东西,它慢慢地在你的脑海中酝酿,然后你突然间有一个尤里卡时刻,那是什么样的?
这实际上是一个非常有趣的问题,因为,你知道的,我确实经常考虑这个问题,但我并不经常被问到这个问题。我认为这更像是,你知道的,像它在后台酝酿,我试图弄清楚正确的方法,并为此而挣扎。然后在某个时候我意识到并想通了,是的,这是有意义的。我很高兴我为我构建的东西做了很多思考。
同样,你知道的,像 FastAPI、Typer、SQL Model、Asynchr 以及 FastAPI Cloud 产品一样,对于所有这些,我都避免了很长时间不构建它们。对于 FastAPI,我试图不构建任何东西。我在寻找其他工具。我想,有什么现有的东西可以做我想做的事情吗?对于公司,我是,你知道的,像,我已经被人告知,哦,你应该几年内创办一家公司。是的。就像,有像,
我有像,是的,一些人对我的公司建设感兴趣。这就像,是的,不,我不这么认为。我没有像一个合适的产品。它不是,我没有一个将是构建的正确抽象的东西。但是,这是一个关键点。这就是我思考的方式。当你,当你能够构建的新抽象,学习和使用那个新抽象为你的用户,为你的最终用户,当学习它时,
比他们必须学习底层事物所付出的努力要少得多。所以,你知道的,像他们使用你的工具,他们使用 FastAPI,他们必须付出一些努力来阅读文档,学习如何为 FastAPI 编写代码,学习如何做到这一点。但如果他们没有付出这种努力,他们将不得不付出
数量级更多的努力来学习如何手工完成所有事情,或者更多,你知道的,像数量级一样,所以当你达到那一点时,就像好吧,如果人们不必学习所有底层的东西,他们可以学习中间的一个小层,通过学习它,他们只需节省大量学习、调试和使用
任何底层的东西,那么这就是有意义的时候。这也是没有其他抽象已经做到这一点的时候。因为在某些情况下,人们会去构建另一个工具或构建另一个框架或其他东西,但这就像,这与其他东西已经做的几乎相同。所以它不一定是那么可行,但当你反复看到时
所以我的抽象级别没有达到,你知道的,像拥有一个超级简单和直观的工具,你只需要学习很少的东西就能获得很多价值。是的,这就是我说,好吧,这是有意义的时候。
这就是 FastAPI 的情况,这就是它发生的方式。我实际上打算开始为另一个框架做贡献,作者说:“不,我不能继续做这个工作。我将弃用它。我将专注于其他事情。”这是 Tom Christie,Django Rest Framework 的作者,API Star 的作者,它是 FastAPI 的精神前身。
然后他开始使用 Starlet,它是 FastAPI 的构建日志。然后他说,我不能继续使用这个名为 API Star 的其他框架。然后我说,好吧,这是最后一刻。我将跳进去并尝试构建 FastAPI。
SQL 模型也是如此。有一些其他工具试图构建一个基于类型注释和 Pydantic 的 ORM。但没有一个能够达到我主观想要的最佳点。但是我希望它做的事情,我希望它做的方式,
考虑到类型注释的工作方式、默认值的工作方式、如何完成内联错误,所有这些都与开发者体验紧密相关。
他们并没有真正做到这一点。他就像,好吧,我必须构建这个新工具,这个 SQL 模型工具。他就像,我真的不想这样做,因为处理 SQL 上的数据库太难了。但他就像,你知道的,像,我必须这样做,因为我有这些想法。它们将是有用的。我只需要去,你知道的,像咬紧牙关并构建它。云也是如此。是的。
你知道的,像学习所有 Kubernetes 东西和学习来自大型云提供商的所有云产品一样,这只是很多工作。而且只是如此……不同工具之间存在如此多的阻抗不匹配,你必须找到某种奇怪的方法来修补东西以使事情正常工作,并始终注意这些东西是如何演变的,以便你可以更新修补程序。你知道的,像……
这就是云的构建方式。它不是我们的。它是每个人的云。这就是所有云的构建方式。秘密。剧透警告。是的,是的。这就是每个云的构建方式。它就像很多东西一样,你知道的,它只是到处都是胶带,把所有东西都放在一起。然后不得不处理它只是很多工作和很多努力。
然后当,你知道的,像它到了那一点,就像,是的,不,像实际上如果你想部署一些东西,你应该去学习这些大型产品之一或 Kubernetes 或它们之上的 Kubernetes 或某个云提供商。有几个云提供商相当不错。他们在抽象事物方面做得很好,比,你知道的,像原始的东西高一点。它们相当不错,但它们仍然相当通用或通用于产品。
试图成为,你知道的,像适用于每个框架和每种语言,适用于所有东西。所以总是有这种小小的摩擦,就像,你如何为 FastAPI 做这件事?你如何使这个东西工作?这是我觉得有意义的事情,拥有一个只为 FastAPI 工作的东西。把它插进去,是的。它一部分是工程师,一部分是
品味,我听到的。因为当你思考这些问题时,你真的在反复思考它们。但你也在考虑什么将是最有效的,然后什么将是最有品味的方式,或者开发者体验方面的事情真的让我
意识到你不仅在思考,嘿,这是最好的方法。它是,这是最友好的开发者方法。即使它可能不是最好的方法,因为
可能有一些更好的方法可以在每个步骤中做一些事情。但这会增加你不需要的额外复杂性。是的,是的,完全正确,完全正确。有趣的是,它感觉更像是品味和艺术而不是科学。感觉就像,哦,它就像,你知道的,像非常好的品味或什么。但实际上并非如此。
一个巨大的具体技巧列表,但你知道的,像用心记住所有这些,对于看到这一点很有帮助,但这没有意义,因为它闻起来很奇怪,或者你知道的,像我觉得它没有很好的咬合,不,它通常是
一件非常具体的事情。就像,如果你以这种方式定义导入,那么你的最终用户将不得不从非常不同的位置导入,他们将知道他们需要导入什么。因此,最好以其他方式定义它们。但说所有这些长话比说,这可能更好,要长。你知道吗?所以我认为有很多这样的事情,就像,你知道的,这是一件有趣的事情。我觉得很有趣的是
几个自动 SDK 提供商,所以为大型 LLM 提供商(如 OpenAI 和其他几个提供商)生成 SDK 的人。好吧,
OpenAI、Anthropic,我不记得大多数了,他们正在构建 SDK,Python SDK,好吧,像几种语言的 SDK 基于 OpenAPI,这是 FastAPI 基于的东西。许多这些大型提供商实际上在底层使用 FastAPI,并且他们得到了一个不错的 OpenAPI 作为结果。但随后许多这些 SDK,他们就像,好吧,在 Python 中构建这个的正确方法是什么?我最终与其中一些人进行了交谈,并说:
正确的方法是这样的。例如,使用,你知道的,像这是那些听起来像品味的事情之一,它实际上是一组非常具体的工作。如果你将函数的参数定义为类型字典,而不是 pydantic 模式,函数的参数,函数的输入参数,如果你正在构建 SDK。
作为类型字典,那么编辑器将能够为用户提供参数的自动完成和内联错误,而无需用户导入任何其他模型,无需他们导入任何东西。他们只需开始花括号,他们就开始获得自动完成。然后,如果这些函数的输出是 pydantic 模型,那么当用户尝试获取属性或类似内容时,他们将获得自动完成。一举两得。
是的,所以它就像,你知道的,像只是这种特定的组合,在这里使用这个,在那里使用那个。这个这样工作,那个那样工作。像在底层使用这个工具,这样应该让你开始。这最终会有很大帮助。然后最终,大多数这些 SDK 提供商都在使用我认为我在某个时候告诉他们的确切方法。至少有几个人,我告诉他们,嘿,你可以这样做。我不知道其他一些人是否自己想出了它。但就像,你知道的,它就像只是那些技巧,那些技巧
微小的想法……
只是探索了一堆这些,并试图在作为最终用户使用后获得最佳开发者体验。我认为这是主要观点。只是将某些东西用作最终用户并不断尝试改进自己的体验。但是当你提到探索时,你的意思是说你试图制定某个规则,然后你围绕它进行了一些尝试,然后你说,呃……
也许这不好,或者如果我们也这样做,可能会更好一些。所以你正在添加它,或者你正在添加一些东西,然后又拿走它。是的。所以实际上两者都是。我作为代码和其他库的消费者,当我使用它们并且我觉得这不好时,就像为什么我在这里没有自动完成?现在,到目前为止,我知道自动完成在内部是如何工作的。所以我知道他们在代码中做错了什么。
如果我有无限的时间,我会向所有东西发送 Maple 请求。但在许多情况下,我看到一些东西,就像,啊。等等,等等。你就像开源包的蝙蝠侠。你去获取自动完成人。他们提交了 PR。我可以成为自动完成人。那应该是我万圣节的服装。是的。
你正在拯救 GitHub 的哥谭市。GitHub 的哥谭市。那是经典的。控制空格。是的,继续吧。所以就像一件事就像使用不同的工具并弄清楚使用它们的感觉,然后尝试弄清楚如果我以这种方式或那种方式使用它们会感觉更好。这是一件事。
另一件事是当构建工具、构建库或产品或任何东西时,
这实际上适用于任何正在构建任何东西的人。如果你把自己放在将成为最终用户的任何人的位置,那么更容易为最终用户优化该体验,以优化并确保你正在做一些对最终用户有效的事情。如果你不是最终用户,那就更难了。然后你必须雇用一个像,你知道的,像……
在你脖子上呼吸检查你正在构建的东西实际上是否有用,因为否则你最终会构建一些对最终用户没有用的东西,然后没有人使用它,它并没有真正解决实际问题。例如,当我构建 SQL 模型时
这很有趣,因为我没有开始编写所有代码,然后像,好吧,现在让我们尝试文档。我从文档开始。所以它有点像文档驱动的开发。所以我开始编写文档,解释它应该如何工作,然后尝试以易于理解和易于使用的方式编写示例。
然后弄清楚我必须在代码中做什么才能使它工作。然后像,你知道的,像反向进行,只是从,最终结果是什么?我如何使这个最终结果真正有效?在某些情况下,我记得有一两点,我在 SQL 模型中的某个地方有一个功能,它可以让你做一些事情,你将能够做同样的事情
以三种或四种不同的方式。就像你可以在这里设置这个参数,或者你也可以在这里设置它,或者你也可以在另一个地方设置它,或者有条件地这样和那样。这就像,你知道的,像它很容易实现。但我意识到解释这一点太复杂了,因为如果发生这种情况,那么这种情况,如果发生其他事情,那么其他情况。但是如果你尝试这个,那么参数的优先级是这个,你知道的,像这是一段很长的内容。
这将很难让人理解。然后它将难以使用。如果难以理解,那么它将难以使用。你知道的,像它必须简单直观。然后就是这一点,就像我想通了,好吧,我将禁止其他三个已经存在的选项,已经免费实现了。但我将禁止它们,因为它们只会在我尝试解释它们时使事情复杂化。它会分散注意力。
是的,所以它就像,我认为这有点像尝试戴上最终用户的帽子,这有助于指导你正在构建的任何东西。狗食,伙计。那太好了。而且我再次回到……
能够说,我们将从文档开始,然后向后工作。然后当你创建文档时,你意识到
这非常复杂。我不会让人们以这三种方式去做,即使我知道当我创建它时,你将能够以这三种或四种不同的方式去做。我们将只说这种方式是我们选择的方式。我们同意在这里表达意见,因为我们认为这是最好的。所以这就是你需要知道的一切。是的。
是的,完全正确。完全正确。这很奇怪,因为像,你知道的,作为一个软件开发人员和工程师,你习惯于,你知道的,像能够构建东西,并且如果你有更多选项并且你可以让它们工作。我有像,你知道的,像更多功能。这就像,这太棒了。我是一个工程师。但是,你知道……
如果你正在寻找你可以建造一座桥梁,带你到许多不同的地方,这就像,好吧,一座桥梁不应该只带你到一个地方。所以最好只建造一座桥。所以,是的,这实际上有帮助。这实际上有效。好吧,让我们花一分钟时间谈谈社区以及你如何处理
优先处理 PR 和合并出现的不同问题,因为 FastAPI 周围有很多活动。很多人都在使用它,正如你所说。有很多不同的相互竞争的利益。那么你如何看待这个问题,以及你如何确保
A,你没有做任何可能破坏开发者体验的事情。但 B,并没有把人们拒之门外,因为也许他们的整个业务依赖于某个功能的合并。是的,这是我觉得
从构建整个事物的人的角度来看,与从外部人员的角度来看大相径庭。这很奇怪。所以,你知道的,像,第一件事是那些从事开源工作的人只是一小撮。不仅仅是 FastAPI,对于大多数项目来说都是如此。实际上,在 FastAPI 中,我相当……
我很幸运也很感激,嗯,现在我可以付钱让人们来做这件事,但我也可以从社区中的一群人那里得到贡献。我还为 FastAPI 专家们开设了一个讨论区,他们会来帮助其他人解答他们在 FastAPI 中遇到的问题。所以,你知道,他们通过帮助他人来证明他们了解 FastAPI。然后我可以在文档中突出显示这一点。所以,嘿,这些是专家。
而且,你知道,像自动化所有这些东西,让它与狗狗们一起工作等等。但是,你知道,GitHub 讨论中的信息流非常庞大。之前我在 issue 中会收到问题,但后来人们会来,大约 90% 的人在 issue 中写的东西实际上是他们自己代码中的问题或错误。所以,你知道,它实际上……
并不是 FastAPI 中的 bug。所以它很难管理。现在,有了几个人,例如,可以检查出现哪些问题的专家,每当他们看到真正损坏的东西时,他们就会 ping 我,这非常有帮助,因为他们帮助我过滤掉所有噪音,并找出真正重要的东西,真正有效的东西。
然后是所有开源 PR。首先,因为我有翻译,有很多翻译只是等待另一个母语人士来审查。所以这些东西必须在那里停留相当长一段时间。我正在考虑改变这一点,并切换到使用 LLMs。我已经在为西班牙语这样做,结果非常好。
我想为其他语言也这样做,因为结果相当好。它们是一致的。这是 LLM 实际上非常擅长的事情之一。LLM 擅长很多事情。
翻译并正确地进行翻译,它们非常擅长。所以我想把我为西班牙语做的这件事扩展到其他语言,这样我们就可以为每种语言提供一致的翻译。也因为有些语言只有几页内容,而没有其他内容被翻译。所以最好有一套一致的支持语言,然后翻译这些语言。
然后,你知道,大约一半的 PR 只是翻译。然后还有很多其他的,例如,不一定有测试,或者没有他们正在解决的特定明确的用例。所以不清楚他们在做什么。
还有一些实际上可以解决问题,但在某些情况下与我想要做的其他一些功能或其他一些事情冲突,这些事情将解决该用例以及其他三个用例。所以就像我现在不会合并这个,因为然后我必须维护它。
但是仅仅关闭它并说,“哦,我将在另一个时刻以另一种方式做到这一点”,这也是粗鲁的。所以是的,这是如何管理所有这些以及如何确保你选择正确事物的艰难平衡。许多 PR,看起来很简单,
可能会变得非常复杂。在许多情况下,人们会说,“哦,你为什么没有合并或者你为什么没有审查这个?”一行代码的 PR。因为要审查它,我必须检查其他 5000 行没有更改的代码,以及这一行代码如何影响它们以及所有东西如何崩溃。
这种情况发生过几次。嗯,几次我合并了一些东西,认为,“好吧,这可能说得通。”是的,用例是合理的,有点。
代码也说得通,尽管我不确定为什么我们需要更改它。但这说得通。测试似乎通过了。你知道,这正在接触我不确定是否有其他东西正在接触的东西。但是然后我发布了,然后像其他地方的东西爆炸了,因为有人在用 FastAPI 做一些奇怪的事情。在大多数情况下,这是因为有人在用内部组件做一些奇怪的事情。但是,你知道,我仍然试图不影响甚至那些用例。
所以是的,这就像一种奇怪的平衡。我仍然审查每一个 PR。那些更改内部代码和更改复杂事物的 PR,我仍然审查每一个,并确保它们是好的。现在我有一个团队,我有一些值得信赖的人可以告诉我,“嘿,这看起来相当不错。”然后我可以给它……我仍然会仔细检查一下,但是……
至少我知道这不是什么没有意义的东西。你知道,至少我对应该关注的事情有一个很好的优先级。然后决定要处理哪些 PR、哪些问题或哪些项目以及要关注什么,这也是一种平衡,即现在对每个人影响最大的事情是什么。在某些情况下,甚至可能是 FastAPI 依赖的另一个第三方开源项目或其他什么。就像,
这需要修复,因为我们在 FastAPI 中使用它,或者它与 FastAPI 有很大的交互。所以这就是需要最高优先级的事情。Autoconflate,伙计。所有事情都 Autoconflate,是的。你走开,你必须修复其他人的开源项目才能让你的项目工作。那是你在履行你的公民义务。是的,或者狗狗们,在这里和那里修理狗狗们。是的。
你刚才说的那句话里好笑的部分是,是的,它只是一行代码。但最终,你必须去看看它如何与其他 X 个代码,数千行代码交互。
它让我想起了马克·吐温的那句话,他说,我没有时间写一封短信,所以我给你写了一封长信。是的。类似这样的。是的。这有点像你……如果只更改了一行代码,那就几乎令人怀疑,因为然后你会想,这里发生了什么?为什么需要这一行代码?然后当你再说……
当你没有修复一个问题时,人们必须信任你,因为你有先见之明地说,将来我会修复这个问题以及另外两三个问题。所以这是一个二合一或三合一的交易。他们只需要耐心等待。感觉上你几乎需要一个公共看板。
你正在关注的事情,你将要处理的问题,这样人们就可以知道,“好的,它在待办事项列表中,或者现在它正在进行中,是的,他正在处理它。”好的,酷。是的,但我也会尝试一点。
例如,你知道,有一个公共路线图,或者这些是我主要关注的事情。但由于 FastAPI 覆盖了这么多人,这里和那里总有人会来要求一些与路线图不一定相关的东西。但这只是在那里添加评论。就像,这只是更多需要管理的沟通。所以在某些情况下,公开整个事情的权衡
变成了必须处理更多沟通,最终变得效率不高,你知道吗?在某些时候,我只是回答问题和讨论等等。我只是把所有时间都花在回答问题上,而不是修复任何东西,只是因为我在回答,只是在写信息。这就像,这行不通。这是不可持续的。老兄,我能想象其中一个最大的
你最大的时间浪费是当你登录 GitHub 时,你刚刚收到数千条通知。就像那样,就像你说的那样。所以,是的,如果你正在制作一个公共路线图,这只会给人们更多机会来评论或与你互动,除了你的社交媒体,人们在那里评论和与你互动,除了实际项目本身。
哎呀,我没有考虑周全,但如果我是你,我会害怕甚至看我的手机。是的,没错。你应该大部分时间都关掉它。我必须禁用通知功能,GitHub 的电子邮件。就像我从 GitHub 收到电子邮件通知,在某个时候,当它显示“你有 10000 条未读消息”时,就像,“是的,不,这行不通。”哦,
你知道,是的,我只需要去 GitHub,使用 GitHub 通知系统,并依靠 FastAPI 专家。一些人是……,你知道,像他们团队中的人一样,他们只是在工作,他们只是来审查。有很多 PR 他们可以,
审查甚至自己合并。例如,如果人们一直在检查存储库或进行翻译之类的工作,可能有一件事要交给 Sophie 或 Alejandra 或 Pazic,你知道,人们可能会认为是
一直在做这样的事情。我还从 FastAPI 专家那里得到很多帮助,例如 Marcelo,他是 Pydantic 团队的一员。还有,还有 Judy、Ludovico。有几个人,他们不一定,不在公司。
但帮助很大。他们就像一些专家,是的,这帮助很大,也帮助我在出现问题时浮出水面。每当有什么需要我注意的事情时,他们最终会像
带给我重要的新闻。他们正在履行他们的公民义务,以确保你的东西运行,这样他们的东西也能运行。是的,所以我也能履行我的公民义务。是的,没错。这只是在互联网上四处回馈。太好了。现在,我最后一个想问你的问题是,你过去 X 年来一直有幸专注于科技行业
现在开始创业,我可以想象你已经看到自己被拉向一百万个不同的方向,无论是招聘还是文书工作,还是外出公开演讲等等等等。
所有这些时间都会分散对实际构建的注意力。当你继续前进时,你是如何考虑这个问题的?因为在某些时候,你知道,项目和云,我可以想象它的来龙去脉,你的印记和你的氛围让它。
成为今天的样子。是的。即使你无法在每一部分都留下你的指纹,你如何考虑继续下去?是的,这是一个非常好的问题,而且很难,因为这确实有很多额外的工作要做,而我真的很喜欢编码。那是我真正喜欢做的事情。但这就像,你知道,我必须做这些其他的事情,这样我才能得到那个产品,我才能使用它,所以……
你知道,我可以让团队处理所有事情,我只需要忍住并做我必须做的其他事情,但我也有幸依靠那些非常聪明的人,他们在我很多事情上都给了我很多帮助,并且也了解项目进展如何,找到这样的人很难,很难,你知道,
找到合适的人,但一旦你开始,就像,能够越来越依赖某些人,那就太棒了。这也是一种很棒的感觉。例如,CLI,新的 CLI,FastAPI CLI,从几个版本开始,就有了新的
Patrick 创建的终端 UI。它是一套新的 CLI UI 组件,你可以用它来构建 CLI。它是开源的,所有的一切。这一切都是他做的。就像我们为云拥有的 CLI 一样,这只是他做的很多工作,我可以快速检查并查看,“是的,这一切都说得通。”他非常清楚。所以我可以说,“是的,这一切看起来都不错。”
与,是的,就像签署批准一样。这一切看起来都不错。没有什么好东西。你知道,有时就像,“为什么这样?为什么那样?”好的,这个,那个。标准很糟糕,所以我们需要遵循标准。就像,“好的,是的,那么让我们再做一次吧。”完美。UI 也一样。你知道,很多工作都是由团队成员 Alejandro 完成的,我现在可以说,“
这是一堆调整,我看到,这有很多 React 代码和 TypeScript,以及调整 Tailwind 类等等,这里和那里。就像,“是的,说得通,看起来不错,截图看起来不错,但是,到目前为止,我可以说,“是的,我相信这段代码。它很好,批准它,而不必,你知道,获取拉取请求并逐位检查所有代码,只需查看它即可。”
例如,Sophie 也一样。她一直在帮助开源项目,Typr 和 FastAPI,主要是在 Typr 上。这是主要焦点。但我可以看到,每当她发表评论并进行审查时,它通常都会解释问题是什么,所有参考资料,所有尝试过的事情。她已经修复了测试和文档等等,我可以说,“说得通,批准它。”所以这真的很有帮助。很难达到这一点,
而且,你知道,这必须是循序渐进的。我不能突然说,“每个人都合并你想要的任何东西。”因为,你知道,FastAPI 和我的开源项目的重点是我对质量非常挑剔,所有东西都必须经过我才能完成这些事情。但是能够越来越依赖团队,这太棒了。这是一种很棒的感觉。能够看到,“哦,我们正在一起构建整个东西。”太棒了。是的,感觉你……
正在学习放开缰绳,更多地信任团队,并复制你自己。我喜欢你说这是一种很棒的感觉,因为然后你可以专注于其他事情。如果你知道你有团队在那里,并且你相信团队会保持与你相同的质量标准,那么……
最后我想提的一点是,我认为人们现在可以注册 FastAPI Cloud 了,对吧?是的。所以人们可以加入候补名单。网址是 fastapicloud.com。我希望我们很快就会开始让人们参与测试版。是的,我认为这将是一件很棒的事情,人们可以去尝试。并且继续使用开源项目,因为现在……
它们背后有更多力量。所以是的,我会说你很安全,但你知道,我会有偏见。经典,伙计。