Bài 3 · Cơ bản · 20 phút
Sản phẩm số chạy thế nào
Biên soạn bởi Nguyễn Anh Tuấn
Mô hình tinh thần cho người không code, nhìn qua lăng kính một app Next.js + PostgreSQL: frontend vs backend, database, hosting/deploy, domain là gì; repo/file/thư mục; commit/branch/PR nghĩa là gì khi nhìn lướt. Kèm sơ đồ "giải phẫu một app Next.js đã deploy".
Ở bài Nghĩ như người làm sản phẩm, mèo con học cách mô tả cho AI. Để mô tả cho chuẩn, có một thứ giúp ích nhiều: hình dung sơ sản phẩm chạy ra sao phía sau. Khách chỉ bấm một nút, nhưng đằng sau là cả một dây chuyền - và bạn không cần gõ được nó, chỉ cần một bản đồ trong đầu.
Bài này vẽ bản đồ đó bằng lời thường, lấy ví dụ xuyên suốt khoá: một web bán hàng có ví (khách nạp tiền, mua hàng, bị trừ số dư). Không có dòng code nào ở đây - chỉ là cách các mảnh ghép với nhau.
Một sản phẩm web có hai nửa. Frontend là phần khách nhìn thấy và bấm: trang hàng, nút "Mua", ô nhập, màu sắc - chạy ngay trong trình duyệt. Backend là phần xử lý ẩn chạy trên máy chủ: kiểm mật khẩu đúng không, trừ số dư bao nhiêu, lưu đơn vào đâu - khách không thấy.
- ▸Frontend = giao diện khách thấy & bấm, chạy trong trình duyệt.
- ▸Backend = phần xử lý ẩn (đăng nhập, trừ tiền, lưu đơn), chạy trên máy chủ.
- ▸Web bán hàng: danh sách hàng + nút Mua = frontend; trừ số dư + lưu đơn = backend.
- ▸Next.js gom được cả hai nửa trong một dự án (full-stack).
Vì sao tách hai nửa
Tắt máy chủ rồi mở lại, số dư của khách vẫn còn - nhờ database (cơ sở dữ liệu). Đây là nơi giữ dữ liệu lâu dài và có tổ chức: tài khoản, số dư, sản phẩm, đơn hàng. Khoá này dùng PostgreSQL, một database phổ biến và vững.
Phân biệt nhanh: frontend lo hiển thị, backend lo xử lý, còn database lo ghi nhớ. Ba vai khác nhau, phối hợp với nhau trong mỗi lần khách bấm.
Để người khác vào được, sản phẩm phải chạy trên một máy luôn bật và có một địa chỉ ai cũng gõ tới được. Máy đó là VPS (máy chủ ảo thuê theo tháng); địa chỉ đó là tên miền (vd shopcuatoi.vn). Tên miền trỏ tới VPS, và đây là toàn cảnh khi khách truy cập:
Nginx là người nhận khách ngoài cửa rồi chuyển request vào trong; Next.js xử lý; PostgreSQL giữ dữ liệu. Cụm này được dựng sẵn bằng một lệnh ở bài deploy cuối khoá - giờ chỉ cần nhớ mặt từng mảnh.
Trung thực
Tất cả những thứ trên, dưới dạng chữ, là mã nguồn - các file nằm trong thư mục, gom lại thành một repo (kho chứa toàn bộ dự án). Nhìn lướt một dự án Next.js cũng không đáng sợ:
cây thư mục một dự án Next.js (rút gọn) - nhìn để quen mặt, chưa cần thuộc
shop-cua-toi/
├── app/ # các trang & giao diện (frontend)
│ ├── page.tsx # trang chủ
│ └── api/ # phần xử lý ẩn (backend)
├── public/ # ảnh, file tĩnh
├── package.json # khai báo dự án & thư viện
└── next.config.js # cấu hình Next.js Khi làm việc, mèo con sẽ nghe ba từ: commit (một lần lưu mốc thay đổi), branch (nhánh để làm thử mà không đụng bản chính), và PR (pull request - lời đề nghị gộp thay đổi vào). Chưa cần thuộc; chỉ cần nhận ra chúng khi Claude hoặc GitHub nhắc tới - bài GitHub & vibe trên web/điện thoại sẽ cho dùng tay.
Vậy là mèo con có bản đồ: frontend (thấy), backend (xử lý), database (nhớ), gói lại thành repo, đặt lên VPS, gắn tên miền. Có bản đồ này, mô tả cho AI sẽ trúng hơn và mèo con không hoảng khi nó nhắc thuật ngữ.
Bước tiếp theo
Câu hỏi thường gặp
Cả hai. Next.js vừa dựng giao diện cho trình duyệt (frontend), vừa chạy phần xử lý ẩn như kiểm tra đăng nhập hay trừ số dư (backend). Người ta gọi nó là framework full-stack vì gom được cả hai phía trong một dự án - tiện cho người vibe coding vì chỉ phải làm việc với một thứ.
Để mô tả cho AI cho chuẩn và để không hoảng khi nó (hoặc GitHub) nhắc tới "backend", "database", "deploy". Bạn không cần gõ được những thứ này; bạn cần đủ bản đồ trong đầu để ra quyết định và kiểm tra xem AI làm có hợp lý không.
Một file rời thì lưu được, nhưng tìm/sửa/khoá để nhiều người dùng cùng lúc mà không loạn thì rất khổ. Database (như PostgreSQL) sinh ra để làm đúng việc đó: lưu có tổ chức, tìm nhanh, cập nhật an toàn khi đông người. Bài "Lưu dữ liệu với PostgreSQL" sẽ đi sâu hơn.
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
Đâu là việc của FRONTEND?
- 1
Dán nhãn frontend / backend
Với 6 việc của web bán hàng (hiện danh sách hàng, kiểm mật khẩu, bấm nút "Mua", trừ số dư, đổi màu nút, lưu đơn vào database), gắn nhãn FE (frontend) hay BE (backend) cho từng cái.
✅ Hoàn thành khi: Mỗi việc có đúng một nhãn FE/BE; ví dụ: hiện danh sách & đổi màu nút & nút Mua = FE; kiểm mật khẩu, trừ số dư, lưu đơn = BE.
- 2
Vẽ đường đi một request
Khách bấm "Nạp tiền". Viết ra các chặng request đi qua, theo sơ đồ trong bài.
✅ Hoàn thành khi: Liệt kê đúng thứ tự: trình duyệt → (tên miền + HTTPS) → VPS → Nginx → Next.js → PostgreSQL, và dữ liệu trả về theo chiều ngược lại.
- 3
Liệt kê dữ liệu cần nhớ
Kể 5 thứ web bán hàng phải lưu trong database (để tắt máy mở lại vẫn còn).
✅ Hoàn thành khi: Có 5 mục hợp lý, ví dụ: tài khoản khách, số dư ví, danh sách sản phẩm, đơn hàng, lịch sử giao dịch nạp tiền.
- 4
Hosting vs tên miền
Viết một câu cho "hosting/VPS" và một câu cho "tên miền", rồi một câu vì sao cần cả hai.
✅ Hoàn thành khi: Phân biệt rõ: VPS là máy chạy sản phẩm (luôn bật); tên miền là địa chỉ để người ta tìm tới; thiếu một trong hai thì khách không vào được.
- 5
Soi một repo trên GitHub
Mở một kho mã công khai trên GitHub (ví dụ github.com/vercel/next.js) và chỉ ra: một thư mục, một file, và chỗ xem lịch sử commit.
✅ Hoàn thành khi: Chụp/ghi lại: tên một thư mục, tên một file, và số commit (hoặc trang "Commits") của kho - mèo con đã nhìn thấy repo/file/thư mục bằng mắt.
- 6
Nhờ Claude giải phẫu dự án
Mở Claude Code trong thư mục đã tạo ở bài 1, hỏi "giải thích cấu trúc thư mục dự án này cho người không rành kỹ thuật".
✅ Hoàn thành khi: Đọc lời giải thích và đối chiếu với sơ đồ trong bài: nhận ra đâu là phần giao diện, phần xử lý, phần cấu hình.