ฉันคิดว่ามันยากที่จะทำให้สำเร็จทั้งสาม สองฉันคิดว่าเป็นไปได้ ตัวอย่างเช่นฉันคิดว่าเป็นไปได้ที่จะบรรลุประสิทธิภาพและความสามารถในการอ่านได้ในบางกรณี แต่การบำรุงรักษาอาจทำได้ยากด้วยโค้ดไมโครจูน โดยทั่วไปโค้ดที่มีประสิทธิภาพที่สุดในโลกจะขาดทั้งความสามารถในการบำรุงรักษาและความสามารถในการอ่านซึ่งอาจเป็นที่ชัดเจนสำหรับคนส่วนใหญ่ยกเว้นว่าคุณเป็นคนที่สามารถเข้าใจมือของ SOA-vectorized, SIMD แบบหลายเธรดที่ Intel เขียน อัลกอริธึมที่ใช้ในอุตสาหกรรมที่มีเอกสารทางคณิตศาสตร์ 40 หน้าเผยแพร่เมื่อ 2 เดือนที่ผ่านมาและห้องสมุด 12 แห่งที่มีรหัสสำหรับโครงสร้างข้อมูลที่ซับซ้อนอย่างเหลือเชื่อ
Micro-ประสิทธิภาพ
สิ่งหนึ่งที่ฉันขอแนะนำว่าอาจขัดกับความคิดเห็นที่นิยมคือรหัสอัลกอริทึมที่ฉลาดที่สุดมักจะยากต่อการบำรุงรักษามากกว่าอัลกอริธึมที่ปรับจูนตรงไปตรงมาที่สุด แนวคิดนี้ว่าการปรับปรุงความสามารถในการปรับขยายนั้นให้ผลตอบแทนที่มากกว่าสำหรับโค้ดขนาดจิ๋ว (เช่นรูปแบบการเข้าถึงที่เป็นมิตรกับแคช, มัลติเธรด, SIMD, ฯลฯ ) เป็นสิ่งที่ฉันท้าทายอย่างน้อยก็ทำงานในอุตสาหกรรมที่เต็มไปด้วยความซับซ้อนอย่างยิ่ง โครงสร้างข้อมูลและอัลกอริธึม (อุตสาหกรรมการแสดงผล FX) โดยเฉพาะอย่างยิ่งในด้านต่าง ๆ เช่นการประมวลผลแบบตาข่ายเพราะบางครั้งอาจมีขนาดใหญ่ แต่เจ้าชู้นั้นมีราคาแพงมากเมื่อคุณแนะนำอัลกอริธึมและโครงสร้างข้อมูลใหม่ ๆ ใหม่. นอกจากนี้ฉัน
ดังนั้นแนวคิดนี้ว่าการปรับอัลกอริทึมให้ดีที่สุดเสมอคือการเพิ่มประสิทธิภาพที่เกี่ยวข้องกับรูปแบบการเข้าถึงหน่วยความจำจึงเป็นสิ่งที่ฉันไม่เห็นด้วย แน่นอนถ้าคุณใช้การเรียงลำดับแบบไม่มีฟองการเพิ่มประสิทธิภาพขนาดเล็กไม่สามารถช่วยคุณได้ ... แต่ด้วยเหตุผลฉันไม่คิดว่ามันจะชัดเจน และการเพิ่มประสิทธิภาพอัลกอริธึมที่สามารถรักษาได้ยากกว่าการปรับให้เหมาะสมแบบไมโคร ฉันจะพบว่ามันง่ายกว่ามากในการดูแลรักษาพูดว่า Embree ของ Intel ซึ่งใช้อัลกอริทึม BVH แบบคลาสสิกและตรงไปตรงมาและเพียงแค่ micro-tunes อึออกมาจากรหัส OpenVDB ของ Dreamwork สำหรับวิธีการที่ทันสมัย ดังนั้นในอุตสาหกรรมของฉันอย่างน้อยฉันก็อยากเห็นคนที่คุ้นเคยกับสถาปัตยกรรมคอมพิวเตอร์เพิ่มประสิทธิภาพมากขึ้นเช่นเดียวกับที่ Intel มีเมื่อพวกเขาก้าวเข้ามาในฉาก เมื่อเทียบกับการสร้างอัลกอริธึมและโครงสร้างข้อมูลใหม่นับพัน ด้วยการเพิ่มประสิทธิภาพขนาดเล็กที่มีประสิทธิภาพผู้คนอาจพบเหตุผลน้อยลงและน้อยลงในการคิดค้นอัลกอริทึมใหม่
ฉันทำงานใน codebase ดั้งเดิมก่อนที่การดำเนินการของผู้ใช้เกือบทุกรายจะมีโครงสร้างข้อมูลที่เป็นเอกลักษณ์และอัลกอริธึมด้านหลัง (เพิ่มโครงสร้างข้อมูลแปลกใหม่หลายร้อยรายการ) และส่วนใหญ่มีลักษณะการทำงานที่เบ้มาก มันจะง่ายกว่านี้มากหากระบบสามารถหมุนรอบโครงสร้างข้อมูลที่ใช้งานได้อย่างกว้างขวางมากกว่าสองสามโหลและฉันคิดว่าน่าจะเป็นเช่นนั้นหากพวกเขาได้รับการปรับให้เหมาะสมกับไมโครมากขึ้น ฉันพูดถึงกรณีนี้เพราะการเพิ่มประสิทธิภาพขนาดเล็กสามารถปรับปรุงการบำรุงรักษาได้อย่างมากในกรณีเช่นนี้ถ้ามันหมายถึงความแตกต่างระหว่างโครงสร้างข้อมูลเชิงลึกหลายร้อยตัวที่ไม่สามารถใช้ได้อย่างปลอดภัยสำหรับจุดประสงค์ในการอ่านอย่างเดียวเท่านั้น ถูกต้องกับ
ภาษาหน้าที่
ในขณะที่บางส่วนของรหัสที่รักษาได้มากที่สุดที่ฉันเคยพบมีประสิทธิภาพพอสมควร แต่อ่านยากมากเพราะเขียนด้วยภาษาที่ใช้งานได้ โดยทั่วไปความสามารถในการอ่านและการบำรุงรักษา uber นั้นเป็นความคิดที่ขัดแย้งกันในความคิดของฉัน
เป็นการยากที่จะทำให้การอ่านโค้ดและการบำรุงรักษาและมีประสิทธิภาพทั้งหมดในครั้งเดียว โดยทั่วไปแล้วคุณต้องประนีประนอมกันเล็กน้อยในหนึ่งในสามข้อถ้าไม่ใช่สองข้อเช่นการยอมความง่ายในการอ่านเพื่อการบำรุงรักษาหรือการบำรุงรักษาอย่างมีประสิทธิภาพ ปกติแล้วการบำรุงรักษาจะเป็นเรื่องที่ทนทุกข์เมื่อคุณค้นหาอีกสองรายการ
ความสามารถในการอ่านกับการบำรุงรักษา
ตอนนี้ที่กล่าวไปแล้วฉันเชื่อว่าการอ่านและการบำรุงรักษาไม่ได้เป็นแนวคิดที่กลมกลืนกัน ท้ายที่สุดรหัสที่มนุษย์อ่านได้มากที่สุดของมนุษย์ส่วนใหญ่จะจับคู่กับรูปแบบความคิดของมนุษย์และรูปแบบความคิดของมนุษย์นั้นเกิดข้อผิดพลาดได้ง่าย: " ถ้าสิ่งนี้เกิดขึ้นทำสิ่งนี้ถ้าเกิดขึ้นทำอย่างนั้นโอ๊ะ ฉันลืมบางสิ่งบางอย่าง! หากระบบเหล่านี้มีปฏิสัมพันธ์ซึ่งกันและกันสิ่งนี้จะเกิดขึ้นเพื่อให้ระบบนี้สามารถทำสิ่งนี้ได้ ... โอ้เดี๋ยวก่อนระบบนี้จะทำงานเมื่อไหร่"ฉันลืมคำพูดที่แน่นอน แต่มีคนเคยบอกว่าถ้าโรมสร้างขึ้นเหมือนซอฟต์แวร์มันจะเอานกลงบนกำแพงเพื่อโค่นล้มลงนั่นเป็นกรณีของซอฟต์แวร์ส่วนใหญ่มันเปราะบางกว่าที่เรามักสนใจ คิดว่าโค้ดที่ดูไม่น่ากลัวสักสองสามบรรทัดที่นี่และอาจทำให้มันหยุดชะงักเพื่อทำให้เราพิจารณาการออกแบบทั้งหมดและภาษาระดับสูงที่มุ่งหวังให้อ่านได้มากที่สุดจะไม่มีข้อยกเว้นสำหรับข้อผิดพลาดในการออกแบบของมนุษย์ .
ภาษาที่ใช้งานได้จริงนั้นใกล้เคียงกับสิ่งที่ไม่อาจเปลี่ยนแปลงได้ในขณะที่คนคนหนึ่งสามารถทำได้ (ไม่ได้ใกล้เคียงกับความปลอดภัย แต่ค่อนข้างใกล้กว่าคนส่วนใหญ่) และนั่นเป็นเพียงบางส่วนเพราะพวกเขาไม่ได้ทำแผนที่สังหรณ์ใจกับความคิดของมนุษย์ พวกมันไม่สามารถอ่านได้ พวกเขาบังคับรูปแบบการคิดให้เราซึ่งทำให้เราต้องแก้ปัญหาด้วยกรณีพิเศษน้อยที่สุดเท่าที่จะทำได้โดยใช้ความรู้ขั้นต่ำเท่าที่จะเป็นไปได้และไม่ก่อให้เกิดผลข้างเคียงใด ๆ พวกเขาเป็นมุมฉากมากพวกเขาอนุญาตให้มีการเปลี่ยนแปลงรหัสและมักจะเปลี่ยนโดยไม่ต้องประหลาดใจดังนั้นเราจึงต้องคิดใหม่เกี่ยวกับการออกแบบบนกระดานวาดภาพถึงจุดเปลี่ยนความคิดของเราเกี่ยวกับการออกแบบโดยรวมโดยไม่ต้องเขียนใหม่ทุกอย่าง ดูเหมือนจะไม่ง่ายกว่าที่จะรักษากว่านั้น ... แต่รหัสยังอ่านยากมาก