เป็นเรื่องปกติที่จะไม่ใช้ไลบรารีสำหรับอัลกอริธึมเชิงตัวเลขมาตรฐานและทำไม


54

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

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


ลืมพูดถึง: ฉันถามเฉพาะเกี่ยวกับ C และ C ++ ตรงข้ามกับภาษาเช่น Python ที่มีประโยชน์ชัดเจน (ความเร็วของการดำเนินการ) เพื่อใช้ห้องสมุด


14
ในอีกแง่หนึ่งคุณไม่ต้องการที่จะประดิษฐ์ล้อใหม่ ในทางกลับกันวิธีที่ดีที่สุดในการทำความเข้าใจอัลกอริธึม (และโดยการขยายการวินิจฉัยกรณีที่อัลกอริทึมล้มเหลวได้อย่างง่ายดาย) คือการพยายามเขียนโค้ดการใช้งานด้วยตนเอง
JM

2
คุณทำซ้ำทฤษฎีบททุกครั้งที่คุณเจอหรือไม่? บางทีคุณอาจจะลองยิงและเล่นกับคดีเด็ก แต่ถ้ามันเป็นจุดสนใจของงานวิจัยของคุณคุณอาจยอมรับมันและดำเนินชีวิตต่อไป
dls

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

คำตอบ:


45

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

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

ในจุดที่กระสุนสุดท้ายข้างต้นฉันคิดของห้องสมุดขนาดใหญ่เช่นTrilinosหรือPETSc ฉันสามารถเสริมสร้างนี้กับคู่ของตัวอย่างส่วนบุคคลที่เป็นรูปธรรมในการพัฒนาของPyClaw แม้ว่ามันจะตรงไปตรงมาเพื่อขนานClawpackกับการเรียก MPI แต่เราเลือกใช้ PETSc สิ่งนี้ทำให้เราสามารถ จำกัด รหัส paralle ในแพ็กเกจให้น้อยกว่า 300 บรรทัดของ Python แต่ยิ่งดีกว่าโดยการใส่ข้อมูลของเราในรูปแบบของ PETSc เราได้รับการเข้าถึงตัวแก้ปัญหาโดยปริยายของ PETSc ในทันทีทำให้การทำงานปัจจุบัน เป็นตัวอย่างที่สอง PyClaw เริ่มแรกรวมการสร้างรหัส WENO ที่ห้าขึ้นใหม่ด้วยมือ แต่ในที่สุดเราก็ตัดสินใจที่จะใช้PyWENOแพคเกจนี้ นี่เป็นข้อดีอย่างมากเนื่องจาก PyWENO สามารถสร้างกิจวัตรของ WENO โดยอัตโนมัติในหลาย ๆ ภาษา

สุดท้ายถ้าคุณใช้ห้องสมุดคุณสามารถมีส่วนร่วมโดยการพัฒนาปรับปรุงหรือค้นหาข้อบกพร่องซึ่งจะเป็นประโยชน์กับคนอื่น ๆ ในขณะที่การดีบักหรือปรับปรุงรหัสของคุณเป็นประโยชน์ต่อคุณเท่านั้น


5
"คุณสามารถมีส่วนร่วมโดยการพัฒนาปรับปรุงหรือค้นหาข้อบกพร่องซึ่งจะเป็นประโยชน์ต่อคนอื่น ๆ อีกมากมาย" - นั่นจะทำให้ทั้ง "tinkering / learning" กระตุ้นและความเกียจคร้าน (โดยไม่ต้องทำสิ่งที่ทำไปแล้ว) :)
JM

1
ดูเพิ่มเติมที่กรณีขอบ สำหรับอัลกอริธึมหลายอย่างมันไม่ง่ายเลยที่จะใช้บางสิ่งที่ "ได้ผล" แต่จะไม่จัดการกับบางส่วนย่อยอย่างถูกต้อง นี่อาจจะโอเคสำหรับโครงการขนาดเล็กที่มี 1 ครั้ง แต่ฉันไม่สามารถนับจำนวนครั้งที่ฉันได้รับผลกระทบจากเงื่อนไขทางพยาธิวิทยาในบางสิ่งที่ฉัน "ปรับ" ตัวเอง
meawoppl

