bisect を使用した拡張機能の問題解決
2021年2月16日 Johannes Rieken, @johannesrieken 著
「git-bisect と同じように、VS Code 拡張機能用です。」
Visual Studio Code の真の力は、拡張機能にあります。テーマ拡張機能は色とアイコンを追加し、言語拡張機能はスマートなコード補完 (IntelliSense) とナビゲーションを可能にし、デバッガー拡張機能はコードを実行してバグを簡単に見つけることを可能にします。音楽を再生する拡張機能、株価ティッカーを表示する拡張機能、および場所やタイムゾーンを超えた共同作業を可能にする拡張機能もあります。VS Code マーケットプレイス には 28,000 以上の拡張機能がホストされており、ユーザーが 50 以上の拡張機能をインストールしていることも珍しくありません。非常に多くの拡張機能が存在するため、バグは避けられません。私たちは否定するのではなく、トラブルシューティングを容易にしたいと考えています。
「問題のある」拡張機能
私たちは拡張機能が大好きで、「問題のある」拡張機能は実際には存在しないと考えています。しかし、すべてのソフトウェアと同様に、拡張機能にはバグと機能のギャップがあります。そのため、読みやすさと人為的なドラマのために、「問題のある拡張機能」という用語を使用しましょう。これは、クラッシュしたり、単に望ましくない動作を示す可能性のある拡張機能です。幸いなことに、私たちは「問題のある」拡張機能を念頭に置いて VS Code を設計し、それらを別の プロセス で実行しています。この分離により、VS Code が実行され続け、カーソルが常に点滅し、常に作業内容を保存できることが保証されます。
楽しむため、そして拡張機能 bisect のデモを簡単にするために、Extension Bisect Demo 拡張機能を作成し、公開しました。インストールすると、「bisect」という単語に到達するたびに、カーソルが煩わしいほどリセットされます。このブログ記事に沿って進むために、この拡張機能を使用できます。
「問題のある」拡張機能を苦労して見つける
今日、「問題のある」拡張機能を見つけるのは簡単または難しい場合があります。拡張機能ビューを開き (⇧⌘X (Windows, Linux Ctrl+Shift+X))、拡張機能を無効にし、ウィンドウをリロード ([開発者] : [ウィンドウのリロード]) して、問題がまだ存在するかどうかを確認します。問題が解決した場合、その拡張機能は「問題があり」、これで完了です。それ以外の場合は、拡張機能を再度有効にして、次の拡張機能でプロセスを繰り返します。
運が良ければ、最初の拡張機能が「問題のある」ものです。運が悪ければ、最後の拡張機能がそうです。コンピューターサイエンスの言語を使用すると、これは N
個の拡張機能で、プロセスを O(N)
(オーダー N) 回繰り返す最悪の場合、および O(N/2)
の平均的な場合があることを意味します。このアルゴリズムは人間 (あなた) によって操作されるため、N
の値が小さい場合でも面倒です。ここで、拡張機能 bisect ユーティリティが役に立ちます。これは、拡張機能を半分ずつ無効にするため、最悪の場合と平均的な場合ではるかに優れています。
拡張機能 bisect へようこそ
VS Code の拡張機能 bisect ユーティリティは、git bisect コマンドに触発されました。Git に精通している人にとって、このコマンドはリポジトリ内のどのコミットが問題を導入したかを突き止めるのに役立ちます。
例を使用してみましょう。私は 24 個の拡張機能をインストールしており、8 番目の拡張機能が「問題のある」ものです。反復的なアプローチでは 8 ステップが必要であることを知っています。bisect はどうでしょうか?
以下のビデオは、[ヘルプ] : [拡張機能 Bisect の開始] コマンドを使用して拡張機能 bisect を開始し、次に「問題なし」または「問題あり」を選択して、「問題のある」拡張機能が特定されるまでの様子を示しています。特定されると、その拡張機能の問題を報告するオプションがあります。
「問題のある」拡張機能がどのように見つかったかのステップバイステップ
- Bisect は 24 個の拡張機能をそれぞれ 12 個の拡張機能の 2 つの半分に分割し、後半の 12 個の拡張機能をすべて無効にします。
- このサンプルでは、8 番目の拡張機能が「問題のある」ものであるため、前半であり、無効になっていません。物事はまだ期待どおりに機能していません。まだ問題があるため、拡張機能 bisect はプロセスを繰り返し、最初の 12 個の拡張機能を 2 つの部分に分割します。6 個が有効になり、6 個が無効になります。他のすべての拡張機能も再度有効になります。
- 8 番目の拡張機能は現在無効になっています。物事はうまくいっています。つまり、bisect は後半 (拡張機能 6-11) で続行でき、それらを 3 つの有効な拡張機能と 3 つの無効な拡張機能に分割します。
- 現在、8 番目の拡張機能が再度有効になり、問題が再発しました。これは、bisect が前半で続行することを意味します。これにより、1 つの有効な拡張機能と 2 つの無効な拡張機能に分割されます。
- 8 番目の拡張機能は現在無効になっており、物事は再びうまくいき、bisect は後半で続行し、それを 1 つの有効な拡張機能と 1 つの無効な拡張機能に分割します。
- 8 番目の拡張機能は唯一の無効な拡張機能であり、問題はなくなりました。これは、「問題のある」拡張機能が見つかり、これで完了したことを意味します。
より速くトラブルシューティング
各ステップで、bisect は検索空間を半分に縮小することがわかります。ステップ数は対数時間で実行され、平均および最悪の場合のパフォーマンスは O(log N)
になります。これは、スケーリングが良好であるため、非常に優れています。24 個の拡張機能を使用すると、「問題のある」拡張機能を見つけるまでに 4 ~ 5 ステップかかり、38 個の拡張機能を使用すると、さらに 1 ステップしかかかりません。ただし、最良の場合は悪化します。反復的なアプローチでは、運が良ければ最初のラウンドで「問題のある」ものを見つけることができるからです。
拡張機能 bisect は、正しいフィードバックを提供することに依存していることに注意してください。「問題なし」と常に回答する (最後の拡張機能を非難する) か、「問題あり」と回答する (拡張機能を見つけられない) ことで、簡単にだますことができ、自分自身もだますことができます。
もう 1 つの役立つ洞察は、拡張機能 bisect が有効になっている拡張機能の完全なリストを考慮して開始することです。つまり、開始する前に既知の「問題のない」拡張機能を無効にし、その後再度有効にすることで、bisect から除外できます。ただし、その拡張機能が「問題のある」ものではないと確信している場合にのみ行ってください。
最後に、bisect が余分なステップ (log2(N) + 1
) を実行していることに気付くかもしれません。それは、最初のラウンドですべての拡張機能を無効にすることから開始するためです。この最初のステップは、拡張機能ではなく VS Code 自体が原因で問題が発生している可能性があるため、不必要にウサギの穴に送り込みたくないためです。
それは以上です。拡張機能 bisect を使用する必要がないことを願っています。ただし、拡張機能に関連する可能性のある問題が発生した場合は、トラブルシューティングをより簡単、迅速、そしてより快適にできることを願っています。
Happy Coding,
Johannes Rieken, VS Code プリンシパルソフトウェアエンジニア @johannesrieken