การเพิ่มอายุการเก็บถาวรของรหัส


11

มีรายการของแนวปฏิบัติที่ดีที่สุดที่เผยแพร่เพื่อให้แน่ใจว่าอายุการใช้งานของโค้ดยาวนานขึ้นพร้อมกับผลลัพธ์ทางวิทยาศาสตร์ที่ทำซ้ำได้หรือไม่? (เช่นโอเพ่นซอร์สแนวทางปฏิบัติด้านเอกสารการเลือกการพึ่งพาการเลือกภาษาเครื่องเสมือน ฯลฯ )

รู้จากการศึกษาใด ๆ (หรือขาดตัวอย่าง / เกร็ดเล็กเกร็ดน้อย) ที่พยายามประเมินครึ่งชีวิตของรหัสทางวิทยาศาสตร์ทั่วไปหรือซอฟต์แวร์อื่น ๆ (ถ้านั่นเป็นคำถามที่สมเหตุสมผล)


คำตอบ:


8

การยืนยาวของ TeX ที่วางแผนไว้คำนึงถึง:

“ นับตั้งแต่จุดเริ่มต้นในปี 1977 โครงการวิจัย TeX ที่ฉันลงมือได้รับแรงผลักดันจากสองเป้าหมายหลัก เป้าหมายแรกคือคุณภาพ: เราต้องการผลิตเอกสารที่ไม่เพียงแค่สวยงาม แต่จริงๆแล้วดีที่สุด (…) เป้าหมายหลักที่สองคือจดหมายเหตุ: เพื่อสร้างระบบที่จะเป็นอิสระจากการเปลี่ยนแปลงของเทคโนโลยีการพิมพ์ให้มากที่สุด เมื่ออุปกรณ์การพิมพ์รุ่นต่อไปมาพร้อมฉันต้องการที่จะรักษาคุณภาพเดิมไว้ได้สำเร็จแทนที่จะต้องแก้ไขปัญหาทั้งหมดอีกครั้ง ฉันต้องการออกแบบบางอย่างที่ยังใช้งานได้ใน 100 ปี ” - Donald E. Knuth: การทำตัวพิมพ์ดิจิตอลหน้า 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 ต่อไป ระบบซึ่งเป็นคะแนน, xed ซึ่งควรให้ผลลัพธ์เหมือนกัน 100 ปีนับจากนี้ที่พวกเขาผลิตในปัจจุบัน "

ระบบในอุดมคติจะรวมการทำซ้ำกับความเปลี่ยนแปลงได้ การพยายามอยู่กับตัวเองง่ายและผ่านการทดสอบอย่างดีที่สุดเท่าที่จะทำได้

ให้อภัยฉันถ้าฉันไม่พอใจมากเกินไปจากคำถามเดิม [ไขว้โพสต์จาก 'นักวิทยาศาสตร์เพื่อการวิจัยที่ทำซ้ำได้', reproducible-research@googlegroups.com]


ขอขอบคุณที่แจ้งเรื่องนี้ให้กับ Matthias และยินดีต้อนรับเข้าสู่ Scicomp!
Aron Ahmadia

2
ฉันคิดว่าตัวอย่าง TeX นั้นไม่ได้ดีมากแม้ว่าโดยทั่วไปถือว่าเป็นกรณีคลาสสิกสำหรับระบบแช่แข็ง เหตุผลที่ฉันคิดเช่นนั้นก็คือไม่มีใครใช้ TeX โดยตรงอีกต่อไป ผู้คนใช้น้ำยางพาราพร้อมกับบรรจุภัณฑ์ที่ไม่มีที่สิ้นสุดและไม่แข็งมากนัก ด้วยเหตุนี้ฉันคิดว่าเอกสาร (La) TeX อาจเปลี่ยนแปลงได้มากเท่ากับทุกสิ่งทุกอย่าง สำหรับฉัน TeX เป็นเสมือนเครื่องจักรเสมือน - คุณอาจเก็บความรู้สึกนั้นไว้ได้ แต่ตราบใดที่โค้ดที่อยู่ด้านบนเปลี่ยนแปลงไปเรื่อย ๆ ไม่มีอะไรชนะ
Wolfgang Bangerth

ขอบคุณฉันคิดว่านี่เป็นกรณีศึกษาที่ยอดเยี่ยมจากมุมมองของการพัฒนาซอฟต์แวร์ซึ่งอาจแตกต่างจากมุมมองทางวิทยาศาสตร์ ความจริงที่ว่าทุกคนจำเป็นต้องสร้างบน TeX ทางอ้อมอาจไม่เหมาะสำหรับซอฟต์แวร์ที่ใช้กันอย่างแพร่หลาย แต่อาจเป็นการสาธิตในอุดมคติที่รหัสทางวิทยาศาสตร์ยังคงทำงานได้สำเร็จและถูกสร้างขึ้นในทศวรรษต่อมา แต่แน่นอนว่านูททำได้มากกว่าเพียงแค่หลีกเลี่ยงการเปลี่ยนแปลงและการอัพเดทเพื่อให้มีเสถียรภาพ 100 ปี?
cboettig

