使用bisect解决扩展问题

2021年2月16日,由Johannes Rieken发布,@johannesrieken

"就像 git-bisect,但适用于 VS Code 扩展。"

Visual Studio Code 的真正强大之处在于其扩展:主题扩展添加颜色和图标,语言扩展启用智能代码补全(IntelliSense)和导航,调试器扩展使您能够运行代码并轻松找到错误。有些扩展可以播放音乐,有些可以显示股票行情,还有一些扩展可以跨地点和时区进行协作工作。VS Code 的 Marketplace 托管了超过 28,000 个扩展,用户安装 50 个或更多扩展并不罕见。由于有如此多的扩展,错误是不可避免的。与其否认,我们希望使故障排除变得容易。

“不良”扩展

我们喜欢扩展,并不认为有任何“坏”扩展。然而,像所有软件一样,扩展也有漏洞和功能缺陷。因此,为了阅读的便利和人为的戏剧性,让我们使用“坏扩展”这个术语,它指的是可能会崩溃或仅仅显示不想要的行为的扩展。幸运的是,我们在设计VS Code时考虑到了“坏”扩展,因此在一个单独的进程中运行它们。这种隔离保证了VS Code继续运行,光标始终闪烁,并且您始终可以保存您的工作。

为了乐趣,也为了更容易演示扩展二分法,我们创建并发布了扩展二分法演示扩展。安装后,每当您输入“bisect”这个词时,它都会烦人地重置您的光标。您可以使用此扩展来跟随本博客文章中的内容。

以困难的方式找到“坏”扩展

今天,找到一个“坏”的扩展可能很容易,也可能很难。打开扩展视图(⇧⌘X (Windows, Linux Ctrl+Shift+X)),禁用一个扩展,重新加载窗口(开发者:重新加载窗口),然后检查问题是否仍然存在。如果问题消失了,那么这个扩展就是“坏”的,你就完成了。否则,重新启用该扩展,并对下一个扩展重复此过程。

逐步禁用扩展

如果你幸运的话,第一个扩展就是“坏”的那个;如果你不幸的话,它就是最后一个扩展。用计算机科学的语言来说,这意味着在有N个扩展的情况下,最坏情况下你需要重复这个过程O(N)(N的阶数),平均情况下是O(N/2)。因为这个算法是由人(你)来操作的,即使N的值很小,也会很费力。这就是扩展二分工具派上用场的地方。它在最坏和平均情况下要好得多,因为它通过一半一半地禁用扩展。

欢迎扩展二分查找

VS Code 中的扩展二分实用工具受到了 git bisect 命令的启发。对于熟悉 Git 的人来说,这个命令有助于找出仓库中哪个提交引入了问题。

让我们用一个例子来说明:我安装了24个扩展,第8个扩展是“坏的”。我们知道迭代方法需要8步。那么二分法呢?

下面的视频展示了通过帮助:启动扩展二分查找命令启动扩展二分查找,然后选择现在良好这是坏的,直到识别出“坏的”扩展。一旦识别出来,您可以选择为该扩展报告问题。

扩展二分过程

以下是逐步发现“不良”扩展的过程:

  1. Bisect 将 24 个扩展分成两半,每半 12 个扩展,并禁用第二半的所有 12 个扩展。
  2. 在这个示例中,第8个扩展是“坏的”扩展,因此它是前半部分并且没有被禁用。事情仍然没有按照我们预期的那样工作。因为仍然存在问题,扩展二分法重复了这个过程,将前12个扩展分成两部分:6个被启用,6个被禁用。所有其他扩展也被重新启用。
  3. 第8个扩展现在已禁用。现在情况良好。这意味着二分查找可以在后半部分(扩展6-11)继续进行,并将它们分为3个启用和3个禁用的扩展。
  4. 现在,第8个扩展已重新启用,问题再次出现。这意味着二分查找在第一半继续进行。它将它们分为1个启用和2个禁用的扩展。
  5. 第8个扩展现在已禁用,情况再次好转,二分查找继续进行后半部分,将其分为1个启用和1个禁用的扩展。
  6. 第8个扩展是唯一被禁用的扩展,问题已经消失。这意味着我们已经找到了“坏”扩展,并且我们已经完成了。

更快地解决问题

我们看到,在每一步中,二分法将搜索空间减半。现在它运行在对数时间内,导致平均和最坏情况下的性能为O(log N)。这非常好,因为它扩展得很好。对于24个扩展,你需要4到5步来找到一个“坏”的扩展,而对于38个扩展,只需要多一步。然而,最好的情况更糟,因为使用迭代方法,你可能会幸运地在第一轮就找到“坏”的。

请记住,扩展二分查找依赖于您提供正确的反馈。您可以通过总是回答现在很好(归咎于最后一个扩展)或这很糟糕(不会找到扩展)来轻易地欺骗它,也欺骗自己。

另一个有用的见解是,扩展二分法开始时考虑的是所有已启用的扩展列表。这意味着你可以通过在开始前禁用它并在之后重新启用它来从二分法中排除一个已知的“好”扩展。然而,只有当你确定该扩展不是“坏”扩展时才这样做。

最后,你可能会注意到bisect多了一步(log2(N) + 1)。这是因为它在第一轮开始时禁用了所有扩展。这一步是因为你可能遇到的问题是VS Code本身引起的,而不是扩展引起的,我们不希望你因此不必要地陷入困境。

就是这样。我们希望您永远不需要使用扩展二分法。然而,如果您确实遇到可能与扩展相关的问题,那么我们希望能够使故障排除变得更简单、更快、更愉快。

编码愉快,

Johannes Rieken,VS Code 首席软件工程师 @johannesrieken