依存関係を取ることへの恐怖に対処する方法


54

私が所属するチームは、当社のプラットフォームと統合するために会社のパートナーが使用できるコンポーネントを作成します。

そのため、(サードパーティの)依存関係を導入する際には細心の注意を払う必要があることに同意します。現在、サードパーティの依存関係はなく、フレームワークの最も低いAPIレベルを維持する必要があります。

いくつかの例:

  • フレームワークの最も低いAPIレベル(.NET標準)を維持する必要があります。この背後にある理由は、その非常に低いAPIレベルのみをサポートする新しいプラットフォームがいつか登場する可能性があるということです。
  • JSONを(デ)シリアライズするための独自のコンポーネントを実装しており、JWTでも同じことを実行中です。これは、フレームワークAPIの上位レベルで利用可能です。
  • 標準ライブラリのHTTP実装に依存したくないため、標準ライブラリのHTTPフレームワークのラッパーを実装しました。
  • 同じ理由で、XMLとの間でマッピングするためのコードはすべて「手作業で」記述されます。

私たちはそれをやりすぎだと感じています。これは私たちの速度に大きな影響を与えると思うので、これにどう対処するのか疑問に思っています。


20
これには正当な理由(外部要件など)がありますか、それとも無知で行われていますか?
Blrfl

6
コードベースのいくつかの小さな部分で実験を行い、汎用ライブラリーにはならないが、ニーズをモデル化する抽象インターフェースを定義する分離レイヤーを作成します。次に、独自の実装とサードパーティの依存関係の両方をその背後に置き、2つのバージョンがどのように動作/実行するかを比較します。長所と短所を比較検討し、実装を交換するのがどれほど簡単か(またはどれだけ難しいか)を評価してから、決定を下します。要するに、比較的リスクの低い方法で物事をテストし、何が起こるかを見てから決定します。
フィリップミロヴァーノヴィッチ

73
「現在、サードパーティの依存関係はありません」これは、人々がこれを主張するとき、いつも私を笑わせます。もちろんそうです。独自のコンパイラ、IDE、標準ライブラリの実装を作成していません。間接的に(または直接)使用するシャードオブジェクトライブラリを記述していません。依存しているサードパーティのソフトウェアとライブラリがどれだけあるかを理解したら、「依存関係が悪い」という考えを捨てて、車輪を再発明しないで楽しんでください。私はあなたが持っている依存関係にフラグを立てて、それがなぜ受け入れられるのかを尋ねますが、jsonの解析はそうではありません。
UKMonkey

8
それは、プロジェクトを決して終わらせないような、代替の欠点があるということです。しかし、ソフトウェアの仕事と雇用を促進します:)
マーシャルクラフト

5
コモディティソフトウェアを再発明することで労力を無駄にしているのは正しいことです。これは、「すべての依存関係を回避する」ことにも近いという点で間違っています。MicrosoftのExcelチームは、MicrosoftのCチームに依存することを避けるために、独自のCコンパイラを作成しました。オペレーティングシステム、高レベルのフレームワークなどに非常に依存しています。
エリックリッパート

回答:


94

...フレームワークの最も低いAPIレベル(.NET標準)に留まることを余儀なくされています…

これは、自分自身を制限しすぎる可能性があるだけでなく、アプローチでひどい転倒に向かっている可能性があるという事実を強調しています。

.NET Standardはそうではなく、「フレームワークの最も低いAPIレベル」になることはありません。.NETのAPIの最も制限されたセットは、Windows PhoneとSilverlightを対象とするポータブルクラスライブラリを作成することによって実現されます。

対象とする.NET Standardのバージョンに応じて、.NET Framework、.NET CoreMono、およびXamarinと互換性のある非常に豊富なAPIのセットになります。また、.NET Standardと互換性のあるサードパーティライブラリが多数あり、これらのすべてのプラットフォームで動作します。

その後、2019年秋にリリースされる可能性が高い.NET Standard 2.1があります。.NETCore、Mono、およびXamarinでサポートされます。少なくとも当分の間、.NET Frameworkのどのバージョンでもサポートされることはなく、おそらく常にサポートされます。そのため、近い将来、「フレームワークの最も低いAPIレベル」ではなく、.NET Standardはフレームワークに取って代わり、後者によってサポートされていないAPIを持つことになります。

新しいプラットフォームは実際には古いフレームワークよりも高いレベルのAPIをサポートする可能性が高いので、「この背後にある理由は、いつかその非常に低いAPIレベルのみをサポートする新しいプラットフォームが到着する可能性があるということです」

