計算手法を学ぶための優先事項、大学院生としてライブラリを使用するのと比較して、自分のコードをいつ書くべきですか?


10

私は大学院で工学の研究を始めており、計算科学プロジェクトに取り組んでいます。ここで、独自のアルゴリズムを実装することの利点と欠点についていくつかの議論があったことに気づきました。独自のアルゴリズムを実装する場合とライブラリを使用する場合の費用便益分析は、大学院生である場合と異なりますか?


2
私は長い回答をしていましたが、別のmodとのいくつかの議論の後、私はそれを削除してあなたの質問の説明を求めることにしました。あなたの質問の要点は何ですか?「学習をどこに重点を置くか」、「学習とモデリングの進捗を優先することをどのように推奨しますか」、「自己実装コードよりもライブラリを選択することは、解決する問題に依存しますか」、または「利点は何ですか/私のキャリアのかなり早い段階で自分のアルゴリズムをコーディングすることの欠点?」私の答えは広すぎたので、より的を絞った質問に対して的を絞った答えを与える方がよいでしょう。
Geoff Oxberry 2012

太字のセクションを追加して、質問の内容を明確にしましたが、残りはそのままにしておきました。他のパーツを削除する必要があると感じた場合は、遠慮なくお問い合わせください。
Godric Seer 2012

ありがとうございました。いくつかの編集を行って質問に焦点を合わせ、それから回答を投稿します。
Geoff Oxberry、2012

回答:


10

私の意見では、開始大学院生デビッドKetchesonで答えを変更しないことここにあなたがあなたの記事にリンクした質問へ。

学習したいアルゴリズムの最小限のバージョンをコーディングします。次に、それらを脇に置きます。独自のアルゴリズムをコーディングすることは学習に最も役​​立ちますが、研究(または本番)コードの場合は、最先端のライブラリ(存在する場合でも)を改善するソフトウェアを書くことが研究の目標でない限り、ライブラリを使用することをお勧めします。自分でコーディングした場合よりも、ライブラリはドキュメント化が進んでおり、拡張性が高く、堅牢である可能性があります。また、ライブラリはテストおよびデバッグされる可能性があります(もちろん、ライブラリの作成者によって異なりますが...)。学位論文用に作成したコードのサポート、デバッグ、テストを担当し、時間を節約することで、作成する必要があるコードの量を最小限に抑えることができます。

私が考えることができる他の唯一のシナリオ(つまり、他にもあるかもしれません)は次のとおりです。

  • 必要な機能を提供するライブラリはありません。他の人が利益を得られるように、既存のオープンソースライブラリに貢献するか、独自のオープンソースライブラリを作成することを検討してください。
  • 追加のパフォーマンスが必要であり、それを得るために特別な問題構造を活用できます。次に、既存のライブラリを文書化して変更するか、パフォーマンスの高い実装を自分で作成します。
  • 監督者はあなたがあなた自身のソフトウェアを転がすことを要求します。まあ、あなたは自分でそこにいるのですが、ライブラリを使用するほうがよいと彼らに納得させるために、上記のポイントを取り上げることをお勧めします(状況でそれが可能な限り)。

10

ジェフの思慮深い答えにさらに幅を広げたいと思います。特に、学者としての初期のキャリアにおける研究努力とは対照的に、プログラミング努力の価値についてもう少し見解を述べたいと思います。

科学的研究を強化するソフトウェアを作成できると、ほとんどすべての研究チームの貴重なメンバーになります。ただし、この時間は、あなたの同業他社や学術的地位を採用している人々によって「価値がある」とは必ずしも見なされません。

プリンストンで実施された2011年の調査「コンピュータ科学の実践に関する調査」から

科学者はかなりの量の研究時間をプログラミングに費やしています。科学者は、平均して、研究時間の35%がソフトウェアのプログラミング/開発に費やされていると推定しています。最初はコードの記述にある程度の時間が費やされていますが、多くの時間は多くの面倒な作業に費やされています。たとえば、R / Stataを使用した政治社会学の研究者は、国勢調査データをR / Stataの個々のパッケージが理解できる形式に改造するために、かなりのプログラミングを行わなければなりませんでした。化学工学の一部の研究者は、コードを新しい燃料に適合させるために、元の著者が卒業してからずっと後に、火炎シミュレーションを実行する文書化されていないレガシーコードをリバースエンジニアリングする必要がありました...それにもかかわらず、これらの研究者の大多数は、プログラミングよりも多くの時間を費やしてください」

