-
การรับรู้เกี่ยวกับผลกระทบแบบ Makefile
- ผลกระทบแบบ Makefile หมายถึงปรากฏการณ์ที่แทนที่จะเขียนสิ่งใหม่ตั้งแต่ต้นสำหรับเครื่องมือที่ซับซ้อนหรือไม่คุ้นเคย ผู้คนกลับคัดลอกตัวอย่างที่เคยใช้ได้ผลดีมาก่อนแล้วปรับแก้
- ปรากฏการณ์นี้มักพบได้บ่อยเมื่อวิศวกรหลากหลายสายงานใช้เครื่องมืออย่าง Make
- หากเคยมีการทำงานลักษณะคล้ายกันมาก่อน วิศวกรก็มักคัดลอก Makefile เดิมมาแก้ให้เข้ากับสถานการณ์ใหม่
-
ปัญหาและผลกระทบ
- ปัญหาในขั้นตอนการออกแบบ: เครื่องมือซับซ้อนเกินไป หรือใช้งานตั้งแต่ต้นได้อย่างยุ่งยาก
- การตั้งค่า CI/CD: มักคัดลอกและปรับแก้การตั้งค่า YAML ใน GitHub Actions หรือ GitLab CI/CD
- การตั้งค่า linter และ formatter: คัดลอกชุดกฎพื้นฐานข้ามโปรเจ็กต์ แล้วค่อยเพิ่มหรือลดความเข้มงวดตามความจำเป็น
- ระบบบิลด์: ทุกอย่างที่ไม่ใช่เรื่องเล็กน้อยมักเริ่มมีหน้าตาคล้ายระบบบิลด์ก่อนหน้า
-
เหตุใดปรากฏการณ์นี้จึงสำคัญ
- การรองรับด้านการวินิจฉัยและดีบักที่ไม่เพียงพอ: ต้องรันเครื่องมือซ้ำหลายครั้ง แต่ได้รับข้อมูลกลับมาน้อย
- ขัดขวางการเรียนรู้: มีเพียงผู้เชี่ยวชาญบางคนที่เข้าใจเครื่องมืออย่างดี ส่วนคนอื่น ๆ ใช้วิธีคัดลอกแล้วแก้โดยมีความรู้เพียงขั้นต่ำ
- ปัญหาด้านความปลอดภัย: งานด้านความปลอดภัยต้องอาศัยความเข้าใจเชิงลึก และระบบที่มีผลกระทบแบบ Makefile อาจทำให้เกิดความสับสนระหว่างโค้ดกับข้อมูล
-
สิ่งที่ควรพิจารณาเมื่อออกแบบเครื่องมือ
- เครื่องมือจำเป็นต้อง ปรับแต่งได้ หรือไม่
- จำเป็นต้องมี ไวยากรณ์ของตัวเอง หรือไม่
- สามารถนำ ไวยากรณ์ หรือสำนวนการใช้งาน ที่มีอยู่แล้ว กลับมาใช้ซ้ำได้หรือไม่
- มีการ คัดลอก-วาง เกิดขึ้นบ่อยหรือไม่
-
ปรากฏการณ์ที่คล้ายกับผลกระทบแบบ Makefile
- คล้ายกับ cargo culting หรือ normalization of deviance แต่ผลกระทบแบบ Makefile เป็นเรื่องของผลลัพธ์ที่เกิดจากการออกแบบเฉพาะแบบหนึ่ง
- ผลกระทบแบบ Makefile ไม่ได้ไร้ประสิทธิภาพหรือเลวร้ายโดยเนื้อแท้เสมอไป แต่เป็นสิ่งที่ควรตระหนักเมื่อออกแบบเครื่องมือและระบบ
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ระบบที่ซับซ้อนมักค่อย ๆ พัฒนามาจากระบบที่เรียบง่าย ระบบที่ถูกออกแบบให้ซับซ้อนตั้งแต่แรกมักทำงานได้ไม่ดี และควรเริ่มต้นจากระบบที่เรียบง่าย
Make และ Makefiles นั้นเรียบง่ายมากถ้าไม่ได้ถูกสร้างอัตโนมัติด้วย autoconf หากถูกสร้างด้วย autoconf ก็ไม่ควรแก้ไข และถ้าเป็นไปได้ก็ควรหลีกเลี่ยงการใช้ autoconf เขียนโค้ดขึ้นมาเล็กน้อยหรือคัดลอกมาใช้กับโปรเจ็กต์ แล้วค่อยปรับปรุงตามความจำเป็น จากนั้นก็คัดลอกโค้ดนั้นไปยังโปรเจ็กต์ถัดไปแล้วแก้ไข และสะท้อนการเปลี่ยนแปลงกลับไปยังโปรเจ็กต์ต้นทาง เมื่อผ่านหลายโปรเจ็กต์ก็อาจสกัดออกมาเป็นไลบรารีและเผยแพร่เป็นโอเพนซอร์สได้
นักพัฒนาราว 10% มีความสามารถในการเริ่มสร้างบางอย่างได้ตั้งแต่ศูนย์ 40% ทำงานด้วยการคัดลอกและวางโค้ด และอีก 50% แทบไม่รู้อะไรนอกจากโจทย์ปริศนา LeetCode Makefiles จำนวนมากถูกสร้างขึ้นจากการคัดลอกและวาง
Cargo Cult Development หมายถึงแนวทางพัฒนาที่ไม่เข้าใจหลักการของเทคโนโลยี แต่เลียนแบบเพียงลักษณะภายนอก เป็นวิธีแบบคัดลอก วาง ลอง ปรับ แล้วหวังว่าจะทำงานได้
Makefile อาจเป็นอุปมาที่ไม่ค่อยเหมาะนัก โค้ดจำนวนมากถูกคัดลอกมาจากเว็บและมีส่วนที่ไม่ได้ใช้อยู่มาก การลบส่วนที่ไม่จำเป็นออกเป็นนิสัยที่ดี
เครื่องมือหรือระบบที่นักพัฒนาต้องโต้ตอบด้วยถูกมองว่ามีคุณค่าไม่มากพอสำหรับการเรียนรู้อย่างสม่ำเสมอ เรื่องอย่างการตั้งค่า CI มักถูกมองว่าเป็นแบบ "ตั้งแล้วลืม" และส่วนที่ซับซ้อนก็ให้ทีมอื่นจัดการ ควรมีเครื่องมือและเอกสารที่เหมาะสมเพื่อให้นักพัฒนาเข้าถึงได้ง่าย
เครื่องมืออย่าง LaTeX มักถูกใช้งานไม่บ่อย จึงมักเริ่มจากการคัดลอกและวาง เครื่องมือที่ใช้น้อยย่อมจำได้ยาก
Make มีเอกสารที่ดีมาก และถ้าผู้ใช้อ่านเอกสารก็จะเข้าใจได้ง่าย อย่างไรก็ตาม เครื่องมือจำนวนมากมีเอกสารไม่เพียงพอ ทำให้ผู้ใช้เข้าใจเครื่องมือได้ยาก
เครื่องมือที่ซับซ้อนนั้นจำเป็น แต่ถ้าแอปพลิเคชันที่เรียบง่ายยังเกิดผลแบบ Makefile ก็แปลว่าเครื่องมือนั้นซับซ้อนเกินไป Makefile อาจเหมาะกับโปรเจ็กต์ขนาดเล็ก
"Copy-Pasta Driven Development" ชี้ให้เห็นปัญหาที่เกิดจากการคัดลอกและวางโค้ด และเครื่องมืออย่าง Copilot อาจทำให้ปัญหานี้แย่ลง