Збільшення архівної довговічності коду


11

Чи є опублікований перелік найкращих практик щодо забезпечення довговічності коду з огляду на відтворювані наукові результати? (наприклад, з відкритим кодом, практикою документації, вибором залежностей, вибором мови, віртуальних машин тощо).

Знати про будь-які дослідження (чи їх бракує, приклади / анекдоти), які намагалися оцінити період напіввиведення типового наукового коду чи іншого програмного забезпечення (якщо це навіть розумне питання?)


Відповіді:


8

приходить в очі заплановане довголіття TeX:

«Починаючи з тих початків у 1977 році, дослідницький проект TeX, який я взяв на себе, був зумовлений двома основними цілями. Першою метою була якість: ми хотіли виготовити документи, які були не просто приємними, а насправді найкращими. (...) Другою основною метою було архівне: створити системи, які були б максимально незалежними від змін технології друку. Коли з'явилися друкарські пристрої наступного покоління, я хотів зберегти ту ж якість, що вже досягнута, замість того, щоб вирішувати всі проблеми заново. Я хотів спроектувати щось, що було б корисним ще через 100 років. ”- Дональд Е. Кнут: Цифрова типографія, с. 559 (цитується з http://de.wikipedia.org/wiki/TeX )

На підставі книг Кнута про цифрову типографіку має бути можливим навіть повне реалізація TeX і METAFONT. Вони містять примітки та пояснення до всього коду.

Вимагаючи, щоб ваші результати були стабільними протягом десятиліть, ви потрапляєте у своєрідну замерзаючу дилему. З одного боку, ви хочете, щоб на 100% було легше відтворювати свої результати, тому ви заморожуєте програмне забезпечення / оточення. З іншого боку, той, хто зацікавлений у відтворенні ваших результатів у майбутньому, неодмінно захоче базуватися на цьому. Ця людина буде застряг із дуже старим програмним забезпеченням, що дуже важко щось змінити. Для всього, що базується на декількох зовнішніх пакетах, вже достатньо кількох років, щоб зробити речі практично незмінними.

Для TeX заморожування оголошено в статті 1990 року

Майбутнє TEX та METAFONT http://www.ntg.nl/maps/05/34.pdf

"Я переконаний, що незмінна система має велику цінність, навіть якщо це аксіоматично, що будь-яка складна система може бути вдосконалена. Тому я вважаю, що нерозумно робити подальші" вдосконалення "в системах під назвою TEX та METAFONT. системи, як fi xed крапки, які повинні дати ті самі результати за 100 років від того, що вони виробляють сьогодні ».

Ідеальна система поєднала б відтворюваність із змінністю. Намагатися бути максимально автономним, простим і добре перевіреним, безумовно, допомагає.

Вибачте мене, якщо я занадто сильно відступаю від початкового питання. [крос, опублікований у статті "Вчені для відтворюваних досліджень", reproducible-research@googlegroups.com]


Дякуємо за те, що донесли це до Маттіаса. І ласкаво просимо до scicomp!
Арон Ахмадія

2
Я думаю, що приклад TeX насправді не дуже хороший, хоча він, як правило, вважається класичним випадком для замороженої системи. Я вважаю, що причина в тому, що ніхто більше не використовує TeX. Люди використовують латекс разом з його нескінченністю пакетів, і вони дуже не заморожені. Як наслідок, я вважаю, що документи (La) TeX можуть змінюватися стільки ж, скільки і всі інші. Для мене TeX - це як віртуальна машина - ви можете залишити це замороженим, але доки код, побудований на ньому, не змінюється, нічого не виграєте.
Вольфганг Бангерт

Дякую, я вважаю, що це прекрасне тематичне дослідження з точки зору розробки програмного забезпечення, яке може бути зовсім іншим, ніж наукова точка зору. Той факт, що всім потрібно опосередковано спиратися на TeX, може бути неідеальним для широко використовуваного програмного забезпечення, але може бути ідеальним свідченням того, що науковий код все-таки може успішно працювати і будуватися десятиліттями пізніше. Але напевно Кнут зробив більше просто уникаючи змін та оновлень, щоб досягти 100-річної стабільності?
cboettig

