GVATECHブログ
⛰️

Goのライブラリを新しく導入する際のチェックポイント

に公開

GVA TECHのプロダクトOLGA「AI契約レビューモジュール」のバックエンドはGoで開発しています。

今では恥ずかしい話なのですが、新しいGoのライブラリを導入する際の選定基準は、GitHubのスター数や日本語情報の有無、有名なライブラリかどうかといった、かなりざっくりとしたもので、チーム内での明確な指針もない状況でした😥

気軽に導入自体はできますが、導入後のバージョンアップデート対応や、アーカイブされた際の別のライブラリへの入れ替え作業がとても大変だった経験がありました。そのため、次に導入するライブラリは、できればアーカイブされずに長く使えるライブラリを選びたいという思いから、「選定する際に気を付けるべきポイントとはそもそも何だろう?」という問いに直面いたしました。

そこで、弊社のGoの技術顧問であるtenntennさんに相談し、ライブラリ選定における貴重なアドバイスをいただきました。この記事では、私たちがtenntennさんから学んだ、Goのライブラリ選定で確認すべきチェックポイントをまとめました。

1. そのライブラリが無くなった時に自社でフォークする気概があるか?

導入を検討しているライブラリが、将来的に開発が停止(アーカイブ)されてしまった場合に、自分たちでフォークしてメンテナンスしていく「気概」があるか、という点も考慮する必要があります。

Yesの場合

他の要素も考慮し、導入を検討する価値はありそうです。

Noの場合

弊社の場合は自社だけでフォークしてメンテナンスをする体力は現時点ではない状況なので、Noの場合に該当しました。

この場合、Goのコミュニティに浸透しているものかを確認してみるのもチェックするポイントの一つになりそうです。もし浸透しているものであれば、アーカイブされた際の今後の対策など、コミュニティ内で相談できると思います。

また、検討しているライブラリを使用している他の企業やエンジニアがどれだけいるかという観点では、より多くの企業やエンジニアが使用している方がアーカイブされたとしても一緒にメンテ・相談などしていけることも考えられます。

2. 依存関係と利用実績は健全ですか?

ちなみに、スター数だけで判断するのは危険です。「単純に良さそう」という理由だけでもスターは付く可能性はあるので、スター数での判断だけでなく、以下の観点でチェックすることをおすすめします。

pkg.go.dev でライブラリを検索して「Imported by」を確認

Go公式のパッケージサイトである pkg.go.dev でライブラリを検索し、「Imported by」を確認してみてください。

  • 大きなOSSで使われているか?
  • 有名なライブラリで使われているか?
    これらに該当する場合、そのライブラリは信頼性が高い可能性があります。Webフレームワークの性質上、他のライブラリからの直接の依存は少ないかもしれませんが、汎用ライブラリであれば非常に参考になると思います。

deps.dev で詳細な依存関係を確認

deps.dev は、Goだけでなく様々な言語のパッケージの依存関係やセキュリティ情報、ライセンスなどを視覚的に確認できるツールです。ライブラリのインポートパスを入力して、以下の点を確認しましょう。

  • Security Advisories
    • セキュリティの問題をチェックし、既知の脆弱性がないかを確認します。
  • Score(プロジェクトの健全性を示す指標の一つです)
    • 主に下記をチェックすると良いと思います。
      • Maintained
        • メンテナンスの頻度を確認します。
      • Code-Review
        • どれくらいコードレビューされてソースコードに取り込まれているか、ワンマンなOSSではないかを確認できます。
      • SAST
        • 静的解析のツールが入っているかを確認します。

github.com/labstack/echo/v5 を例にして記載場所を赤線で記しています。

3. プロジェクトは活発にメンテナンスされていますか?

定期的な更新があり、問題が適切に対処されているかを確認することも重要なポイントです。

更新履歴を確認する

pkg.go.dev でリリース頻度と変更内容を確認しましょう。活発に開発が行われているか、破壊的変更(breaking change)の頻度はどうか、などを把握できます。

Issueの状況を確認する

GitHubのIssuesタブを確認し、以下の点をチェックしてください。

  • Issueがどれだけ溜まっているか: 未解決のIssueが異常に多くないかを確認します。
  • Issueがどれだけ消化されているか: 報告された問題が適切に修正されているかを確認します。
  • Issueが放置されていないか: 長期間コメントもなく放置されているIssueが多い場合、問題発生時のサポートが期待できない可能性があります。

コントリビューター(貢献者)の数と活動状況を確認する

GitHubのContributorsグラフを確認しましょう。

  • ワンマンプロジェクトではないか?
    • 一人の熱心な開発者に依存している場合、その人が開発に飽きたり、多忙になったりすると、プロジェクトが停滞するリスクがあります。
  • メインコントリビューターは信頼できるか?
    • 個人のリポジトリである場合、メインコントリビューターが過去にどのような活動をしているか(Goのコミッターであるか、有名な企業で働いているか、など)を確認し、信頼度を測るのも一つの手です。バックに企業がついているかどうかも判断材料になります。

4. 日本語の情報は豊富ですか?

これは技術的な品質とは少し異なりますが
「日本語の情報がどれだけあるか = 運命を共にする人はどれだけいるか?」
という点も非常に重要です。

日本語での情報が多いほど、問題解決のヒントを見つけやすくなります。検討しているライブラリ名で、以下のサイトを検索してみると良いでしょう。

  • Zennの記事
  • 公式ドキュメントの日本語訳
  • Qiitaの記事
  • 個人ブログ

5. 大規模なフレームワークのライブラリを導入する際の心構え

特に影響範囲の大きなフレームワークのようなライブラリを導入する際は、将来的な入れ替えの可能性も考慮に入れる必要があります。

もし、導入したフレームワークが開発停止になったり、別の技術への移行が必要になったりした場合、入れ替えにかかるコストや影響を想定できていますでしょうか? そのコストを許容できるか、あるいはコストを抑えるためのアーキテクチャ設計を検討しているかなど、長期的な視点を持つことが重要となります。

まとめ

新しいGoのライブラリを導入する際は、単に機能が優れているかだけでなく、将来性、コミュニティの活発さ、サポート体制、そして「もしもの時」の対応を総合的に判断することが重要です。これらのチェックポイントを活用し、Goの開発の一助となれば幸いです。

もし、これらのチェックポイント以外にも、あなたがGoのライブラリ選定で重視している観点があれば、ぜひ教えてください!

GVATECHブログ
GVATECHブログ

Discussion