เรื่องนี้ไม่ใช่เรื่องใหม่ครับ แต่ผมลอง search google ด้วย ประโยคเหมือนชื่อโพสแล้วไม่มีผลลัพธ์ดีๆ ภาษาไทยใน 2 หน้าแรกเลย ก็เลยมาเขียนให้อ่านกัน
เนื้อหาในโพสนี้ เขียนจากประสบการณ์ส่วนตัว ประกอบกับ แปลและสรุปจาก Continuous Integration ครับ
ใครอ่านตรงไหนไม่รู้เรื่องแล้วอยากให้อธิบายเพิ่มเติมก็ถามมาได้นะครับ
ปัญหา
- การ merge code ระหว่าง dev ยาก ใช้เวลานาน
- Dev พัฒนาอยู่บน code ส่วนที่ถูกคนอื่นลบหรือเลิกใช้ไปแล้ว
- Dev ไม่กล้าแก้ code มากนัก เพราะกลัวจะกระทบคนอื่นและกลัว bug ส่งผลให้ code เน่าง่าย
- เมื่อมีคนมาถามถึงความเสถียรของโปรแกรม ตอบได้แค่ว่า “น่าจะใช้งานได้”
- ผลจากความผิดพลาดของการ merge ถูกพบเมื่อ code ขึ้นไปอยู่บน production แล้ว
- Code บน dev environment ไม่สามารถ deploy บน production environment ได้ หรือได้แต่ใช้เวลานาน
- Regression test ใช้เวลานาน และนานขึ้นเรื่อยๆ ตามความแก่ของโปรเจ็ค
- Management รู้ความก้าวหน้าของโปรเจ็คได้แค่จากปากคำของ Dev
- เมื่อเจอ bug ในระบบเวอร์ชั่นเก่ากว่าที่พัฒนาอยู่ ใช้เวลา setup เครื่องเพื่อทดสอบ bug นาน
วิธีแก้ไข
0. Dev ทุกคนเขียน unit test และมี acceptance test คลุมฟังก์ชัน
- ทำงานชิ้นเล็กๆ merge บ่อยๆ ทำเสร็จชิ้นนึง merge ทันที
- พัฒนาบน branch เดียวกันทุกคนในโปรเจ็ค
- ตรวจสอบว่า test รันผ่านก่อน commit/push ขึ้น repository กลาง
- มีระบบ automate สำหรับดึง source code มา build , นำลงเครื่องที่เหมือนเครื่อง production ที่สุด และรัน test ใหม่อีกรอบ ทุกครั้งที่ source code มีการเปลี่ยนแปลง แจ้งผลลัพธ์อย่างชัดเจน ทันที
- ทำ versioning ไฟล์ build
- แก้ test ที่พังอย่างรวดเร็ว ให้ความสำคัญการแก้ test ที่พังเป็นอันดับต้นๆ
ผลลัพธ์
- merge code กันเครียดน้อยลง
- ได้ code ที่พร้อมใช้งานตลอดเวลา regression test time เข้าใกล้ 0
- ไม่เสียแรงเปล่าไปทำงานบนส่วนที่เลิกใช้ไปแล้ว
- ได้ code ที่ไม่มี bug ที่เคยแก้ไปแล้วเกิดซ้ำ
- พบ bug ได้เร็วขึ้น ทำให้หาสาเหตุได้ง่ายขึ้น
- Dev กล้าที่จะ refactor code มาขึ้น
- โปรแกรม version ใหม่ๆ ออกเร็วขึ้น
- ไม่ต้องมาเครียดในการ deploy ขึ้น production โดยเฉพาะอย่างยิ่งวันท้ายๆ กำหนด release
- Dev เครียดน้อยลง รู้สึกว่าทำงานแล้ว “เสร็จ” จริงๆ
- Management เห็นความก้าวหน้าการทำงานของ dev ในแต่ละวันด้วยผลลัพธ์การ test ที่เพิ่มขึ้นทุกวันๆ
- สามารถ build ระบบขึ้นจาก version ใดก็ได้อย่างรวดเร็ว
สิ่งที่จำเป็น
- วินัยของ Dev
- การตัดแบ่งงานเป็นชิ้นเล็กๆ ต้องใช้ความสามารถในด้านการเขียนโปรแกรมให้เป็น modular และ refactoring
- เทคนิคการเขียน test ทำให้เทสได้เร็ว ครอบคลุม
- การทำระบบ build ให้ทำงานได้อย่างรวดเร็ว
เพิ่มเติม
บางบริษัทไปไกลถึงขั้นหลังจาก build และ test แล้ว นำขึ้น deploy บน production เลย ตามอ่านได้จาก keyword Continuous Deployment, Continuous Delivery ครับ
ของแถม
Tools for Continuous Integration at Google Scale ด้านเทคนิคเค้าไปไกลกว่าที่ผมเขียนมามากครับ