Kodun arşiv ömrünü artırmak


11

Tekrarlanabilir bilimsel sonuçları göz önünde bulundurarak kodun uzun ömürlü olmasını sağlamak için yayınlanmış en iyi uygulamaların bir listesi var mı? (ör. açık kaynak, dokümantasyon uygulamaları, bağımlılık seçme, bir dil seçme, sanal makineler, vb.).

Tipik bilimsel kodun veya diğer yazılımların yarı ömrünü tahmin etmeye çalışan herhangi bir çalışmayı (veya eksik, örnekler / fıkralar) bilin (eğer bu makul bir soru olsa bile?)


Yanıtlar:


8

TeX'in planlanan ömrü akla geliyor:

“1977'deki bu başlangıçlardan bu yana, başladığım TeX araştırma projesi iki ana hedef tarafından yönlendirildi. İlk hedef kalite idi: sadece hoş değil, aynı zamanda en iyisi olan belgeler üretmek istedik. (…) İkinci büyük amaç arşivdi: baskı teknolojisindeki değişikliklerden olabildiğince bağımsız olacak sistemler yaratmak. Yeni nesil baskı cihazları ortaya çıktığında, tüm sorunları tekrar çözmek yerine, aynı kaliteyi elde etmek istedim. 100 yıl içinde hala kullanılabilecek bir şey tasarlamak istedim. ”- Donald E. Knuth: Dijital Tipografi, s. 559 ( http://de.wikipedia.org/wiki/TeX adresinden alıntılanmıştır )

Knuth'un dijital tipografi hakkındaki kitaplarına dayanarak, TeX ve METAFONT'un tamamen yeniden uygulanması bile mümkün olmalıdır. Tüm kod için ek açıklamalar ve açıklamalar içerirler.

Sonuçlarınızın onlarca yıl boyunca istikrarlı olmasını talep ederek, bir çeşit dondurucu ikileme girersiniz. Bir yandan, sonuçlarınızı% 100 yeniden oluşturmayı kolaylaştırmak istiyorsunuz, böylece yazılımınızı / ortamınızı donduruyorsunuz. Öte yandan, sonuçlarınızı gelecekte çoğaltmakla ilgilenen biri kesinlikle bunun üzerine inşa etmek isteyecektir. Bu kişi çok eski bir yazılımla sıkışıp kalacak ve herhangi bir şeyi değiştirmeyi zorlaştıracak. Birkaç harici pakete dayanan herhangi bir şey için, işleri neredeyse değiştirilemez hale getirmek için zaten birkaç yıl yeterlidir.

TeX için, dondurma 1990 makalesinde açıklandı

TEX ve METAFONT'un geleceği http://www.ntg.nl/maps/05/34.pdf

"Herhangi bir karmaşık sistemin geliştirilebileceği aksiyomatik olmasına rağmen, değişmeyen bir sistemin büyük bir değeri olduğuna inanıyorum. Bu nedenle TEX ve METAFONT olarak adlandırılan sistemlerde daha fazla" iyileştirme "yapmanın akıllıca olmadığına inanıyorum. 100'lü puanlar, bugün ürettikleri 100 yıl sonra aynı sonuçları vermelidir. "

İdeal sistem tekrarlanabilirliği değiştirilebilirlikle birleştirir. Kendi kendine yeten, basit ve mümkün olduğunca iyi test edilmiş olmaya çalışmak kesinlikle yardımcı olur.

Özgün sorudan çok fazla uzaklaşıyor olsaydım affedersiniz. [çapraz, 'Tekrarlanabilir Araştırma için Bilim Adamları'ndan yayınlanmıştır, reproducible-research@googlegroups.com]


Bunu Matthias'a getirdiğin için teşekkürler. Ve scicomp'a hoş geldiniz!
Aron Ahmadia

