-
มุมมองอีกแบบต่อการพึ่งพาไลบรารี
- เสนอมุมมองใหม่ต่อการพึ่งพาไลบรารี โดยควรลดการใช้งานที่มากเกินไปและหันมาเขียนโค้ดด้วยตนเองมากขึ้น
-
ปัญหาของการพึ่งพาไลบรารี
- "การสิ้นเปลืองจากการพึ่งพาไลบรารี" คือวงจรไม่รู้จบของการอัปเดต แพตช์ การตรวจสอบ และการพึ่งพาแบบส่งต่อที่นักพัฒนาติดตั้งเพื่อเพิ่มผลิตภาพ
- JavaScript และ Rust เปราะบางต่อปัญหาการพึ่งพาไลบรารีเป็นพิเศษ ตัวอย่างเช่น โปรเจ็กต์ Tokio ใหม่มี 28 crate และโปรเจ็กต์ Rocket เพิ่มขึ้นเป็น 172 crate
-
ปัญหาขนาดเทอร์มินัล
- crate
terminal_size ให้ฟังก์ชันง่าย ๆ สำหรับวัดขนาดเทอร์มินัล แต่ต้องใช้ crate เพิ่มเติมอีกหลายตัว
- ส่งผลให้เกิดสถานการณ์ที่ต้องคอมไพล์ฟังก์ชันอื่น ๆ อีกหลายพันรายการ
-
ความจำเป็นของการพึ่งพาไลบรารี
- มีการสร้างอยู่บนไลบรารี abstraction ของแพลตฟอร์ม จึงต้องมีการอัปเดตเพื่อหลีกเลี่ยงการเขียนโค้ดซ้ำและลดเวลาคอมไพล์
- ในหลายกรณี สิ่งนี้กลายเป็นสาเหตุหลักของปัญหาด้านความปลอดภัย
-
เป้าหมายของโค้ด
- โค้ดควรถูกเขียนในแบบที่ไม่จำเป็นต้องอัปเดต ใน ecosystem ของ Rust โค้ดที่มีความเสถียรกลับมักเสียเปรียบ
-
ข้อดีของการเขียนโค้ดเองโดยตรง
- เมื่อเขียนโค้ดเอง จะไม่ต้องใช้ crate ใหม่ และลดความจำเป็นในการบำรุงรักษา
- สามารถใช้เครื่องมืออย่าง ChatGPT เพื่อเขียน implementation ที่ไม่มี dependency ได้อย่างรวดเร็ว
-
โอเพนซอร์สและวัฒนธรรมองค์กร
- วัฒนธรรมการรีวิวโค้ดขององค์กรส่งอิทธิพลต่อซอฟต์แวร์โอเพนซอร์ส
- การใช้ไลบรารีใหม่มักถูกมองในแง่บวก
-
ความจำเป็นของมุมมองใหม่
- ควรชื่นชมวิศวกรที่ลงมือเขียนฟังก์ชันเล็ก ๆ เอง
- ควรมองกราฟ crate ขนาดใหญ่ด้วยความสงสัย
-
ไลบรารีสำคัญ
- ยังมีไลบรารีสำคัญที่ช่วยแก้ปัญหาซับซ้อนอยู่ เช่น ไลบรารีกราฟิกหรือการทำ implementation ของโปรโตคอล
-
ความสำคัญของการสร้างเอง
- ควรยกย่องการสร้างเองเมื่อเหมาะสม
- ควรให้เครดิตแก่ผู้เขียนไลบรารีที่สร้างไลบรารีโอเพนซอร์สที่มี dependency น้อยหรือไม่มีเลย
-
บทสรุป
- ควรเปลี่ยนทิศทางไปสู่การลด dependency และเขียนโค้ดด้วยตนเองมากขึ้น
minijinja เป็นตัวอย่างของการลด dependency ให้เหลือน้อยที่สุด โดยพึ่งพาเพียง serde ตัวเดียว
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ชอบภาษา Rust แต่ไม่ชอบปัญหาเรื่อง dependency ของ Rust การจัดการ dependency ของ C++ ดีกว่า ใน C++ สามารถควบคุม dependency ได้ด้วยตัวเอง แต่ใน Rust มักเกิด dependency จำนวนมากจนทำให้เลิกใช้ไป ในแง่ความปลอดภัยก็ไม่รู้ว่าตัวเองกำลังแจกจ่ายอะไรอยู่ Rust ไม่มี ABI compatibility และวัฒนธรรม shared library ก็ยังไม่แข็งแรง สิ่งนี้ทำลายโมเดลการแจกจ่ายแพ็กเกจของ OS
API ของเทอร์มินัลยังไม่เสถียร TIOCGWINSZ ioctl ไม่ได้ถูกทำให้เป็นมาตรฐาน และการเพิ่มฟังก์ชัน tcgetwinsize() เข้าไปใน POSIX เพิ่งเกิดขึ้นในปี 2024 ฝั่ง Windows ซับซ้อนยิ่งกว่า
นำเว็บแอปที่สร้างไว้ในปี 2006 กลับมาชุบชีวิต ออกแบบกระบวนการ deploy ของแอปอย่างเกินความจำเป็นเพื่อเรียนรู้เทคโนโลยี CI/CD ใหม่ ๆ ใช้ PHP และ MySQL และเขียนโค้ดเองเกือบทั้งหมด ใช้เวลาแค่หนึ่งชั่วโมงในการปลุกแอปอายุ 19 ปีให้กลับมาใช้งานได้ ในทางกลับกัน แอป Spring Boot ที่ใช้อยู่ในงานปัจจุบันกลับอัปเดตได้ยากเพราะปัญหา dependency
NodeJS ส่งผลอย่างมากต่อเส้นทางอาชีพ แต่ NPM ก่อปัญหาไว้มากมาย พอจะเพิ่ม dependency ใหม่ก็มักไปชนกับ dependency อื่น ในกรณีของ Expo มีปัญหาที่โปรเจกต์ React Native พื้นฐาน build บน Android ไม่ได้ เรื่องนี้ทำให้รู้สึกมั่นใจขึ้นว่าแม้แต่โปรเจกต์ขนาดใหญ่ก็ยังปล่อยเทมเพลตที่ใช้งานไม่ได้ออกมาได้
ecosystem ของ Rust มี dependency มากเมื่อเทียบกับ Go ใน Go นั้น interface ถูกทำให้สอดคล้องกันโดยปริยาย จึงไม่จำเป็นต้องมี dependency เพิ่มเติม
abstraction ของไลบรารีมีต้นทุนแฝงอยู่ เมื่อแพ็กเกจเปลี่ยนดีไซน์ก็ทำให้เกิดความไม่เสถียร สิ่งที่เรียบง่ายมักอยู่รอดได้นานที่สุด เห็นปัญหาคล้ายกันนี้ไม่ใช่แค่ใน Rust แต่ในภาษาอื่นด้วย
ให้ ChatGPT หรือ Cursor สร้าง implementation ที่ไม่มี dependency ให้แบบรวดเร็วกลับจะเร็วกว่า dependency ของบริการ SaaS/3rd party หลายอย่างเป็นปัญหาที่ถูกแก้ไปแล้ว
Flask และ Bottle มีความสามารถคล้ายกัน แต่ Flask ได้รับความนิยมมากกว่า Bottle เป็นไฟล์เดียวและไม่มี dependency จึงคัดลอกเข้าโปรเจกต์ได้ง่าย อย่างไรก็ตาม มันไม่ได้ตามแนวปฏิบัติ Python สมัยใหม่ จึงให้ความรู้สึกล้าสมัย
ต้องการวิศวกรที่มีความสามารถและสามารถพัฒนาโซลูชันได้ด้วยตัวเอง ซึ่งมักสร้างโซลูชันที่ดีกว่าไลบรารีเดิมได้ไม่ยาก ในโปรเจกต์หนึ่งเคยเขียน parser สำหรับ markdown แบบดัดแปลงเอง แต่เพื่อนร่วมทีมไม่ยอมใช้เพราะกังวลเรื่องการบำรุงรักษา
การคอมไพล์ฟังก์ชันนับร้อยเพียงเพื่อใช้งานแค่ฟังก์ชันเดียวเป็นปัญหา ในโปรเจกต์ที่อัปเดต dependency ของ 3rd party นั้น มีการใช้เพียงเมธอดเดียวจากไลบรารีคณิตศาสตร์ จึงแนะนำให้วิศวกรไปดูหน้า Wikipedia แล้วเขียนเมธอดนั้นขึ้นมาเอง ปัญหาไม่ใช่การใช้ dependency ของ 3rd party แต่คือเราต้องการแนวคิดในการดึงมาใช้แค่ส่วนเล็ก ๆ ของไลบรารี บางที "microframework" อาจเป็นคำตอบได้