すべての計算科学者が持つべき中核スキルは何ですか?[閉まっている]


52

すべての科学者は、統計について少し知っておく必要があります。相関の意味、信頼区間とは何かなどです。同様に、すべての科学者はコンピューティングについて少し知っておくべきです。問題は何ですか?すべての作業科学者がソフトウェアの構築と使用について知っていると期待するのは合理的ですか?コアスキルのリスト --- 名前に「クラウド」または「ペタ」を使用して何かに取り組む前に、人々が知っておくべきこと---

  • 基本的なプログラミング(ループ、条件、リスト、関数、およびファイルI / O)
  • シェル/基本シェルスクリプト
  • バージョン管理
  • プログラムをどれだけテストするか
  • 基本的なSQL

このリストにはないものたくさんあります:マトリックスプログラミング(MATLAB、NumPyなど)、使い慣れたスプレッドシート、ほとんどのプログラミング言語と同じくらい強力です)、Makeなどのタスク自動化ツールなど。

だから、あなたのリストには何がありますか?すべての科学者が最近知っていることを期待することは公平だと思いますか?そして、それのためのスペースを作るために上のリストから何を取りますか?すべてを学ぶのに十分な時間はありません。


1
いい質問です!しかし、私は1つのことについて明確ではありません:あなたは計算科学者とはどういう意味ですか?計算を使用する科学者はいますか?それとも、自分の職業上の称号を「計算科学者」と見なす人々のより小さなグループですか?
デビッドケッチャソン

9
スタック交換形式ではリストの質問はよくありません。すべてのサイトでこれを実際に行う必要がありますか?
dmckee

4
@Dan Community Wikiは、サイトに属さない質問を許可する言い訳ではありません。私はまた、ジェドから例を取るように答えている人と、少なくとも試みを奨励し、あなたが特定のスキルを必要とするか、他の人を必要としない理由を説明したいと思う
イヴォFlipse

5
@IvoFlipse:これは、何らかの形でサイトに属する質問です。たぶん、現在述べられているとおりではありません。多分それは小さな質問に切り刻まれ、言い換えられる必要があるかもしれませんが、計算科学における貧弱なソフトウェア工学の問題は非常に重要な問題です。Natureのこの記事はその理由を示しています。グレッグは、彼のWebサイトを通じて計算科学コミュニティに素晴らしいサービスを提供しています。
ジェフオックスベリー

5
この質問が閉じられていることに同意しません。meta.scicomp.stackexchange.com/questions/179/…を
デビッドケッチャソン

回答:


46

「Computational Scientist」には、紙/ LaTeXおよび概念実証の実装で数値分析を行う人、汎用ライブラリを作成する人、特定のクラスの問題を解決するアプリケーションを開発する人、およびそれらを利用するエンドユーザーが含まれるアプリケーション。これらのグループに必要なスキルは異なりますが、「フルスタック」にある程度精通していることには大きな利点があります。このスタックの重要な部分であると思うものについて説明します。そのレベルで働く人々はもちろん、より深い知識を持つべきです。

ドメイン知識(物理学および工学の背景など)

誰もが解決しようとしている問題のクラスの基本を知っている必要があります。PDEで作業する場合、これはいくつかのクラスのPDE(ポアソン、弾性、非圧縮性および圧縮性のナビエストークスなど)にある程度精通していることを意味します。特に、「正確に」エラー(これは、局所保存とシンプレクティックインテグレーターに関するメソッド選択を通知します)。アプリケーションに関係するいくつかの機能と分析タイプ(リフトとドラッグの最適化、故障の予測、パラメーターの反転など)について知っておく必要があります。

数学

誰もが自分の問題領域に関連するメソッドのクラスについてある程度一般的な知識を持っている必要があります。これには、スパース対デンス線形代数の基本特性、「高速メソッド」の可用性、空間的および時間的離散化手法の特性、および離散化手法が適切であるために必要な物理的問題の特性の評価方法が含まれます。あなたが主にエンドユーザーである場合、この知識は非常に高いレベルになります。

ソフトウェアエンジニアリングとライブラリ

