Một sản phẩm không có "người dùng" nào khác ngoài tôi
invest-lab khác các extension khác trong portfolio ở một điểm quan trọng: nó không publish lên Chrome Web Store, load unpacked và chỉ tôi dùng. Điều đó thay đổi hẳn cách ra quyết định — không cần lo chính sách CWS, không cần onboarding cho người lạ, nhưng vẫn cần đủ tin cậy để tôi thật sự dùng nó ra quyết định tiền bạc.
Bài toán thật: mô phỏng giao dịch sát thực tế
Mục tiêu chính là paper trading — tập dượt chiến lược đầu tư chứng khoán VN trước khi xuống tiền thật — nhưng mô phỏng chỉ có giá trị nếu tính đúng thuế/phí như giao dịch thật, và tôn trọng quy tắc lô chẵn cổ phiếu VN (bước nhảy khối lượng phải đúng 100). Một chi tiết tưởng nhỏ — step=100 cho mọi ô nhập số lượng — nhưng sai chi tiết này thì cả kết quả mô phỏng vô nghĩa.
Thiết kế cho một nguồn dữ liệu không đáng tin 100%
Dữ liệu giá từ các nguồn miễn phí (VCI, KBS) không ổn định tuyệt đối — có lúc lỗi quyền truy cập (chrome.permissions.request() cho optional host permissions), có lúc 1 mã lỗi làm hỏng luôn cả batch request đang chạy. Sau khi gặp lỗi thật, tôi sửa để 1 mã lỗi không còn kéo sập toàn bộ batch — chỉ mã đó fail, phần còn lại vẫn chạy tiếp. Cũng thêm jitter (độ trễ ngẫu nhiên 0–90 giây) cho lịch fetch tự động, tránh tạo pattern request quá đều đặn dễ bị nguồn dữ liệu để ý.
Nguyên tắc cho AI: không hardcode 1 model
AI phân tích trong invest-lab được thiết kế qua 1 lớp abstraction chung — thử model local (Ollama) trước, rơi xuống API free-tier cloud (Gemini Flash/Groq) nếu local không khả dụng hoặc lỗi. Lý do: cả model local lẫn free-tier API đều hay đổi version, đổi quota, hoặc ngừng hỗ trợ — tên model cụ thể nằm trong config, không hardcode trong logic, để đổi provider không cần sửa code.
Bài học
Không phải mọi sản phẩm đều cần polish để "ra mắt" — nhưng một công cụ chỉ mình dùng để ra quyết định tài chính vẫn cần đúng ở những chi tiết dễ bị xem nhẹ (bước lô cổ phiếu, xử lý lỗi từng phần, dữ liệu mẫu để demo mà không phá dữ liệu thật đã có). "Cá nhân" không đồng nghĩa với "làm ẩu".