มันโอเคที่จะใช้การเขียนโปรแกรมเมตาแม้ว่าเพื่อนร่วมงานของฉันจะไม่เข้าใจหรือไม่?


102

ฉันใช้การเขียนโปรแกรมเมตาจำนวนมากเพื่อหลีกเลี่ยงงานซ้ำ ๆ และสร้าง abstractions ที่ปลอดภัยต่อการใช้งาน

ฉันเพิ่งย้ายไปทำงานใหม่ที่ฉันทำงานในทีมที่ใหญ่กว่าและสิ่งนี้ทำให้เพื่อนร่วมงานของฉันกังวลเพราะพวกเขาไม่เข้าใจ

ฉันพยายามยกระดับความสามารถของภาษาอย่างเต็มที่ แต่เพื่อนร่วมงานของฉันบางคน (ไม่ใช่ทั้งหมด) เข้าใจว่าเป็นความเสี่ยง (บางคนยินดีต้อนรับวิธีการ)

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

คำถามของฉันคือใครถูกต้องฉันควรทำอย่างไร

การชี้แจง: การ พยายามยกระดับศักยภาพของภาษาอย่างเต็มที่ไม่ได้หมายความว่าฉันจะใช้ TMP ในทุกปัญหา C ++ เป็นกล่องเครื่องมือและสำหรับฉันความสามารถ C ++ นั้นเกี่ยวกับความสามารถในการใช้เครื่องมือทั้งหมดจากกล่องและเกี่ยวกับการเลือกเครื่องมือที่เหมาะสมสำหรับงานเฉพาะ


38
ท้ายที่สุดนี่คือพื้นฐานของความคิดเห็น โดยส่วนตัวแล้วฉันทำให้เป็นกฎที่จะไม่ใช้คุณสมบัติที่ซับซ้อนจนทำให้ทัวริงเสร็จสมบูรณ์โดยไม่ได้ตั้งใจ - เช่น metaprogramming เทมเพลต C ++
Kilian Foth

24
@KilianFoth แม่แบบไม่ "ตั้งใจ" ทัวริงเสร็จสมบูรณ์ พวกเขาตั้งใจเสมอที่จะเป็นเครื่องมืออันทรงพลังในการทำให้เป็นนามธรรม
Caleth

73
รหัสที่ไม่มีใครสามารถเข้าใจได้นั้นไม่ใช่มาตรฐานที่สูงกว่า
gburton

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

26
ขั้วคู่เท็จ คุณสามารถตั้งโปรแกรมที่ "มาตรฐานที่สูงกว่า" และทิ้งไว้ข้างหลัง C ด้วยคลาส, โอบกอด C ++ สมัยใหม่, ใช้เท็มเพลต (เช่น STL) เช่นเดียวกับ const, no () การคัดเลือกนักแสดง, ไม่ใช้เลขคณิตชี้, ความหมายของคุณค่า ibnto TMP หากคุณไม่เห็นเวลากลางวันระหว่างคลาส C กับคลาสและ TMP แสดงว่าคุณทำผิด
Kate Gregory

คำตอบ:


185

Metaprogramming นั้นใช้ได้ สิ่งที่คุณพยายามทำไม่เป็นไร

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

ปัญหาไม่ได้เป็นโปรแกรมการเขียนโปรแกรม แต่สิ่งนี้:

ในทางกลับกันเราเป็นนักพัฒนา C ++ มืออาชีพและฉันคิดว่าเราควรจะมีมาตรฐานที่สูงกว่าการเขียน C ด้วยคลาส

ที่นี่คุณมีปัญหา คุณมีความคิดเห็น เป็นเรื่องปกติที่จะมีความเห็นว่าการใช้โปรแกรมเมตาดาต้าเป็นสิ่งที่ดี ไม่เป็นไรที่จะมีความเห็นว่าเราทุกคนต่างก็ปรารถนาที่จะเป็นนักพัฒนา C ++ ที่ดีกว่า

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

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

หากคุณต้องการที่จะส่งเสริมให้พวกเขาจะโอเคกับ metaprogramming, เริ่มต้นเล็ก ๆ เริ่มด้วยซิงเกิลenable_ifที่ทำให้ API อ่านง่ายขึ้น จากนั้นแสดงความคิดเห็นแสงจากมัน จากนั้นอาจพบกรณีหนึ่งที่เทมเพลต metafunction เปลี่ยนคลาสซ้ำขนาดใหญ่ 10 คลาสเป็น 1 คลาสพร้อมกับผู้ช่วย 10 คน แสดงความคิดเห็นห่าออกจากมัน รับคำติชม. ค้นหาสิ่งที่ผู้คนคิดเกี่ยวกับมัน สบาย ๆ ถ้าพวกเขาบอกคุณว่าอย่าทำ ค้นหาช่องที่ metaprogramming ได้รับมันอย่างละเอียดจนเพื่อนร่วมงานของคุณทั้งหมด (อย่างไม่พอใจ) ยอมรับว่าเป็นเครื่องมือที่เหมาะสมสำหรับงาน

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

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

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