抽象化技術とライブラリ設計にある程度精通していることは、計算科学のほとんどすべての人にとって有用です。概念実証の方法に取り組んでいる場合、これによりコードの構成が改善されます(他の誰かがそれを堅牢な実装に「変換」しやすくなります)。科学アプリケーションで作業している場合、これによりソフトウェアの拡張性が高まり、ライブラリとのインターフェイスが簡単になります。エラーをできるだけ早く検出し、エラーメッセージができるだけ情報を提供するように、コードを開発する際は慎重に対処してください。

道具

ソフトウェアでの作業は、計算科学の重要な部分です。選択した言語、エディターサポート(タグ、静的分析など)、およびデバッグツール(デバッガー、valgrind)に習熟していると、開発効率が大幅に向上します。バッチ環境で作業する場合は、ジョブを送信して対話型セッションを取得する方法を知っておく必要があります。コンパイルされたコードを使用する場合、コンパイラ、リンカー、およびMakeなどのビルドツールの実用的な知識が多くの時間を節約します。バージョン管理は、一人で作業している場合でも、すべての人にとって不可欠です。GitまたはMercurialを学び、すべてのプロジェクトに使用してください。ライブラリを開発する場合は、言語標準を合理的に完全に理解する必要があります。そのため、ほとんど常にポータブルコードを初めて作成します。

ラテックス

LaTeXは、科学出版とコラボレーションの事実上の標準です。LaTeXの習熟度は、結果を伝えたり、提案に協力したりするために重要です。図の作成をスクリプト化することは、再現性とデータの出自にとっても重要です。


7
私はジェドに同意します。LaTeXは絶対に必要です!:)
ポール

1
「物理学と工学」を主題の専門知識に変更します。結局のところ、私たちはすべて物理学者やエンジニアではありません。答えのその部分の精神は正しい場所にありますが、かなり明白な仮定があります。
Fomite

@EpiGradのおかげで、それらを例として「ドメイン知識」に変更しました。
ジェッドブラウン

良いリスト。パフォーマンスの問題に関する基本的な理解もそこにあるべきです。コードのプロファイリングという単純な概念を理解していない人に会ったことがあります。NB:パフォーマンスは、速度の問題だけでなく、メモリの使用量も意味するものと見なすべきです。
ファヒームミタ

タイプミス:「probelms」と「burried」。SEはそれらの修正を許可しません-編集が小さすぎます。
ファヒームミタ

26

私自身のバックグラウンドはコンピューターサイエンスの分野に属しているため、私の意見は少し偏っているかもしれません。そうは言っても、リストに「基本的なアルゴリズムとデータ構造」を追加します。基本とは、基本的に線形の検索と並べ替え、バランスの取れたツリー、ヒープ、ハッシュテーブルなどのデータ構造です。

どうして?まあ、ほとんどの計算アルゴリズムでは、データを移動するために実際には何も計算せずに、膨大な時間と労力を費やすことになります。有限要素コードを実装したことがありますか?それは約90%のデータ編成です。これを実行することとそれを適切に実行することとの違いは、計算効率の桁違いです。

コンピュータサイエンスに関連する小さな点の1つは、プロセッサが実際にどのように機能するのか、何が得意で何が得意ではないかについての短い紹介です。例えば:

  • 加算と乗算は高速ですが、除算または超越関数は高速ではありません。成長した男性は、平方根演算を3つの部門を必要とするものに置き換え、素晴らしいことをしたと考えています(部門と平方根は同じくらい高価です)。
  • レベル3キャッシュは年々大きくなっていますが、レベル0キャッシュ、つまり非常に高速なキャッシュはまだ数キロバイトです。
  • コンパイラは魔法ではありません。小さなループを展開したり、非常に簡単な操作をベクトル化したりできますが、そのバブルソートをクイックソートに変換することはありません。
  • 最も内側のループで多重継承を持つポリモーフィックオブジェクトのメソッドを呼び出すことは、概念的には甘いかもしれませんが、CPUが自分自身を殺したくなるでしょう。

これは非常に退屈なものですが、説明するのに数分しかかかりません。念頭に置いておくと、最初からの良いコードを記述したり、存在しないハードウェア機能に依存しないアルゴリズムを設計したりできます。

