보관 기간 연장 코드


11

재현 가능한 과학적 결과를 염두에두고 코드 수명을 보장하는 모범 사례 목록이 게시되어 있습니까? (예 : 오픈 소스, 문서 관행, 종속성 선택, 언어 선택, 가상 머신 등).

일반적인 과학 코드 또는 다른 소프트웨어의 반감기를 추정하려고 시도한 연구 (또는 예제 / 비례가없는)에 대해 알고 있습니다 (합리적인 질문이있는 경우).


답변:


8

TeX의 계획된 수명은 다음과 같습니다.

“1977 년에 시작된 이래로 제가 시작한 TeX 연구 프로젝트는 두 가지 주요 목표에 의해 주도되었습니다. 첫 번째 목표는 품질이었습니다. 우리는 좋은 것이 아니라 실제로 가장 좋은 문서를 만들고 싶었습니다. (…) 두 번째 주요 목표는 보관 기술이었습니다. 인쇄 기술의 변화와 최대한 독립적 인 시스템을 만드는 것입니다. 차세대 인쇄 장치가 등장했을 때, 나는 모든 문제를 새로 해결하지 않고 이미 달성 한 동일한 품질을 유지할 수 있기를 원했습니다. 100 년 후에도 사용할 수있는 것을 디자인하고 싶었습니다. – Donald E. Knuth : 디지털 타이포그래피, 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 년이 지난 지금과 동일한 결과를 제공해야합니다."

이상적인 시스템은 재현성과 변경 가능성을 결합한 것입니다. 자급 자족하고 단순하고 잘 테스트되도록 노력하는 것이 확실히 도움이됩니다.

원래 질문에서 너무 많이 벗어나면 용서해주세요. [ 'reproducible Research의 과학가', reproducible-research@googlegroups.com에서 게시 한 크로스]


Matthias를 통해 가져 주셔서 감사합니다. 그리고 scicomp에 오신 것을 환영합니다!
Aron Ahmadia

2
TeX 예제는 일반적으로 냉동 시스템의 고전적인 경우로 간주되지만 실제로는 좋지 않습니다. 내가 생각하는 이유는 아무도 더 이상 TeX를 직접 사용하지 않기 때문입니다. 사람들은 포장의 무한대와 함께 라텍스를 사용하며 냉동되지 않습니다. 결과적으로 (La) TeX 문서는 다른 모든 문서와 마찬가지로 변경 될 수 있다고 생각합니다. 저에게 TeX는 가상 머신과 같습니다. 고정 된 상태로 유지할 수 있지만 그 위에 빌드 된 코드가 계속 변경되는 한 아무 것도 얻지 못합니다.
Wolfgang Bangerth

고마워, 나는 이것이 소프트웨어 개발의 관점에서 훌륭한 사례 연구라고 생각합니다. 이것은 과학적 관점과는 다소 다를 수 있습니다. 누구나 TeX를 간접적으로 구축해야한다는 사실은 널리 사용되는 소프트웨어에는 적합하지 않지만 과학 코드가 여전히 성공적으로 실행되어 수십 년 후에 구축 될 수 있다는 이상적인 증거 일 수 있습니다. 그러나 Knuth는 100 년의 안정성을 추구하기 위해 변경 및 업데이트를 피하는 것이 더 간단 했습니까?
cboettig

4

계산 결과의 비트 단위의 정확한 재현성을 달성하기 매우 어려운 많은 기술적 과제가 있습니다.

소프트웨어 수준에서 코드 또는 코드에서 사용하는 라이브러리를 변경 하면 다른 결과가 생성 될 수 있습니다. 일반적인 과학 코드에 연결될 수있는 지원 라이브러리의 수에 놀랄 것입니다.

하위 수준에서 새 컴파일러 또는 다른 컴파일러 최적화를 설정 한 상태에서 코드 또는 코드에 사용 된 라이브러리를 다시 컴파일하면 문제가 발생할 수 있습니다. 한 가지 이유는 코드를 다시 컴파일 할 때 코드의 다양한 작업이 다른 순서로 수행 될 수 있기 때문입니다. 부동 소수점 덧셈은 연관 (a + b) + c <> a + (b + c)가 아니기 때문에 다른 결과를 얻을 수 있습니다.

