Đánh giá và tái cấu trúc code với AI

Người đánh giá kiên nhẫn nhất của bạn

Trong bài học trước, chúng ta đã tìm hiểu về test và đảm bảo chất lượng code. Giờ hãy xây dựng trên nền tảng đó. Người đánh giá code không phair là những cỗ máy. Họ cũng có các cuộc họp, hạn chót và những ngày tồi tệ. Họ chỉ lướt qua yêu cầu kéo thứ tư trong buổi sáng. Họ bỏ sót lỗi chuyển đổi kiểu dữ liệu tinh vi ẩn trong dòng 247.

Trí tuệ nhân tạo (AI) không lướt qua. Nó không có những ngày tồi tệ. Nó phát hiện ra cùng một mẫu dù đó là lần đánh giá đầu tiên trong ngày hay lần thứ một trăm.

Điều này không có nghĩa là AI thay thế người đánh giá. AI có thể xử lý các kiểm tra mang tính kỹ thuật - lỗi, vấn đề bảo mật, những mẫu hiệu suất, tính nhất quán về kiểu dáng - để người đánh giá có thể tập trung vào kiến ​​trúc, các quyết định thiết kế và logic nghiệp vụ.

Prompt đánh giá code bằng AI

Đây là cấu trúc prompt giúp nhận được những đánh giá tốt nhất:

📍 Nơi dán: Mở ChatGPT (chat.openai.com), Claude (claude.ai) hoặc Gemini (gemini.google.com) và bắt đầu một cuộc trò chuyện mới.

📋 Cách sao chép prompt này: Nhấp vào bất kỳ đâu bên trong khối màu xám, nhấn Cmd+A rồi Cmd+C (Mac) hoặc Ctrl+A rồi Ctrl+C (Windows). Hoặc sử dụng biểu tượng sao chép xuất hiện.

Xem xét code này để tạo yêu cầu kéo (pull request). Tập trung vào:
1. Lỗi và sai sót logic
2. Lỗ hổng bảo mật
3. Vấn đề về hiệu suất
4. Khả năng đọc hiểu và khả năng bảo trì

Ngữ cảnh: Đây là [mô tả chức năng của code]
trong [ngăn xếp công nghệ] của chúng tôi. Nó [là một phần của hệ thống nào].

Các quy ước hiện có để kiểm tra:
- [liệt kê các quy ước chính của nhóm bạn]

[dán code]

Đối với mỗi vấn đề, hãy chỉ rõ:
- Mức độ nghiêm trọng (nghiêm trọng/cảnh báo/đề xuất)
- Số dòng hoặc phần
- Vấn đề là gì
- Cách khắc phục

✏️ ​​Cách điền thông tin chi tiết của bạn: Thay thế mỗi [] và trình giữ chỗ trong ngoặc bằng thông tin cụ thể từ tình huống thực tế của bạn. Thông tin mơ hồ sẽ tạo ra kết quả mơ hồ — hãy cụ thể.

👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải câu trả lời cuối cùng.

📌 Nên làm gì với kết quả: Lưu phản hồi vào một file Notes. Chọn gợi ý có hiệu quả cao nhất và thực hiện nó trong tuần này — đừng cố gắng làm tất cả cùng một lúc.

⚠️ Nếu kết quả không ổn: Nếu các gợi ý có vẻ chung chung, hãy dán nội dung sau: "Hãy cụ thể hơn với ngữ cảnh thực tế của tôi. Bỏ qua những lời khuyên chung chung." Nếu nó bỏ qua các chi tiết quan trọng bạn đã cung cấp, hãy hỏi: "Bạn đã bỏ sót [X] trong ngữ cảnh của tôi — hãy thực hiện lại với điều đó làm ràng buộc chính."

Một bài đánh giá trong thực tế

Hãy xem cách hoạt động này trên code thực tế. Đây là một endpoint xác thực người dùng:

