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
// 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
// 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
// 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
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!