
จากบทความเรื่อง Migrating 3.7 Million Lines of Flow Code to TypeScript
โดยทีมของ Pinterest ทำการเปลี่ยน code ของระบบ
จาก Flow มาเป็น TypeScript ภายใน 8 เดือน
ซึ่งช่วยให้ code ดีขึ้น
ทั้ง performance
ทั้งเรื่องของ type safty
และที่สำคัญคือ การหาคนหรือจ้างคนมาพัฒนาที่ง่ายขึ้น
มาดูกันว่า ทีมของ Pinterest มีแนวคิดและแนวทางในการย้ายอย่างไรบ้าง ?
ทีมจะใช้ Codemod Stripe ในการ migrate มาเป็น TypeScript
ซึ่งทีมได้เปิด PR เข้าไปเพิ่มด้วย
ทุกอย่างมันเริ่มจากปัญหาเสมอ ?
ในปี 2016 ทางทีมทำการเพิ่ม type เข้าไปยัง code ของระบบที่พัฒนาด้วย JavaScript
ซึ่งเลือก Flow มาใช้งาน ด้วยเหตุผลกังนี้
- ง่ายต่อการพัฒนาแบบ incremental สามารถเพิ่ม type แบบ file-by-file ได้
- ทำงานร่วมกับ ReactJS ได้ดี
แต่ในปี 2023 นั้น TypeScript นั้นเป็นที่นิยม และ เข้ามาเป็น standard ของ type checking
ซึ่ง trend การนำไปใช้งานสูงอย่างมาก ๆ
ส่วน Flow นั้นไม่มีการใช้งานเท่าไร !!
ดังนั้น ทีมจึงตัดสินใจนำ TypeScript มาใช้งาน
แต่ก็ได้ทำการทดลองหรือ PoC ก่อน
มีเครื่องมือในการ migrate จาก Flow เป็น TypeScript
ส่วนอื่น ๆ ที่เพิ่มความมั่นใจในการย้าย คือ
- Community ที่ใหญ่ และ active
- ความสามารถของภาษาที่ดี เช่น conditional type, non-null assertion เป็นต้น
- หานักพัฒนาที่เก่ง ๆ ได้ง่ายขึ้น
ขั้นตอนการ migrate เป็นดังนี้
จากการศึกษาของทางทีมพบว่า
มีทั้ง Zapier, Airtable และ Stripe ที่ทำการ migrate ไปยัง TypeScript แล้ว
ซึ่งทำการ migrate แบบ bigbang หรือทั้งหมดด้วย Codemod
มีขั้นตอนดังนี้
- ทำการ setup TypeScript และ Lint
- ทำการ config VSCode เพื่อสนับสนุน TypeScript ให้ดีขึ้น
- ทำการแปลง code จาก Flow ไปยัง TypeScript
- รวมทั้งทำการ generate type ของ dependency ต่าง ๆ ด้วย
- ในการใช้ codemod ยังมีข้อผิดหลาด หรือ ไม่ตรงกับความต้องการ ก็ทำการแก้ไขและส่ง patch ไปยัง codemod ด้วย
- ทำการแก้ไข error ต่าง ๆ จาก ESLint
- ทำการ integrate เข้ากับส่วนต่าง ๆ ของระบบ
- และก่อนที่จะทำการ rollout ออกไป ต้องทำการ validation หรือการ test นั่นเอง
- การทดสอบทำตามแนวทางของ Trophy testing
สุดท้ายทำการ rollout ซึ่งก็ต้องระมัดระวังด้วยเช่นกัน
โดยทำ rollout plan ขึ้นมา ว่าจะต้องทำอย่างไรบ้าง
และวางแผนด้วยว่า ถ้ามีปัญหาจะ rollback หรือ จัดการอย่างไรด้วย
เป็นอีกแนวทางที่น่าสนใจ
ลองอ่านรายละเอียดกันเพิ่มเติมดูครับ