예, 코드를 실행할 부팅 가능한 CD-Rom에 레코딩하여 전체 소프트웨어 환경 (OS, 라이브러리 및 컴파일 된 코드)을 보존한다면 어떨까요? 이제이 코드를 다른 컴퓨터에서 실행하면 동일한 결과를 얻을 수 있습니까?

놀랍게도 일부 코드는 실제로 실행중인 특정 프로세서 모델의 측면을 기반으로 계산 순서를 변경합니다. 예를 들어, 최적화 된 선형 대수 라이브러리는 일반적으로 캐시에 적합한 블록에서 작동하도록 행렬 곱셈을 분해합니다. 인텔이 더 큰 캐시를 가진 새로운 마이크로 프로세서를 출시 할 때 코드는 블록 크기를 동적으로 조정하여 산술이 다른 순서로 수행되어 다른 결과를 제공 할 수 있습니다. 다른 코드는 사용 가능한 메모리의 양에 따라 계산 순서를 동적으로 조정합니다. 더 많은 메모리가있는 컴퓨터에서 코드를 실행하면 산술이 다른 순서로 수행되어 결과가 달라질 수 있습니다.

다른 스레드의 정확한 실행 히스토리는 종종 결정적이지 않기 때문에 여러 스레드 코드로 처리 할 때 상황이 놀랍도록 복잡해집니다. 이로 인해 연산마다 다른 순서로 산술 연산이 수행 될 수 있습니다.

실제로 실제로 기대할 수있는 것은 사용 된 알고리즘의 정확도 공차까지 한 시스템에서 다른 시스템으로 유사한 결과입니다. 예를 들어 근본 발견 문제가 있고 이분법을 사용하여 + -1.0e-10 이내의 근을 얻으면 다른 기계가 해당 허용 오차 내에 동의하는 응답을 생성하는 한 행복해야합니다.


그건 그렇고, 다른 컴파일러 버전의 문제는 왜 소스 코드의 "동결 된"버전을 배포하기에 충분하지 않은지 설명합니다. 생성 된 컴파일 된 코드는 사용되는 컴파일러 버전에 따라 다를 수 있습니다. 다른 결과로 이어집니다.
Brian Borchers

2

재현성을 실현하려는 많은 시도가 있었고이 주제에 대한 전체 문헌이 있습니다. 15 년간의 과학 소프트웨어에 대한 개인적인 견해는 그 답을 찾는 것처럼 비현실적이며 불만족 스럽다는 것입니다. 문제는 (i) 복잡한 소프트웨어에 버그가있어서 동결 될 수 없다는 것입니다. (ii) 소프트웨어는 완전한 기능을 제공하지 않으므로 개발이 계속됩니다. (iii) 수십만 줄의 코드를 종이와 함께 제공하는 것의 가치는 무엇입니까?

내가 말했듯 이이 대답은 불만족 스럽다. 나는 전산 과학이 우리가 출판 한 결과가 정확하고 재현 가능하다는 신뢰를 심어주는 문헌을 만드는 데 성공하지 못했다고 생각합니다. 동시에, 나는 일을 더 잘하는 방법을 생각 해낼 수 없습니다. 확실히, 종이와 함께 제공되는 소스 코드를 공개하는 것이 유용합니다. 동시에, 정직한 모든 사람들은 논문의 결과가 일반적으로 다른 경계 조건, 다른 오른쪽 등을 설명하는 핵을 포함하는 다른 버전의 코드에 의해 생성 될 것이라는 데 동의 할 것입니다. 동일한 코드의 다른 버전과 함께 제공됩니다. 독자가 처음에는 어색합니다. 가장 최근의 두 논문은 약 20,000 줄의 코드를 사용하고 거래에 기반한 코드를 사용했습니다 .II (600,000 줄) 및 Trilinos (1.5M 줄) 코드). 잠재적 인 독자에게 어떤 정보를 제공합니까? 그럼에도 불구하고 내 코드를 사용할 수 있다고 말해야합니다.


2
나는 비관적이지는 않지만 여전히 불만족 스럽다. 특정 논문에서 결과를 생성 한 코드와 관련된 개정 관리 태그 또는 개정 번호를 쉽게보고 할 수 있으며, 철저하게 작성된 저자는 특정 기사에 중요한 모든 결과를 하나의 코드 기반으로 다시 실행할 수 있습니다. 개정 제어 시스템이 있고 공개적으로 액세스 가능하며 태그가 게시 된 경우 코드 자체를 전달할 필요가 없다고 생각합니다.
Bill Barth

