「決して車輪を再発明しない」というフレーズは、学生に適していますか?


115

SOに関する質問をすると、「車輪を再発明しないでください」または「車輪を再発明しないでください」という表現に常にぶつかります。いくつかのフレームワークまたは既存のパッケージを使用するように指示されます。他の人がすでに解決したことに時間を浪費するのは賢明ではないので、私はこの態度がどこから来たのかを知っています。それともそうですか?

学生として、私は問題を解決するために他の人が書いたいくつかのコードを使用することによって、私が望んでいるほど多くを学ぶことができず、より少ない洞察を得ます。そして時々、私はそのフレーズは、私のような学生ではなく、主に締め切りに直面している働くプログラマーのためのものだと思います。

「車輪を再発明する」ことは悪いことですか?たぶん私は間違っていると思っていますか?車輪の再発明を避けながら、同時に多くのことを学ぶことができる方法がありますか?


51
(飼い葉folkになることを学んでいない限り)他の人々にあなたのために重量を持ち上げてもらえば、ジムに参加することから多くの利益を得ることはありません。
チャールズE.グラント

82
ホイールを作成するときにホイールを再発明してもかまいません。家を建てるときは、ホイールビルダーが自分よりも自分が上手く行っていることを知っていると想定することをお勧めします。
zzzzBov

22
少なくとも車輪を作ってみる必要があります!それ以外の場合は、プレハブを使用する理由がわかりません。

59
絶対を述べることは決して適切ではありません。:)
CVn

2
非常に最適化されたコードを作成しているときに、車輪を再発明してもかまいません。標準ライブラリは非常に便利ですが、一般的ではないがより高速なものを作成することができます。
レオ

回答:


126

良い点を挙げていると思います。このサイトのプログラマーのほとんどは、可能な限り迅速に高品質のソフトウェアを作成することを目標としている、働くプロフェッショナルです。車輪の再発明は、2つの点でこの目標を達成できません。

  1. 存在するコードの再作成は、システムの固有の部分で使用できる無駄な努力であり、プロジェクトに必要以上に時間がかかります。
  2. コードの最初のバージョンでは、バグや予期しない問題が発生する可能性が高くなります。ほとんどのライブラリと再利用可能なコンポーネントは、何度もテストされ、パッチが適用されています。ハッシュアルゴリズムを再発明したり、(プロジェクトがそうである場合を除いて)独自のRDBMSを作成しようとすると、結果が悪くなります。

とはいえ、アカデミック環境では、目標はソフトウェアを予算内で提供するのではなく、学ぶことです。スポークまたは車軸がどのように機能するかを理解するために車輪を再発明することは、その目標を達成するための素晴らしい方法です。そのため、多くのプログラミングカリキュラムには、コンパイラを構築するためのクラスが含まれていますが、これを行う必要があるプログラマーはほとんどいません。


37
物事の仕組みを理解するという考えに同意しますが、プログラミング学校がカリキュラムに時間をかけてサードパーティのライブラリの使用方法とその理由を学ぶことを願っています。私は常にこれを行うことができず、最終的に車輪を再発明することができないプロの能力を持つプログラマーと開発者を見つけます。
スポーク

3
コンパイラについての素晴らしい点
チャン

1
車輪を再発明しないことを学ぶことがより重要だと思います。既に作成されたものを作成することを伴わないことができる多くのことがあります。
トーマスボニーニ

@Krelp学生ですが、概念は最も重要な部分です。多くの教授は、サンプルコードを使用して、ブリッジの理論と応用を可能にします。これらは図書館を改革するプログラムの種類ですが、学生が資料を確実に理解できるようにするためのものです。
ジェッティ

2
学生は車輪を再発明して、なぜそれが速くなるのかを確認する必要がありますが、専門家としては、できるだけ速く移動できるように市販の車輪を使用する必要があります。残念ながら、
結局のところ

19

答えはコンテキストに大きく依存します。ハッシュテーブルの実装を試すことで、データ構造をさらに深く理解したい場合は、「車輪の再発明」が最善の方法です。コンパイラの作成方法を学習していて、シンボルテーブルが必要な場合、標準ライブラリのハッシュマップを再利用する代わりに独自のハッシュマップを実装することは、時間の無駄です。


17

学生として、最初にホイールを 1 つまたは2つコピーしてからプログラミングの教育を開始し、次にホイールを修正して動作を確認し、制限を理解することを学習することを期待します。後で、独自の新しいホイールを作成して、設計を改善できるかどうかを確認したり、コースのスーパーバイザーに関連する概念の理解を示すこともできます。