4

มีความท้าทายทางเทคนิคมากมายที่ทำให้การทำซ้ำผลบิตต่อบิตที่แน่นอนของผลการคำนวณทำได้ยากมาก

ในระดับซอฟต์แวร์การเปลี่ยนแปลงรหัสหรือไลบรารีใด ๆ ที่ใช้งานโดยรหัสสามารถทำให้ผลลัพธ์ต่างกันได้ คุณจะประหลาดใจกับจำนวนไลบรารีสนับสนุนที่สามารถเชื่อมโยงกับโค้ดทางวิทยาศาสตร์ทั่วไป

ในระดับที่ต่ำกว่าการคอมไพล์โค้ดหรือไลบรารี่ใด ๆ ที่ใช้โดยโค้ดด้วยคอมไพเลอร์ใหม่หรือเปิดออปชั่นคอมไพเลอร์ที่แตกต่างกันอาจทำให้เกิดปัญหาได้ เหตุผลหนึ่งคือการดำเนินการต่าง ๆ ในรหัสอาจถูกดำเนินการในลำดับที่แตกต่างกันเมื่อมีการคอมไพล์รหัสใหม่ เนื่องจากการเพิ่มจุดลอยตัวนั้นไม่ได้เชื่อมโยง (a + b) + c <> a + (b + c) สิ่งนี้สามารถให้ผลลัพธ์ที่แตกต่างกัน

ตกลงดังนั้นถ้าเรารักษาสภาพแวดล้อมซอฟต์แวร์ทั้งหมด (OS, ไลบรารีและรหัสที่คอมไพล์) โดย (เช่น) เขียนลงบน CD-Rom ที่สามารถบูตได้ซึ่งจะเรียกใช้รหัส ตอนนี้เรามั่นใจได้หรือไม่ว่าเราจะได้ผลลัพธ์เดียวกันหากเราเรียกใช้รหัสนี้ในคอมพิวเตอร์เครื่องอื่น

น่าแปลกที่บางรหัสแตกต่างกันไปตามลำดับของการคำนวณตามลักษณะของโปรเซสเซอร์รุ่นใดที่กำลังทำงานอยู่ ตัวอย่างเช่นไลบรารี่พีชคณิตเชิงเส้นที่ดีที่สุดมักจะแบ่งการคูณเมทริกซ์เพื่อทำงานในบล็อกที่จะพอดีกับแคช เมื่อ Intel เปิดตัวไมโครโปรเซสเซอร์ใหม่พร้อมแคชที่ใหญ่กว่ารหัสอาจปรับขนาดบล็อกแบบไดนามิกส่งผลให้เลขคณิตที่ดำเนินการตามลำดับที่แตกต่างกันและให้ผลลัพธ์ที่แตกต่างกัน รหัสอื่น ๆ ปรับลำดับการคำนวณแบบไดนามิกตามจำนวนหน่วยความจำที่มีอยู่หากคุณเรียกใช้รหัสบนคอมพิวเตอร์ที่มีหน่วยความจำมากขึ้นซึ่งอาจทำให้การคำนวณทางคณิตศาสตร์ในลำดับอื่นแตกต่างกันและทำให้ได้ผลลัพธ์ที่แตกต่างกัน

สิ่งต่าง ๆ มีความซับซ้อนยิ่งขึ้นอย่างน่าประหลาดใจเมื่อคุณใส่รหัสแบบมัลติเธรดเนื่องจากประวัติการดำเนินการที่แน่นอนของเธรดที่แตกต่างกันนั้นมักจะไม่ได้กำหนดไว้ล่วงหน้าและสิ่งนี้อาจทำให้การดำเนินการทางคณิตศาสตร์อีกครั้ง

ในทางปฏิบัติสิ่งที่คุณคาดหวังได้มากที่สุดคือผลลัพธ์ที่คล้ายกันจากเครื่องหนึ่งไปยังเครื่องถัดไปขึ้นอยู่กับความคลาดเคลื่อนที่แม่นยำของอัลกอริทึมที่ใช้ เช่นถ้าฉันมีปัญหาในการค้นหารูทและใช้ bisection เพื่อรับรูตภายใน + -1.0e-10 ดังนั้นฉันควรจะมีความสุขตราบใดที่เครื่องจักรต่าง ๆ สร้างคำตอบที่เห็นด้วยกับการยอมรับนั้น


