GitHub Code Search で世界中のコードを検索する
GitHub Code Search は GitHub にホストされているリポジトリのコードベースから検索できます。当然のことながら Google 検索などの汎用検索サービスよりソースコード検索に特化したサービスになっています。昨年プレビュー版がリリースされ waitlist で順次利用可能になっていました。
Introducing an all-new code search and code browsing experience | GitHub Changelog
そしてこの度パブリックベータとして一般利用可能になりました。
No more waitlist - code search and code view are available to all in public beta | GitHub Changelog
ポータル
#Code Search のポータルページです。
開発者向けの検索サイトだけあって検索ボックスの下に検索用スニペットが書かれています。リポジトリやパスを指定した検索、BOOL 演算や正規表現を使用する検索などのスニペットがあり、開発者がぱっと見てすぐ使い始められるポータルになっています。
現在 Code Search は GitHub.com に完全に組み込まれているためポータルを経由する必要はありません。
特定パターンのファイルを探す
#検索スコープのデフォルトは All repos
ですが、自分のプライベートリポジトリを含め絞り込みが可能です。
Apache Kafka のリポジトリで Scala のファイルを絞り込む例です。repo:apache/kafka language:scala
ドロップダウンに候補のファイルが表示されます。
ファイルを選択すると、実際のファイルをエディタのビューで開きます。上部の検索ボックスでさらに検索を継続できます。
パスのパターンも指定できるので、コードリーディングなどでファイルの場所にあたりをつけるのに便利そうです。
アカウントやオーガニゼーションを指定して検索する
#筆者のアカウントのリポジトリで、JavaScript の Promise.all
を読んでいる箇所を検索してみました。owner:kondoumh promise.all
のように指定できます。オーガニゼーションに属するリポジトリを検索したい場合は、org:mamezou-tech xxx
のように指定できます。
パブリックなリポジトリも、個人やオーガニゼーションの private なリポジトリもスコープを絞って簡単に検索できるので、「どっかでこんなコード書いたけどどれだっけ?」というケースで役立ちます。
Google 検索との違い
#開発者がフレームワークやライブラリの利用方法を調べる典型的なシーンを考えてみましょう。Google で利用しているライブラリのモジュール名や関数名を入力してブログや StackOverflow を見つけ、そこで適切な情報を得られるかは運次第なところもあります。ブログや StackOverflow の投稿が数年前だとおそらくライブラリのメジャーバージョンが上がってしまっていて現在の作業には役立たない可能性があります。
筆者は先日、Spring Kafka の例外処理方法を調べていました。発生した例外クラスに応じて例外ハンドラークラスを切り替えるためのクラス CommonDelegatingErrorHandler
の使い方がよく分からなかったのですが、公式ドキュメントはおろか、公式ブログや StackOverflow にも利用例が見当たりませんでした。ちょうど Spring Kafka がメジャーバージョンアップしてネットで得られる情報が旧バージョンの情報ばかりだったというのもあると思います。Google で調べていた時期はけっこう前なのですが、この記事執筆中の現在でもあまり目ぼしい情報は出てきません。
この時は、Spring Kafka の Javadoc や実装を読んでなんとか自力解決しました。Google は全ての GitHub リポジトリのインデックスを持っているわけではないでしょうから、ピンポイントのコードを探すのは難しいですね。
Code Search で調べると、Spring Kafka の実装やドキュメントが上位に表示され、実際に利用しているコードも見つかりました。
やはり餅は餅屋というところでしょうか。
Code Search を支える技術
#GitHub のブログに、Code search の背後にあるテクノロジーが解説されています。
The technology behind GitHub’s new code search | The GitHub Blog
これによると、4,500万のリポジトリ(コードは115TB)を検索できるよう、インデックスを Git blob object ID によりシャーディングし、Blackbird という Rust で書かれた検索エンジン・クローラで処理しているとのことです。Git commit などのイベントを Kafka で中継してインデックス更新などの処理を起動しているようです。
最後に
#Code Search で GitHub にホストされたリポジトリのコードをより高い精度で検索できるようになりました。コードを書く上でロジックを考えて実装する部分と、利用するライブラリの適切な使用方法を理解して実装する部分はどうしても違います。Copilot のような AI テクノロジーを使う方法もありますが、リファレンスとなるようなコードを見つけ出し自分が作成しているコードで活用するには Code Search が役立つのではないかと思います。