물론 할 수 있습니다. 문제는 독자가 자신에게 던지는 많은 양의 코드로 독자가 무엇을 할 것인가입니다. 예, 실행하여 결과가 표시된 것과 동일한 지 확인할 수 있습니다. 그러나 그것은 무엇을 보여줍니까? 이론적으로가 아니라 실제로 실제로 결과가 올바른지 어떻게 확인할 수 있습니까?
Wolfgang Bangerth

아뇨, 그건 제가 완전히 동의 한 부분입니다. 당신이 부도덕 한 사람이라고 생각하지 않는 한, 답변을 정확하게 재현하기 위해 코드를 다시 실행할 필요는 없습니다. 더 큰 문제는 구현을 확인했다는 것을 충분히 입증했는지 여부와 실험에 대해 유효성을 검증 할 수 있는지 여부입니다.
Bill Barth

고맙지 만, 이것이 문제를 해결하지 못한다고 생각합니다. 이 논쟁의 여지 확실히 15 개의 년 후 코드를 가진 것은 유용한 하지만이 질문에 나는 단순히 요구하고 있는 경우 그 코드는 여전히 대부분의 사람들을 위해 실행됩니다 주어진 당신이 그것을 보관했다는 것을. 코드 보관을 장려하는 문헌에 익숙하지만 40 년 전에는 펀치 카드를위한 글로벌 보관소를 장려 한 사람이 없습니다. 기술이 소프트웨어의 반감기를 늘리거나 줄였습니까? 보관 된 코드가 5 년 안에 전신 촬영을 진행하면 다른 문제는 무시됩니다.
cboettig 2009 년

작업량이 많으면 15 년 전에 작성된 코드를 오늘 실행할 수 있다고 확신합니다. 오늘부터 잘 작성된 코드를 15 년 안에 실행할 수 있다고 확신합니다.
Wolfgang Bangerth

2

이 문제에 대한 가능한 해결책은 ActivePapers 프로젝트를 참조하십시오 . 요약하면, 각 소프트웨어 구성 요소의 특정 버전에 대한 명시 적 종속성과 함께 데이터 및 코드를 패키지하는 방법을 설명합니다. 이를 통해 계산을 정확하게 재현 할 수 있으며 동일한 데이터에서 업데이트 된 소프트웨어를 실행할 수 있습니다.

ActivePapers는 단순한 개념 증명 일뿐 아니라 가까운 시일 내에 실용적이지 않을 것입니다. 그 이유는 모든 실행 코드가 JVM 바이트 코드로 존재해야한다는 원칙에 기반하기 때문입니다. 현재로서는 너무 많은 인기있는 과학 라이브러리가 제외됩니다. 그러나 재현성이 중요한 것으로 인식되면 프로그래밍 도구의 우선 순위도 변경 될 수 있습니다.


1

언어를 선택하는 한 표준화 된 언어 (예 : C / Fortran / C ++)를 사용하는 것이 "모범 사례"라고 생각합니다. 패키지가 10 개의 다른 라이브러리 / 패키지, 특히 모호한 언어로 작성된 라이브러리에 의존한다면 그것은 장수에 좋지 않습니다. 얼마 후 많은 프로젝트가 고아가됩니다. BLAS / LAPACK, PETSc, FFTW, MPI 등과 같은 주요 라이브러리 / API가 곧 사라질 것이라고 생각하지 않습니다. BLAS는 이미 꽤 오래되었습니다.

다음 코드 조각 ( http://www.math.utah.edu/software/c-with-fortran.html 에서 도난 됨)은 Fortran 77보다 이전 버전이며 Charler 조작에는 Hollerith 상수를 사용하지만 40-50 년 후에는 잘 컴파일됩니다. GNU 포트란 컴파일러 :

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

오픈 소싱 / 구글 코드와 같이 어딘가에 사라질 가능성이 적습니다 (코드 검색을 종료 했음에도 불구하고).


예를 주셔서 감사합니다! 스크립팅 언어를 포함한 다른 언어로 비교할 때 궁금합니다. 펄, 파이썬 또는 R로 작성된 첫 번째 코드가 여전히 동일한 결과로 실행됩니까? 그들은 C 또는 Fortran보다 그렇게 할 가능성이 더 낮습니까?
cboettig
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.