ยังไงก็ตามปัญหาของคอมไพเลอร์เวอร์ชั่นต่าง ๆ ก็อธิบายได้ว่าทำไมมันถึงไม่เพียงพอที่จะเผยแพร่ซอร์สโค้ดแบบ "แช่แข็ง" ซึ่งโค้ดที่คอมไพล์ที่ผลิตนั้นอาจแตกต่างกันไปขึ้นอยู่กับเวอร์ชั่นของคอมไพเลอร์ที่ใช้ นำไปสู่ผลลัพธ์ที่แตกต่าง
Brian Borchers

2

มีความพยายามในการทำซ้ำเกิดขึ้นมากมายและมีทั้งวรรณกรรมในหัวข้อนี้ ความคิดเห็นส่วนตัวของฉันจากซอฟต์แวร์วิทยาศาสตร์มา 15 ปีก็คือมันไม่สมจริงเท่าที่ฉันพอใจเมื่อพบคำตอบนั้น ปัญหาคือ (i) ซอฟต์แวร์ที่ซับซ้อนมีข้อบกพร่องและไม่สามารถถูกแช่แข็งได้; (ii) ซอฟต์แวร์ไม่เคยมีคุณสมบัติครบถ้วนและดังนั้นการพัฒนาอย่างต่อเนื่อง (iii) มูลค่าของการนำส่งด้วยกระดาษหลายแสนบรรทัดของโค้ดคืออะไร

อย่างที่ฉันพูดฉันพบว่าคำตอบนี้ไม่น่าพอใจ ฉันเชื่อว่าเป็นสาขาวิทยาศาสตร์การคำนวณไม่ประสบความสำเร็จอย่างมากในการผลิตวรรณกรรมที่ปลูกฝังความเชื่อมั่นว่าผลลัพธ์ที่เราเผยแพร่นั้นถูกต้องและทำซ้ำได้ ในขณะเดียวกันฉันก็ไม่สามารถหาวิธีที่จะทำสิ่งต่างๆให้ดีขึ้นได้ แน่นอนว่าการปล่อยซอร์สโค้ดที่ไปกับกระดาษนั้นมีประโยชน์ ในเวลาเดียวกันทุกคนที่ซื่อสัตย์จะยอมรับว่าผลลัพธ์ในกระดาษโดยทั่วไปจะมีการผลิตโดยรุ่นต่าง ๆ ของรหัสที่ในกรณีส่วนใหญ่มีแฮ็กอธิบายเงื่อนไขขอบเขตที่แตกต่างกันด้านขวามือที่แตกต่างกัน ฯลฯ จากนั้นกระดาษจะ มาพร้อมกับรหัสเดียวกันหลายรุ่น นี่เป็นเรื่องที่น่าอึดอัดใจสำหรับผู้อ่านที่จะเริ่มต้นด้วย แต่มันไม่เป็นผลทันทีถ้ารหัสมีขนาดใหญ่อย่างที่มันเกิดขึ้นบ่อย ๆ ในวันนี้ - เอกสารสองฉบับล่าสุดของฉันใช้รหัสที่มีรหัสประมาณ 20,000 บรรทัดและสร้างขึ้นบนดีลที่สอง (รหัส 600,000 บรรทัด) และ Trilinos (1.5M บรรทัด) ของรหัส) ข้อมูลอะไรที่ให้กับผู้อ่านที่มีศักยภาพ? (ฉันควรจะบอกว่ารหัสของฉันยังคงมีอยู่)


2
ฉันมองโลกในแง่ร้ายน้อยลง แต่ก็ยังไม่พอใจ คุณสามารถรายงานแท็กควบคุมการแก้ไขหรือหมายเลขการแก้ไขที่เชื่อมโยงกับรหัสที่สร้างผลลัพธ์ในบทความใด ๆ ได้อย่างง่ายดายและผู้เขียนที่พิถีพิถันโดยสิ้นเชิงจะเรียกใช้ผลลัพธ์ทั้งหมดที่สำคัญกับบทความที่ระบุด้วยรหัสฐานเดียว ฉันไม่คิดว่าคุณจะต้องส่งรหัสตัวเองหากระบบควบคุมการแก้ไขอยู่ในสถานที่สามารถเข้าถึงได้แบบสาธารณะและมีการเผยแพร่แท็ก
Bill Barth

แน่นอนคุณสามารถทำได้ คำถามคือสิ่งที่ผู้อ่านจะทำกับมวลของรหัสที่คุณโยนใส่เธอ ใช่คุณสามารถเรียกใช้และตรวจสอบว่าผลลัพธ์เหมือนกับผลลัพธ์ที่แสดง แต่นั่นแสดงให้เห็นอะไร? มีใครบ้างที่จะตรวจสอบ - ในทางปฏิบัติจริงไม่ใช่ในทางทฤษฎี - ว่าผลลัพธ์นั้นถูกต้อง?
Wolfgang Bangerth