リストから何を削除するかについては、計算科学者にとってSQLは少し重要だと思います。また、ソフトウェアテストは重要ですが、それ自体が科学です。単体テストと正しい抽象データ型は、基本的なプログラミングで教えるべきものであり、2年間の修士課程を必要としません。


2
まったく退屈ではありません。それが提供されていれば、私はそのようなコースを取ります。:-)
ファヒームミタ

18

後でこれを追加することもありますが、まずは「シェルスクリプト」を削除し、具体的には「Pythonスクリプト」に置き換えます。Pythonは、シェルスクリプトよりもはるかに移植性が高く、同等のシェルおよびスクリプト言語よりも読みやすくなっています。その大きな標準ライブラリと科学での人気(Perlも使用している生物学の例外を除く)は、プログラミングを学ぶための優れた第一言語は言うまでもなく、素晴らしい計算上の共通語となります。現在、MITのEECS専攻に最初に教えられている言語であり、特に科学計算での雇用市場で人気があります。そのオンラインドキュメントは広範であり、Pythonに基づいたプログラミングテキストもオンラインで入手できます。

Pythonを使用すると、基本的なプログラミング構造とスクリプトを教えることができます。さらに、Pythonは単体テストのサポートが優れているため、Pythonを使用して単体テストを教えることもできます。Pythonには、広範なデータベースAPI(SQLを学習する必要がある代わりに、または追加できる)と、Makeのような機能を提供するいくつかのビルドユーティリティもあります。個人的には、MakeよりもSConsの方が好きです。なぜなら、シェルスクリプトよりもPythonの文書化とテストが簡単だからです。

最終的に、Pythonに対する私のあからさまなシリングの背後にある動機付けの原則は効率です。1つの言語または1つのツールでほとんどの作業を行える場合、特にそのツールが表現力豊かなスクリプト言語である場合、ワークフローを合理化するのははるかに簡単です。もちろん、Cですべてを実行できますが、私のプログラムは5倍の長さになります。そして、おそらく、速度は必要ありません。代わりに、Pythonを使用して、テキストファイルからデータをインポートし、プロットし、最適化ルーチンを呼び出し、ランダム変量を生成し、結果をプロットし、結果をテキストファイルに書き込み、コードを単体テストできます。Pythonが遅すぎる場合、計算集中型のタスクを処理するC、C ++、またはFortranコードをPythonでラップすることができます。Pythonは、私にとって、科学的なコンピューティングニーズのほとんどに対応するワンストップショップです。

Pythonはまだ正確にはMATLABではありません。SciPyとNumPyには機能の面でまだ進む方法がありますが、一般的なユーティリティの観点では、MATLABよりもさまざまなタスクにPythonを使用しています。


7
私は仕方がありませんが、これに完全に反対します。Pythonはシステムメンテナーにとって頭痛の種です。Pythonは動いているターゲットだからです。計算科学者は、最も初歩的なものの接着と、使用する可能性のあるシステムでのジョブの実行について、bashまたはcshの基本的な理解が必要です。Pythonは素晴らしく、私はあなたが計算の人々がそれを学ぶことを提唱することを支持しますが、初歩的なシェルを犠牲にしてではありません。
ビル・バルト

7
@BillBarth:計算科学者は皆、非常に基本的なスクリプトのために基本的なbashまたはcshを学ばなければならないと思います。これらの基本的なタスクを超えてシェルスクリプトにPythonを使用することを提唱する理由は、基本的にプログラムを実行する数千行のbashスクリプトを継承したためです。ファイルをセマフォとしてやり取りし、PBSを繰り返し呼び出しますが、それをテストする方法はまったくありません。シェルスクリプトは、小さなタスクには適していますが、大きなタスクには適していません。このダクトテープとバブルガムの悪夢は、私の論文を数年費やしているので、私は主張しています。
ジェフオックスベリー

2
私が言ったように、私は「Pythonを学ぶ」がリストに適切であるかもしれないことに同意しません。「シェルスクリプト」を犠牲にしてやりたくありません。両方が重要であり、誰もシェルとしてipythonを実行することはできないため、シェルスクリプトは非常に重要です。
ビル・バルト

