Đa Nền Tảng Trong Golang
Dạo gần đây mình đang tìm kiếm và học hỏi thêm về đa nền tảng vì mình cần triển khai một số website và ứng dụng mình lên đa nền tảng và sự hiểu biết thêm về những công nghệ viết lên đa nền tảng và kiến trúc để các công nghệ viết về đa nền tảng với golang.

Huỳnh Nhân Quốc
@huynhnhanquoc
6 phút đọc
04 tháng 12 năm 2024

Câu chuyện khám phá công nghệ đa nền tảng
Tôi bắt đầu đam mê lập trình với C#, và từ đó biết đến Xamarin – công cụ đầu tiên đưa tôi đến khái niệm "cross-platform". Lúc đó, tôi chỉ hiểu đơn giản rằng ứng dụng viết bằng Xamarin có thể chạy trên cả Android và iOS. Tuy nhiên, khi đi sâu hơn, tôi nhận ra rằng Xamarin không phải là giải pháp hoàn hảo. Đặc biệt, việc tích hợp và sử dụng Visual Studio đôi khi trở nên nặng nề và không mấy thoải mái.
Trong thời gian tìm hiểu về lập trình web, tôi nhận thấy Xamarin bị giới hạn – không hỗ trợ xây dựng ứng dụng web. Đây là lúc tôi bắt gặp Ionic, một công cụ mở ra nhiều tiềm năng. Ionic cho phép tôi tạo ra ứng dụng đa nền tảng, nhưng cũng mang theo những hạn chế về giao diện và hiệu năng do phụ thuộc vào WebView. Vì Ionic dựa trên Angular (ở các phiên bản đầu tiên), tôi đã học Angular và kết hợp với Firebase để xây dựng một số ứng dụng. Mặc dù Firebase hoạt động ổn định, chi phí cao và sự cập nhật liên tục của Angular khiến việc duy trì trở nên khó khăn.
Golang và các framework đa nền tảng
Golang là ngôn ngữ tôi yêu thích và đã sử dụng trong nhiều dự án. Tuy nhiên, khi muốn xây dựng ứng dụng di động bằng Golang, tôi nhận ra những hạn chế rõ rệt. Một số framework tôi đã thử nghiệm gồm:
- Fyne: Có thể build đa nền tảng nhưng thiếu hỗ trợ WebView, khiến việc tận dụng các công nghệ web trở nên khó khăn.
- Wails: Hỗ trợ tốt cho Windows, macOS và Linux, nhưng không hỗ trợ di động.
- Gioui: Giao diện hạn chế và không hỗ trợ các tính năng native như quyền truy cập camera.
Những hạn chế này buộc tôi phải tìm đến các nền tảng khác như React Native và Flutter. Dù cả hai đều mạnh mẽ, chúng yêu cầu một đường cong học tập lớn. Tôi từng triển khai dự án kitsend.com qua WebView trên Flutter và React Native, nhưng nhận ra rằng WebView có nhiều giới hạn, đặc biệt khi xử lý các file lớn hoặc giao tiếp blob: trong môi trường peer-to-peer.
Flutter: Khả năng và hạn chế
Flutter, do Google phát triển, cho phép xây dựng ứng dụng đa nền tảng từ một mã nguồn duy nhất. Một số điểm nổi bật của Flutter bao gồm:
- Hiệu năng cao: Flutter vẽ giao diện trực tiếp lên canvas thay vì dựa vào các thành phần UI của nền tảng.
- Cộng đồng mạnh mẽ: Với sự hỗ trợ từ Google, Flutter có hệ sinh thái phong phú và tài liệu chi tiết.
Tuy nhiên, để tận dụng hiệu quả Flutter, bạn cần hiểu sâu về Dart – một ngôn ngữ mới mẻ với nhiều người. Ngoài ra, việc xây dựng cầu nối với các tính năng native đôi khi phức tạp.
React Native: Lựa chọn quen thuộc
React Native, được phát triển bởi Facebook, là framework phổ biến cho ứng dụng di động. Những ưu điểm chính bao gồm:
- Cộng đồng lớn: React Native có một hệ sinh thái mạnh mẽ và nhiều thư viện hỗ trợ.
- Khả năng tái sử dụng mã nguồn: Giảm chi phí phát triển nhờ tái sử dụng phần lớn mã nguồn.
Tuy nhiên, React Native yêu cầu viết thêm bridge code bằng các ngôn ngữ gốc như Java/Kotlin hoặc Objective-C/Swift để tận dụng các tính năng native, làm tăng độ phức tạp.
Lựa chọn của một đường cong học tập
Khi so sánh giữa Flutter và React Native, tôi nhận ra rằng dù cả hai đều giúp phát triển nhanh chóng, nhưng khả năng mở rộng và tái cấu trúc lâu dài lại gặp nhiều rào cản. Nếu lựa chọn các framework của Golang như Fyne, Wails, hoặc Gioui, thì lại tồn tại các hạn chế nghiêm trọng về giao diện và tính năng.
Điều này đưa tôi đến một ý tưởng: tận dụng sức mạnh của web để phát triển đa nền tảng.
Tầm nhìn: Tích hợp web và native với Golang
Tôi đã ấp ủ ý tưởng sử dụng giao diện web kết hợp với các tính năng native qua cầu nối Golang từ khi Progressive Web Apps (PWA) ra đời. PWA là một bước tiến lớn, nhưng vẫn bị hạn chế bởi sự phụ thuộc vào hệ điều hành. Vì vậy, giải pháp của tôi là:
- Xây dựng UI bằng công nghệ web: Sử dụng React JS, Angular, Vue hoặc bất kỳ framework JS ngoài kia kể cả vanilla JS để tạo giao diện nhất quán và dễ bảo trì.
- Kết hợp native bằng Golang: Dùng Go Mobile để tạo cầu nối với các tính năng native như camera, upload/download file.
- Phát triển ứng dụng với tư duy đa nền tảng thực thụ:
- Tận dụng lợi thế của webview để cung cấp giao diện hiện đại.
- Kết hợp khả năng native để giải quyết các vấn đề hiệu năng và truy cập hệ thống.
Góc nhìn về tương lai công nghệ
Trong bối cảnh công nghệ hiện tại, sự phát triển của các công cụ đa nền tảng đang mở ra nhiều cơ hội mới. Dù mỗi công cụ đều có ưu và nhược điểm, tôi tin rằng việc kết hợp linh hoạt giữa web và native sẽ là hướng đi tối ưu. Các framework như Flutter hay React Native sẽ tiếp tục phát triển, nhưng sự xuất hiện của các công cụ mới, đặc biệt những công cụ tận dụng ngôn ngữ mạnh mẽ như Golang, sẽ định hình tương lai của lập trình đa nền tảng.
Một tương lai không giới hạn: Với sự hội tụ của công nghệ web và native, lập trình viên sẽ không còn phải chọn giữa hiệu năng và tính linh hoạt. Thay vào đó, chúng ta có thể hướng tới những giải pháp thực sự tối ưu, nơi sự sáng tạo không còn bị giới hạn bởi nền tảng hay công cụ.
Đối với tôi, hành trình này không chỉ là học hỏi công nghệ, mà còn là việc tìm ra cách tối ưu hóa nguồn lực và tận dụng tối đa những gì tôi đam mê. Và tôi tin rằng, với sự kiên trì và tư duy đúng đắn, mọi rào cản kỹ thuật đều có thể vượt qua.
Mỗi bước đi, dù nhỏ bé, đều là một phần của con đường lớn dẫn tới những hành trình của cuộc đời.
Tận dụng được UI từ website và các thuật toán viết bằng Golang khi sử sử dụng gomobile làm cầu nối.
41
lượt xem
Người viết bài
Bài Viết Liên Quan

