Cách Mình Thiết Kế Configuration
Nguyên tắc xây dựng configuration phục vụ cả người mới và chuyên gia
Hầu hết user chỉ muốn bấm nút rồi chạy. Một số ít thì muốn chỉnh từng thông số một. Phục vụ cả hai mà không làm ai khó chịu -- đó mới là thiết kế configuration tốt.
Hiện ra 20 options ngay từ đầu thì người mới bỏ chạy. Giấu hết chỉ cho defaults thì power user bực mình. Bài toán là tìm đường giữa.
Câu hỏi cốt lõi: "User mới có thể thành công mà không cần configuration, trong khi power user có thể customize mọi thứ?"
Defaults phải có lý do
Đừng chọn default value kiểu "cái gì chạy được thì để đó." 80% user không bao giờ thay đổi defaults -- nghĩa là default value chính là trải nghiệm của đa số user.
Mỗi default cần:
- Lý do rõ ràng tại sao chọn giá trị này
- Được test trên data thực, không chỉ sample data
- Phù hợp với use case phổ biến nhất
Ví dụ trong Keyword Clustering: min_cluster_size=8 không phải con số ngẫu nhiên. Nó được chọn vì clusters nhỏ hơn 8 keywords thường không đủ ý nghĩa cho content planning. Test trên datasets thật mới biết con số này hợp lý -- đừng lấy default từ documentation của library rồi ship luôn.
Tiết lộ complexity từ từ
Người mới mở app lên thì thấy gì? Nếu là tràn ngập options thì game over -- họ không biết bắt đầu từ đâu.
Cách làm: hiện presets hoặc essential options trước. Advanced options giấu sau expandable section. View đầu tiên đơn giản đến mức ai cũng dùng được; mở rộng ra thì thỏa mãn power user.
Nó giống kiểu menu quán phở thôi -- phở bò, phở gà là mặc định. Muốn thêm gầu, nạm, tái, chín thì hỏi. Đừng đưa nguyên cái danh sách 15 loại thịt ra hỏi ngay từ đầu =))
Presets đặt tên theo kết quả
3-5 presets, mỗi cái cho một use case rõ ràng. Đặt tên theo outcome: "Quick Overview", "Deep Analysis" -- không phải theo parameter: "Low Min-Cluster", "High Epsilon".
User nghĩ theo kiểu "tôi muốn phân tích nhanh" chứ không ai nghĩ "tôi muốn min_cluster_size=5". Presets tốt thì encode expert knowledge, để user không cần trở thành expert mới dùng được app.
Mỗi preset phải là tổ hợp parameters đã test và validate -- không phải random combination.
Validate ngay, đừng để fail sâu bên trong
Chấp nhận bất kỳ configuration nào rồi chạy 2 phút mới báo lỗi -- đó là lãng phí thời gian user.
Validate tại boundary, tức là ngay khi user submit configuration. Reject ngay nếu invalid, kèm error message cụ thể. Nếu phải clamp hay round value thì thông báo rõ: "Minimum group size adjusted from 2 to 5 (minimum required for meaningful clusters)."
Nguyên tắc: user không bao giờ nên bất ngờ vì kết quả không khớp với configuration đã chọn.
Configuration phải portable
Configuration chỉ sống trong UI state thì user không thể save, share, hay reproduce. Hôm nay chạy xong, mai muốn chạy lại y hệt mà không nhớ đã chỉnh gì.
Cho phép:
- Save configuration thành JSON hoặc URL params
- Share với teammates
- Reload sau này
- Reproduce -- cùng configuration, cùng kết quả
Reproducibility là nền tảng cho experimentation. Không reproduce được thì không so sánh được, mà không so sánh được thì không biết configuration nào tốt hơn.
Khung quyết định
Có nên thêm option mới không?
Trước khi thêm, hỏi bốn câu:
- User đã yêu cầu cụ thể chưa? (Không phải mình tưởng tượng họ cần)
- Các giá trị khác nhau có phục vụ use cases thật sự khác nhau không?
- Option này thay đổi behavior có ý nghĩa không?
- Default value hiện tại có fail cho nhóm user nào không?
Nếu trả lời "không" cho đa số câu trên thì đừng thêm. Mỗi option thêm vào là một quyết định user phải đối mặt. Ít options hơn = ít cognitive load hơn.
Presets hay individual options?
Dùng presets khi parameters phụ thuộc nhau, common use cases rõ ràng, và user nghĩ theo outcomes. Dùng individual options khi parameters độc lập và user cần fine-grained control.
Tốt nhất? Cung cấp cả hai. Chọn preset để bắt đầu nhanh, rồi customize từng option nếu muốn.
Basic hay advanced?
| Basic section | Advanced section |
|---|---|
| Ảnh hưởng use case chính | Cho edge cases hoặc power users |
| Hầu hết user sẽ muốn cân nhắc | Default đã tốt cho đa số |
| Giải thích được bằng label ngắn | Cần context hoặc documentation |
Những lỗi hay mắc
Configuration sprawl -- 30+ options trải qua nhiều tabs, user không biết tìm setting ở đâu. Fix: audit thường xuyên, remove options hiếm khi dùng, kết hợp related options. Mỗi lần thêm option mới phải justify được.
Options conflict nhau -- một số tổ hợp tạo ra lỗi hoặc kết quả vô nghĩa, user chỉ biết qua trial and error. Fix: validate tổ hợp options ngay lúc configuration, ngăn hoặc cảnh báo invalid combinations.
Labels đòi hỏi PhD -- options đặt tên kiểu "EOM vs Leaf", "min_samples", "n_neighbors". Không ai biết nghĩa gì mà không đọc documentation. Đổi thành label theo effect: "Cluster precision" (low/high), "Minimum group size", "Similarity sensitivity". Thêm tooltips cho chi tiết kỹ thuật.
Không có đường quay lại -- user customize lung tung, bị lạc, không quay về trạng thái ban đầu được. Hỏi support "làm sao reset?" Luôn có "Reset to defaults" và "Reset to preset" buttons.
Defaults chỉ chạy tốt trên demo data -- defaults hoạt động trên 100 items, đưa 10,000 items vào thì toang. Test defaults trên data volumes thực tế. Nếu cần, cung cấp defaults khác nhau theo scale.
Checklist đánh giá
Đang tốt nếu:
- User mới thành công mà không thay đổi settings nào
- Power users truy cập được mọi parameter cần thiết
- Presets cover most common use cases
- Invalid configurations bị bắt với messages hữu ích
- Configurations có thể save và share
Cần cải thiện nếu:
- User thường xuyên hỏi "mình nên set cái này bao nhiêu?"
- Cùng configuration cho kết quả khác nhau
- Một số tổ hợp options gây crashes hoặc errors
- User không thể reproduce kết quả trước đó
- Default settings cần thay đổi cho basic usage
Tham khảo nhanh
+-----------------------------------------------+
| Configuration Panel |
+-----------------------------------------------+
| |
| Presets: [Recommended] [Quick] [Detailed] |
| |
| Basic Options |
| +------------------------------------------+ |
| | Number of clusters [==|====] Auto | |
| | Minimum group size [=====|=] 8 | |
| +------------------------------------------+ |
| |
| [v] Advanced Options |
| +------------------------------------------+ |
| | Clustering method ( ) Standard | |
| | (*) High precision | |
| | Outlier handling [x] Auto-assign | |
| | Merge similar groups [x] Enabled | |
| +------------------------------------------+ |
| |
| [Reset to defaults] [Save configuration] |
+-----------------------------------------------+
| Lớp | Nội dung | Hiển thị |
|---|---|---|
| Presets | 3-5 named configurations | Luôn hiển thị |
| Basic options | 2-4 essential parameters | Luôn hiển thị |
| Advanced options | 5-10 fine-tuning parameters | Collapsed mặc định |
| Hidden/computed | Algorithm internals | Không bao giờ expose ra UI |
| Vấn đề | Cách tiếp cận |
|---|---|
| Defaults | Có chủ đích, documented, tested trên real data |
| Complexity | Progressive disclosure (basic -> advanced) |
| Presets | Đặt tên theo outcome, cover common use cases |
| Validation | Tại boundary, specific error messages |
| Portability | JSON-serializable, shareable, reproducible |