コアライブラリやアプリケーションを実装または再設計するのが良い考えではないという意味ではありませんが、深刻なソフトウェア開発(コードの操作に25%以上の時間を費やす)を行う場合は、これら3つを維持してください。念頭に置いて考え。

  • 複雑さとリスクは、プロジェクトの規模と開発者の数に応じて指数関数的に増加します。ラボを超えて拡張するソフトウェアの大部分または開発者のチームで記述または作業するまでは、これを十分に理解し、適切に作業を予測することは困難です。

  • あなたは上手である必要があります。有用なソフトウェアを作成するには、プログラマーとしても、アプリケーションサイエンティストとしても、ある程度の成熟が必要です。重要な機能とは何か、数値リスクはどこにあるのかを把握し、特定の機能と堅牢性のセットに対するプログラミング作業を予測できる必要があります。もちろん、成功するための唯一の方法は、あなたがリードしていないプロジェクト、または安全に失敗したり遅れたりする可能性があるプロジェクトに時間を費やすことです。

  • 多くの研究室や産業ではプログラミングの価値が非常に高く評価されていますが、科学的プログラミングは、たとえソフトウェアが論文よりも科学に利益をもたらすとしても、学業に悪影響を与える可能性があります。プログラミングの方法、コードの文書化、堅牢化の学習に費やしているすべての時間は、書かれていない論文に変換されます。これは、学生の引用数に利益をもたらすことなく、アドバイザーのグループに利益をもたらす作業を学生が提供できるケースの1つであるため、アドバイザーは常にここで学生の最善の利益を念頭に置くとは限りません。興味のある分野で1人以上の信頼できるメンターを探し、どの貢献が価値があると考えられるかを明確に理解してください。 academia.stackexchange.com これについてフォローアップの質問をするのに最適な場所です。


脚注として:応用分野であろうと、密な線形代数などのより技術的なものであろうと、あらゆる計算分野を大幅に前進させるワンマンエフォートプロジェクトの数は着実に減少しています。計算研究の「パンとバター」を形成するソフトウェアパッケージの数は、10年以上も増え続けています。この成熟度に達していない科学的コードは、バグが多く、機能が少なく、ドキュメントが少ない傾向があります。古くても、アクティブにサポートされていない未熟なコードを使用しないようにしてください。


私はすでに紙の数を心配していました。私は実験的な学生の大規模なセットの計算の学生になるので、私は多くの2番目と3番目の著者を持つことになるでしょう。また、最初は異なるプログラムのみを組み合わせる可能性があります(私の研究室の0Dコード、他の大学の2Dコード、私の大学の別の研究室のMeshingソフトウェア)。これについて検討することは間違いなくたくさんあります。
Godric Seer

6

費用便益分析は、研究中に達成したい科学的計算リテラシーに依存すると思います。

科学計算に熟練したコンピューターで作業するほとんどの科学者にとって、これは十分です。これには、使用される主なアルゴリズムの高レベル(抽象的な)理解、およびソフトウェアライブラリ(ソフトウェアの構築、リンク、使用)を効果的に使用できるプログラミングスキルが必要です。メーリングリスト)。

対照的に、科学計算分野の専門家になることを計画している場合は、数値計算法、浮動小数点演算、および計算技術を深く理解する必要があります。あなたは本からこれらのトピックの理論を学ぶことができますが、実践を通しての経験は、高度なスキルを構築して維持するために必要です。したがって、学習中に使用するものすべてをプログラムすることは素晴らしいアイデアです(たとえば、シェフのように料理したい場合:自分が調理したものを食べ、頻繁に料理することによって学びます!)

どの程度の熟達度があなたのキャリアに依存します。あなたの分野で働く人々がどのレベルのスキルを使用しているかを確認してください。

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