[ { "speaker": "面试官", "text": "所以从2010年到2020年,你经历了很多增长。" }, { "speaker": "面试官", "text": "Shopify历史上有哪些伟大的里程碑?" }, { "speaker": "西蒙", "text": "其中一个有趣的例子是我们遇到了一个问题,每小时大约30秒,主MySQL集群或写入者会停滞不前。" }, { "speaker": "西蒙", "text": "我们无法找出原因。" }, { "speaker": "西蒙", "text": "我们无休止地调试,就是想不出发生了什么。" }, { "speaker": "西蒙", "text": "有人发现当这个问题发生时,这些机器上正在运行lsof。" }, { "speaker": "西蒙", "text": "我问,\"为什么会有这个lsof在运行?\"" }, { "speaker": "西蒙", "text": "有人回答说,他们正在追踪内核,找出,\"这就是导致内核软锁定的原因。\"" }, { "speaker": "西蒙", "text": "lsof来自哪里?\"" }, { "speaker": "西蒙", "text": "原来Percona工具中的一些Perl脚本用于管理MySQL,作为PHP的依赖项。" }, { "speaker": "西蒙", "text": "PHP作为一个依赖项有一些标准的cron作业,每小时会运行一次lsof来找出哪些文件正在打开,然后移除不再由PHP进程主动打开的会话。" }, { "speaker": "西蒙", "text": "这个作业每小时在所有MySQL实例上运行。" }, { "speaker": "面试官", "text": "Shopify在哪个规模级别上运行了一些以前无人问津的伟大系统?" }, { "speaker": "西蒙", "text": "我认为Facebook可能在MySQL的使用方面达到了前所未有的高度,但在2010年代,许多公司都在通过MySQL集群扩展。" }, { "speaker": "西蒙", "text": "GitHub也处于类似的情况。" }, { "speaker": "西蒙", "text": "我们只是花费大量时间在MySQL上的所有层进行扩展。" }, { "speaker": "西蒙", "text": "其中一个大问题是,无论是Ruby、Python还是其他语言编写的SaaS应用,在每台机器上运行的进程数量太多,每个进程的QPS可能只有几十个,如果幸运的话,可能是几百个。" }, { "speaker": "西蒙", "text": "所有这些进程都需要单独连接到MySQL或Postgres。" }, { "speaker": "西蒙", "text": "相比之下,Postgres在默认情况下处理这种情况更差。" }, { "speaker": "西蒙", "text": "我们有30,000至40,000个连接打开。" }, { "speaker": "西蒙", "text": "所以你必须花很多时间通过所有这些连接进行epolling,找出哪些连接可以在任何给定的时间点操作。" }, { "speaker": "西蒙", "text": "我们遇到了Memcached、Redis和MySQL的问题。" }, { "speaker": "西蒙", "text": "现在有很多开源的代理在这些系统前面,但在当时并没有,所以我们必须想出很多技巧来减少连接数量。" }, { "speaker": "面试官", "text": "基础设施团队是如何构建的,以处理一次又一次的事件?随着你规模的增长,是什么人聚集在一起使这一切成为可能?" }, { "speaker": "西蒙", "text": "当我于2013年加入时,仍然是一种非常传统的结构,即纯运营团队。" }, { "speaker": "西蒙", "text": "那些非常擅长操作Linux系统并使用SSH连接到所有系统的人员。" }, { "speaker": "西蒙", "text": "我们遇到的事件不仅仅是系统崩溃。" }, { "speaker": "西蒙", "text": "很多事件都是由于大规模闪购,驱动了Shopify巨大的流量。" }, { "speaker": "面试官", "text": "最糟糕的闪购是什么?" }, { "speaker": "西蒙", "text": "我可能没有经历过系统崩溃最严重的一次,但记得Kylie Jenner的闪购特别具有挑战性。" }, { "speaker": "西蒙", "text": "她甚至在试用账户上也吸引了大量流量,就像只是出现在那里销售商品一样。" }, { "speaker": "面试官", "text": "正常的闪购是什么样的?" }, { "speaker": "面试官", "text": "当闪购发生时,系统会发生什么?" }, { "speaker": "西蒙", "text": "闪购通常是有人拥有大量追随者,并且在2010年代我们看到了这种情况。" }, { "speaker": "面试官", "text": "他们发布了一个新产品。" }, { "speaker": "面试官", "text": "然后你就会知道,成千上万或数十万人同时尝试购买同一SKU。" }, { "speaker": "西蒙", "text": "这导致了MySQL上的大量库存锁定竞争。" }, { "speaker": "西蒙", "text": "这就是导致了很多停机事件的原因。" }, { "speaker": "西蒙", "text": "所以我们必须做很多事情来确保库存预留和一切都能正常工作,因为通常有成千上万的人在争夺可能只有10,000个SKU。" }, { "speaker": "西蒙", "text": "基本上就是这些事件,对吧?" }, { "speaker": "西蒙", "text": "然后他们会推动销售,并且会持续这样做,就像Kanye会在Shopify上发布新球鞋并驱动大量流量一样。" }, { "speaker": "西蒙", "text": "就像,\"哇,你要让开发者编写Chef来配置基础设施吗?\"" }, { "speaker": "西蒙", "text": "嗯,这就是我们当时在考虑的。" }, { "speaker": "西蒙", "text": "所以那些团队合并了,我们最终称之为生产工程团队。" }, { "speaker": "西蒙", "text": "我认为Facebook在这方面做得很好。" }, { "speaker": "西蒙", "text": "然后它就开始在不同的团队中分化开来。" }, { "speaker": "访谈者", "text": "所以这实际上很有趣。" }, { "speaker": "访谈者", "text": "我了解到的其中一件事是,其实不仅仅是2010年有大量公司正在规模化发展。" }, { "speaker": "访谈者", "text": "就像早期Stripe、早期GitHub、早期Shopify等等,有很多不同的公司,并且它们之间相互合作。" }, { "speaker": "访谈者", "text": "团队如何在组织间协作构建工具?像有哪些伟大的工具是从基础设施战争中产生的呢?" }, { "speaker": "访谈者", "text": "现在有哪些开源库被人们广泛使用,它们有2010年代基础设施战的故事吗?" }, { "speaker": "西蒙", "text": "我刚刚和我们可能都认识的Sam Lambert谈过,他运营着Planet Scale。" }, { "speaker": "西蒙", "text": "我们在谈论这个,在2010年代,这些教训,而且现在仍然如此,并没有被写下来。" }, { "speaker": "西蒙", "text": "它们在电话会议上分享。" }, { "speaker": "西蒙", "text": "就像你和我在Cursor早期的那些电话会议一样。" }, { "speaker": "西蒙", "text": "就像是,\"你是怎么做的?\"" }, { "speaker": "西蒙", "text": "等等。" }, { "speaker": "西蒙", "text": "而且大部分智慧其实无法通过模型训练获得,因为这些知识大多存在于人们的脑海中。" }, { "speaker": "西蒙", "text": "在2010年代,公司之间存在一点协作智能。" }, { "speaker": "访谈者", "text": "能给我介绍一下你交谈过的人吗?" }, { "speaker": "西蒙", "text": "所以我们谈到了Zendesk。" }, { "speaker": "西蒙", "text": "我们也在规模化Ruby和MySQL。" }, { "speaker": "西蒙", "text": "Intercom也使用了我们构建的缓存库,以及Rails和MySQL。" }, { "speaker": "西蒙", "text": "当然有GitHub。" }, { "speaker": "西蒙", "text": "GitHub构建了一些开源库,比如名为Ghost的东西,它使用MySQL bin日志来运行模式迁移。" }, { "speaker": "西蒙", "text": "SoundCloud构建了名为LHMS的东西,这是一种用于在MySQL中使用触发器进行模式迁移的方法。" }, { "speaker": "西蒙", "text": "在Shopify我们写了一个叫Toxiproxy的项目。" }, { "speaker": "西蒙", "text": "你听说过这个项目吗?" }, { "speaker": "访谈者", "text": "是的。" }, { "speaker": "西蒙", "text": "我开始做这个项目,因为所有不同的服务都开始失败,我们需要一个代理,我们可以在其中保证如果关闭了所有这些不同服务,事情不会失败。" }, { "speaker": "西蒙", "text": "例如,我们有一个管理会话和购物车的数据库,我们需要确保如果该数据库失败,Shopify仍然可以运行,因此我们可以对其进行测试,并且我认为这些公司都使用过这个项目。" }, { "speaker": "西蒙", "text": "我和Sam以及在GitHub和Shopify的人们一起打电话讨论,\"哦,你如何用Ruby和MySQL进行扩展?这个代理是否足够好?关于连接你做了什么?\"" }, { "speaker": "西蒙", "text": "我们会一起发送补丁文件来让Redis更好地扩展,并且有很多这种集体智慧的分享,很多这些Ruby on Rails MySQL商店在2010年代。" }, { "speaker": "访谈者", "text": "Logrus的故事是什么?Logrus是你最受欢迎的库吗?" }, { "speaker": "西蒙", "text": "是的。" }, { "speaker": "西蒙", "text": "Logrus是一个Go库,我创建它是因为我在很多事件中对自己6周前没有更故意地思考我希望在特定时间点从系统中看到的信息感到非常生气。" }, { "speaker": "西蒙", "text": "所以我想要一个API来强迫我坐下来并思考我需要的详细信息。" }, { "speaker": "西蒙", "text": "所以Logrus API就像logrus.withfields,然后你需要输入它们。" }, { "speaker": "西蒙", "text": "现在这就是Logrus设计得很好的唯一事情。它进行了太多分配,并且我没有花很多时间积极维护它,但它很受欢迎。" }, { "speaker": "西蒙", "text": "是的,它很受欢迎。" }, { "speaker": "访谈者", "text": "当一个库开始流行时是什么样子?" }, { "speaker": "西蒙", "text": "我认为它有25000颗星,并且我一直在找到人们告诉我,\"我在使用Logrus。\"" }, { "speaker": "西蒙", "text": "我很喜欢它。" }, { "speaker": "西蒙", "text": "所以这就是人们对结构化日志记录的理解,这在OpenTelemetry等之前并不流行。" }, { "speaker": "西蒙", "text": "我认为这正是人们的理解方式。" }, { "speaker": "访谈者", "text": "所以Logrus故事中一个非常有趣的部分是,你想要有意识地编写东西,在真正需要时要非常小心和仔细思考。" }, { "speaker": "访谈者", "text": "还有其他伟大的工程原则吗?像西蒙的工程原则是什么?" }, { "speaker": "访谈者", "text": "写在agent.md中的西蒙工程原则是......" }, { "speaker": "西蒙", "text": "我认为软件随着时间的推移,必须老化得当。" }, { "speaker": "西蒙", "text": "随着时间的推移,软件会受到时间、模式变化、语言变化、规模和许多人共同工作的压力。" }, { "speaker": "西蒙", "text": "我始终回到的一件事,也是Turbo Buffer的主要灵感来源,就是尽可能地简化它。" }, { "speaker": "西蒙", "text": "我在Shopify工作了近十年,现在很少有人能在同一个代码库和公司工作这么长时间。" }, { "speaker": "西蒙", "text": "这教会我软件老化的知识,因为我看到很多人花很长时间编写RFC并进行大项目,但这并不是预测软件老化良好的指标。" }, { "speaker": "西蒙", "text": "有时在基础设施团队中,我们只是用唾液和泡泡糖把东西粘在一起,就像我的老板常说的那样,它会以惊人的速度老化。" }, { "speaker": "西蒙", "text": "比如那点唾液和泡泡糖会在五年后完美地保持水分。" }, { "speaker": "西蒙", "text": "我认为最大的教训就是让你保持让简单性给你惊喜,并且复杂性必须是值得的。这就是基本原理。" }, { "speaker": "西蒙", "text": "很多东西都遵循这个原则。" }, { "speaker": "西蒙", "text": "我花了很多时间思考如果将规模扩大10倍或100倍,不同的事情会如何失败。" }, { "speaker": "西蒙", "text": "比如如果你进行任何基础设施更改,它必须能够扩展100倍。否则就没有理由这样做。" }, { "speaker": "西蒙", "text": "你只是在玩音乐椅游戏。" }, { "speaker": "西蒙", "text": "但是让软件老化良好并让简单性开始并且复杂性是值得的这一点非常重要,这是设计Turbo Buffer的基础。" }, { "speaker": "西蒙", "text": "另一件事是在一个软件中作为最后救援警报器上值机,世界上有真实人在失去数百万美元每分钟的停机时间,这是一种巨大的责任。" }, { "speaker": "西蒙", "text": "我们可能只有六到八个人在那个警报器上,如果你被叫醒,你知道你需要把网站带回来。" }, { "speaker": "西蒙", "text": "我认为这教会了我以更好的或更差的方式编写软件的方法,对吧?" }, { "speaker": "西蒙", "text": "因此,例如对于Turbo Buffer来说,就是说有哪些软件是我愿意为此值机的呢?" }, { "speaker": "西蒙", "text": "它必须极其简单并且非常容易调试。" }, { "speaker": "西蒙", "text": "回到Logrus,对吧?" }, { "speaker": "西蒙", "text": "如何使这尽可能容易调试,因为不可能每行代码我写的都是在凌晨3点有人需要值机的负债。" }, { "speaker": "访谈者", "text": "嗯,这非常有趣。" }, { "speaker": "访谈者", "text": "以某种方式构建问题的方式是,你知道,作为所有模型,你正在制定一个宪法,让模型遵循这个宪法,因为它们不仅试图通过一组测试集来变得更好和更好,而且我们还希望它们编写高质量的代码。" }, { "speaker": "访谈者", "text": "就像人类有一个宪法,非常简单,不那么复杂,但是它是非常通用的。" }, { "speaker": "访谈者", "text": "我们应该使用什么样的软件工程宪法,让所有模型都遵循这个宪法,以便生成的质量良好的代码能够经受时间考验。" }, { "speaker": "访谈者", "text": "很多人通常担心模型产生的垃圾。" }, { "speaker": "访谈者", "text": "我们希望训练它们不要产生垃圾。" }, { "speaker": "访谈者", "text": "什么宪法可以防止他们产生垃圾?" }, { "speaker": "西蒙", "text": "当我与模型讨论设计软件时,感觉就像他们在像一个读了太多Hacker News的急切大学生一样设计模型。" }, { "speaker": "西蒙", "text": "我会问你如何用RL来编码这样的原则,即简单性胜过一切,因为这是一组权衡。" }, { "speaker": "西蒙", "text": "比如在Turbo Puffer中,我们只使用对象存储。" }, { "speaker": "西蒙", "text": "没有其他状态。" }, { "speaker": "西蒙", "text": "就像,如果你想要低延迟的权利,那么你必须去别处,因为我不愿意接受这种权衡。我没有办法让模型在处理这些类型的压力时设计出非常简单并将老化得很好的系统。" }, { "speaker": "西蒙", "text": "但是你怎么用RL来做到这一点?" }, { "speaker": "访谈者", "text": "我认为可以提出各种想法,对吧?" }, { "speaker": "访谈者", "text": "就像默认情况下尝试尽可能简单地编写东西。" }, { "speaker": "访谈者", "text": "当你在两个正确解决方案之间进行判断时,更倾向于选择那个简单的方案。" }, { "speaker": "访谈者", "text": "你知道,另一个你可以编码的点是确保它很短。" }, { "speaker": "访谈者", "text": "嗯。" }, { "speaker": "访谈者", "text": "如果你强迫模型产生较短的东西,除了代码高尔夫方面之外,实际上较短的东西通常更简单。" }, { "speaker": "访谈者", "text": "不要写100行的代码,你可以用10行来写。" }, { "speaker": "西蒙", "text": "但我不认为总是关于代码行数,对吧?" }, { "speaker": "西蒙", "text": "就像有时像Turbo Puffer这样的东西可能会接受其所有权利进入Kafka之类的系统。" }, { "speaker": "西蒙", "text": "但现在你正在操作整个其他系统。" }, { "speaker": "西蒙", "text": "这可能更少代码行,但系统复杂性要高得多。" }, { "speaker": "西蒙", "text": "你给模型宪法吗?" }, { "speaker": "访谈者", "text": "我们确实写下我们认为伟大的代码的东西。" }, { "speaker": "访谈者", "text": "这很重要,因为如果不写这样的东西,模型会写出各种不可思议的、无法置信的内容。" }, { "speaker": "访谈者", "text": "是的。" }, { "speaker": "西蒙", "text": "我认为还应该思考所有优雅的失败模式,对吧?" }, { "speaker": "西蒙", "text": "而且软件老化时,保持系统中我关心的一些不变量也很重要,对吧?" }, { "speaker": "西蒙", "text": "我们俩都做过竞赛编程,对吧?" }, { "speaker": "西蒙", "text": "你总是在思考系统在任何情况下必须遵守的不变量是什么,否则你知道它会在某个点失败。" }, { "speaker": "访谈者", "text": "嗯,你写了一篇著名的博客。" }, { "speaker": "访谈者", "text": "稍微有点出名的博客。" }, { "speaker": "访谈者", "text": "那么,你开始写博客的故事是怎样的?" }, { "speaker": "访谈者", "text": "在几年前读到它时,这对我很有启发性。你知道,这个博客基本上通过费米估算来解决看似复杂工程问题的方法,并且实际上可以得到系统在非常规情况下的性能估计,即通常很难预估的情况。" }, { "speaker": "西蒙", "text": "我完全不知道你看过那篇文章。" }, { "speaker": "访谈者", "text": "是的。" }, { "speaker": "西蒙", "text": "你在我们认识之前读过这篇文章吗?" }, { "speaker": "访谈者", "text": "嗯哼。" }, { "speaker": "访谈者", "text": "你所说的是一种纸上的数学计算吗?" }, { "speaker": "访谈者", "text": "阿维特,是的。" }, { "speaker": "访谈者", "text": "阿维特介绍我读的。" }, { "speaker": "西蒙", "text": "纸上的数学计算源于我在Shopify的角色,我是首席工程师,作为首席工程师,你需要审查很多设计。" }, { "speaker": "西蒙", "text": "比如我想构建这个产品,并以这种方式使用数据库。" }, { "speaker": "西蒙", "text": "我经常遇到有人来找我提供基准测试,并说这就是他们预期数据库的性能。" }, { "speaker": "西蒙", "text": "然后他们会基于这些基准做出决定。" }, { "speaker": "西蒙", "text": "我对基准测试完全不信任。" }, { "speaker": "西蒙", "text": "特别是当你试图进行技术论证时,因为基准测试只是一瞬间的事情,并不会告诉我系统的基本属性。" }, { "speaker": "西蒙", "text": "所以我认为在这些审查中我一直在强调,好吧,这可能是基准测试的结果,但系统的根本属性是,在尝试执行搜索查询时,你可以做一些数学计算来估算需要移动多少千兆字节的数据来服务查询。" }, { "speaker": "西蒙", "text": "你看到DRAM,为了服务这个查询,我需要在内存中移动大约一个GB的内存。" }, { "speaker": "西蒙", "text": "DRAM每秒可以处理10到100GB,所以这应该在110ms之间。" }, { "speaker": "西蒙", "text": "你会得到基准测试,并说,\"嗯,它需要5秒,所以我们不能使用这个数据库。\"" }, { "speaker": "西蒙", "text": "对我来说这是一个不可接受的解释,因为我的第一原则理解与系统实际表现之间的差距太大了。" }, { "speaker": "西蒙", "text": "除非有人能填补这个差距,否则你无法得出结论。" }, { "speaker": "西蒙", "text": "这个差距要么是我的愚蠢,比如数学是错的,或者这个系统没有表现出应有的性能。" }, { "speaker": "西蒙", "text": "但至少我们中有一个是错误的。除非有人能填补这个差距,否则你的论点不具有说服力。" }, { "speaker": "西蒙", "text": "基准测试只能告诉你与理论最低值的距离。" }, { "speaker": "西蒙", "text": "所以我开始写博客来解释这个问题,并给自己一个节奏,比如\"你正在尝试进行连接。\"" }, { "speaker": "西蒙", "text": "这可能会花费多长时间?\"然后做一堆数学计算,运行实际测试,看看两者之间的差异,然后试图解决这个差距。" }, { "speaker": "访谈者", "text": "你最喜欢你在写的一系列博客文章中的哪一篇?" }, { "speaker": "西蒙", "text": "我真的很喜欢关于TCP窗口的那一篇。" }, { "speaker": "西蒙", "text": "你读过那篇文章吗?" }, { "speaker": "访谈者", "text": "是的。" }, { "speaker": "访谈者", "text": "这篇文章对每一个扩展系统都是一种侵蚀。" }, { "speaker": "西蒙", "text": "是的。" }, { "speaker": "西蒙", "text": "它确实如此,并且在某个时候,这篇博客文章对于赢得Turbo Encabulator的一个非常重要的交易变得非常重要。" }, { "speaker": "西蒙", "text": "所以这篇博客文章基本上是我在Shopify遇到的一个问题,有人问我为什么在澳大利亚加载页面需要3秒的时间,对吧?" }, { "speaker": "西蒙", "text": "你从澳大利亚到美国东部。" }, { "speaker": "西蒙", "text": "我猜测往返时间大概是250毫秒,对吧?" }, { "speaker": "西蒙", "text": "就像太平洋上有一条很好的海底电缆,然后在跨大陆运行60毫秒。" }, { "speaker": "西蒙", "text": "大约在250到200毫秒之间,对吧?" }, { "speaker": "西蒙", "text": "但是页面加载需要3秒钟在一个原始的Shopify商店上。" }, { "speaker": "西蒙", "text": "你只是启动它,我知道Ruby和其他东西需要10毫秒的时间。" }, { "speaker": "西蒙", "text": "这没有道理。" }, { "speaker": "西蒙", "text": "然后我访问了网站并刷新页面,但这不是缓存击中。" }, { "speaker": "西蒙", "text": "我会跳过缓存,然后只需要260毫秒。" }, { "speaker": "西蒙", "text": "我就像,“哦,这里发生了什么?”,理解。" }, { "speaker": "西蒙", "text": "有3秒钟与260毫秒的差距。" }, { "speaker": "西蒙", "text": "这之间有什么区别吗?" }, { "speaker": "西蒙", "text": "这是我的愚蠢还是没有在这里工作?\"" }, { "speaker": "西蒙", "text": "所以我深入研究了它,并在Wireshark中花费了很多时间。" }, { "speaker": "西蒙", "text": "我就像,“为什么要在太平洋上如此频繁地来回发送呢?”" }, { "speaker": "西蒙", "text": "然后我发现,在TCP中,当你建立连接时,所以你知道,悉尼拨打美国东部,美国东部只会第一次发送10个包,因为他们试图协商两个之间的链接大小,并且它有一个非常保守的默认值。" }, { "speaker": "西蒙", "text": "所以,会发送10个包。" }, { "speaker": "西蒙", "text": "每个包大约有1500字节。" }, { "speaker": "西蒙", "text": "因此一个网站如果比16千字节小,那么在大多数机器上加载得更快。" }, { "speaker": "西蒙", "text": "我只是从Wireshark中推断出这一点。" }, { "speaker": "西蒙", "text": "所以这个网站有几百个千字节。" }, { "speaker": "西蒙", "text": "因此,它加载15千字节,然后TCP说,“哦,好吧。”" }, { "speaker": "西蒙", "text": "我猜链接足够大了。让我们尝试下一次的30千字节。" }, { "speaker": "西蒙", "text": "所以现在你传输到45个,并且会不断翻倍。" }, { "speaker": "西蒙", "text": "但现在你在来回协商链接大小时做了很多次往返。" }, { "speaker": "西蒙", "text": "因此,我意识到,“好吧,如果你调整Linux内核的TCP设置,在两端发送100个包的第一个往返,这将快得多。”" }, { "speaker": "西蒙", "text": "但是如果有非常非常差的上行链路,你可能会丢失很多包丢失,但在一般情况下这是一个更好的设置。" }, { "speaker": "西蒙", "text": "然后这个方法在Turbo Puffer等某些点上也适用,是的。" }, { "speaker": "访谈者", "text": "这带我们到了我最喜欢的另一个问题。" }, { "speaker": "访谈者", "text": "所以有一个数据库问题的两部分。" }, { "speaker": "访谈者", "text": "所以,第一,历史上有哪些伟大的数据库?" }, { "speaker": "访谈者", "text": "你知道你发现非常鼓舞人心的系统吗?" }, { "speaker": "访谈者", "text": "你从它们那里学到了什么?" }, { "speaker": "访谈者", "text": "让我们通过数据库进化的理解来走一遍。" }, { "speaker": "西蒙", "text": "所以,我认为有几种方式来看待这个问题。" }, { "speaker": "西蒙", "text": "以我的观点来说,大约每15年,构建新的数据库的原料就在空气中。" }, { "speaker": "西蒙", "text": "很多数据库出现,对吧?" }, { "speaker": "西蒙", "text": "就像我知道有成千上万的生产中的数据库。" }, { "speaker": "西蒙", "text": "但从大的角度来看,这需要一个新的平台,对吧?" }, { "speaker": "西蒙", "text": "例如Oracle和MySQL和Postgres在90年代被构建。" }, { "speaker": "西蒙", "text": "我们有网络,并且有很多像SaaS公司这样的公司正在建立并产生大量数据进入数据库。" }, { "speaker": "西蒙", "text": "这是第一个大规模生产数据库的浪潮。" }, { "speaker": "西蒙", "text": "80年代也有一些,但那是我出生之前很久的事情了,所以我对那里的理解并不好,但显然那里有数据库,通常在主框架上等等。" }, { "speaker": "西蒙", "text": "但是90年代是第一个像网站这样的工作负载开始存储数据和应用程序开始存储数据的浪潮。" }, { "speaker": "西蒙", "text": "然后你有了Snowflake和Databricks等公司被构建,围绕这个新的工作负载。" }, { "speaker": "西蒙", "text": "我认为大型数据库公司基本上是地球上每个国家都有数据在那个数据库中直接或间接使用的产品。" }, { "speaker": "西蒙", "text": "你知道,一个传统的纺织制造商在德国的巴伐利亚州,不会直接购买Snowflake,但几乎肯定他们正在使用一些使用Snowflake或Databricks的产品,对吧?" }, { "speaker": "西蒙", "text": "或者说数十次。" }, { "speaker": "西蒙", "text": "所以,他们的数据可能在那个数据库中重复数十次。" }, { "speaker": "西蒙", "text": "嗯,这就是最大的数据库公司是如何构建的,以及最大的数据库公司是这样构建的。" }, { "speaker": "西蒙", "text": "我认为现在有一个时刻,或者说在过去的一个时刻,那就是AI工作负载正试图与数据连接起来,但这是我认为的一种观点。" }, { "speaker": "西蒙", "text": "在灵感型数据库方面,我首先想到的是SQLite。" }, { "speaker": "西蒙", "text": "我喜欢SQLite的一点是他们在做每件事时都秉持着一种强硬的极简主义哲学。" }, { "speaker": "西蒙", "text": "最好的例子就是,我的软件代理MD宪法试图尽可能多地在每一个代码路径上施加压力,而不是拥有单独的路径。" }, { "speaker": "西蒙", "text": "在SQLite中,他们有一个非常典型的例子。" }, { "speaker": "西蒙", "text": "通常,在执行联接时,你可能会做一些类似于嵌套循环或哈希联接的操作。" }, { "speaker": "西蒙", "text": "你会将这些实现为特定的路径。" }, { "speaker": "西蒙", "text": "SQLite基本上会构建一个在内存中的自定义B树来执行联接,这与你实际在磁盘上建立索引时构建的B树索引代码路径相同。" }, { "speaker": "西蒙", "text": "所以他们在单个代码路径上施加更多的压力,更多优化导致了更多的查询计划。" }, { "speaker": "西蒙", "text": "我认为这是非常棒的。" }, { "speaker": "西蒙", "text": "当然,另一个我钦佩的数据库就是Google Cloud Storage和S3等大型对象存储,它们拥有非常有限的API,但这些API具有几乎无限的延迟直方图、极高可扩展性和可靠性。" }, { "speaker": "西蒙", "text": "我喜欢系统中拥有的非常少的基础原理,并且你知道它们可以工作,并且知道即使在长时间使用的情况下,它们也会遵守自己的直方图边界,无论是可靠性的方面还是可扩展性方面。" }, { "speaker": "西蒙", "text": "所以我确实从这一点上获得了很多灵感。" }, { "speaker": "西蒙", "text": "对我来说,还有一点怀旧感,就像在过去的FTP和PHP my admin以及MySQL盒子中进行操作。" }, { "speaker": "西蒙", "text": "我真的很喜欢这一点。" }, { "speaker": "西蒙", "text": "并且我希望将这种感觉带入我们正在构建的数据库中。" }, { "speaker": "面试官", "text": "接下来是关于数据库问题的第二部分。" }, { "speaker": "面试官", "text": "这是我不太理解的一个行业现象,这听起来可能很天真。" }, { "speaker": "面试官", "text": "大多数系统在成熟后都有一个特性,即有一个赢家,并且这个赢家会一直保持胜利。" }, { "speaker": "面试官", "text": "以操作系统为例,有很多竞争。" }, { "speaker": "面试官", "text": "然后Linux赢得了一些方面。" }, { "speaker": "面试官", "text": "或者对于消费者来说,Mac OS获胜并一直保持不变。" }, { "speaker": "面试官", "text": "虚拟化也是如此,有一个赢家并且这个胜利者会持续稳定。" }, { "speaker": "面试官", "text": "几乎所有系统都有这种特性,无论是操作系统还是你使用的东西的API,在现实世界中,就像云一样,基本上是AWS和两个副本,这就是标准,永远如此。" }, { "speaker": "面试官", "text": "没有像每隔15年就有一个新的挑战者来颠覆一个标准这样的情况。" }, { "speaker": "面试官", "text": "但是数据库是一个例外,在过去半个世纪里,每十年就会有新公司出现,他们希望成为下一个被广泛使用的主要数据库,并且这种持续的创新在一段时间内是存在的。" }, { "speaker": "面试官", "text": "你知道,基础设施公司一旦开始并获胜后就不会稳定下来,每隔五年就有一个新的类别中的挑战者。" }, { "speaker": "西蒙", "text": "我认为这个模式的原因在于,我们需要新的工作负载来区分新软件的基础设施。" }, { "speaker": "西蒙", "text": "我们对操作系统的期望并没有改变到需要重新编写的地步,对吗?" }, { "speaker": "西蒙", "text": "我们现在期望从操作系统中获得非常好的虚拟化和隔离原则。" }, { "speaker": "西蒙", "text": "Solaris比Linux更早做到这一点,对吧?" }, { "speaker": "西蒙", "text": "就像Linux直到几年前才真正擅长这个领域一样,对吧?" }, { "speaker": "西蒙", "text": "他们在2010年代一直在努力。" }, { "speaker": "西蒙", "text": "但并没有足够强大到颠覆整个系统。" }, { "speaker": "西蒙", "text": "我认为在数据库方面,我们确实看到了每十年甚至每十五年出现新的工作负载,但是真正重要的新工作负载数量并不像人们想象的那么多。" }, { "speaker": "西蒙", "text": "现在有很多小众的工作负载,对吧?" }, { "speaker": "西蒙", "text": "例如图数据库就是一个相当小众的工作负载。" }, { "speaker": "西蒙", "text": "这是一个相对小众的工作负载,但最大的数据库公司是从开始时处理一些看似小众工作负载构建起来的,并且从那里扩展。" }, { "speaker": "西蒙", "text": "我认为MongoDB是一个很好的例子,对吧?" }, { "speaker": "西蒙", "text": "他们最初专注于非常web-like的操作,可以迅速上手,然后他们就扩展了,他们做时间序列,他们做图,他们做所有的事情。" }, { "speaker": "西蒙", "text": "我认为这有两个特性:工作负载,但工作负载本身是不够的。" }, { "speaker": "面试官", "text": "为什么现有的公司不能变得非常擅长这个工作负载呢?" }, { "speaker": "面试官", "text": "所以Oracle可以一直变得更好,并且永远不会有新的数据库公司吗?" }, { "speaker": "面试官", "text": "看起来他们一次又一次地被颠覆。" }, { "speaker": "西蒙", "text": "这引出了我的第二个观点。" }, { "speaker": "西蒙", "text": "所以,你需要新的工作负载,因为每个地球上的公司都需要在这个新数据库中有一些数据,否则它就不会变得那么大。" }, { "speaker": "西蒙", "text": "你需要的第二件事是需要一个全新的、根本上不同的存储架构,这个架构对于那个工作负载来说是有优势的,而现有供应商无法做到这一点。" }, { "speaker": "西蒙", "text": "举个例子吧?" }, { "speaker": "西蒙", "text": "比如,像Snowflake和Databricks这样的公司都是直接在对象存储上使用普通的HDD,或者你知道的,直接在对象存储上,而Oracle无法做到这一点。" }, { "speaker": "西蒙", "text": "它没有计算机和存储分离。" }, { "speaker": "西蒙", "text": "因此,即使理论上可以作为设计的一个扩展来执行,也无法进行这些大规模OLAP工作负载。" }, { "speaker": "西蒙", "text": "到那时,Oracle有什么?" }, { "speaker": "西蒙", "text": "30年历史的假设紧密耦合、计算机和存储不分离。" }, { "speaker": "西蒙", "text": "现在呢?" }, { "speaker": "西蒙", "text": "我们可以构建利用NVMe SSDs的数据库,Snowflake和Databricks没有这样做,因为直到大约8年前,云中还没有NVMe SSDs。" }, { "speaker": "西蒙", "text": "而且NVMe SSDs要求你必须以完全不同的方式构建数据库来充分利用它。" }, { "speaker": "西蒙", "text": "你需要大量的突出IOPs和非常少的往返次数。" }, { "speaker": "西蒙", "text": "这也是你在对象存储上实现超低延迟所需做的。" }, { "speaker": "西蒙", "text": "另外一件事是元数据。" }, { "speaker": "西蒙", "text": "第一代在对象存储上构建的数据库将不得不将所有元数据放在一个单独的数据库中,这会带来其他问题,比如运行别人的云和操作像运行区域一样。" }, { "speaker": "西蒙", "text": "直到大约一年半前,你才能构建可以在对象存储中同时拥有元数据的数据库。" }, { "speaker": "西蒙", "text": "所以,当有这两种条件时,在90年代,就像你知道的,电脑、互联网和15年前是OLAP与分析,而今天则是将大量尤其是非结构化数据连接到AI。这就是新的工作负载。你需要这个。" }, { "speaker": "西蒙", "text": "第二件事是你需要一个全新的存储架构不能复制,对吧?" }, { "speaker": "西蒙", "text": "在Turbo Buffer之前,搜索引擎无法复制它,因为它们将计算机和存储紧密耦合在一起,而Oracle也无法轻松复制Snowflake和Databricks所做的分离计算机和存储的事情。" }, { "speaker": "访谈者", "text": "西蒙成为数据库粉丝的故事是什么?" }, { "speaker": "访谈者", "text": "你显然非常热衷于数据库。" }, { "speaker": "西蒙", "text": "我喜欢数据库。" }, { "speaker": "西蒙", "text": "我认为竞争编程有很多与数据库相关的主题。" }, { "speaker": "西蒙", "text": "所以,你会开始思考渐进时间复杂度和事物的执行方式。" }, { "speaker": "西蒙", "text": "当我加入Shopify时,我只是被那些从事数据库工作的人所吸引。" }, { "speaker": "西蒙", "text": "当网站出现问题时,通常是数据库的问题。" }, { "speaker": "西蒙", "text": "所以,我们总是要确保它不会在今晚的闪电销售中崩溃,在一年后闪电销售规模扩大10倍时也不会崩溃。" }, { "speaker": "西蒙", "text": "因此,它是扩展的基本瓶颈。" }, { "speaker": "西蒙", "text": "这吸引了我。" }, { "speaker": "西蒙", "text": "就像为什么这些事情这么难以扩展?" }, { "speaker": "西蒙", "text": "所以我们必须不断工作、工作和工作。" }, { "speaker": "西蒙", "text": "在某个点上,我的模型开始从思考执行SQL的事务转向思考磁盘上的位和字节布局。" }, { "speaker": "西蒙", "text": "它们有如此多引人入胜的权衡,对吧?" }, { "speaker": "西蒙", "text": "就像我们刚刚讨论过的存储架构对于不同的查询工作负载是不同的。" }, { "speaker": "西蒙", "text": "数据库中有很多权衡。" }, { "speaker": "西蒙", "text": "我喜欢思考这些,比如如果我们这样做,它在这一点上会更好,但在另一点上不会那么好。" }, { "speaker": "西蒙", "text": "尤其是在搜索领域,将计算机科学和工程的许多部分应用于特定领域。" }, { "speaker": "西蒙", "text": "就像有无尽的有趣问题一样。" }, { "speaker": "访谈者", "text": "我记得我们第一次见面时,Cursor正在遇到一些Postgres瓶颈。" }, { "speaker": "访谈者", "text": "最令人着迷的事情之一是你解释了,好吧,这是Postgres是如何架构的。" }, { "speaker": "访谈者", "text": "我可以构建一个简单的心理模型,了解在Postgres中发生的事情与MySQL中的事情以这种方式发生的方式,并且在当时,尽管我读过关于Postgres并理解了一些架构,但我没有将它们映射到所有的小块上,如何相互作用。" }, { "speaker": "访谈者", "text": "你是怎么学习的?" }, { "speaker": "访谈者", "text": "一个人是如何了解像Postgres这样的数据库的怪异细节的呢?比如,这里是如何设计的所有小部分和组件以及查询参数可以找到的东西?" }, { "speaker": "西蒙", "text": "简短的答案是我不行。" }, { "speaker": "西蒙", "text": "我并不认为我很聪明,所以我花了很多时间试图将它简化到我可以理解并告诉其他人的方式。" }, { "speaker": "西蒙", "text": "我花了大量时间在小笔记本上尝试确切地了解块是如何移动的?" }, { "speaker": "西蒙", "text": "所以我想花了大约10年的时间,才对MySQL的工作原理有了非常深入的理解。" }, { "speaker": "西蒙", "text": "然后当我离开Shopify时,我正在帮助我的朋友的公司扩展业务。" }, { "speaker": "西蒙", "text": "我开始遇到PostgreSQL。" }, { "speaker": "西蒙", "text": "我想,这很酷,我对PostgreSQL一无所知。" }, { "speaker": "西蒙", "text": "所以有一天我就坐下来,花了8个小时阅读了整个手册。" }, { "speaker": "西蒙", "text": "并且总是比较和对比MySQL和PostgreSQL之间的相似点和不同点。" }, { "speaker": "西蒙", "text": "因此,这更容易是因为我已经有了一个可以承载知识的框架。" }, { "speaker": "西蒙", "text": "所以这种妥协就变得很明显了,对吧?" }, { "speaker": "西蒙", "text": "在PostgreSQL中,索引的工作方式与MySQL中的工作方式非常不同,对吧?" }, { "speaker": "西蒙", "text": "在MySQL中,数据在磁盘上的布局由主索引决定。" }, { "speaker": "西蒙", "text": "所以在Shopify我们利用这一点,将所有商店的数据一起集中存储。" }, { "speaker": "西蒙", "text": "这在PostgreSQL中非常复杂。" }, { "speaker": "西蒙", "text": "PostgreSQL处理权限的方式与其他方式不同,这需要用户进行大量的调整,而MySQL不需要。" }, { "speaker": "西蒙", "text": "这就是我们见面时遇到的问题。" }, { "speaker": "访谈者", "text": "你是如何与AI一起编码的?" }, { "speaker": "访谈者", "text": "或者更一般地说,在AI之外,代理和模型是否帮助你完成编码工作?" }, { "speaker": "西蒙", "text": "当然可以。" }, { "speaker": "西蒙", "text": "就编码而言,我通常在网站上打开一个游标窗口。" }, { "speaker": "西蒙", "text": "我所做的大多是文档或小的更改。" }, { "speaker": "西蒙", "text": "我只是让游标运行。" }, { "speaker": "西蒙", "text": "我使用同步代理,然后根据需要选择模型。" }, { "speaker": "西蒙", "text": "如果我只需要回答有关代码库的问题,我会使用作曲家模型,因为它非常快并进行大量搜索。" }, { "speaker": "西蒙", "text": "然后,根据我正在执行的任务的不同,我使用不同的模型。" }, { "speaker": "西蒙", "text": "但通常我管理着游标内的几个代理。" }, { "speaker": "西蒙", "text": "而且,尤其是由于它使我很容易审查代码。" }, { "speaker": "西蒙", "text": "我认为我的反传统观点是,在今年结束之前,我们仍然会审核数据库中每行代码的输入,因为这似乎对于数据库来说仍然是至关重要的。" }, { "speaker": "西蒙", "text": "我们有几只Turbo Puffer,它们的工作就是将代码库的整个上下文放在他们的湿载神经网络中,并且工作得很好,因为他们有自己的宣言和MD中的代理嵌入在湿载中,并做出良好的局部最优决策,而代理帮助他们。" }, { "speaker": "访谈者", "text": "我过去几个月一直很兴奋的一件事是让云代理变得越来越好。" }, { "speaker": "访谈者", "text": "那么,Turbo Puffer的50%代码由云代理编写需要什么条件?" }, { "speaker": "访谈者", "text": "我想你认为在所有各种模糊条件下验证事情是非常重要的。" }, { "speaker": "访谈者", "text": "你知道,在模型应该运行12、24或48小时的情况下,50%的Turbo Puffer代码完全由云代理编写需要什么条件?" }, { "speaker": "西蒙", "text": "我认为我们应该让代理一直运行,试图在我们或客户之前打破产品,并使用云代理。" }, { "speaker": "西蒙", "text": "我确信有些工程师已经在这样做。" }, { "speaker": "西蒙", "text": "一般来说,在像核心Rust和数据库这样的事情上使用模型时,它仍然不会做出全球最优决策。" }, { "speaker": "西蒙", "text": "所以我觉得在仪表板或网站上的时候,它可以进行如此宽松的讨论并做得非常好。" }, { "speaker": "西蒙", "text": "但在数据库中,有太多其他因素需要考虑,比如API会如何老化,对吧?" }, { "speaker": "西蒙", "text": "数据将如何布局?" }, { "speaker": "西蒙", "text": "并且有所有这些战争教训,对吧?" }, { "speaker": "西蒙", "text": "这并不是模型没有学到如何操作这一点。" }, { "speaker": "西蒙", "text": "那么必须是什么?" }, { "speaker": "西蒙", "text": "我认为模型只需要变得更好。" }, { "speaker": "西蒙", "text": "我不认为我有更多的智慧。" }, { "speaker": "西蒙", "text": "我认为我希望模型能更多地讨论某样东西会如何老化,存储方式以及它在存储架构上做出的不可逆决策,显然是不可逆的决策。" }, { "speaker": "访谈者", "text": "所以有两个或三个Turbo Buffer问题。" }, { "speaker": "访谈者", "text": "第一个是,Turbo Buffer要达到Google规模需要什么?" }, { "speaker": "访谈者", "text": "要索引整个互联网吗?" }, { "speaker": "西蒙", "text": "可以。" }, { "speaker": "西蒙", "text": "全网进行索引并提供Google能提供的QPS。" }, { "speaker": "西蒙", "text": "我喜欢的是实际上可以被Google使用。" }, { "speaker": "西蒙", "text": "所以我的意思是,我不太了解Google的具体情况,但我确信他们有上千个服务来实现这个目标,但我们有一些客户已经将整个网络索引到Turbo Buffer中,并且它工作得很好,它可以处理成千上万的QPS。" }, { "speaker": "西蒙", "text": "现在,我相信Google拥有的不仅仅是我们在数据集中采购的百万亿或更多文档,可能进入万亿级别,但这当然是可以做到的。" }, { "speaker": "西蒙", "text": "没有理由不继续扩展,我们已经使用P99为200毫秒、P50为40毫秒的速度处理了百万亿。" }, { "speaker": "西蒙", "text": "现在,要达到像Google那样的相关性,你可能需要做更多的工作,并且这将是好几轮迭代周期,但你可以使用Turbo Buffer架构用不多的服务器索引整个网络。" }, { "speaker": "面试官", "text": "能否不依赖S3来构建?" }, { "speaker": "面试官", "text": "是否S3是过去十年工程壮举之一,提供超强一致性?" }, { "speaker": "西蒙", "text": "我认为是的。" }, { "speaker": "西蒙", "text": "回到最初的问题上,为什么每隔10年就会有新的数据库公司出现呢?我们需要NVMe SSDs,这在云中直到2010年代末才可用。" }, { "speaker": "西蒙", "text": "我们还需要S3的一致性,这直到2020年12月才实现,这是令人难以置信的晚。" }, { "speaker": "西蒙", "text": "然后我们需要比较和交换。" }, { "speaker": "面试官", "text": "为什么S3很难保持强一致性?" }, { "speaker": "西蒙", "text": "我不知道。" }, { "speaker": "面试官", "text": "[笑声]" }, { "speaker": "西蒙", "text": "我知道在Google Cloud Storage中,我认为可能是Spanner之类的东西在前面。" }, { "speaker": "西蒙", "text": "所以这对我来说更容易理解。" }, { "speaker": "西蒙", "text": "S3的元数据层几乎没有细节。" }, { "speaker": "西蒙", "text": "这个元数据层显然很难操作。" }, { "speaker": "西蒙", "text": "我知道S3的API表面很小,但我知道他们投入大量资源进行形式验证和所有这些不同的事情,可能是因为他们有小错误,人们依赖它们,并且必须确保即使他们改变最细微的事情,也不会破坏其他许多人。" }, { "speaker": "西蒙", "text": "所以我不知道是什么让它如此困难。" }, { "speaker": "西蒙", "text": "我认为最难的是系统在没有这一功能的情况下存在了15年甚至20年。" }, { "speaker": "西蒙", "text": "从我见过的系统来看,这是系统的一个基本假设,并且你会在接下来的15年里为这个假设进行工程设计。" }, { "speaker": "西蒙", "text": "是的,这可能花了他们大约5年时间来做。" }, { "speaker": "西蒙", "text": "我猜测Google Cloud Storage因为它们由Spanner等提供支持,并且可能会在早期就具有强一致性,如果不是从第一天开始的话。" }, { "speaker": "西蒙", "text": "但我也知道他们认为S3的一个巨大错误是从一开始就不是一致的。" }, { "speaker": "面试官", "text": "你对S3还有什么喜欢的地方吗?" }, { "speaker": "面试官", "text": "当我提到S3时,我指的是对象存储。" }, { "speaker": "西蒙", "text": "是的。" }, { "speaker": "西蒙", "text": "我觉得只是简单性,就像在非常有限的事情上设置严格的延迟边界。" }, { "speaker": "西蒙", "text": "我认为这是一个非常可预测的系统。" }, { "speaker": "西蒙", "text": "它自动分片并且是无限的。" }, { "speaker": "西蒙", "text": "没有S3,Turbo Buffer就不存在了,对吧?" }, { "speaker": "西蒙", "text": "如果这是15年前的情况,我们会有人全职处理硬盘,并且尝试与尽可能多的硬盘达成交易,我们可能会遇到你可能在GPU上遇到的问题,但只是用HDD。" }, { "speaker": "西蒙", "text": "我很高兴没有这个问题。" }, { "speaker": "西蒙", "text": "我不会Turbo Buffer,可能也不会开始这家公司,因为我不想为需要处理硬盘并每周飞往阿什本添加更多硬盘的产品提供支持。" }, { "speaker": "面试官", "text": "最近的一个奇怪的事情是,面试人越来越难了。" }, { "speaker": "面试官", "text": "其中一个伟大的面试技巧在过去十年中是,而不是在黑板上面试他们,而是给他们一个非常复杂的代码库,让他们在一个复杂代码库中尝试做事情。" }, { "speaker": "面试官", "text": "因为自然地,在复杂代码库中做事需要巨大的RAM。" }, { "speaker": "面试官", "text": "你需要同时保持很多东西在脑海中并仍然能够产生净新内容,而不是只是陷入困境或被要求每天交付,如果你需要在2天内交付所需的东西,你可以关闭其他一切,专注于事情。" }, { "speaker": "面试官", "text": "不幸的是,你知道语言模型现在已经变得如此好,你无法再使用这个面试技巧了。" }, { "speaker": "面试官", "text": "你认为我们如何回到第一原理来面试伟大的工程师?" }, { "speaker": "面试官", "text": "因为显然白板面试的缺点是你在日常工作中并不做的事情。" }, { "speaker": "西蒙", "text": "这是我花了很多时间思考的问题。" }, { "speaker": "西蒙", "text": "我有一份名为P99特质的文档。" }, { "speaker": "西蒙", "text": "我不知道是否分享过这个早期草案,因为我们多年来一直在讨论面试。" }, { "speaker": "西蒙", "text": "这份文档列出了P99的特质。" }, { "speaker": "西蒙", "text": "这是一个很长的列表,我不能分享所有的人,那会太容易了,但我认为P99是你可以描述为快速的人。" }, { "speaker": "西蒙", "text": "它以非常不同的方式在很多人中出现,对吧?" }, { "speaker": "西蒙", "text": "你和我可以很快地交谈,所以这可以被解释为快速,但有些人是因为他们行动得非常有条理,他们的代码没有错误,并且只是继续前进,就像一步一步向前走,从不两步向后退。" }, { "speaker": "西蒙", "text": "它以不同的方式出现,但我从未遇到过一个P99我无法在某种程度上描述为快速的人。" }, { "speaker": "西蒙", "text": "另一个P99的特征是他们已经将某些东西置于自己的控制之下。" }, { "speaker": "西蒙", "text": "无论是软件还是他们的轨迹,或者是类似的东西,他们只是让机器或某种方式做你想做的事,在硅谷你称之为代理,对吧?" }, { "speaker": "西蒙", "text": "这也是代理或与机器本身的熟练程度,以获得它去做你需要做的事情。" }, { "speaker": "西蒙", "text": "我认为P99尽其所能地围绕自己周围的人,他们可能在生命中的某些时刻发现了一个更高的层次,并无法帮助自己但要尝试达到那个层次,对吧?" }, { "speaker": "西蒙", "text": "你就像我自己一样,是一个新世界的移民,对吧?" }, { "speaker": "西蒙", "text": "所以你可能在某个时候从本地社区的P99中退出,并寻找其他地方。" }, { "speaker": "西蒙", "text": "我认为我们进行的一次面试是我们称之为生活故事的面试,我们的招聘人员珍姆斯花了一个半小时与人们交谈,从他们第一次对某样东西感到兴奋的时候开始。" }, { "speaker": "西蒙", "text": "我想P99很早就对此事非常兴奋,并继续寻找下一个九级(P99到P999),对吧?" }, { "speaker": "西蒙", "text": "对你来说,我肯定是去了麻省理工学院,你发现了另一个层次。" }, { "speaker": "西蒙", "text": "在IMO时,你发现了一个更高的层次。" }, { "speaker": "西蒙", "text": "我想这是我们寻找的另一个特征。" }, { "speaker": "西蒙", "text": "所以我有一份这样的列表,当我在面试某人后,我会看他们。当我与某人交谈后,我有一个特定的面试程序,在那里我可以找到这些特质。" }, { "speaker": "面试官", "text": "你做什么?" }, { "speaker": "面试官", "text": "你现在寻找什么?" }, { "speaker": "面试官", "text": "实际上,我一直都在思考这个问题。" }, { "speaker": "面试官", "text": "我得说,我没有一个很好的答案。" }, { "speaker": "面试官", "text": "我认为我们应该回到逻辑谜题。" }, { "speaker": "面试官", "text": "我在这些奇怪的概率问题中发现了一些东西。" }, { "speaker": "面试官", "text": "概率问题需要清晰的思维。" }, { "speaker": "面试官", "text": "在压力时期,拥有清晰的思维比人们意识到的更重要。" }, { "speaker": "面试官", "text": "当然,如果可以轻松解决概率问题,那么你对概率非常熟悉。" }, { "speaker": "面试官", "text": "但也能保持冷静,并说:\"我们一起来理清这个问题。\"" }, { "speaker": "面试官", "text": "所以对于大多数人来说,这实际上是一个加分项。" }, { "speaker": "面试官", "text": "我们知道,挑选概率问题的原因是选择那些没有概率经验的人。" }, { "speaker": "面试官", "text": "不一定非得是概率问题。" }, { "speaker": "面试官", "text": "它可以是任何类似的问题,你听说过各种困难的场景。" }, { "speaker": "面试官", "text": "这些场景越来越难,随着时间的推移。" }, { "speaker": "面试官", "text": "这真的很有趣,你知道,如果很容易生产代码,那么可能真正重要的就是能否清晰地思考系统,并且能够清楚地表达你想要从系统中得到什么以及不希望从系统中得到什么?" }, { "speaker": "面试官", "text": "你需要关注的不变量是什么?" }, { "speaker": "面试官", "text": "所以,如果你必须在哲学家和知道Next.js之类的技能的人之间进行选择,你可能会选择工作马达程序员,因为他们已经精炼了自己的技能。" }, { "speaker": "面试官", "text": "但实际上随着时间的推移,这种技能变得不那么有价值了。" }, { "speaker": "面试官", "text": "所以你可能想要的是那些非常有思想的人。" }, { "speaker": "面试官", "text": "我认为你提到的一个被严重低估的事情就是总是向前一步而不是两步的人,这在世界上是非常低的评价。" }, { "speaker": "面试官", "text": "我认为这些人只是非常非常地精确,并且你会始终信任他们在公司遇到最困难的问题。" }, { "speaker": "面试官", "text": "这种技能虽然很难进行面试,但却是非常重要。" }, { "speaker": "西蒙", "text": "我认为我们尝试找出人们是否有清晰思维的最佳方式之一是询问他们如何设计系统,然后看看他们在复杂性上如何逐步提升并处理权衡,对吧?" }, { "speaker": "西蒙", "text": "这种清晰的思考能力,你将从最简单的事情开始,并以某种规模或任何其他方式攻击它。我们之前讨论过服务复杂性的概念,对吧?" }, { "speaker": "西蒙", "text": "系统工程师往往倾向于设计一个没有太多权衡但非常完美的系统,但这不是一个一步向前,一步向后的过程。" }, { "speaker": "西蒙", "text": "这是在第一步中采取10步前进的情况,并且你总是会失败,因为你做出了错误的假设。" }, { "speaker": "西蒙", "text": "我认为P99非常优雅地处理了这个复杂性的阶梯。" }, { "speaker": "面试官", "text": "数据库的下一个前沿是什么?" }, { "speaker": "面试官", "text": "15年后,下一个前沿是什么?" }, { "speaker": "面试官", "text": "你认为我们有最后一个数据库吗?" }, { "speaker": "西蒙", "text": "肯定不是。" }, { "speaker": "西蒙", "text": "会有硬件进步,对吧?" }, { "speaker": "西蒙", "text": "在未来大约10到15年的时间里。" }, { "speaker": "访谈者", "text": "GPU数据库吗?" }, { "speaker": "西蒙", "text": "人们可能已经尝试过,但我认为它还没有准备好,对吧?" }, { "speaker": "西蒙", "text": "但就像我理解的那样,GPU会变得更加通用,可以执行更多指令和移动更多的带宽。" }, { "speaker": "西蒙", "text": "所以这可能是下一个平台,对吧?" }, { "speaker": "西蒙", "text": "再次需要10年吗?" }, { "speaker": "西蒙", "text": "我不知道。" }, { "speaker": "西蒙", "text": "GPU正在快速进化。" }, { "speaker": "西蒙", "text": "嗯,这就是我的一次尝试。" }, { "speaker": "西蒙", "text": "我认为这种机器在CPU上发生过,在磁盘和现在对对象存储发生了同样的情况,都是基于猜测的。" }, { "speaker": "西蒙", "text": "基本上同时处理大量未完成请求并在几次往返中。" }, { "speaker": "西蒙", "text": "这一直是个好赌注,这也是GPU工作的方式,对吧?" }, { "speaker": "西蒙", "text": "你试图给他们很多事情让他们一起处理,得到结果然后根据那个结果做其他的事情。" }, { "speaker": "西蒙", "text": "所以让所有东西都适合猜测和预测非常好。" }, { "speaker": "访谈者", "text": "如果我们只是拥有最后一个数据库,我们不需要更多的数据库在未来。" }, { "speaker": "访谈者", "text": "我实际上认为有一个有争议的观点是,我认为我们需要Turbo Buffer加上OLAP和Postgres的结合或达到这些规模的水平。" }, { "speaker": "访谈者", "text": "可能不是Postgres,但类似于Vitess加上MemSQL。" }, { "speaker": "访谈者", "text": "我们认为我们已经得到了所有需要的东西。" }, { "speaker": "访谈者", "text": "我认为我们不需要另一个了。" }, { "speaker": "西蒙", "text": "我不会说永远不会有。" }, { "speaker": "西蒙", "text": "我希望Turbo Buffer成为最后一个数据库。" }, { "speaker": "西蒙", "text": "嗯,结束吧。" }, { "speaker": "西蒙", "text": "是的。" }, { "speaker": "访谈者", "text": "非常感谢你来到办公室。" }, { "speaker": "访谈者", "text": "我觉得随着时间的推移,无论是构建伟大系统还是建立高性能工程团队,我都从你那里学到了很多。" }, { "speaker": "访谈者", "text": "也谢谢你作为Cursor的一个很好的合作伙伴。" }, { "speaker": "访谈者", "text": "你知道,在Cursor中有很多点,如果没有Simon的帮助,生活会非常艰难。" }, { "speaker": "访谈者", "text": "是的。" }, { "speaker": "访谈者", "text": "非常感谢你下来这里。" }, { "speaker": "西蒙", "text": "我真的很感激。" }, { "speaker": "西蒙", "text": "我知道,我们有很多关于基础设施的电话交谈,你现在有一个足够好的团队,不再需要联系我了。" }, { "speaker": "西蒙", "text": "但我确实有点想念它。" }, { "speaker": "西蒙", "text": "对你来说说这很重要,因为你建立了一个伟大的公司。" }, { "speaker": "西蒙", "text": "能够成为其中很小的一部分,真的意义重大。" }, { "speaker": "访谈者", "text": "非常感谢你。" } ]