コードのアーカイブの寿命を延ばす


11

再現可能な科学的結果に目を向けて、コードの寿命を確保するためのベストプラクティスの公開リストはありますか?(例えば、オープンソース、ドキュメント作成、依存関係の選択、言語の選択、仮想マシンなど)。

典型的な科学的コードまたは他のソフトウェアの半減期を推定しようとした研究(またはそれが欠けている例/逸話)


回答:


8

TeXの計画された寿命が頭に浮かびます:

「1977年に始まって以来、私が着手したTeXの研究プロジェクトは、2つの大きな目標によって推進されました。最初の目標は品質でした。単に素晴らしいだけでなく、実際には最高のドキュメントを作成したかったのです。(…)2番目の主要な目標はアーカイブでした。印刷技術の変化に可能な限り依存しないシステムを作成することです。次世代の印刷デバイスが登場したとき、私はすべての問題を新たに解決する代わりに、すでに達成された同じ品質を維持できるようにしたかったのです。私は100年後にも使えるものを設計したかったのです。」–ドナルドE.クヌース:デジタルタイポグラフィ、p。559(http://de.wikipedia.org/wiki/TeXから引用)

デジタルタイポグラフィに関するKnuthの本に基づいて、TeXとMETAFONTの完全な再実装さえ可能になるはずです。すべてのコードの注釈と説明が含まれています。

結果が何十年も安定していることを要求することで、一種の凍結のジレンマに陥ります。一方で、結果を100%簡単に再現したいので、ソフトウェア/環境をフリーズします。一方、将来あなたの結果を再現することに興味がある人は、確かにそれを基にしたいと思うでしょう。この人は非常に古いソフトウェアにこだわるので、何かを変更するのは非常に困難です。いくつかの外部パッケージに基づいて構築されるものについては、実際には変更できないようにするために、すでに数年で十分です。

TeXの場合、凍結は1990年の記事で発表されています

TEXとMETAFONTの未来 http://www.ntg.nl/maps/05/34.pdf

「複雑なシステムを改善することは公理的ではありますが、不変のシステムには大きな価値があると強く信じています。したがって、TEXおよびMETAFONTと呼ばれるシステムをさらに「改善」することは賢明ではないと考えます。固定ポイントとしてのシステム。これは、現在生産している100年後と同じ結果をもたらすはずです。」

理想的なシステムは、再現性と可変性を兼ね備えています。可能な限り自己完結型で、シンプルで、十分にテストされているようにすることは、確かに役立ちます。

元の質問からあまりにも嫌悪感を感じていた場合はご容赦ください。[「Scientists for Reproducible Research」reproducible-research@googlegroups.comからクロス投稿]


これをマティアスにもたらしてくれてありがとう。scicompへようこそ!
アロンアーマディア

2
TeXの例は、凍結されたシステムの古典的なケースと一般に考えられているにもかかわらず、実際にはあまり良いものではないと思います。私がそう思う理由は、誰もTeXを直接使用しなくなったからです。人々は、その無限のパッケージと一緒にラテックスを使用しますが、それらはほとんど凍結されていません。結果として、(La)TeX文書は他のすべてと同様に変更される可能性があると思います。私にとって、TeXは仮想マシンのようなものです。凍結したままでもかまいませんが、その上に構築されたコードが変化し続ける限り、何も勝ちません。
ウルフギャングバンガース

おかげで、これはソフトウェア開発の観点からの優れたケーススタディだと思います。これは科学的な観点とはかなり異なるかもしれません。誰もが間接的にTeXでビルドする必要があるという事実は、広く使用されているソフトウェアにとって理想的ではないかもしれませんが、科学コードが引き続き正常に実行され、数十年後にビルドできるという理想的なデモンストレーションです。しかし、確かにKnuthは、100年の安定性を追求するために、変更と更新をより簡単に回避しましたか?
cboettig

4

計算結果の正確なビットごとの再現性を達成するのが非常に困難になる多くの技術的課題があります。

ソフトウェアレベルでは、コードまたはコード使用するライブラリを変更すると、明らかに異なる結果が生成される可能性があります。最終的には典型的な科学的コードにリンクされるサポートライブラリの数に驚くでしょう。

下位レベルでは、新しいコンパイラーまたは異なるコンパイラー最適化をオンにして、コードで使用されるコードまたはライブラリーを再コンパイルすると、問題が発生する可能性があります。1つの理由は、コードを再コンパイルすると、コード内のさまざまな操作が異なる順序で実行される可能性があるためです。浮動小数点加算は連想的ではないため(a + b)+ c <> a +(b + c)、これは異なる結果をもたらす可能性があります。

それでは、ソフトウェア環境全体(OS、ライブラリ、コンパイル済みコード)を(たとえば)コードを実行するブート可能なCD-Romに焼き付けることによって保存するとどうなりますか。このコードを別のコンピューターで実行しても同じ結果が得られることを確認できますか?

驚くべきことに、いくつかのコードは、実行している特定のプロセッサモデルの側面に基づいて計算の順序を実際に変えます。たとえば、最適化された線形代数ライブラリは通常、行列乗算を分割してキャッシュに収まるブロックで機能します。Intelがより大きなキャッシュを備えた新しいマイクロプロセッサをリリースすると、コードがブロックサイズを動的に調整し、異なる順序で実行される演算と異なる結果をもたらす可能性があります。他のコードは、利用可能なメモリの量に基づいて計算の順序を動的に調整します-計算を異なる順序で実行し、異なる結果をもたらす可能性があるより多くのメモリを持つコンピュータでコードを実行する場合

異なるスレッドの正確な実行履歴はしばしば非決定的であるため、マルチスレッドコードを投入すると事態は驚くほど複雑になります。これにより、実行ごとに異なる順序で算術演算が実行される可能性があります。

実際に最も期待できるのは、使用するアルゴリズムの精度の許容範囲まで、あるマシンから次のマシンへと類似した結果です。たとえば、ルート検索の問題があり、二分法を使用して+ -1.0e-10以内にルートを取得する場合、さまざまなマシンがその許容範囲内で一致する回答を生成している限り、満足するはずです。


ちなみに、異なるコンパイラバージョンの問題は、「凍結」バージョンのソースコードを配布するだけでは十分ではない理由を説明しています。異なる結果につながります。
ブライアンボーチャーズ

2

再現性を実現するための多くの試みがあり、このトピックに関する文献があります。15年間の科学ソフトウェアからの私の個人的な意見は、それが非現実的であり、その答えを見つけるのと同じくらい満足できないというものです。問題は、(i)複雑なソフトウェアにはバグがあり、凍結できないことです。(ii)ソフトウェアは機能が完全ではないため、開発は継続されます。(iii)数十万行のコードを紙で提供することの価値は何ですか?

私が言うように、私はこの答えが不十分だと思う。私は、フィールドとして、計算科学は、私たちが公表する結果が正確で再現可能であるという信頼を植え付ける文学を生み出すことにあまり成功していないと信じています。同時に、物事をより良くする方法を思い付くことができません。確かに、論文に付随するソースコードをリリースすることは有用です。同時に、正直な人なら誰でも、論文の結果は通常、異なる境界条件、異なる右側などを記述するハッキングを含む異なるバージョンのコードによって生成されることに同意するでしょう。同じコードの異なるバージョンが付属しています。そもそも読者にとっては厄介です、しかし、今日よくあるようにコードが大きい場合、まったく非生産的です-私の最新の2つの論文は、約20,000行のコードであり、取引に基づいて構築されたコードを使用しました.II(600,000行のコード)とTrilinos(1.5M行)コードの)。それは潜在的な読者にどのような情報を提供しますか?(それにもかかわらず、私のコードは利用可能であると言うべきです。)