次に、サードパーティのライブラリの問題があります。たとえば、JSON.NETは.NET Standardと互換性があります。.NET Standardと互換性のあるライブラリはすべて、APIバージョンごとに、そのバージョンの.NET Standardと互換性のあるすべての.NET実装で動作することが保証されています。したがって、使用せずにJSONライブラリを作成することで、追加の互換性を実現することはできません。単に自分のために仕事を増やし、会社に不必要なコストをかけるだけです。

そうです、あなたは間違いなくこれをあまりにも遠慮していると思います。


16
「自分自身のためにより多くの作業を作成し、会社に不必要なコストをかけるだけです。」-およびセキュリティ責任。JSONエンコーダーに再帰オブジェクトを指定すると、スタックオーバーフローでクラッシュしますか?パーサーはエスケープ文字を正しく処理しますか?エスケープされていない文字を拒否しますか?ペアになっていないサロゲートキャラクターはどうですか?JSONが2 ^ 64より大きい数をエンコードするとオーバーフローしますか?それとも、eval簡単にバイパスされる健全性チェックを備えた単なる小さなラッパーですか?
ジョンドヴォルザーク

4
「.NETのAPIの最も制限されたセットは、Windows PhoneとSilverlightを対象とするポータブルクラスライブラリを作成することによって実現されます。」私は手足に出て、存在する可能性のあるすべての実装でサポートされていない(そのサブセットには少なくともいくつかのAPIがあると主張します).NetStandard 2.0を最新のフレームワークのターゲットとして使用することは非常に慎重であり、特に限定的ではないようです。2.1への更新は別の話ですが、そうすることを示す兆候はありません。
Voo

別におそらくよりむしろ未満支える未来のプラットフォームから、すべてのもののために開発可能性が起こることは非常に高価である(そして、あなたはとにかく何かを欠場する可能性が高いです)。その代わりに、車輪を再発明せずに開発することは、それが必要なときに何らかの新しい状況に適応するよりも多くの時間節約します。
ジャスパー

51

フレームワークの最も低いAPIレベル(.net標準)を維持する必要があります。この背後にある理由は、その非常に低いAPIレベルのみをサポートする新しいプラットフォームがいつか登場する可能性があるということです。

ここでの理由はかなり逆です。古い、低いAPIレベルは、新しいものよりも廃止され、サポートされなくなる可能性が高くなります。「最先端」の背後にある快適な方法を維持することは、あなたが言及したシナリオで妥当なレベルの互換性を確保するために賢明であることに同意しますが、前進することは極端ではありません。

JSONを(デ)シリアライズするための独自のコンポーネントを実装しており、JWTでも同じことを実行中です。これは、フレームワークAPIの上位レベルで利用可能です。標準ライブラリのHTTPフレームワークに依存したくないため、標準ライブラリのHTTPフレームワークのラッパーを実装しました。同じ理由で、XMLとの間でマッピングするためのコードはすべて「手作業で」記述されます。

これは狂気です。何らかの理由で標準ライブラリ関数を使用したくない場合でも、上記のすべてを行う商業的に互換性のあるライセンスを持つオープンソースライブラリが存在します。これらはすでに記述されており、機能、セキュリティ、およびAPI設計の観点から広範囲にテストされ、他の多くのプロジェクトで広範囲に使用されています。

最悪の事態が発生し、そのプロジェクトがなくなるか、メンテナンスが停止した場合は、とにかくライブラリをビルドするためのコードがあり、それをメンテナンスするために誰かを割り当てます。そして、あなたは可能性が高いですまだあなたが実際にあなたがより多くの後に見て、クリーナー、より保守コードをテストしているでしょうから、あなた自身の圧延したい場合よりもはるかに良い位置に。

プロジェクトが維持されている可能性が非常に高いシナリオで、それらのライブラリにバグやエクスプロイトが見つかった場合、それらについて知っているので、それについて何かを行うことができます-無料で新しいバージョンにアップグレードする、バージョンにパッチを適用するなどコピーを撮った場合は修正します。


3
そして、たとえできなくても、別のライブラリに切り替える方が、独自のライブラリを展開するよりも簡単で優れています。
モニカとの明るさのレース

5
低レベルのものがより速く死ぬという優れた点。それが抽象化を確立する全体のポイントです。
、モニカとの明るさのレース

