Những Gì Tôi Học Được Từ Việc Tự Xây 3 Công Cụ Nội Bộ
Fujilux, Control Room và TV Translate — ba công cụ, ba mức độ công nghệ hoàn toàn khác nhau, cùng giải quyết một dạng vấn đề: việc lặp lại quá nhiều lần đến mức tự tay làm phí thời gian hơn tự học cách để máy làm thay.
Ba công cụ này đều đã có case study riêng, đầy đủ chi tiết kỹ thuật, trên trang Dự án. Bài này không lặp lại những chi tiết đó — nó là phần "hậu trường": nhìn lại xuyên suốt cả ba lần tự xây, điều gì lặp lại giống nhau, điều gì mỗi lần lại dạy tôi một bài học khác hẳn lần trước.
Ba công cụ, ba bài toán khác nhau
Điều đầu tiên đáng nói: cả ba không dùng chung một cấp độ công nghệ, và đó là chủ đích chứ không phải ngẫu nhiên. Mỗi công cụ dùng đúng mức công nghệ mà bài toán của nó cần — không hơn.
| Công cụ | Vấn đề giải quyết | Công nghệ | Dùng cho |
|---|---|---|---|
| Fujilux | Tổng hợp chi phí quảng cáo, lead, đơn hàng thủ công mỗi ngày | Công thức Sheets (SUMIFS, TEXTJOIN, EOMONTH) | Một mình vận hành |
| Control Room | Báo cáo KPI & quảng cáo đa chi nhánh, nhiều người cùng xem | React, esbuild, chrome.storage.local | Cả đội vận hành 2 miền |
| TV Translate | Dịch chữ/ảnh nhanh ngay trong tab đang làm việc | JavaScript thuần, Tesseract.js OCR | Một mình dùng cá nhân |
Ba mức công nghệ khác nhau — từ không cần dòng code nào đến một ứng dụng React đầy đủ — mỗi mức được chọn theo đúng độ phức tạp thật của bài toán, không theo "công nghệ đang hot".
Vòng lặp lặp lại ở cả ba lần
Nhìn lại, cả ba lần tự xây đều đi qua đúng một trình tự — chỉ khác nhau ở quy mô. Đây có lẽ là điều tôi nhận ra rõ nhất sau ba lần lặp lại quy trình này:
Sáu bài học cụ thể
1. Bài toán nhỏ không cần công cụ lớn
Fujilux là bài học rõ nhất về điều này. Cả hệ thống tổng hợp chi phí quảng cáo, lead và đơn hàng cho 10+ chi nhánh chạy hoàn toàn bằng công thức Google Sheets — không một dòng Apps Script nào. Lúc mới bắt đầu, phản xạ tự nhiên là nghĩ "phải viết code mới gọi là tự động hoá". Thực tế thì SUMIFS, TEXTJOIN và EOMONTH đã đủ giải quyết đúng bài toán, và một hệ thống thuần công thức có một lợi thế mà code không có: bất kỳ ai biết Sheets cơ bản cũng sửa được, không cần biết lập trình.
2. Độ phức tạp của công nghệ nên khớp với độ phức tạp của bài toán
So sánh Control Room và TV Translate là ví dụ rõ nhất. Control Room cần React vì có state thật sự phức tạp: nhiều trang (tháng/tuần/ngày), nhiều khu vực, bộ lọc, bảng KPI tính lại liên tục khi gõ — quản lý tay bằng JavaScript thuần sẽ rất dễ rối. TV Translate thì ngược lại: giao diện chỉ có vài panel dịch, vài nút bấm, không có state lồng nhau phức tạp — dùng React ở đây sẽ là mang dao mổ trâu đi giết gà, thêm bước build mà không đổi lại gì. Bài học không phải "React tốt hơn" hay "vanilla JS tốt hơn" — mà là phải tự hỏi đúng câu hỏi trước khi chọn: bài toán này thật sự phức tạp đến đâu.
3. Tự động hoá tốt là tự động hoá không ai để ý
Fujilux vẫn "chỉ là một cái Google Sheet" đối với người mở nó lên xem mỗi ngày — không có giao diện lạ, không cần học thêm gì. Số liệu tự cập nhật khi đổi ô lọc thời gian, đúng như một Sheet bình thường vẫn hoạt động. Đây hoá ra là tiêu chí thành công quan trọng hơn cả độ "xịn" của công nghệ: nếu một công cụ tự động hoá khiến người dùng phải học lại cách làm việc, nó đã thất bại một nửa — dù code có tinh vi đến đâu.
4. Xây cho nhiều người dùng khác hẳn xây cho một mình mình
TV Translate là công cụ cá nhân — chỉ mình tôi dùng, nên tôi có thể tuỳ tiện đổi giao diện, đổi logic, chấp nhận vài lần lỗi vặt không sao. Control Room thì khác hẳn: nó "dùng chung cho mọi người truy cập trang này" (như chính dòng mô tả trong bảng KPI của nó), nghĩa là dữ liệu lưu qua chrome.storage.local phải nhất quán cho mọi người mở, nhãn/label phải đủ rõ để người không quen công cụ vẫn hiểu ngay, và một lỗi nhỏ giờ ảnh hưởng đến nhiều người thay vì chỉ mình tôi. Bài học: mức độ cẩn trọng cần tăng lên đúng theo số người sẽ dùng, không phải theo độ khó của code.
5. Quyền truy cập & bảo mật phải nghĩ từ đầu, không phải thêm sau
Cả TV Translate và Control Room đều là Chrome Extension (Manifest V3), và cả hai đều buộc phải khai báo rõ permissions ngay trong manifest.json trước khi chạy được — TV Translate chỉ xin đúng quyền cần cho translate.googleapis.com, Control Room chỉ xin storage và unlimitedStorage, không hơn. Việc Manifest V3 bắt buộc khai báo tường minh từ đầu hoá ra là một kỷ luật tốt: nó buộc tôi phải trả lời câu hỏi "công cụ này thật sự cần chạm vào những gì" trước khi viết dòng code đầu tiên, thay vì xin quyền tràn lan rồi dọn dẹp sau — thứ gần như không bao giờ thực sự xảy ra nếu không bị ép làm ngay từ đầu.
6. Tự debug lỗi của chính mình dạy nhiều hơn mọi tutorial
Không có bài học nào ở trên tôi học được từ việc xem video hướng dẫn. Tất cả đến từ việc một công thức Sheets ra kết quả sai và phải dò lại từng bước, hoặc một tính năng trong Control Room chạy đúng lúc test nhưng sai khi dữ liệu thật lớn hơn. Khác với học theo tutorial — nơi mọi thứ đã được sắp sẵn để chạy đúng — tự debug lỗi trên chính công cụ mình đang cần dùng thật tạo áp lực đúng chỗ để hiểu tận gốc, không phải chỉ hiểu đủ để copy qua bài tiếp theo.
Ba công cụ, ba mức công nghệ, nhưng cùng một quy trình lặp lại: thấy việc lặp lại thật, chọn công cụ vừa đủ cho đúng quy mô bài toán, tự học trong lúc xây, và để việc dùng thật hàng ngày làm bài kiểm tra cuối cùng. Kỹ năng lớn nhất tôi mang ra khỏi cả ba lần này không phải cú pháp code — mà là phản xạ hỏi đúng câu hỏi trước khi mở trình soạn thảo code lên.
Minh hoạ trong bài dùng hoạt ảnh CSS/SVG dựng trực tiếp trên trang — không phải ảnh chụp hay video ngoài — để chuyển động mượt, tự đổi màu theo giao diện và tải nhanh.