web-dev-qa-db-ja.com

作成したプログラムがどのように機能するかを知らずに生活してもいいですか?

つまり、行き詰まって問題の解決方法がわからない場合や、使用しているプログラミング言語の知識がある場合に問題を解決できる非常に便利なライブラリがあります。たとえば、Boost for C++またはJQuery for JavaScriptまたはSpring for Java ...彼らは数秒で問題を解決し、あなたは彼らがどのようにそれをしたのか本当に気にしません(彼らがあなたがプログラミングしているものと同じ言語で書かれているにもかかわらず)...私の問題の解決策を一から書くことができますか、それとも標準的な方法ですか?

17
Kabumbus

自分で問題を解決する方法を理解せずに、代わりにライブラリを使用することは問題ありませんか?

一般的には、そうではありません。

ライブラリは、問題を解決する方法を理解し、ソリューションをデバッグし、それを維持するという(困難な)作業を省くことができます。ただし、それを使用する場合は、それがどのように機能するか、なぜソリューションが実際に問題を解決するのかを理解するようにしてください。メカニックとして作業している場合、自動車、エンジン、自動車のエンジンを構築するロボットを発明する方法を知っている必要はありません。合わせて!

これが、多くの人々が非常に専門的になるのを見る理由です-多くの場合、単一の言語、単一のプラットフォーム、単一のフレームワーク、およびライブラリのセットを扱う方法を学ぶだけです。

そうは言っても、学ぶことができるのはtimeだけです。時々あなたは近道をしなければならない-それらを連れて行くが、彼らは近道であることを知っています。たぶん、時間があれば、ライブラリについて十分に読んで、それを理解できることを知っているだけかもしれません。または、実際に呼び出す必要のある2つの関数のみを理解し、正しく呼び出すために十分な場合もあります。これは、代償を払うことになるショートカットです。通常は後で、誰か(おそらく年配で経験豊富なあなた)がコードを修正する必要があります。

22
blueberryfields

はい-そして私たちは皆それをします!

たとえば、Mac関連のグラフィックスコードで修正していた非常に単純なバグを考えてみましょう。バグの周りのコードにはいくつかのステップが含まれていました:

  1. まず、Objective Cメソッドはmalloc()を使用してピクセルバッファーを割り当て、それをObjective Cオブジェクトにアタッチします。
  2. その後、何かが起こり、CルーチンがObjective Cオブジェクトにメッセージを送信し、ピクセルバッファーを取得します。
  3. Cルーチンは、jpeglibを使用してピクセルバッファーの内容を圧縮し、TCP/IP接続を介して送信します。

そこには恐ろしいことがたくさんあります!ここにいくつかあります:

  • Malloc()を実装する動的メモリアロケータ。これは、メモリが物理的に隣接しており、線形にアドレス指定できることを前提としています。
  • 断片化された物理RAMとディスク領域(RAMとは異なる物理デバイス)の両方を、物理的に連続して線形にアドレス可能なRAMのように動的メモリアロケーターに表示されるものにマップする、基盤となるDarwinカーネル仮想メモリシステム。
  • Objective Cのオブジェクトシステム
  • Mac OSランタイムメッセージングシステム、およびそれがObjective Cオブジェクトと対話する方法
  • 離散コサイン変換アルゴリズムを使用するjpeglibライブラリのJPEG非可逆ラスター画像圧縮標準の実装
  • さまざまなTCPおよびIPプロトコルの実装を介して呼び出されるデータを送信するためのユーザー空間ネットワーキングルーチン。次に、OSカーネルを呼び出すIPプロトコルの実装。次に、何を有効にしているかネットワーキングでは、イーサネットポートのドライバー、wi-fiチップ、または異常にUSBまたはFirewireドライバーを呼び出すことがあります。

これらすべてが実際にどのように実装されているか、すべての詳細を理解していますか?私はそうしないでください!地球上には非常に多くの人々がいるのではないかと思います。だから私はそれについて心配しないでください。

しかし、好奇心を持ち、使用するライブラリとツールについて少なくとも少し学ぶことは良いことです。最初にプログラミングを始めたとき、コンパイラとオペレーティングシステムは魔法ではあり得ないことを知っていましたが、確かにそれらはそのように思えました。それらに対する私の好奇心を味わうことによって、私はひどい多くを学び、これまで素晴らしいキャリアを積んできました。

13
Bob Murphy