2
Genelde dondurulmuş bir sistem için klasik bir durum olarak kabul edilmesine rağmen TeX örneğinin aslında çok iyi olmadığını düşünüyorum. Bence bu yüzden kimse artık TeX'i doğrudan kullanmıyor. İnsanlar lateksini paket sonsuzluğu ile birlikte kullanırlar ve çok donmazlar. Sonuç olarak, (La) TeX belgelerinin her şey gibi değişime tabi olduğunu düşünüyorum. Bana göre, TeX sanal bir makine gibi - bunu donmuş tutabilirsiniz, ancak üzerine inşa edilen kod değişmeye devam ettiği sürece hiçbir şey kazanılmaz.
Wolfgang Bangerth

Teşekkürler, bence bu, bilimsel gelişme açısından oldukça farklı olabilecek yazılım geliştirme açısından mükemmel bir vaka çalışmasıdır. Herkesin dolaylı olarak TeX üzerine inşa etmesi gerektiği gerçeği, yaygın olarak kullanılan yazılımlar için ideal olmayabilir, ancak bilimsel kodun hala başarılı bir şekilde çalışabileceğini ve on yıllar sonra inşa edilebileceği ideal bir kanıt olabilir. Ancak Knuth, 100 yıllık istikrarı sağlamak için değişikliklerden ve güncellemelerden kaçındı mı?
cboettig

4

Hesaplama sonuçlarının bit-bit-tekrar üretilebilirliğini elde etmeyi son derece zorlaştıran birçok teknik zorluk vardır.

Yazılım düzeyinde, kodda yapılan değişiklikler veya kod tarafından kullanılan kitaplıklardan herhangi biri açıkça farklı sonuçların üretilmesine neden olabilir. Tipik bir bilimsel koda bağlı olabilecek destek kütüphanelerinin sayısı sizi şaşırtacaktı.

Daha düşük bir düzeyde, kodun herhangi birini veya kod tarafından kullanılan kitaplıkların herhangi birini yeni bir derleyici veya farklı derleyici optimizasyonları açık olarak yeniden derlemek de sorunlara neden olabilir. Bunun bir nedeni, koddaki çeşitli işlemlerin kod yeniden derlendiğinde farklı bir sırada gerçekleştirilebilmesidir. Kayan nokta ilavesi ilişkisel (a + b) + c <> a + (b + c) olmadığından, bu farklı sonuçlar verebilir.

Tamam, bu yüzden (örneğin) kodu çalıştıracak bir önyüklenebilir CD-Rom'a yazarak tüm yazılım ortamını (işletim sistemi, kütüphaneler ve derlenmiş kod) korursak ne olur? Şimdi bu kodu farklı bir bilgisayarda çalıştırırsak aynı sonuçları alacağımızdan emin olabilir miyiz?

Şaşırtıcı bir şekilde, bazı kodlar hesaplamaların sırasını, üzerinde çalıştıkları belirli işlemci modelinin yönlerine göre değiştirir. Örneğin, optimize edilmiş lineer cebir kütüphaneleri genellikle önbellek içine sığacak bloklar üzerinde çalışmak için matris çarpımlarını parçalar. Intel, daha büyük bir önbelleğe sahip yeni bir mikroişlemci yayınladığında, kod blok boyutunu dinamik olarak ayarlayabilir ve bu da farklı bir sırada gerçekleştirilen ve farklı sonuçlar veren aritmetik ile sonuçlanabilir. Diğer kodlar, hesaplamaların sırasını, kullanılabilir bellek miktarına göre dinamik olarak ayarlar - eğer kodu aritmetiğin farklı bir sırada yapılmasına ve dolayısıyla farklı sonuçlar vermesine neden olabilecek daha fazla belleğe sahip bir bilgisayarda çalıştırırsanız.

Farklı iş parçacıklarının tam yürütme geçmişi genellikle belirleyici olmadığından ve bu da aritmetik işlemlerin bir işlemden diğerine farklı bir sırayla gerçekleştirilmesine neden olabileceğinden, çok iş parçacıklı kod attığınızda işler inanılmaz derecede karmaşıklaşır.

