Transcription
你如何看待当今的 Python 生态系统?Rust 生态系统和 Go 生态系统。>> Python 生态系统是大量的基础设施,大量的配置机器。Rust,我认为如果你处理二进制数据,如果你构建一个负载均衡器,你构建一个数据库。Go 特别是,我认为它只是一个构建 Web 服务的好语言,而且实际上只用于 Web 服务。>> 谈到 AI 代理编码,你如何使用它们?我让 Claude 为我构建了完美的控制系统,以获取我的日志并可视化生产环境中发生的情况,而我以前从未这样做过,因为这根本行不通。>> 为什么你对这些 AI 编码工具变得如此积极?>> 最重要的一点是 >> Armen Roner 是一位广为人知的开源贡献者,也是 Flask(一个流行的 Python Web 框架)的创建者。他还是 Sentry 的第一位工程师,现在正在创建自己的初创公司,并大量使用 AI 工具。今天,我们与 Armen 一起探讨了为什么 AI 编码工具使编程语言的选择变得更加重要而不是不重要。Python 与 Go 与 Rust 与 TypeScript 的比较,以及哪些语言适合初创公司及其原因。Armen 在 Sentry 工作十年后学到的关于错误处理的知识,以及为什么像 TypeScript 这样的类型安全语言似乎并不能减少错误,还有更多内容。如果您有兴趣更深入地了解编程语言的优缺点,AI 如何改变初创公司的构建方式,或者想了解更多关于错误处理的信息,那么本期节目就是为您准备的。本期播客节目由 Statsig 提供,这是一个用于功能开关、分析、实验等的统一平台。请查看节目笔记,了解更多关于他们和其他本季赞助商的信息。让我们开始吧。那么,Armen,呃,欢迎来到播客。>> 你好,很高兴来到这里。>> 那么,我们来谈谈编程语言。你你多年来一直非常深入地研究 Python,超过十年了,而且你现在也接触了其他语言,但在 Python 中,你如何看待 Python 本身的变化,你能给我们详细介绍一下 2 到 3 的迁移之争吗?我想如果你和任何使用 Python 的人一起工作过,你都听过他们的抱怨。我当时在 Uber 工作时发生了这件事,有很多来回,有很多延迟。>> 在任何语言中看到 Python 2 到 Python 3 之间发生的事情似乎都很少见,这似乎是破坏性的变化,有很多分歧,有些人只是想让一些非常有能力且优秀的工程师留在 2 而不是 3。那么发生了什么?>> 是的。所以,有趣的事实是,今年是 Python 纪录片上映的一年,Grudo 邀请我参加,这非常好,而且那部纪录片有一个关于 Python 2-3 迁移的片段,这基本上让我回到了过去,只是为了记住这一切。>> 因为在很多方面,我的记忆也变得非常模糊和模糊,我也记得某些部分比其他部分更多。所以,如果你真的想深入了解 Python,Python 3,那么可以看看 Python 纪录片,它有一个完整的片段。但我想回顾一下,我认为你现在做不到。这只是在那个时间点,它并没有杀死 Python。但我认为它本可以,对吧?如果人们没有投入大量精力来实际完成这次迁移,那对这门语言来说可能会非常麻烦,因为如果你回到 Python 3 和 31 和 32,原始库的设计和决策中有太多的失误。所以,对于一个可能没有最初参与过这件事的人来说,你必须考虑到 Python 最初只是从 C 语言的基本字符串开始的。最终,它获得了 Unicode 字符串作为一种选择。所以,你在字符串前面加上一个 U,它就变成了 Unicode 字符串。Python 3 的存在动机是更加严格地处理字符串并将所有内容迁移到 Unicode。但没有预料到的是,这次迁移在实践中比设计时要微妙一些,对吧?对于 Unicode 在现实世界中的样子,有一个非常简单的看法。而且它看起来不像那样。我实际上认为 Python 混乱的 Python 重迁移也对其他生态系统产生了非常积极的影响,例如 YUbuntu,因为当时有两个事情同时发生。Python 3 在处理非 Unicode 数据方面变得稍微宽松了一些,但 Python 使得处理 Unicode 非常困难的许多情况实际上都是各种配置问题。所以,我记得并非所有 Linux 都到处都有 UTF8。你连接到大学网络仍然很常见,却找不到 UTF8 Linux,这在文件系统上会产生各种非常有趣的事情。>> 这些事情有点融合在一起。所以 Unicode 的故事变得更好了。>> 但你有数百万行的 Python 2 代码无法在 Python 3 上运行。最初的假设是你只需要迁移一次,然后你就可以使用 Python 3 了,而且一切都很好。但事实并非如此。多年来,我们不得不同时维护 Python 2 和 Python 3 的库。我记得在佛罗伦萨的 Python 语言峰会上,我提议将 Unicode 字符串的 U 前缀带回来,这样你就可以选择性地使用它们,因为我注意到如果它们在那里,我就可以编写同时支持 Python 2 和 Python 3 的代码。我仍然记得有巨大的阻力,为什么你甚至想同时维护两个和三个的库?你应该只迁移到 Python 3,然后让每个人都迁移。但这根本行不通。所以,真正让 Python 3 迁移最终成功的是很多人付出的巨大努力,以及对你必须支持两种版本这一现实的更现实的看法,这需要 10 年甚至更长时间。>> 你必须以某种形式支持这两个版本。这就是它成功的原因。但我认为 Python 3 迁移也为未来的语言提供了非常重要的经验数据点,以便更好地处理这个问题。我记得 Rust 早在 Python 3 迁移时就特别指出,以证明它为什么需要像一个添加系统,或者我忘了它最初叫什么,但基本上是一个非常有针对性的选择新功能或选择退出所有功能,这样你就可以在同一个项目中有不同版本的代码库。>> 很好。谈到编程语言的差异,你提到 Python 曾经是你最喜欢的语言很长很长时间。后来你帮助在 Sentry 中引入了 Rust,部分原因也是为了提高性能。现在你也接触了 Go。你会如何比较这些语言?而且,当你想到一种语言时,你对这种语言的心理模型是什么?它适合做什么,不适合做什么?我会用它来做什么?我写了一堆博客文章,虽然不完全是关于语言的,但它们在某种程度上是我大脑分裂的体现,因为我体内有两个程序员。一个是我喜欢构建很酷的开源软件,希望成千上万的人使用它,并投入大量手工努力。这就像源代码编写的瑞士手表制作。而我非常关心语言。我非常关心 API 和一切。但是,当你建立一家公司,建立一个产品时,这一切都不重要了。代码是“一次编写,多次运行”,而不是“一次编写,多次针对你的代码运行”,对吧?>> 所以,Rust 之所以令人惊叹,我认为,对于制作非常酷的开源代码来说,它也使其成为初创公司次优的编程语言,因为它的摩擦力要大得多,对吧?它是一种更精确的语言。与 C++ 相比,这是一个巨大的进步,在很多方面,C++ 在 Sentry 中是处理二进制文件的替代方案,但对于初创公司来说,在快速迭代方面,它是一种能力差得多的语言。>> 你能举一些摩擦的例子吗?什么?>> 编译时间?>> 比如 Rust 编译得非常慢。谈到初创公司和规模化公司的工具选择,这是一个困扰大多数成长型团队的摩擦点。你在一个工具中运行功能标志,在另一个工具中运行分析,并在第三个工具中尝试调试用户行为。当你想知道一个功能是否真的提高了转化率,或者你发布的东西是否导致了错误时,你需要手动将数据从这些不同的仪表板中转移出来,然后希望用户细分能够匹配。大多数事情都会陷入这种境地。你将功能发布给 10% 的用户,然后等待一周,查看三个不同的工具,尝试关联数据,但你仍然不确定它是否有效。问题在于每个工具都有自己的用户识别和细分逻辑。这就是 Statsig 的用武之地。Statsig 是我们本季的呈现合作伙伴,他们通过构建一个统一的平台解决了工具集成问题。你不需要切换到独立的解决方案,而是可以获得功能标志、分析和会话回放,所有这些都使用相同的用户分配和事件跟踪。因此,你将一个功能发布给 10% 的用户,而其余 90% 的用户自动成为你的对照组,并具有相同的事件分类法。你可以立即看到组之间的转化率差异。深入了解治疗用户在你的漏斗中在哪里掉队。然后观看特定未转化用户的会话录制,以了解出了什么问题。另一种选择是运行 ETL 作业来同步你的功能开关服务和你的分析数据仓库之间的用户细分,希望时间戳能够对齐,然后手动链接可能具有不同用户识别逻辑的数据。这需要大量工作。Statsig 有一个慷慨的免费套餐供入门,团队的专业定价从每月 150 美元起。要了解更多信息并获得 30 天的企业试用,请访问 statsig.com/pragmatic。>> 这是一个巨大的因素。>> 你写的代码比 Python 多得多。你花了很多时间思考类型。我喜欢类型。我认为它们很棒。>> 但有些事情用类型表达起来非常困难。而且我甚至不需要在 Python 中考虑它,对吧?处理动态语言,我认为这里需要考虑的一点是,动态和静态语言多年来已经变得更加一致。我记得 C 语言中的动态关键字的出现是一件很棒的事情,因为它向人们展示了他们可以拥有一个静态编译的语言,例如具有可选的动态运行时类型,而 TypeScript 则将整个想法应用于 JavaScript。>> 所以,你可以在某种程度上拥有两个世界。>> 但 Rust 非常直接,只有静态类型,如果你的问题是动态类型问题,那么你基本上要创建自己的动态类型包装器。>> 还有,借用检查器虽然很棒,但也是一个巨大的问题,因为它不允许表达某些其他程序员期望存在的相邻借用。>> 所以你不能有一个从 C++ 借入自身的结构体,这就像“老天爷,为什么它会这样做?”嘿,这是我的问题,我想解决它,编译器说不,它说“不,你错了,它应该可以工作”。>> 所以在那里,你可以把自己逼到角落里,变得非常难以摆脱。>> 所以,从这个角度来看,有很多问题不是 Rust 形状的,有很多问题实际上是 Rust 形状的,但很多都不是。>> 所以,我目前在新公司使用 Go 的原因之一是它是一种非常务实的语言,如果你追求的是务实,那为什么不呢?而且你可以期望它会一直存在,它不是超级性感,而且,即使 Google 停止维护它,你也可以想象会有几十个人想让它保持活力。>> 即使是现代 Java 实际上也是一种很棒的语言,它有虚拟线程,这让我很高兴,我不用总是处理 Promise。>> 但我对于一家公司应该用什么来构建东西,有一个更务实的看法,因为重点不在于代码,而在于你正在构建的产品。>> 所以你现在正在创业?是几个人吗?是你自己吗?>> 目前是我和一位联合创始人,但我们刚开始招聘,而且,嗯,是我和一位联合创始人,一群 Claude 和一群 Codex,以及所有这些。所以,世界肯定已经改变了,因为有大量的实习生现在也编写代码,这也改变了我看待事物的方式。>> 所以,现在是你和你的联合创始人一起创业。你有一支 Claude 和 Codex 的军队,你期望随着团队的壮大而招聘,就像你已经确定了技术一样,你说了在这种情况下,很多都会是 Go,但编程语言需要给你什么?而且,例如,为什么 Python 非常灵活。好的,它有点慢,但你说它是一个不错的选择。是什么让你觉得,你会说,是的,Go 是 Python 和 Rust 之间的良好折衷点,等等。>> 是的。所以,现在我认为,如果你要建立任何公司,你最终都会接触到 Python,无论你是否愿意。你不可能建立一个没有 Python 代码的公司。你想用它来构建你的主要服务吗?可能不会。但如果你做任何与 ML 相关的事情,如果你做任何数据处理的事情,Python 都会在那里,而且你也可以用 Python 编写不错的代码,对吧?所以它会存在。>> 祝你好运,不要在公司里没有 JavaScript。如果你有 JavaScript,你就有 TypeScript。所以,这些语言都会在那里。>> 另一个问题是,你写的代码总量中有多少是用这些语言写的。>> 我实际上觉得我不想用这两种语言中的任何一种来构建后端服务。而且,甚至不是出于性能原因,而是出于生态系统,生态系统擅长什么。>> 在我目前的情况下,我公司的一个重要部分是解析电子邮件。>> 而且,嗯,这并不是 JavaScript 擅长的。>> 实际上,Python 在这方面相当不错,但我认为大规模来说,Python 是一个好选择吗?我看了看,我做出了决定,我不会。>> 从在 Sentry 中使用 Rust 的经验来看,我觉得我可以完全想象,大规模来说,Rust 会重新流行起来。但目前,我认为这不是正确的权衡。>> 所以,当你说到大规模时,这只是在考虑你将不得不处理海量数据,大量进程运行等等。>> 我们是否专门谈论语言的性能能力?>> 我认为这是关于公司规模的,而这并不一定是通过处理的数据量来衡量的。>> 如果你通过工作人数、问题复杂度或处理数据量来扩大公司规模,你必须做出权衡,有时这意味着引入一种新语言,无论是出于性能原因,还是因为你集成到某个特别强大的生态系统中,然后突然之间,这门语言就出现了。>> 为什么 Rust 会出现在 Sentry?>> 嗯,它不仅仅是因为我想写 Rust。>> 而且,现在我们遇到了性能问题。>> 我们该如何解决?>> 一方面,我想,嗯,我们也许可以写一个 Go 服务,但我不想维护另一个服务。>> 所以,Rust 是一个务实的嵌入 Python 的选择。>> 然后,后来我们进行本地符号处理时,Rust 的替代方案基本上是 C++。>> 根据我使用 C++ 的经验,我们最初在该项目中使用 C++。>> 我们遇到了很多崩溃,我不想维护它。>> 所以,那时没有选择使用 Go,因为没有 Go 生态系统。>> 所以,除非我从零开始构建一切,否则它不会起作用。>> 但 Rust 正在增长,而且 Rust 在编译器方面也遇到了同样的问题。>> 所以,Rust 生态系统对于调试文件来说真的很好。>> 而且,当时还有另一家公司也在从事这项工作,那就是 Mozilla。>> 所以,已经有两个共同的兴趣点。>> 而且,这是一个非常务实的决定,即使这门语言是 Rust。>> 然后,也许我们有点过分了,把 Rust 放在了它不是最理想选择的地方,比如摄取系统。>> 我认为,现在我可能不会再做这个决定了,但当时说“你知道吗,我们要花九个月时间去一个角落,然后把这一切都建好”将是不务实的。>> 因为以当时的团队规模来说,问题太大了。>> 所以,我们不得不重复使用一些东西。>> 所以,这就是我认为我的公司可能会在某个时候再次采用一种它最初拒绝的语言的原因之一,只是因为情况使它成为必要,而且它不一定意味着性能是原因。>> 它不一定是因为性能。>> 它也可以是生态系统的稳定性或其他任何东西。>> 谈到生态系统稳定性,你如何看待当今的 Python 生态系统、Rust 生态系统和 Go 生态系统?>> Python 生态系统是大量的基础设施,大量的配置机器。>> 所以,这就是我目前使用它的方式。我使用 Python 的 prumni 来配置基础设施。>> 它在机器学习领域根深蒂固。>> 所以,我有一个小数据管道在使用 Python。>> 它在提供服务、Web 服务方面仍然相当不错,对于 Python 擅长的一些事情。>> 我会用它来编写主要应用程序逻辑吗?也许吧,对吧?>> 因为,如果我正在做一个完全以 AI 为先的公司,而它所做的只是推理。>> 我只是在等待网络层。>> 所以,也许用 Python 组装一些东西很棒。>> 特别是如果你开始做一些需要按需执行代码的事情,也许那是一个不错的选择。>> 所以,我认为 Python 在这方面有很大的未来。>> 我只是不认为它是为服务选择的最自然的语言,如果你认为它将是高吞吐量的。>> 而且,我认为,现在,Go 对于许多工程师来说比 Python 更容易编写,因为 Python 的复杂性增加了,而 Go 的复杂性并没有增加多少。>> 所以,我发现它在复杂性方面也是一个更好的权衡。>> 所以,Rust,我认为,如果你处理二进制数据,如果你可能,如果你构建一个负载均衡器,你构建一个数据库,嗯,也许现在人们谈论数据库时会提到 sik 之类的东西,但如果你构建一个 Rust 形状的问题,我认为这很大程度上被定义为,无论出于何种原因,你分发一个单一的二进制文件。>> 你无法处理垃圾回收器,你想要非常可预测的性能。>> 你真的关心数据布局,尽管我敢说 Go 也很好,但 Rust 的好处是,如果你也从事需要并发并且你害怕内存管理错误和崩溃的事情,比如可能加载到其他高安全性环境(如浏览器)中的模块,这似乎是一个相当不错的选择。>> 再次处理 dwarf 文件,处理一般数据。>> 我喜欢 Rust,我认为它也是一个非常务实的语言,如果你扩展 Python。>> 所以,如果你已经有一个 Python 问题,现在你有一个性能问题,或者你有一个生态系统集成问题,而 Rust 恰好适合。>> 用 Rust 为 Python 编写扩展模块,这比其他任何东西都好,对吧?>> 这是个非常好的选择。>> 特别是 Go,我认为它只是一个构建 Web 服务的好语言,而且实际上只用于 Web 服务。>> 也许是一些命令行工具。>> Rust 无法被淘汰的另一个原因是 WebAssembly 实际上从未真正流行起来,但 WebAssembly 的用例在这一点上是无法摆脱的。>> 有太多东西你实际上必须带入浏览器,而 Rust 可以做到。>> 我尝试过用 Go。>> 因为垃圾回收器和一些在浏览器中运行 Go 的复杂性,体验不是很好。>> 所以,你不会那样做,但用 Rust 你可以,对吧?>> 所以,我认为你必须从“我在这里做什么?我有什么问题?”的角度来处理这个问题,然后你说“我希望一开始不超过三四种技术”。>> 然后最后,我想,我们没有谈论过的那个,那就是流行的 JavaScript TypeScript 生态系统。>> 嗯,在浏览器中你无法摆脱它。>> 在服务器端,我认为我对此很矛盾,因为我实际上认为它是一个相当不错的语言环境。>> 特别是,如果有人要制作 JavaScript 2,就像 Python 3 一样,并摆脱一些不好的东西。>> 我认为没有人应该这样做,因为我见过迁移。>> 但现在语言中有很多好东西。>> 也有一些非常老的愚蠢的东西。>> 我现在为什么不使用 TypeScript 构建后端服务?>> 实际上,是因为 npm 生态系统。>> 这毁了它。>> 我是一个低依赖性的人。>> 我想控制我的。>> 而且,我只是觉得我不可能在 JavaScript 生态系统中生产力地工作,而依赖项少于 500 个,这让我感到不安。>> 在浏览器中,我可以忍受,因为我别无选择。>> 但在服务器端,我真的必须这样做吗?>> 我必须处理所有这些恐惧和管理它吗?>> 所以,这比其他任何事情都更让我沮丧。>> 所以,也许,也许随着生态系统的成熟,这种情况会改变。>> 但这确实是我认为最大的原因。>> 而且,它在服务器端没有给我带来足够的好处,以至于我不会说“有一个想法,你有一个统一的代码库,而每次我试图让统一的代码库工作时,我都会意识到浏览器和服务器实际上足够不同,以至于很难真正拥有那个统一的代码库。”>> 所以,然后它只是明确的,做一些 OpenAPI 的东西,一些代码生成,它实际上感觉好多了。>> 是的。>> 我从开发者那里听到的关于 TypeScript 的最大论点是统一的代码库,你可以拥有 React 和 TypeScript,然后在后端使用 Node,或者 Express,或者其他什么,现在你拥有相同的语言,人们可以做出贡献,我认为这非常有说服力,尤其是在我们有了 AI 工具之前,因为那时你不需要学习一门新语言。>> 现在,这可能会改变。>> 我最近在一个我参加的聚会上的一次演讲中说过,我认为现在地板正在提高天花板,不是说人们对一切的期望都比以前高,而是因为期望更高,并且有更多的工具来支持它。>> 所以,代码生成现在比两三年前要好得多。>> 你甚至可以买到现成的 OpenAPI 到 SDK 生成器。>> 比如,我甚至不知道那些公司的名字。>> Stainless,例如,其中一个,它只是为所有 AI 云提供商生成所有 API。>> 是的,对于 SDK。>> 是的,它们是其中之一。>> 在 Sentry 做任何事情的巨大成本之一就是,你如何维护这些 SDK?>> 现在,嗯,我有一个 OpenAPI 的东西,不知何故,在 GitHub 上出现了一个 SDK。>> 如果代码生成如此之好,那么拥有统一的代码库对我来说真的那么重要吗?>> 突然之间,它就不那么重要了。>> 所以,我认为它肯定有价值,但你也必须想象,如果你拥有统一的代码库,那么边界就会意外地非常不明确。>> 特别是 RSC,我注意到很多时候,很难真正理解服务器上有什么,服务器上有什么。>> 所以,对我来说,拥有这个额外的边界几乎是一种特性。>> 谈到 AI 代理编码,你提到的一件非常有趣的事情是,你们创业公司现在有两个人,而且你们有很多像这样的 AI 实习生在跑,Claude、Codex,你们是如何使用它们的?你们看到了什么?而且,顺便说一句,你能分享一下你们用它们在做什么吗?>> 谈到 Armen 和他的联合创始人如何使用 AI 实习生大军,这表明软件工程在多大程度上改变了我们的工作,作为一名软件工程师不再是顺序地做一件事,而是我们可以与 AI 代理并行启动工作,这是软件行业长期以来最大的变化之一。>> 这种变化的一个主要例子来自我们的本季赞助商 Linear。他们的 Cursor 集成允许你将 Cursor 添加为工作区代理。这个代理与你和你的团队一起工作,进行代码更改并回答问题。>> 假设你在 Linear 中有一个问题,比如修复错误或小型功能请求。>> 你只需提及 Cursor 并要求它查看。>> 或者你可以简单地将 Cursor 代理分配给一个工单,然后跟踪它的进度。>> 这就委托了问题,Cursor 就开始工作了。>> Cursor 然后在后台运行,编写必要的代码,打开一个拉取请求,一旦你审查了更改,你就可以合并它。>> 它可能并不总是能一次性完成任务,但它相当不错。>> 主要原因是代理可以访问 Linear 项目计划、待办事项列表、问题描述、讨论中已有的上下文。>> 它非常有用。>> 你现在可以将错误修复、琐碎的工作或繁琐的任务委托给代理,然后在它完成时回来。>> Linear 感觉就像是零点。>> 你一定要试试。>> 前往 linear.app/pragmatic。>> 是的。>> 所以,我们认为电子邮件是一个非常有趣的领域。>> 所以,你可以想象一下,当你以某种形式处理电子邮件时,你会遇到什么样的问题。>> 而且,也许我们之所以进入电子邮件领域,是因为现在非常明显的一件事,至少在我的一生中,计算机的能力发生了最大的变化,那就是自然语言处理现在可以大规模地用于多种语言,而且成本合理。>> 这就是进入电子邮件领域的好原因,因为电子邮件就是关于自然语言的,而且过去有很多好的数据,但过去很难处理这些数据。>> 如果你读过我的博客,你就知道我对编程的 AI 的看法直到二月三月才变得非常消极,然后它慢慢地转变了,然后在五月我才说,哇,一切都将不再一样了。>> 我之所以如此看好这一点,一个很大的原因是,当你深入思考时,它实际上对团队来说并不奏效。>> 我认为也许有办法,而且我会在扩展这家公司时看到,它将如何大规模地运作。>> 但我认为它实际上会非常好,因为如果我回顾多年来我一直希望能够做但没有时间做的事情,我不得不明确决定不做的事情。>> 我有太多这样的例子了。>> 我记得我们当时正在重写 Sentry 的分组算法。>> 分组算法,那是什么?>> 就像确保两个非常相似的错误被分组到同一个组中。>> 分组。>> 是的,明白了。>> 但这就像,这是一个大规模的数据问题,但它也是一个非常具体的数据问题。>> 所以,我们花了三周时间来构建一个基本的可视化工具,只是为了弄清楚新算法是否比旧算法更好。>> 我确切地知道,我可以从 Claude 那里得到这个工具,只需要 30 分钟。>> 它大约有 5000 行代码,而且看起来更好,有漂亮的 UI 和一切。>> 所以,这些类型的项目有很多没有进展,因为你需要自己构建这个定制的工具来完成这个项目,比如迁移系统之类的。>> 这太多了。>> 所以,我认为我注意到的一个重大变化是,我现在有了更好的工具。>> 这使得工作更加轻松。>> 我有,我从 Terraform 迁移到了 Pulumi,用于其中一项服务,只是看看效果如何。>> 而且,我让 Claude 为我构建了完美的控制系统,以获取我的日志并可视化生产环境中发生的情况。>> 而且,我以前从未这样做过,因为这根本行不通。>> 另一个大问题是,它在主代码库上效果如何?>> 我的联合创始人不是技术联合创始人。>> 但这并没有阻止他使用 Claude 或 Codex。>> 而且,这实际上很棒,因为这意味着即使是那些在公司某个阶段可能希望做某事但实际上需要比平时更多的编码技能的人。>> 所以,有一个完整的代码库,我基本上不看,这实际上验证了我们正在开发的特性中的一个核心部分,而且这只是感觉,而且它有效。>> 它不漂亮,但没关系,因为它的重点是弄清楚,这是我们想要的体验吗?>> 而且,这很棒。>> 然后,问题是,我写的代码有多少是我觉得这将是我们所做事情的基础?>> 在这一点上,它是否是代理的?>> 而且,我向你保证,它超过 80%。>> 而且,有很多明确的代码不是这样写的,或者我们投入了很多精力。>> 但大多数现有的代码并不那么重要。>> 它是一堆 API 端点。>> 它是一堆 OpenAPI 规范。>> 它是一堆普通的代码。>> 它们应该看起来不错。>> 它们应该通过所有测试。>> 它们应该完全遵循他们想要的架构。>> 但如果你压缩它们,说里面实际包含的信息很少。>> 所以,用正确的方法,你实际上非常有生产力。>> 是什么让你如此消极,或者说,直到大约二月左右,你一直非常怀疑的事情,然后为什么你对这些 AI 编码工具或代理编码变得如此积极?>> 最重要的一点是,它实际上现在开始做我讨厌做但知道我必须做的工作。>> 这是一个例子,昨天我真的不得不弄清楚为什么我生产环境中的一个端点没有像预期的那样工作。>> 而且,这不是代码中的错误问题,而是 AWS 权限问题。>> 有一个我做错了三个事情的链条。>> 所有这些都导致它无法做它应该做的事情。>> 首先是 IAM 权限错误,然后是另一个系统上的白名单错误,然后最终是,我忘了是什么了。>> 我认为,但最终也是一些关于逻辑错误的事情,但重点是,这是一个错误,另一个错误,另一个错误,你无法同时看到它们。>> 不。>> 而且,我当时也很忙于做别的事情,我在想,我知道我需要调试这个。>> 但如果我现在这样做,至少需要两个小时。>> 但这没关系,因为 Claude 做了很多工作。>> 我仍然需要从日志中复制粘贴一些东西,但它知道很多,因为它拥有世界知识访问权限。>> 它可以将很多东西结合在一起。>> 而且,我可以在它修复和调试这个生产问题时,继续处理我正在做的事情。>> 这是一项重大的改进。>> 同样,我最讨厌的事情之一是创建重现案例。>> 但我知道,每次我得到一个好的重现案例时,我都会更享受它。>> 现在我可以说,Claude,为我创建一个重现案例,这就是它的样子,我们试着不去修复它,我当时在想,我们如何得到这个函数,可以不断地在循环中调用它,这就是我们在这里要弄清楚的。>> 所以,我无法从 Cursor 中获得这种体验,即使在之前的代理模式下,与五月、四月相比。>> 但这确实改变了我对它的看法。>> 然后,当我开始深入研究“好吧,现在我知道我可以做到这一点,我可以做到这一点,我可以做到这一点”时,我也变得非常有冒险精神,让它做更多的事情。>> 而且,现在我可以,而且我对它的发展方向有了新的认识,只是让它做我不想做的事情,但仍然控制我想做的事情。>> 这就是我最大的转变,就是认识到它能以某种方式做到这一点。>> 到目前为止,你看到了什么?>> 这些代理工具在软件工程方面改变了什么?>> 哪些东西没有改变?>> 特别是,你知道,你写代码已经大约 20 年了。>> 所以,系统架构和整体复杂性,以及你如何构建事物,使其在公司规模越来越大的情况下仍然可维护。>> 其中有很多经验。>> 而且,在任何时候,我都没有所有这些经验。>> 所以,我觉得这是我随着时间的推移学到更多东西的一件事,这给了我比我之前的自己更大的优势,而我之前的自己没有这些。>> 这将继续如此。>> 现在有一个论点,也许 Claude 就像这样的系统会帮助你,甚至可以围绕它们引导这些类型的系统。>> 如果你完全将你所做的一切委托给机器,那么不做这件事的人就会比你占优势,对吧?>> 因为,会有一些创新是这些东西还没有的,对吧?>> 所以,现在这些系统吐出的东西是我们对截至目前为止事物如何运作的最佳理解。>> 对。>> 所以,拥有一些在规模上还没有出现在这些语料库中的东西,这就是优势的来源。>> 如果你不完全将一切都委托给机器,它也能在公司中创造更好的文化,对吧?>> 就像,如果它只是一堆,就像,这是我希望现在招聘更多人的原因之一。>> 因为 Claude 不是人类,而且。>> 就像,一家运转良好的公司,以及有动力的员工,他们的能量是计算机无法替代的。>> 所以,我认为这是作为工程师会留下的重要部分,就是理解如何创建系统。>> 理解它产生的代码何时更正确,何时更错误。>> 所以,我不认为这有什么改变。>> 我觉得用 Claude 编程是一样的,即使我实际写的代码少了。>> 只是,我不知道,敲击键盘的物理行为不再是那样了。>> 那有什么不同呢?>> 它有什么变化?>> 我认为构建自定义工具的成本降低了。>> 我现在做出更好决策的能力得到了极大的提高。>> 部分原因是我,它搜索得很好。>> 它在互联网上搜索得很好,对吧?>> 就像,如果我现在遇到了以前没有遇到的问题,它可以教我这个问题。>> 这是我经常使用的一个功能,我实际上不想要答案。>> 我也想要答案,但我也想理解为什么是那个答案。>> 而且,它可以做到,而且它可以把它放在它的视角中。>> 我不擅长复杂的数学,我发现我偶尔需要做一些,而让它为我简化非常有帮助。>> 就像,它,它,它,如果问题以某种方式呈现,它对我就非常有效。>> 如果问题以不同的方式呈现,特别是非常抽象的方式,就像在许多论文中一样,我并不像我应该的那样好。>> 我认为,对于我试图做的事情。>> 但 ChD 帮助我更快地掌握它。>> 所以,我认为这是一个巨大的变化。>> 另一个绝对改变了的事情,我最近甚至写了关于它的文章,那就是它将一大批以前没有做过编程的人带入了编程领域。>> 是的。>> 就像,我之前写过这个,但就像,我有一个空管在火车上进行了四小时的谈话,他谈论了他如何使用 CHGPD,以及他如何甚至可以用它做一些编程。>> 就像,他现在是一个程序员。>> 是的。>> 他有一个非常具体的问题,他以前不会编程,但因为 CHPD 订阅中有 Codex,他能够解决一些他以前无法解决的问题。>> 这是一次巨大的解放。>> 我们将有更多的程序员,仅仅因为提问的副产品,Chpd 正在编程,而人类将继续运行这些代码,也许他想做一些改变。>> Flask 如此受欢迎的一个副作用是它被纳入了大学课程。>> 它被纳入了新程序员的入职培训,比如训练营之类的。>> 所以,我以一种或另一种方式接触了,一个人需要多长时间才能学会编程。>> 这不是一天就能完成的事情。>> 所以,要成为一个能够编写程序的生产力程序员,这需要几个月的工作。>> 而现在,一个人可以按一下按钮就能得到一些东西,然后也许他们会喜欢编程。>> 是的。>> 也许就像,现在我看到了产生东西的效果。>> 也许你没有做所有的事情,但它仍然是你从中获得的满足感。>> 然后,也许这是一种让那些原本不会进入编程领域的人进入编程领域的方式,因为入职培训变得如此容易。>> 我们谈了很多编程语言,你对它们有非常具体的看法,你对它们有自己的看法,但有了 AI 和 Clock、Codex 以及所有这些越来越强大的代理,你认为编程语言的重要性将如何改变?>> 你认为它会局限于少数人,还是只有你和其他真正花了很多时间理解编程语言的优缺点的人,并且思考得更远?因为听起来,你知道,你可以直接告诉 AI 去解决它,给它一个现有的代码库,它就会去做。>> 所以,有一个论点是,编程语言可能不再那么重要了。>> 你的看法是什么?>> 我认为我将与我之前所说的保持一致,那就是我认为我对编程语言非常尊重,因为它们存在的权衡。>> 而有了 AI,我认为你可能不得不开始关注不同的权衡。>> 另一个我最终在我的初创公司中使用 Go 的原因是,我只是注意到 Go 代码在 AI 方面扩展得有多好,因为抽象非常薄。>> 它能更好地理解代码。>> 所以,显然,有一些,我做了测量,对吧?>> 我让它用不同的语言写了十次某种类型的程序,看看它通过的频率有多高。>> 我注意到它在 Go 上比在 Python 上做得好得多。>> 而且比 Rust 好得多。>> 显然,语言很重要,因为代理的质量很重要。>> 然后,现在他们拥有的任何一种语言都是对人类和计算机结合工作环境的完美语言吗?>> 我不知道,也许,也许找到了编程语言的顶峰。>> 但也许也正是这个时候,有人会说,“嘿,我实际上有一个绝妙的主意,关于这里更好的权衡,因为做这类事情的成本随着 AI 的下降,而做这类事情的成本却因为 AI 而上升。”>> 所以,让我以不同的方式重新平衡一下。>> 所以,实际上,我认为,我认为
那个编程语言将继续非常重要,特别是编程语言在运行时环境中所暗示的权衡变得更加重要。所以我认为这不会改变。我认为一切只会加速。现在一切都进展得如此之快,或者感觉如此之快,因为基础正在发生变化,而且这不仅仅是现在每个人都想构建所有新东西。感觉就像如果你不一直工作,你就会错过一些变化。而且我认为这不仅仅是产品方面,技术方面也是如此。我很确定很多人都觉得“我想成为第一个构建对代理和人类都非常有效的编程语言的人”,但这不仅仅是一个人,很可能是很多目前正在研究这个问题的人。嗯,它感觉如此,以至于现在确实有一个时刻可以构建完美的语言,或者一种在该环境中运行得更好的语言,因为我们可能不会摆脱“提示编码”,而且我们现在拥有的所有语言都是最好的语言的可能性有多大?可能不高,对吧?所以它将在很多方面保持相同和不同。嗯,有一件事不容低估,那就是计算机将自行编程,而没有人会参与其中的可能性。我不认为这可能性很高。我认为人类将比我们想要的更长时间地留在循环中,而且在比我们想要的更多的情况下。所以你不能说“嗯,最佳输出是编写一堆汇编代码”,因为那样就没有人能再审查了,对吧?所以如果有什么的话,权衡将不得不变得更高层,以便审查更容易。也别忘了汇编的事情,对吧?我们有高级语言的原因之一是汇编需要针对每种架构类型或每种 CPU 类型进行不同的处理,这就是为什么像 Java 在 90 年代初如此受欢迎,它可以在 Mac 上运行。但如果我能让 AI 移植到我的其他操作系统,他们可能会争辩说这可能不再需要了。我不认为这是我的观点,但它改变了其中一些东西的成本,对吧?是的。但你提到了一个有趣的事情,那就是每个人似乎都在一直工作,这是一个有趣的收缩,AI 或这些代理你可以启动,理论上你可以去睡觉,让它为你运行循环,这样你就可以少工作。但实际上,我们看到的是工作更多,而且我们现在有这个非常有趣的事情,那就是 AI 初创公司尤其是在旧金山,正在增加要求或宣传 996,即每周工作 6 天,每天从早上 9 点到晚上 9 点。尤其是在旧金山。他们在招聘广告中写道,他们在办公室里,午夜或午夜之后,人们仍然在那里努力工作。嗯,你在你的博客上也分享了一些关于这个的想法。它引起了相当大的轰动。但你对此有何看法?因为你说过,你知道,现在有很多能量。有一种不想错过的感觉。显然,这就是为什么这些人这样做。是的。所以有一些想法,其中一个是我实际上要非常感谢 Peter Steinberger 推动我进行提示编码,因为他在一家名为 PSPDF kit 的公司工作,他卖掉了这家公司,然后我不想讲他的故事,但长话短说,有一次他停止了编程,然后他告诉我:“嘿,我找到了这个计算机,它为我编程。”他说他不再睡觉了。他说:“我太上瘾了。”你应该试试这个。”他并没有完全这样说,但我持怀疑态度,对吧?但为你工作的电脑让你睡不着觉,这太有趣了。是的。这就像我意识到如果你这样做,它会影响你的大脑。如果你做这个时髦的提示编码,因为就像一开始,我觉得任何我没有让它运行并做些什么的时间都是在浪费时间。这就像是这其中很大一部分,它几乎就像毒品,对吧?它有即时满足感,某件事发生了,你可以一次又一次地启动它。这就像一个老虎机,对吧?所以我认为我将其中一些归因于此,而且我花了一段时间才摆脱这种思维方式,因为它并不可持续。就像有很多夜晚我整夜都在编码,不是因为我觉得我在某个初创公司的事情上效率很高。只是“这让我大开眼界。我只想再来一个提示,再来一个提示。”嗯,所以我想在某种程度上,因为如果你如此接近 AI,那也可能是一个原因。另一个原因是,我认为每个人都看到了变化,并希望尽可能多地做。我认为 996 的棘手之处在于,996 定义了一种非常非常具体的工作模式,即你每天工作 12 小时,而且基本上没有周末。不。我从来没有做过这样的事情,尽管我可能有时工作 80 小时。原因是我知道我不能一直保持高效。如果我深夜工作,我早上就会效率低下。我有三个孩子。我有一个妻子。我家庭对我来说非常重要。这是最重要的。所以,我总是会围绕它来安排我的工作。你可以有高强度的劳动,但你仍然可以以一种不疯狂的时间、疯狂的时间的方式来做,你只是在优化你能产生的最佳输出。而且我还想说,如果你是创始人,或者你是一个拥有非常好的薪酬体系的早期工程师,股权对你来说很重要,那么与后来加入公司的大多数人相比,或者公司没有现实的股权价值的途径,那么将大量精力投入到只有一个人受益的事情上是毫无意义的。这一切都有很多微妙之处。而 996 尤其让我恼火的是,他们选择了那个词,如果你回顾一下这个名字的由来,那是因为基本上没有微妙之处。就像你每天工作 12 小时,每周工作 6 天,你放弃了你生活中其他的一切。而且我不认为这是任何人任何时候都应该做出的权衡,因为生活中还有比在公司工作更重要的事情。而且,你不应该把那个带有如此负面含义的东西放在你的旗帜上,因为它所做的正是那样。嗯,人们真的为此自杀,对吧?而且,如果你想成为一个高强度的工作环境,那就说出来,但要更具体,因为在实际操作中,你不可能成为一个像那样运营的公司。你只能成为一个高能量的人工作并自我提升的公司。但有一个限度,你可以做到这一点,而且你必须透明地说明其成本。我在这个行业待了足够长的时间,我见过很多很多糟糕的结果。特别是通过我的社区,很多人甚至出现了精神病和精神分裂症以及很多事情,在这些事情中,你的可能性也会在某些年份随着不健康的行为而增加。现在,我在 Centu 工作,它 all about error handling,或者在 core is there,你可能已经看到了大量关于不同服务器上最常见错误的统计数据。你从开发者的角度学到了什么关于错误处理以及如何构建更少错误的更好软件?我学到的最大的一点是,讽刺的是,尽管有 Sentry 这样的工具及其受欢迎程度,但处理错误的方式并没有携带足够的信息,或者只携带了对调试版本有用的信息。这是有问题的,因为最有趣的错误不会在调试版本中发生,对吧?嗯,也许随着 AI 的出现,这种情况正在发生一些变化,因为从不完美的信息中产生一个可复现的案例的成本可能会降低。所以也许有一个反向的举动。我真的觉得作为一个语言设计者,作为一个虚拟机创建者,你应该更加强调确保错误能够廉价地携带真正有用的信息,即使在发布和生产环境中也是如此。很多生态系统都没有这样做,这非常令人遗憾。而且我认为 Python 拥有如此出色的内省能力,而无需进一步的努力,Python 是一种慢速语言。所以如果你已经添加了所有调试工具,它不会显著变慢。这实际上是 Sentry 存在的原因,因为 Sentry 能够显示 Python 的局部变量。它拥有所有这些丰富强大的数据,而许多语言即使在今天我们也无法做到,因为运行时不支持它,或者这样做对运行时的影响太高了。所以这是我学到的最多的东西,那就是如果你有丰富的错误信息,你的调试问题的体验会好得多。不幸的是,语言设计者和运行时经常忽视错误。所以它们没有携带正确的信息,而应用程序和库的开发人员通常根本不考虑错误,或者他们将它们捕获在错误的地方,然后有用的堆栈跟踪就消失了。所有这些东西,因为你认为它们是例外的,它们并不经常发生,但不幸的是,每次发生时,你都没有足够的数据。所以,总的来说,鉴于错误的重要性,错误的总体设计并不在应有的位置。所以这是一件事,但 Sentry 适用于多种不同的语言,几乎所有语言,对吧?现在,或者至少是那些被广泛使用的语言。你是否看到过不同类型的错误或使用语言的错误频率之间的有趣模式?基本上,我想知道的是,从选择语言的角度来看,它有多重要,你知道,拥有更多正确的程序?嗯,不同的语言崩溃的方式不同,这不仅仅是因为语言本身,还因为你用它构建的东西。所以,例如,JavaScript 在规模上,如果你看很多网站的错误,JavaScript 中有意义的错误百分比非常非常低。是的。就像我每次打开我的开发者工具,它就会显示错误和警告,而且几乎每个网站都是如此。这说得通,因为你在 JavaScript 中很少能真正引起错误并导致浏览器标签页崩溃,对吧?所以就像你一样,你就像“错误继续”,你磕磕绊绊地前进,有些东西坏了,但实际上并没有像“错误”那样,但错误的存在在控制台日志中并不意味着网站坏了,但例如,现在事件监听器可能不再触发了。所以点击是一个无效的点击,这是 Sentry 需要一个会话回放产品才能找到的东西,因为你在 Sentry 中找到的实际错误与用户在页面上无法前进的关联不足。另一方面,如果你有一个用 C++ 编写的电脑游戏,它崩溃了,你的会话就结束了,对吧?所以与 JavaScript 中所有乱七八糟的事情相比,电脑游戏中的崩溃相对较少,但当它们发生时,它们更有意义。所以很难说不同语言中的错误率等等,因为这些错误的影响非常非常不同。所以 C++ 代码在电脑游戏中的崩溃率非常低,就像 Sentry 从这些游戏中获得的流量非常非常少,但 C++ 中每个单独的崩溃报告的有用性要高得多。所以,在规模上说“某事如何出错”是一个非常复杂的话题,因为它真的取决于“它会带走什么”。显然,有一些类型的错误,如果你看到它们足够长的时间,你会觉得它们真的不应该发生。在某种程度上,JavaScript 生态系统有一个大规模的认识,即类型检查器可以消除一大类错误,因为至少你必须明确检查这个东西是否可为空。但我也从未觉得 TypeScript 的采用会显著改变 Sentry 的 JavaScript 错误率。如果有什么的话,它就像,这些采用都没有对如何崩溃产生任何有意义的影响。是的。嗯,因为,因为我所期望的,对吧?我们知道,而且我认为这是普遍假设的,我不确定是否已证明类型安全的语言会减少某些更明显的错误。TypeScript 对 JavaScript 也是如此。我的意思是,它有一个编译器,但最终,在编译到 JavaScript 之前,你会得到一个检查。所以,我们应该少一些。这就是我的想法。所以你的意思是你没有真正看到太多变化?不,我,如果有什么影响的话,那是无法衡量的。然后当然,你还有其他可能发生的频率函数,它们可能会抵消你可能在捕获一些错误方面获得的任何改进,也许这会让你更勇敢地构建更复杂的代码。对。Sentry 的很多时间都是疯狂复杂性的时代,所以,嗯,很多错误都与我是否可空无关,但现在突然我正在与一个微服务交谈,它们版本不匹配,而我的类型检查实际上对我没有任何帮助,因为有人决定在网络层上它现在是空的,对吧?所以,Sentry 多年来处理的许多软件的复杂性增加。我认为你可能已经衡量了这一点,特别是我想起 React 生态系统中越来越多复杂事物的采用,它极大地增加了错误的类型。就像有一段时间,水合错误多年来都不是一个问题,然后突然出现了一整类新错误,因为现在视图的稳定性在初始服务器渲染和 JavaScript 动态加载的内容之间存在。就像那是一整类以前不存在的错误,突然出现了,对吧?所以,由于我们的变化以及我们的应用程序变得多么复杂,所以很难衡量这些事情。是的。所以,所以,所以就像你说的,这是真的,就像在 React 之前,你知道,水合错误是 React 特有的。但那些整个错误类别根本不存在,然后随着 React 的普及,它们在 React 中相当普遍。所以,所以现在你技术上得到了更多的错误。结果发现这是一个非常安全的生意,因为它们并没有真正下降。是的。嗯,然后我认为我们将它推广到 AI 工具,通常使用最流行的框架或拥有最多训练数据的框架,也就是最流行的框架。所以我们将跟随,我们很可能会看到代码和部署的爆炸式增长。所以是的,这可能是一门好生意。但是,在错误领域工作过,你是如何改变你的方法,或者 Sentry 团队,你如何改变你构建软件的方法,并考虑到错误?你是否更意识到了这一点?有没有什么改变?因为这很有趣,你知道,你对所有我将称之为错误的“错误”有了如此深入的了解,它们可能不是错误,但我们可以说,你知道,错误通常不是一件好事,但你看到了所有这些事情的出现。那么,你改变了我们开发软件的方式吗?嘿,你会认为在可观测性公司工作会让它成为构建可观测性产品的绝佳公司,而现实是,错误之所以被事后考虑,是有原因的,对吧?就像你几乎必须强迫自己去处理那 5% 或 1% 的情况,对吧?而且这是一个持续的问题,就像每一次拉取请求一样,你现在通过了。所以我们已经处理了这个问题,你会花额外的时间来确保即使它现在失败了,它也能正确报告错误吗?我不认为 Sentry 的代码在错误报告方面比其他任何代码都更正确,因为处理良好错误报告的行为是一种故意的行为。就像良好的日志记录是一种故意的行为。良好的指标支持是一种故意的行为。而且随着时间的推移,你会稍微训练一下这个肌肉,但我认为你可能会提高 50%,提高 100%,这仍然非常非常低。我们应该提高 1000%。就像那样,我们就能看到改进。就像如果每一个,就像如果 90% 的错误真的被很好地报告了,那将是非常好的。但这需要巨大的努力。而且只有当你停止像我们这样编程时,你才能真正获得这种提升。也许语言本身已经将这一点拉入了每一个堆栈帧,每一个角落情况。所以我认为真正的提升将来自于许多现在构建可观测性公司的公司说:“好吧,现在我们知道了问题所在,那就是数据收集,首先是数据收集。我们如何构建一个编程环境,使其成为原生的?”多年来,引起我们所做事情的注意的最大挑战是上下文本地。上下文本地是什么?有一个非常棒的演讲,由 Ron Presler 做的,他编写了 Java 虚拟线程的原始实现,后来又参与了 Loom 项目,将虚拟线程直接引入 Java。他基本上有力地论证了堆栈帧。堆栈帧有什么好处?堆栈帧很棒,因为它们基本上会隐式地携带信息。他展示了当你转向异步等待时,你放弃了什么,你基本上将一系列 Promise 链接在一起。当我们开始转向 Promise 时,我们面临的直接问题是,现在很难通过这个 Promise 链可能带你到的所有潜在路径来传递信息。例如,如果你想说“我有一个相关 ID,它应该附加到每一个日志事件,它应该附加到每一个错误事件。”这可能是我用堆栈帧做的原始事情的结果。非常简单。它就在堆栈的某个地方。我不会丢失它。我可以向上遍历堆栈并再次找到它。但是有了 Promise,现在我需要将它们链接在一起。所以上下文本地在某些语言中被称为上下文本地。在 .NET 中,它被称为执行上下文。它基本上是一个隐藏的、几乎像线程本地变量但范围更窄的东西,它随着执行的逻辑流而流动。为什么这是必要的?因为如果你做像 OpenTelemetry 这样的事情,如果你做跟踪,如果你做像你想要一个相关 ID 这样的事情,你希望它出现在每个地方,对吧?多年来,Sentry 一直在与人们交谈,比如,“嘿,你知道什么会很棒吗?在所有地方都有上下文本地。”JavaScript,我认为在浏览器中仍然没有,在后端,它最终获得了域,然后它获得了异步钩子,如今它被称为异步本地存储。听起来就像你说的,作为一个工程团队,比如即使在 Sentry,你的重点也是完成任务。你知道你测试它是否正确工作,然后当涉及到错误时,就像你说的,它通常是事后考虑,要么当它崩溃时,要么你知道,如果你有大量时间,或者你真的需要确保它会正确工作。但是对于语言,编程语言来说,这听起来很讽刺,在许多语言中,它都是事后考虑的,因为正如你所说,如果你更好地思考它,说:“嘿,在某个时候程序员会崩溃,或者会出现错误。我能做什么?”你知道,有你提到的上下文本地的东西。我不认为它是事后考虑的。我认为它是故意不做的,因为你必须想象,编程语言中有不同的力量在起作用,它们决定了“语言应该做什么”,而其中一些力量是明显相互冲突的。那么,上下文本地有什么问题?为什么它们会使每次调用都变慢,对吧?所以现在那些想要更快语言的人会说,“好吧,你现在必须提出一个强有力的论据,为什么你应该这样做。”我记得多年来,一个最大的隐藏在幕后的斗争是,在原生平台上,编译器曾经做出一个决定,我们可以通过使用堆栈寄存器来获得一个额外的寄存器。你基本上会放弃最后一个寄存器来为其他用户恢复堆栈帧,然后你必须使用一个非常复杂的矮人展开系统来恢复它。对。所以你基本上说,我们正在将运行时遍历堆栈的能力的一部分复杂性转移到通过一个非常复杂的二进制程序延迟完成,该程序嵌入在调试信息文件中。但是你通过这个失去了什么?好吧,你失去了运行时分析功能,因为它的规模太大而无法完成。所以,它不能做进程内分析器,而进程内分析器非常有用,因为你可以找到通过跟踪找不到的信息,对吧?你可以做,基本上可以运行采样分析器。它还使得 Sentry 很难为原生代码提供正确的堆栈报告,因为我可能无法恢复调试符号,因为它是一个二进制驱动程序,而且没有人给我 DLS。我知道,比如 Facebook,Facebook 的应用程序一直在秘密上传 Android 系统符号。就像你的设备会被随机分配是否应该上传它,它们正在收集所有系统符号以提高错误报告的质量。就像如果你的 Facebook 规模可以做到这一点,Sentry 就做不到。我们不能神奇地让每一个 Sentry SDK 都上传一堆文件,这只会破坏用户信任。但最终,我认为这发生在两年前,有人在 Debian 或 Red Hat,他说:“好吧,这是胡说八道,我们要改变它了。我们要把堆栈指针带回来。”这是一场斗争。这是一场为之奋斗的斗争。他们说:“好吧,我们对所有这些都进行了基准测试。我们只使用了 5%。”除了 Python,Python 解释器不知何故慢了 20%。所以他们没有为 Python 做。但但这是一个标志,对吧?这是一个标志,但重要的是这个标志默认设置为所有东西,对吧?所以,它应该默认开启。但是,这 5% 的性能差异,比实际的要多,有一年的压力。所以我认为这很难做到,因为你存在这些不同的利益,有些人想要性能,有些人想要可调试性,而且他们可能生活在完全不同的世界里,也许这个非常关心性能的人从来不需要查看任何崩溃,因为那不是他们的责任范围,然后你有一个维护着一个复杂服务集群的人,他们中的每一个都有一个小比例的崩溃,而且他们经常不运行他们拥有的代码,然后一旦他们有了崩溃,他们就没有他们需要的数据。这太有趣了,因为它提醒你设计一门语言有多么困难,因为你有很多用户,正如你所说,刚刚发生崩溃的人实际上希望语言支持能够非常轻松地恢复,但现在它默认会减慢速度,无论是通过性能还是通过更高的内存使用量,你不能有免费的午餐,对吧?是的,看起来午餐是有代价的。但是,我必须说,我现在对语言设计者有了更多的尊重,尤其是如果你开始编程,你有一种天真的想法,就像“它必须这样工作”,对吧?然后随着时间的推移,你意识到哦,你必须做出所有这些权衡,其中一些很难量化,你甚至可能不得不做出一些非常不受欢迎的决定,而且没有真正的对错。只有很多权衡,也许这也是我们有这么多语言的原因。但是,思考这些看似微小的默认值对你可以用它做什么,以及什么样的人会选择你的语言,这确实非常迷人。我认为 Python 是构建 Web 服务最棒的语言,因为我可以检查每一个进程,而且它并没有让它变慢。但现在我知道这也是 Python 最初缓慢的原因,对吧?然后,作为一家初创公司的一名早期工程师,几乎是创始工程师,你学到了什么?你对现在加入一家快速增长的初创公司的工程师有什么建议?嗯,我可以从一个十年前加入公司的人那里给出建议,对吧?嗯,情况一直在变化。我认为,但我的生活在很多方面都是一条非常线性的道路,就像有一个机会,我做一个决定,我是否接受它,这是秘书问题,但我没有太多尝试,对吧?那就是我只想,我的标准是,我认为这很棒吗?我想做吗?然后也许我抓住机会去做。对我来说尤其如此,我被塑造成一个不是一个好员工的人,因为我并不一定适合特定的模具。我多年来在 Sentry 的头衔在很多方面我甚至都不认同,对吧?就像有一次上面写着“软件工程师”,但我负责这里的办公室,下面有人,我有时觉得我是一个薪资提供者,对吧?因为里面有太多其他的事情了,因为一个小初创公司有这么多事情,现在有人需要处理这些事情,对吧?你需要雇佣一个人来带一些愚蠢的东西,比如家具到这个地方。如果你早期加入一家公司,一切都在变化。没有什么明确的定义。有些人喜欢这样,有些人不喜欢。我认为你必须愿意去体验新事物。如果你开始一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家一家이런 언어는 계속해서 많은 것을 의미할 것입니다. 특히 프로그래밍 언어가 런타임 환경에 암시하는 트레이드오프는 훨씬 더 중요해질 것입니다. 그래서 저는 그것이 변할 것이라고 생각하지 않습니다. 모든 것이 가속화될 것이라고 생각합니다. 지금은 모든 것이 너무 빨리 진행되고 있거나, 기초가 흔들리고 있기 때문에 너무 빨리 진행되는 것처럼 느껴집니다. 그리고 이것은 단순히 지금 모든 사람이 모든 새로운 것을 구축하고 싶어하는 것뿐만 아니라, 마치 당신이 지금 계속 일하지 않으면 변화를 놓치고 있다고 느끼는 것과 같습니다. 그리고 저는 그것이 제품 측면에만 국한된 것이 아니라고 생각합니다. 기술 측면에서도 마찬가지입니다. 저는 프로그래밍 언어를 만들고 싶은 사람들이 많이 있다고 확신합니다. 에이전트와 인간 모두에게 정말 잘 작동하는 프로그래밍 언어를 만들고 싶어하는 사람들이 많이 있다고 확신합니다. 하지만 그것은 한 사람이 아니라 아마도 많은 사람들이 지금 이 순간에 이것을 연구하고 있을 것입니다. 음, 마치 지금 완벽한 언어를 만들거나 그 환경에서 작동하는 더 나은 언어를 만들 수 있는 순간이 있는 것처럼 느껴집니다. 왜냐하면 우리는 아마도 에이전트 디코딩을 제거하지 못할 것이고, 우리가 지금 가지고 있는 모든 언어가 최고의 언어일 가능성은 얼마나 될까요? 아마도 높지 않을 것입니다. 그래서 그것은 많은 면에서 동일하고 다를 것입니다. 그리고 과소평가해서는 안 되는 한 가지는 컴퓨터가 스스로 프로그래밍하고 인간이 루프에 참여하지 않을 가능성입니다. 저는 그것이 매우 높다고 생각하지 않습니다. 저는 인간이 우리가 원하는 것보다 더 오래, 그리고 우리가 원하는 것보다 더 많은 경우에 루프에 머물 것이라고 생각합니다. 그래서 당신은 "음, 최적의 출력은 어셈블리 코드 묶음을 작성하는 것입니다"라고 말할 수 없습니다. 왜냐하면 아무도 그것을 다시 검토할 수 없기 때문입니다. 그렇죠? 그래서 만약 있다면, 트레이드오프는 아마도 더 높은 수준이어야 할 것입니다. 그래서 검토가 더 쉬워질 것입니다. 또한 어셈블리에 대한 것을 잊지 마십시오. 우리가 더 높은 언어를 가지고 있는 이유 중 하나는 어셈블리가 모든 아키텍처 유형 또는 모든 CPU 유형에 대해 달라야 하기 때문입니다. 그래서 자바가 90년대 초에 그렇게 인기가 있었던 이유를 아시겠지만, 그것은 맥과 모두에서 실행되었습니다. 하지만 AI를 다른 운영체제로 이식할 수 있다면, 아마도 그것이 더 이상 필요하지 않다는 주장을 할 수 있을 것입니다. 저는 그것이 제가 가지고 있는 의견이라고 생각하지 않습니다. 하지만 그것은 그러한 것들의 비용을 변화시킵니다. 그렇죠? 네. 하지만 당신은 흥미로운 것을 언급했습니다. 바로 모두가 항상 일하는 것처럼 보인다는 것입니다. 이것은 흥미로운 축소입니다. AI 또는 이러한 에이전트가 어떻게 시작될 수 있는지, 그리고 이론적으로 잠을 자고 그것이 당신을 위해 루프에서 실행되도록 할 수 있다는 것입니다. 그래서 당신은 더 적게 일할 수 있습니다. 하지만 사실 우리는 더 많이 일하고 있고, 우리는 이제 이 매우 재미있는 것을 관찰하게 되었습니다. AI 스타트업, 특히 미국에서는 996을 요구하거나 광고하고 있습니다. 오전 9시부터 오후 9시까지, 주 6일, 특히 샌프란시스코에서요. 그들은 그것을 직업 광고에 넣고 있습니다. 그들은 온라인에 자랑스럽게 게시하고 있습니다. 자정이나 자정 이후에도 사람들이 여전히 거기에 있고 열심히 일하고 있다는 것을요. 음, 당신은 당신의 블로그에서도 이에 대한 몇 가지 생각을 공유했습니다. 그것은 꽤 많은 소란을 일으켰습니다. 하지만 당신의 생각은 어떻습니까? 왜냐하면 당신은 말했습니다. "지금 에너지가 많습니다. 놓치고 싶지 않은 느낌이 있습니다. 분명히 그것이 사람들이 그렇게 하는 이유입니다." 네. 몇 가지 생각이 있습니다. 그중 하나는 제가 실제로 Peter Steinberger에게 디코딩을 강요한 것에 대해 많은 신용을 주어야 한다는 것입니다. 왜냐하면 그는 PSPDF kit이라는 회사에서 일했고, 그는 그것을 팔았습니다. 그리고 저는 그의 이야기를 하고 싶지 않지만, 긴 이야기는 짧게 말하면, 어느 순간 그는 프로그래밍을 멈추었고, 그는 말했습니다. "이봐, 나를 위해 프로그래밍하는 컴퓨터를 찾았어." 그리고 그는 "나는 더 이상 잠을 자지 않아. 나는 너무 중독되었어. 너도 이런 식으로 시도해 봐야 해."라고 말했습니다. 그는 그렇게 말하지 않았지만, 저는 회의적입니다. 그렇죠? 하지만 당신의 일을 하는 컴퓨터 때문에 잠을 잘 수 없다는 것은 매우 재미있습니다. 네. 마치 제가 깨달은 것처럼, 그것은 당신의 뇌에 무언가를 합니다. 만약 당신이 유행하는 디코딩을 한다면, 왜냐하면 처음에는, 저는 제가 그것을 실행하고 무언가를 하지 않는 매 순간이 시간을 낭비하는 것처럼 느꼈기 때문입니다. 마치 이것이 이것의 거대한 부분이었던 것처럼, 거의 마약과 같습니다. 그것은 무언가가 일어났다는 즉각적인 만족감을 가지고 있고, 당신은 그것을 다시 시작하고 다시 시작할 수 있습니다. 마치 슬롯머신과 같습니다. 그렇죠? 그래서 저는 그 중 일부를 그것으로 귀인한다고 생각합니다. 그리고 저는 실제로 이 사고방식에서 벗어나는 데 시간이 걸렸습니다. 왜냐하면 그것은 지속 가능하지 않기 때문입니다. 마치 밤에 코딩을 하면서 밤을 지새운 적이 많았습니다. 그것은 제가 어떤 것에 대해 엄청나게 생산적이라고 느꼈기 때문이 아니라, 스타트업에서 나온 것이었기 때문입니다. 그것은 단지 "이것은 나를 놀라게 한다. 나는 단지 하나 더, 단지 하나 더 프롬프트, 단지 하나 더 프롬프트." 음, 그래서 저는 어느 정도 그것이 AI에 너무 가깝기 때문에 기여한다고 생각합니다. 다른 하나는, 저는 모든 사람이 변화를 보고 가능한 한 많은 것을 하고 싶어한다고 생각합니다. 저는 996의 어려운 점은 996이 매우 매우 구체적인 작업 규정을 정의한다는 것입니다. 즉, 하루 12시간 일하고 주말이 거의 없다는 것입니다. 아니요. 저는 그런 일을 한 적이 없습니다. 비록 제가 때때로 80시간 주를 일했을지라도 말입니다. 그리고 그 이유는 제가 항상 생산적일 수 없다는 것을 알기 때문입니다. 만약 제가 밤늦게 일하면, 저는 아침에 효율이 떨어질 것입니다. 저는 세 아이가 있습니다. 저는 아내가 있습니다. 저는 가족이 저에게 매우 중요합니다. 그것이 가장 중요한 것입니다. 그래서 저는 항상 그것을 중심으로 제 일을 배열할 것입니다. 당신은 강렬하게 일할 수 있지만, 여전히 비정상적인 시간에 비정상적인 시간을 보내는 것이 아닌 방식으로 할 수 있습니다. 당신은 단순히 당신이 어떻게든 생산할 수 있는 최적의 출력으로 최적화하는 것입니다. 그리고 저는 또한 당신이 창업자이거나, 당신이 정말 좋은 보상 시스템을 가진 매우 매우 초기 엔지니어이고, 주식이 당신에게 의미가 있다면, 회사에 나중에 합류하는 대부분의 사람들보다 훨씬 더 많은 노력을 기울일 가치가 없다는 것을 말하고 싶습니다. 또는 회사가 주식이 가치 있을 현실적인 경로가 없다면 말입니다. 한 사람만이 이익을 얻는 것에 많은 노력을 기울일 가치가 전혀 없습니다. 그리고 이것은 모두 미묘한 점이 많습니다. 그리고 996에 특히 짜증나는 점은 그들이 그 단어를 선택했다는 것입니다. 만약 당신이 그 명칭이 왜 존재하는지 돌아간다면, 그것은 기본적으로 미묘함이 없기 때문입니다. 마치 하루 12시간, 주 6일 일하고, 당신의 삶에서 다른 모든 것을 포기하는 것과 같습니다. 그리고 저는 그것이 어떤 시점에서도 누구도 해야 할 거래라고 생각하지 않습니다. 왜냐하면 삶에는 회사에서 일하는 것보다 더 많은 것이 있기 때문입니다. 그리고 그것은 당신이 깃발에 올려놓아야 할 것이 아닙니다. 그것은 정확히 그것이 했던 것 때문에 그렇게 부정적인 의미를 가지고 있습니다. 음, 사람들이 말 그대로 그것 때문에 자살했습니다. 그렇죠? 그리고 만약 당신이 고강도 작업 환경을 원하고 그것을 말하고 싶다면, 하지만 더 구체적으로 말해야 합니다. 왜냐하면 실제로는 그런 식으로 운영되는 회사가 될 수 없기 때문입니다. 당신은 단지 고에너지 사람들이 일하고 스스로를 구축하는 회사가 될 수 있습니다. 하지만 당신이 할 수 있는 데에는 한계가 있고, 당신은 이것의 비용이 무엇인지 투명하게 해야 합니다. 그리고 저는 이 업계에 충분히 오래 있었기 때문에 많은 많은 많은 나쁜 결과를 보았습니다. 특히 제 커뮤니티를 통해, 많은 사람들이 정신병과 정신분열증, 그리고 건강하지 못한 행동으로 인해 특정 연령대에 발병 가능성이 높아지는 많은 것들로 빠져들었습니다. 이제 저는 오류 처리에 모든 것을 거는 Centu에서 일했거나, core is there에서 일했습니다. 당신은 아마도 다양한 서버에서 발생하는 가장 흔한 오류에 대한 수많은 통계를 보았을 것입니다. 오류 처리와 개발자 관점에서 더 적은 오류로 더 나은 소프트웨어를 구축하는 방법에 대해 무엇을 배웠습니까? 제가 배운 가장 큰 것은, 아이러니하게도 Sentry와 같은 도구의 존재와 그 인기가 있음에도 불구하고, 오류를 처리하는 많은 방식은 충분한 정보를 전달하지 못하거나 디버그 빌드에서만 디버깅에 유용한 정보를 전달한다는 것입니다. 그리고 이것은 문제가 됩니다. 왜냐하면 가장 흥미로운 오류는 디버그 빌드에서 발생하지 않기 때문입니다. 그렇죠? 음, 이제 AI 덕분에 이것이 조금씩 변하고 있을지도 모릅니다. 왜냐하면 완벽하지 않은 정보에서 재현 가능한 사례를 만드는 비용이 줄어들 수 있기 때문입니다. 그래서 아마도 거기에 대한 반대 움직임이 있을 것입니다. 저는 언어 설계자로서, VM 생성자로서, 오류가 릴리스 및 프로덕션 실행에서도 저렴하게 정말 유용한 정보를 전달할 수 있도록 훨씬 더 많은 강조를 두어야 한다고 생각했습니다. 그리고 많은 생태계가 그렇게 하지 않는다는 것은 매우 슬픈 일입니다. 그리고 저는 Python이 추가적인 노력 없이도 그렇게 훌륭한 내성 능력을 가지고 있었다는 사실, Python은 느린 언어입니다. 그래서 디버깅 도구를 모두 추가하면 속도가 크게 느려지지 않습니다. 실제로 Sentry가 존재했던 이유입니다. Sentry는 Python의 로컬 변수를 표시할 수 있었기 때문입니다. 그것은 오늘날에도 많은 언어에서 우리가 할 수 없는 풍부하고 강력한 데이터를 가지고 있었습니다. 왜냐하면 런타임이 지원하지 않거나 런타임 효과가 너무 높기 때문입니다. 그래서 제가 가장 많이 배운 것은 디버깅 문제의 경험이 풍부한 오류 정보를 가지고 있다면 훨씬 더 좋다는 것입니다. 그리고 불행히도 언어 제작자와 런타임 모두 종종 오류를 무시합니다. 그래서 그들은 올바른 정보를 전달하지 않고, 애플리케이션 및 라이브러리 개발자는 종종 오류를 전혀 생각하지 않거나, 잘못된 장소에서 오류를 포착하고 유용한 스택 추적은 사라집니다. 모든 것이 예외적이라고 생각하기 때문에, 그것들은 자주 발생하지 않지만, 불행히도 발생할 때마다 충분한 데이터가 없었습니다. 그래서, 전반적으로, 오류의 디자인은 그것이 얼마나 중요한지를 고려할 때 전혀 있어야 할 곳에 있지 않습니다. 그래서 그것은 한 가지인데, Sentry는 오늘날 거의 모든 언어, 또는 적어도 널리 사용되는 언어에서 작동합니다. 언어 사용에 따른 오류 유형 또는 오류 빈도에 대한 흥미로운 패턴을 보셨습니까? 기본적으로, 저는 언어를 선택하는 것이 얼마나 중요한지에 대해 이야기하고 싶습니다. 예를 들어, 더 정확한 프로그램을 갖는 것 말입니다. 음, 다른 언어는 다르게 충돌하며, 이는 언어뿐만 아니라 그것으로 무엇을 구축하는지에 따라서도 달라집니다. 예를 들어, JavaScript는 규모가 커지면 많은 웹사이트 오류가 항상 발생합니다. JavaScript에서 의미 있는 오류의 비율은 매우 매우 낮습니다. 네. 마치 제가 개발자 도구를 열 때마다 오류와 경고가 표시되고 거의 모든 웹사이트가 그렇습니다. 그리고 그것은 말이 됩니다. 왜냐하면 당신은 JavaScript에서 실제로 오류를 일으켜 브라우저 탭을 충돌시킬 수 있는 경우가 거의 없기 때문입니다. 그렇죠? 그래서 마치 "오류 발생 시 계속"과 같고, 당신은 비틀거리며 나아가고 있습니다. 무언가 잘못되었습니다. 하지만 실제로 "오류"와 같지는 않습니다. 하지만 콘솔 로그에 오류가 있다는 것이 웹사이트가 잘못되었다는 것을 의미하지는 않습니다. 하지만 예를 들어, 이벤트 리스너가 더 이상 작동하지 않을 수 있습니다. 그래서 클릭은 죽은 클릭입니다. 이것은 Sentry가 세션 재생 제품을 필요로 했던 것입니다. 왜냐하면 Sentry에서 찾을 수 있는 실제 오류는 사용자가 페이지에서 진행하지 못하는 것과 충분히 연결되지 않았기 때문입니다. 반면에 컴퓨터 게임이 C++로 작성되어 있고 충돌하면 세션이 종료됩니다. 그렇죠? 그래서 컴퓨터 게임에서 발생하는 충돌은 JavaScript의 모든 엉망진창에 비해 상대적으로 적지만, 발생할 때는 훨씬 더 의미가 있습니다. 그래서 오류율을 다른 언어에서 말하기는 매우 어렵습니다. 왜냐하면 이러한 오류가 미치는 영향이 매우 매우 다르기 때문입니다. 그래서 C++ 코드는 컴퓨터 게임에서 놀랍도록 적게 충돌합니다. 마치 Sentry가 이러한 게임에서 얻는 트래픽 양은 매우 적지만, C++에서 각 개별 충돌 보고서의 유용성은 훨씬 더 높습니다. 그래서 규모가 큰 상황에서 "무언가가 어떻게 오류를 일으키는지"를 말하는 것은 매우 복잡한 주제입니다. 왜냐하면 그것은 실제로 "무엇을 무너뜨리는지"에 달려 있기 때문입니다. 분명히, 특정 유형의 오류가 있습니다. 오랫동안 그것을 보면 실제로 발생해서는 안 된다고 느낄 것입니다. 어느 정도 JavaScript 생태계에서는 타입 검사기가 많은 오류를 제거할 수 있다는 것을 대규모로 깨달았습니다. 왜냐하면 적어도 이 항목이 null인지 아닌지를 명시적으로 확인해야 하기 때문입니다. 하지만 저는 TypeScript의 채택이 Sentry의 JavaScript 오류율에 대해 극적으로 무언가를 바꿀 것이라고 느낀 적이 없습니다. 오히려, 그것은 마치, 그 채택은 아무런 의미 있는 영향도 미치지 않았습니다. 네. 음, 왜냐하면, 왜냐하면 저는 기대했을 것입니다. 그렇죠? 우리는 알고 있고, 저는 그것이 널리 가정된다고 생각합니다. 저는 그것이 증명되었다고 확신하지 않지만, 타입 안전 언어는 특정 종류의 더 명백한 오류를 줄일 것입니다. TypeScript는 JavaScript에서도 그렇게 합니다. 제 생각에는 그렇습니다. 그래서 당신은 실제로 많은 변화를 보지 못했다고 말하는 건가요? 아니요, 저는, 만약 어떤 영향이 있었다면 측정할 수 없습니다. 그리고 물론, 당신은 다른 종류의 빈도 함수를 가지고 있습니다. 그것은 당신이 잡는 것의 개선을 상쇄할 수 있습니다. 아마도 그것은 당신이 더 모험적으로 더 복잡한 코드를 구축하게 만들 것입니다. 그렇죠? Sentry의 많은 시간은 미친 복잡성의 시대였습니다. 그래서, 음, 많은 오류는 "이것이 null이었습니까, 아니었습니까?"와 관련이 없었습니다. 하지만 이제 갑자기 제가 이야기하는 마이크로서비스이고, 그들은 버전이 맞지 않고, 제 타입 검사는 실제로 아무런 도움이 되지 않았습니다. 왜냐하면 누군가가 네트워크 계층에서는 이제 null이라고 결정했기 때문입니다. 그렇죠? 그래서 Sentry가 수년간 처리해 온 많은 소프트웨어의 복잡성이 증가했습니다. 저는 당신이 아마도 그것을 측정할 수 있었을 것이라고 생각합니다. 특히 React 생태계에서 점점 더 복잡한 것들의 채택이 오류 유형을 극적으로 증가시켰던 것을 기억합니다. 마치 한때 수년간 수화 오류는 문제가 되지 않았고, 그러다가 갑자기 새로운 오류의 전체 클래스가 들어왔습니다. 왜냐하면 이제 서버 렌더링과 동적으로 로드된 JavaScript 간의 보기 안정성 사이에 전체 클래스의 오류가 발생했기 때문입니다. 그것은 이전에 존재하지 않았던 전체 오류 클래스였고, 갑자기 존재하게 되었습니다. 그렇죠? 그래서 우리의 앱이 얼마나 복잡해지고 있는지, 그리고 우리가 얼마나 많이 변하는지를 고려할 때 이러한 것들을 측정하는 것은 매우 어렵습니다. 네. 그래서, 그래서, 그래서 당신이 말하는 것은 사실입니다. React 이전에는, 당신은 알다시피, 수화 오류는 React에 특유한 것입니다. 하지만 그 전체 오류 범주는 존재하지 않았고, React가 퍼지면서 React에서는 상당히 일반적이 되었습니다. 그래서, 그래서 이제 기술적으로 더 많은 오류가 발생합니다. 오류가 발생하기 때문에 매우 안전한 사업이 되는 것 같습니다. 왜냐하면 오류가 실제로 줄어들지 않기 때문입니다. 네. 음, 그리고 저는 우리가 AI 도구를 사용하여 가장 인기 있는 프레임워크 또는 가장 많은 훈련 데이터를 가진 프레임워크를 사용할 것이라고 생각합니다. 그래서 우리는 따라갈 것이고, 코드와 배포의 폭발적인 증가를 볼 가능성이 높습니다. 그래서 네, 아마도 좋은 사업일 것입니다. 하지만 오류 사업에 종사한 경험을 바탕으로, 당신은 당신의 접근 방식을 어떻게 바꾸었습니까? 또는 Sentry 팀은 오류를 염두에 두고 소프트웨어를 구축하는 방식에 대해 어떻게 바꾸었습니까? 당신은 그것을 더 의식했습니까? 아니면 뭔가 바뀌었습니까? 왜냐하면 흥미롭기 때문입니다. 당신은 모든 "실수"에 대해 그렇게 좋은 통찰력을 가지고 있었습니다. 그것들은 실수일 수도 있지만, 우리는 "오류"라고 말할 수 있습니다. 일반적으로 긍정적인 것은 아니지만, 당신은 이 모든 것을 보았습니다. 그래서, 당신은 우리가 소프트웨어를 개발하는 방식을 바꾸었습니까? 당신은 관찰 가능성 회사에서 일하면 관찰 가능한 제품을 만드는 데 뛰어나다고 생각할 것입니다. 그리고 현실은 오류가 사후 고려 사항이라는 이유가 있다는 것입니다. 그렇죠? 마치 5% 또는 1%의 경우를 처리하기 위해 거의 자신을 강요해야 하는 것과 같습니다. 그렇죠? 그리고 그것은 지속적인 문제입니다. 마치 모든 풀 요청이 어떤 면에서는 통과되었다는 것입니다. 우리는 이것을 처리했습니다. 오류 보고를 올바르게 하도록 하기 위해 추가 시간을 투자할 것입니까? 저는 Sentry 코드가 다른 어떤 코드보다 오류 보고에 더 정확하다고 생각하지 않습니다. 왜냐하면 좋은 오류 보고를 처리하는 행위는 의도적인 행위이기 때문입니다. 좋은 로깅은 의도적인 행위입니다. 좋은 메트릭 지원은 의도적인 행위입니다. 그리고 시간이 지남에 따라 근육을 조금 훈련할 것입니다. 하지만 저는 아마도 50% 더 나아질 것이고, 100% 더 나아질 것이라고 생각합니다. 여전히 매우 매우 낮습니다. 우리는 1000% 더 나아져야 합니다. 마치 거기서 개선을 볼 수 있을 것입니다. 마치 모든 단일, 마치 90%의 오류가 실제로 잘 보고된다면, 그것은 정말 좋을 것입니다. 하지만 그것은 정말 거대한 노력입니다. 그리고 당신이 프로그래밍을 멈추지 않는다면, 그리고 언어 자체가 모든 스택 프레임, 모든 코너 케이스에 이것을 끌어들인다면, 당신은 정말로 이 노력을 얻을 수 있을 것입니다. 그래서 저는 진정한 노력은 지금 이러한 관찰 가능성 회사를 구축하는 많은 사람들이 "좋습니다. 이제 우리는 문제가 무엇인지 알았습니다. 그것은 데이터 수집입니다. 먼저 데이터 수집입니다. 어떻게 하면 이 네이티브를 만드는 프로그래밍 환경을 구축할 수 있을까요?"라고 말하는 것에서 올 것이라고 생각합니다. 수년 동안, 우리가 하는 일에 대한 인식을 높이는 가장 큰 과제는 컨텍스트 로컬이었습니다. 컨텍스트 로컬이란 무엇입니까? Ron Presler가 훌륭한 강연을 했습니다. 그는 Java의 가상 스레드의 원래 구현을 작성했고, 나중에 Loom 프로젝트에 참여하여 가상 스레드를 Java에 직접 도입했습니다. 그는 기본적으로 스택 프레임에 대해 강력한 주장을 했습니다. 스택 프레임이 왜 그렇게 좋은가요? 스택 프레임은 기본적으로 정보를 암묵적으로 전달하기 때문에 놀랍습니다. 그는 비동기 대기 방식으로 전환할 때 무엇을 포기하는지 보여주었습니다. 당신은 기본적으로 여러 Promise를 서로 연결합니다. 그리고 우리가 Promise로 전환하기 시작할 때 직면하는 즉각적인 문제는 이 Promise 체인이 당신을 데려갈 수 있는 모든 잠재적인 경로를 통해 정보를 전달하는 것이 매우 어렵다는 것입니다. 예를 들어, "나는 상관 ID를 가지고 있고, 그것은 모든 로그 이벤트에 첨부되어야 하고, 모든 오류 이벤트에 첨부되어야 한다."라고 말하고 싶다면, 그것은 내가 스택 프레임으로 하는 원래 일의 결과로 발생할 수 있습니다. 매우 간단합니다. 그것은 스택 어딘가에 있습니다. 나는 그것을 잃지 않을 것입니다. 나는 스택을 올라가서 다시 찾을 수 있습니다. 하지만 Promise를 사용하면 이제 그것들을 연결해야 합니다. 그래서 컨텍스트 로컬은 일부 언어에서 컨텍스트 로컬이라고 불립니다. .NET에서는 실행 컨텍스트라고 불립니다. 그것은 기본적으로 거의 스레드 로컬과 같지만 훨씬 더 좁은 범위의 숨겨진 조각이며, 실행의 논리적 흐름을 따라갑니다. 그리고 이것이 왜 필요한가요? 왜냐하면 OpenTelemetry, 추적, 상관 ID를 갖고 싶은 것과 같은 일을 한다면, 그것이 모든 곳에 나타나기를 원하잖아요, 그렇죠? 그리고 수년 동안 Sentry는 사람들과 이야기해 왔습니다. "이봐, 알잖아, 모든 곳에 컨텍스트 로컬이 있으면 정말 좋을 거야." JavaScript는 브라우저에서는 여전히 가지고 있지 않다고 생각합니다. 백엔드에서는 결국 도메인을 얻었고, 그 다음에는 async hooks를 얻었고, 요즘에는 async local storage라고 불립니다. 마치 당신이 말한 것처럼, 엔지니어링 팀으로서, 예를 들어 Sentry에서도, 당신의 초점은 일을 완료하는 것입니다. 당신은 그것이 올바르게 작동하는지 테스트하고, 그런 다음 오류에 관해서는, 당신이 말했듯이, 그것은 보통 사후 고려 사항입니다. 그것이 폭발하거나, 당신이 많은 시간을 가지고 있거나, 그것이 올바르게 작동하도록 확실히 해야 할 때입니다. 하지만 프로그래밍 언어에 관해서는, 아이러니하게도 많은 언어에서 그것은 사후 고려 사항입니다. 왜냐하면 당신이 말했듯이, 만약 당신이 그것을 더 잘 생각했다면, "이봐, 어느 시점에서 프로그래머가 충돌하거나 오류가 발생할 거야. 내가 무엇을 할 수 있을까?"라고 말합니다. 그리고 당신은 당신이 말한 컨텍스트 로컬에 대한 것을 알고 있습니다. 저는 그것이 사후 고려 사항이라고 생각하지 않습니다. 그것은 의도적으로 하지 않는다고 생각합니다. 왜냐하면 프로그래밍 언어에는 언어가 무엇을 해야 하는지를 결정하는 다양한 힘이 있다고 상상해야 하기 때문입니다. 그리고 그들 중 일부는 서로 분명히 충돌합니다. 그래서 컨텍스트 로컬의 문제는 무엇입니까? 왜냐하면 그것들은 모든 호출을 더 느리게 만들기 때문입니다. 그렇죠? 그래서 이제 더 빠른 언어를 원하는 모든 사람들이 말합니다. "글쎄요, 이제 당신은 이것을 해야 하는 이유에 대해 강력한 주장을 해야 합니다." 저는 수년 동안 숨겨져 있던 가장 큰 싸움 중 하나가 네이티브 플랫폼에 관한 것이었다는 것을 기억합니다. 컴파일러는 한때 스택 레지스터를 사용하여 스택 레지스터를 사용함으로써 하나의 추가 레지스터를 얻을 수 있다는 결정을 내렸습니다. 당신은 기본적으로 스택 프레임을 복구하기 위해 마지막 레지스터를 포기하고 다른 사용자에게는 하나의 추가 레지스터를 제공할 것입니다. 그런 다음 디버그 정보 파일에 포함된 매우 복잡한 이진 프로그램 프로그램을 사용하여 이것을 복구해야 합니다. 그렇죠? 그래서 당신은 기본적으로 런타임에 스택을 탐색할 수 있는 복잡성의 일부를 지연된 매우 복잡한 이진 프로그램을 통해 수행하는 것으로 옮기고 있다고 말합니다. 하지만 이로 인해 무엇을 잃게 되나요? 런타임 프로파일링 기능을 잃게 됩니다. 왜냐하면 규모가 너무 느리기 때문입니다. 그래서 인프로세스 프로파일러를 할 수 없습니다. 그것은 매우 유용하다는 것이 밝혀졌습니다. 왜냐하면 추적을 통해 찾을 수 없는 정보를 찾을 수 있기 때문입니다. 그렇죠? 당신은 할 수 있습니다. 기본적으로 샘플링 프로파일러를 실행할 수 있습니다. 또한 Sentry가 네이티브 코드에 대한 올바른 스택 보고서를 제공하는 것을 매우 어렵게 만들었습니다. 왜냐하면 저는 디버그 기호를 복구하지 못할 수도 있기 때문입니다. 그것은 누군가의 이진 드라이버이고 아무도 저에게 DLS를 준 적이 없습니다. 소스 코드나 매핑이 없다는 것을 압니다. Facebook이 예를 들어 Facebook 앱은 항상 안드로이드 시스템 기호를 비밀리에 업로드했습니다. 마치 당신의 장치가 무작위로 업로드할지 여부를 할당받았고, 그들은 오류 보고의 품질을 높이기 위해 모든 시스템 기호를 수확했습니다. 마치 Facebook 규모가 그것을 할 수 있다면 Sentry는 할 수 없었습니다. 우리는 모든 Sentry SDK가 그냥 파일을 업로드하도록 할 수 없습니다. 그것은 사용자 신뢰를 파괴할 것입니다. 하지만 결국, 그리고 저는 이것이 2년 전에 일어났다고 생각합니다. Debian 또는 Red Hat의 누군가가 "글쎄, 이것은 말도 안 돼. 우리는 이것을 바꿀 거야. 스택 포인터를 다시 가져올 거야."라고 말했습니다. 그것은 싸움이었습니다. 그것은 그것을 위한 싸움이었습니다. 그리고 그들은 "글쎄, 우리는 모든 것을 벤치마킹했습니다. 우리는 단지 5%를 사용하고 있습니다."라고 말했습니다. Python을 제외하고 Python 인터프리터는 어떤 이유로든 20% 느려졌습니다. 그래서 그들은 Python을 위해 그것을 하지 않았습니다. 하지만 그것은 단지 플래그였습니다. 그것은 단지 플래그였습니다. 하지만 중요한 것은 그 플래그가 기본적으로 모든 것에 대해 설정된다는 것입니다. 그래서 기본적으로 켜져 있어야 합니다. 하지만 이 5%의 성능 차이, 그것이 더 많을 것으로 예상되었던 것보다, 1년 동안의 압박이 있었습니다. 그래서 저는 이것이 어렵다고 생각합니다. 왜냐하면 당신은 이러한 다른 이해 관계를 가지고 있고, 어떤 사람들은 성능을 원하고, 어떤 사람들은 디버깅을 원하고, 그들은 완전히 다른 세상에 살고 있을지도 모릅니다. 아마도 성능에 대해 정말 걱정하는 이 사람은 충돌을 전혀 보지 않아도 될 것입니다. 왜냐하면 그것은 그의 책임 범위가 아니기 때문입니다. 그리고 당신은 복잡한 서비스 클러스터를 유지하는 사람을 가지고 있고, 그들 각각은 작은 비율로 충돌하고, 종종 그들이 가지고 있는 코드를 실행하지 않습니다. 그리고 그들이 충돌을 겪으면 필요한 데이터가 없습니다. 이것은 너무 흥미롭습니다. 왜냐하면 그것은 언어를 설계하는 것이 얼마나 어려운지를 상기시켜 주기 때문입니다. 다시 말하지만, 당신은 너무 많은 사용자를 가지고 있고, 당신이 말했듯이, 방금 충돌을 겪은 사람은 이상적으로는 언어가 그것을 쉽게 복구하도록 지원하기를 원하지만, 이제 기본적으로 성능이나 더 높은 메모리 사용량으로 인해 속도가 느려질 것입니다. 당신은 무료 점심을 가질 수 없습니다. 네. 점심은 대가가 따르는 것 같습니다. 하지만 보세요, 저는 언어 설계자들에 대한 존경심이 훨씬 더 커졌다고 생각합니다. 특히 당신이 프로그래밍을 시작할 때, 그것은 이런 식으로 작동해야 한다는 순진한 생각을 가지고 있습니다. 그렇죠? 그리고 시간이 지남에 따라 아, 당신은 모든 종류의 트레이드오프를 해야 하고, 그중 일부는 정량화하기가 정말 어렵고, 심지어 매우 인기 없는 결정을 내려야 할 수도 있고, 실제로는 옳고 그름이 없습니다. 단지 많은 트레이드오프가 있을 뿐입니다. 그리고 아마도 이것이 우리가 어느 정도 많은 언어를 가지고 있는 이유일 것입니다. 하지만 이러한 겉보기에는 사소한 기본값이 당신이 그것으로 무엇을 할 수 있는지에 대해 미치는 영향과, 그리고 아마도 어떤 종류의 사람들이 당신의 언어를 선택할 것인지에 대해 생각하는 것은 매우 흥미롭습니다. 저는 Python이 웹 서비스를 구축하는 데 가장 놀라운 언어라고 생각했습니다. 왜냐하면 저는 모든 프로세스를 검사할 수 있었고, 그것은 속도를 늦추지 않았습니다. 하지만 이제 저는 그것이 Python이 원래 느렸던 이유이기도 하다는 것을 압니다. 그렇죠? 그리고, 스타트업에서 거의 창업 엔지니어로서의 경험을 통해 무엇을 배웠습니까? 그리고 지금 초기 단계에 있는 빠르게 성장하는 스타트업에 합류하는 엔지니어에게 어떤 조언을 해주시겠습니까? 음, 저는 10년 전에 회사에 합류했던 사람의 관점에서 조언을 드릴 수 있습니다. 음, 상황은 항상 변합니다. 하지만 제 삶은 많은 면에서 선형적인 경로입니다. 기회가 있고, 결정을 내리고, 그것을 받아들일지 여부를 결정합니다. 그것은 비서 문제이지만, 저는 그것을 너무 많이 시도하지 않습니다. 그렇죠? 즉, 저는 단지 통과 기준이 "이것이 훌륭하다고 생각합니까? 저는 이것을 하고 싶습니까?"입니다. 그리고 나서 아마도 저는 그것을 할 기회를 잡을 것입니다. 그리고 특히 저에게는, 저는 실제로 좋은 직원이 아닌 사람으로 만들어졌습니다. 왜냐하면 저는 반드시 특정 틀에 맞지 않기 때문입니다. 제 Sentry에서의 직책은 여러 면에서 제가 연관시키지 않았습니다. 마치 한때 소프트웨어 엔지니어라고 적혀 있었지만, 저는 사무실을 책임지고 있었고, 때로는 제가 급여 제공자인 것처럼 느꼈습니다. 왜냐하면 그것은 너무 많은 다른 것들이 있었기 때문입니다. 왜냐하면 작은 스타트업은 이러한 많은 것들을 가지고 있기 때문입니다. 이제 누군가가 이 모든 것을 처리해야 합니다. 그렇죠? 당신은 심지어 가구와 같은 어리석은 것을 가져오기 위해 누군가를 고용해야 합니다. 만약 당신이 회사에 일찍 합류한다면, 모든 것이 유동적입니다. 아무것도 잘 정의되지 않았습니다. 어떤 사람들은 그것을 좋아하고, 어떤 사람들은 그것을 좋아하지 않습니다. 그리고 저는 당신이 단지 새로운 것을 경험할 준비가 되어 있어야 한다고 생각합니다. 만약 당신이 특히 회사를 설립한 적이 없는 사람에게서 온 스크래피 스타트업에서 시작한다면, 회사가 작게에서 크게 성장하는 것을 본 적이 없다면, 왜냐하면 심지어 저에게도 저는 다시 깨닫습니다. 아, 제가 이 모든 것을 해야 한다는 것을 잊어버렸습니다. 그리고 다시 이것을 해야 합니다. 하지만 그것은 사람들이 좋아하고 좋아하지 않는 사람들이 있고, 당신은 단지 그 결과에 대해 인식해야 합니다. 그리고 당신은 스스로 길을 개척해야 합니다. 단순히 일어나는 일을 하는 것에 만족하거나, 야심차게 특정 경로를 선택하여 원하는 곳으로 가야 합니다. 비록 그것이 일시적으로 어떤 형태로든 당신을 뒤처지게 할 수 있을지라도 말입니다. 그리고 이제 당신은 소프트웨어 엔지니어로서 스타트업을 시작한 사람입니다. 당신은 당신의 공동 창업자와 함께 당신의 스타트업을 설립했습니다. 지금까지 어떻게 되어가고 있습니까? 그리고 당신이 예상했던 것과 어떻게 다릅니까? 특히 당신은 다른 편에 있었기 때문입니다. 당신은 초기 직원이었습니다. 당신은 많은 것을 보았습니다. 그것은 당신이 예상했던 것과 같습니까, 아니면 그냥 다른 느낌입니까? 어떤 면에서는 저는 회사를 설립하는 것을 여러 번 연기했습니다. 적어도 제 마음속에서는, 제 Sentry에 대한 기억은 "음, Sentry를 하지 않고 다른 것을 했을 수도 있습니다."와 같았습니다. 그리고 거의 4~5년 후, 제 첫 번째 주식이 모두 베스팅되었을 때, 저는 생각했습니다. "음, 혹시 플라스크와 같은 것을 가져와서 그것을 기반으로 사업을 구축할 수 있는 경로가 있을까요?" 그래서 어떤 면에서는 다년간의 준비였습니다. 그래서 이제 그것은 "오, 실제로 다릅니다."라고 느껴지지 않습니다. 그것은 단지 "좋습니다. 그것은 다음 논리적인 단계입니다."와 같습니다. 아니요, 저는 그것들을 잘못된 단계라고 부르지 않을 것입니다. 하지만 Sentry에서 우리가 내린 몇 가지 결정에 대한 지식을 바탕으로, 저는 이제 그것들을 다른 관점에서 볼 수 있습니다. 저는 이제 주식에 대한 다른 의견을 가지고 있습니다. 주식의 결과에 대한 의견을 가지고 있습니다. 특정 사항을 어떻게 구성해야 하는지에 대한 의견을 가지고 있습니다. 이번에는 기본적으로 "제가 구축하고 싶은 제품에 대한 아이디어가 있습니다."라고 시작하지 않았습니다. 제가 공동 창업자와 함께 이 회사를 시작하게 된 이유는 우리가 실제로 앉아서 "음, 우리는 회사가 어떤 모습이기를 원합니까? 우리는 왜 여기에 있습니까?"라고 말했기 때문입니다. 우리는 이미 우리가 회사를 시작하고 싶은 종류의 사람이라는 것을 알고 있습니다. 하지만 이것은 그 자체로 끝이 아닙니다. 그것으로부터 무언가가 나와야 합니다. 그렇죠? 그래서 저는 지난번에는 그렇게 하지 않았습니다. 저는 그냥 그것에 빠져들었습니다. 이제 당신은 그것을 과도하게 생각할 수 있습니다. 물론입니다. 하지만 Sentry에서 수년 동안 많은 순간이 있었습니다. 저는 "실제로 우리가 그 생각들을 몇 가지 생각해 보면 좋았을 텐데"라고 느꼈습니다. 그래서 저는 지금 그것들을 시작할 때 생각하고 있습니다. 경험은 주로 당신을 거기에 데려다줍니다. 저는 당신이 시작하고 "나는 이것을 할 것이다"라고 말할 수 있다고 생각하지 않습니다. 물론 당신은 스타트업을 시작한 사람들의 이야기를 많이 읽을 수 있고, 모든 팟캐스트를 듣고, 모든 것을 듣고, 희망적으로 더 나은 감을 얻을 수 있습니다. 그리고 어느 정도는 과도하게 준비할 수도 있습니다. 하지만 당신이 직접 경험한 것과 단순히 누군가로부터 듣는 것과는 다릅니다. 저는 2015년에도 스타트업에 대한 많은 것을 읽었습니다. 저는 그것에 중독되었습니다. 그리고 여전히 지금 그것을 하는 것은 5년 전에 했다면 매우 다르게 느껴집니다. 단지 제 자신의 내면의 경험 때문에, 제가 이 모든 것에 대해 어떻게 느끼는지, 언제 긴급함을 느끼는지, 언제 그냥 기다리는지에 대한 경험 때문에. 그 경험은 당신을 다른 위치에 놓습니다. 그렇지 않으면 그렇게 하지 않았을 것입니다. 그것이 도움이 되는지는 모르겠지만, 저는 그것이 대부분 제가 느끼는 방식이라고 생각합니다. 음, 저는 당신이 모든 의견을 얻고, 그것에 대해 읽고, 이야기를 들을 수 있지만, 결국 그것을 할 때 다를 것이고, 그것을 하기 전까지는 알기 어렵다는 것을 알 수 있습니다. 네. 그리고 그것은 어떤 사람들에게는 효과가 있었지만, 저에게는 효과가 없었을 것입니다. 어떤 사람들에게는 효과가 있었을 것입니다. 특히 교육을 잘 받은 사람이라면, 올바른 가치관을 가지고 자라서 본질적으로 그것을 내면화한 사람이라면 말입니다. 하지만 그것은 제 교육이 아니었습니다. 그렇죠? 제 교육은 표준 학교와 대학이었습니다. 그리고 제가 한 번도 노출되지 않았던 세상이 있습니다. 그것을 어떤 형태로든 배워야 했습니다. 그리고 마지막으로 몇 가지 빠른 질문으로 마무리하겠습니다. 그래서 저는 당신에게 물어볼 것이고, 당신은 떠오르는 것을 말해줄 것입니다. 프로그래밍 언어 중에서 가장 좋아하는 것은 무엇이며, 저는 정말 듣고 싶습니다. 파이썬입니다. 그리고 두 가지 이유가 있습니다. 하나는 그것이 저에게 경력을 주었고, 그래서 당연히 많은 감정적인 애착이 있습니다. 하지만 그것은 또한 많은 측면에서 잘못 설계된 나쁜 프로그래밍 언어이지만, 그것은 믿을 수 없을 정도로 실용적이며, 저는 그것을 좋아합니다. 그리고 저는 Kell Henderson이 수년간 해온 많은 것들을 지적하고 싶습니다. 그는 원래 Flickr의 CTO였고, 그 다음에는 PHP guy였습니다. 하지만 그가 PHP를 사용했던 실용성은 많은 면에서 제가 항상 Python으로 제품을 구축하는 것을 좋아했던 실용성과 같았습니다. 그리고 그것은 당신이 그것으로 무엇을 할 수 있는지, 그것이 좋든 나쁘든 신경 쓰지 않는 것과 같습니다. 그리고 저는 Python으로 많은 것을 할 수 있었고, 그것에 대해 감사합니다. 그리고 당신이 사용하는 도구 중에서 사랑하는 도구는 무엇이며, 그것은 무엇을 합니까? 저는 프로그래머가 아닌 사람으로서 대답하겠습니다. 제가 좋아하는 도구는 드라이버입니다. 그것은 나사를 조입니다. 하지만 제가 그것을 너무 좋아하는 이유는, 그리고 이것이 제가 수년간 배운 것 중 하나라고 생각합니다. 저는 좋은 전동 드라이버를 가져본 적이 없었습니다. 그리고 우리가 아파트를 샀을 때, 저는 드라이버를 포함한 정말 좋은 도구를 샀습니다. 그리고 그것은 구멍을 뚫고 가구를 조립하는 것에 대한 제 의지를 증가시켰습니다. 그리고 그것은 제가 지금 가지고 있는 가장 좋아하는 것입니다. 정말 정말 좋은 잘 만들어진 드라이버입니다. 저는 개발에도 적용될 수 있는 은유가 있는지 궁금합니다. 당신은 알다시피, 좋은 도구를 가지고 있을 때, 당신은 실제로 훨씬 더 동기 부여되고, 의지가 있고, 더 모험적이기도 합니다. 음, 이 대화에 감사드립니다. 정말 재미있었습니다. 정말 즐겁게 이야기했습니다. 아르멘과 대화하면서 가장 흥미로운 부분 중 하나는 그가 6개월 전에는 AI에 대해 매우 부정적이었지만 이제는 Claw Code 및 OpenAI Codeex와 같은 AI 에이전트를 사용하여 스타트업을 구축하고 있다는 것입니다. 저는 아르멘을 매우 실용적인 엔지니어로 봅니다. 그리고 그가 이러한 도구를 더 많이 사용하도록 자신을 밀어붙인 후 그렇게 큰 변화를 겪었다면, 그것은 AI 코딩 도구에 시간을 투자하고 어떻게 작동하는지 보는 것이 가치가 있다는 것을 말해줍니다. AI 도구 트렌드에 대한 더 많은 관찰을 보려면 쇼 노트에 링크된 Pragmatic Engineer의 Deep Dies를 확인하십시오. 이 팟캐스트를 즐기셨다면 좋아하는 팟캐스트 플랫폼과 YouTube에서 구독해 주십시오. 쇼에 대한 평가를 남겨주시면 특별히 감사하겠습니다. 감사합니다. 다음 시간에 뵙겠습니다.