Hành trình áp dụng React Native của Coinbase
(blog.coinbase.com)Gần đây, một lập trình viên Coinbase đã chia sẻ trên Twitter rằng ứng dụng Coinbase mới được viết bằng RN, và điều này đã tạo ra một chút chú ý (https://twitter.com/htormey/status/1392161714250993667). Giờ thì nội dung chi tiết hơn về việc đó đã được chia sẻ qua một bài viết trên Medium. Theo chuỗi tweet liên quan, tuy vẫn có một số mô-đun native, nhưng khoảng 97% codebase của ứng dụng là TypeScript.
Dưới đây là bản tóm lược nội dung bài gốc:
-
Di chuyển sang RN trong bối cảnh đã có sẵn ứng dụng native cho iOS và Android. Trong quá trình migration, họ phải triển khai lại một ứng dụng native rất lớn với hơn 200 màn hình, đồng thời còn tổ chức các khóa học RN nội bộ cho hơn 30 kỹ sư native hiện có để hỗ trợ chuyển đổi.
-
Sau rất nhiều nỗ lực, so với thời kỳ native, các chỉ số chính như hiệu năng, chỉ số kinh doanh, điểm đánh giá ứng dụng, tỷ lệ người dùng không bị crash trong 7 ngày, thời gian Cold Start, thời gian chuyển tab... đều được giữ nguyên hoặc cải thiện.
-
Ứng dụng đầu tiên được phát hành vào năm 2013, và đến khoảng năm 2017, mỗi bên Android/iOS đều chỉ có một đội nhỏ. Việc tuyển dụng khó hơn rất nhiều so với lập trình viên web, và họ cảm thấy năng suất do tốc độ phát triển của công nghệ nền tảng web mang lại là điều mà công nghệ nền tảng native không theo kịp. Sau vài lần thử không thành công, đến năm 2018, nhu cầu cải thiện tốc độ lặp và tốc độ tăng trưởng của nền tảng mobile đã trở nên quá rõ ràng.
-
Coinbase quyết định suy nghĩ lại từ gốc cách họ xây dựng sản phẩm. Với các tính năng chính, mô hình tổ chức theo chức năng khiến mỗi đội có 2 backend + 2 client cho từng nền tảng (Web, Android, iOS), nên cần quá nhiều nhân lực chỉ để làm một vertical. Họ bắt đầu nghĩ đến việc giảm số lượng lập trình viên tối thiểu của một đội tính năng từ 8 xuống còn khoảng 5 người, và liệu các lập trình viên client có thể bao quát nhiều nền tảng hay không.
-
Từ đó, họ kỳ vọng yêu cầu tối thiểu để lập đội sẽ được nới lỏng, việc phát triển sẽ hiệu quả hơn, và sự giao thoa giữa các lập trình viên client cũng tăng lên. Dĩ nhiên, chỉ hiệu quả thôi là chưa đủ; họ cho rằng để khoản đầu tư này là hợp lý thì hiệu năng và chất lượng mà khách hàng cảm nhận được trong quá trình đó cũng phải được cải thiện.
-
Khi đó, họ đã có sẵn một đội web platform khá trưởng thành dựa trên React. Sau khi xem xét nhiều lựa chọn cross-platform, họ chọn RN vì nó dựa trên công nghệ quen thuộc đang dùng, đồng thời con đường hợp nhất web và mobile cũng có vẻ rõ ràng. Vì còn phải migration cả ứng dụng native đang chạy, họ đã dành vài tháng cho giai đoạn đánh giá kỹ thuật trước và xây dựng chiến lược để bảo đảm quá trình chuyển đổi diễn ra dần dần, ít xáo trộn.
-
Trước tiên, họ cho rằng nên bắt đầu từ một greenfield không cần sự kết nối giữa RN và native. Trong Coinbase cũng có một sản phẩm web tên là Pro, khi đó chưa có bản mobile, nhưng lại có nhiều tính năng phức tạp và nhạy cảm với hiệu năng như biểu đồ giá thời gian thực hay depth chart, nên họ quyết định làm ứng dụng cho Pro trước. Họ giả định rằng nếu có thể xây dựng tốt Pro bằng RN, thì các tính năng còn lại (ít phức tạp hơn và đòi hỏi hiệu năng thấp hơn) cũng sẽ có thể chuyển sang thuận lợi.
-
Tiếp theo, họ triển khai flow onboarding được chia sẻ giữa Pro và ứng dụng hiện có bằng RN rồi gắn nó vào ứng dụng native hiện tại. Vì phục vụ nhiều khu vực khác nhau, phần onboarding là một trong những phần phức tạp nhất của ứng dụng và trước đây rất khó đụng vào. Họ kỳ vọng việc làm lại phần này cho Pro cũng sẽ đồng thời hỗ trợ refactor ứng dụng cũ.
-
Cuối cùng, dựa trên kinh nghiệm và kiến thức thu được từ hai bước trên, họ viết lại ứng dụng native hiện có bằng RN. Ở thời điểm lập kế hoạch, họ vẫn chưa chắc đó sẽ là một full rewrite hay là cách tiếp cận tăng dần tỷ trọng RN trong ứng dụng native, và quyết định sẽ dựa trên kết quả của hai giai đoạn trước.
-
Sau khi xây dựng chiến lược, họ ra mắt ứng dụng mobile Pro vào tháng 10/2019, và kết quả vượt kỳ vọng. Thành quả kinh doanh tốt, họ học được các điểm dễ phát sinh vấn đề hiệu năng và cách giải quyết, rất hài lòng với năng suất mà RN mang lại, đồng thời cũng xác nhận rằng kỹ sư web có thể đạt năng suất trên RN trong thời gian ngắn.
-
Được khích lệ, họ tiếp tục bắt tay vào việc viết lại flow onboarding, và tương tự, cả mục tiêu kinh doanh lẫn chất lượng ứng dụng đều đạt được.
Kết quả tự thân của việc viết lại flow onboarding là tốt, nhưng họ nhận ra việc gắn RN vào ứng dụng hiện có là rất khó.
So với việc chỉ làm web hoặc chỉ làm native, năng suất cũng không tốt, nên ở cả hai phía đều xuất hiện những kỹ sư nghĩ rằng “nếu thế này thì dùng RN để làm gì”. (Rất giống với trường hợp của Airbnb, và thực tế họ cũng học được nhiều khi trao đổi với các kỹ sư Airbnb.)
-
Kết quả là từ những bài học trên, họ kết luận rằng cách tiếp cận brownfield mang native và RN cùng tồn tại là nguồn gốc của mọi vấn đề, và quyết định viết lại toàn bộ ứng dụng hiện có bằng RN.
-
Trong hai nền tảng, họ đánh giá migration ứng dụng Android sẽ khó hơn về hiệu năng, performance và năng suất, nên chọn Android làm mục tiêu viết lại trước. Từ kinh nghiệm trước đó, họ ước tính full rewrite sẽ mất khoảng 6 tháng, nhưng cho rằng lợi ích thu được sẽ lớn hơn chi phí bỏ ra.
-
Họ bắt đầu viết lại ứng dụng Android vào tháng 3/2020 và thực tế cũng mất khoảng 6 tháng. Sau đó, việc viết lại iOS tiếp nối cũng hoàn thành vào tháng 1/2021. Trên cả hai nền tảng, các chỉ số cốt lõi đều cho kết quả tốt.
-
Vào giữa năm 2020, Coinbase có 18 kỹ sư iOS và 7 kỹ sư Android. Tính đến tháng 5/2021, repository RN của Coinbase đã có 113 contributor, trong đó có nhiều kỹ sư web trước đây không thể đóng góp cho mobile.
-
Việc đào tạo để chuyển các kỹ sư native thành kỹ sư RN diễn ra khá trơn tru, và những kỹ sư có nền tảng native hiện đang đạt hiệu quả cao với ứng dụng RN. Dù vẫn chưa hoàn hảo, nhưng đúng như kỳ vọng ban đầu, ở các tổ chức theo chức năng, mô hình một “đội client” bao phủ toàn bộ các nền tảng client đang dần thành hình.
-
Ba nền tảng trước đây (React, iOS, Android) giờ đã thành hai (React, RN), nhưng bước tiếp theo là họ muốn giảm xuống còn 1,5. Họ đang lên kế hoạch chia sẻ giữa web và RN các thành phần như design system, data layer dùng chung dựa trên GraphQL, và tooling ở mức hạ tầng. Bức tranh họ hướng tới là một kỹ sư có thể phát hành tính năng trên mọi nền tảng web và mobile chỉ với mức context switching tối thiểu.
-
Trong thời gian tới, họ dự định sẽ chia sẻ thêm nhiều bài viết liên quan đến RN, bao gồm các khó khăn kỹ thuật và kinh nghiệm thu được trong quá trình này.
2 bình luận
Làm tôi nhớ đến bài chia sẻ về việc Laftel áp dụng RN.
https://ridicorp.com/story/react-native-1year-review/
Có vẻ đây là một bài viết sẽ rất hữu ích cho cả các công ty trong nước nữa. Cảm ơn bạn vì bản dịch tóm tắt!