Bài học từ việc tự xây dựng ứng dụng chia sẻ xe cho gia đình
Tác giả đã chia sẻ hành trình phát triển ứng dụng OurCar bằng Flutter để giải quyết vấn đề quản lý xe và chi phí xăng dầu trong gia đình. Bài viết đề cập đến các thách thức về trải nghiệm người dùng, quản lý trạng thái, quyền riêng tư và bài học kinh nghiệm khi triển khai lên App Store.

Bài học từ việc tự xây dựng ứng dụng chia sẻ xe cho gia đình
Có câu nói nổi tiếng rằng "cái khó ló cái khôn", và câu chuyện của tôi về việc xây dựng một ứng dụng chia sẻ xe cho gia đình là minh chứng rõ ràng nhất cho điều này. Mọi chuyện bắt đầu từ một bữa ăn tối, khi chúng tôi ngồi quanh bàn bếp cố gắng tính toán cách chia tiền xăng. Đây là một vấn đề nan giải kéo dài, và việc tôi gia nhập gia đình chỉ làm mọi chuyện trở nên phức tạp hơn.
Giao diện ứng dụng trên di động
Chúng tôi cần một cách công bằng để xác định ai là người phải trả tiền đổ xăng, bởi nếu không, người cầm xe khi bình xăng cạn sẽ phải chịu trách nhiệm thanh toán, điều này hoàn toàn không công bằng. Mặc dù tất cả đều cố gắng đổ xăng khi sử dụng nhiều nhiên liệu, nhưng những chuyến đi ngắn ngày nào tích tụ lại sẽ khiến bình xăng cạn kiệt theo kiểu "tích tiểu thành đại".
Nhu cầu sinh ra sự sáng tạo
Lúc đầu, chúng tôi đã cân nhắc nhiều phương án thủ công, nhưng đều gặp khó khăn. Ý tưởng tính toán dựa trên số km còn lại trên màn hình xe cũng bất khả thi vì trạm xăng chỉ bán theo lít chứ không bán theo "100km xăng".
Tôi nhận ra rằng có thể kết hợp số liệu từ đồng hồ đo hành trình (trip odometer) và hiệu suất nhiên liệu để tính toán chính xác lượng xăng đã dùng. Tuy nhiên, không ai hào hứng với việc phải làm phép tính này mỗi lần đi xe. Chúng tôi tạm thống nhất là mỗi người dùng xong sẽ đổ xăng, nhưng cách này rất phiền hà nếu chỉ đi làm những việc vặt ngắn.
Tôi đã ngứa ngáy muốn xây dựng một ứng dụng từ lâu và đây chính là cơ hội. Ngoài vấn đề xăng dầu, chúng tôi còn gặp khó khăn trong việc biết xe đang ở đâu, ai đang sử dụng, và xung đột về lịch trình. Vì vậy, tôi quyết định xây dựng một nguyên mẫu để giải quyết các vấn đề này mà không gây phiền toái.
Chọn công nghệ và phát triển nguyên mẫu
Tôi xác định phạm vi dự án là "một ứng dụng tốt hơn nhóm WhatsApp để chia sẻ xe". Nó cần biết vị trí xe, trạng thái hiện tại (ai đang đi), và theo dõi mức nhiên liệu.
Màn hình theo dõi trạng thái
Về công nghệ, tôi chọn PocketBase và Flutter (sau này thêm Riverpod để quản lý trạng thái và Auto Route cho điều hướng). Đây là những công cụ tôi đã quen thuộc từ các dự án trước.
Trong một tuần làm việc toàn thời gian, tôi đã hoàn thiện nguyên mẫu với các tính năng cơ bản:
- Trang chủ hiển thị chi tiết xe: vị trí, đồng hồ đo hành trình, mức nhiên liệu dự kiến và nút đánh dấu xe đã được lấy.
- Danh sách các chuyến đi và lịch sử đổ xăng.
- Biểu mẫu để trả xe và nhập thông số khi đổ xăng.
- Tính năng thông báo nếu ai đó muốn lấy xe vào một thời điểm nhất định.
Triển khai và phản hồi người dùng
Việc đưa ứng dụng lên điện thoại của mọi người không dễ dàng như tôi tưởng. Quy trình xác nhận (notarization) của Apple iOS cực kỳ phiền phức, khiến tôi cuối cùng phải cặp đôit điện thoại của vợ vào tài khoản nhà phát triển để đơn giản hóa việc này. Google Play Store dễ chịu hơn một chút nhưng vẫn khá rắc rối.
Trong quá trình này, chúng tôi cần một cái tên hợp lý. Ban đầu tôi đặt là "gastrax", nhưng vợ tôi kiên quyết đổi tên. Sau khi tham khảo ChatGPT, chúng tôi chọn cái tên OurCar – dễ thương và phù hợp hơn nhiều.
Ngay khi ứng dụng ra mắt, tôi bắt đầu nhận được hàng tá ý kiến và phàn nàn:
- "Có thể theo dõi lịch trình bảo dưỡng không?"
- "Quá phiền khi phải nhập liệu. Tôi có thể chụp ảnh đồng hồ xe để nó quét được không?"
- "Nên có GPS theo dõi để không cần nhập số thủ công."
- "Làm sao để chia tiền xăng?"
Thiết kế trải nghiệm người dùng (UX)
Tôi phải học cách nói "không" với những tính năng không phù hợp. Ví dụ, GPS tracking liên tục sẽ tiêu tốn pin nhanh chóng và quan trọng hơn là xâm phạm quyền riêng tư của các thành viên trong gia đình. Chúng tôi chỉ cần biết vị trí đỗ xe khi xe ở trạng thái "trống", chứ không cần biết anh rể tôi đi hẹn hò ở đâu.
Thay vào đó, tôi tập trung vào việc cải thiện UX. Triết lý của tôi là tạo ra ứng dụng có cảm giác "native" (gốc) nhất có thể trên cả iOS và Android. Flutter cung cấp các widget gần giống với công cụ gốc, nhưng việc bố cục chúng sao cho hợp lý trên hai nền tảng là một thách thức lớn, đặc biệt khi tôi không phải là một nhà thiết kế chuyên nghiệp.
Tôi đã tham khảo thiết kế của WhatsApp và ứng dụng Lịch trên iOS để tìm ra các mẫu tương tác chuẩn mực. Khi người dùng tuân theo các quy tắc giao diện quen thuộc, họ sẽ dễ dàng hiểu cách sử dụng ứng dụng hơn.
Thách thức kỹ thuật và tối ưu hóa
Trong quá trình sửa lỗi, tôi gặp vấn đề về đồng bộ hóa trạng thái giữa các trang. Giải pháp là sử dụng Riverpod để quản lý trạng thái tập trung, giúp việc cập nhật dữ liệu dễ dàng hơn.
Về hiệu suất, Flutter đôi khi bị giật (jank) nếu code không tốt. Tôi đã tạo ra các "mega-widget" quá lớn, khiến một thay đổi nhỏ cũng khiến toàn bộ giao diện phải vẽ lại (repaint). Giải pháp là chia nhỏ các widget này để quản lý trạng thái hiệu quả hơn, giúp việc nhập liệu mượt mà hơn.
Kiến trúc có thể mở rộng
Một khó khăn lớn khác là mô hình dữ liệu để theo dõi trạng thái xe. Ban đầu, tôi tách biệt nhật ký chuyến đi và nhật ký đổ xăng, gây ra sự nhầm lẫn. Sau đó, tôi quyết định gộp tất cả vào một dòng thời gian (timeline) duy nhất hoạt động như một cỗ máy trạng thái (state machine).
Dòng thời gian thống nhất
Cỗ máy này xác định các hành động khả thi dựa trên trạng thái hiện tại: xe có thể được lấy nếu đã được trả, và ngược lại. Điều này đơn giản hóa việc cập nhật dữ liệu rất nhiều. Tuy nhiên, việc triển khai không hề đơn giản và tôi nhận ra nên sử dụng một "state machine trừu tượng" (không phụ thuộc vào dữ liệu) để dễ dàng kiểm thử và debug hơn.
Để chuẩn bị cho phiên bản beta mở rộng, tôi cần thêm tính năng quản lý người dùng và luồng mời (invitation flow) thông qua deep linking. Điều này buộc tôi phải sử dụng một router (Auto Route) để quản lý điều hướng phức tạp thay vì các lệnh push/pop lộn xộn trước đây.
Kết luận
Tôi cảm thấy tự hào vì đã tạo ra một ứng dụng giải quyết đúng mục tiêu ban đầu. Dù chưa hoàn hảo 100%, nhưng nó mang lại niềm vui khi sử dụng và các thành viên trong gia đình không còn ghét nó nữa.
Tuy nhiên, cuộc sống có những thay đổi bất ngờ. Chúng tôi chuyển nhà sống xa, và các anh chị em ruột thịt cũng chuyển đi nơi khác. Nhu cầu chia sẻ xe không còn, nên nhiệt huyết phát triển dự án cũng nguội lạnh. Hiện tại, ứng dụng đang nằm trong trạng thái "treo" mãi ở phiên bản alpha.
Tôi vẫn hy vọng một ngày nào đó sẽ cần lại nó, hoặc tìm được một nhóm người khác có cùng nhu cầu để hoàn thiện nó đến phiên bản 1.0. Dù vậy, những bài học về Flutter, UX, quản lý trạng thái và kiến trúc phần mềm mà tôi có được từ dự án này là vô giá.
Bài viết liên quan

Công nghệ
Bị AI từ chối hồ sơ xin việc? Cuộc chiến đơn độc của một sinh viên y khoa
05 tháng 5, 2026

Công nghệ
Tổng hợp thị trường M&A an ninh mạng: 33 thương vụ được công bố trong tháng 4/2026
04 tháng 5, 2026

Công nghệ
Nhà xuất bản cáo buộc Mark Zuckerberg cá nhân chỉ đạo vi phạm bản quyền để đào tạo AI Llama
05 tháng 5, 2026