34

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

Python เก่งในการลดค่าใช้จ่ายนี้ด้วยเครื่องมือเช่น pip / easy_install และอินเทอร์เฟซโครงสร้างข้อมูลที่เหมือนกัน (เช่นไลบรารีทุกอันดูเหมือนจะใช้


19

หนึ่งในโครงการที่ฉันเข้าร่วมในตอนนี้คือการเขียนแพ็คเกจการจำลองและการวิเคราะห์ที่ยืดหยุ่นสำหรับเครื่องตรวจจับฟิสิกส์ระดับอนุภาค หนึ่งในเป้าหมายของโครงการนี้คือการให้ฐานรหัสที่จะใช้ในสิ่งเหล่านี้มานานหลายทศวรรษ

ณ จุดนี้เรามีการพึ่งพาสองโหลทำให้กระบวนการสร้างเป็นฝันร้ายที่ได้แยกโครงการที่แยกออกจากศูนย์การคำนวณ Fermilab เพื่อให้โซ่เครื่องมือที่เชื่อถือได้

ทีนี้ลองนึกภาพว่าคุณต้องพบกับเครื่องมือบางอย่างที่ไม่ได้อยู่ในห่วงโซ่เครื่องมือนั้น (เกิดขึ้นกับฉันเมื่อเดือนที่แล้ว) คุณมีสามทางเลือก

  1. คุณเป็นเจ้าของ ด้วยความเสี่ยงและความยุ่งยากทั้งหมดที่เกี่ยวข้อง
  2. คัดลอกโค้ดบางส่วนออกจากห้องสมุดบางแห่งและรวมเอาโค้ดไปไว้ใน The Project หมายความว่าคุณต้องทำการบำรุงรักษาต่อไปและคุณจะต้องเข้าใจรหัสของคนอื่นเมื่อเกิดเหตุการณ์ขึ้น
  3. ไปที่คนที่ดูแลโซ่เครื่องมือขอสิ่งที่คุณต้องการจากนั้นรอวงจรการเปิดตัวเพื่อรับมัน พวกเหล่านี้ค่อนข้างตอบสนองได้ แต่คุณต้องสร้างเคสให้โดยไม่ต้องใช้รหัสหรือหลังจากที่คุณได้ทำ (1) หรือ (2)

ง่ายมากในการเลือก (1) อาจจะง่ายเกินไป


ใช่การพึ่งพาที่เพิ่มเข้ามานั้นเป็นอุปสรรคสำคัญในการใช้ห้องสมุด
David Ketcheson

การพึ่งพาเป็นข้อเสียเปรียบครั้งใหญ่ในใจของฉันเช่นกัน
Fomite

2
เป็นไปได้ว่าคำตอบของฉันมีน้ำหนักมากเกินไปกับความเป็นจริงของการพึ่งพาและไม่เพียงพอในกระบวนการของการได้รับโฆษณาที่ได้รับอนุมัติติดตั้งในโครงการขนาดใหญ่
dmckee

* ข้อที่ 3 ของคุณ (ขออภัยสำหรับ nitpick)
299792458

เอ่อ ... ไม่ มันบอกว่าฉันหมายถึงอะไร
dmckee

12

ฉันคิดว่ามันเป็นเรื่องธรรมดามากด้วยอัลกอริทึมบางอย่างมีแนวโน้มที่จะนำมาใช้อีกครั้งกว่าคนอื่น ๆ

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

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

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


12
“ แต่แน่นอนคุณต้องรู้ว่าคุณกำลังทำอะไรอยู่แม้แต่อัลกอริธึมง่ายๆก็อาจทำให้เกิดความยุ่งยากได้” - สิ่งนี้ไม่สามารถเน้นได้เพียงพอ
JM

10

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

ในทางกลับกันบางครั้งมันก็ไม่ใช่เรื่องง่ายที่จะเลือกไลบรารีที่จำเป็นสำหรับการแก้ปัญหาดังนั้นจึงเป็นการดีกว่าที่จะค้นหาอัลกอริทึมที่นำไปใช้งานแล้วเมื่อคุณแน่ใจว่าคุณกำลังพยายามทำอะไรและทำไมคุณต้องการ

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


1
+1 สำหรับการปรับปรุงความเข้าใจ แม้ว่านี่จะเป็นปัญหาสำหรับอัลกอริทึมของคุณเองซึ่งสำหรับไลบรารีรูทีน
Faheem Mitha

8

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


7

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

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

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


6

2 เซนต์ของฉัน

ฉันคิดว่ามันง่ายที่จะเขียนโดยทั่วไปเกี่ยวกับเรื่องนี้ไม่ใช่แค่เกี่ยวกับ C / C ++ ก่อนอื่นไลบรารี่ในภาษาเช่น Python นั้นไม่จำเป็นต้องใช้เพื่อให้ได้รับผลประโยชน์ด้านความเร็วแม้ว่าจะเป็นผลลัพธ์ก็ตาม ฉันคิดว่า @Davidกล่าวถึงเหตุผลที่ค่อนข้างดี

การนำมาใช้จากด้านบนการใช้ภาษาในระดับหนึ่งจะกำหนดว่าห้องสมุดใดที่คุณสามารถเข้าถึงได้ ภาษาที่ใช้กันทั่วไปในวิทยาศาสตร์การคำนวณ ได้แก่ C, C ++, Python, Perl, Java, Fortran และ R ตัวอย่างที่พบน้อยกว่าอาจเป็น Ocaml และ Common Lisp ตอนนี้เนื่องจากภาษาเหล่านี้ส่วนใหญ่เขียนด้วยภาษา C พวกเขาจึงมีฟังก์ชั่นอินเตอร์เฟซตามธรรมชาติเป็นภาษาซีอย่างไรก็ตามมันไม่ง่ายนักที่จะโทรพูดห้องสมุด Perl จาก Python หรือในทางกลับกัน ดังนั้นในทางปฏิบัติผู้คนมักจะทำเช่นกัน

  1. ใช้ไลบรารีที่เขียนด้วยภาษาที่ใช้งานของพวกเขาสิ่งที่เป็นประโยชน์โดยทั่วไปที่เป็นส่วนหนึ่งของไลบรารีมาตรฐานหรือมีให้ใช้อย่างกว้างขวางหรือ

  2. เรียกไลบรารี C / C ++ ผ่านทางภาษา FFI สิ่งนี้อนุมานว่าไม่มี wrapper อยู่เนื่องจากถ้ามีมันจะไม่สามารถแยกแยะได้ง่ายจาก (1)

(2) มักจะยากกว่าเพราะคุณต้องห่อฟังก์ชัน C / C ++ ด้วยตัวคุณเอง นอกจากนี้คุณต้องมัดห้องสมุดหรือเพิ่มการพึ่งพาพิเศษ ด้วยเหตุผลดังกล่าวผู้คนมีแนวโน้มที่จะใช้ไลบรารีภาษาในตัวมากกว่าใช้ GSL เช่นซึ่งอยู่ใน C

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

ดังนั้นนี่จะกลายเป็นปัญหาการเพิ่มประสิทธิภาพในการวิเคราะห์ต้นทุน / ผลประโยชน์ ประสบการณ์ของฉันคือแม้สำหรับเทคนิคมาตรฐานแบบเปรียบเทียบเช่น MCMC ฉันมักจะปิดท้ายการเขียนโค้ดของตัวเองเพราะมันเหมาะกับวิธีการออกแบบซอฟต์แวร์โดยรวมของฉัน

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


6

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


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

5

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


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

ฉันเห็นด้วยนั่นเป็นทางออกที่ดีและบางสิ่งบางอย่างที่ผู้คนควรทำถ้าเป็นไปได้
mhucka

5

ปัญหาพื้นฐานมักเกิดจากการเชื่อมต่อระหว่างแอ็พพลิเคชันกับไลบรารี โปรแกรมเมอร์แอ็พพลิเคชันมีความรู้เกี่ยวกับปัญหาที่มักจะหายไปเมื่อส่งปัญหา (เช่นเมทริกซ์) ไปยังไลบรารี ความรู้นี้เป็นเช่นนั้นที่ใช้ประโยชน์มากกว่าชดเชยผลประโยชน์ของการใช้ห้องสมุดที่ดีที่สุด เป็นผลให้โปรแกรมเมอร์แอปพลิเคชัน "ม้วน" การดำเนินงานของตัวเองของเขา / เธอที่จะใช้ประโยชน์จากความรู้

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


3

นอกจากทุกสิ่งที่กล่าวไว้ข้างต้นแล้วฉันจะตอบคำถามซ้ำ ๆ จากคำถาม "Fortran vs C ++": สิ่งที่มีค่าที่สุดที่โปรแกรมเมอร์มีคือเวลาของเธอ ใช่การพึ่งพาจากภายนอกมักจะอึดอัด แต่การใช้เวลาในการนำกลับมาใช้ใหม่การดีบักและทดสอบอัลกอริทึมที่ผู้อื่นนำมาใช้นั้นเกือบจะโง่ตลอดเวลาและผลลัพธ์ก็แทบจะไม่ดีเท่าโค้ดที่เขียนโดยผู้เชี่ยวชาญในหัวข้อเฉพาะ ใช้สิ่งที่คนอื่นทำมาใหม่!


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

@ JanHackenberg - ใช่ แต่ขอให้ฉันเป็นคนทื่อด้วย: คุณเพิ่งเสียเวลาอีกสามปีในการคิดค้นล้อใหม่ ลองนึกภาพว่าคุณสามารถทำสิ่งใหม่ ๆ ได้มากแค่ไหนถ้าคุณใช้สิ่งที่คนอื่นทำ!
Wolfgang Bangerth

ฉันตัดสินใจที่จะเขียนใน Java ในปีแรกของฉันเพราะตอนนี้ฉันพิจารณาทักษะการเขียนโปรแกรมของฉัน (ไม่ใช่ทฤษฎีในด้านสารสนเทศ) ใกล้เคียงกับศูนย์ Java ยังคงเป็นภาษาที่ฉันฝึกฝนได้ดีที่สุด ฉันยังถือว่า Java เป็นตัวเลือกที่ดีเนื่องจากรองรับหลายแพลตฟอร์มได้ง่าย ฉันเข้าเก้าอี้โดยไม่มีการสนับสนุนอย่างไม่เป็นทางการใน phd (ป่าไม้แบบดั้งเดิม) ฉันเพิ่มขึ้นเป็น c ++ เมื่อฉันตระหนักถึงความผิดพลาดและฉันสามารถทำได้ (หลังจากเผยแพร่ไม่ใช่ก่อนหน้านี้)
ม.ค. Hackenberg

BTW ฉันไม่เห็นด้วยกับการสูญเสียชีวิต 3 ปี นี่หมายความว่าฉันมีเวลาเพียงสองปีที่มีประโยชน์ในประสบการณ์ของ phd post-doc วันนี้ฉันสามารถบรรจุถังขนาด 10,000 ล้านกระบอกในคลาวด์พอยต์ป่าไม้และปล่อยให้เครื่องตัดสินใจว่าต้นไม้ไหนดีที่จะแสดง ผู้ใช้ของฉัน ~ 50 คนก็สามารถทำได้เช่นกัน ใน ~ 1 ชั่วโมง ลูกเล่นทั้งหมดที่ฉันเรียนรู้โดยการเรียนรู้วิธีที่ยากและเสียเวลา ฉันตัดสินใจที่จะไม่เรียนรู้วิธีใช้ vi แต่เมื่อผู้คนผ่านการเรียนรู้ที่ต้องการอ้างว่าใช้วิธีที่มีประสิทธิภาพที่สุดในการสร้างรหัสฉันเชื่อว่าพวกเขา
Jan Hackenberg

2

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


2

"การใช้ซ้ำเป็นปรากฏการณ์ทางสังคมเป็นหลักฉันสามารถใช้ซอฟต์แวร์ของบุคคลอื่นโดยมีเงื่อนไขว่า

  1. มันได้ผล
  2. มันเข้าใจได้
  3. มันสามารถอยู่ร่วม
  4. ได้รับการสนับสนุน (หรือฉันยินดีที่จะสนับสนุนด้วยตนเองส่วนใหญ่ฉันไม่ได้)
  5. มันประหยัด
  6. ฉันสามารถหามัน

"- B. Stroustrup, ภาษา C ++ การเขียนโปรแกรม 2 ed. (1991) หน้า 383


1

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

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

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


0

มีน้อยที่จะเพิ่มเราต้องนำโค้ดกลับมาใช้ใหม่มันเกี่ยวกับความยั่งยืนของรหัสและการมีส่วนร่วมกับสังคม

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

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

ความจริงก็คือเราสามารถเรียนรู้เพิ่มเติมโดยใช้และอ่านโค้ดได้มากกว่าการเขียนโปรแกรมด้วยตัวเองตั้งแต่เริ่มต้น

ความเกียจคร้านผลักดันให้ฉันใช้เวลาส่วนใหญ่ฉันคิดว่าคนส่วนใหญ่ ด้วยเหตุผลเดียวกันบางคนเขียนรหัสตั้งแต่เริ่มต้นและอื่น ๆ ใช้ไลบรารีที่มีอยู่


-1

อัลกอริทึมของไลบรารีมีความแตกต่างจากการใช้งานของตัวเอง:

  • พวกเขาเป็นทั่วไปและ templated คุณสามารถแก้ไขการใช้งานของคุณได้โดยไม่ต้องกังวลว่าจะต้องเปลี่ยนรหัสของตัวเองซึ่งน่าจะมีข้อ จำกัด มากมาย
  • มีกรณีที่ประหยัดกว่าเมื่อเทียบกับกรณีของข้อมูลอินพุต อัลกอริธึมการคำนวณเชิงเรขาคณิตจำนวนมากเช่นตัวเรือนูนต้องจัดการตัวอย่างเช่นความยาวของจุดสามจุด คุณอาจไม่สนใจกรณีเหล่านี้หากคุณไม่เคยวางแผนที่จะแจกจ่ายรหัสของคุณและไม่ต้องการนำรหัสของคุณกลับมาใช้อีกในอนาคต
  • จัดเตรียมความซับซ้อนรันไทม์น้อยที่สุดสำหรับการกำหนดค่าอินพุตที่คาดหวังหรือเลวร้ายที่สุด อัลกอริธึมระดับสูงมีเหมือนอิฐมอญซึ่งมักจะเป็นอัลกอริธึมระดับล่างเช่นอัลกอริธึมการเรียงลำดับ การเรียงลำดับแบบเร็วอาจเป็นตัวเลือกที่ใช้กันทั่วไปสำหรับการเรียงลำดับข้อมูล แต่ถ้าการใช้อัลกอริทึมของคุณต้องรับประกัน n (บันทึก (n)) คุณไม่สามารถใช้งานได้
  • พวกเขาใช้หน่วยความจำอย่างมีประสิทธิภาพ
  • พวกเขาจะ optmized runtime เพิ่มเติม
  • หากได้รับการสนับสนุนโดยไกลยิ่งขึ้นที่จะ "ข้อผิดพลาด" ฟรีทั่วไปโดยเฉพาะอย่างยิ่งถ้าคุณทำงานกับสาขาหลัก ไม่มีการทดสอบอะไรมากไปกว่าไลบรารี่ที่มีการแจกจ่ายดี ไม่ใช่ทุกข้อผิดพลาดเกิดข้อผิดพลาดไม่ใช่ทุกข้อผิดพลาดก่อให้เกิดผลลัพธ์ที่ไม่สมควร การใช้อัลกอริทึมของคุณอาจยังให้ผลลัพธ์ที่ยอมรับได้ แต่ก็ไม่ดีเท่าที่ออกแบบมา จุดบกพร่องที่มองเห็นได้น้อยคือโอกาสที่คุณจะเป็นคนเดียวก็สามารถตรวจจับได้

ฉันยังถือว่ามันดีเมื่อเข้าสู่เขตข้อมูลใหม่เพื่อใช้อัลกอริทึมที่เข้าใจได้ดีในรุ่นของคุณเอง ฉันใช้เวลารวมทั้งหมด ฉันซื้อและอ่านหนังสือชื่อ Press et al ฉันมักจะอ่านทฤษฎีมากมายทั้งก่อนและระหว่างการนำไปใช้ และหลังจากเข้าใจแนวคิดทั่วไปของสนามและประสบกับกับดักในทางปฏิบัติสำหรับฉันมันถึงเวลาแล้วที่จะข้ามไปที่การใช้งานห้องสมุดที่ดีขึ้นในทุกด้าน ฉันคิดว่าคุณจะเป็นผู้ใช้ห้องสมุดที่ดีขึ้นถ้าคุณเขียนอัลกอริทึม "สวัสดีโลก" ในฟิลด์ไลบรารีด้วยตัวคุณเอง

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

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

การเขียนอัลกอริทึมด้วยตัวคุณเองจะให้อิสระในการใช้งาน โครงการของคุณอาจไม่รองรับGPL lisence ของGSLเช่น

ความเงียบอาจเป็นข้อ จำกัด เพียงข้อเดียวซึ่งเป็นอิสระจากมุมมองของผู้ปฏิบัติการ


1
เป็นเรื่องผิดปกติที่คิดว่า "การใช้อัลกอริทึมด้วยตัวเอง" และ "เรียนรู้ [ไวยากรณ์] ห้องสมุดไวยากรณ์" จะ "เสียค่าใช้จ่ายในเวลาเดียวกัน" นั่นไม่ได้เป็นจริงสำหรับฟังก์ชั่นง่าย ๆ เช่น "strcat" แน่นอนที่สุดมันไม่ใช่กรณีสำหรับสิ่งที่อยู่ใน LAPACK ตัวอย่างเช่นหรือในไลบรารีระดับสูงกว่า
Wolfgang Bangerth

@ WolfgangBangerth ขอบคุณสำหรับคำติชม ฉันอ่านซ้ำสิ่งที่ฉันเขียนและฉันไม่ต้องการถ่ายโอนข้อความที่การใช้งานของตัวเองสามารถเอาชนะได้ แต่ฉันเรียนรู้มากมาย "ทั้งสองอาจมีค่าใช้จ่ายสองสัปดาห์" ของฉันไม่ใช่ตัวอย่างที่ดี ตามความเป็นจริงมันทำให้ฉันเสียค่าใช้จ่ายเป็นครั้งสุดท้ายที่ "เรียนรู้ไวยากรณ์" 2 สัปดาห์เมื่อฉันเปลี่ยนรูปแบบ Java เป็น C ++ และฉันยังได้เรียนรู้พื้นฐานไวยากรณ์ C ++ ในเวลานี้ ฉันต่อสู้กับพอยน์เตอร์กับห้องสมุดใหม่ของฉันมากขึ้น สองสัปดาห์สำหรับอัลกอริทึมที่ใช้งานของฉันอาจได้รับเวลาเขียนโปรแกรมซึ่งเป็นการลงทุนเล็กน้อยของฉัน (การอ่านหนังสือก่อนที่จะใช้เวลามากขึ้น)
ม.ค. Hackenberg

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

@ WolfgangBangerth ฉันเห็นด้วยกับข้อโต้แย้งของคุณทั้งหมด จุดเดียวของฉันคือคุณเรียนรู้ทฤษฎีมากขึ้นเมื่อคุณต้องการจัดการกับปัญหามุมเหล่านั้นด้วยตัวคุณเอง รุ่นแรกของฉันคำตอบของฉันฟังดูเหมือนจริง ๆ แล้วมันไม่ได้ทำให้แตกต่าง ฉันเหนื่อยมาก ฉันเขียนคำตอบที่ได้รับการปรับปรุงให้ดียิ่งขึ้นเกี่ยวกับประโยชน์ด้านความมั่นคงของห้องสมุด สำหรับฉันมันเป็นการแลกเปลี่ยนระหว่างเวลาที่ใช้ไปกับความรู้ที่ได้รับ
Jan Hackenberg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.