Perham本記事は、原著者の許諾のもとに翻訳・掲載しております。本記事はRubyについて書かれたものではありますが、Python、JavaScript、Javaなど、全ての言語コミュニティに当てはまる事実を述べたものです。依存関係が引き起こす負の連鎖は誰のためにもなりません。上の図は、私がこれまでに使用した全てのRailsアプリの依存関係を可視化したものです。以下の例はいずれも、どこかで聞いたことのあるものではないでしょうか。何百ものエントリを含むGemfile本番環境で読み込まれるテスト用Gem数百メガバイトもRAMを食うRailsのプロセスRubygemsシステムは、それを再利用する誰もが容易にRubyのパッケージを作ることができるという点で、賞賛に値するものです。その便利さが意味するところは、そうしたGemと他のGemを非常に安易に結び付け、さらにそれが、「インターネットでダウンロード」され、数百もの依存関係を持つRailsアプリにつながるということです。Rubygemを公開するときには、あなたのGemを使用している全てのアプリとの依存関係がどんどん雪だるま式に増えていくということになります。これにより、そうしたGemに含まれるバグが及ぼす影響は倍数的に増えることになるのです。mime-typesの興味深いケースmime-typesというGemは最近、メモリ使用量を最適化し、数メガバイトもRAMを軽くすることができました。この最適化による恩恵はまさに、既存のRailsアプリ全てにあると言えます。結果的にRailsはmime-typesのGemに依存しているからです。mime-typesつまり、このGemはアプリによって使われていたわけではなかったのです。RailsもActionMailerもこのGemを直接は使用していませんでした。このGemは、ActionMailerの実装の奥深くで使われていて、あまりにも多くのメモリを使用していました。存在するあらゆるのRailsアプリが、この問題により10MBものメモリを使用していたのです。アプリの開発者たち、よく聞いて!依存関係のせいで、あなたのアプリは膨れ上がり、不安定になり、モンキーパッチやバグの多いネイティブコードがおかしな振る舞いを引き起こす可能性があります。Railsアプリに依存関係を追加する場合、まずはさっとサニティチェックをするといいでしょう。望ましい順番に以下にリストします。