นักพัฒนาซอฟต์แวร์ทางวิทยาศาสตร์น้อยมากเข้าใจหลักการออกแบบที่ดีดังนั้นฉันต้องขออภัยถ้าคำตอบนี้ยืดยาว จากมุมมองของวิศวกรรมซอฟต์แวร์เป้าหมายของนักพัฒนาซอฟต์แวร์ทางวิทยาศาสตร์คือการออกแบบโซลูชันที่สอดคล้องกับข้อ จำกัด ที่มักขัดแย้งกัน
นี่คือตัวอย่างทั่วไปของข้อ จำกัด เหล่านี้ซึ่งอาจนำไปใช้กับการออกแบบไลบรารี่เมทริกซ์ของคุณ:
- เสร็จสิ้นภายในหนึ่งเดือน
- ทำงานอย่างถูกต้องบนแล็ปท็อปของคุณและเวิร์กสเตชันหลายแห่ง
- ทำงานได้อย่างมีประสิทธิภาพ
นักวิทยาศาสตร์ค่อย ๆ ให้ความสนใจกับข้อกำหนดทั่วไปอื่น ๆ เพิ่มเติมจากวิศวกรรมซอฟต์แวร์:
- เอกสารประกอบ (คู่มือผู้ใช้บทช่วยสอนการใส่โค้ด)
- การบำรุงรักษา (การควบคุมเวอร์ชันการทดสอบการออกแบบแบบแยกส่วน)
- ความสามารถนำกลับมาใช้ใหม่ได้ (การออกแบบแบบแยกส่วน "ความยืดหยุ่น")
คุณอาจต้องการมากกว่าหรือน้อยกว่าหนึ่งในข้อกำหนดเหล่านี้ หากคุณกำลังพยายามที่จะได้รับรางวัลกอร์ดอนเบลล์สำหรับการแสดงแม้แต่เศษเสี้ยวของเปอร์เซ็นต์ก็มีความเกี่ยวข้องและผู้พิพากษาจำนวนเล็กน้อยจะประเมินคุณภาพของรหัสของคุณ (ตราบใดที่คุณสามารถโน้มน้าวให้ถูกต้อง) หากคุณพยายามปรับการใช้รหัสนี้ในทรัพยากรที่ใช้ร่วมกันเช่นคลัสเตอร์หรือซูเปอร์คอมพิวเตอร์บ่อยครั้งคุณต้องปกป้องการอ้างสิทธิ์เกี่ยวกับประสิทธิภาพของรหัสของคุณ แต่สิ่งเหล่านี้ไม่ค่อยเข้มงวด หากคุณกำลังพยายามที่จะตีพิมพ์ในวารสารที่อธิบายถึงการเพิ่มประสิทธิภาพของวิธีการของคุณแล้วคุณจะต้องเร็วกว่าคู่แข่งของคุณอย่างถูกกฎหมายและประสิทธิภาพ 20% เป็นการแลกเปลี่ยนที่ฉันยินดีที่จะทำให้การบำรุงรักษาที่ดีขึ้นและนำมาใช้ใหม่
กลับมาที่คำถามของคุณ "การออกแบบที่ดี" ได้รับเวลาในการพัฒนาที่เพียงพอไม่ควรเสียสละประสิทธิภาพ หากวัตถุประสงค์คือการสร้างรหัสที่รันเร็วที่สุดรหัสนั้นควรได้รับการออกแบบให้มีข้อ จำกัด เหล่านั้น คุณอาจใช้เทคนิคต่าง ๆ เช่นการสร้างรหัสการประกอบแบบอินไลน์หรือใช้ประโยชน์จากไลบรารีที่ได้รับการปรับแต่งสูงเพื่อช่วยคุณแก้ปัญหาของคุณ
แต่ถ้าคุณไม่มีเวลาในการพัฒนาเพียงพอ มีอะไรดีพอ? มันขึ้นอยู่กับว่าและไม่มีใครจะสามารถให้คำตอบที่ดีกับคำถามนี้ได้โดยไม่มีบริบทเพิ่มเติม
FWIW: ถ้าคุณสนใจที่จะเขียนเคอร์เนลเมทริกซ์กระจัดกระจายที่มีประสิทธิภาพสูงคุณควรเปรียบเทียบกับการติดตั้ง PETSc ที่ดีที่สุดและทำงานกับทีมของพวกเขาหากคุณกำลังตีพวกเขาพวกเขายินดีที่จะรวมเมล็ดที่ได้รับการปรับเข้ากับห้องสมุด