Nhiều lập trình viên khi bắt đầu một dự án thường nhảy ngay vào code, tạo vài endpoint, vài bảng trong cơ sở dữ liệu, rồi mới chợt nhận ra: “Người dùng thực sự cần gì nhỉ?”

Đây chính là lý do vì sao việc hiểu quy trình từ ý tưởng đến nghiệp vụ, sau đó đến database và API là cực kỳ quan trọng. Trong bài viết này, chúng ta sẽ cùng đi từng bước như cách một kỹ sư phần mềm chuyên nghiệp biến một ý tưởng thô sơ thành hệ thống backend hoàn chỉnh.

1. Từ ý tưởng ban đầu

Giả sử bạn có một ý tưởng rất phổ biến: xây dựng ứng dụng quản lý công việc cá nhân (Todo App).

Mục tiêu rất đơn giản: người dùng có thể tạo công việc, đánh dấu hoàn thành và xem lại lịch sử công việc.

Ở giai đoạn này, đừng nghĩ đến code hay cơ sở dữ liệu vội. Hãy tự hỏi:

  • Ai là người dùng chính?

  • Họ sẽ thao tác những gì?

  • Có cần đăng nhập, phân quyền hay không?

2. Phân tích nghiệp vụ

Đây là lúc bạn phác thảo dòng chảy hành động của người dùng.

Bạn có thể dùng các công cụ như Miro, Whimsical hoặc FigJam để vẽ sơ đồ nghiệp vụ.

Ví dụ dòng chảy nghiệp vụ:

  1. Người dùng đăng ký tài khoản

  2. Đăng nhập

  3. Tạo công việc mới

  4. Đánh dấu hoàn thành hoặc xóa công việc

  5. Đăng xuất

Như vậy, bạn đã xác định được hai nhóm chức năng chính:

Quản lý người dùng và quản lý công việc.

Đây chính là nền tảng để bước sang phần tiếp theo – thiết kế cơ sở dữ liệu.

3. Thiết kế cơ sở dữ liệu

 

Từ nghiệp vụ ở trên, ta có thể rút ra hai thực thể chính: users và tasks.

Quan hệ giữa chúng là một-nhiều: một người dùng có thể có nhiều công việc.

Cấu trúc database có thể như sau:

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100) UNIQUE NOT NULL,
  password VARCHAR(255) NOT NULL
);

CREATE TABLE tasks (
  id SERIAL PRIMARY KEY,
  user_id INT REFERENCES users(id),
  title VARCHAR(255) NOT NULL,
  status BOOLEAN DEFAULT false,
  created_at TIMESTAMP DEFAULT NOW()
);

Trong đó, status sẽ là true nếu công việc đã hoàn thành và false nếu chưa.

Trước khi bắt tay vào code, nên vẽ sơ đồ ERD (Entity Relationship Diagram) để hình dung tổng thể cách dữ liệu sẽ liên kết với nhau.

4. Thiết kế API từ cơ sở dữ liệu

Sau khi có cấu trúc bảng, chúng ta bắt đầu định nghĩa các API endpoint.

Mỗi nghiệp vụ tương ứng với một hành động trong hệ thống.

Hành động

Method

Endpoint

Mô tả

Đăng ký

POST

/api/users/register

Tạo tài khoản

Đăng nhập

POST

/api/users/login

Lấy token

Lấy danh sách công việc

GET

/api/tasks

Xem toàn bộ công việc

Tạo công việc mới

POST

/api/tasks

Thêm công việc

Cập nhật công việc

PATCH

/api/tasks/:id

Đánh dấu hoàn thành

Xóa công việc

DELETE

/api/tasks/:id

Xóa công việc

Ví dụ request và response:

POST /api/tasks
Content-Type: application/json

{
  "title": "Học TypeScript"
}

Response:

{
  "id": 1,
  "title": "Học TypeScript",
  "status": false
}

Các công cụ hữu ích để mô tả và kiểm thử API là Postman hoặc Insomnia.

5. Xây dựng backend thực tế

Khi đã sẵn sàng, bạn có thể bắt đầu viết backend với một framework như ExpressJS, NestJS hoặc Laravel.

Ví dụ dưới đây minh họa cách triển khai API cơ bản bằng ExpressJS:

import express from 'express';
import bodyParser from 'body-parser';
import { Pool } from 'pg';

const app = express();
app.use(bodyParser.json());

const db = new Pool({
  connectionString: 'postgres://user:password@localhost:5432/todo'
});

// Tạo công việc mới
app.post('/api/tasks', async (req, res) => {
  const { title } = req.body;
  const result = await db.query(
    'INSERT INTO tasks (title) VALUES ($1) RETURNING *',
    [title]
  );
  res.json(result.rows[0]);
});

// Lấy danh sách công việc
app.get('/api/tasks', async (_, res) => {
  const result = await db.query('SELECT * FROM tasks ORDER BY id DESC');
  res.json(result.rows);
});

app.listen(3000, () => console.log('Server running on port 3000'));

Với vài dòng code này, bạn đã có thể tạo và lấy danh sách công việc – đúng như phần nghiệp vụ đã phân tích.

6. Từ API đến ứng dụng thực tế

Khi backend đã sẵn sàng, bạn có thể kết nối với frontend (React, NextJS, hoặc mobile app).

Frontend chỉ cần gọi đến API, không cần biết chi tiết về cơ sở dữ liệu.

Ví dụ với React:

// Gọi API để lấy danh sách công việc
const tasks = await fetch('/api/tasks').then(res => res.json());

Nhờ quy trình rõ ràng từ đầu, việc kết nối giữa các phần trong hệ thống trở nên mạch lạc và dễ mở rộng.

7. Kết luận

Một ứng dụng tốt không bắt đầu từ việc viết code, mà bắt đầu từ việc hiểu rõ ý tưởng và nghiệp vụ.

Khi bạn đi theo quy trình:

Ý tưởng → Nghiệp vụ → Database → API → Ứng dụng,

mọi thứ sẽ trở nên rõ ràng, có hệ thống và dễ bảo trì sau này.

Hãy luyện tập quy trình này với các ý tưởng nhỏ như blog cá nhân, ứng dụng ghi chú hoặc quản lý chi tiêu. Sau vài lần thực hành, bạn sẽ hình thành tư duy như một kiến trúc sư phần mềm thực thụ.