app.post('/api/login', async (req, res) => {
  const { email, password } = req.body;

  const user = await db.query(
    `SELECT * FROM users WHERE email = '${email}'`
  );

  if (user.rows.length === 0) {
    return res.status(401).json({ error: 'User not found' });
  }

  if (password === user.rows[0].password) {
    const token = jwt.sign(
      { id: user.rows[0].id, role: user.rows[0].role },
      'my-secret-key',
      { expiresIn: '24h' }
    );
    res.json({ token, user: user.rows[0] });
  } else {
    return res.status(401).json({ error: 'Wrong password' });
  }
});

AI sẽ cảnh báo nhiều vấn đề ở đây, theo thứ tự gần đúng như sau:

Nghiêm trọng: Lỗi tấn công SQL Injection (Dòng 5) Địa chỉ email được chèn trực tiếp vào truy vấn SQL. Kẻ tấn công có thể gửi ' OR 1=1 --' làm email. Khắc phục: Sử dụng truy vấn tham số hóa.

Nghiêm trọng: So sánh mật khẩu dạng plain text (Dòng 11) Mật khẩu được so sánh dưới dạng plain text, nghĩa là chúng được lưu trữ mà không được mã hóa trong cơ sở dữ liệu. Khắc phục: Sử dụng bcrypt.compare().

Nghiêm trọng: JWT secret được hardcode (Dòng 13) Key bí mật nằm trong code nguồn. Khắc phục: Sử dụng biến môi trường.

Cảnh báo: Thông báo lỗi khác nhau cho email không hợp lệ với mật khẩu (Dòng 9, 17) Điều này làm rò rỉ thông tin — kẻ tấn công có thể liệt kê các email hợp lệ. Khắc phục: Sử dụng cùng một thông báo cho cả hai: "Thông tin đăng nhập không hợp lệ."

Cảnh báo: Trả về toàn bộ đối tượng người dùng (Dòng 16) user.rows[0] có thể bao gồm hash mật khẩu và các trường nhạy cảm khác. Khắc phục: Chỉ chọn các trường cần thiết hoặc làm sạch trước khi trả về.

Gợi ý: Không có xác thực đầu vào (Dòng 2) Email và mật khẩu được sử dụng mà không có xác thực. Thêm xác thực đầu vào trước khi truy vấn cơ sở dữ liệu.

Đó là 6 vấn đề, 3 trong số đó là các lỗ hổng bảo mật nghiêm trọng. Một người đánh giá mệt mỏi có thể phát hiện ra một số lỗi này. AI phát hiện ra tất cả, mọi lúc.

Đánh giá tập trung

Đôi khi bạn không cần đánh giá tổng quát - bạn cần tập trung cụ thể:

Đánh giá tập trung vào bảo mật

Xem xét code này cụ thể về các lỗ hổng bảo mật.
Kiểm tra:
- Các cuộc tấn công Injection (SQL, XSS, chèn lệnh)
- Vượt qua xác thực/ủy quyền
- Lộ dữ liệu nhạy cảm
- Thiếu xác thực đầu vào
- Các thực hành mã hóa không an toàn

Đánh giá tập trung vào hiệu suất

Xem xét code này về các vấn đề hiệu suất.
Kiểm tra:
- Mẫu truy vấn N+1
- Cấp phát bộ nhớ không cần thiết
- Thiếu chỉ mục cơ sở dữ liệu (dựa trên mẫu truy vấn)
- Cơ hội để lưu vào cache
- Các thao tác chặn trong ngữ cảnh bất đồng bộ

Đánh giá tập trung vào khả năng đọc hiểu

Xem xét code này về khả năng đọc hiểu và khả năng bảo trì.
Kiểm tra:
- Tên biến/hàm không rõ ràng
- Hàm thực hiện quá nhiều việc
- Thiếu hoặc chú thích gây hiểu nhầm
- Logic điều kiện phức tạp có thể được đơn giản hóa
- Các mẫu không nhất quán so với phần còn lại của codebase

Mỗi lĩnh vực trọng tâm sẽ cung cấp cho bạn phản hồi sâu sắc hơn, phù hợp hơn so với một câu hỏi chung chung "xem xét code này".

Kiểm tra nhanh: AI sẽ báo lỗi gì?

