私は大学院で工学の研究を始めており、計算科学プロジェクトに取り組んでいます。ここで、独自のアルゴリズムを実装することの利点と欠点についていくつかの議論があったことに気づきました。独自のアルゴリズムを実装する場合とライブラリを使用する場合の費用便益分析は、大学院生である場合と異なりますか?
私は大学院で工学の研究を始めており、計算科学プロジェクトに取り組んでいます。ここで、独自のアルゴリズムを実装することの利点と欠点についていくつかの議論があったことに気づきました。独自のアルゴリズムを実装する場合とライブラリを使用する場合の費用便益分析は、大学院生である場合と異なりますか?
回答:
私の意見では、開始大学院生デビッドKetchesonで答えを変更しないことここにあなたがあなたの記事にリンクした質問へ。
学習したいアルゴリズムの最小限のバージョンをコーディングします。次に、それらを脇に置きます。独自のアルゴリズムをコーディングすることは学習に最も役立ちますが、研究(または本番)コードの場合は、最先端のライブラリ(存在する場合でも)を改善するソフトウェアを書くことが研究の目標でない限り、ライブラリを使用することをお勧めします。自分でコーディングした場合よりも、ライブラリはドキュメント化が進んでおり、拡張性が高く、堅牢である可能性があります。また、ライブラリはテストおよびデバッグされる可能性があります(もちろん、ライブラリの作成者によって異なりますが...)。学位論文用に作成したコードのサポート、デバッグ、テストを担当し、時間を節約することで、作成する必要があるコードの量を最小限に抑えることができます。
私が考えることができる他の唯一のシナリオ(つまり、他にもあるかもしれません)は次のとおりです。
ジェフの思慮深い答えにさらに幅を広げたいと思います。特に、学者としての初期のキャリアにおける研究努力とは対照的に、プログラミング努力の価値についてもう少し見解を述べたいと思います。
科学的研究を強化するソフトウェアを作成できると、ほとんどすべての研究チームの貴重なメンバーになります。ただし、この時間は、あなたの同業他社や学術的地位を採用している人々によって「価値がある」とは必ずしも見なされません。
プリンストンで実施された2011年の調査「コンピュータ科学の実践に関する調査」から:
科学者はかなりの量の研究時間をプログラミングに費やしています。科学者は、平均して、研究時間の35%がソフトウェアのプログラミング/開発に費やされていると推定しています。最初はコードの記述にある程度の時間が費やされていますが、多くの時間は多くの面倒な作業に費やされています。たとえば、R / Stataを使用した政治社会学の研究者は、国勢調査データをR / Stataの個々のパッケージが理解できる形式に改造するために、かなりのプログラミングを行わなければなりませんでした。化学工学の一部の研究者は、コードを新しい燃料に適合させるために、元の著者が卒業してからずっと後に、火炎シミュレーションを実行する文書化されていないレガシーコードをリバースエンジニアリングする必要がありました...それにもかかわらず、これらの研究者の大多数は、プログラミングよりも多くの時間を費やしてください」
コアライブラリやアプリケーションを実装または再設計するのが良い考えではないという意味ではありませんが、深刻なソフトウェア開発(コードの操作に25%以上の時間を費やす)を行う場合は、これら3つを維持してください。念頭に置いて考え。
複雑さとリスクは、プロジェクトの規模と開発者の数に応じて指数関数的に増加します。ラボを超えて拡張するソフトウェアの大部分または開発者のチームで記述または作業するまでは、これを十分に理解し、適切に作業を予測することは困難です。
あなたは上手である必要があります。有用なソフトウェアを作成するには、プログラマーとしても、アプリケーションサイエンティストとしても、ある程度の成熟が必要です。重要な機能とは何か、数値リスクはどこにあるのかを把握し、特定の機能と堅牢性のセットに対するプログラミング作業を予測できる必要があります。もちろん、成功するための唯一の方法は、あなたがリードしていないプロジェクト、または安全に失敗したり遅れたりする可能性があるプロジェクトに時間を費やすことです。
多くの研究室や産業ではプログラミングの価値が非常に高く評価されていますが、科学的プログラミングは、たとえソフトウェアが論文よりも科学に利益をもたらすとしても、学業に悪影響を与える可能性があります。プログラミングの方法、コードの文書化、堅牢化の学習に費やしているすべての時間は、書かれていない論文に変換されます。これは、学生の引用数に利益をもたらすことなく、アドバイザーのグループに利益をもたらす作業を学生が提供できるケースの1つであるため、アドバイザーは常にここで学生の最善の利益を念頭に置くとは限りません。興味のある分野で1人以上の信頼できるメンターを探し、どの貢献が価値があると考えられるかを明確に理解してください。 academia.stackexchange.com これについてフォローアップの質問をするのに最適な場所です。
脚注として:応用分野であろうと、密な線形代数などのより技術的なものであろうと、あらゆる計算分野を大幅に前進させるワンマンエフォートプロジェクトの数は着実に減少しています。計算研究の「パンとバター」を形成するソフトウェアパッケージの数は、10年以上も増え続けています。この成熟度に達していない科学的コードは、バグが多く、機能が少なく、ドキュメントが少ない傾向があります。古くても、アクティブにサポートされていない未熟なコードを使用しないようにしてください。
費用便益分析は、研究中に達成したい科学的計算リテラシーに依存すると思います。
科学計算に熟練したコンピューターで作業するほとんどの科学者にとって、これは十分です。これには、使用される主なアルゴリズムの高レベル(抽象的な)理解、およびソフトウェアライブラリ(ソフトウェアの構築、リンク、使用)を効果的に使用できるプログラミングスキルが必要です。メーリングリスト)。
対照的に、科学計算分野の専門家になることを計画している場合は、数値計算法、浮動小数点演算、および計算技術を深く理解する必要があります。あなたは本からこれらのトピックの理論を学ぶことができますが、実践を通しての経験は、高度なスキルを構築して維持するために必要です。したがって、学習中に使用するものすべてをプログラムすることは素晴らしいアイデアです(たとえば、シェフのように料理したい場合:自分が調理したものを食べ、頻繁に料理することによって学びます!)
どの程度の熟達度があなたのキャリアに依存します。あなたの分野で働く人々がどのレベルのスキルを使用しているかを確認してください。