しかし、作業の専門家として、特定の問題を解決するためにどのホイールを使用するか、そして問題を部分的にしか解決しない場合に既存のホイールを変更することが適切である場合を学習することを期待します。あなたは見つけることができない場合は、ホイールをどこでも、そしておそらくあなたは、ニッチ市場を特定しているか、十分調査していない、とあなたが知っているのに十分な経験する必要があるであろうとき、ブランドの新しい作成するために適切であろうホイールあなたのを自分の。

ソリューションを再発明するのが適切な場合の問題は複雑であり、以前に行われたもののまったく新しいバージョンを作成する方がよい場合を学習するには時間と経験が必要です。短期間しか開発していない場合は、既存のソリューションを単純に使用し、メンターにオプションを提案してもらうことをお勧めします。締め切りが厳しく、プロジェクトに多くの不確実性がある場合、既存のものを使用すると時間を大幅に節約でき、常に最初の選択肢となります。それが最終的にあなたの車輪を再発明するために戻ることを意味する場合でも、そうすることが適切であるなら、いつでも他のソリューションを使用するためにリファクタリングすることができます。


12

教師またはプログラミングを担当している私は、常に問題の反対側と戦います。いつ生徒に車輪の再発明を依頼するのですか?

これらの単純な状況を考えてみましょう。ソートアルゴリズムを研究しており、データをソートするプログラムを作成するタスクを設定しています。または日付機能を使用して、カレンダーを要求します。

これらの両方について、利用可能な数え切れないほどの既製のライブラリと機能があります。しかし、私は学生にそれらを避けて、ソートアルゴリズムまたはカレンダーの彼ら自身のバージョンを開発して欲しいです。

次に、もう1つを取り上げます。たとえば、予定をスケジュールするための簡単なアプリケーションを作成するタスクを設定します。これには、並べ替え、カレンダーなどが必要になる可能性があります。今回は「車輪を再発明しない」が当てはまります。生徒が解決された問題に苦労するのではなく、代わりに既存の機能を組み立てて結果を得ます。

私の難しさは、どれだけあなたが既存のものを再現するように頼むかであり、それはあなたに学ぶことを可能にし、技術を練習するために私が使うことができる知識の難しさとよくある問題の利点を持っています車輪が再発明されていない現実の世界であなたは?

より直接質問に答えるには、2つの提案があります。

  • 教師が「車輪を再発明しない」とあなたに言った場合、彼らは問題をそのように設計したので、おそらくそう言います。たぶん、彼らはあなたにライブラリを試してもらい、自分のアルゴリズムを書くのではなく、誰か他の人のアルゴリズムの実装と格闘してほしいと望んでいます-その中にも学習があり、再作成は興味深いが、ポイントを逃します。
  • アルゴリズムを開発するのではなく、ライブラリ呼び出しをアセンブルするエクササイズが多すぎる場合、教師にこれらのアクティビティのバランスの問題を提起することができます-ソートやマージなどの独自のアルゴリズムを書くように依頼されたことがないことを強調します。コミュニケーションが失敗することはありません。

6

練習誰も書いたコードの最初の1000行は非常にユニークだとは思いません。

ツールセット拡張するフレームワークを使用すると、それが何をしているのかを理解しているときに(フレームワークを自分で実行できるようになりました)、より多くの利点があります。

「ホイール」理解する組み立てが不十分で使い古したホイールまたは適合しないホイールを使用することは、この経験則に盲目的に固執する言い訳にはなりません。時間、資金、専門知識が不足している可能性がありますので、パッチをあてて旅行を終えてください。

絶対的なものはほとんどありません


1
+特に最後の点について。
マイクダンラベイ

誰でも書く最初の1000行のコードは、創造的なミスという点で非常にユニークである傾向があります。
左辺約

@leftaroundabout-コンパイル可能なコード行にそのステートメントを制限する必要があると思います。
JeffO

3

学生には課題を完了するための予算はありませんが、検討すべき期日があります。

最近まで学生だった人として、適切な車輪の再発明の量は、あなたが割り当てを行っているクラスによって異なると思います。Web開発および設計クラス用の独自のソケットライブラリを作成したくない(それができて時間通りに割り当て有効にできる場合、クラスを簡単に取って何をしているのですか?)ネットワーククラスの割り当てである場合は、非常に重要です。もちろん、教授は通常、課題を作成するときにこれらのことを考慮します。そのため、ほとんどの場合、クラスに関連する作業を行いますが、自分で書いてはいけないことを知ることも重要です。