一度computerworld.com.a質問Bjarne Stroustrup「新進気鋭のプログラマーに何かアドバイスはありますか?」
そして彼は答えました「コンピュータサイエンスの基礎を知っています:アルゴリズム、マシンアーキテクチャ、データ構造など。ただ盲目的にコピーしないでくださいアプリケーションからアプリケーションへのテクニック。あなたが何をしているのか、それが機能するのか、そしてなぜ機能するのかを知ってください。5年後に業界がどうなるのか、それからあなたが何をするのかわからないので、ポートフォリオを集めてください一般的で有用なスキル。より優れた、より原則に基づいたコードを作成してください。「プログラミング」をより専門的な活動に、より低レベルの「ハッキング」活動をより少なくするように努力してください(プログラミングも技術であり、技術ではありません)。現場の古典やより高度な教科書から学びましょう。簡単に消化される「ハウツー」ガイドやオンラインドキュメントに満足しないでください。
True Programmerに何が必要で、誰が必要に必要であるかについての疑問が明確になれば幸いです。

13
Ranger

私たちがライブラリを使用する主な理由は、解決しようとしている問題を抽象化して、常に「車輪を再発明」するのではないことです。自分で問題を解決しようとすることもできますが、それにはもっと時間がかかります。

ただし、ライブラリによって問題がどのように解決されるかを知る必要があると私は思います。これは通常、ライブラリのユーザーマニュアルに記載されており、オープンソースソフトウェアを使用すると、いつでも自分でコードを確認できます。

また、通常は難しい部分を抽象化して問題を解決するので、どうして問題ないのでしょうか。

5
Spoike

ライブラリは、一般的な問題の解決策を提供するためにあります。あなたは彼らがあなたが解決している特定の問題を解決するかどうかを決定する必要があります。問題を解決する方法を知らないことの代わりにはなりません。たとえば、アプリケーションにハッシュテーブルが必要な場合、ハッシュテーブルが解決する問題を理解するための十分な知識が必要です。使用しているライブラリのパフォーマンスを評価して、アプリケーションで機能するかどうかを判断できる必要があります。ライブラリを使用して不十分な技術知識をカバーすることは、正しいユースケースではないと私は信じています。ライブラリを使用するかどうかの決定は、ライブラリを使用すると開発がスピードアップし、テスト済みの信頼できるソリューションが提供されるかどうかを中心に展開する必要があります。ライブラリを使用するという決定は、プログラマーが特定の問題を解決できないことを巡ってはなりません。

5
Pemdas

本当にあなた次第

作業しているツールをよく理解すればするほど、それらを活用できるようになります。

たとえば、jQueryを使用することはほとんどありませんが、jQueryを利用する必要がある場合は、それを利用して、Mootoolsなどの他のフレームワークと共存させる方法を知っています。

また、すぐにUDKを使ってgamedevに冒険するつもりです。理解すればするほど、悪意に曲げることができるようになりますが、簡単なチュートリアルに従うこともできます。 最初の、少し余分な時間と脳のサイクルを選択すると、より良い簡単な結果が得られます

5
dukeofgaming

あなたの領域とプロセスのあなたの部分を知ることは重要です。

たとえば、画像処理ライブラリを使用しているとします。ガウスぼかし、変換、色空間についてすべて知っている必要がありますか?いいえ。しかし、最初にライブラリを使用している理由をなぜ知る必要があります。または、フレームワークのソート機能。使用される実際のソートアルゴリズムを知る必要がありますか?ほとんどの場合、違います。しかし、データをソートする必要がある理由を知る必要があります。

一方、コンパイラを作成している場合は、コンパイラがどのように機能するかをよく理解できます。これは、プロセス内の自分の部分であるためです。

JQueryのような特定のフレームワークは、多くのことを抽象化します。 が正確に機能していることを知る必要がありますか?いいえ。しかし、ライブラリが行っている what についての根本的な理解を深めることは、コードを書くときに非常に有益です。 、それを最大限に活用することができます。

5
GrandmasterB

もう1つの視点はセキュリティです。正確な内部の仕組みがわからないライブラリを使用する場合は、何が起こっているのかを推測します。想定が失敗するたびに、悪意のある攻撃者に攻撃ベクトルが開かれる可能性があります。

クイックソートを呼び出すときは、最悪の場合の動作に注意する必要があります。それ以外の場合、攻撃者は最悪のケースのデータを挿入し、DoSを実行できる可能性があります。

