web-dev-qa-db-ja.com

ソフトウェアライブラリがすべての問題を解決しないのはなぜですか?

モジュラープログラミングと再利用可能なソフトウェアルーチンは、1960年代初頭から存在していましたが、それ以前ではありませんでした。 これらはすべてのプログラミング言語に存在します。概念的には、ソフトウェアライブラリはプログラムのリストであり、それぞれに独自のインターフェイス(エントリポイント、出口ポイント、関数シグネチャ)があります。 )および状態(該当する場合)。モジュールは狭い問題の解決に重点を置いており、インターフェイスが明確に定義されているため、ライブラリは高品質であり、ライブラリを使用する将来のすべてのソフトウェアプログラムでコストを償却できます。ライブラリは純粋に付加的なものです。新しいモジュールを追加しても、既存のモジュールにバグや制限が生じることはありません。

では、なぜソフトウェアライブラリがすべての問題を解決しないのでしょうか。なぜソフトウェアを高品質のソフトウェアモジュールの単なる構成として書くことができないのですか?

ソフトウェアライブラリでこれらの問題を修正し、高品質のプログラムをより速く作成するためのこの信じられないほど強力なメカニズムの可能性を最大限に引き出すことができますか?それとも、これらの問題は図書館に固有のものであり、決して解決することはできませんか?

注:いくつかのコメントは、質問が多すぎると言っています。上記の質問を実際の質問として扱い、その後のすべてを議論のポイントとして扱ってください。

ソフトウェアライブラリが広く使われているのは事実です。 C、Java、Pythonなどのプログラミング言語には、膨大なソフトウェアライブラリがあります。しかし、多くの問題があります。

  1. 一部のよく知られた言語は、理想的とは言えないライブラリサポートを備えています(C++、LISPなど)。これは、仮想マシンプラットフォーム(JVM、CLRなど)に便乗することである程度軽減されます。当然の質問ですが、ライブラリのサポートを強化するために、将来のすべてのソフトウェアを仮想マシンプラットフォーム用に作成する必要がありますか?これは、毎回仮想マシンを起動するコストを負担したくないスクリプトにとっては問題があります。
  2. 「車輪の再発明」はたくさんあります。リンクリストモジュールをCで書いたことがありますか?はい、もちろんあります。 Cでリンクリストを書くのは好きではありませんが、代替手段は何ですか?
  3. 特定のライブラリ(例:libfoo-0.1.2)は、重要なソフトウェアを作成するための基礎として信頼できますか?ライブラリはテストされ、文書化されており、必要な機能が実装されていますか?どうやってわかりますか?
  4. ライブラリのAPIを学ぶことは、まったく新しいプログラミング言語を学ぶことと同じくらい時間がかかる可能性があります。
  5. ライブラリでバグが発見された場合、ソフトウェアのバグを修正するための適切な手順は何ですか?バグ修正はすべてのライブラリユーザーにどのように配布する必要がありますか?
  6. ライブラリはどのように構築および配布する必要がありますか? (たとえば、autotoolsは明らかにそれを間違えました。) セマンティックバージョニング は良いですが、これをどのように検証して実施できますか?
  7. ライブラリの依存関係はどのように処理する必要がありますか?自動的にダウンロードしてインストールできますか?バージョンとライセンスには互換性がありますか?
  8. 特定のライブラリのライセンスはソフトウェアと互換性がありますか?どうやってわかりますか?
  9. ソフトウェアを起動する前にライブラリが破棄された場合はどうすればよいですか?ソフトウェアを起動した後はどうですか?
4

ライブラリは素晴らしく、確かにたくさんの問題を非常に迅速に解決します。ただし、すべての問題を解決することはなく、多くのライブラリを結合するだけでは、多くの特定のユースケースを解決するのに十分ではありません。

プログラマーはタイピストではありません。私たちは 以前にその議論をしました 。すべてのライブラリ、フレームワーク、およびすぐに使用できるソリューションにもかかわらず、フレームワーク、ライブラリ、またはSaaS製品では実行されない)が常に何かあります。データを別の方法で保存する必要があります。データをより速く読み取る必要があります。ライブラリが行わない方法で入力を検証する必要があります。

