0
0
Lập trình
TT

Kiểm Tra Thực Tế: Tại Sao AI Cần Được Giám Sát Nhân Loại

Đăng vào 6 tháng trước

• 5 phút đọc

Kiểm Tra Thực Tế: Tại Sao AI Cần Được Giám Sát Nhân Loại

Giới Thiệu

Trong thế giới phát triển phần mềm hiện đại, AI đang ngày càng trở thành một phần quan trọng trong quy trình phát triển. Tuy nhiên, một câu hỏi quan trọng đặt ra là: liệu chúng ta có nên hoàn toàn tin tưởng vào các trợ lý lập trình AI như Cursor hay không? Bài viết này sẽ khám phá những hạn chế của AI trong việc hỗ trợ lập trình và tại sao sự giám sát của con người là cần thiết.

Bối Cảnh

Gần đây, tôi đã làm việc trên một quy trình xác thực Web3 sử dụng React, wagmi, và Node.js. Mục tiêu của tôi rất đơn giản: kết nối ví → ký tin nhắn → xác minh chữ ký → nhận token JWT. Nghe có vẻ đơn giản, phải không?

Vấn Đề Xuất Hiện

Quy trình xác thực không hoạt động đúng cách. Khi người dùng nhấp vào "Ký Tin Nhắn & Đăng Nhập", API xác minh phía backend đã được gọi ngay lập tức, trước khi người dùng thực sự ký bất cứ thứ gì trong MetaMask. Điều này rõ ràng là sai.

"Giải Pháp" Của AI

Tôi đã yêu cầu trợ lý AI của Cursor sửa lỗi này. Dưới đây là những gì đã xảy ra:

Cố Gắng Đầu Tiên: Lỗi Async/Await

javascript Copy
// Giải pháp ban đầu của AI
const signature = await signMessage({ message });

AI đã giả định rằng signMessage là một hàm async và đã cố gắng chờ nó. Điều này hoàn toàn sai.

Cố Gắng Thứ Hai: Vẫn Chưa Hiểu

javascript Copy
// Cố gắng thứ hai của AI - vẫn sai
const { signMessage, isPending } = useSignMessage();
// ... sau đó
const signature = await signMessage({ message }); // Vẫn cố gắng chờ!

AI vẫn đang coi signMessage như thể nó trả về một Promise, ngay cả sau khi tôi chỉ ra rằng nó không phải là async.

Cố Gắng Thứ Ba: Cuối Cùng Hiểu Đúng Mẫu Hàm

Chỉ sau khi tôi giải thích rõ ràng rằng signMessage là một hàm từ một hook của React (không phải là một hàm async) thì AI mới thực hiện đúng mẫu:

javascript Copy
// Cài đặt đúng
const { signMessage, isPending, data: signature, error: signError } = useSignMessage();

// Sử dụng useEffect để lắng nghe khi hoàn thành chữ ký
useEffect(() => {
  if (signature && pendingNonce && address) {
    handleSignatureComplete(signature, pendingNonce, address);
  }
}, [signature, pendingNonce, address]);

// Kích hoạt ký (không chặn)
const handleSignAndLogin = async () => {
  // ... lấy nonce
  signMessage({ message }); // Điều này kích hoạt popup MetaMask
  // Không chờ điều này - nó không phải async!
};

Tại Sao Điều Này Xảy Ra

1. Nhận Diện Mẫu So Với Hiểu Biết

AI nhận diện các mẫu thông thường (async/await cho các cuộc gọi API) nhưng không hiểu mẫu hook cụ thể cho useSignMessage. Nó đã áp dụng sai mô hình tư duy.

2. Thiếu Nhận Thức Ngữ Cảnh

Ngay cả khi tôi đề cập đến "wagmi hook", AI không kết nối điều này với hành vi cụ thể của các hook React mà kích hoạt các tác dụng phụ thay vì trả về Promise.

3. Quá Tự Tin Vào Giải Pháp Ban Đầu

AI đã trình bày giải pháp đầu tiên với sự tự tin, làm cho nó có vẻ như là cách tiếp cận đúng. Điều này có thể khiến các lập trình viên tin tưởng vào giải pháp mà không nghi ngờ gì.

Giải Pháp Đúng

Dưới đây là cách quy trình xác thực nên hoạt động:

javascript Copy
const { signMessage, isPending, data: signature, error: signError } = useSignMessage();

// Lắng nghe khi hoàn thành chữ ký
useEffect(() => {
  if (signature && pendingNonce && address) {
    handleSignatureComplete(signature, pendingNonce, address);
  }
}, [signature, pendingNonce, address]);

const handleSignAndLogin = async () => {
  setLoading(true);
  try {
    // Lấy nonce từ backend
    const { data } = await axios.get('/auth/nonce');
    const { nonce } = data;

    // Lưu nonce để sử dụng sau
    setPendingNonce(nonce);

    // Tạo tin nhắn để ký
    const message = `Ký tin nhắn này để xác thực: ${nonce}`;

    // Kích hoạt ký (hiện popup MetaMask)
    signMessage({ message });

  } catch (error) {
    setLoading(false);
    // Xử lý lỗi
  }
};

const handleSignatureComplete = async (signature, nonce, address) => {
  try {
    // Xác minh chữ ký với backend
    const { data: authData } = await axios.post('/auth/verify', {
      address,
      signature,
      nonce
    });

    if (authData.success) {
      // Lưu JWT và cập nhật UI
      localStorage.setItem('authToken', authData.token);
      setUser(authData.user);
      setIsAuthenticated(true);
    }
  } catch (error) {
    // Xử lý lỗi xác minh
  } finally {
    setLoading(false);
    setPendingNonce(null);
  }
};

Kết Luận

Trợ lý AI của Cursor là một công cụ mạnh mẽ, nhưng nó không phải là một lập trình viên cấp cao. Nó có thể giúp với:

  • ✅ Tạo mã
  • ✅ Gợi ý mẫu
  • ✅ Giảm thiểu boilerplate
  • ✅ Tài liệu

Nhưng nó gặp khó khăn với:

  • ❌ Quyết định kiến trúc phức tạp
  • ❌ Các mẫu đặc thù theo miền
  • ❌ Hiểu biết sâu sắc về ngữ cảnh
  • ❌ Đưa ra các quyết định logic kinh doanh quan trọng

Điều quan trọng nhất: Sử dụng AI của Cursor như một lập trình viên junior mạnh mẽ cần giám sát liên tục, không phải là một sự thay thế cho việc hiểu mã của bạn và các công cụ của bạn.

Luôn luôn đặt câu hỏi, luôn luôn kiểm tra, và luôn luôn hiểu những gì bạn đang xây dựng. AI có thể viết mã, nhưng bạn có trách nhiệm đảm bảo rằng nó hoạt động đúng cách.


Bạn đã có những trải nghiệm tương tự với Cursor hoặc các trợ lý lập trình AI khác chưa? Chia sẻ câu chuyện của bạn ở phần bình luận bên dưới!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào