Think Like a Developer #3: Abstraction - "Bỏ bớt đi, giữ lại cái quan trọng"
Bạn mô tả app cho AI trong 500 chữ. AI làm sai. Người khác mô tả trong 50 chữ. AI làm đúng. Tại sao?
Chuyện này mình thấy hoài. Một bạn gửi prompt cho AI kiểu này:
"Tôi muốn tạo một trang web bán hàng online. Trang chủ có banner lớn ở trên cùng, bên dưới là 3 hàng sản phẩm mỗi hàng 4 cái, mỗi sản phẩm có ảnh vuông 300x300, tên sản phẩm font size 16px bold, giá bên dưới màu đỏ, nút thêm giỏ hàng màu xanh lá border radius 8px. Khi click vào sản phẩm thì mở trang chi tiết, trang chi tiết có ảnh lớn bên trái chiếm 60% width, thông tin bên phải 40%, phần mô tả dùng tab để chia thành mô tả, đánh giá, và chính sách đổi trả..."
Prompt dài 500 chữ. Chi tiết đến từng pixel. Rồi AI generate ra cái gì đó. Chạy thử thì sai bét. Layout vỡ. Responsive hỏng. Logic lộn xộn. Bạn ấy sửa đi sửa lại, càng sửa càng rối.
Trong khi đó, một người khác chỉ viết: "Tạo trang e-commerce đơn giản: trang chủ hiển thị danh sách sản phẩm dạng grid, click vào xem chi tiết, có nút thêm vào giỏ hàng."
50 chữ. AI làm ra đúng y chang cái cần. Clean. Chạy được. Sửa tiếp cũng dễ.
Chuyện gì vừa xảy ra?
Abstraction: Nói cái WHAT, bỏ cái HOW
Đây là kỹ năng mà developer nào cũng biết nhưng ít khi gọi tên: Abstraction.
Abstraction là khả năng bỏ bớt chi tiết không cần thiết, chỉ giữ lại cái quan trọng ở đúng thời điểm.
Nghe trừu tượng đúng không? Để mình lấy ví dụ đời thường.
Bạn mở app Grab. Bạn gõ: "Điểm đón: nhà tôi. Điểm đến: sân bay." Bấm đặt xe. Xong.
Bạn có nói với Grab "rẽ trái ở ngã tư đầu tiên, đi thẳng 200m, vòng qua cầu, rẽ phải vào đường cao tốc" không? Không. Bạn chỉ nói điểm A và điểm B. Grab (và tài xế) tự tìm đường.
Đó là abstraction. Bạn nói CÁI GÌ bạn muốn (đi từ A đến B), không nói LÀM THẾ NÀO để đến đó (rẽ trái, rẽ phải, đường nào).
Khi bạn giao việc cho AI cũng y chang vậy. Bạn nói cái gì bạn muốn. AI tự tìm cách làm. Bạn càng chỉ dẫn cách làm chi tiết, AI càng dễ bị kẹt trong đống chi tiết đó và quên mất bức tranh tổng thể.
Tại sao chi tiết quá lại phản tác dụng?
Có 3 lý do:
Bạn chưa chắc chi tiết đó đúng. Khi bạn nói "font size 16px bold, border radius 8px", bạn đang quyết định những thứ mà bạn chưa biết có hợp lý không. Có thể trên mobile nó xấu. Có thể nó conflict với layout khác. Bạn đang ra quyết định design mà chưa có context.
AI bị "nhìn cây quên rừng". Khi prompt quá nhiều chi tiết, AI tập trung vào từng chi tiết nhỏ mà quên mất tổng thể. Nó sẽ cố nhét đúng 300x300 pixel, đúng 3 hàng 4 cột, nhưng lại quên responsive, quên accessibility, quên cả flow người dùng.
Bạn mất quyền linh hoạt. Nếu AI làm theo chính xác 500 chữ mô tả của bạn, nhưng kết quả nhìn xấu, bạn phải viết lại 500 chữ khác. Thay vì chỉ nói "đổi layout thành 2 cột".
Ví dụ đời thường: Nhờ người nấu bữa tối
Tưởng tượng bạn nhờ bạn mình nấu bữa tối.
Cách 1 (quá chi tiết): "Mua 300g thịt bò Úc ở siêu thị Vinmart, cắt miếng vuông 2cm, ướp 1 muỗng canh nước mắm, nửa muỗng cà phê đường, 1 tép tỏi băm, để 30 phút. Phi hành với 2 muỗng canh dầu ăn ở lửa vừa, cho thịt vào xào 3 phút, thêm rau cải, đảo đều 2 phút..."
Bạn nhờ 1 người nấu giỏi mà chỉ dẫn như robot. Nếu Vinmart hết thịt bò Úc thì sao? Nếu không có rau cải thì sao? Nếu người ta có cách nấu ngon hơn thì sao? Bạn đã khóa hết mọi khả năng sáng tạo của họ.
Cách 2 (đúng level): "Nấu giúp mình bữa tối cho 2 người. Món mặn có thịt bò. Không cần quá cầu kỳ."
Người nấu giỏi sẽ biết phải làm gì. Họ tự chọn cách nấu phù hợp với nguyên liệu có sẵn, tự điều chỉnh gia vị, và có thể làm ra món ngon hơn cả khi bạn chỉ dẫn từng bước.
AI cũng vậy. Nó được train trên hàng triệu project. Nó biết best practice. Nó biết layout nào hợp lý. Bạn chỉ cần nói cái gì bạn muốn, để nó tự tìm cách tốt nhất.
Kỹ thuật "3 tầng abstraction" cho prompt
Đây là công thức mà mình dùng hàng ngày khi làm việc với AI. Mỗi khi viết prompt, mình nghĩ theo 3 tầng:
Tầng 1: Mục tiêu (Goal) - cái bạn muốn đạt được Tầng 2: Tính năng (Features) - những phần cần có Tầng 3: Chi tiết (Details) - chỉ thêm khi cần thiết
Quan trọng: Bạn bắt đầu từ tầng 1. Chỉ xuống tầng 2 khi tầng 1 chưa đủ. Chỉ xuống tầng 3 khi tầng 2 chưa đủ. Đừng bao giờ nhảy thẳng xuống tầng 3.
Ví dụ: App quản lý phòng gym
Tầng 1 (Goal): "Tạo app quản lý phòng gym nhỏ. Chủ gym có thể quản lý hội viên và gói tập."
Nếu AI làm ra cái gì đó gần đúng nhưng thiếu vài thứ, bạn mới xuống tầng 2.
Tầng 2 (Features): "App quản lý phòng gym gồm: danh sách hội viên (tên, SĐT, gói tập, ngày hết hạn), quản lý gói tập (tên gói, giá, thời hạn), dashboard hiển thị số hội viên active và sắp hết hạn."
Nếu tầng 2 gần đúng nhưng có chỗ cần chỉnh, bạn mới thêm chi tiết.
Tầng 3 (Details): "Trong danh sách hội viên, thêm cột trạng thái: active (xanh), sắp hết hạn trong 7 ngày (vàng), hết hạn (đỏ). Cho phép lọc theo trạng thái."
Bạn thấy không? Bạn không cần 500 chữ ngay từ đầu. Bạn bắt đầu ngắn, xem AI làm gì, rồi mới thêm chi tiết vào chỗ cần.
Sai lầm phổ biến: Nhầm lẫn giữa "chi tiết" và "rõ ràng"
Nhiều người nghĩ: viết càng chi tiết thì AI càng hiểu rõ. Sai.
Chi tiết và rõ ràng là 2 thứ khác nhau.
"Tạo nút màu xanh lá, border radius 8px, font Roboto 14px, padding 12px 24px, hover thì đổi sang xanh đậm hơn, có shadow nhẹ" = chi tiết nhưng KHÔNG rõ ràng. Vì bạn chưa nói nút này dùng để làm gì, nằm ở đâu, trong context nào.
"Tạo nút CTA chính cho trang pricing, người dùng click để bắt đầu dùng thử miễn phí" = rõ ràng nhưng KHÔNG quá chi tiết. AI biết: đây là nút quan trọng, cần nổi bật, nằm trên trang pricing, action là start free trial. Nó tự biết nên dùng màu gì, size bao nhiêu cho hợp lý.
Nguyên tắc: Rõ ràng về CÁI GÌ và TẠI SAO. Để AI lo CÁI CÁCH.
Khi nào THÌ cần chi tiết?
Abstraction không có nghĩa là lúc nào cũng viết ngắn. Có những lúc bạn CẦN chi tiết:
Khi AI làm sai và bạn biết chính xác sai ở đâu. "Nút đăng ký đang nằm dưới cùng, chuyển lên ngay dưới form, trước phần testimonials." Đây là chi tiết cần thiết vì bạn đang sửa một thứ cụ thể.
Khi có yêu cầu business đặc thù. "Gói Premium phải hiển thị ở giữa và lớn hơn 2 gói còn lại, vì đó là gói mình muốn bán nhiều nhất." Đây là chi tiết mà AI không thể đoán được.
Khi bạn đã ở tầng 3 và đang polish. App đã chạy đúng logic, giờ bạn muốn tinh chỉnh UI, thêm animation, đổi font. Lúc này chi tiết là hợp lý.
Nói cách khác: chi tiết khi sửa, abstraction khi tạo mới.
Trước và sau khi áp dụng Abstraction
TRƯỚC (prompt 300 chữ):
"Tôi muốn tạo landing page cho dịch vụ dạy tiếng Anh online. Phần đầu có hero section với background gradient từ xanh dương sang tím, tiêu đề font size 48px bold trắng, subtitle 20px light, nút CTA màu cam border radius 12px. Bên dưới có 3 cột hiển thị lợi ích, mỗi cột có icon tròn 64x64, tiêu đề 18px bold, mô tả 14px. Tiếp theo là phần testimonials dạng carousel 3 cards, mỗi card có avatar tròn, tên, nghề nghiệp, và quote in nghiêng. Phần pricing có 3 gói: Basic, Pro, Premium, dạng card, gói giữa nổi bật hơn. Footer có logo, links, và social media icons..."
Kết quả: AI làm ra trang nhìn okay nhưng responsive vỡ, gradient xấu trên một số màn hình, carousel lag, và bạn mất 2 tiếng sửa.
SAU (prompt 60 chữ):
"Tạo landing page cho dịch vụ dạy tiếng Anh online. Cần có: hero section với CTA đăng ký, phần lợi ích (3 điểm chính), testimonials từ học viên, bảng giá 3 gói, và footer. Design hiện đại, clean, mobile-friendly."
Kết quả: AI tự chọn layout hợp lý, responsive sẵn, design clean. Bạn chỉ cần chỉnh vài chỗ nhỏ.
Kết hợp 3 bài: Decomposition + Pattern Recognition + Abstraction
Giờ bạn đã có 3 công cụ tư duy. Dùng chúng cùng nhau:
Bước 1 (Decomposition, bài 1): Chia ý tưởng thành các phần nhỏ Bước 2 (Pattern Recognition, bài 2): Nhận diện mỗi phần thuộc pattern gì Bước 3 (Abstraction, bài 3): Viết prompt ở đúng level, bắt đầu từ tầng cao, chỉ xuống chi tiết khi cần
Ví dụ: App quản lý quán cà phê
Bước 1 (Decomposition): Quản lý menu, nhận order, thanh toán, theo dõi doanh thu, quản lý nhân viên
Bước 2 (Pattern Recognition): CRUD (menu), Form (order), Payment, Dashboard (doanh thu), CRUD (nhân viên) + Auth
Bước 3 (Abstraction): Prompt tầng 1 trước: "Tạo app quản lý quán cà phê. Bắt đầu với phần quản lý menu: chủ quán có thể thêm/sửa/xóa món, mỗi món có tên, giá, danh mục (cà phê, trà, bánh)."
Ngắn. Rõ. AI làm đúng. Rồi bạn build tiếp phần tiếp theo.
Template Prompt theo 3 tầng Abstraction
Tầng 1 (dùng đầu tiên):
"Tôi muốn build [mô tả ngắn gọn mục tiêu app]. [1 câu mô tả user chính và action chính của họ]."
Tầng 2 (dùng khi tầng 1 chưa đủ):
"App gồm các phần: [liệt kê tính năng chính, mỗi tính năng 1 câu ngắn]. Bắt đầu với [phần ưu tiên]."
Tầng 3 (dùng khi cần sửa hoặc polish):
"Trong phần [tên phần], sửa/thêm: [mô tả cụ thể thay đổi cần làm]. Giữ nguyên phần còn lại."
Bài tập thực hành (15 phút)
Lấy 1 prompt dài mà bạn đã từng viết cho AI (hoặc dùng prompt mẫu bên dưới). Viết lại nó theo 3 tầng abstraction.
Prompt mẫu (cố tình dài và chi tiết quá mức):
"Tôi muốn tạo trang dashboard cho shop bán hàng online. Trên cùng có thanh navigation ngang màu trắng, logo bên trái, tên shop ở giữa, avatar user bên phải có dropdown menu khi click. Bên trái có sidebar 250px width màu xám nhạt, có các menu items: Dashboard, Đơn hàng, Sản phẩm, Khách hàng, Báo cáo, Cài đặt. Mỗi menu item có icon bên trái. Phần content chính hiển thị 4 card thống kê: doanh thu hôm nay, đơn hàng mới, khách hàng mới, sản phẩm hết hàng. Bên dưới có biểu đồ đường hiển thị doanh thu 7 ngày gần nhất và bảng 10 đơn hàng mới nhất với cột: mã đơn, khách hàng, tổng tiền, trạng thái, ngày đặt."
Bài tập:
Bước 1 (5 phút): Viết lại prompt trên theo tầng 1. Chỉ nói mục tiêu. Tối đa 2 câu.
Bước 2 (5 phút): Viết version tầng 2. Thêm tính năng chính. Tối đa 4-5 câu.
Bước 3 (5 phút): Xác định chỗ nào thực sự CẦN chi tiết tầng 3, chỗ nào nên để AI tự quyết định.
Share kết quả trong comment. Mình sẽ review và góp ý cách bạn chọn level abstraction.
Tổng kết Phase 1: Tư duy Nền tảng
Bạn vừa hoàn thành 3 bài đầu tiên. Đây là bộ công cụ tư duy nền tảng mà developer nào cũng dùng mỗi ngày:
Decomposition: Chia nhỏ vấn đề lớn thành các phần xử lý được Pattern Recognition: Nhận diện mỗi phần thuộc pattern nào đã biết Abstraction: Giao tiếp ở đúng level, không quá chi tiết, không quá mơ hồ
3 cái này kết hợp lại thành flow: Chia nhỏ -> Nhận diện pattern -> Prompt ở đúng level -> Build từng phần.
Từ tuần sau, chúng ta bước vào Phase 2: Tư duy Thiết kế. Bạn sẽ học cách nghĩ theo bước (Algorithm Thinking), nghĩ về trạng thái (State Thinking), và nghĩ về MVP (MVP Thinking). Đây là lúc bạn bắt đầu "thiết kế" trước khi nhờ AI build, thay vì nhảy vào code ngay.
Bài tiếp theo: Algorithm Thinking - "Nghĩ theo bước, không nghĩ theo cảm tính." Bạn muốn app tự động gửi email nhắc hẹn? Nghe đơn giản. Nhưng bạn đã nghĩ qua bao nhiêu bước chưa?