初心者のプログラマーとして、サードパーティのライブラリを使用するよりも独自のライブラリを構築することを優先すべきですか?


12

Pythonプログラマーとして、必要な機能を含む高度なサードパーティライブラリにジャンプする前に、独自のライブラリを構築して理解することをお勧めしますか?

一部のプロジェクト(DjangoなどのWebフレームワークなど)は、おそらくこのアプローチには大きすぎます。しかし、他のプロジェクト(Webクローラー、グラフライブラリ、HTMLパーサーなど)は実行可能であるようです。

サードパーティのライブラリに早期に依存すると、私の成長が妨げられるのではないかと心配しています。

注:この質問この質問は、学習の利点よりも再利用の効率におそらく集中している経験豊富なプログラマーに焦点を当てているようです。私の質問は、初心者に焦点を当てていると思います。


5
「プログラマではなく、ライブラリインテグレータ以上のものはありません」:顧客はあなたに生産性を求めています。既存のライブラリを評価および統合できることは、生産性を高めるために必要な重要なスキルです。ニーズに合った利用可能なライブラリがない場合...それ以外の場合は、アプリケーションが対処しているビジネス上の問題の解決に焦点を当てる
Hamish Smith

2
「ライブラリインテグレーター」と「プログラマー」をどのように区別していますか。組み込みのチップレベルのデバイスコントローラーを作成するまで30年も経たないうちに、ライブラリなしで仕事をしたことはありません。この区別を説明できますか?
-S.ロット

言い回しが悪い。編集しました。
MikeRand

図書館インテグレーターを雇いたいです。機能に集中できる方法に集中する理由は何ですか?数十ダースのひどく再発明された自転車を見た後、私は別の自転車を見るという考えにうんざりしています。ライブラリの設計は大変な作業であり、バランスをとる行為です。典型的なソフトウェアショップは、ライブラリの設計に特化しておらず、適切なスキル、リソース、およびそれを正しく行う忍耐力がありません。書き換えに注意してください。ゼロから始めるよりも、他の人によってテストされたコードを使用する方が適切です。真空が存在する場合にのみ、IMOを発明すべきです。
ジョブ

回答:


12

これは常にトレードオフです。

初心者プログラマーとして、コードの再利用とスクエアホイールの再発明を検討する際には、次の2つの質問を自問する必要があります。

  1. ゼロからすべてを記述するか、問題の領域に焦点を合わせ、関心のある問題にとって重要ではない複雑さを脇に置くことで、解決したい問題についてさらに学習しますか?
  2. 手元の問題を解決することは私にとってより重要ですか、それとも基本的な概念を理解することがより重要ですか?

プロジェクトを終了する必要がない場合は、他の人がすでに解決している複雑な問題について車輪を回しても大丈夫です。何かを学ぶからです。しかし、おそらく「完成」する前に他の何かに進むでしょう。それはあなたにとって重要かもしれないし、そうでないかもしれません。他のプロジェクトは、自分で解決しようとするまで単純に見える複雑なドメインに頭を突っ込むと、すぐに輝いて見えます。

他の誰かの考え方に遅れをとっているので、制御を放棄することに執着しないでください。あなたが達成しようとしていることにもっと集中してください。

パーサーがどのように機能するかを理解するためにHTMLパーサーを作成することが目標である場合は、それを試してください。ユーザー入力をサニタイズしたり、HTMLのランダムなビットを変換したりするためにHTMLパーサーを作成することが目標の場合は、おそらく解析自体よりも解析のアプリケーションに関心があるため、間違ったことに集中している可能性があります。他の人のライブラリを理解するのに時間をかけたくないためにHTMLパーサーを書きたいと思うなら、おそらくあなたは時間を無駄にしているでしょう。少なくともこの場合、私は他の人があなたが持っているよりもこの問題を効果的に解決するために。本当にささいなケースでは、コードを再利用しないことで時間を節約できますが、使用するライブラリがひどい場合や、ドキュメントやコードサンプルを読む能力がひどい場合を除いて、

一方、使用することになったとしても、他のドメインに適用できる転送可能な基本的なアルゴリズムとデータ構造により重点を置くため、独自のグラフライブラリを作成する価値があると言えます。あなたがそれらの問題に取り組むとき、他の誰かのライブラリ。


問題について考えるための素晴らしいフレームワーク。大変感謝いたします。
MikeRand

8

ほとんどの初心者プログラマーは、問題の複雑さを非常に過小評価しています。これは多くの不快な状況につながりますが、私は1つだけに焦点を当てます。「肥大化」または「複雑すぎる」ために多くのサードパーティライブラリを却下します。次に、同じ仕事をするために独自のコードを書き、それを完全に台無しにします。なぜなら、彼らが処理しなければならないすべてのことを予期していなかったからです。

