用 Pi 构建 Pi

2026-05-25 1 阅读 mplanchard
Armin Ronacher 的博客存档项目旅行谈论了 Building Pi With Pi,写于 2026 年 5 月 24 日 Pi 现在是 Earendil 的一部分,但从重要意义上来说,它仍然是 Mario 的项目。他使用问题跟踪器的时间比我长,而且他接触开源项目中新形式的代理流量的奇怪现象的时间也更长。这篇文章主要是我自己在跟踪器上花了更多时间、使用 Pi 在 Pi 上工作以及观察到目前为止我所学到的知识之后的经历的反映。解决问题 不出所料,我们使用 Pi 来构建 Pi。这听起来像是一个可爱的测试,但它确实有助于理解我们所做的事情。使用代理构建的一个有趣的效果是它稍微改变了问题跟踪器的角色。问题描述不仅仅是用户发送给维护者的消息,因为我们还使用它们作为 Pi 会话中提示的输入。我可能会把它交给我的 clanker 1 并说:“理解这一点,重现它,检查代码,并提出修复方案。”这意味着问题的形式以新的方式变得重要。糟糕的问题总是令人烦恼,但至少很多问题都是模糊的。现在,我们还要处理一类问题,其中 5% 是人为的,95% 是由 clang 产生的,而且大部分都是不准确的狗屎。包含看似合理但错误的诊断的坏问题会带来额外的工作。目前最令人沮丧的失败模式是人们提交的问题不是他们自己的声音。它们在某处包含了一个观察到的问题,但它已被扔进一个 clanker 中,而 clanker 重新措辞并把它弄得一团糟。通常情况下,它的提示是如此糟糕,以至于得出的结论往往不准确,但总是充满信心。结果是对根本原因的完全猜测、假最小重现、建议的实施策略、与相邻但通常是错误的代码的类比,以及可能重要也可能不重要的错误类的长列表。这比没有诊断更糟糕。我不想指出具体问题,因为我真的不想说任何人的坏话,但这令人沮丧。这也令人沮丧,因为当我把这个问题交给 Pi 时,Pi 也看到了错误的诊断。它不会将问题主体视为谣言。它把它当作证据。它会很高兴地沿着问题已经准备好的路径走下去,因为散文是自信的,并且代码引用看起来是可信的。我们使用一个名为 /is 的自定义斜线命令,其中特别包含以下指令:不要相信问题中写入的分析。独立验证行为并从代码和执行路径中得出您自己的分析。不幸的是,它并不能完全发挥作用,因为当人类第一次将他们的问题扔进叮当绞车时,他们的叮当声几乎立即扩大了范围。曾经是一个非常狭窄的、基于事实的错误观察,变成了一个充满假设的更大的表面积。因此,至少就我个人而言,我越来越希望问题报告能够浓缩为人类实际观察到的内容:我运行了这个命令。我预料到会发生这种情况。结果却发生了这种情况。这是确切的错误或日志。这就够了。如果您使用法学硕士来理解这个问题,那就太好了,也许可以将其作为后续评论。但问题和问题文本应该是您自己的。如果您不知道根本原因,请说出来。我也能操作铮铮,我宁愿自己做也不愿用你的污水。如果你的重现是猜测,请说出来。如果唯一的硬事实是一个堆栈跟踪,请给我堆栈跟踪并就此停止。污水产生污水 我们所看到的充满污水的问题只是这些机器目前质量的结果。可悲的是,他们在创建好问题方面的失败延伸到了生成的大量代码。不是全部,但是很多代码。我一次又一次地遇到他们对问题和实施进行过度设计。如果你告诉他们“这个格式错误的会话日志使读取器崩溃”,clanker 通常会添加一个宽容的读取器。然后它将添加一个后备,然后可能是一个迁移,然后更多的调试输出,然后对所有这些进行测试。孤立地看,这些都不一定是错误的,但对于系统来说可能是错误的举动。 Pi 的核心是一个设计良好的会话日志,其中包含必须维护的不变量。 clanker 目前的行为是假设不存在这样的不变量,而是让系统以各种畸形的方式运行,从而增加了过程的复杂性。几乎总是,正确的修复不是处理不良状态,而是使不良状态成为不可能。这对于持久数据(例如 Pi 会话日志)非常重要。它们被打开、分支、压缩、导出、共享和分析。这里的目标是永远不要写入错误的会话数据。然而,如果您只是让 clanker 自由漫游,它会尝试使用更宽松的读取器来处理会话日志中的每种不良数据。我已经抱怨过很多次了,但是在 Pi’ 上工作