Hạnh phúc nhé đêm đông không lạnh nữa.Bình minh lên nhìn biển lúc trời xuân.

Đoạn khúc này viết cho người, anh hùng khí chất hiên ngang ngất trời.

Có thể gọi vốn được 1 triệu đô.

Tôi đã từng, chưa từng hoặc đã từng có thể hack một hệ thống nào đó. Tôi không phải là một hacker. Tôi là một developer.

Tôi là một Indie Hacker – một kẻ đơn độc xây dựng sản phẩm, không vốn đầu tư, không đội nhóm, không marketing rầm rộ. Tôi tự học, tự làm, tự nuôi sống server, rồi tự mình tìm cách kiếm tiền. Samdy là một hành trình của một indie hacker như tôi được thực hành và trải nghiệm. Những gì đẹp đẽ nhất của một lập trình viên như tôi được nhìn thấy là thành công và thất bại của chính mình.

Xin trời hoa chết về tay. Để tôi biết được kiếp đây đọa đầy.

Tôi vẫn nhớ những ngày đó với những dòng code đầu tiên. Tôi không biết đã xóa đi và viết lại những dòng code của tôi bao nhiêu lần. Dù đôi lúc là ngu ngốc nhưng vẫn vui vì nó.

Tôi không nhớ chính xác mình bắt đầu yêu lập trình từ khi nào, nhưng tôi vẫn còn cảm giác lần đầu tiên viết một đoạn code chạy thành công. Đó không chỉ là một thành tựu nhỏ, mà còn là khoảnh khắc tôi nhận ra mình có thể tạo ra thứ gì đó từ con số không. Từ đó, tôi bước đi trên con đường mà nhiều người gọi là Indie Hacker – đơn độc, đầy thử thách, nhưng cũng tràn ngập đam mê.

Lập trình viên là những đơn giản nhất mà từng con người có thể đạt được. Không bằng cấp, không tuổi tác, không quá muộn. Lập trình là thế là chỉ cần có đam mê và viết vài thứ hay ho cho cuộc đời.

Sau hơn 1 năm chật vật với kinh tế. Tôi chỉ có 2 khách hàng đầu tiên từ website và ads. Tôi ngồi nói chuyện vu vơ với vài người bạn, tôi nhận ra rằng? Tại sao mình không sử dụng các data của mình đã thu thập để làm affiliate. Vậy là samdy ra đời, tôi viết một website về tìm kiếm sản phẩm giá tốt trên 3 nền tảng lazada, tiki và shopee.