Pratikte gerçekten umabileceğiniz en çok şey, kullanılan algoritmaların doğruluk toleranslarına kadar, bir makineden diğerine benzer sonuçlardır. Örneğin, bir kök bulma problemim varsa ve + -1.0e-10 içinde bir kök elde etmek için ikiye ayırma kullanırsam, farklı makineler bu tolerans dahilinde cevaplar ürettiği sürece mutlu olmalıyım.


Bu arada, farklı derleyici sürümleriyle ilgili sorun, kaynak kodun "dondurulmuş" bir sürümünü dağıtmanın neden yeterli olmadığını açıklar - üretilen derlenmiş kod, derleyicinin hangi sürümünün kullanıldığına bağlı olarak değişebilir ve bu farklı sonuçlara yol açar.
Brian Borchers

2

Tekrarlanabilirliğin gerçekleşmesi için birçok girişimde bulunuldu ve bu konuda bütün bir literatür var. 15 yıllık bilimsel yazılımdan aldığım kişisel düşüncem, bu cevabı bulduğum kadar gerçekçi değil. Sorunlar, (i) karmaşık yazılımların hatalara sahip olması ve bu nedenle dondurulamamasıdır; (ii) yazılım hiçbir zaman tam özellikli değildir ve geliştirme devam eder; (iii) birkaç yüz binlerce satırlık bir kağıtla teslim etmenin değeri nedir?

Söylediğim gibi, bu cevabı tatmin edici bulmuyorum. Bir alan olarak, hesaplama biliminin, yayınladığımız sonuçların doğru ve tekrarlanabilir olduğuna güven aşılayan literatür üretmede çok başarılı olmadığına inanıyorum. Aynı zamanda, işleri daha iyi yapmanın yollarını gerçekten bulamıyorum. Elbette, bir kağıtla birlikte gelen kaynak kodunu yayınlamak yararlıdır. Aynı zamanda, dürüst olan herkes bir kağıttaki sonuçların tipik olarak, çoğu durumda farklı sınır koşullarını, farklı sağ tarafları, vb. Tanımlayan kesmek içeren kodun farklı versiyonları tarafından üretileceğini kabul edecektir. aynı kodun farklı sürümleri ile birlikte gelir. Okuyucunun başlaması garip, ancak kodun bugün olduğu gibi büyük olması kesinlikle verimsizdir - en son iki makalem yaklaşık 20.000 satır kod içeren ve anlaşmaya dayanan kodlar kullandı. II (600.000 satır kod) ve Trilinos (1.5M satır) kod). Potansiyel bir okuyucuya hangi bilgiler sağlanır? (Yine de kodlarımın kullanılabilir olduğunu söylemeliyim.)


2
Daha az kötümserim ama hala tatminsizim. Herhangi bir makalede sonuçları üreten kodla ilişkili revizyon kontrol etiketini veya revizyon numarasını kolayca raporlayabilirsiniz ve tamamen titiz bir yazar, belirli bir makale için önemli olan tüm sonuçları tek bir kod tabanıyla tekrar çalıştırabilir. Bir revizyon kontrol sistemi varsa, halka açıksa ve etiketler yayınlanırsa kodu kendiniz teslim etmeniz gerektiğini düşünmüyorum.
Bill Barth

Tabii, bunu yapabilirsin. Soru basitçe bir okuyucunun ona attığınız kod kütlesi ile ne yapacağıdır. Evet, çalıştırabilir ve sonuçların gösterilenlerle aynı olduğunu doğrulayabilirsiniz. Peki bu ne gösteriyor? Herhangi biri - gerçek uygulamada, teorik olarak değil - sonuçların doğru olduğunu nasıl doğrulayacak?
Wolfgang Bangerth

