Chọn Bộ Công Nghệ: Điểm Qua Các Ngôn Ngữ
Khi bạn chỉ đạo một AI xây dựng phần mềm, ngôn ngữ bạn chọn vẫn quan trọng — rất quan trọng. AI viết code, nhưng bạn phải sống chung với hậu quả: bạn ra mắt sản phẩm nhanh đến đâu, triển khai dễ dàng ra sao, và bạn va phải bức tường thường xuyên thế nào. Tin tốt là bạn không cần phải thành thạo bất kỳ ngôn ngữ nào trong số này. Bạn chỉ cần biết đủ để đưa ra một lựa chọn hợp lý và nhận ra khi nào AI đang dẫn bạn vào chỗ khó khăn.
Chương này sẽ đi qua các ngôn ngữ đáng quan tâm, mỗi ngôn ngữ thực sự giỏi ở điểm nào, chúng gây khó chịu ở đâu, và — điều quan trọng nhất đối với vibe coding — các trợ lý AI xử lý chúng tốt đến mức nào. Chúng ta sẽ kết thúc bằng một hướng dẫn cực kỳ đơn giản để chọn theo mục tiêu.
Một lưu ý trước khi bắt đầu: các trợ lý AI giỏi hơn nhiều với những ngôn ngữ phổ biến có hàng núi mã nguồn công khai so với những ngôn ngữ ít người dùng. Đây không phải là hiệu ứng nhỏ. Đó thường là yếu tố lớn nhất quyết định dự án của bạn có suôn sẻ hay không. Sự phổ biến là một lợi thế. Khi một ngôn ngữ và các chính của nó xuất hiện hàng triệu lần trong các kho mã nguồn công khai, AI đã thấy mọi khuôn mẫu thông thường, mọi lỗi điển hình, và mọi cách sửa theo đúng phong cách ngôn ngữ đó. Khi chúng không xuất hiện nhiều, bạn phải trả giá cho sự khan hiếm đó bằng những lần thử thất bại và những câu trả lời nghe có vẻ tự tin nhưng vô nghĩa.
Trước khi đi vào tên các ngôn ngữ, có một hình ảnh đáng ghi nhớ: đoạn code bạn viết không bao giờ là thứ máy tính thực sự chạy. Có một thứ ở giữa biến văn bản của bạn thành phần mềm đang chạy — hoặc là một trình biên dịch (compiler, dịch toàn bộ trước thành một file bạn chạy sau) hoặc một trình thông dịch (interpreter, đọc và chạy từng dòng một). Ngôn ngữ bạn chọn quyết định bạn đi theo hướng nào.
YOU THE MIDDLE THE MACHINE
┌────────┐ ┌──────────┐
│ source │──┬──▶ COMPILER ──▶ binary file ──────▶ │ runs on │
│ code │ │ (Go, Rust) (one file) │ CPU │
│ (text) │ │ │ │
└────────┘ └──▶ INTERPRETER ──reads line ──────▶ │ prints │
(Python, JS) by line │ output │
└──────────┘
compiled = translate first, run later
interpreted = translate while running