かなりの規模のプログラミングプロジェクトでは、解決する必要のあるいくつかの問題があります。これは、ユースケースに固有であるか、非常に珍しい、またはライブラリがないほど複雑/単純ですそれを適切にカバーします。独自のコード、独自のオブジェクト、あるいは独自のライブラリやフレームワークを作成する必要があります。

また、ビジネス上の理由ライブラリが使用されていないか使用できないこともたくさんあります。ライセンスが原因で、このライブラリを使用できない可能性があります。たぶん、ソースを信頼しないか、ソースを変更する必要があり、変更されたライブラリを信頼しません。たぶん経営者はすべてのコードは会社によって純粋に所有され、作成され、維持される必要があると信じています。しかし、さまざまな理由(良い、悪い、偽り)のために、多くのITショップは、できるだけ多くのライブラリを使用しないか、使用できません。

これらの問題のいくつかは、単に修正することができません。一部の管理タイプ(またはコーダータイプ!)は、単に所有していないコードを信頼することはありませんライブラリの品質がドグマに勝ることはありません。

他の問題(ライブラリの品質、ライセンス)はより解決可能ですが、問題の事実は、法的および実際的な影響が大きく複雑であることが多いということです。すべてのライブラリがパブリックドメインになり、すべての可能な機能を含みながら100%安定するまで(完璧なパフォーマンスで!)、常にを使用するのではなく、独自のコードを作成する理由があります。図書館。

これは、ライブラリがより良いプログラムをもたらさないということではありません。ライブラリは多くの問題を解決し、同じ問題を際限なく解決してデバッグしたり、ハッキングされたソリューションに取り組んだりすることを防ぎます。しかし、実際的な障壁は、それらが万能薬になることは決してないことを意味します。

11
Ben Brocka

ライブラリは、誰かが持っていた目的に合うように誰かによって作成されました。ライブラリを使用して解決したい問題のように聞こえるかもしれませんが、正確な使用法に適合しない場合があります。ライブラリを検討するときは、それを評価する必要があります。

開発者としてのあなたの責任の1つは、ライブラリがソフトウェアにどのように適合するか、そしてソフトウェアとライブラリをうまく連携させることができるかどうかを考えることです。確かに、経験を積むにつれて簡単になりますが、図書館で白紙の状態になっていると、初期の立ち上げ時間が長くなります。

そうは言っても、私はあなたの質問が面白いと思ったので、私はそれらに答えることに挑戦しました。

よく知られている言語の中には、ライブラリのサポートが非常に貧弱なものがあります(C++、LISPなど)。これは、仮想マシンプラットフォーム(JVM、CLRなど)に便乗することである程度軽減されます。当然の質問ですが、ライブラリのサポートを強化するために、将来のすべてのソフトウェアを仮想マシンプラットフォーム用に作成する必要がありますか?これは、毎回仮想マシンを起動するコストを負担したくないスクリプトにとっては問題があります。

「非常に貧しい」と定義します。 C++には boostqtWindowsMFCおよびWin32APIpocoWxWidgets 、およびこれらは、たとえばJava APIで取得するものと同様の、一般的な使用フレームワークとライブラリです。CLRを考慮しなくても、さまざまな目的でC++ライブラリがあります。またはJVM。さらに、C++-eyをもっと感じたい場合は、そこにある多くのCライブラリ(glib、curl、Apache Portable Runtime)を利用して、C++でラップすることができます。

ただし、LISP。 LISPには多くの種類があります。 Clojure(CLRおよびJVM上)のような最新のLispがあり、それぞれのプラットフォームを利用できます。標準としてのCommonLISPには多くの実装があり、CommonLISPでソフトウェアを構築している企業が世の中にあることを私は知っています。しかし、ライブラリのサポートの種類については十分にわかりません。

また、VMベースの言語を使用する必要があるかどうか。それは本当にあなた次第であり、あなたが何を使いたいか、そしてあなたの会社/雇用者/チームが何に問題がないかはあなた次第です。私は、仕事に適したツールであると思うものと、特定のタスクで生産的になっているものを使用します。