2
私は悲観的ではありませんが、まだ満足していません。特定の論文で結果を生成したコードに関連付けられたリビジョン管理タグまたはリビジョン番号を簡単に報告できます。完全に精巧な著者は、特定の記事に重要なすべての結果を1つのコードベースで再実行します。リビジョン管理システムが設置されていて、公開されていて、タグが公開されている場合、コード自体を配信する必要はないと思います。
ビル・バルト

確かに、あなたはそれをすることができます。問題は、読者が彼女に投げかける大量のコードをどうするかということです。はい、実行でき、結果が表示されているものと同じであることを確認できます。しかし、それは何を実証していますか?理論ではなく実際の実践で、結果が正しいことを誰がどのように検証しますか?
ウルフギャングバンガース

いいえ、それは私が完全に同意している部分です。あなたが不you慎な人だと思わない限り、答えを正確に再現するためにコードを再実行する必要はありません。大きな問題は、実装を検証したことを十分に実証したかどうか、および実験に対して検証できるかどうかだと思います。
ビル・バルト

ありがとう そこ議論する余地は確かであるなぜ 15年後のコードが利用可能持つことで有用なのは、しかし、この質問に私は単純に求めていた場合、そのコードはまだほとんどの人々のために実行します、与えられたあなたがそれをアーカイブしたこと。私はコードのアーカイブを奨励する文献に精通していますが、40年前にパンチカードのグローバルアーカイブを奨励した人はいませんでした。テクノロジーはソフトウェアの半減期を延長または短縮しましたか?アーカイブされたコードが5年後に電信の道を行く場合、他の問題はとにかくミュートされます。
cboettig