圧縮ライブラリを呼び出す場合、一部のデータが少ないバイトに圧縮される場合、元のバイトよりも多くのバイトに「圧縮」されるデータが存在する必要があることに注意する必要があります。したがって、出力バッファーは[少ないバイト数に]圧縮するため、入力データのサイズのみが必要であると想定すると、バッファーオーバーフローが発生するのを待っています。

あなたは自分の仮定が真であることを証明できるようにするために、あなたがやろうとしていることについて十分な基礎を知っているべきです。そうでない場合、ライブラリはこれを明示的に処理する必要があります。提供された出力バッファーのサイズが十分でない場合に例外をスローします。

2
Secure

私の経験によると、ライブラリーへの依存を排除​​することはできないので、あなたとあなたのチームは問題を解決するのに十分な知識を持っている必要があります。

プログラマーとしての時間はほとんどないため、最も優先度の高いものを選択する必要があります。この問題は、可能な限り迅速かつ穏やかに解決する必要があります。この理由だけで、「すべてのことを学ぶ」ということはいくぶん冗長になります。

ここで付け加えたいのは「依存」です。コミュニティとして、私たちは皆他者に依存しています。 Java、.NET、APIなどのアプリケーションを構築するためにジャイアンツに依存していますそして、ジャイアンツは彼らの仕事を信頼しています。それは非常に多くの人々のために機能するからです。について問題がある場合フレームワーク、またはAPI、他の人がどこかに直面している可能性が高く、解決策/回避策があります。

ここでの唯一の問題:多分、どこかで、制限された基準でジャイアンツは崩壊しました。たとえば、一部のOSではフラッシュがサポートされておらず、それなしでは実行できないことがたくさんあります。この可能性はゼロ以上ですが、この場合、私たちにできることはほとんどありません。これらの場合にのみ、「フードの背後にあるもの」に関する知識は、問題が本当にどこにあるかを指摘し、大きな回避策を作成する可能性があるため、有用であることがわかります。しかし、私たちが投資した時間が本当に価値があるかどうかはわかりません。

その可能性に対処するための解決策はあると思います。ほとんどのプログラマーはライブラリーの「表面処理」を簡単に把握できるため、非常によく理解している人が本当に必要な場合があるためです。それを行うためにチームを分割しましょう。 各チームが関与する約1,2の有用なライブラリ/ツール/「スキルセット」を専門とするチームを構成しようとします:1人はjQueryについて優れた経験があり、1人はデータベースに特化しています...これリスクを最小限に抑えるのに役立ちます。

2
Hoàng Long

確実に機能する限り、使用するすべてのものを理解しなくても問題ありません。 libのバグに噛まれたら、それがどのように機能するか、なぜ機能するのか、なぜ機能しないのかを確認する時間があります。もちろん、あなたは常に歓迎されており、たとえそうでなくても、内部を見ることが奨励されています。

プログラミングで難しいことの1つは、すべての問題を自分で解決するという誘惑を克服することです。

1
Kamil Szot

大丈夫ですが危険です。一般的な実践として、彼が開発したものの働きを知る必要があります。

1
Rachel

ちょっと...

ライブラリまたはフレームワークが何をしようとしているのかについての一般的な要点が得られれば問題ありません。内部部品とそれ以外のことについては、違います。実用的なアプローチを取る。それは機能し、私がやりたいことを実行しました。

重要なのは、細かい細部にこだわることなく、すでにアイデアを実装していることです。

ポイントは、あなたがすべてを知ることはできないということだと思います。真剣に、すべてを調査する時間はほとんどありません。自分のアイデアを作成するという主な目標から気が散るからです。少しずつ、おそらく、あなたは週末に少し時間を空けて、主題についての章などを読むことができます。

しかし、多くの自由な時間がない限り、すべてを理解しようとしないでください...このように見てください。プログラミング言語の理由は、私たちがアセンブリコードを実行できないようにするためです。アセンブリコードの理由は、1と0を実行できないようにするためです。その背後にあるメカニズムのすべての詳細を知る必要はないと思いますが、それの一般的な要点を知っているだけです。ガベージコレクターのように、私はポインター/メモリを処理することを知っています。それが使用する魔法のようなきちんとしたアルゴリズムは気にせず、それが(私が必要とするものに対して)機能することを知り、それ以外は何もしません。多分それの欠点ですが、まあ。もちろん、あなたがそれに対処しなければならない分野にいるのでない限り。それなら、あなたはこの質問をするつもりはないでしょう。

1