72
แทนที่ "metaprogramming" ด้วยสไตล์เทคนิคเทคโนโลยีห้องสมุดและคำตอบก็ยังยอดเยี่ยม!
Andrejs

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

4
@ t3chb0t: หัวหน้าที่มีประสบการณ์รู้ว่าควรใช้เงินเท่าไหร่ในการบริการลูกค้า (เช่นการแก้ไขข้อบกพร่องและคุณสมบัติใหม่) และวิธีการลดค่าใช้จ่ายนั้น การบำรุงรักษาเป็นเครื่องมือที่ทรงพลังที่สุดสำหรับวัตถุประสงค์นั้น เจ้านายคนนั้นอาจไม่ทราบรายละเอียดทางเทคนิค แต่ควรจะสามารถสร้างทีมที่เชื่อถือได้ในจุดนั้น
mouviciel

25
@Drmmr ฉันได้ตั้งค่าเสียงสำหรับคนที่เชื่อว่าโปรแกรมเมอร์ควรใช้ metaprogramming เพื่อยกระดับมาตรฐาน ฉันไม่คิดว่าควรจะเป็นคนโง่เขลาไปจนถึงจุดที่ทีมที่มีทักษะน้อยสามารถรักษาได้ มันควรจะ dumbed ลงไปที่ทีมสามารถรักษามันและบางทีอาจจะแข็งแกร่งยิ่งขึ้นก็ควรจะ dumbed ลงไปที่ทีมงานสามารถรักษามันโดยที่คุณไม่ มิฉะนั้นจะมีคนเขียนงานด้วยตัวเอง
Cort Ammon

15
@Joshua สิ่งที่ฉันได้พบคือไม่มีสิ่งเช่น "รหัสที่ไม่ต้องการการบำรุงรักษา"
Cort Ammon

39

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

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

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


ฉันเห็นด้วย แต่พูดคุยกับ QA ก่อนที่คุณจะใส่ไว้ในรหัส ไม่มีเหตุผลในการสร้างสิ่งที่จะถูกปฏิเสธ
shawnhcorey

8
วิธีการ: "ฉันเห็นด้วย แต่ ... " การเปลี่ยนเป็น "เป็น" จะเปลี่ยนความหมายโดยสมบูรณ์ เราควรพูดถึงสิ่งที่ผิดปกติกับ QA เสมอก่อนที่จะใช้เวลากับมัน คุณระบุว่าการสนทนานี้จะเกิดขึ้นในการตรวจสอบรหัสหลังจากใช้เวลา
shawnhcorey

@shawnhcorey: แน่นอนถ้า "QA" ในองค์กรของคุณเป็นผู้รับผิดชอบมาตรฐานการเข้ารหัส อย่างไรก็ตามนี่เป็น IMHO ไม่ใช่บทบาท "QA" ทั่วไป - ในองค์กรส่วนใหญ่ที่ฉันรู้จักคำว่า "QA" หมายถึงกลุ่มคนที่ทำประกันคุณภาพในรูปแบบกล่องดำไม่รับผิดชอบองค์ประกอบใดของภาษาโปรแกรม จะใช้และสิ่งที่ไม่ คนเหล่านั้นไม่ค่อยมีคุณสมบัติเพียงพอในการเขียนโปรแกรมเพื่อหารือเกี่ยวกับรายละเอียดดังกล่าว
Doc Brown

2
@shawnhcorey: นั่นคือจุดของฉันบทบาท QA แตกต่างกันอย่างมากในองค์กรที่แตกต่างกัน ในองค์กรจำนวนมากคน QA ไม่มีความคิดในการเขียนโปรแกรมดังนั้นพวกเขาอาจไม่ใช่คนที่เหมาะสมในการพูดคุยเรื่องดังกล่าว
Doc Brown

2
@shawnhcorey: เอาละคุณเขียนว่า "QA เป็นศัพท์ทั่วไป" - ในอีกแง่หนึ่งคุณมีบทบาทและหน้าที่รับผิดชอบในการควบคุมคุณภาพที่เฉพาะเจาะจงมาก - ฟังดูขัดแย้งกับฉันเล็กน้อย
Doc Brown

18

ความคิดเห็นทั่วไปของฉัน: หากคุณมีตัวเลือกตามที่มักจะเป็นกรณีระหว่างสามตัวเลือกต่อไปนี้:

  • พิมพ์โครงสร้างโค้ดที่ไม่น่าสนใจมากมายด้วยมือซ้ำ ๆ
  • ใช้เทมเพลตการเขียนโปรแกรม C ++ เพื่อสร้างรหัสอัตโนมัติ
  • ใช้กลไกการสร้างรหัสอื่น ๆ เช่นมาโครหรือภาษาการเขียนโปรแกรมอื่น ๆ เพื่อสร้างไฟล์ต้นฉบับ C ++

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