私はPythonとRubyを多用します。なぜなら、他の人が理解しやすく、彼らの中ですぐにタスクを実行できるからです。

「車輪の再発明」はたくさんあります。リンクリストモジュールをCで書いたことがありますか?はい、もちろんあります。 Cでリンクリストを書くのは好きではありませんが、代替手段は何ですか?

私は持っていますが、学術的な演習としてのみです。 Cのリンクリストのようなデータ構造を提供する広く使用されているライブラリがいくつかあります。つまり、 Apache Portable Runtime および glib です。

一般的な代替策は、見る前に飛躍しないことです。すべての言語で再発明が見つかります。その多くは、既存のソリューションに関する知識が不足していることが原因である可能性があります。

また、言語とライブラリは時間とともに進化します。ある時点でニーズに完全に適合するライブラリを見つけることはできません。特定の分野では、アルゴリズムによる発明が非常に一般的である可能性があります。

特定のライブラリ(例:libfoo-0.1.2)は、重要なソフトウェアを作成するための基礎として信頼できますか?ライブラリはテストされ、文書化されており、必要な機能が実装されていますか?どうやってわかりますか?

使用法、コミュニティ、メンテナンスアクティビティに基づいており、必要に応じて、バグ/タスクキューをチェックして、スムーズに進行するかどうかを確認します。商業的にサポートされている場合は、積極的に更新されているかどうかを確認したいと思います。また、信頼できる開発者や、特定のライブラリが他のライブラリよりも大幅に多く言及されているStackOverflowなどのコミュニティからの推奨事項も参考にしています。

Boostやqtなど、間違いなく信頼できるライブラリがあります。Googleが独自の食べ物を食べ、独自のコードを内部で使用して、取得する数十億ギガバイトのデータを処理することを知っているので、Googleの機能が正しく機能することを信頼します。日。

他のことについては、私はそれを評価し、コードを読み、それを調整するか、それが不適切な場合は廃棄します。

ライブラリのAPIを学ぶことは、まったく新しいプログラミング言語を学ぶことと同じくらい時間がかかる可能性があります。

特に他の言語や同様のパラダイムの経験があれば、言語は簡単に習得できます。最終的には、ロジックをテキストで表現し、コンパイラー/インタープリターがあなたの意味を理解していることを確認することになります。

これは不十分なドキュメントの要因である可能性があります。または、かなりスコープが設定されたフレームワークを使用しています(Java APIなど)。ただし、秘密は、必ずしも100を学習する必要はありません。ライブラリの%はそれを効果的に使用しています。私は自分自身が熟練したJava開発者だと思いますが、Java APIの一部には触れたことがないので、触れていません。する必要がありました。

単一目的のライブラリは、その点で習得が容易です。機能が制限されており、ドキュメントが単純であることが望まれます。

ライブラリでバグが発見された場合、ソフトウェアのバグを修正するための適切な手順は何ですか?バグ修正はすべてのライブラリユーザーにどのように配布する必要がありますか?

私はこれについて多くの経験があります(Solarisでブーストを機能させる、AIXでブーストを機能させる、グラフィックライブラリなどのその他の多くのものをSolarisで機能させる)。それを修正するのは簡単な部分です。

これがプロプライエタリコードである場合、マイナーな問題であれば、私の会社はパッチリリースのようなことをします。基本的に、一連の修正が1つにまとめられ、新しいパッチがリリースされたことをメールでお客様に通知しました。

重大な問題または顧客ごとの問題については、修正がクイックパッチに入れられ、パッチを適用したファイルだけをユーザーに配布するか、パッチを適用したクイックリリースをリリースします。

オープンソースプロジェクトの場合-プロジェクトのバグトラッカーにチケットを提出し、修正した場合は、修正の推奨事項とパッチを送信します。

ライブラリはどのように構築および配布する必要がありますか? (たとえば、autotoolsは明らかにそれを間違えました。)セマンティックバージョニングは良いですが、これをどのように検証して実施することができますか?

autotoolsはクマですが、 cmake のように、最新のmakeシステムの方が優れています。 Apache Mavenに似たものがあり、これらのシステムを使用して配布物をビルドおよびパッケージ化できます。 Ruby Mavenの代替(mavenと互換性があります)であるbuildrも好きです。