4

Існує безліч технічних проблем, які роблять точну відтворюваність обчислювальних результатів вкрай важко досягти.

На програмному рівні зміни коду або будь-якої бібліотеки, що використовується кодом, очевидно можуть спричинити отримання різних результатів. Ви здивуєтеся кількості бібліотек підтримки, які можуть зв'язатись із типовим науковим кодом.

На нижчому рівні перекомпіляція будь-якого коду або будь-якої з бібліотек, використовуваних кодом, з новим компілятором або з увімкненою різною оптимізацією компілятора, також може спричинити проблеми. Однією з причин є те, що різні операції з кодом можуть виконуватися в іншому порядку, коли код перекомпілюється. Оскільки додавання з плаваючою комою не є асоціативним (a + b) + c <> a + (b + c), це може дати різні результати.

Гаразд, що робити, якщо ми збережемо все програмне середовище (ОС, бібліотеки та скомпільований код) шляхом (наприклад) запису його на завантажувальний CD-Rom, який запустить код. Тепер ми можемо бути впевнені, що ми отримаємо однакові результати, якщо запустити цей код на іншому комп’ютері?

Дивно, але деякі коди фактично змінюють порядок обчислень на основі аспектів конкретної моделі процесора, на якій вони працюють. Наприклад, оптимізовані бібліотеки лінійної алгебри зазвичай розбивають матричні множення для роботи над блоками, які впишуться в кеш. Коли Intel випускає новий мікропроцесор з більшим кешем, код може динамічно регулювати розмір блоку, що призводить до арифметики, яка виконується в іншому порядку і дає різні результати. Інші коди динамічно регулюють порядок обчислень, виходячи з обсягу наявної пам’яті - якщо ви запускаєте код на комп’ютері з більшою кількістю пам’яті, що могло б спричинити арифметику в іншому порядку і таким чином давати різні результати.

Речі стають напрочуд складнішими при введенні багатопотокового коду, оскільки точна історія виконання різних потоків часто не є детермінованою, і це може знову спричинити виконання арифметичних операцій в іншому порядку від одного запуску до іншого.

На практиці найбільше, на що ви можете сподіватися, - це результати, подібні від однієї машини до другої, аж до точності допуску використовуваних алгоритмів. Наприклад, якщо у мене є проблема з кореневим знаходженням і використовую бісекцію, щоб отримати корінь в межах + -1,0e-10, то я повинен бути щасливим, якщо різні машини дають відповіді, які згодні в межах цієї допуску.


До речі, проблема з різними версіями компілятора пояснює, чому насправді недостатньо розповсюджувати "заморожену" версію вихідного коду - скомпільований код, який виробляється, може змінюватися залежно від того, яка версія компілятора використовується, і це може призводять до різних результатів.
Брайан Борчерс

2

Було багато спроб домогтися відтворення, і є ціла література на цю тему. Моя особиста думка з 15 років наукового програмного забезпечення полягає в тому, що це нереально, настільки незадовільно, як я вважаю цю відповідь. Проблеми полягають у тому, що (i) складне програмне забезпечення має помилки, і тому їх неможливо заморозити; (ii) програмне забезпечення ніколи не є повноцінним, і тому розвиток триває; (iii) яка цінність доставки з папером декількох сотень тисяч рядків коду?