3
@BillBarth:Pythonがシェルを置き換えることを示唆しているところはどこにもありません。Pythonがスクリプトのbashを置き換えることを提案しているだけです。基本的なbashを学べば、制御構造なしでスクリプトを書くのに十分な知識があるので、「bashスクリプト」に深く入る必要はないと思います。bashでのプログラミングはソフトウェアやライブラリのメンテナーにとって頭痛の種であるため、制御構造を含めたい場合はすぐに別の言語に切り替える必要があります。
ジェフオックスベリー

1
+1。しばらくの間、Pythonは私の主要なプログラミング言語でした。完璧ではありませんが、誰かが完璧なプログラミング言語を発明するまではそれで十分です。
ファヒームミタ

14

浮動小数点演算。 ほとんどの科学は現実世界の価値を扱っており、現実世界の価値はしばしばコンピューターの世界で浮動小数点として表されます。結果の意味を損なう可能性のあるフロートを備えた多くの潜在的な落とし穴があります。

このトピックのお気に入りのリファレンスは、David Goldbergによる「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと(1991)」のようです。http://citeseerx.ist.psu.edu/viewdoc/summary?doi = 10.1.1.22.6768


1
このドキュメントは、オンラインフォーラムで何度も言及されています。しかし、それは非常に長くて緻密な記事であり、実際にこれから有用なものを奪うことができた人の数はわかりません。
ジョングリーン

12

計算科学者は、コンピューターサイエンス、数学、および科学/工学の応用分野に十分な知識が必要です。次の各領域にスキルを含めます。

数学:

  1. 数値解析
  2. 線形代数
  3. 常微分方程式、偏微分方程式、確率微分方程式
  4. 最適化
  5. 統計および/または確率
  6. 逆理論

コンピュータサイエンス:

  1. アルゴリズム
  2. データ構造
  3. 並列プログラミング(MPI、OpenMP、CUDAなど)
  4. 科学的可視化
  5. コンピュータアーキテクチャ
  6. Linux環境を使用する

科学/工学-専門にしたいアプリケーションに依存します。私の特定のケース(工学)では、連続体力学、熱伝達、流体力学、有限要素法などを追加します。あなたは複数の科学分野を持っているので、あなたは計算科学者としてより多才です。


「逆理論」について詳しく説明していただけますか?
ファヒムミタ

1
@FaheemMitha:従来、モデルのパラメーター(偏微分方程式など)を最初に設定してから、システムの動作を観察していました。「逆問題」とは逆のことです。システムの出力の観測から始め、これらの観測を生成するモデルのパラメーターを決定しようとします。逆理論では、このタスクを達成する方法について説明します。
ポール

説明ありがとう。このトピックについての良いリンク/リファレンスがありますか?
ファヒムミタ

2
en.wikipedia.org/wiki/Inverse_problem は、開始するのに適した場所です。 space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdfにも概要があります。しかし、より深く理解するために、amazon.com / Parameter
Paul

4

すばらしい質問に続いて、魅力的な回答があります!ちょっとだけ追加していきたいと思います。私が経験した限り(自分自身と代弁者)、オールインワンツールは通常、知っておくと良いでしょう。そのようなツールは、MATLAB、Octave、またはPython(ライブラリ付き)でさえあります。「コンフォートゾーン」で問題が発生した場合はいつでも(私が知っている限りでは)、オールインワンツールを試してみることをお勧めします。後で独自のコードを書くことができます。このようなパッケージの美しさは、プログラミングがあなたがしていることの理解を妨げないことです。

コンピューターグラフィックスの例を見てみましょう。図の変換、回転、スケーリングのためのコードの記述は、MATLABの10行のコード(トップ)ですが、Cのページで実行できます。Cが良くないとは言いません。私が言っているのは、Cでコードを記述する正当な理由がない場合、MATLABはよりシンプルで、より良く、より直感的な方法になるということです。

Cに似たプログラミングは直観を構築するための優れた方法であると反対する人もいるかもしれません。たぶんそうです。しかし、問題に数回以上対処する必要がない場合、Cのような言語で独自のコードを作成して記述することはほとんど保証されません。


-1

常識と直感...後者は、時間とともに、そして大きな悪い世界でいくつかの恥ずべき経験を「生き残った」後にだけ来ます。


3
「直感」が本当にスキルなのかはわかりません。それは以前の経験に対する単なる本能的な反応です。
naught101
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.