𝗔𝗜 𝗕𝘂𝗶𝗹𝘁 𝗠𝘆 𝗨𝗜 𝗶𝗻 𝟮 𝗛𝗼𝘂𝗿𝘀. 𝗧𝗵𝗲𝗻 𝗜 𝗦𝗽𝗲𝗻𝘁 𝟯 𝗪𝗲𝗲𝗸𝘀 𝗙𝗶𝘅𝗶𝗻𝗴 𝗜𝘁.
Một tác nhân AI đã xây dựng UI cho tôi chỉ trong hai giờ. Nó đã thay đổi 47 tệp. Nó tạo ra các component, các API route và một thư viện validation.
Tôi đã nghĩ nó thật đáng kinh ngạc. Tôi đã nghĩ mình tiết kiệm được một tuần làm việc.
Sáu tuần sau, tôi vẫn đang phải sửa đống code đó. Các component vẫn hoạt động, nhưng đội ngũ của tôi không thể giải thích tại sao code lại chạy được như vậy. AI đã không tuân theo các pattern của chúng tôi. Nó tự tạo ra những pattern mới. Giờ đây chúng tôi có hai cách khác nhau để làm cùng một việc và không có một chút tài liệu hướng dẫn nào.
Đây chính là vấn đề Ghost Implementation.
Bạn nhận được một đoạn code có đầy đủ khung xương nhưng lại thiếu đi phần thịt. Code vẫn biên dịch được và các bài kiểm tra (tests) đều vượt qua. Nhưng không ai biết tại sao nó lại được viết theo cách đó. AI thì thiếu ngữ cảnh, còn lập trình viên thì thiếu sự thấu hiểu.
Tôi nhận thấy ba vấn đề lớn trong công việc tư vấn của mình:
- Implementation Amnesia (Chứng mất trí triển khai): Các lập trình viên tìm đến AI ngay cả trước khi họ kịp suy nghĩ thấu đáo về các yêu cầu của hàm.
- Reviewer Blindness (Sự mù quáng của người kiểm duyệt): Các kỹ sư nhấn chấp nhận các gợi ý của AI mà không hề đọc chúng.
- Debugging Atrophy (Sự thoái hóa khả năng debug): Các lập trình viên sử dụng AI để sửa lỗi thay vì cô lập các biến. Điều này biến một lỗi sửa trong 15 phút thành một vòng xoáy không hồi kết kéo dài tới 3 tiếng đồng hồ.
Mọi người nói rằng AI xử lý phần boilerplate trong khi họ xử lý phần kiến trúc (architecture). Đây là một sai lầm. Boilerplate chính là mô liên kết của hệ thống. Khi bạn bỏ qua việc viết nó, bạn sẽ bỏ lỡ các pattern vốn là nền tảng cho kiến trúc của mình.
Chúng ta đo lường thời gian để phát hành (time to ship), nhưng chúng ta không đo lường thời gian để bảo trì (time to maintain).
Các công cụ AI được xây dựng để ưu tiên tốc độ. Chúng không được xây dựng để đảm bảo sự ổn định lâu dài. Nếu bạn chỉ đo lường tốc độ phát hành, bạn đang tạo ra một khoản nợ kỹ thuật (technical debt) khổng lồ.
Làm thế nào để giữ được sự nhạy bén khi sử dụng AI:
- Giải thích nó hai lần: Nếu bạn không thể giải thích tại sao một công cụ hoạt động mà không cần xem tài liệu, nghĩa là bạn đang có một lỗ hổng kiến thức.
- Xây dựng một dự án "ngu ngơ": Hãy code một dự án nhỏ mà không dùng AI. Hãy giữ cho các kỹ năng thủ công của bạn luôn sống động.
- Duy trì nhật ký kiến trúc: Viết ba câu cho mỗi quyết định lớn. Hãy nêu rõ bạn đã chọn gì, bạn đã từ chối cái gì và tại sao.
- Theo dõi sự phụ thuộc: Đánh giá các phiên làm việc của bạn từ 1 đến 5. Nếu bạn phụ thuộc vào AI quá nhiều, bạn đang dần mất đi lợi thế của mình.
Đừng chỉ là người phê duyệt các gợi ý của AI. Hãy là người thực sự hiểu hệ thống.
Hãy nhìn vào pull request gần nhất do AI thực hiện. Thử giải thích phần quản lý trạng thái (state management) thành tiếng. Nếu bạn không thể làm được, bạn đang gặp phải tình trạng Ghost Implementation.
AI đã thay đổi quy trình debug của bạn như thế nào? Hãy cho tôi biết ở phần bình luận nhé.
AI đã xây dựng UI cho tôi trong 2 giờ, sau đó tôi mất 3 tuần để sửa nó
Tôi đã từng nghĩ rằng AI sẽ là "viên đạn bạc" cho việc phát triển giao diện người dùng (UI). Tôi đã nhầm.
Sự ảo tưởng về tốc độ
Mọi thứ bắt đầu rất tuyệt vời. Tôi sử dụng các công cụ như v0.dev và Claude để tạo ra các component React. Chỉ với vài dòng prompt, tôi đã có được một giao diện trông cực kỳ chuyên nghiệp: các nút bấm bo góc hoàn hảo, hiệu ứng hover mượt mà và bố cục chuẩn chỉnh.
Trong vòng 2 giờ, tôi đã có một bộ UI hoàn chỉnh. Tôi cảm thấy mình như một siêu nhân, có thể xây dựng bất cứ thứ gì chỉ trong nháy mắt.
Thực tế phũ phàng
Nhưng khi tôi bắt đầu tích hợp các component này vào ứng dụng thực tế của mình, cơn ác mộng bắt đầu. Những gì trông có vẻ hoàn hảo ở cấp độ "demo" lại trở thành một mớ hỗn độn khi đưa vào môi trường production.
Tôi nhận ra rằng tốc độ mà AI mang lại chỉ là một sự đánh đổi đầy rủi ro.
Những vấn đề tôi gặp phải
Khi cố gắng kết nối các component "thần tốc" đó với logic nghiệp vụ (business logic) và dữ liệu thực, tôi đã vấp phải hàng loạt vấn đề:
- Dữ liệu bị "hardcoded" (viết cứng): AI thường tạo ra các component với dữ liệu mẫu được viết trực tiếp vào code thay vì sử dụng
propshoặcstate. Điều này khiến component trở nên vô dụng khi cần hiển thị dữ liệu động. - Thiếu khả năng tái sử dụng (Reusability): Mỗi component là một thực thể riêng biệt và rời rạc. Nếu tôi muốn thay đổi một thuộc tính thiết kế (như màu sắc chủ đạo hoặc khoảng cách padding), tôi phải đi tìm và sửa thủ công trong từng file một.
- Cấu trúc Props và State hỗn loạn: Các component nhận vào quá nhiều
propskhông cần thiết, hoặc thiếu cácpropsquan trọng để hoạt động trong một hệ thống lớn. Logic quản lý state cũng thường bị đặt sai chỗ, gây khó khăn cho việc kiểm soát luồng dữ liệu. - Vấn đề về khả năng truy cập (Accessibility - a11y): AI thường tập trung vào vẻ ngoài mà quên mất các tiêu chuẩn về khả năng truy cập. Các thẻ HTML không được sử dụng đúng ngữ nghĩa, thiếu các thuộc tính
aria-label, khiến ứng dụng không thể sử dụng được đối với những người dùng sử dụng trình đọc màn hình. - Code không tuân theo các pattern chuẩn: AI có thể viết code chạy được, nhưng nó không nhất thiết phải viết code "sạch" (clean code). Các pattern mà nó sử dụng thường không nhất quán với kiến trúc hiện tại của dự án, dẫn đến việc khó bảo trì và mở rộng.
Cái giá phải trả
Cái giá cho "2 giờ thần tốc" đó là 3 tuần làm việc liên tục để refactor lại toàn bộ hệ thống. Tôi đã phải dành hàng chục giờ đồng hồ để:
- Tách nhỏ các component quá lớn.
- Chuẩn hóa hệ thống
props. - Loại bỏ dữ liệu hardcoded và thay thế bằng dữ liệu động.
- Áp dụng các tiêu chuẩn accessibility.
- Đảm bảo code tuân thủ các nguyên tắc thiết kế của dự án.
Bài học kinh nghiệm
Trải nghiệm này đã dạy cho tôi những bài học đắt giá về việc sử dụng AI trong phát triển phần mềm:
- AI là một trợ lý (Co-pilot), không phải là phi công (Pilot): AI cực kỳ giỏi trong việc tạo ra các bản prototype hoặc các đoạn code nhỏ, rời rạc. Tuy nhiên, việc đưa chúng vào một hệ thống lớn đòi hỏi tư duy kỹ thuật và sự kiểm soát chặt chẽ của con người.
- Đừng chỉ nhìn vào vẻ ngoài: Một giao diện đẹp không có nghĩa là một component tốt. Hãy luôn kiểm tra cấu trúc dữ liệu, khả năng tái sử dụng và tính chuẩn mực của code ngay từ đầu.
- Thiết lập quy chuẩn trước khi dùng AI: Nếu bạn muốn dùng AI để viết code, hãy cung cấp cho nó các quy tắc về naming convention, design system và các pattern mà bạn đang sử dụng. Điều này sẽ giúp giảm thiểu đáng kể lượng nợ kỹ thuật (technical debt) phát sinh.
AI có thể giúp bạn chạy nhanh hơn, nhưng nếu bạn chạy sai hướng, bạn sẽ chỉ đến đích sai nhanh hơn mà thôi.