ไม่นั่นคือส่วนที่ฉันตกลงอย่างสมบูรณ์ ถ้าฉันคิดว่าคุณเป็นคนไร้ยางอายฉันไม่จำเป็นต้องรันโค้ดซ้ำเพื่อทำซ้ำคำตอบทั้งหมด ฉันคิดว่าคำถามที่ใหญ่กว่าคือคุณได้แสดงให้เห็นอย่างเพียงพอแล้วว่าคุณได้ยืนยันการใช้งานของคุณหรือไม่และสามารถตรวจสอบความถูกต้องกับการทดสอบได้หรือไม่
Bill Barth

ขอบคุณ แต่ฉันรู้สึกว่านี่ไม่ได้ตอบคำถาม มีแน่นอนห้องเพียงพอที่จะอภิปรายว่าทำไมมีรหัสที่มีอยู่ 15 ปีต่อมาเป็นประโยชน์แต่ในคำถามนี้ผมเพียงขอให้ถ้ารหัสที่จะยังคงทำงานสำหรับคนส่วนใหญ่ได้รับการที่คุณไม่เก็บมัน ฉันคุ้นเคยกับวรรณกรรมที่สนับสนุนการเก็บรหัส แต่ไม่มีใครสนับสนุนคลังข้อมูลทั่วโลกสำหรับบัตรเจาะ 40 ปีที่ผ่านมา เทคโนโลยีเพิ่มอายุการใช้งานซอฟต์แวร์ครึ่งชีวิตหรือไม่? หากรหัสที่เก็บถาวรไปทางโทรเลขในเวลา 5 ปีปัญหาอื่น ๆ จะถูกปิดเสียงอยู่ดี
cboettig

ฉันค่อนข้างแน่ใจว่าคุณจะได้รับรหัสที่เขียนเมื่อ 15 ปีก่อนเพื่อให้ทำงานได้ในวันนี้หากทำงานได้ดี ฉันมั่นใจว่าคุณจะได้รับรหัสที่ดีตั้งแต่วันนี้ถึง 15 ปี
Wolfgang Bangerth

2

สำหรับวิธีแก้ปัญหาที่เป็นไปได้ดูโครงการActivePapersของฉัน โดยสรุปจะอธิบายถึงวิธีการจัดทำแพคเกจข้อมูลและรหัสพร้อมกับการอ้างอิงที่ชัดเจนในเวอร์ชันเฉพาะของแต่ละองค์ประกอบซอฟต์แวร์ สิ่งนี้ทำให้เป็นไปได้ที่จะสร้างการคำนวณใหม่ทั้งหมดในขณะที่อนุญาตให้เรียกใช้ซอฟต์แวร์ที่ได้รับการปรับปรุงบนข้อมูลเดียวกัน

ฉันควรเพิ่มว่า ActivePapers ไม่ได้เป็นเพียงแค่ข้อพิสูจน์แนวคิดและไม่น่าที่จะใช้งานได้จริงในอนาคตอันใกล้ เหตุผลก็คือมันเป็นไปตามหลักการที่ว่ารหัสปฏิบัติการทั้งหมดจะต้องมีอยู่เป็น JVM bytecode ในขณะนี้สิ่งนี้ไม่รวมห้องสมุดทางวิทยาศาสตร์ที่เป็นที่นิยมมากเกินไป อย่างไรก็ตามเมื่อการทำซ้ำได้รับการยอมรับว่ามีความสำคัญลำดับความสำคัญในเครื่องมือการเขียนโปรแกรมอาจเปลี่ยนแปลงได้เช่นกัน


1

ฉันเชื่อว่าตราบใดที่ภาษาที่เลือกใช้การใช้ภาษาที่ได้มาตรฐาน (เช่น C / Fortran / C ++) จะถือว่าเป็น "แนวปฏิบัติที่ดีที่สุด" หากแพ็กเกจขึ้นอยู่กับ 10 libs / แพ็คเกจอื่น ๆ โดยเฉพาะอย่างยิ่งสิ่งที่เขียนด้วยภาษาที่คลุมเครือ หลายโครงการจบลงด้วยการถูกกำพร้าหลังจากระยะเวลาหนึ่ง ฉันไม่คิดว่า libs / api ที่สำคัญ ๆ เช่น BLAS / LAPACK, PETSc, FFTW, MPI ฯลฯ จะหายไปทุกเวลาเร็ว ๆ นี้ BLAS ค่อนข้างเก่าแล้ว

ชิ้นส่วนของรหัสต่อไปนี้ (ถูกขโมยมาจากhttp://www.math.utah.edu/software/c-with-fortran.html ) ถือกำเนิด Fortran 77 ใช้ค่าคงที่ Hollerith สำหรับการจัดการถ่าน แต่รวบรวมได้เพียง 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.