Learning by Solving Real Problems
“Học qua việc giải quyết vấn đề thực tế — không phải học thuộc lòng.”

1. 🎯 Start from a Real-World Problem
✅ DO
Bắt đầu từ một vấn đề thực tế mà ae cần giải quyết trong công việc, dự án, hoặc ý tưởng cá nhân.
Học một công nghệ mới thông qua ứng dụng cụ thể, thay vì đọc lý thuyết từ đầu đến cuối.
🧩 Ví dụ thực tế:
- ae muốn học NodeJS + Express → Làm API login/register, CRUD cho một web app.
- ae muốn học ReactJS Hooks → Xây Todo App có filter & localStorage.
- ae muốn học NestJS + TypeORM → Tạo TaskBoard API để quản lý các task.
- ae muốn học Blockchain → Tạo chức năng mint NFT demo.
❌ DON’T
- Đọc lý thuyết từ A-Z của NodeJS, React, SQL mà không có mục tiêu cụ thể.
- Làm project “template” không giải quyết được vấn đề nào rõ ràng.
💡 Tư duy đúng:
“Mỗi khi học cái mới — hãy hỏi: Mình đang muốn giải quyết vấn đề gì bằng nó?”
Break Down – “Chia để trị”
Sau khi ae đã xác định được vấn đề, hãy chia nhỏ vấn đề đó ra. Đây cũng là 1 trong những skill ae cần phải học và thực hành để làm được và làm tốt càng sớm càng tốt, sẽ cực kỳ hữu ích cho công việc và cả cuộc sống sau này. Dưới đây mình chỉ list sơ lược cho ae trong lĩnh vực programing, ae có thể tự phát triển ra cho các lĩnh vực khác.
Bước 1. Viết 1 câu mô tả mục tiêu (User Story)
Mục tiêu: Giúp ae xác định “mình đang giải quyết chuyện gì và vì ai” trước khi code.
Câu này phải có người dùng, hành động, và lợi ích.
Ví dụ:
“As a user, I want to log in so I can access my dashboard.”
(Là người dùng, tôi muốn đăng nhập để truy cập bảng điều khiển của mình.)
Giải thích:
Nếu ae không viết rõ user story, ae sẽ dễ bị “trôi” sang học vặt hoặc lan man — ví dụ học JWT, bcrypt, Express… mà không có mục tiêu cụ thể.
Bước 2. Liệt kê các phần chính của hệ thống
Mục tiêu: Xác định toàn bộ “mảnh ghép” ae cần đụng tới để hoàn thiện tính năng.
Ví dụ với Login Feature:
- UI (Frontend): Form nhập email/password, thông báo lỗi.
- API (Backend): Endpoint
/loginxử lý request. - DB (Database): Lưu thông tin user (email, mật khẩu đã mã hóa).
- Auth (Authentication): Sinh và xác thực JWT token.
- Tests: Kiểm tra login hợp lệ / sai.
- Docs: Ghi lại API, hướng dẫn setup.
Tại sao cần bước này:
Giống như ae vẽ sơ đồ trước khi xây nhà — nó giúp ae hình dung toàn cảnh, tránh quên hoặc lẫn lộn các phần.
Bước 3. Với mỗi phần, chia thành task nhỏ ≤ 3 giờ
Mục tiêu: Giúp ae “nhìn thấy điểm dừng” cho mỗi phần và giữ động lực vì liên tục hoàn thành được việc.
Ví dụ cụ thể:
UI (React)
- [ ] Tạo component
LoginFormvới 2 input + 1 nút Submit. (1.5h) - [ ] Xử lý gọi API
/loginbằngfetch. (1h) - [ ] Hiển thị thông báo lỗi khi login fail. (0.5h)
API (NodeJS/Express)
- [ ] Tạo route
POST /login. (0.5h) - [ ] Validate
emailvàpasswordtừ body. (1h) - [ ] Tìm user trong DB, so sánh mật khẩu (bcrypt). (1h)
- [ ] Trả về JWT token nếu hợp lệ. (0.5h)
DB
- [ ] Tạo migration bảng
users(id, email, password_hash). (1h) - [ ] Seed user test để thử login. (0.5h)
Auth
- [ ] Tạo file
jwt.util.jssinh & xác thực token. (1h) - [ ] Middleware
requireAuth()để bảo vệ route/dashboard. (1h)
Tests
- [ ] Test đăng nhập thành công → nhận JWT. (1h)
- [ ] Test đăng nhập sai → nhận 401. (1h)
Docs
- [ ] Ghi README mô tả API
/login(input, output). (0.5h)
Bước 4. Mỗi task có kết quả kiểm chứng được (Acceptance Criteria)
Mục tiêu: Biết khi nào “xong thật sự”, tránh mơ hồ kiểu “xong 80% rồi”.
Ví dụ cụ thể:
| Task | Acceptance Criteria (AC) |
|---|---|
| API: POST /login | Khi gửi đúng email/password, trả 200 + token. |
| API: Validate input | Thiếu field → 400 + thông báo lỗi. |
| FE: Form login | Nhập đúng → chuyển sang dashboard. |
| FE: Error handling | Nhập sai → hiển thị lỗi “Sai mật khẩu”. |
| Auth Middleware | Không có token → 401 Unauthorized. |
💡Tips:
- Khi tự học, hãy viết 1 dòng AC cho mỗi task — nó giúp bạn học có mục tiêu rõ và test được kết quả.
- Sử dụng công cụ như Trello, Jira… để quản lý task hiệu quả hơn. </aside>
Bước 5. Nếu có phần chưa rõ → tạo task “Research X (timebox 1–2h)”
Mục tiêu: Không bị mắc kẹt quá lâu, nhưng vẫn đảm bảo tìm hiểu chủ động.
Ví dụ thực tế:
Research: Cách hash password bằng bcrypt trong NodeJS (1h)Research: JWT payload nên chứa gì? (1h)Research: React form handle error đúng cách (1h)Research: Cấu hình CORS trong Express (1h)
Khi hết thời gian đã đặt (ví dụ 2 tiếng), nếu vẫn chưa ra → ghi note “Ask mentor / ChatGPT / đồng nghiệp”.
💡 Tips:
- Mỗi research task nên có mục tiêu rõ ràng (“biết cách X” hoặc “hiểu vì sao Y lỗi”).
- Sau research, hãy viết lại tóm tắt 2–3 dòng vào Notion.
💡 Ví dụ tổng thể: “Login Feature” Breakdown (Tóm tắt)
| Thành phần | Task | Thời gian | AC chính |
|---|---|---|---|
| DB | Tạo bảng users | 1h | Có bảng users(id, email, password_hash) |
| API | POST /login trả JWT | 2h | Trả token khi login đúng |
| Auth | Middleware verify token | 1.5h | Không token → 401 |
| FE | Form login + handle error | 2h | Hiển thị lỗi & chuyển dashboard |
| Tests | /login success + invalid creds | 2h | Pass 2 case test |
⚙️ Tóm gọn công thức “Breakdown hiệu quả”
- 🎯 Xác định mục tiêu (user story)
- 🧩 Liệt kê mảnh ghép chính (UI, API, DB…)
- 🪓 Chia nhỏ task (≤3h)
- ✅ Đặt tiêu chí kiểm chứng (AC)
- ⏱️ Timebox research nếu gặp chỗ chưa biết
2. ❓ Make Questions
🎯 Mục tiêu
Từ mỗi task, ae lại chia nhỏ thành nhiều câu hỏi nhỏ để học hiệu quả hơn.
🧠 Cấu trúc của một câu hỏi tốt:
- Ngôn ngữ/Công nghệ: ReactJS, NodeJS, PostgreSQL, v.v.
- Ngữ cảnh (Context): Dự án, business logic, version, môi trường chạy…
- Mục tiêu rõ ràng: Giải lỗi? Học khái niệm? Viết lại code tốt hơn?
- Ví dụ code: Đưa ra snippet hoặc function đang gặp vấn đề.
- Những gì đã thử: Ghi rõ ae đã tìm, thử, đọc tài liệu nào rồi.
🧩 Ví dụ:
❓ ReactJS:
“Khi dùng
useEffectđể gọi API, mỗi lần component re-render thì API bị gọi lại. Làm sao để chỉ gọi một lần khi mount?”✅ Context: React 18, Vite app.
✅ Đã thử: Thêm
[]vào dependency, đọc doc React.dev.✅ Mục tiêu: Hiểu cách hoạt động dependency array của useEffect.
🔍 Thứ tự tìm kiếm:
- Docs hoặc codebase của dự án xem ae trong team trước đó làm tnao.
- AI (như ChatGPT) hoặc Google trong giới hạn thời gian.
- Giới hạn tgian ví dụ ≤ 4h nếu ko tự tìm được giải pháp sẽ nhờ đến trợ giúp tiếp theo
- Hỏi đồng nghiệp, mentor (nếu vẫn bế tắc).
- Hỏi cộng đồng (group, channel, diễn đàn).
⚠️ Lưu ý:
- Hỏi đúng người, đúng chuyên môn. Ví dụ: Vấn đề về yêu cầu nghiệp vụ → hỏi BA. Vấn đề liên quan process, stakeholder → hỏi PM, etc…
- Nếu cần hỏi khách hàng, phải thông qua PM.
3. 💻 Practice
🎯 Mục tiêu
Biến câu trả lời hoặc solution thành hành động thực tế (viết code, debug, test…).
🧩 Ví dụ thực tế:
- Tìm được cách xác thực JWT trong NodeJS → hãy viết middleware thực tế.
- Đọc về React Context API → tạo demo quản lý theme dark/light.
- Thấy lỗi SQL trong TypeORM → tự fix, chạy migration, test lại API.
⚠️ Ghi nhớ:
- Copy/paste nhưng phải hiểu.
- Khi giải quyết xong, hãy tự remind lại luồng code run như thế nào…
🔥 Tinh thần:
“Giải quyết vấn đề bằng mọi giá — search, hỏi AI, hỏi mọi người… — nhưng không bỏ cuộc cho đến khi hiểu rõ và giải quyết đc vấn đề.”
4. 🗂 Knowledge Organization
🎯 Mục tiêu
Sau khi học và giải quyết vấn đề, hãy tổ chức lại kiến thức để sau này dễ tra cứu.
📦 Cấu trúc gợi ý:
- Nó là gì? “Middleware là function đóng vai trò trung gian, được thực thi tuần tự giữa request và response. Chúng có thể tiền xử lý, sửa đổi request/response, ghi log, xác thực, hoặc chuyển tiếp yêu cầu tới middleware tiếp theo thông qua hàm
next()Express.” - Khi nào dùng? “Khi cần xác thực, logging, validate request…”
- Ví dụ code: Copy đoạn code ngắn, có comment.
- Khi cần truy xuất ở đâu: Link docs, Notion, Github, etc.
5. 🔁 Remind & Sharing
🎯 Mục tiêu
Giúp ghi nhớ và củng cố kiến thức thông qua nhắc lại và chia sẻ.
💡 Cách thực hiện:
- Remind nhẹ nhàng khi làm việc nhà, đi bộ, hoặc trước khi ngủ: “Tại sao useEffect([]) chỉ chạy 1 lần?”“Sự khác nhau giữa
let,const,varlà gì?” - Chia sẻ lại cho người khác qua:
- Viết post ngắn trên ant.ncc.plus
- OpenTalk trong team.
- Viết tài liệu nội bộ – NCC Ops.
- Hướng dẫn lại cho junior.
