Trong vài tuần qua, tôi đã cùng những người quen không phải lập trình viên (luật sư, marketer, PM, v.v.) thử làm khoảng năm sáu ứng dụng đơn giản bằng vibe coding
- Bảng điều khiển raid cho guild WoW (web)
- Trình mô phỏng đua xe cho sự kiện rút thăm trúng thưởng (web + Three.js)
- Công cụ hỗ trợ giao tiếp giữa biên tập viên video và người đặt yêu cầu (Chrome Extension)
- Bộ hẹn giờ tự động giúp đặt số vòng lặp, tập trung trong một khoảng thời gian nhất định và sau đó tổng kết lại (ứng dụng desktop Electron)
Tôi đã tổng hợp quá trình này thành “hướng dẫn nhập môn vibe coding cho người không phải lập trình viên” gồm 5 bước
- Nắm được AI hiện nay có thể làm tới đâu
- Xác định rõ vấn đề muốn giải quyết và sản phẩm muốn tạo ra
- Nhanh chóng và thường xuyên tự mắt kiểm tra cách sản phẩm vận hành
- Trao đổi và viết prompt để AI có thể code tốt
- Nhận biết hành vi bất thường và điểm cần cải thiện, rồi cải tiến và hoàn thiện
1) Nắm được AI hiện nay có thể làm tới đâu
Với những ai không phải lập trình viên mới tiếp cận vibe coding, tôi khuyên nên bắt đầu bằng các hoạt động như sau
- Tự mình trải nghiệm để cảm nhận hiệu quả, rằng chỉ với một prompt ngắn trong LLM hoặc các dịch vụ AI prototyping cũng có thể tạo ra một thứ gì đó hoạt động được
- Đăng ký theo dõi một vài tài khoản SNS và newsletter chuyên tổng hợp thông tin AI mới nhất
- Đừng tham vọng tiêu hóa mọi thông tin và công cụ AI; hãy chỉ quan tâm và thử nhanh những công cụ thuộc các chủ đề mà mình thực sự hứng thú
2) Xác định rõ vấn đề muốn giải quyết và sản phẩm muốn tạo ra
- Dù đã nhận thức được năng lực của AI, nếu chưa định nghĩa vấn đề rõ ràng thì vẫn không thể tạo ra sản phẩm
- Vì vậy trước tiên bản thân phải trở nên sắc bén hơn thông qua những câu hỏi giúp nâng cao năng lực tự nhận thức
- Sử dụng ứng dụng metacognition được tạo bằng vibe coding
- Bạn muốn làm gì?
- Vì sao bạn muốn làm điều đó? Bạn đang cố giải quyết vấn đề gì?
- Ai là người gặp vấn đề đó?
- Họ gặp vấn đề ấy trong tình huống nào?
- Trong tình huống đó hiện họ đang dùng giải pháp tạm thời/thay thế nào?
- Làm sao để xác nhận rằng 1 giải quyết vấn đề tốt hơn 5?
- Làm sao để họ sẵn sàng dùng 1 thay vì 5?
- Khi đã sắp xếp rõ thứ mình muốn tạo, tôi đưa “prompt tạo PRD” do ứng dụng trên sinh ra vào LLM để nó tạo PRD
3) Nhanh chóng và thường xuyên tự mắt kiểm tra cách sản phẩm vận hành
- Ưu điểm lớn nhất của vibe coding là có được một “ứng dụng đang chạy” ở giai đoạn rất sớm. Điều này cũng cực kỳ quan trọng để tạo động lực cho người không phải lập trình viên
- Theo nghĩa đó, tôi không mấy khuyến khích người không phải lập trình viên bắt đầu vibe coding bằng Cursor, vì có quá nhiều chướng ngại lớn nhỏ phải vượt qua trước khi chạy được app
- Thay vào đó, tôi cho rằng các dịch vụ như Lovable, nơi chỉ cần đưa PRD là có thể tạo ra ngay một prototype chạy được, là điểm khởi đầu tốt hơn. Cũng có thể tạo public link ngay nên rất tiện để cho người quen xem và nhận phản hồi
- Tuy nhiên, nếu ứng dụng bạn muốn làm không phải web-based thì mọi thứ sẽ phức tạp hơn một chút, vì các công cụ prototyping thường tạo web app
- Lúc này sẽ cần các quyết định kỹ thuật và thiết lập môi trường thực thi, tức là cả bạn lẫn AI đều phải trở nên hiểu biết hơn
4) Trao đổi và viết prompt để AI có thể code tốt
- Tôi và AI cùng trở nên hiểu biết hơn <-> viết prompt tốt hơn <-> kết quả ra nhanh hơn, tốt hơn
- Prompt càng tốt thì số lần ping-pong để đạt mục tiêu (= thời gian và tiền bạc) càng giảm
- Nếu xem các hướng dẫn prompt engineering khác nhau, điểm chung thường được nhắc tới là phải định nghĩa rõ Role, Context và Task trong prompt
Vai trò, ngữ cảnh, tác vụ
- Trong vibe coding, “vai trò” không quá quan trọng
- Vì trong các coding agent thường đã có sẵn vai trò phù hợp, thêm vào có thể làm mọi thứ rối hơn
- Và có lẽ vì coding là benchmark quan trọng, nên LLM vẫn code tốt ngay cả khi không gán vai trò
- Tất nhiên, nếu ứng dụng bạn muốn làm có tính đặc thù, thì việc đưa ra một vai trò phù hợp vẫn là điều tốt
- “Ngữ cảnh” thì nếu đã làm PRD tốt là đủ
- “Tác vụ” là việc xác định rõ mục tiêu và tiêu chí hoàn thành. Tiêu chí hoàn thành có thể
- Được nêu rõ ngay trong prompt (few-shot prompting)
- Được định nghĩa trong file hoặc code bên ngoài (
TODOs.mdhay test code) - Chỉ tồn tại trong đầu bạn (kiểu này không hay lắm)
- Mục tiêu cuối cùng của vibe coding là chỉ dẫn để AI code tốt và nhanh chóng tạo ra một ứng dụng vận hành đúng theo PRD. Để làm được điều đó, nên đặt ra 3 mục tiêu trung gian
- Tôi trở nên hiểu biết hơn
- AI trở nên hiểu biết hơn
- Tính năng hoạt động đúng theo đặc tả
Tôi trở nên hiểu biết hơn?
- Nếu bạn không phải lập trình viên, hoặc domain còn xa lạ, hoặc tech stack chưa quen, thì rất khó đưa ra chỉ dẫn bằng thuật ngữ chính xác
- Trong trường hợp đó, hãy cho LLM biết mình còn thiếu và học từ nó
- “(đưa ảnh chụp màn hình) Những game như thế này thường được làm bằng gì?”
- “Tôi định làm thứ như thế này, nếu là bạn thì sẽ thu thập dữ liệu thế nào?”
- “Nếu muốn kiểm tra nhanh nhất các hành vi cốt lõi của native app thì nên dùng công nghệ nào?”
- Hãy quan sát xem qua những câu hỏi như vậy, mình có đang thay đổi theo hướng này không
- Từ khóa kỹ thuật: Tôi đang dùng đúng thuật ngữ kỹ thuật/thuật ngữ domain
- Luồng dữ liệu: Tôi có thể giải thích dữ liệu cho tính năng cốt lõi của app được lấy ra sao, xử lý thế nào và hiển thị thế nào
- Môi trường thực thi: Tôi đã chuẩn bị được môi trường để chạy đoạn code AI viết ra và tự mắt xác nhận nó có hoạt động hay không
- Lý tưởng nhất là giải quyết hết các unknown unknown rồi mới viết PRD và bắt tay vào code, nhưng không nhất thiết phải vậy
- Vì chỉ khi bắt đầu code mới học được nhiều điều, và nếu cần thì cứ làm lại từ đầu. (Có khi còn nhanh hơn sửa thứ đã có sẵn)
AI trở nên hiểu biết hơn?
- Đó là việc truyền cho AI các từ khóa kỹ thuật hoặc luồng dữ liệu đã nắm được thông qua system prompt (như Cursor Rules)
- Nếu muốn giảm số lần mình phải can thiệp và khiến code AI viết ra hợp ý hơn, thì về cơ bản cần hai thứ: hướng dẫn về ràng buộc và hướng dẫn về tài liệu hóa
- Hướng dẫn về ràng buộc giúp AI viết code nhất quán hơn. Ví dụ:
- Tech stack: dùng NextJS app router, style bằng Tailwind và ShadCN, chỉ dùng icon của Lucid, thanh toán dùng Stripe, v.v.
- Cấu trúc và pattern: tổ chức thư mục như thế này, đặt tên file như thế kia, UI style theo kiểu Material, v.v.
- Định dạng đầu ra (theo môi trường thực thi): sẽ dùng Electron Fiddle nên hãy đưa 4 file phù hợp với nó, sẽ dùng CodePen nên hãy đưa riêng HTML, CSS, JS, v.v.
- Hướng dẫn về tài liệu hóa giúp tăng khả năng tập trung và ghi nhớ của AI. Có hai ý tưởng đặc biệt hữu ích
- Memory Bank của Cline: định nghĩa workflow làm việc bằng cách ghi lại việc đã làm và việc cần làm vào file
- Prompt Context của Kang Dong-yoon: thay vì để một chỉ dẫn dài ở thư mục gốc cho toàn bộ project, tạo chỉ dẫn riêng theo từng thư mục
- Memory Bank đặc biệt đáng khuyên cho người không phải lập trình viên, vì nó giúp quan sát và học xem hiện đang có chuyện gì xảy ra dễ hơn
Tính năng hoạt động đúng theo đặc tả?
- Đây là chiến lược prompting ở cấp độ chat (trong coding agent), không phải ở cấp độ toàn dự án
- Tôi cho rằng chiến lược tốt nhất để làm cho tính năng hoạt động đúng theo đặc tả là test pass thì commit
- “Hãy triển khai X. Viết test trước, rồi code, sau đó chạy test, và tiếp tục sửa code cho đến khi test pass.”
- Điều này khả thi vì coding agent có quyền và khả năng viết test code, chạy nó trong terminal và đọc kết quả
- Sau khi test pass, chỉ cần nhận gợi ý commit message rồi commit cả test code lẫn feature code cùng nhau. Tôi tự commit, nhưng agent cũng có thể auto-commit
- Không chỉ unit test, AI còn có thể viết, chạy và tự sửa cả integration test lẫn E2E test (tham khảo: Tự động hóa test với Cursor + Playwright)
- Tất cả những điều này là chiến lược giúp cả vibe coder lẫn AI dễ xác nhận hơn rằng “từng tính năng riêng lẻ có được triển khai đúng theo đặc tả không, và toàn bộ app có hoạt động đúng theo PRD không”
5) Nhận biết hành vi bất thường và điểm cần cải thiện, rồi cải tiến và hoàn thiện
- Theo tôi, vibe coding rất xa với kiểu “bấm một cái là xong”, và còn rất nhiều thứ phải học
- Trong số đó, để vượt qua mức “prototype nhỏ của riêng mình” và tạo ra một ứng dụng đạt chuẩn sản phẩm thương mại với tư cách solo founder, có 3 năng lực tôi cho là thiết yếu: năng lực nhận biết, năng lực coding và năng lực product engineering
Năng lực nhận biết
- Là khả năng nhạy bén nhận ra những màn hình hoặc tính năng đang hoạt động khác với PRD (hoặc ý định ban đầu của mình)
- Nếu thiếu điều này thì sẽ cực kỳ khó phát hiện lỗi của AI và yêu cầu nó sửa lại
- “Test” ở bước 4 vừa giúp giảm lỗi của AI ngay từ đầu, vừa giúp nâng cao năng lực của chính tôi
- Vì khi đọc quá trình AI chuyển đặc tả thành test code, ta có thể học được rằng không chỉ “cần tính năng này”, mà còn là “để hoàn thành việc triển khai tính năng này thì cần những điều kiện nào”
- Tuy nhiên, “ứng dụng được triển khai đúng theo đặc tả” và “ứng dụng tốt” là hai chuyện khác nhau. Vì vậy, khả năng tìm ra điểm cải thiện, tức “product sense”, là rất quan trọng (chi tiết hơn hãy xem newsletter của Lenny ở link trên)
Năng lực coding
- Ít nhất cho đến hiện tại, dù có chia nhỏ công việc tốt đến đâu để giao cho AI, vẫn luôn có khoảng tối thiểu 5% cần tự tay sửa code để chốt sản phẩm
- Vì không làm được điều này nên trên SNS có vô số ứng dụng mắc kẹt ở mức 80% và không thể ra mắt
- Tất nhiên, tỷ lệ này có thể thay đổi tùy ứng dụng bạn muốn làm, và việc triển khai hoàn toàn bằng AI tới cùng không phải là bất khả thi, nhưng quá kém hiệu quả
- Thay vì phó mặc hoàn toàn cho vibe, tôi khuyên nên vừa xem các tài liệu do AI tạo ra (thông qua Memory Bank, test code, v.v.) vừa học cả việc coding. Cũng nên nhận coaching từ lập trình viên
- Đặc biệt, sẽ rất hiệu quả nếu học về backend — phần ít nhìn thấy hơn — như xác thực người dùng, tích hợp API bên ngoài, nhập xuất dữ liệu, thanh toán, v.v., cũng như chiến lược triển khai như main branch và feature branch, quản lý biến môi trường, v.v.
Năng lực product engineering
- Ra mắt ứng dụng không phải là kết thúc mà là khởi đầu. Nếu muốn làm bài bản, cần hiểu toàn bộ vòng đời phát triển sản phẩm
- Nhận diện vấn đề, tìm ý tưởng giải quyết, lập kế hoạch, thiết kế, triển khai, kiểm thử, phát hành, quảng bá, giám sát lỗi, thu thập phản hồi, vận hành...
- Dù không cần đi sâu vào tất cả các giai đoạn này, ít nhất cũng nên biết ở mỗi giai đoạn người ta làm gì và dùng những từ khóa nào
- Có như vậy bạn mới có thể học những điều mình chưa biết, và khi một mình không gánh nổi thì cũng nhận ra được năng lực của những đồng đội phù hợp để cùng làm
Lời kết
- Dùng vibe coding để tạo ra một ứng dụng đạt chuẩn sản phẩm thương mại tuyệt đối không phải việc dễ. Tuy vậy, không ai có thể phủ nhận rằng việc “bắt đầu” giờ đây đã dễ hơn bao giờ hết
- Khi thấy những người quen của tôi vui sướng thốt lên (“Wow, mình đang code thật này!”) lúc chứng kiến ý tưởng nhỏ của chính họ trở nên sống động, tôi cũng cảm thấy vô cùng hạnh phúc
- Tôi khuyên những người không phải lập trình viên khác đang đọc bài này cũng hãy nhân cơ hội này thử vui vẻ trở thành một “maker”
- Nếu tận dụng chuyên môn domain của riêng mình để tạo ra một công cụ nhỏ, nhanh và hữu ích có thể giải quyết xuất sắc một vấn đề cụ thể bằng vibe coding, thì tôi tin rằng trong kỷ nguyên AI bạn vẫn hoàn toàn có thể có sức cạnh tranh
7 bình luận
Wow~ tôi cứ nghĩ vibe coding chỉ là ảo tưởng,
nhưng lâu lắm rồi tôi mới thấy một bài viết được viết chuyên môn đến vậy.
Tôi đã đọc rất thú vị.
Cảm ơn! Tôi thấy tiềm năng rất lớn haha
À;; giờ nhìn lại thì thấy bình luận của mình hơi kỳ.
Có lẽ đúng hơn là cảm giác kiểu như vẫn còn xa mới tới được mức đó, hơn là gọi nó là ảo tưởng.
Cuối cùng thì mình cảm thấy vibe coding vẫn có giới hạn, và nếu không có kiến thức về phát triển phần mềm thì sẽ khá khó.
Tất nhiên, mình nghĩ khi AI phát triển hơn thì sau này mọi thứ sẽ tốt lên rất nhiều.
Mình viết thêm một bình luận trả lời dài dòng vì sợ bình luận của mình sẽ bị hiểu thành là vibe coding vô nghĩa.
Mình cũng dùng vibe coding khá nhiều mà haha
À không phải vậy đâu. haha, tôi cũng hiểu sắc thái mà bạn nói.
Vì vậy, như tôi đã viết trong bài, cái mà tôi gọi là vibe coding khá xa với kiểu
tách cái là xong, và tôi nghĩ rằng để nâng trình độ lên thì kỹ sư phải bỏ ra rất nhiều công sức.Tôi luôn đọc rất kỹ.
Cảm ơn!
Mình cũng đã làm video trên YouTube rồi haha https://www.youtube.com/watch?v=ecY5VBpruOA