Hãy xem code này. AI sẽ phát hiện ra những lỗi gì?

def process_order(order):
    total = 0
    for item in order['items']:
        total += item['price'] * item['qty']
    if total > 100:
        total = total * 0.9  # 10% discount
    order['total'] = total
    send_email(order['email'], f"Your order total: ${total}")
    charge_payment(order['payment_info'], total)
    save_to_database(order)
    return {'status': 'success'}

AI có thể sẽ cảnh báo: Không xử lý lỗi (điều gì sẽ xảy ra nếu thanh toán thất bại sau khi gửi email?), thay đổi từ điển đơn hàng đầu vào, không xác thực cấu trúc đơn hàng, các vấn đề tiềm ẩn về số thập phân với tiền tệ, logic giảm giá được hardcode, và những thao tác email/thanh toán/lưu nên nằm trong một giao dịch.

Tái cấu trúc code có sự hỗ trợ của AI

Tái cấu trúc code là nơi AI thực sự phát huy tác dụng. Quy trình:

Bước 1: Đánh giá code

Đây là một hàm đã dài đến 200 dòng và đảm nhiệm
quá nhiều trách nhiệm. Xác định các vấn đề riêng biệt
và đề xuất cách chia nhỏ nó.

[dán hàm dài]

AI sẽ vạch ra các trách nhiệm: Xác thực, logic nghiệp vụ, thao tác cơ sở dữ liệu, thông báo, xử lý lỗi. Nó sẽ đề xuất cách tách chúng ra.

Bước 2: Lập kế hoạch tái cấu trúc

Dựa trên phân tích của bạn, hãy tạo một kế hoạch tái cấu trúc.
Đối với mỗi bước:
1. Thay đổi cần thực hiện
2. Thêm/sửa đổi những bài kiểm tra nào
3. Làm thế nào để xác minh không có gì bị lỗi

Hàm hiện tại có các bài kiểm tra sau:
[dán những bài kiểm tra hiện có]

Bước 3: Thực hiện từng bước

Đừng chỉnh sửa lại toàn bộ cùng một lúc. Tách từng vấn đề một:

Bước chỉnh sửa 1: Tách logic kiểm tra từ
processOrder thành một hàm validateOrder riêng biệt.

Đây là code hiện tại:
[dán trạng thái hiện tại]

Yêu cầu:
- Hàm mới phải đưa ra lỗi có mô tả rõ ràng
- Các bài kiểm tra hiện có vẫn phải đạt
- Thêm các bài kiểm tra mới cho hàm được tách ra

Sau mỗi bước, hãy chạy các bài kiểm tra của bạn. Xác minh. Sau đó chuyển sang bước tách tiếp theo.

Bước 4: Xác minh việc chỉnh sửa

Sau khi hoàn tất tất cả các bước:

Đây là hàm gốc và phiên bản đã được chỉnh sửa. Xác minh rằng:
1. Tất cả các hành vi ban đầu được giữ nguyên
2. Không có trường hợp ngoại lệ nào bị mất trong quá trình tái cấu trúc
3. Xử lý lỗi tương đương hoặc tốt hơn

Bản gốc:
[dán bản gốc]

Bản tái cấu trúc:
[dán phiên bản đã tái cấu trúc]

Các mẫu tái cấu trúc phổ biến mà AI xử lý tốt

Trích xuất phương thức: AI xác định các ranh giới tự nhiên trong những hàm dài và trích xuất chúng thành các hàm trợ giúp được đặt tên rõ ràng.

Thay thế điều kiện bằng đa hình: Khi bạn có một chuỗi switch/case hoặc if/else lớn, AI có thể đề xuất một chiến lược hoặc factory pattern.

Đơn giản hóa các điều kiện phức tạp:

// Trước đó (AI nhận định đoạn này khó đọc)
if (user.role === 'admin' || (user.role === 'manager'
    && user.department === dept && !user.suspended))

// Sau (AI đề xuất phương pháp trích xuất)
const canAccess = isAdmin(user) || isActiveDeptManager(user, dept)