そうは言っても、学校を卒業すると、すでに存在するものを構築する時間を見つけるのは困難です。学校にいる間は、できる限り機会をとってください。

SOで「ライブラリX /フレームワークYを使用」ブラシオフを取得した場合は、「Xを自分で書いています」と質問の前に置きます。


あなたの質問の前に「Xを自分で書いて、それについてもっと知りたい」と書いてください。この。+1。
boisvert

2

プロジェクトの期限であるIMOがない場合は、車輪を再発明することをお勧めします。あなたが仕事を持っていない場合、またはお金のプログラミングをするのではなく、単にプログラミングを学びたい場合、あなたがより良いプログラマーにならないショートカットを使用することのポイントは何ですか?これは事実ですが、ライブラリ、フレームワーク、および他の人のコードの使用方法を知ることは間違いなく優れたスキルです。


これは、コードカタスの概念の背後にある考え方であり、コードを何度も何度も書き換えて改善し、そこから学習します。職場でもコードを繰り返し書き直すことは良いことであり、必要に応じて多くのパターンを実装できるとさらにいいと思います。
ビルK

2

実際には、車輪は何度も再発明されています。理由を調べると、いつプログラミングの車輪を再発明する必要があるかについての洞察が見つかるかもしれません。

シュメール時代以来、多くのことが変わりました。

  • ホイールを構築するために使用される材料:石、木、金属、カーボンから...
  • 車輪が必要な物体のサイズ-医療機器用のナノメートルのサイズと褐炭を得るためのホイール、サイズ100m
  • 生産環境-手作り、または産業生産
  • 必要なホイールの精度
  • ホイール周辺の適切な状況。あなたの仕事にぴったりのホイールがあるかもしれませんが、それは特許を取得しているかもしれません。
  • ホイールの輝きと磨き。キャデラックはVWゴルフとは別のホイールに値するかもしれません。
  • ベビーカーに最適なホイールは、多くのパラメーターに依存します:ベビーカーのサイズと重量(およびベビー)簡単に言えば:世界経済学。

それはソフトウェアの世界にどのように変換されますか?まあ、

  • Webサーバーはあるかもしれませんが、残念ながらPHPで書かれています。あなたが流languageな言語でそれを持っていることを好むだろう
  • ソートアルゴリズムは10個の要素に対して大きすぎるかもしれませんが、要素の1Tまでは拡大しません
  • 2番目のプログラムによって生成されたソリューションが必要になる場合があります
  • アルゴリズムがリストをソートする場合、ほとんどの場合ソートされません-ソフトウェアの土地では、ほとんどの場合、精度はデジタルの質問です。ただし、パフォーマンスの他に、コードサイズ、メモリ使用量、またはその他の制限が発生する可能性があります
  • 特許についてこれ以上説明する必要はないでしょう。
  • ルックアンドフィールは、何かを再発明する絶え間ない理由です。dropDownList(ComboBox)を考えてください。
  • 世界的な経済状況は、ソフトウェアホイールに影響を与える可能性があります。クラウドホイール、オープンソースホイール、ブラウザホイール、アプリホイールのどれでしょうか。
  • そしてもちろん、独自のホイールを構築する最も有名な理由:あなたはそれを学ぶのが好きです。

2

私は新しく教育を受けた学生です。学校ではasp.netとC#を「学習」していました。教育に2年間かかったので、独自のメールシステム、ログインシステム、またはCMSを作成しようとはしませんでした。 。

私たちは102人の学生を始め、23人が完了しました。4人が仕事をしています。その理由:実際に教育を開始する前に、これら4人(私を含む)がプログラミングの方法を知っていました。

残りの人々は失われます。私たちが「車輪を再発明した」ことはないからです。コードが実際にどのように機能するかを知ることはできませんでした。ユーザー管理を使用して完全なログインシステムを構築するのは非常に簡単です-しかし、私の教育の学生は、その方法を知りません。彼らはログインシステムが実際にどのように機能するかを知らないからです。

悲しいことに、ある時点で、実際に2年無駄になり、何も学ばないことを感じます。-私は世界中の先生が言うことを望みます。ええ、私たちはコードが存在するフレームワークがあることを知っています。実際の生活でそれらを使用することができます。

多くのプログラミング教育は非常に短いため、その期間内に多くのことをカバーする必要があります。物事のリストを半分に減らし、プログラミングにより多くの時間を費やす方が良いと思います。通常の「ホイール」の作り方を知っていれば、人々は「新しい種類のホイールを発明する」ことができます。少し知識がある人は愚かではありませんが、車について何も知らない人に車を作るよう頼むことはできません。実際に車を作ります。


