Programming
สมัยผมทำร้านเน็ต SiamCafe ยุคแรกๆ โค้ดก็ไม่ได้ซับซ้อนอะไรมาก เขียนคนเดียวจบ แต่พอโปรเจกต์ใหญ่ขึ้น ทำงานเป็นทีมเท่านั้นแหละ ปัญหาเกิด! แก้โค้ดทับกันบ้าง, ฟีเจอร์ใหม่พังของเก่าบ้าง วุ่นวายไปหมด
Git branch strategy เลยเข้ามาช่วยแก้ปัญหานี้แหละ มันคือ "แผน" ในการจัดการ branches ของ Git เพื่อให้ทีมทำงานร่วมกันได้อย่างราบรื่น ลดความขัดแย้ง และ maintain โค้ดได้ง่ายขึ้น คิดซะว่ามันคือ "วินัย" ในการทำงานโค้ดร่วมกัน
ลองนึกภาพว่าทุกคนในทีมแก้โค้ดไฟล์เดียวกันพร้อมๆ กัน แล้วค่อยเอามา merge ทีเดียว...หายนะชัดๆ! Git branch strategy ช่วย:
Git Flow คือ Git branch strategy ที่ได้รับความนิยมมาก (แต่ก็ไม่ได้เหมาะกับทุก project นะ) มันกำหนด branches หลักๆ ไว้ 5 แบบ:
สมัยก่อนตอนใช้ Git Flow นี่ชีวิตดีขึ้นเยอะเลย แต่หลังๆ มาผมว่ามันซับซ้อนไปหน่อยสำหรับโปรเจกต์เล็กๆ เดี๋ยวนี้ผมชอบใช้อะไรที่มัน simpler กว่านี้
ดูเหมือนจะเยอะ แต่จริงๆ แล้วมันค่อนข้างเป็นระเบียบ ถ้าทีมใหญ่ๆ ที่มีการ release บ่อยๆ Git Flow ก็ยังเป็นตัวเลือกที่ดีครับ
สมมติเราจะเริ่มพัฒนา feature ใหม่ชื่อ "login":
git checkout develop
git pull origin develop
git checkout -b feature/login
# ทำงานๆๆๆ
git add .
git commit -m "Add login feature"
git push origin feature/login
# สร้าง Pull Request บน Github/Gitlab/Bitbucket
พอ feature เสร็จ ก็สร้าง Pull Request เพื่อ merge เข้า develop เป็นอันจบพิธี SiamCafe Blog
Trunk-Based Development (TBD) เป็นอีก strategy ที่เรียบง่ายกว่า Git Flow มาก หลักการคือ ทุกคน commit โค้ดเข้า branch หลัก (trunk) หรือก็คือ main หรือ master โดยตรง
ฟังดูน่ากลัวใช่มั้ย? แต่ TBD มีข้อดีคือ มันทำให้ทีมทำงานเร็วขึ้น ลดความซับซ้อน และช่วยให้ integrate โค้ดกันได้บ่อยขึ้น
หัวใจสำคัญของ TBD คือ Feature Flags หรือ Feature Toggles มันคือการ "เปิด-ปิด" ฟีเจอร์ใหม่ได้โดยไม่ต้อง deploy โค้ดใหม่
ยกตัวอย่างเช่น เรากำลังพัฒนา feature "payment gateway ใหม่" เราก็ใส่ feature flag ไว้ในโค้ด:
if (isFeatureEnabled("new_payment_gateway")) {
// ใช้ payment gateway ใหม่
} else {
// ใช้ payment gateway เก่า
}
ใน production เราสามารถเปิด-ปิด feature "new_payment_gateway" ได้จาก config file หรือ dashboard โดยไม่ต้อง deploy โค้ดใหม่ SiamCafe Blog
| ข้อดี | ข้อเสีย |
|---|---|
| ง่ายและเร็ว | ต้องการ discipline สูง |
| Integration บ่อย ลดความขัดแย้ง | ต้องใช้ Feature Flags |
| เหมาะกับทีมเล็กถึงกลาง | อาจไม่เหมาะกับโปรเจกต์ที่ซับซ้อนมาก |
สมัยนี้ผมชอบใช้ TBD มากกว่า เพราะมันคล่องตัวดี แต่ต้องมีวินัยและใช้ Feature Flags ให้เป็นนะ
ดูวิดีโอเพิ่มเติมเกี่ยวกับGit Branch Strategy แบบมืออาชี:
Q: Git Flow เหมาะกับโปรเจกต์แบบไหน?
A: เหมาะกับโปรเจกต์ขนาดใหญ่ที่มีการ release บ่อยๆ และต้องการความ stable สูง
Q: Trunk-Based Development เหมาะกับโปรเจกต์แบบไหน?
A: เหมาะกับโปรเจกต์ขนาดเล็กถึงกลางที่ต้องการความเร็วและคล่องตัว
Q: Feature Flags สำคัญแค่ไหน?
A: สำคัญมาก! ถ้าจะใช้ Trunk-Based Development ต้องใช้ Feature Flags ให้เป็น
สุดท้ายนี้ ไม่มี Git branch strategy ไหนที่ "ดีที่สุด" มันขึ้นอยู่กับขนาดของทีม, ความซับซ้อนของโปรเจกต์, และความต้องการของแต่ละทีม ลองศึกษาและปรับใช้ให้เข้ากับสถานการณ์ของตัวเองดูครับ
SiamCafe.net — แหล่งความรู้ด้าน IT, Network, Security, Programming อันดับ 1 ของไทย ก่อตั้งตั้งแต่ปี 1997 โดย อ.บอม ผู้เชี่ยวชาญด้าน IT Infrastructure และ Forex Trading มากกว่า 25 ปี บทความทุกชิ้นเขียนจากประสบการณ์จริงในวงการ IT ประเทศไทย
สมัยผมทำร้านเน็ตฯ ชื่อเครื่องลูกข่ายยังต้องตั้งให้ดีเลยครับ Branch ก็เหมือนกัน ตั้งชื่อให้คนอื่นเข้าใจได้ง่ายว่า Branch นี้ทำอะไร เช่น feature/add-login, bugfix/resolve-payment-error จะช่วยให้ทีมทำงานง่ายขึ้นเยอะ
Commit message สำคัญมากครับ! คิดซะว่าเราเขียน comment ใน code เลย สมัยก่อนผมเคยเจอ code ที่ไม่มี comment อ่านแทบตายกว่าจะเข้าใจ Commit message ที่ดีควรบอกว่า "ทำอะไร" และ "ทำไม" ลองใช้ convention อย่าง Conventional Commits ดูครับ
อย่าขี้เกียจ review code! สมัยก่อนผมเคยพลาด deploy code ที่มี bug เพราะไม่ได้ review ให้ดี Merge request/Pull request คือโอกาสทองที่จะจับ bug ก่อนขึ้น production ให้เพื่อนร่วมทีมช่วยกันดู code ก่อนเสมอ
สร้าง Branch ใหม่บ่อยๆ ไม่ใช่เรื่องผิด! Branch เล็กๆ จะทำให้แก้ปัญหาได้ง่ายกว่า เวลาเจอ bug ก็ไม่ต้องกลัวว่าจะกระทบ code ส่วนอื่น คิดซะว่ามันคือ safe zone ของเรา
เลือก Strategy ที่เหมาะกับทีมครับ ไม่มีอะไรตายตัว Git Flow เหมาะกับ project ที่มีการ release เป็นรอบๆ GitHub Flow เหมาะกับ project ที่ deploy บ่อยๆ ถ้าไม่แน่ใจ ลองเริ่มจาก GitHub Flow ก่อนก็ได้ครับ
Merge บ่อยๆ ดีกว่านานๆ ทีครับ การ Merge บ่อยๆ จะช่วยลดโอกาสเกิด conflict และทำให้ code ของเรา update อยู่เสมอ สมัยผมทำร้านเน็ตฯ update patch เกมบ่อยๆ ยังต้อง backup ข้อมูลก่อนเลย
ลบทิ้งไปเลยครับ! Branch เก่าๆ ที่ไม่ได้ใช้แล้วก็เหมือนขยะในบ้านรกเปล่าๆ ลบ Branch ที่ Merge ไปแล้วออกจาก remote repository ด้วยนะครับ
อันนี้แล้วแต่ความชอบส่วนตัวครับ Rebase จะทำให้ history ของ commit ดูสะอาดตา แต่ Merge จะเก็บ history ของการ Merge ไว้ ถ้าทำงานคนเดียว Rebase ก็ไม่เสียหาย แต่ถ้าทำงานเป็นทีม Merge อาจจะปลอดภัยกว่า
Feature Flags คือตัวช่วยที่ดีในการ release feature ใหม่ๆ โดยที่ไม่ต้อง deploy code ทั้งหมดพร้อมกัน ลองศึกษาเรื่อง Feature Toggles ดูครับ มีประโยชน์มาก
Git Branch Strategy เป็นเรื่องสำคัญที่ช่วยให้ทีมทำงานร่วมกันได้อย่างมีประสิทธิภาพ เลือก Strategy ที่เหมาะกับทีม อย่ากลัวที่จะทดลอง และอย่าลืมที่จะ review code กันเสมอ ถ้าอยากรู้เรื่อง DevOps สำหรับ FinTech หรืออ่านบทความอื่นๆ ลองดูที่ SiamCafe Blog ได้เลยครับ