リッチなコードナビゲーション体験の初公開
2018年12月4日 ジョナサン・カーター、@lostintangent
プルリクエストは、何百万人もの開発者にとって毎日欠かせないコラボレーションツールであり、非同期のコードレビューとチームやオープンソースコミュニティ間での知識の共有を促進します。この広範な実用性と採用により、PRレビューワークフローのあらゆる進歩は、開発者の生産性、製品の品質、リリース速度に大きな影響を与える可能性があります。
9月には、GitHubとともに、GitHub Pull Requests拡張機能を発表しました。これにより、開発者は使い慣れた高度にカスタマイズされたエディター内で、コードを記述するのと同じ場所でソースコードをレビューできるようになりました。本日、リッチなマルチリポジトリコードナビゲーションのサポートにより、エディター内でのPRレビューをさらに強化する新しいエクスペリエンスのプレビューを共有できることを嬉しく思います。
表層的なレビューにさよならを
プルリクエストを徹底的にレビューするには、その変更のコンテキストと、それがより広範なコードベースにどのように影響するかを理解する必要があります。今日、多くの開発者はブラウザで「軽量レビュー」を行っていますが、これは非常に便利なワークフローを提供しますが、必要なコンテキストを見落としがちです(例:「この変更はAPIの利用者を壊しますか?」)。GitHub Pull Requests拡張機能は、開発環境の機能を活用してレビュー対象のソースコードを構築およびナビゲートできるようにすることで、そのエクスペリエンスを改善しましたが、それでもローカルでブランチをチェックアウトし、必要なプラットフォームSDKと言語拡張機能をインストールする必要があります。これをすべてのPRで行うには、かなりの時間とコンテキストの切り替えが必要となり、リモートPRを迅速にレビューする便利さと、ローカルエディターでレビューする強力さのどちらかを選択することになります。私たちは開発者が両方を持つべきだと考えています。
構築中のリッチなコードナビゲーション体験は、開発者が開発環境内(Visual StudioおよびVisual Studio Code拡張機能経由)で関心のあるプルリクエストを追跡し、いつでも、これらのトピックブランチをローカルでチェックアウトすることなく、リモートホストされているPR間での変更をシームレスにナビゲートできるよう支援します。具体的には、GitHub Pull Requestsビューから開くファイルを、他のエディターエクスペリエンス(例:ホバー情報、定義に移動、すべての参照を検索)を駆動するのと同じコードナビゲーション機能で強化しますが、この場合は完全にクラウドによって駆動されます。これにより、チームの生産性が向上し、表層的なレビューが過去のものになると信じています。
C#拡張機能や.NETがインストールされていなくても、macOS上でC#ベースのPRをナビゲートしています。
C++拡張機能がインストールされていなくても、macOS上でC++ベースのPRをナビゲートしています。
Java Language Support (redhat.java) 拡張機能がインストールされていなくても、macOS上でJavaベースのPRをナビゲートしています。
あらゆるものをナビゲート
このエクスペリエンスにより、レビューしているファイル内で定義されているシンボル(例:クラス、関数、プロパティ)、PRの一部として変更された他のファイル内、および同じリポジトリ内の任意のファイル内をナビゲートできます。これにより、PRの範囲やローカル環境によって、コードベース全体のコンテキストで変更を理解する能力が制限されません。
さらに、レビュー中のPRが外部リポジトリの依存関係を利用している場合や、外部リポジトリのコードによって使用されるAPIを含んでいる場合、それらのソースにも直接ナビゲートできます。これにより、アプリケーションがバージョン管理でどのように整理されているかにかかわらず、変更の影響を完全に、そしてより重要なことに迅速に評価できます。これは特に、多くのチームがマルチリポジトリアプリケーション/マイクロサービスを構築し、OSSに大きく依存しているため、非常に強力な機能であると信じています。
observable 関数の外部参照から、GitHub上のMobX リポジトリに直接ナビゲートしています。
コミュニティ重視のデザイン
舞台裏では、このエクスペリエンスはLanguage Server Protocol (LSP) への追加によって駆動されています。LSPは、Visual StudioやVisual Studio Codeなど、多くのツール全体で言語サポートの基盤となっています。Language Server Index Format (LSIF、「else if」のように発音) と呼ばれるこの提案は、言語サーバーがそのランタイムインテリジェンスを永続化するための手段を提供し、それによってLSPリクエスト(例えば、ホバーや定義に移動)に大規模に応答するために後で使用できるようにします。さらに、LSIFが定義するデータモデルは、ソースコードのリッチなグラフ、およびそのコードが外部リポジトリと持つ関係によってリポジトリを表現できるようにします。
このサービスの構築の一環として、さまざまな言語(TypeScript、Java、C++、C#)のLSIFサポートの実装を開始しており、これまでの結果に非常に興奮しています。しかし、この取り組みを成功させるには、標準と追加の言語実装の両方でコミュニティと協力することが不可欠です。LSIFの詳細を学び、この会話に貢献するには、LSIF仕様の草案をチェックしてください。
皆様からのフィードバックが必要です!
リッチなコードナビゲーション体験の最初の外観を共有できることを嬉しく思います!これが試せるようになるまでにはまだ多くの作業が残っていますが、私たちが取り組んでいることについてコミュニティとのオープンな会話を始めたいと思いました。私たちのチームとチャットし、潜在的なプレビューに参加することに興味がある場合は、こちらからサインアップできます。近い将来、さらなる最新情報を共有することを楽しみにしています!
ハッピーレビュー!
ジョナサン、@lostintangent