VS Codeのエージェントモードを拡張するには、を試してください!

バイセクトによる拡張機能の問題解決

2021年2月16日 ヨハネス・リーケン (@johannesrieken)

「git-bisect のように、VS Code 拡張機能のためのもの。」

Visual Studio Code の真の力は、その拡張機能にあります。テーマ拡張機能は色やアイコンを追加し、言語拡張機能はスマートなコード補完 (IntelliSense) やナビゲーションを可能にし、デバッガー拡張機能はコードの実行やバグの簡単な特定を可能にします。音楽を再生する拡張機能、株価を表示する拡張機能、場所やタイムゾーンを越えた共同作業を可能にする拡張機能もあります。VS Code の Marketplace には 28,000 以上の拡張機能がホストされており、ユーザーが 50 以上の拡張機能をインストールしていることは珍しくありません。これほど多くの拡張機能があるため、バグは避けられません。私たちは否定するのではなく、トラブルシューティングを簡単にしたいと考えています。

「問題のある」拡張機能

私たちは拡張機能が大好きであり、「問題のある」拡張機能が実際に存在すると考えているわけではありません。しかし、すべてのソフトウェアと同様に、拡張機能にもバグや機能の不足があります。そこで、読みやすさと人工的なドラマのために、「問題のある拡張機能」という用語を使用しましょう。これは、クラッシュしたり、単に望ましくない動作を示したりする可能性のある拡張機能のことです。幸いなことに、私たちは「問題のある」拡張機能を念頭に置いて VS Code を設計したため、それらを別の プロセス で実行しています。この分離により、VS Code が常に実行され、カーソルが常に点滅し、いつでも作業を保存できることが保証されます。

楽しみのため、また拡張機能のバイセクトをデモンストレーションしやすくするために、私たちは Extension Bisect Demo 拡張機能を作成し、公開しました。インストールすると、「bisect」という単語に到達するたびに、煩わしいことにカーソルがリセットされます。この拡張機能を使用して、このブログ記事に沿って試すことができます。

「問題のある」拡張機能を手動で見つける

今日、「問題のある」拡張機能を見つけるのは簡単にも難しくもなり得ます。拡張機能ビュー (⇧⌘X (Windows, Linux Ctrl+Shift+X)) を開き、拡張機能を無効にし、ウィンドウをリロード (開発者: ウィンドウのリロード) して、問題がまだ存在するかどうかを確認します。問題が解決した場合、その拡張機能が「問題のある」ものであり、作業は完了です。そうでなければ、拡張機能を再度有効にし、次の拡張機能でプロセスを繰り返します。

Disabling an extension step by step

運が良ければ、最初の拡張機能が「問題のある」ものです。運が悪ければ、最後の拡張機能です。コンピューターサイエンスの言葉で言えば、N 個の拡張機能がある場合、最悪の場合でプロセスを O(N) (オーダーN) 回繰り返し、平均で O(N/2) 回繰り返すことになります。このアルゴリズムは人間 (あなた) によって操作されるため、N の値が小さくても骨の折れる作業です。ここで拡張機能のバイセクトユーティリティが役立ちます。これは、拡張機能を半分ずつ無効にしていくため、最悪の場合と平均の場合で非常に優れています。

拡張機能のバイセクトへようこそ

VS Code の拡張機能のバイセクトユーティリティは、git bisect コマンドに触発されました。Git に精通している方にとって、このコマンドはリポジトリ内のどのコミットが問題を引き起こしたかを特定するのに役立ちます。

例を見てみましょう: 私は 24 個の拡張機能をインストールしており、8 番目の拡張機能が「問題のある」ものです。反復アプローチでは 8 ステップが必要であることがわかります。バイセクトではどうでしょうか?

以下のビデオは、ヘルプ: 拡張機能のバイセクトを開始コマンドを使用して拡張機能のバイセクトを開始し、「問題のある」拡張機能が特定されるまで今は良いまたはこれは悪いのいずれかを選択する方法を示しています。特定されたら、その拡張機能の問題を報告するオプションがあります。

The extension bisect process

「問題のある」拡張機能が見つかった方法のステップバイステップ

  1. バイセクトは 24 個の拡張機能をそれぞれ 12 個の拡張機能の 2 つの半分に分割し、後半の 12 個の拡張機能をすべて無効にします。
  2. この例では、8 番目の拡張機能が「問題のある」ものであるため、前半に含まれ、無効化されていません。物事はまだ期待通りに機能していません。まだ問題があるため、拡張機能のバイセクトはプロセスを繰り返し、最初の 12 個の拡張機能を 2 つの部分に分割します: 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 個の拡張機能でも追加で 1 ステップしかかかりません。ただし、最良の場合は反復アプローチの方が劣ります。なぜなら、反復アプローチでは運が良ければ最初のラウンドで「問題のある」拡張機能を見つけられる可能性があるからです。

拡張機能のバイセクトは、あなたが正しいフィードバックを与えることに依存していることに留意してください。常に今は良い (最後の拡張機能を非難する) またはこれは悪い (拡張機能を見つけられない) と答えることで、簡単にそれを、そして自分自身を欺くことができます。

もう 1 つの有用な洞察は、拡張機能のバイセクトが有効な拡張機能の完全なリストを考慮することから始まる点です。つまり、既知の「問題ない」拡張機能を、開始前に無効にし、後で再度有効にすることで、バイセクトから除外できます。ただし、その拡張機能が「問題のある」ものではないと確信している場合にのみ行ってください。

最後に、バイセクトが余分な 1 ステップ (log2(N) + 1) を踏んでいることに気づくかもしれません。これは、最初のラウンドで全ての拡張機能を無効にすることから始まるためです。この最初のステップは、拡張機能ではなく VS Code 自体が原因で問題が発生している可能性があり、不必要に深みに引きずり込みたくないためです。

以上です。拡張機能のバイセクトを使用する必要がないことを願っています。しかし、もし拡張機能に関連する可能性のある問題に遭遇した場合、トラブルシューティングをより簡単、迅速、そして快適にできることを願っています。

ハッピーコーディング、

ヨハネス・リーケン, VS Code プリンシパルソフトウェアエンジニア @johannesrieken