ライブラリの依存関係はどのように処理する必要がありますか?自動的にダウンロードしてインストールできますか?バージョンとライセンスには互換性がありますか?

Cmakeまたはmavenを使用すると、依存関係を処理するのに役立ち、mavenはリモート依存関係またはローカルサーバーから取得できます。 cmakeでも同じことができますが、これらのビルドシステムの両方に依存関係を伝える必要があります。バージョン管理とライセンス供与は主にあなたの仕事ですが、パッケージマネージャーを備えたLinuxのようなシステムを使用している場合は、これを軽減できます。

特定のライブラリのライセンスはソフトウェアと互換性がありますか?どうやってわかりますか?

ライセンスはソフトウェアの問題ではなく合法であるため、ここではデューデリジェンスが必要です。システム内のさまざまなもののライセンスが何であるかを確認できます。 FSFのライセンスリストとコメント のようなサイトがあり、さまざまなライセンスとGPLの互換性についてFSFが解釈しています。また、弁護士にご相談ください。

ソフトウェアを起動する前にライブラリが破棄された場合はどうすればよいですか?ソフトウェアを起動した後はどうですか?

ソフトウェアを起動する前に放棄された場合は、それがまだ役立つかどうかを評価し、バグリストを確認してください。あなたはメンテナに連絡してプロジェクトを引き受けることを申し出ることができます。

後で放棄された場合は、続行する価値があるかどうかを判断できます。コードに深く埋め込まれていないため、ある程度の努力で切り替えることができない場合があります。もちろん、それが問題であり、古いバージョンに固定されているソフトウェアもあります。ただし、プロジェクトを自分の翼の下に置いて、ニーズに合わせて調整することもできます。メンテナに連絡してください。

4
wkl
  1. 言語によって異なります。 JRubyはRubyとパフォーマンスの競争力がありますが、JVMでCを実行することは望ましくありません。

  2. 私はCの専門家ではありませんが、「リンクリストライブラリC」をグーグルで検索すると、いくつかの結果が見つかります。

  3. 私は、バッキング(Googleが使用しているライブラリか、あいまいなライブラリか)、アクティブか(サポートされている可能性が高い)、オープンソース(バグを修正/自分で拡張できるか)に基づいてライブラリを信頼しています。

  4. ライブラリAPIの学習には多くの時間がかかります。幸い、特定の問題を解決するために必要なことを学ぶだけでよく、パラダイムの多くはライブラリ間で同じです(データ構造名、ファイルIOなど)。

  5. バグを修正し、修正を送信します。それが次のリリースに含まれることを願っています、そうすれば誰もが最終的にそれを手に入れるでしょう。その間、同じ問題をグーグルで検索する人々はあなたの修正を見つけるでしょう。

  6. これについて何を求めているのかわからない。

  7. ここで考えられる多くの答えは、ApacheMavenが興味深いものです。私はそれについて行くための1つの「正しい」方法があるとは思いません。

  8. Googleライセンス。ソフトウェアが商用またはクローズドソースになる場合は、オプションが制限される可能性があります。

  9. ソフトウェアを起動する前に、使用するライブラリの決定を延期することができますが、アクティビティのレベルが高いライブラリを選択するようにしてください。ソフトウェアを起動した後、実装を置き換えることができるように、危険なライブラリをレイヤーでラップしたことを願っています。そうでない場合は、自分でサポートを開始する必要があります。

正直なところ、これらのどれも、ソフトウェアライブラリがすべての問題を解決しない理由ではありません。その理由は、問題は常に変化し、進化しているからです。動的なWebサイト、モバイルデバイスへの移行、ドメイン内のあいまいな問題の解決など、それを実行するライブラリがあれば、企業は複数のプログラマーを雇う必要はありません。

1
Garrett Hall

まず第一に、すべてのアプリケーションだけでなく、ほとんどの人が認めているよりもはるかに多くのコードの再利用があります。最新のCMSを使用してWebサイトを作成してみましたか? 「高品質のソフトウェアモジュールの単なる構成」は完璧な説明です。