1

それは本当にあなたがしていることに依存します。車輪を理解しようとしているなら、自分で車輪を再発明するのは良い考えです。ただし、車を理解しようとしている場合、ホイールホイールまたは内燃エンジンの再発明は一般的に無駄であり、注意をそらすものです。

したがって、たとえば、全文検索インデックスがどのように機能するかを理解することに興味がある場合は、独自のインデックスを作成することをお勧めします。ドキュメント管理用のアプリケーションを構築しようとする場合、既存のライブラリを再利用する方がよいでしょう。ほとんどの作業がアプリケーションアーキテクチャとユーザーエクスペリエンスを同時に取得するからです。


1

はい、車輪を再発明しないように生徒に伝えるのが適切です。しかし、学生にとってそれが何を意味するのかを明確に理解する必要があります。課題に密接な関係があるものを書きます。割り当てがバブルソートの作成である場合、Wikipediaからコピーすることを意味するものではなく、フレームワークまたは言語で提供されている場合にarray.sortまたは同等のものを使用することも意味しません。ただし、さまざまなソートアルゴリズムをカバーし、独自のバブルソートとクイックソートを作成した後、新しい割り当てごとにそれを書き換える必要はありません。組み込みのソートまたは作成したものを使用し、同じ古​​いことを繰り返し実行しないでください。

車輪の再発明は時間を無駄にすることではありません。それは専門家と同じように学生にも当てはまります。違いは目標が何であるかにあります。生徒は学習する必要があるので、理解を深めないものは時間の無駄です.1つのバブルソートを作成した後、それが何であるかを知った後、大規模なセットでそれを使用したくない理由がわかります、何度も何度も書き直すのは時間の無駄です。25回目の書き換えでは、新しいことは何も学びません。

学生にとって、それは他の人が書いたものを書かないことを意味するのではなく、あなたがすでに習得したものをやり直さないことを意味します-あなたが習得していないものに費やすことができるその時間。


25回目の書き換えが、新たに学習しているプログラミング言語のプラクティスである場合を除きます。
左辺約

1

多くの考えと努力がホイールの作成に費やされました。アドバイスは「車輪を再発明しないこと」ですが、先に進んで車輪をリバースエンジニアリングし、特定のことをそれが行われる方法で行う理由を理解することができます。この後、独自の方法でホイールを実装してみて、3つの論理的な結果のいずれかになる可能性があります。

  1. あなたは、物事がそうである理由を理解します。
  2. あなたはそれを最適化し、より良くするかもしれません
  3. あなたはそれを台無しにして、そのことをしない方法を学ぶかもしれません。

私にとって、学生は車輪を再発明するべきではありませんが、それをリバースエンジニアリングし、その意味を理解しようとします。


1

車輪がどのように機能するかを見るために再発明するのか、他のタスクを達成する過程で車輪を再発明するのかによって異なります。確かに、すべての学生が少なくとも一度は自分で実装する必要があるホイールがあります。いくつかの基本的なデータ構造とアルゴリズムがどのように機能するかを知って、コードのパフォーマンスにどのように影響するかを理解したり、さまざまな状況で使用するものを選択したりする必要があります。

スタック、ヒープ、リンクリスト、ツリーなどは、一度実装するのに時間をかけて投資する価値があります。その後、フレームワークが提供するものを使用します。jQueryプラグインを使用する人は誰でも少なくとも1つ作成する必要がありますが、使用するすべての種類のプラグインを作成する必要はありません。コンピューターの内部で何が起こっているのかを理解できるように、小さなプロセススケジューラまたはミニOSを記述することは有用ですが、必ずしも必要ではありません。ただし、プロセス、スレッドなどの仕組みを理解する必要があります。

実用的な知識が得られたら、戻って新しい構造/アルゴリズムを実装し、その感覚をつかむことも重要です(そして楽しい)。それがあなたの仕事であるか、あなたが本当に上手でなければ、私はあなたのコードで既存のものを使い続けるでしょう。


1

答えは、学習するか作成するかによって異なります。

学習が目的である場合、「車輪の再発明」は、既存の車輪(ライブラリ関数)を使用するよりも、より深い洞察とより良い理解を与えることができます。

しかし、複雑な製品を作成することが目的である場合、「車輪の再発明」は時間のかかるプラクティスになる可能性があり、製品の作成をほとんど助けません。

それにもかかわらず、魂の目標が十分な時間とスタミナを備えた学習である場合、「車輪の再発明」が最善の選択肢であり、それはすべての機能をカスタマイズするのに役立ちます。


