ทีมพัฒนาของ Digitalocean นั้นได้ออกมาเล่าถึงประสบการณ์การพัฒนาระบบงานด้วยภาษา Go
ซึ่งเป็นระบบงานภายในชื่อว่า Cthulhu
โดยเป็นระบบงานที่ใช้งาน version control แบบ Monorepo
นั่นคือ code ทุกสิ่งอย่างอยู่ใน repository เดียวกัน
แม้ว่าจะมีมากกว่า 1 project ก็รวมกันอยู่ในนี้
แน่นอนว่า ต้องเจอปัญหาต่าง ๆ มากมาย
ทั้งเรื่องของโครงสร้าง ทั้งเรื่องการ scale ทั้งเรื่องของการจัดการ dependency ต่าง ๆ ทั้งเรื่องของเครื่องมือที่ใช้งาน ทั้งเครื่องของเวลาในการ build ของ CI server ทั้งเรื่อง code ownershipมาดูกันว่าทางทีม Digitalocean ทำอย่างไรบ้าง ? น่าสนใจมาก ๆ
สถิติต่าง ๆ ของ repository
28,639 commits 824 branches 142 contributors 830,434 lines of DigitalOcean-authored Go code 2,136,373 lines of vendored Go code โครงสร้างของ repository ของระบบเป็นดังรูป คำอธิบาย- GOPATH คือ cthulhu/decode
- do จะเป็น prefix ของ code ทุก ๆ อย่าง ซึ่งเป็น internal code ทั้งหมด
- โดยที่ folder ใน do/ ก็จะแยกตามหน้าที่การทำงานไป
- doge ย่อมาจาก DigitalOcean Go Environment เก็บ standard library ซึ่งใช้งานจากทุก ๆ service เช่น logging, metric และ RPC เป็นต้น
- exp หรือ Experiment code เป็น code สำหรับการทดลองเรื่องต่าง ๆ
- services แยกตาม service ของ DigitalOcean แต่ทำให้เกิดปัญหาว่าทีมไหนดูแล ดังนั้นจึงเปลี่ยนไปใช้ folder teams แทน
- teams ทำการเก็บแต่ละงานแต่ละ service ของทีมไปเลย แต่ก็ยังมีปัญหาคือ แต่ละทีมไม่ sync กัน ทำให้โครงสร้างภายในแต่ละงานแตกต่างกัน
- tools ทำการเก็บเครื่องมือต่าง ๆ ที่ใช้แบบเฉพาะงานไปเช่น CI/CD tool, static code analysis เป็นต้น
- vendor สำหรับ 3-party library ที่ใช้ข้ามทีมหรือ service/project ซึ่งในโครงสร้างของ project แบบนี้ Go Vendor ไม่สนับสนุนนะ เพราะว่าทำได้เพียง vendor ที่ root project เท่านั้น แต่สิ่งที่ต้องการคือใน sub folder ดังนั้นจึงต้องทำเองใช้เอง
- scripts เก็บ shell script ต่าง ๆ ที่ใช้งานใน CI/CD server หรือในกระบวนการ build เช่น compile, static analysis, testing และสร้าง binary สำหรับ deploy เป็นต้น