インターフェイスの一般的な適用性とその複雑さの間には、固有の結合があります。すべてのコンテナを終了するコンテナを作成したいとします。真ん中にO(1)挿入する必要がある人、高速ルックアップが必要な人、永続ストレージが必要な人、スペース効率が必要な人などがいるため、インターフェイスは配列ほど単純ではありません。そして、それらのニーズを特定して運用する方法が必要です。

ライブラリでやりすぎを試みると、インターフェイスはプログラミング言語自体に匹敵する複雑さになるため、適用範囲の狭いインターフェイスを作成し、プログラミング言語を接着剤として使用することもできます。これはまさに私たちが持っているものです。完了しました。

1
Karl Bielefeldt

ソフトウェアライブラリがすべての問題を解決できない理由は、ソフトウェアライブラリがソフトウェア開発者の問題の多く(すべてではない)を解決するだけだからです。 ソフトウェアユーザーの問題を解決しません!

あなたの組織が世界が必要だと判断したとしましょう 本当に良い3Dビジュアルインタラクティブ航空宇宙設計アプリケーション ?あなたは、ソフトウェア開発者として、既存の3Dグラフィックライブラリから始めることもできます。この厳密なアプリケーションの場合、必要なすべてを実行するライブラリがないことはほぼ確実です。既存のものを拡張する必要があります。そして確かに、「ボーイング747またはエアバス380の設計」ライブラリはありません!このアプリケーションの開発には何年もの作業が必要です。

あなたが家具職人であるとすると、顧客は自分が作成したいキャビネットの手描きのスケッチを持ってきます。あなたは木工の本でいっぱいの棚と良い木工道具でいっぱいの店を持っています。

ツールと本は役に立ちますが、あなたはまだキャビネットを作らなければなりません!

1
Jim In Texas

では、なぜソフトウェアライブラリがすべての問題を解決しないのでしょうか。なぜソフトウェアを高品質のソフトウェアモジュールの単なる構成として書くことができないのですか?

人々はこれを毎日簡単にしようとしていますが、私が考えることができる最大のハードルは次のとおりです。すべてのサードパーティソフトウェアライブラリは、データの保存方法とはまだ切り離されています。

サードパーティのPDFライブラリは、私の本のテーブル、著者のテーブル、およびその著者の価格の合計からPDFを作成したいことをどのように知ることができますか?

ORMはこれに取り組むのに役立ちますが、それはあなたが望んでいる感覚的なコンポーネントに欠けています。

また、より簡潔な質問を考え出すようにしてください。たくさんの質問があるので議論は難しいです。

0
brian

他の回答で明確に説明されていないのは、関連するライブラリを効率的に見つけて活用する方法です。利用可能なすべてのライブラリが http://code.google.com/hosting/ で検索可能であったとしても(もちろんそうではありません)、プログラマーがその検索プロセスを完了するのに、すでに手元にあるライブラリを使用して、許容できるソリューションを即興で作成します。

数学者は、すでに証明されている数学の定理を見つけるために同様の問題を抱えています。その目的のために「数学的な知識管理」ソフトウェアを完成させた人はまだいません。問題の側面は、自動化の可能性を超えている可能性があります。概念的な極端なケースは、ホルヘルイスボルヘスの「バベルの図書館」であり、すべてのもの、およびすべての可能なすべてのバリエーションがコレクションに含まれています。次に、コレクションからアイテムを説明する唯一の明確な方法は、それを再作成することです。

編集:そして、ソフトウェアライブラリの多くのバリエーションから選択しなければならない可能性について述べたところで、非常に関連性の高い例は、スペース(データストレージ)と時間(CPU使用率)の間のさまざまなトレードオフです。

編集2:OK、私のバベルの図書館の観察は数学的に正しくありません。そのカタログ内の興味のあるアイテムに名前を付けることができます。しかし、チャイティン-コルモゴロフの複雑さについて私が理解していることは、そのような命名システムには、完全なコンテンツと同じくらい簡潔な名前の多くの(おそらく不要な)情報リソースが残っていると私は信じています。

0
minopret