1

さて、これには2つの側面があります。

まず、学習しようとしている場合、最初からいくつかのことを行う、必要以上に低レベルのインターフェイスを使用すると便利です。ただし、学習内容を特定する必要があります。HTTPプロトコルについて学習する場合は、ソケットプログラミングを自分で行う必要はありません。学んでいることだけを再発明し、それらを本当に探求し、理解するためだけにそうしてください。

しかし、プロのプログラマーの最も重要なスキルの1つは、既存のソフトウェアを選択、学習、使用することです。これもあなたが学ぶ必要があるものです。SOに関する質問の大部分は、ドキュメントを読むことができない人々から来ているようです。

最後に、プログラミングはかなりの理論的根拠に基づいています。理論を学ぶには、両方の実践的な演習と読書を併用する必要があります。


同意する。だからこそ、非常に多くの新しい既存のソフトウェアフレームワークとライブラリが常に作成されています:)
gbjbaanb

0

私は同じ状況に直面しています。それは、産業界と学界の認識の違いによるものです。

「車輪を再発明」しないと、学校で何かを勉強したり、何かがどのように機能するかを理解することは絶対にできません。

一方、業界では、目的は最小限の時間と労力で製品を引き出すことです。

個人的に、私はうさぎの穴を下るのが好きで、業界哲学を嫌っていますが、それがビジネスのやり方であり、文句を言うことはできません。


0

ハッカージャーゴンLexikonは、上の非常に良いコメントがある車輪の再発明を

既存のツールまたはツールの一部に相当するツールを設計または実装すること。これを行うことはばかげているか時間の無駄であるという意味を持つ。これはしばしば正当な批判です。一方、自動車は木製のローラーを使用しないため、車輪の種類によっては、車輪を正しく使用する前に何度も再発明する必要があります。第三に、車輪を再発明する人々は、オフセット車軸を備えた台形と同等の道徳を思い付く傾向があります。

したがって、車輪を再発明することは良いかもしれませんが、それを行う前または後に、他のソリューションを必ず確認してください。


0

回答A:車輪を再発明してください。データ構造とアルゴリズムの理解を深め、良いものを書く可能性が高くなります。Guido van RossumがPythonを始めたとき、人々は彼に車輪を再発明しないように言ったと確信しています。すでにたくさんの言語がありました。すでにYahoo!があったのに、なぜgoogleを書くのか clangはどうですか?それをすべて学んでください。巨人になりましょう。小さい人にあなたを制限させないでください。回答B:インストラクターがあなたに何をすべきかを教えたら、彼が望んでいることを彼に与えてください。また、驚くべきソリューションを作成することに夢中になり、彼にそれへのリンクを与えたい場合は、先に進んでください。ただし、最初に指定された要件を満たします。


-1

あなたが学生であり、したがってプロジェクトの期限が決まっていない場合は、「車輪を再発明する」ことをお勧めします。プログラミングの方法を学ぶためだけにお金を稼ぐためだけにプログラミングしているのであれば、なぜ学習に役立たないショートカットをとるのですか?苦労してみませんか?しかし、実際にプログラマーになると、フレームワークやライブラリの使用方法がわからないと、人々は懐疑的になります...


10
どの学校に通っていたのかわかりませんが、どこに行ったのか、割り当ての締め切りは当たり前でした。
CVn

-2

課題/質問/試験で求められていることを行います。

数年前、私はCプログラミングクラスのTAでした。試験の質問は「ファイルをコピーするプログラムを書く」でした。何人かの学生が同じタイプの質問をしました-プロセスを生成してOS cpコマンドを実行できますか?

彼らに尋ねたのは、「あなたのプログラムはファイルをコピーしますか?」

試験問題では、ファイルをコピーするためのコードを書くよう依頼されました。回答にファイルをコピーしたCコードがない場合(入力を開く、出力を開く、バイトの読み取り/書き込みループ、入力を閉じる、出力を閉じる)、ファイルをコピーしませんでした。

教師がフレームワークまたはライブラリを使用すると言った場合(たとえば、グラフィッククラスが3Dライブラリを使用するように指示する場合があります)、使用するように指示した内容を使用します。自分で発明したり、別のものを使用したりしないでください。異なるものがあると、教師があなたの作品を採点するのが難しくなります。

就職面接では、一般的なフレームワークの知識が質問への回答に役立ちます。学習する独自のプロジェクトを作成します。勉強を頑張ってください。


はい。ただし、彼らcpがプログラムを作成した場合、実際にはファイルがコピーされます。
マルチン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.