เมื่อคุณใช้เทมเพลต Meta-Programming ( TMP ) เพื่อหลีกเลี่ยงการซ้ำซ้อนคุณควรใช้มันเพื่อสร้าง abstractions ที่ผ่านการทดสอบอย่างดีและมีการทดสอบอย่างรอบคอบซึ่ง จำกัด ความซับซ้อนภายในโค้ด TMP ทำให้ง่ายต่อการเขียนรหัสลูกค้าที่ถูกต้อง นี่คือการออกแบบของไลบรารีมาตรฐาน C ++

ฉันไม่คิดว่าเราสามารถตัดสินว่าใครถูกหรือผิดโดยไม่เห็นตัวอย่างประเภทของรหัสที่คุณพยายามเขียน


2
คุณสามารถใช้ copy + paste แทนการพิมพ์ด้วยมือ ;-)
Paŭlo Ebermann

4
@ PaŭloEbermann: ไม่ต้อง!
Joshua

2
@ PaŭloEbermannร้านหนึ่งที่ฉันถูกเรียกว่าวิธีการนั้น "เริ่มต้นเครื่องหมายข้อบกพร่องจุดสิ้นสุดเครื่องหมายข้อผิดพลาดคัดลอกข้อผิดพลาดคัดลอกข้อผิดพลาด"
Kelly S. French

12

นักพัฒนาซอฟต์แวร์ควรปรารถนาที่จะเขียนโค้ดที่ใช้งานได้ผลชัดเจนว่าสามารถทดสอบได้ซึ่งสามารถตรวจสอบได้ที่สามารถดีบั๊กและสามารถปรับเปลี่ยนได้เมื่อต้องการการเปลี่ยนแปลง หากการเขียน "C กับคลาส" บรรลุผลนี้ก็ถือว่าใช้ได้

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


9

ข้อโต้แย้งจากความเห็นอกเห็นใจ:

งานของคุณให้เวลาว่างสำหรับการเรียนรู้หรือในทางเลือกคุณสามารถโน้มน้าวให้หัวหน้าของคุณจัดสรรเวลาหลายชั่วโมงเพื่อเรียนรู้คุณสมบัติภาษาเหล่านี้ได้หรือไม่?

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


8

ควรเขียนรหัสในตอนแรกเพื่อให้มนุษย์อ่านและเฉพาะในกรณีที่คอมไพเลอร์แยกวิเคราะห์

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

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

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

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

แม้ว่าฉันจะสามารถเขียน C ++ ที่ทันสมัยได้ตามปกติแล้วฉันไม่ชอบมันหมายความว่าฉันต้องลดการเขียนโปรแกรมบำรุงรักษาลง


7

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


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

2

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

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

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


0

ไม่มีคำตอบที่ถูกต้องสำหรับคำถามนี้

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

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


-4

คำถามไม่ได้เกี่ยวกับว่าการเขียนโปรแกรมเมตาไม่เป็นไรหรือไม่ แต่ค่อนข้างจะดีกว่าคนอื่น ๆ ในทีมดังนั้นนี่คือจุดโต้เถียงสองสามข้อเกี่ยวกับวิธีที่ฉันเห็น ...


ฉันเพิ่งย้ายไปทำงานใหม่ที่ฉันทำงานในทีมที่ใหญ่กว่าและ [meta-programming] กังวลเพื่อนร่วมงานของฉันเพราะพวกเขาไม่เข้าใจ

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


ฉันพยายามยกระดับความสามารถของภาษาอย่างเต็มที่ แต่เพื่อนร่วมงานของฉันบางคน (ไม่ใช่ทั้งหมด) เข้าใจว่าเป็นความเสี่ยง (บางคนยินดีต้อนรับวิธีการ)

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


ฉันยอมรับว่ามันเป็นปัญหาในการเขียนโค้ดที่ไม่มีใครในทีมสามารถเข้าใจได้

ฉันไม่. ฉันคิดว่ามันแสดงความเชี่ยวชาญของคุณ


คำถามของฉันคือใครถูกต้องฉันควรทำอย่างไร

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


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


แก้ไข

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

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

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

ตอนนี้คุณคิดว่านี่โง่และบ้าแล้วใช่ไหม แต่เพื่อไม่ให้มีคุณสมบัติอื่น ๆ กวีบางคนสามารถใช้พวกเขาและคนอื่น ๆ ไม่ต้องการเรียนรู้

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

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


10
คำตอบนี้น่ากลัว Meta-การเขียนโปรแกรมไม่ได้หมายความถึงอำนาจสูงสุดและในทางกลับกัน
polfosol

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

3
การเขียนโค้ดที่คนอื่นอ่านไม่ได้ไม่ได้หมายความว่าคุณเก่งกว่าพวกเขา มันพิสูจน์ได้ว่าคุณไม่สามารถเขียนรหัสที่อ่านได้
เฮมเมอ

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

4
@ t3chb0t จุดของฉันคือว่าทั้งสองเป็นสิ่งเดียวกัน
เฮมเมอ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.