- Shopify đã tuyên bố React Native (RN) là tương lai của phát triển di động từ 5 năm trước, và sau đó đã chuyển đổi thành công tất cả ứng dụng sang RN
- Những lý do chính để áp dụng React Native
- Viết một lần, hỗ trợ hai nền tảng: nhằm loại bỏ sự kém hiệu quả khi phải phát triển cùng một tính năng hai lần trên iOS và Android
- Tăng tính linh hoạt của nhân sự: hỗ trợ các lập trình viên có thể tự do luân chuyển công việc giữa iOS, Android và Web
- Mang lại nhiều giá trị hơn: giảm thời gian cần thiết để đạt được sự tương đương tính năng và chuyển nhiều giá trị hơn tới người dùng
- Kết quả thành công của quá trình chuyển đổi
- Năng suất được cải thiện đáng kể nhờ không phải phát triển cùng một tính năng hai lần
- Các kỹ sư có thể làm cả web lẫn mobile, giúp cùng một lực lượng nhân sự thực hiện được nhiều việc hơn và tạo ra cơ hội tăng trưởng mới
- Việc duy trì sự tương đương tính năng giữa iOS và Android აღარ còn là vấn đề, nhờ đó có thể mang lại nhiều giá trị hơn
- Thời gian tải màn hình của ứng dụng nhanh dưới 500ms, và hơn 99,9% phiên hoạt động được duy trì ổn định
- Tiếp tục sử dụng native code cho những phần việc phù hợp nhất, qua đó tận dụng được ưu điểm của cả hai thế giới
Những bài học chính
Ứng dụng React Native rất nhanh
- Shopify rất coi trọng hiệu năng, và CEO Tobi Lutke nhấn mạnh rằng: "Không phải mọi phần mềm nhanh đều tuyệt vời, nhưng mọi phần mềm tuyệt vời đều nhanh"
- Trước khi chuyển sang React Native (RN), câu hỏi lớn nhất là liệu RN có thể đáp ứng được mục tiêu hiệu năng hay không
- Vì vậy, trước khi đưa ra quyết định chuyển đổi, họ đã xác minh khả năng này thông qua quá trình tạo nguyên mẫu rộng rãi
- Xem xét các công việc Meta đang thực hiện để loại bỏ nút thắt hiệu năng, đồng thời xác định những khu vực như list mà họ có thể đóng góp
- Quyết định áp dụng toàn diện RN với nhận định rằng RN sẽ sớm nhanh hơn nữa
- Sau 5 năm, các ứng dụng RN hoạt động nhanh và đã đạt thời gian tải màn hình dưới 500ms (P75) trong ứng dụng Shopify
- Những mục tiêu hiệu năng tương tự cũng đã được đạt thành công ở tất cả các ứng dụng khác
- Việc áp dụng các pattern và kỹ thuật tốt để loại bỏ bottleneck hiệu năng là điều bắt buộc
- Không phải lúc nào native cũng nhanh hơn, và RN cũng không phải lúc nào cũng chậm
- RN đã tiến bộ rất nhiều trong vài năm qua và đã trở thành một nền tảng có thể xây dựng các ứng dụng đẳng cấp thế giới
- Khi framework RN ngày càng trưởng thành, việc phát triển ứng dụng nhanh sẽ ngày càng dễ hơn
- Khi chuyên môn của đội ngũ tăng lên, dư địa để tạo ra ứng dụng tốt hơn cũng sẽ mở rộng
Lợi ích của hot reloading
- Hot reloading của React Native (RN) là một tính năng mang tính cách mạng cho môi trường phát triển, cho phép thay đổi được phản ánh ngay lập tức
- Một trong những vấn đề lớn nhất của phát triển native là ngay cả thay đổi nhỏ cũng có thể mất vài phút để biên dịch và chạy trên emulator hoặc thiết bị thật, tùy theo kích thước codebase
- Điều này gây lãng phí thời gian và làm gián đoạn luồng làm việc của lập trình viên
- Hot reloading của RN giải quyết triệt để vấn đề này, giúp cải thiện mạnh mẽ năng suất và trải nghiệm phát triển
Typescript giúp tăng tính linh hoạt của nhân sự
- Khi Typescript trở nên phổ biến rộng rãi, việc di chuyển lập trình viên giữa React Web và React Native (RN) cũng trở nên thuận lợi
- Lập trình viên web: có thể bắt đầu làm mobile thông qua RN dễ hơn nhiều so với phát triển native iOS và Android
- Lập trình viên mobile: có thể dễ dàng tham gia công việc web thông qua RN
- Lợi ích của tính linh hoạt nhân sự
- Mang lại nhiều cơ hội phát triển hơn cho kỹ sư, đồng thời tăng tính linh hoạt trong phân bổ nhân lực
- Tăng cường năng lực để cùng một đội ngũ phát triển có thể xử lý nhiều việc hơn
- Tạo ra hiệu quả và năng suất cao hơn thông qua chia sẻ code giữa web và mobile
- Những lập trình viên có thể làm việc trên nhiều nền tảng giúp ra mắt sản phẩm nhanh hơn, đồng thời có thể trao đổi ý tưởng giữa các công nghệ và áp dụng chúng theo cách mới
- Điều này hình thành một văn hóa coi công nghệ là công cụ, mở rộng góc nhìn của đội ngũ và khuyến khích chọn công cụ phù hợp nhất cho công việc
Lập trình viên native là thiết yếu
- Các kỹ sư mobile chuyên sâu về iOS và Android là yếu tố thiết yếu để xây dựng những ứng dụng mobile xuất sắc
- Kinh nghiệm tích lũy qua quá trình phát triển nhiều sản phẩm mobile, cùng hiểu biết sâu về tính khả dụng và các quy ước nền tảng, là điều không thể thay thế
- Những công việc như truy cập lớp nền tảng, viết binding, làm chủ build và deploy, cũng như quản lý cập nhật phiên bản React Native đều đòi hỏi chuyên môn native
- Lập trình viên native là nhân tố thiết yếu để tối ưu hiệu năng ứng dụng trên nhiều mẫu thiết bị và mang lại trải nghiệm nhất quán cho mọi người dùng
- Họ cũng là nhân tố quan trọng để theo kịp các tính năng mới, API mới, thay đổi về tooling của iOS và Android, cũng như quản lý cập nhật phiên bản React Native
- Phát triển chương trình đào tạo React Native cho lập trình viên mobile native:
- Được thiết kế theo hình thức tự học để hỗ trợ viết code đạt chất lượng production
- Hỗ trợ bổ sung thông qua các phiên Q&A, pair programming và code review với những lập trình viên thành thạo React Native
- Bổ sung thêm lập trình viên web (chuyên gia JavaScript, TypeScript, React) vào các đội mobile:
- Tạo ra sự cân bằng tốt giữa chuyên môn native và React Native
- Theo thời gian, trình độ kỹ thuật của toàn đội được nâng cao
- Một đội ngũ kết hợp hài hòa giữa lập trình viên native và web là chìa khóa để xây dựng ứng dụng mobile xuất sắc với React Native
Native code là thiết yếu
- Không nên theo đuổi 100% React Native: RN là công cụ hiệu quả giúp chỉ cần phát triển tính năng một lần, nhưng không phải công nghệ phù hợp cho mọi tình huống
- Những trường hợp cần native code
- Phát triển tính năng tiên tiến: các tính năng tận dụng phần cứng như quét 2D/3D và chạy mô hình AI on-device
- Tính năng bị giới hạn bộ nhớ: widget màn hình chính và màn hình khóa, ứng dụng và complication cho Apple Watch, App Intents, Siri Shortcuts
- Các tác vụ nền chạy dài hạn:
- Ví dụ: ứng dụng Point of Sale của Shopify tải xuống và đồng bộ lượng dữ liệu lớn trong nền để vẫn có thể xử lý giao dịch ngay cả khi offline
- Được thiết kế để offload hoàn toàn các tác vụ nền bằng native code, nhằm không ảnh hưởng tới hiệu năng ứng dụng
- RN phù hợp để phát triển hầu hết tính năng chỉ một lần, nhưng ở những lĩnh vực native hoạt động tốt nhất thì lý tưởng nhất là dùng native code
- Khả năng tương tác mạnh mẽ với native mà RN cung cấp sẵn giúp việc kết hợp hai công nghệ này trở nên dễ dàng
- Điều quan trọng là nhìn nhận mối quan hệ này không phải là RN hoặc native, mà là RN và native
- Việc xây dựng đội ngũ có chuyên môn native là yếu tố thiết yếu để hiện thực hóa sự kết hợp này một cách hiệu quả
Khó khăn trong debug
- Việc debug React Native (RN) có những mặt chưa ổn định và cần thêm công sức để cấu hình đúng trong VSCode
- iOS và Android mặc định cung cấp các tính năng debug mạnh mẽ và ổn định
- Gần đây Meta đã viết lại hoàn toàn debugger stack của RN để cải thiện, và debugger mới đang cho thấy kết quả đầy hứa hẹn
- Shopify đang hợp tác với Meta để đưa môi trường debug của RN lên đẳng cấp thế giới
Cập nhật React Native không liền mạch
- Việc cập nhật ứng dụng lên phiên bản mới của React Native (RN) đòi hỏi rất nhiều công sức, và thường yêu cầu tái cấu trúc codebase
- Để giải quyết điều này, Shopify đã tổ chức một nhóm lập trình viên luân phiên quy mô nhỏ chuyên phụ trách công việc cập nhật, để các đội còn lại tập trung vào phát triển tính năng
- Khi framework RN ngày càng trưởng thành, quy trình cập nhật được kỳ vọng sẽ ngày càng dễ hơn
- Khi New Architecture được áp dụng rộng rãi hơn, độ phức tạp của công việc liên quan đến cập nhật được kỳ vọng sẽ giảm
Phụ thuộc nhiều hơn vào thư viện bên thứ ba
- Framework React Native (RN) không toàn diện bằng native, nên thường dẫn tới việc phải sử dụng nhiều thư viện bên thứ ba hơn
- Khi hệ sinh thái đã trưởng thành trong những năm gần đây, giờ đây có thể dễ dàng tìm được các thư viện được bảo trì tốt cho gần như mọi tính năng cần thiết
- Tuy nhiên, vẫn cần duy trì cập nhật liên tục cho các thư viện bên thứ ba, và bề mặt tấn công chuỗi cung ứng cũng tăng lên
- Shopify đã áp dụng cập nhật phụ thuộc tự động bằng Dependabot
- Thông qua quét mã tự động để phát hiện và ngăn chặn mã độc
- Họ kỳ vọng framework RN sẽ phát triển theo hướng có định hướng rõ ràng hơn và cung cấp sẵn nhiều tính năng hơn theo mặc định
Lợi ích lớn từ việc tận dụng nền tảng dùng chung
- Khi mới bắt đầu áp dụng React Native (RN), họ còn thiếu kinh nghiệm xây dựng ứng dụng mobile bằng RN, đồng thời cũng không thể tận dụng nền tảng dùng chung đã tích lũy từ phát triển native
- Ban đầu, mỗi đội tự giải quyết vấn đề riêng khi phát triển ứng dụng, và cách này hiệu quả để bắt đầu nhanh và di chuyển ứng dụng sang nền tảng mới
- Tuy nhiên, điều đó dẫn tới việc các đội nhiều lần giải quyết lại cùng một vấn đề, tạo ra sự trùng lặp kém hiệu quả
- Họ đã đầu tư thời gian và công sức để xây dựng chuyên môn về RN, đồng thời chủ đích chấp nhận đánh đổi: ưu tiên tốc độ nhưng hy sinh tính nhất quán
- Từ năm 2023, khi tất cả ứng dụng đã trưởng thành, họ bắt đầu tăng cường tính nhất quán
- Trích xuất các thành phần chung như Identity, giám sát thời gian thực, đo lường hiệu năng... thành thư viện dùng chung để mọi ứng dụng cùng sử dụng
- Điều này giúp các đội tận dụng giải pháp sẵn có thay vì phải giải lại những bài toán đã được xử lý
- Trong năm 2025, họ sẽ mở rộng chia sẻ code hơn nữa để
- Lan tỏa kiến thức và chuyên môn giữa các đội
- Mọi ứng dụng tự động được hưởng lợi từ các cải tiến của thành phần dùng chung
- Tiết kiệm nguồn lực kỹ thuật để tập trung vào việc mang lại giá trị cho người dùng
Tương lai của React Native
- Tương lai của React Native (RN) rất sáng sủa, và Meta đang là đơn vị quản lý xuất sắc của dự án này khi liên tục mang tới các cải tiến đều đặn
- Trong mỗi bản phát hành, phản hồi từ lập trình viên đang được phản ánh mạnh mẽ vào roadmap, và việc xây dựng ứng dụng nhanh được kỳ vọng sẽ ngày càng dễ hơn
- Shopify có kế hoạch tiếp tục hỗ trợ sự phát triển của RN thông qua việc áp dụng New Architecture
- Nhiều công ty lớn như Microsoft, Amazon, Tesla, SpaceX, Coinbase đang sử dụng RN, và các thư viện cũng như framework bên thứ ba chất lượng cao vẫn liên tục được phát hành
- Shopify đang đóng góp cho web mở, mã nguồn mở, tiêu chuẩn mở thông qua những hoạt động như sau
- Đóng góp code cho RN
- Đảm nhận vai trò đồng release captain cho các bản phát hành RN
- Tài trợ cho các dự án mã nguồn mở có tác động lớn như React Native Skia, Reanimated
- Công bố các dự án mã nguồn mở như Flashlist, Restyle, Tophat
- Ngoài ra, trong năm 2025 họ cũng khởi động lại React Native Working Group
- Mục tiêu là tập hợp các lãnh đạo chủ chốt từ những tổ chức đang hỗ trợ RN để xác định các thách thức lớn của hệ sinh thái, đặt ưu tiên đầu tư, thúc đẩy hợp tác và giảm công việc trùng lặp
- Các công ty từng tham gia trước đây: Meta, Twitter, Coinbase, Microsoft...
- Nếu muốn tham gia, hãy liên hệ
- RN đã có những bước tiến lớn trong 5 năm qua, và nhiều hạn chế từng khiến người ta ngần ngại áp dụng nay đã biến mất
- Nếu đã lâu bạn chưa dùng RN, thì đây là thời điểm tốt để thử lại RN
9 bình luận
Chúng tôi cũng đã áp dụng RN vào thời điểm tương tự vì những lý do tương tự và đang dùng khá tốt.
Vấn đề hiệu năng thì tôi hơi khó đồng cảm, nhưng có lẽ đó là vấn đề cần được giải quyết ở cấp độ
react-dom.Có thể làm được nhiều việc với ít người có lẽ là ưu điểm lớn nhất.
Mình khá tò mò không biết có những tính năng native nào mà Native API của RN không thể bao quát được.
Đây là một chia sẻ rất ấn tượng. Hiện tại tôi đang dùng Kotlin trong công việc để phát triển ứng dụng Android, và đôi khi cũng tự hỏi: có nhất thiết phải đi theo hướng native không...? (Trường hợp của tôi thì vì có những phần phải làm việc rất chặt với nền tảng nên bất đắc dĩ phải chọn native.) Nếu có thể, có lẽ đi theo hướng được hỗ trợ đa nền tảng như React Native hay Flutter cũng là một lựa chọn tốt.
Shopify thật tuyệt vời @.@
"100% React Native nên là một mục tiêu cần tránh. Nó rất tuyệt để xây dựng tính năng chỉ một lần, nhưng không phải là công nghệ phù hợp cho mọi thứ."
"Thay vì nghĩ native hay React Native, hãy nghĩ native và React Native."
Trong kỹ thuật thì không có gì là 100% cả (cẩn thận với kiểu giật tít "A luôn tốt hơn").
Mỗi bên đều có ưu và nhược điểm riêng, và sẽ có công cụ phù hợp với từng tình huống.
Đây cũng là một bài viết rất hay vì có thể thấy được triết lý xây dựng đội ngũ của Shopify.
Dù vậy thì tôi vẫn sẽ ca ngợi Flutter.
Chuyển toàn bộ ứng dụng sang RN... đỉnh thật đấy, ghê thật
@shopify/flash-listcực kỳ ngon. Cảm ơn nhé, Shopify.Shopify cũng đang đóng vai trò cốt lõi trong hệ sinh thái Ruby on Rails,
và dường như cũng thể hiện bước tiến đáng kinh ngạc trong hệ sinh thái RN. Đúng là một công ty tuyệt vời.