เทคโนโลยีและการพัฒนาอัปเกรดแอป React Native เวอร์ชันเก่า ต้องทำอะไรบ้าง บทเรียนจากงานจริง
แอป React Native รุ่นเก่าเริ่มมีปัญหาบน Android ใหม่ และแก้ต่อยากขึ้นทุกปี เล่างานอัปเกรดแอปองค์กรจริงจาก 0.64 เป็น 0.82 ว่าเปลี่ยนอะไร แก้อะไร และทดสอบยังไง
คำตอบสั้นที่สุดคือ ให้เลือกตามทีมที่จะดูแลแอปต่อ ถ้าทีมเขียน JavaScript หรือ TypeScript อยู่แล้ว React Native มักคุ้มที่สุด แต่มีงานบางแบบที่ควรยอมเลือกต่างจากความถนัด เราทำแอปมาทั้งสองแบบ ทั้งแอป React Native ที่ใช้งานจริงในองค์กร และแอปร้านค้าออนไลน์ PetPaw ที่เขียนด้วย Flutter ทั้งที่ทีมถนัด React Native มากกว่า บทความนี้เล่าว่าเราใช้เกณฑ์อะไรตัดสิน
เขียนแยกสองชุด ใช้ Swift สำหรับ iOS และ Kotlin สำหรับ Android ได้ความสามารถของเครื่องครบทุกอย่างทันทีที่ Apple หรือ Google ปล่อยออกมา แต่ต้องมีสองทีมหรือทีมที่เก่งทั้งสองภาษา ทุกฟีเจอร์ต้องทำสองรอบ และต้องทดสอบสองรอบ
เขียนด้วย JavaScript หรือ TypeScript และแนวคิดแบบ React ชุดเดียวแล้วได้ทั้ง iOS และ Android ตัวแอปใช้ component จริงของระบบปฏิบัติการ หน้าตาจึงกลมกลืนกับเครื่อง จุดแข็งที่ใหญ่ที่สุดคือใช้ภาษาเดียวกับเว็บและหลังบ้านได้ ทีมที่ทำเว็บด้วย React อยู่แล้วเริ่มได้เร็ว
เขียนด้วยภาษา Dart ชุดเดียวแล้วได้ทั้งสองระบบเหมือนกัน แต่ต่างตรงที่ Flutter วาดหน้าจอเองทุกพิกเซลด้วย engine ของตัวเอง ไม่ได้ยืม component ของระบบ หน้าตาจึงเหมือนกันทุกเครื่อง และคุมการแสดงผลได้ละเอียด แลกกับการที่ทีมต้องเรียน Dart ซึ่งแทบไม่มีใครใช้นอกจาก Flutter
แอปไม่ได้จบวันที่ขึ้น Store ต้องแก้บั๊ก เพิ่มฟีเจอร์ และอัปเกรดตามรอบของ iOS กับ Android ไปอีกหลายปี ค่าใช้จ่ายส่วนนี้รวมกันมักมากกว่าค่าทำครั้งแรก เทคโนโลยีที่ทีมถนัดจึงสำคัญกว่าเทคโนโลยีที่ดูดีที่สุดบนกระดาษ
แอป PetPaw เป็นตัวอย่างที่เราเลือกสวนหลักของตัวเอง หลังบ้านของ PetPaw เป็น Node.js และระบบจัดการร้านเป็น React ทีมเราถนัด React Native มากกว่า แต่ตัวแอปลูกค้าเลือก Flutter เพราะงานหลักของแอปคือการเลื่อนดูการ์ดสินค้าจำนวนมากที่มีรูปทุกใบ
แอปที่ขายของผ่านหน้าจอ ความลื่นของหน้ารายการสินค้าคือยอดขายโดยตรง เราจึงยอมจ่ายค่าเปลี่ยนภาษาของทีมเพื่อสิ่งนี้ ตอนนี้แอปมีทั้งบน App Store และ Google Play มี 21 ฟีเจอร์หลักตั้งแต่ตะกร้าข้ามร้าน ชำระเงิน ติดตามพัสดุ ไปจนถึงคืนสินค้า และมีไฟล์เทสต์อัตโนมัติกว่า 170 ไฟล์คุมไว้
กลับกัน แอปที่เป็นฟอร์ม รายการงาน และหน้ารายละเอียดเป็นหลัก เช่น แอปช่างภาคสนามหรือแอปอนุมัติเอกสาร ความต่างด้านการแสดงผลแทบไม่มีผล ข้อได้เปรียบเรื่องทีมของ React Native จึงชนะขาด
แอปธุรกิจส่วนใหญ่ไม่เข้าข้อไหนเลย และถ้าเข้าแค่ฟีเจอร์เดียว ทั้ง React Native และ Flutter ก็เขียนส่วนนั้นเป็น Native แยกแล้วเรียกใช้ได้ ไม่จำเป็นต้องทำทั้งแอปเป็น Native
ไม่ว่าจะเลือกทางไหน แอปต้องอัปเกรดตามรอบของระบบปฏิบัติการทุกปี Android ขยับเกณฑ์ target API และ Apple ขยับเวอร์ชัน Xcode ที่ใช้ส่งแอปขึ้น Store สิ่งที่ต่างกันคือความเสี่ยงที่มาจาก library ภายนอก
React Native และ Flutter พึ่ง library จากชุมชนสำหรับงานอย่างกล้อง แผนที่ และจัดการไฟล์ library ที่คนดูแลเลิกทำคือต้นทุนก้อนใหญ่ที่สุดตอนอัปเกรด เราเจอเรื่องนี้เต็ม ๆ ตอนยกแอป React Native ที่ค้างมาสี่ปีขึ้นเวอร์ชันใหม่ ซึ่งต้องเปลี่ยน library หลายตัวและรื้อระบบเปลี่ยนหน้าจอทั้งแอป วิธีลดความเสี่ยงคือเลือก library ที่ยังมีคนดูแลอย่างสม่ำเสมอตั้งแต่แรก และอัปเกรดทีละปี ไม่ปล่อยให้ค้าง
ถ้าตอบข้อแรกได้ชัด ส่วนใหญ่ก็ได้คำตอบแล้ว อีกสี่ข้อมีไว้หาเหตุผลที่หนักพอจะเลือกต่างจากความถนัดของทีม ถ้าหาไม่เจอ ก็เลือกตามทีม
เล่าโจทย์มาคร่าว ๆ ได้เลย เราตีกรอบงบและระยะเวลาให้ฟรีตั้งแต่คุยครั้งแรก