Chuyển tới nội dung chính
Trịnh Thị Mai
Tạm dừngPaused — interview-question dataset pending

Personal Hub

Ứng dụng trợ lý Android cá nhân của tôi — Công việc, Mục tiêu, Ghi chú và một engine Học theo phương pháp lặp lại ngắt quãng, được xây dựng bằng cách áp dụng nền tảng sản phẩm Android tái sử dụng của tôi. Hiện đang tạm dừng trong khi tôi hoàn thiện bộ dữ liệu câu hỏi phỏng vấn mà giai đoạn Học tiếp theo cần đến.

Vai trò
Solo developer — product, architecture & Android implementation
Nền tảng
Android

Tổng quan dự án

Lĩnh vực
Một trợ lý Android cá nhân — gom công việc, mục tiêu, ghi chú và việc học theo phương pháp lặp lại ngắt quãng của riêng tôi (bao gồm, khi nội dung sẵn sàng, việc ôn luyện phỏng vấn kỹ thuật) vào một ứng dụng riêng tư, được xây dựng trên nền tảng sản phẩm Android tái sử dụng của tôi.
Sản phẩm
Personal Hub là ứng dụng trợ lý Android cá nhân của riêng tôi — không phải portfolio nghề nghiệp của tôi, và không phải một công cụ quản lý portfolio. Ứng dụng kết hợp Công việc (Tasks) với nhắc hẹn theo hạn chót, Mục tiêu (Goals) theo chu kỳ, một hộp thư Ghi chú (Notes) để ghi nhanh, và một engine Học (Learning) theo phương pháp lặp lại ngắt quãng (cho từ vựng Tiếng Anh/Tiếng Trung hiện tại, và ôn luyện phỏng vấn kỹ thuật khi nội dung đó sẵn sàng), tất cả được xây dựng bằng cách áp dụng cùng một nền tảng sản phẩm Android tái sử dụng mà tôi duy trì cho các ứng dụng cá nhân của mình. Định hướng rộng hơn là tiếp tục gom các phần hữu ích trong quy trình làm việc của riêng tôi vào ứng dụng riêng tư này theo thời gian.
Người dùng
Được xây dựng cho chính nhu cầu sử dụng hàng ngày của tôi — lập kế hoạch công việc và mục tiêu, ghi chú nhanh không vướng bận, và ôn tập thẻ ghi nhớ theo lịch giãn cách, với việc ôn luyện phỏng vấn kỹ thuật là điều tiếp theo mà engine Học sẽ hỗ trợ khi nội dung đó sẵn sàng.
Lý do ra đời
Tôi muốn có một ứng dụng trợ lý riêng tư duy nhất cho những phần trong quy trình làm việc của riêng tôi vốn bị phân tán qua nhiều công cụ khác nhau, và tôi muốn xây dựng một ứng dụng tiêu dùng thực sự, hoạt động được trên nền tảng Android tái sử dụng mà tôi duy trì — không chỉ là một dự án mẫu, mà là thứ thực sự triển khai các tính năng tôi tự sử dụng.
Vấn đề
Gom công việc hàng ngày, mục tiêu, ghi chú, và việc học/ôn tập liên tục của riêng tôi vào một ứng dụng tôi tự kiểm soát, thay vì phải sử dụng nhiều công cụ không liên quan — với bước tiếp theo của engine Học là mở rộng cùng nền tảng lặp lại ngắt quãng đó sang việc ôn luyện phỏng vấn kỹ thuật, khi nội dung đó sẵn sàng.

Vai trò & đóng góp của tôi

Một dự án cá nhân, độc lập — ý tưởng sản phẩm, kiến trúc, và triển khai Android đều là công việc của riêng tôi, được xây dựng bằng cách áp dụng nền tảng sản phẩm Android tái sử dụng của tôi vào một ứng dụng tiêu dùng thực sự. Những gì đã được triển khai và kiểm thử ngày nay: Công việc (với nhắc hẹn theo hạn chót qua một hàm quyết định thuần túy), Mục tiêu theo chu kỳ, một hộp thư Ghi chú để ghi nhanh, và bộ lập lịch lặp lại ngắt quãng của engine Học, được kiểm thử qua các unit test và một lượt kiểm thử instrumented trên thiết bị thật đã chạy thành công. Một mô hình dữ liệu AiJob tồn tại trong cơ sở dữ liệu cục bộ như một nền tảng cho một tính năng có thể có trong tương lai, nhưng chưa được kết nối vào bất kỳ repository hay màn hình nào — phần đó chưa phải là chức năng hướng tới người dùng ngày hôm nay.

