น่าอายที่ฉันแนะนำห้องสมุด "ทั่วไป" ชื่อเช่นนี้ในสภาพแวดล้อมของทีมสองสามทศวรรษหลัง ฉันไม่เข้าใจพลวัตของสิ่งที่อาจเกิดขึ้นในทีมที่มีการประสานงานอย่างหลวม ๆ ในเวลาไม่กี่เดือน
เมื่อฉันแนะนำมันฉันคิดว่าฉันทำให้มันชัดเจนและมีเอกสารว่าสำหรับทุกสิ่งที่เราเห็นด้วยว่าเราพบว่ามีประโยชน์ในชีวิตประจำวันมันมีจุดประสงค์เพื่อเป็นห้องสมุดที่เรียบง่ายและห้องสมุดควรขึ้นอยู่กับสิ่งอื่นนอกเหนือจาก ไลบรารีมาตรฐานเพื่อให้ง่ายต่อการปรับใช้ในโครงการใหม่ ความคิดของฉันในเวลานั้นคือมันเป็นส่วนขยายเล็ก ๆ น้อย ๆ ของเราในห้องสมุดมาตรฐานสำหรับสิ่งต่าง ๆ ซึ่งในโดเมนของเราโดยเฉพาะเราพบว่ามีประโยชน์ในชีวิตประจำวัน
และมันเริ่มต้นได้ดีพอ เราเริ่มต้นด้วยห้องสมุดคณิตศาสตร์ ( common/math*
) ของกิจวัตรที่เราใช้ในชีวิตประจำวันเนื่องจากเราทำงานในคอมพิวเตอร์กราฟิกซึ่งมักจะหนักในพีชคณิตเชิงเส้น และเนื่องจากเรามักจะสอดแทรกด้วยรหัส C เราจึงเห็นด้วยกับฟังก์ชั่นยูทิลิตี้ที่มีประโยชน์บางอย่างfind_index
ซึ่งแตกต่างจากstd::find
ใน C ++ จะส่งคืนดัชนีไปยังองค์ประกอบที่พบในลำดับแทนที่จะเป็นตัววนซ้ำซึ่งเลียนแบบการทำงานของฟังก์ชัน C ของเรา - สิ่งต่าง ๆ เช่นนี้ - ผสมผสานกันเล็กน้อย แต่เรียบง่ายและใช้กันอย่างแพร่หลายพอที่จะคุ้นเคยและเป็นประโยชน์กับทุกคน และความคุ้นเคยแบบทันทีเป็นเกณฑ์ที่สำคัญอย่างยิ่งเมื่อฉันเห็นมันในการพยายามทำสิ่งที่ "ธรรมดา" หรือ "มาตรฐาน" เพราะถ้ามันเป็น "สามัญ" จริง ๆ ก็ควรมีคุณภาพที่คุ้นเคยเกี่ยวกับเรื่องนี้เนื่องจากความกว้าง การยอมรับและการใช้งานรายวัน
แต่เมื่อเวลาผ่านไปความตั้งใจในการออกแบบของห้องสมุดหลุดออกมาจากนิ้วมือของฉันเมื่อผู้คนเริ่มเพิ่มสิ่งต่าง ๆ ที่พวกเขาใช้เป็นการส่วนตัวว่าพวกเขาคิดว่าอาจจะนำไปใช้กับคนอื่นเพียงเพื่อจะหาคนอื่นไม่ใช้มัน และต่อมามีคนเริ่มเพิ่มฟังก์ชั่นที่ขึ้นอยู่กับ OpenGL สำหรับกิจวัตรที่เกี่ยวข้องกับ GL ทั่วไป นอกจากนี้เรายังใช้ Qt และผู้คนเริ่มเพิ่มรหัสที่ขึ้นอยู่กับ Qt ดังนั้นไลบรารีทั่วไปจึงขึ้นอยู่กับไลบรารีภายนอกสองแห่ง ในบางจุดมีบางคนเพิ่มกิจวัตร shader ทั่วไปซึ่งขึ้นอยู่กับไลบรารี shader เฉพาะแอปพลิเคชันของเราและ ณ จุดนั้นคุณไม่สามารถปรับใช้ในโครงการใหม่ได้โดยไม่ต้องนำ Qt, OGL และไลบรารี shader เฉพาะแอปพลิเคชันของเรา สคริปต์บิลด์ที่ไม่สำคัญสำหรับโครงการของคุณ ดังนั้นมันจึงกลายเป็นความยุ่งเหยิงซึ่งพึ่งพาอาศัยซึ่งกันและกันนี้
แต่ฉันก็พบว่าการโต้วาทีสิ่งที่ควรและไม่ควรเข้าไปในห้องสมุดนี้ว่าสิ่งที่ถูกพิจารณาว่า "ธรรมดา" สามารถกลายเป็นความคิดส่วนตัวได้ง่าย ๆ หากคุณไม่ได้ตั้งกฎเส้นที่ยากมากว่า "ธรรมดา" คืออะไร สิ่งที่ทุกคนมีแนวโน้มที่จะพบว่ามีประโยชน์ในชีวิตประจำวัน การคลายมาตรฐานใด ๆ และทำให้สิ่งต่าง ๆ ที่ทุกคนพบว่ามีประโยชน์ในชีวิตประจำวันเป็นสิ่งที่นักพัฒนาคนเดียวพบว่ามีประโยชน์ซึ่งอาจมีความเป็นไปได้ที่จะเป็นประโยชน์ต่อคนอื่นและ ณ จุดนั้นห้องสมุดก็เสื่อมโทรมลง .
แต่ยิ่งไปกว่านั้นเมื่อคุณมาถึงจุดนั้นนักพัฒนาบางคนสามารถเริ่มเพิ่มสิ่งต่าง ๆ ด้วยเหตุผลง่ายๆที่พวกเขาไม่ชอบภาษาการเขียนโปรแกรม พวกเขาอาจไม่ชอบไวยากรณ์ของ for for loop หรือ function call ณ จุดที่ห้องสมุดเริ่มเต็มไปด้วยสิ่งต่าง ๆ ที่ต่อสู้กับไวยากรณ์พื้นฐานของภาษาแทนที่สองบรรทัดของรหัสตรงไปตรงมาซึ่งไม่ใช่เรื่องจริง การทำซ้ำตรรกะใด ๆ ลงในบรรทัด terse ของรหัสแปลกใหม่เพียงคุ้นเคยกับนักพัฒนาที่แนะนำชวเลขดังกล่าว จากนั้นนักพัฒนาซอฟต์แวร์ดังกล่าวอาจเริ่มเพิ่มฟังก์ชันการทำงานเพิ่มเติมให้กับห้องสมุดทั่วไปที่ใช้งานโดยใช้ชวเลขดังกล่าว ตรงจุดไหนส่วนสำคัญของห้องสมุดทั่วไปก็เชื่อมโยงกับชอร์ตที่แปลกใหม่เหล่านี้ซึ่งอาจดูสวยงามและเป็นธรรมชาติสำหรับผู้พัฒนาที่แนะนำ แต่น่าเกลียดและต่างประเทศและยากที่จะเข้าใจสำหรับคนอื่น และ ณ จุดนั้นฉันคิดว่าคุณรู้ว่าความหวังในการทำบางสิ่งบางอย่าง "ธรรมดา" หายไปเนื่องจาก "ทั่วไป" และ "ไม่คุ้นเคย" เป็นความคิดที่ตรงกันข้าม
อย่างน้อยก็ในสภาพแวดล้อมของทีมที่มีการประสานงานอย่างแน่นหนาโดยมีห้องสมุดที่มีความทะเยอทะยานกว้างและทั่วไปเหมือนกับ "สิ่งที่ใช้กันทั่วไป" และในขณะที่ปัญหาพื้นฐานอาจเป็นการประสานงานที่หลวมเหนือสิ่งอื่นใดอย่างน้อยห้องสมุดหลายแห่งที่ตั้งใจจะให้บริการที่เป็นเอกเทศมากขึ้นเช่นห้องสมุดที่มีไว้เพื่อให้กิจวัตรทางคณิตศาสตร์และไม่มีอะไรอื่นคงไม่ลดลงอย่างมีนัยสำคัญในแง่ของ ออกแบบความบริสุทธิ์และการอ้างอิงเป็นไลบรารี "ทั่วไป" ดังนั้นเมื่อมองย้อนกลับไปฉันคิดว่ามันจะดีกว่าถ้าทำผิดด้านห้องสมุดที่มีความตั้งใจในการออกแบบชัดเจนมากขึ้น ฉันได้ค้นพบในช่วงหลายปีที่ผ่านมาว่าจุดประสงค์แคบลงและการบังคับใช้แคบลงเป็นแนวคิดที่แตกต่างอย่างสิ้นเชิง
นอกจากนี้ฉันยอมรับอย่างน้อยนิด ๆ หน่อย ๆ ทำไม่ได้และการดูแลอาจจะเกี่ยวกับสุนทรียศาสตร์มากเกินไป แต่วิธีที่ฉันมักจะเข้าใจความคิดของฉันเกี่ยวกับคุณภาพของห้องสมุด (และอาจจะเป็น "ความงาม") ถูกตัดสินโดยลิงก์ที่อ่อนแอที่สุด ในทางที่คล้ายกันที่สุดถ้าคุณให้อาหารที่อร่อยที่สุดในโลก แต่บนจานเดียวกันให้วางอะไรบางอย่างที่เน่าเปื่อยอยู่ที่นั่นซึ่งมีกลิ่นไม่ดีจริง ๆ ฉันมักจะอยากปฏิเสธอาหารจานนั้นทั้งหมด และถ้าคุณชอบฉันในเรื่องนั้นและทำบางสิ่งบางอย่างที่เชิญชวนทุกประเภทเพิ่มเติมเป็นสิ่งที่เรียกว่า "ธรรมดา" คุณอาจพบว่าตัวเองกำลังดูแผ่นอะนาล็อกที่มีบางสิ่งที่เน่าเปื่อยอยู่ด้านข้าง ดังนั้นฉันคิดว่ามันก็ดีเช่นกันถ้าห้องสมุดมีการจัดระเบียบและตั้งชื่อและจัดทำเอกสารในลักษณะที่มันไม่ได้ ' ไม่เชิญเพิ่มมากขึ้นเรื่อย ๆ เมื่อเวลาผ่านไป และนั่นยังสามารถนำไปใช้กับการสร้างสรรค์ส่วนตัวของคุณได้เพราะฉันได้สร้างสิ่งที่เน่าเสียที่นี่และที่นั่นและ "taints" น้อยลงมากถ้าไม่ได้เพิ่มจานที่ใหญ่ที่สุด การแยกสิ่งต่าง ๆ ออกเป็นห้องสมุดขนาดเล็กที่เป็นเอกเทศนั้นมีแนวโน้มที่จะแยกรหัสได้ดีขึ้นเช่นกันหากมีเพียงความจริงที่ว่ามันสะดวกน้อยกว่าที่จะเริ่มมีเพศสัมพันธ์ทุกอย่าง
การขจัดความซ้ำซ้อนของรหัสได้รับการตอกย้ำเข้ามาในตัวฉันตลอดหลายปีที่ผ่านมา แต่ฉันรู้สึกว่าฉันควรลองในครั้งนี้
สิ่งที่ฉันอาจแนะนำในกรณีของคุณคือการเริ่มต้นใช้งานง่ายในการลดความซ้ำซ้อนของรหัส ฉันไม่ได้บอกว่าจะคัดลอกและวางโค้ดขนาดใหญ่ของโค้ดที่มีการทดสอบไม่ดีข้อผิดพลาดเกิดขึ้นรอบ ๆ หรือสิ่งใด ๆ ในรูปแบบนี้หรือทำซ้ำโค้ดที่ไม่น่าสนใจจำนวนมากซึ่งมีความเป็นไปได้ที่จะต้องมีการเปลี่ยนแปลงในอนาคต
แต่โดยเฉพาะอย่างยิ่งถ้าคุณมีความคิดที่จะสร้างห้องสมุด "ทั่วไป" ซึ่งฉันคิดว่าความต้องการของคุณคือการสร้างสิ่งที่ใช้กันอย่างแพร่หลายนำมาใช้ซ้ำได้อย่างมากและบางทีสิ่งที่คุณคิดว่ามีประโยชน์เช่นเดียวกับคุณในปัจจุบัน จากนั้นบางครั้งคุณอาจต้องการหรือต้องการทำสำเนาบางอย่างเพื่อให้ได้คุณภาพที่เข้าใจยากนี้ เพราะการทำซ้ำอาจใช้เป็นกลไกการแยก มันเหมือนกับว่าคุณต้องการแยกเครื่องเล่นวิดีโอออกจากเครื่องเล่น MP3 อย่างน้อยคุณก็ต้องทำซ้ำบางอย่างเช่นแบตเตอรี่และฮาร์ดไดรฟ์ พวกเขาไม่สามารถแบ่งปันสิ่งเหล่านี้ไม่อย่างนั้นพวกเขาจะแยกกันไม่ได้และไม่สามารถใช้อย่างอิสระจากกันและ ณ จุดนั้นผู้คนอาจไม่สนใจอุปกรณ์อีกต่อไปหากพวกเขาต้องการเล่น MP3 แต่บางครั้งหลังจากที่คุณแยกอุปกรณ์ทั้งสองนี้ออกจากกันคุณอาจพบว่าเครื่องเล่น MP3 สามารถได้รับประโยชน์จากการออกแบบแบตเตอรี่ที่แตกต่างกันหรือฮาร์ดไดรฟ์ขนาดเล็กกว่าเครื่องเล่นวิดีโอซึ่ง ณ จุดนี้คุณจะไม่ทำซ้ำอีกต่อไป สิ่งที่เริ่มแรกจากการทำซ้ำเพื่อให้อุปกรณ์ที่พึ่งพาซึ่งกันและกันนี้แยกออกเป็นสองส่วนอุปกรณ์อิสระในภายหลังอาจกลายเป็นผลงานการออกแบบและการใช้งานที่ไม่ซ้ำซ้อนอีกต่อไป
มันคุ้มค่าที่จะพิจารณาสิ่งต่าง ๆ จากมุมมองของคนที่ใช้ห้องสมุด คุณต้องการใช้จริงหรือไม่ห้องสมุดที่ช่วยลดการทำซ้ำรหัสหรือไม่ โอกาสที่คุณจะไม่ทำอย่างนั้นก็ขึ้นอยู่กับห้องสมุดอื่น และไลบรารีอื่น ๆ เหล่านั้นอาจขึ้นอยู่กับไลบรารีอื่น ๆ เพื่อหลีกเลี่ยงการทำซ้ำรหัสของพวกเขาและอื่น ๆ จนกว่าคุณจะต้องนำเข้า / เชื่อมโยง 50 ไลบรารีที่แตกต่างกันเพื่อให้ได้รับฟังก์ชั่นพื้นฐานบางอย่างเช่นการโหลดและเล่นไฟล์เสียง . ในขณะเดียวกันถ้าห้องสมุดเสียงนั้นเลือกที่จะทำซ้ำบางสิ่งที่นี่และที่นั่นเพื่อให้ได้มาซึ่งความเป็นอิสระมันจะกลายเป็นเรื่องง่ายมากที่จะใช้ในโครงการใหม่และมีโอกาสว่าจะไม่จำเป็นต้องอัปเดตบ่อยๆ ไม่จำเป็นต้องเปลี่ยนเป็นผลมาจากการเปลี่ยนแปลงของไลบรารีภายนอกที่ขึ้นอยู่กับสิ่งใดสิ่งหนึ่งซึ่งอาจพยายามทำให้บรรลุวัตถุประสงค์ทั่วไปมากกว่าสิ่งที่ห้องสมุดเสียงต้องการ
ดังนั้นบางครั้งมันก็คุ้มค่าที่จะเลือกทำซ้ำเล็กน้อย (อย่างมีสติไม่เคยเกียจคร้าน - ออกจากความขยันจริง) เพื่อแยกห้องสมุดและทำให้มันเป็นอิสระเพราะผ่านความเป็นอิสระ ความมั่นคง (ไม่มีข้อต่อข้อต่อ) ถ้าคุณต้องการออกแบบไลบรารี่ที่สามารถนำกลับมาใช้ใหม่ได้ซึ่งจะคงอยู่กับคุณตั้งแต่โปรเจ็กต์หนึ่งไปจนถึงโปรเจ็กต์ถัดไปและปีต่อ ๆ ไปจากนั้นลดขอบเขตให้เหลือน้อยที่สุด และเขียนการทดสอบหน่วยและให้แน่ใจว่ามันผ่านการทดสอบอย่างละเอียดและเชื่อถือได้ในสิ่งที่ทำ นี่เป็นเพียงไลบรารีที่คุณต้องการใช้เวลาในการพูดคุยทั่วไปจนถึงจุดที่ไกลเกินกว่าโปรเจ็กต์เดียว