Як я кажу, я вважаю цю відповідь незадовільною. Я вважаю, що обчислювальна наука не була дуже успішною у створенні літератури, яка вселяє довіру, що результати, які ми публікуємо, є правильними та відтворюваними. У той же час я не можу реально придумати способи зробити щось краще. Безумовно, вивільнення вихідного коду, який йде разом з папером, є корисним. У той же час кожен, хто чесний, погодиться з тим, що результати в документі зазвичай створюються різними версіями коду, які в більшості випадків містять хаки, що описують різні граничні умови, різні праві сторони тощо. поставляються з різними версіями одного і того ж коду. Для читача це незручно, але це абсолютно непродуктивно, якщо код великий, як це часто трапляється сьогодні - в моїх двох останніх документах були використані коди, які містять близько 20 000 рядків коду, і які ґрунтуються на deal.II (600 000 рядків коду) і Trilinos (1,5 млн рядків коду). Яку інформацію надає потенційному читачеві? (Я повинен сказати, що мої коди все-таки доступні.)


2
Я менш песимістичний, але все ще незадоволений. Ви можете легко повідомити тег контролю версії або номер редакції, пов’язаний з кодом, який дав результати в будь-якому даному документі, і абсолютно ретельний автор переробив би всі результати, важливі для даної статті, з однією базою коду. Я не думаю, що вам потрібно вводити сам код, якщо система контролю ревізії встановлена, є загальнодоступною і теги публікуються.
Білл Барт

Звичайно, ви могли це зробити. Питання просто в тому, що б читач зробив із масою коду, який ви кидаєте на неї. Так, ви можете запустити його і переконатися, що результати збігаються з показаними. Але що це демонструє? Як хтось буде перевіряти - фактичною практикою, а не теоретично - що результати є правильними?
Вольфганг Бангерт

Ні, це частина, з якою я повністю згоден. Якщо я не вважаю, що ви недобросовісна людина, мені не потрібно повторювати ваш код, щоб точно відтворити відповіді. Я вважаю, що головне питання полягає в тому, чи достатньо ви продемонстрували, що ви перевірили свою реалізацію, і чи можна це підтвердити проти експериментів.
Білл Барт

Дякую, але я вважаю, що це не стосується питання. Звичайно, є достатньо місця для дискусій, чому корисний доступ до коду через 15 років , але в цьому питанні я просто запитую, чи все-таки цей код працюватиме для більшості людей, враховуючи, що ви його архівували. Я знайомий з літературою, яка заохочує архівування кодів, але ніхто не заохочував глобальний архів для перфокарт 40 років тому. Чи збільшила чи зменшила період напіввиведення програмне забезпечення технологія? Якщо заархівований код піде телеграфом через 5 років, інші питання все одно вимкнено.
cboettig

Я впевнений, що ви можете отримати код, написаний 15 років тому, щоб запустити сьогодні, якщо буде добре працювати. Я впевнений, що ви можете отримати добре написані коди з сьогоднішнього дня, щоб запустити через 15 років.
Вольфганг Бангерт

2

Для можливого вирішення цієї проблеми дивіться мій проект ActivePapers . Підсумовуючи це, описується, як дані та код можуть бути упаковані разом із явними залежностями від конкретних версій кожного компонента програмного забезпечення. Це дає можливість точно відтворити обчислення, одночасно дозволяючи запускати оновлене програмне забезпечення на одних і тих же даних.

Варто додати, що ActivePapers - це не що інше, як доказ концепції, і навряд чи буде корисним у найближчому майбутньому. Причина полягає в тому, що він заснований на принципі, що весь виконуваний код повинен існувати як байт-код JVM. На даний момент це виключає занадто багато науково-популярних бібліотек. Однак, коли відтворюваність буде визнана важливою, пріоритети в інструментах програмування можуть змінитися.


1

Я вважаю, що в частині вибору мови, використання стандартизованої (наприклад, C / Fortran / C ++) було б кваліфіковано як "найкраща практика". Якщо пакет залежить від 10 інших вкладок / пакетів, особливо тих, які написані незрозумілими мовами, то це, очевидно, погано для довголіття. Багато проектів через деякий час залишаються сиротами. Я не думаю, що великі губи / api, такі як BLAS / LAPACK, PETSc, FFTW, MPI тощо, незабаром зникнуть. 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.