SOについて質問すると、「ホイールを再発明しないでください」または「ホイールを再発明しないでください」という表現に常に出くわします。一部のフレームワークまたは既存のパッケージを使用するように指示しています。他の人がすでに解決したことに時間を浪費するのは賢明ではないので、私はこの態度がどこから来ているのかを知っています。それともそうですか?
学生として、自分の問題を解決するために他の人が書いたコードを使用することで、思い通りに学ぶことができず、洞察が得られないことに気づきました。そして、時々私はそのフレーズが主に締め切りに直面している働くプログラマーのためであり、私のような学生のためではないと思います。
「車輪を再発明する」ことはそれほど悪いことですか?多分私はそれを間違っていると思いますか?多分、私はホイールの再発明を回避し、同時に多くを学ぶことができる方法があるでしょうか?
私はあなたが良いポイントを作ると思います。このサイトのプログラマーのほとんどは、可能な限り迅速に高品質のソフトウェアを作成することを目的とする、実際に働いている専門家である可能性があります。車輪の再発明は、2つの点でこの目標に失敗します。
とはいえ、学術的な環境では、目標は学習であり、予算内でソフトウェアを提供することではありません。ホイールを再発明してスポークまたはアクスルの動作を理解することは、その目標を達成するための優れた方法です。そのため、多くのプログラミングカリキュラムに、コンパイラーのビルドに関するクラスが含まれています。
答えはコンテキストに大きく依存します。ハッシュテーブルの実装を試してデータ構造をより深く理解したい場合は、「ホイールの再発明」が最善の方法です。コンパイラの書き方を学んでいて、シンボルテーブルが必要な場合、標準ライブラリのハッシュマップを再利用する代わりに独自のハッシュマップを実装することは、時間の浪費です。
学生として、最初にwheelまたは2つをコピーしてからプログラミング教育を開始し、次に変更wheelsを使用して、それらの動作を確認し、制限を理解します。後で、独自の新しいwheelを作成して、デザインを改善できるかどうかを確認したり、コース管理者に理解を示したりすることもできます。関係する概念。
ただし、実際の専門家として、問題を解決するためにどのwheelを使用するか、および既存のwheel問題が部分的にしか解決されない場合。 ホイールがどこにも見つからない場合は、おそらく市場のニッチを特定しているか、十分に調査していないため、次のことを行う必要があります。 いつを知るのに十分な経験を積んでいるあなた自身の新しいwheelを作成するのが適切でしょう。
ソリューションを再発明するのが適切である場合の問題は複雑であり、以前に行われたもののまったく新しいバージョンを作成した方がよい場合があることを学ぶには、時間と経験が必要です。開発期間が短い場合は、既存のソリューションを使用して、メンターにオプションを提案することをお勧めします。プロジェクトに厳しい締め切りがあり、プロジェクトに多くの不確実性がある場合、既存のものを使用すると時間を大幅に節約できるため、常に最初に選択します。 wheelの再発明に最終的に戻ることを意味する場合でも、適切な場合はいつでも他のソリューションを後でリファクタリングして使用できます。
教師またはプログラミングをしているとき、私は常に問題の反対側と戦います。いつ生徒に車輪の再発明を依頼するのですか?
これらの単純な状況を考えてみましょう。私たちは並べ替えアルゴリズムを研究しており、いくつかのデータを並べ替えるプログラムを作成するタスクを設定します。または日付機能に取り組んでいて、カレンダーをお願いします。
これらの両方について、無数の既製のライブラリーと機能が利用可能です。学生にはそれらを避けて、独自のバージョンの並べ替えアルゴリズムまたはカレンダーを開発してもらいたいです。
ここで、もう1つ、予定をスケジュールするための簡単なアプリケーションを作成するタスクを設定します。これには、ソートやカレンダーなどが必要になる可能性があります。今回は「ホイールを再発明しないでください」が当てはまります。私は、学生が解決された問題に苦労するのではなく、代わりに既存の機能を組み立てて結果を得ます。
私の難しさは、どれだけ既存のものを再現するように頼むべきか、それはあなたに学びをもたらすものであり、そして私があなたに技術を練習させるために使用できる既知の困難を伴うよく踏まれる問題の利点と私がどれだけ置くべきかということです車輪が再発明されない現実世界の設定であなた?
質問に直接答えるために、2つの提案があります。
練習だれでも書いた最初の1000行のコードが非常にユニークであるとは思えません。
ツールセットを拡張するフレームワークを使用すると、それが何をしているのかを理解しているときに(フレームワークを自分で実行できるようになるまで)、それを適用する方法がわかるので、より多くの利点があります。
"ホイール"を理解する不十分な構造で摩耗したホイールや適合しないホイールを使用することは、この経験則に盲目的に固執する言い訳にはなりません。時間、資金、専門知識が不足している可能性があるため、パッチを適用して旅行を終了します。
絶対はほとんどありません。
学生には、課題を完了するための予算はありませんが、検討すべき期日があります。
最近まで学生だった私にとって、適切なホイールの再発明の量は、どのクラスの課題を担当しているかに依存すると思います。あなたはウェブ開発とデザインクラスのためにあなた自身のソケットライブラリを書きたくありません(それができるならそして割り当てを時間通りに提出します、あなたはクラスをそんなに簡単に取っていますか?) 、しかしそれがネットワーククラスの課題だったら、あなたは多くのことを見逃すでしょう。もちろん、教授は通常、課題を作成する際にこれらのことを考慮に入れます。そのため、ほとんどの場合、クラスに関連する作業を行いますが、時には自分のことを知ることも重要ですすべきではない自分を書くことが重要ですあまりにも。
そうは言っても、いったん学校を去ると、既存のものを構築する時間を見つけるのは困難です。在学中に、できる限りの機会を利用してください。
SOで「ライブラリX /フレームワークYを使用する」というブラシオフが表示される場合は、質問の前に「自分でXを書いて詳細を教えてください」と書いてください。
プロジェクト、IMOの期限が設定されていない場合は、ホイールを再発明することをお勧めします。あなたが仕事を持っていない、または単にお金を稼ぐのではなく、プログラミングする学習を望んでいるなら、あなたをより良いプログラマーにしないショートカットを使うことのポイントは何ですか?あなたのプロジェクトをより速く終わらせるだけですか?これは事実ですが、ライブラリ、フレームワーク、および他の人々のコードの使用方法を知ることは間違いなく優れたスキルです。
私は新しく教育を受けた学生です。学校では、asp.netとC#を '学習'していました。教育にかかった2年間で、独自の電子メールシステム、ログインシステム、またはCMSを作成することはありませんでした。 。
私たちは102人の学生を始め、23人が完了しました。 4人が作品を持っています。その理由は?:私を含む4人は、実際に教育を始める前にプログラミングの方法を知っていました。
残りの人々は失われています。私たちは決して「車輪を再発明」しなかったからです。コードが実際にどのように機能するかを知ることはありませんでした。ユーザー管理を使用して完全なログインシステムを構築するのはかなり簡単です。しかし、私の教育の学生は、その方法を知りません。ログインシステムが実際にどのように機能するかを知らないためです。
悲しいかな、ある時点で、実際には2年間も無駄になって何も学ばなかったのです。 -私は、世界中の先生にこう言わせてください:ええ、私たちはフレームワークがあり、コードが存在することを知っています。実際の生活でそれらを使用できます。しかし、この教育では、プログラミングの方法を学びます。
多くのプログラミング教育は非常に短いので、教育はその時間内に多くのものをカバーする必要があります。物事のリストを半分にして、プログラミングにより多くの時間を費やした方がいいと思います。通常の「ホイール」の作り方を知っていれば、人々は「新しい種類のホイールを発明する」ことができます。人は少しの知識があれば愚かではありませんが、車について何も知らない人に車を建てるように頼むことはできません。しかし、自転車の作り方を知っている人に尋ねると、はるかに簡単になります。実際に車を組み立てます。
実生活では、ホイールは何度も何度も再発明されています。理由を探ると、プログラミングの車輪を再発明する必要があるときなど、いくつかの洞察が見つかるかもしれません。
シュメール時代以来、多くのことが変化しました:
それはソフトウェアの世界にどのように変換されますか?上手、
答えは、学習するか作成するかによって異なります。
学習が目的の場合、「ホイールを再発明する」ことで、既存のホイール(ライブラリー関数)を使用するよりも、洞察と理解を深めることができます。
しかし、複雑な製品を作成することが目的である場合、「ホイールの再発明」は時間のかかる作業であり、製品の作成にはほとんど役立ちません。
それでも、魂の目的が十分な時間とスタミナを備えた学習である場合、「ホイールの再発明」がすべての機能をカスタマイズするのに役立つため、最良の選択肢です。
それは本当にあなたが何をしているかに依存します。ホイールを理解しようとしている場合は、自分でホイールを再発明することをお勧めします。ただし、自動車を理解しようとしている場合、ホイールホイールまたは内燃エンジンを再発明することは、一般に無駄が多く、気が散ります。
したがって、たとえば、フルテキスト検索インデックスがどのように機能するかを理解することに興味がある場合は、独自のロールバックを試すことをお勧めします。ドキュメント管理用のアプリケーションを構築しようとしている場合は、既存のライブラリを再利用することをお勧めします。これは、ほとんどの作業で、アプリケーションアーキテクチャとユーザーエクスペリエンスが同時に正しくなるためです。
はい、生徒に車輪を再発明しないように指示するのが適切です。しかし、それが学生にとって何を意味するのかを明確に理解する必要があります。課題に密接に関係しているものを書きます。これは、割り当てがバブルソートを作成することであるか、ウィキペディアからコピーすることでも、フレームワークまたは言語で提供されている場合は、array.sortまたは同等のものを使用することでもありません。しかし、さまざまな並べ替えアルゴリズムをカバーした後、独自のバブルソートとクイックソートを作成し、新しい割り当てごとにそれを書き直さないでください。組み込みの並べ替えまたは作成したもののいずれかを使用し、同じ古いことをもう一度実行しないでください。
車輪を再発明することは、時間を無駄にすることではありません。これは、専門家と同様に学生にも当てはまります。違いは、目標があるかどうかにあります。生徒は学習する必要があるので、理解を深めないことは時間の浪費です。1つのバブルソートを作成した後、それが何をするかを理解し、大きなセットでそれを使用したくない理由を理解します。何度も書き換えるのは時間の無駄です。 25回目の書き換えでは、新しいことは何も学びません。
学生にとって、それは他の人が書いたものを書かないことを意味するのではなく、あなたがすでに習得したことをやり直さないことを意味します-その時間は、あなたが習得していないものに費やすことができます。
ホイールの作成には多くの考えと努力が費やされています。アドバイスは「ホイールを再発明しないこと」ですが、ホイールをリバースエンジニアリングして、特定のことがなぜ行われるのかを理解することができます。この後、独自の方法でホイールを実装してみると、3つの論理的な結果のいずれかが生じる可能性があります。
私にとって、学生は車輪を再発明すべきではありませんが、それをリバースエンジニアリングしてその影響を理解するようにしてください。
それは、ホイールがどのように機能するかを再考するか、他のタスクを実行する過程でホイールを再発明するかによって異なります。確かに、すべての学生が少なくとも1回は自分で実装する必要があるホイールがあります。いくつかの基本データ構造とアルゴリズムがコードのパフォーマンスにどのように影響するかを理解したり、さまざまな状況で使用するものを選択したりするには、いくつかの基本データ構造とアルゴリズムがどのように機能するかを知る必要があります。
スタック、ヒープ、リンクリスト、ツリーなどは、一度実装するだけの時間を投資する価値があります。その後、フレームワークによって提供されるものを使用します。 jQueryプラグインを使用するすべての人が少なくとも1つは作成する必要がありますが、これから使用するすべての種類のプラグインを作成する必要はありません。コンピューターの内部で何が行われているのかを理解できるように、小さなプロセススケジューラまたはミニOSを書くことは有用ですが、必須ではありません。ただし、プロセスやスレッドなどがどのように機能するかを理解する必要があります。
実用的な知識が得られたら、戻って新しい構造やアルゴリズムを実装し、それらの感触をつかむことも重要(そして楽しい)です。それがあなたの仕事であるか、あなたが本当にそれが得意でない限り、私はあなたのコードで既存のものを使用することに固執します。
これには2つの側面があります。
まず、学習しようとしている場合は、someを最初から実行するか、必要以上に低レベルのインターフェイスを使用すると便利です。ただし、学習している内容を特定する必要があります。HTTPプロトコルについて学びたい場合は、ソケットプログラミングを自分で行う必要はありません。 あなたが学んでいることだけを再発明する、そしてそれらを本当に探求し理解するためにそうするだけです。
しかし、-プロのプログラマーの最も重要なスキルの1つは、既存のソフトウェアを選択し、それについて学び、使用することです。これもまた学習する必要があることです。 SOに関する質問の大部分は、ドキュメントを読むことができない人々からのものであるようです。
最後に、プログラミングはかなりの理論的基礎に基づいています。理論を学ぶには、両方の実践的な演習と読書を併用する必要があります。
私も同じ状況に直面しています。産業界と学者の認識の違いによるものです。
「車輪を再発明」しないと、学校で何かを勉強したり、何かがどのように機能するかを理解したりすることはできません。
一方、業界では、時間と労力を最小限にして製品を引き出すことが目的です。
個人的に、私はうさぎの穴を掘り下げるのが好きで、私は業界の哲学を嫌っていますが、それがビジネスのやり方であり、文句を言うことはできません。
Hacker Jargon Lexikon は ホイールの再発明 について非常に良いコメントをしています:
既存のツールまたはツールの一部と同等のツールを設計または実装すること。これを行うことは、愚かなことまたは時間の無駄であることを意味します。これはしばしば正当な批判です。一方、自動車は木製のローラーを使用していないため、ホイールの種類によっては、正しく取り付ける前に何度も再発明する必要があります。第三に、車輪を再発明する人々は、オフセットされた車軸を持つ台形の道徳的同等物を思い付く傾向があります。
したがって、ホイールを再発明することは良いことかもしれませんが、それを実行する前または後に他のソリューションを確認するようにしてください。
回答A:車輪を再発明してください。データ構造とアルゴリズムについての理解を深め、優れたものを書く可能性が高くなります。グイドファンロッサムがPythonを使い始めたとき、人々は彼に車輪を再発明しないように言ったと確信しています。すでにたくさんの言語がありました。すでにYahoo! clangはどうですか?それをすべて学んでください。巨人になれ。小さな人々があなたを制限しないようにしてください。回答B:講師が何をすべきかを教えてくれた場合は、彼が望んでいることを教えてください。また、驚異的な解決策を作成することに夢中になりたい場合は、彼にそのリンクを提供してください。ただし、最初に、指定された要件を満たしているので、彼は満足しています。