Hayır, bu tamamen katılıyorum. Mütevazi bir kişi olduğunuzu düşünmedikçe, cevapları tam olarak yeniden oluşturmak için kodunuzu yeniden çalıştırmam gerekmez. Bence daha büyük soru, uygulamanızı doğruladığınızı yeterince kanıtlayıp kanıtlamadığınız ve bunun denemelere karşı doğrulanıp onaylanamayacağıdır.
Bill Barth

Teşekkürler, ama bunun soruyu ele almadığını hissediyorum. Orada tartışmaya bol bol yer kesinlikle neden mevcut 15 yıl sonra koduna sahip olan kullanışlı , ancak bu söz konusu ben sadece soruyorum eğer bu kod hala çoğu insan için aday olacağını verilmiş bunu arşiv yaptığını. Kod arşivlemeyi teşvik eden literatüre aşinayım, ancak kimse 40 yıl önce delikli kartlar için küresel bir arşivi teşvik etmedi. Teknoloji, yazılımın yarı ömrünü artırdı mı veya azalttı mı? Arşivlenmiş kod 5 yıl içinde telgrafın yoluna giderse, diğer konular zaten sessizdir.
cboettig

15 yıl önce bugün çalışmak için iyi bir çalışma ile yazılmış kod alabilirsiniz eminim. 15 yıl içinde yayınlanmak için bugünden iyi yazılmış kodlar alabileceğinizden eminim.
Wolfgang Bangerth

2

Bu soruna olası bir çözüm için ActivePapers projeme bakın. Özetle, veri ve kodun her yazılım bileşeninin belirli sürümlerindeki açık bağımlılıklarla birlikte nasıl paketlenebileceğini açıklar. Bu, aynı verilerin üzerinde güncellenmiş yazılımı çalıştırmaya izin verirken, aynı zamanda bir hesaplamanın tam olarak yeniden oluşturulmasını mümkün kılar.

ActivePapers'ın bir kavram kanıtı olmaktan başka bir şey olmadığını ve yakın gelecekte herhangi bir pratik kullanımın mümkün olmadığını da eklemeliyim. Bunun nedeni, tüm yürütülebilir kodların JVM bayt kodu olarak var olması ilkesine dayanmasıdır. Şu anda, bu çok fazla popüler bilimsel kütüphaneyi içermemektedir. Bununla birlikte, tekrarlanabilirlik önemli olarak kabul edildiğinde, programlama araçlarındaki öncelikler de değişebilir.


1

Dil seçimine gelince, standart bir dil kullanmanın (örn. C / Fortran / C ++) “en iyi uygulama” olarak nitelendirilebileceğine inanıyorum. Bir paket diğer 10 lib / pakete, özellikle de belirsiz dillerde yazılmışlara bağlıysa, bu uzun ömürlülük için kötüdür. Birçok proje bir süre sonra yetim kalıyor. Ben büyük libs / api BLAS / LAPACK, PETSc, FFTW, MPI gibi yakında her zaman kaybolacak sanmıyorum. BLAS zaten oldukça eski.

Aşağıdaki kod parçası ( http://www.math.utah.edu/software/c-with-fortran.html adresinden çalındı ) Fortran 77'den önce gelir, charler manipülasyon için Hollerith sabitlerini kullanır, ancak 40-50 yıl sonra iyi derler GNU Fortran Derleyici:

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

Açık kaynak kodlama / yakında googlecode gibi bir yere koymak (kod aramayı kapatmış olsalar da) bir beyin değildir.


Örnek için teşekkürler! Komut dosyası dilleri de dahil olmak üzere diğer dillerde karşılaştırmaları görmek isterdim - perl, python veya R ile yazılmış ilk kodlar hala aynı sonuçlarla çalışıyor mu? Bunu yapma olasılığı daha yüksek mi yoksa C veya Fortran'dan daha mı düşük?
cboettig
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.