WebクロールとHTMLの解析を行います。あなたはそれらのタスクに対してかなりカジュアルな態度を持っているようです-それはあなたが非常に小さなスケール以外でそれらをやろうとしたことは決してないと信じさせてくれます。以下に、実際のWebクローラーが対処する必要がある潜在的な問題の短い非包括的なリストを示します。

  • 不正なHTML。
  • 複数の文字エンコーディング(全世界はASCIIでは実行されません)。
  • JavaScriptによって生成または変更されたリンク。
  • マルチギガバイトのバイナリファイルへのリンク。
  • 誤ったMIMEタイプ。
  • クロールセッションの途中でクラッシュします。
  • タールピット。
  • SEOコンサルタント。
  • マイクロソフト。

6

サードパーティのライブラリに早期に依存することで私の成長が妨げられ、プログラマではなくライブラリインテグレータにしかならないのではないかと心配しています。

それは間違っています。

サードパーティのライブラリに早期に依存することで、優れたライブラリがどのように機能するかがわかります。

時期尚早の開発は常に時間の無駄です。既存のライブラリを慎重に研究(つまり、使用)せずに独自のライブラリを作成すると、キャリアの残りの部分で(ひどく)車輪の再発明を余儀なくされます。

私はそれらの混乱を片付けるのに多くの請求可能な時間を費やしました。


私がそれに完全に同意するかどうかはわかりません。.サードパーティのライブラリが不完全に書かれていて、実際に悪い習慣を教えていることがあります。基礎となるアルゴリズムが十分に理解されている場合は、ホイールを再発明することをお勧めします。次に、それらを他のライブラリと比較して、他のライブラリにどれだけうまくスタックするかを確認します。どちらの場合でも、明らかに何らかのメンターシップが非常に有益です:)
デミアンブレヒト

そうは言っても、既存のAPIを勉強することに利点があります:)
デミアンブレヒト

2
@Demian Brecht:「サードパーティのライブラリは不完全に書かれており、実際に悪い習慣を教えていることがあります」これは真実かもしれませんが、ほとんどのオープンソースプロジェクトはユーザーコミュニティによって厳しく吟味されており、悪いアイデアは群衆の知恵に耐えられません。さらに、「不十分に書かれた」とは、n00bが効果的に判断できない判断です。
S.Lott

@ S.Lott:よく言われました(re:n00b):)そして、いくつかの非常に小さな(もしあれば)コミュニティがあるので、あなたが見ているサードパーティのライブラリについて注意する必要があると思います。たとえば、GitHubでランダムなプロジェクトをいじると、間違った道に進む可能性があります。
デミアンブレヒト

2
@Demian Brecht:さまざまなライブラリを見るまで、判断を下すことはできません。n00bが使用するライブラリを「事前フィルタリング」する方法はありません。すべてのライブラリーまたはライブラリーではありません。
-S.Lott

4

最初の文であるこの文は、私にとって非常に論理的に問題があります。

Pythonプログラマーとして、必要な機能を含む高度なサードパーティライブラリにジャンプする前に、独自のライブラリを構築して理解することをお勧めしますか?

既存のライブラリと同じように正確で、機能が完全で、テスト済みの初心者として、高度な (あなたの言葉の)機能ライブラリを効果的に書くことができるとどうして信じられますか?

これは、初心者として理解していないホイールを再発明するのに無駄になる膨大な時間についても言及していません。とにかくライブラリを終了します。

たとえば、HTML解析を実行すると、これは実行可能だと言いますが、Beautiful Soupを初心者としてより良い仕事をする方法はありません。プレーンでシンプルなあなたは失敗します。実現可能だと思うものには、考慮に入れていない巨大な複雑さの問題があり、複雑さを理解するのに十分なほど詳細に問題領域を知らず、それだけで失敗する運命にあります。

私の意見は、あなたの問題に対処する何かを見つけることができないまで、他の人々が何をして、あなたのためにすでにあなたの問題を解決したかを学ぶことです。


1

これは私の意見ですが、非常にシンプルで再利用可能なコード用に独自のライブラリを構築することをお勧めします。より複雑なものには、サードパーティのライブラリを使用できます。サードパーティのライブラリは、完全にビルドおよびテストされています(うまくいけば!)。堅牢なライブラリの作成は、その内容によっては非常に時間がかかる場合があります。アプリケーションを作成するだけで、十分なプログラミングの練習ができると確信しています!


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