Loại bỏ trùng lặp: Dán hai hàm tương tự và yêu cầu AI xác định logic chung và tạo ra một sự trừu tượng chung.

Xây dựng danh sách kiểm tra đánh giá

Theo thời gian, bạn sẽ phát triển các mẫu cho những gì AI phát hiện tốt trong codebase của bạn. Xây dựng một danh sách kiểm tra có thể tái sử dụng:

Xem xét PR này dựa trên danh sách kiểm tra tiêu chuẩn của chúng tôi:

[ ] Không có lỗ hổng SQL injection hoặc XSS
[ ] Xử lý lỗi bao gồm tất cả các chế độ lỗi
[ ] Có xác thực đầu vào cho tất cả các đầu vào bên ngoài
[ ] Không có bí mật hoặc thông tin đăng nhập được hardcode
[ ] Các truy vấn cơ sở dữ liệu được tối ưu hóa (không có N+1)
[ ] Nhất quán với các mẫu code hiện có
[ ] Các hàm dưới 50 dòng
[ ] Code mới có các bài kiểm tra tương ứng
[ ] Không có bình luận TODO hoặc FIXME mà không có ticket
[ ] Có nhật ký để gỡ lỗi các sự cố sản xuất

[dán sự khác biệt của PR]

AI sẽ kiểm tra từng mục và gắn cờ bất kỳ vi phạm nào.

Những điểm chính cần ghi nhớ

  • AI liên tục phát hiện các vấn đề về mặt kỹ thuật - lỗi bảo mật, mô hình hiệu suất, vi phạm quy tắc về kiểu dáng
  • Các đánh giá tập trung (bảo mật, hiệu suất, khả năng đọc hiểu) cung cấp phản hồi sâu sắc hơn, có thể hành động được
  • Sử dụng đánh giá của AI trước khi đánh giá của con người để phát hiện các vấn đề rõ ràng trước tiên
  • Tái cấu trúc từng bước: đánh giá, lập kế hoạch, thực hiện từng bước, xác minh
  • Xây dựng danh sách kiểm tra đánh giá có thể tái sử dụng cho các tiêu chuẩn của nhóm bạn
  • Người đánh giá nên tập trung vào kiến ​​trúc, thiết kế và logic nghiệp vụ
  • Câu 1:

    Cách tiếp cận an toàn nhất đối với việc tái cấu trúc code có sự hỗ trợ của AI là gì?

    GIẢI THÍCH:

    Tái cấu trúc theo từng bước nhỏ, tăng dần và xác minh sau mỗi bước là cách tiếp cận an toàn nhất. Việc tái cấu trúc lớn sẽ đưa ra quá nhiều thay đổi để xác minh cùng một lúc, và ngay cả AI cũng có thể gây ra những lỗi nhỏ trong quá trình tái cấu trúc.

  • Câu 2:

    Khi yêu cầu AI đánh giá code, điều gì tạo ra phản hồi tốt nhất?

    GIẢI THÍCH:

    Các yêu cầu đánh giá tập trung tạo ra kết quả tốt hơn. Yêu cầu AI tập trung vào bảo mật, hiệu suất hoặc khả năng đọc hiểu sẽ cung cấp phản hồi có mục tiêu, có thể hành động thay vì các nhận xét chung chung.

  • Câu 3:

    Điều gì làm cho việc đánh giá code bằng AI khác với đánh giá code do con người?

    GIẢI THÍCH:

    Ưu điểm của AI trong việc đánh giá code là tính nhất quán và không mệt mỏi — nó luôn phát hiện ra các mẫu giống nhau và không vội vàng trong quá trình đánh giá chỉ vì đã 5 giờ chiều thứ Sáu. Con người vẫn giỏi hơn trong việc hiểu ý định và logic kinh doanh.

Thứ Tư, 10/06/2026 13:48
51 👨
Xác thực tài khoản!

Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:

Số điện thoại chưa đúng định dạng!
Số điện thoại này đã được xác thực!
Bạn có thể dùng Sđt này đăng nhập tại đây!
Lỗi gửi SMS, liên hệ Admin
0 Bình luận
Sắp xếp theo