かなりの作業があれば、15年前にコードを書いて今日実行できると確信しています。15年で実行できるように、今日から適切に記述されたコードを取得できると確信しています。
ウルフギャングバンガース

2

この問題の可能な解決策については、ActivePapersプロジェクトを参照してください。要約すると、各ソフトウェアコンポーネントの特定のバージョンへの明示的な依存関係とともに、データとコードをパッケージ化する方法について説明します。これにより、同じデータで更新されたソフトウェアを実行することを許可しながら、計算を正確に再現することができます。

ActivePapersは概念実証にすぎず、近い将来実用化される可能性は低いと付け加えます。その理由は、すべての実行可能コードがJVMバイトコードとして存在しなければならないという原則に基づいているためです。現時点では、これはあまりにも多くの人気のある科学図書館を除外しています。ただし、再現性が重要であると認識されると、プログラミングツールの優先順位も変わる可能性があります。


1

言語の選択に関しては、標準化された言語(C / Fortran / C ++など)を使用することで「ベストプラクティス」と見なされると思います。パッケージが他の10個のlibs / packages、特に曖昧な言語で書かれたものに依存している場合、それは明らかに寿命にとって悪いことです。多くのプロジェクトは、しばらくして孤立することになります。BLAS / LAPACK、PETSc、FFTW、MPIなどの主要なライブラリ/ APIがすぐに消えるとは思わない。BLASはすでにかなり古いです。

次のコード(http://www.math.utah.edu/software/c-with-fortran.htmlから盗まれた)はFortran 77より前のバージョンで、文字操作にホレリス定数を使用していますが、40〜50年後には正常にコンパイルされます。 GNU Fortranコンパイラー:

stali@x61:~$ cat olde.f

       CALL S(12HHello, world, 12)
       END
       SUBROUTINE S(MSG,N)
       INTEGER K, N, M
       INTEGER MSG(1)
       M = (N + 3) / 4
       WRITE (6,'(20A4)') (MSG(K), K = 1,M)
       END

stali@x61:~$ gfortran -std=legacy olde.f; ./a.out
Hello, world

すぐに消える可能性が低いgooglecodeのような場所でオープンソース化/アップロードすることは簡単です(ただし、コード検索をシャットダウンしましたが)。


例に感謝します!スクリプト言語を含む他の言語で比較したいのですが、perl、python、またはRで書かれた最初のコードは同じ結果で実行されますか?彼らはそうする可能性が高いのですか、それともCまたはFortranよりも少ないのでしょうか?
cboettig
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.