「古い、低いAPIレベルは、新しいものよりも古くなり、サポートされなくなる可能性が高くなります」。え?NetSTandardsは、私が知る限りお互いの上に構築されています(2.0は1.3 + Xを意味します)。また、標準は単に実装でなく標準です。サポートされていない標準について話すのは意味がありません。その標準のほとんどの特定の実装は将来になる可能性があります(ただし、以前のポイントを参照してください)。ライブラリがNetStandard 1.3以外のものを必要としない場合、2.0に変更する理由はまったくありません
Voo

11

全体として、これらのことは顧客にとって良いことです。人気のあるオープンソースライブラリでさえ、何らかの理由で使用できない場合があります。

たとえば、彼らはオープンソース製品を使用しないことを約束する顧客との契約に署名した可能性があります。

ただし、ご指摘のとおり、これらの機能にはコストがかかります。

  • 市場投入までの時間
  • パッケージのサイズ
  • 性能

私はこれらの欠点を上げ、顧客と話し合い、提供している非常に高いレベルの互換性が本当に必要かどうかを調べます。

たとえば、すべての顧客がすでにJson.NETを使用している場合は、独自のデシリアライゼーションコードではなく製品でJson.NETを使用すると、サイズが縮小されて改善されます。

サードパーティのライブラリを使用する製品と互換性のある製品の2つ目のバージョンを導入する場合、両方での使用を判断できます。顧客はサードパーティを使用して最新の機能を少し早く入手するのですか、それとも「互換」バージョンを使用するのですか?


11
はい、私は明らかに同意し、あなたのリストに「セキュリティ」を追加します。十分にテストされたフレームワークおよび間違いなく標準ライブラリと比較して、特にJSON / JWTのようなもので、コードに脆弱性を導入する可能性があります。
ベルタス

はい、セキュリティとパフォーマンスのようなものが両方の方向に行く可能性があるため、リストを作成するのは難しいです。しかし、仕上げ機能と、内部コンポーネントが完全に機能/理解されていることを保証することとの間には明らかな利害の対立があります
Ewan

12
「彼らは、オープンソース製品を使用しないことを約束する顧客との契約に署名した可能性があります」-彼らはオープンソースである.NET標準を使用しています。製品全体をオープンソースのフレームワークに基づいている場合、その契約に署名するのは悪い考えです。
スティーブン

それでも人々はそれをします
ユアン

7

簡単な答えは、サードパーティの依存関係を導入し始めることです。次回のスタンドアップミーティングでは、来週の仕事が何年もの間で最も楽しいものになることを皆に伝えましょう。JSONとXMLコンポーネントをオープンソースの標準ライブラリソリューションに置き換えます。JSONコンポーネントを置き換えるには3日間あることを全員に伝えます。終わったら祝いましょう。パーティーを開く。これは祝う価値があります。


2
これは頬の舌かもしれませんが、非現実的ではありません。私は、「シニア」開発者(教育部門のみ)がステートマシンライブラリの作成をジュニア開発者に任せていた会社に参加しました。開発者には5か月かかりましたが、まだバグが残っていたため、数日でそれを切り取り、ターンキーソリューションに置き換えました。
いいえU

0

基本的に、それはすべて努力対リスクに帰着します。

追加の依存関係を追加するか、フレームワークを更新するか、より高いレベルのAPIを使用することにより、労力は減りますが、リスクを負います。したがって、SWOT分析を行うことをお勧めします

  • 長所:自分でコーディングする必要がないため、労力が少なくなります。
  • 弱点:特別なニーズのために手作りされたソリューションほどカスタム設計されていません。
  • 機会:市場投入までの時間が短縮されます。外部の開発から利益を得るかもしれません。
  • 脅威:依存関係が増えて顧客を混乱させる可能性があります。

ご覧のとおり、手作りのソリューションを開発するための追加の努力は、脅威を減らすための投資です。これで、戦略的な決定を下すことができます。


-2

コンポーネントライブラリを、依存関係のない「コア」セット(基本的に現在実行していること)と、「コア」およびサードパーティライブラリに依存する「共通」セットに分割します。

そうすれば、誰かが「コア」機能のみを必要とする場合、それを使用できます。

「共通」機能が必要な場合は、それを使用できます。

また、「コア」と「共通」を管理できます。「Common」により迅速に機能を追加し、独自の実装を提供することが理にかなっている場合は、独自の「Core」実装に移動できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.