Thách thức & giải pháp

  1. Thách thức kỹ thuật

    Giai đoạn tiếp theo của engine Học — ôn luyện phỏng vấn kỹ thuật — phụ thuộc vào một bộ dữ liệu JSON câu hỏi phỏng vấn có cấu trúc mà tôi chưa hoàn thiện. Đây là một phụ thuộc về nội dung, không phải một vấn đề kiến trúc: bộ lập lịch, mô hình dữ liệu cục bộ, và các màn hình Học mà tính năng này sẽ chạy trên đó đều đã được xây dựng và kiểm thử; điều còn thiếu là nội dung bộ câu hỏi thực tế. Ngoài ra, hai vấn đề tương tự lặp lại ở phần còn lại của ứng dụng: giữ an toàn cho liên kết tùy chọn giữa một Công việc và một Mục tiêu mà không dùng khóa ngoại trong cơ sở dữ liệu, và biến câu hỏi "công việc này có nên nhắc tôi ngay bây giờ không" thành một quy tắc duy nhất, có thể kiểm thử được, thay vì logic rải rác ở bất cứ đâu có thể làm thay đổi một công việc.

    Cách tôi tiếp cận

    Việc xác định có nên nhắc hẹn hay không là một hàm thuần túy duy nhất, nhận trạng thái hiện tại của một công việc và trả về liệu có nên tồn tại một lời nhắc ngay lúc này hay không — mọi luồng mã có thể làm thay đổi câu trả lời đó đều gọi cùng một hàm, nên chỉ có đúng một nơi chứa quy tắc này. Mối quan hệ Mục tiêu/Công việc là một tham chiếu mềm có chủ đích: xóa một Mục tiêu sẽ xóa liên kết trên các Công việc của nó trước, rồi mới xóa chính Mục tiêu, để một sự cố xảy ra giữa hai bước đó không bao giờ có thể để lại một tham chiếu mồ côi, mà không cần một giao dịch cơ sở dữ liệu để đảm bảo an toàn. Bộ lập lịch ôn tập của engine Học là một thuật toán lặp lại ngắt quãng nhỏ, tự chứa, hoạt động trên dữ liệu thuần túy, được tách riêng khỏi lớp repository và giao diện để có thể kiểm thử trực tiếp và tái sử dụng cho một danh mục nội dung mới — như câu hỏi phỏng vấn — khi nội dung đó tồn tại, mà không cần thay đổi logic lập lịch.

Kiến trúc & công nghệ

Một ứng dụng Android gốc viết bằng Kotlin với Jetpack Compose, Hilt cho dependency injection, và Room để lưu trữ hoàn toàn cục bộ, ngoại tuyến — không có backend và không có bất kỳ quyền truy cập mạng nào. Ứng dụng được xây dựng bằng cách áp dụng một tập hợp module có chủ đích tối giản, chỉ ở mức khởi động (design system, lưu trữ cục bộ, cấu hình dependency injection, lên lịch thông báo) từ cùng nền tảng sản phẩm Android tái sử dụng mà tôi duy trì cho các ứng dụng cá nhân của mình, chỉ thêm những gì mỗi tính năng thực sự cần thay vì kéo theo toàn bộ năng lực của nền tảng.

Công nghệ

  • Kotlin
  • Jetpack Compose
  • Hilt
  • Room
  • Kotlin Coroutines
  • Kotlin Serialization
  • AndroidX Navigation Compose
  • WorkManager
  • JUnit

Dự án này thể hiện

Điều này cho thấy nền tảng Android tái sử dụng của tôi không chỉ là một mẫu trừu tượng — nó có thể được áp dụng để xây dựng một ứng dụng cá nhân thực sự, hoạt động được với các chức năng đã được kiểm thử. Nó cũng thể hiện việc phân biệt rõ ràng giữa một engine đã triển khai (bộ lập lịch lặp lại ngắt quãng) và nội dung mà engine đó cần cho một mục đích cụ thể (bộ dữ liệu câu hỏi phỏng vấn): dự án đang tạm dừng một cách trung thực vì phụ thuộc nội dung đã được nêu rõ, không phải vì bị kẹt ở một quyết định kiến trúc hay bị bỏ dở.

  • Phát triển Android
  • Hỗ trợ ngoại tuyến
  • Kiểm thử chất lượng

Tiến độ hiện tại

The core Tasks/Goals/Notes/Learning-foundation functionality is implemented and tested; development is paused specifically because the interview-question JSON dataset the next Learning/interview-preparation stage depends on hasn't been finished yet.

  1. Định hình sản phẩm

    Hoàn thành
  2. Phát triển cốt lõi

    Hoàn thành
  3. Xây dựng dữ liệu phỏng vấn

    Đang thực hiện

Bạn có dự án tương tự?

Chia sẻ sản phẩm hoặc vấn đề bạn đang gặp. Tôi sẽ trao đổi để tìm hướng hỗ trợ phù hợp.

Làm việc cùng tôi