Kiểm tra bài 1: Vì sao giao diện cứ rối dần — chi phí của những màn hình làm một lần
Bài kiểm tra của một khóa dạy kỹ năng này.
Làm bài này
Product Management
Năm cấp độ atom, molecule, organism, template, page; design token; kiểm kê giao diện; viết spec và tiêu chí chấp nhận gọi tên thành phần thay vì vẽ lại màn hình; và quản trị một design system — cho PM, PO, BA làm cùng designer và kỹ sư front-end.
Đăng nhập để đánh dấu kỹ năng và theo dõi tiến độ.
Làm bài Đánh giá Kỹ năng Kỹ thuật cho PM/BA — 2 người đã làm. Một lần làm chấm điểm cho tất cả kỹ năng trong nhóm Technical, không chỉ kỹ năng này.
Làm bài đánh giáHiểu năm cấp độ của atomic design và gọi đúng tên thành phần trên một màn hình thật. Biết design system gồm thành phần, token, tài liệu và quy trình, và vì sao nó giúp nhất quán, nhanh hơn, dễ tiếp cận hơn.
Chạy được một buổi kiểm kê giao diện và chọn thành phần chuẩn hoá trước bằng số liệu; viết spec và tiêu chí chấp nhận tham chiếu thành phần và token; tham gia quy trình đóng góp, phiên bản và khai tử; đo mức sử dụng hệ thống và tránh các lỗi xây trước khi có sản phẩm, làm một lần rồi bỏ, không có người giữ.
Atomic design là một cách chia giao diện thành những phần nhỏ ghép lại được, theo năm cấp độ: atom (nguyên tử), molecule (phân tử), organism (cơ thể), template (khuôn trang) và page (trang thật). Cách gọi này được Brad Frost phổ biến từ khoảng năm 2013, mượn hình ảnh hoá học: thứ phức tạp được ghép từ vài loại hạt cơ bản. Ý tưởng chia giao diện thành component không mới với kỹ sư front-end, nhưng atomic design cho thiết kế, kỹ sư và người làm sản phẩm một bộ từ vựng chung để nói về cùng một thứ.
Vì sao PM, PO, BA cần biết, không chỉ designer? Vì phần lớn chi phí của một giao diện thiếu nhất quán phát sinh từ phía sản phẩm. Mỗi spec vẽ lại một màn hình mới; mỗi màn hình mới sinh thêm một kiểu nút; mỗi kiểu nút là một chỗ phải test, phải sửa khi đổi thương hiệu, và một chỗ người dùng phải học lại. Người viết yêu cầu là người quyết một màn hình được "ghép từ những gì đã có" hay "vẽ từ đầu". Nếu bạn không biết đội đang có những gì, bạn sẽ mặc định chọn vẽ từ đầu.
Kỹ năng này đi tiếp từ Wireframing & Prototyping Basics. Wireframe trả lời "màn hình này có những khối gì, sắp thế nào"; atomic design trả lời "các khối đó lấy từ đâu, và lần sau dùng lại thế nào". Wireframe tốt nhất là wireframe được vẽ bằng chính những thành phần đội đã có.
| Atomic design là | Atomic design không phải |
|---|---|
| Một cách nghĩ để chia và đặt tên giao diện | Một thư viện hay công cụ phải mua |
| Bộ từ vựng chung giữa thiết kế, code và sản phẩm | Luật cứng — tranh cãi một thứ là molecule hay organism không đáng một buổi họp |
| Nền để xây design system: bộ thành phần, token và quy tắc dùng chung | Bản thân design system — hệ thống còn cần người giữ, tài liệu và quy trình |
| Áp dụng được cho sản phẩm đang chạy, từng phần một | Một dự án viết lại toàn bộ giao diện |
Bối cảnh (giả định): ChợGần là sàn thương mại điện tử bán đồ gia dụng và thực phẩm khô cho khoảng 1,2 triệu người mua ở các tỉnh phía Bắc, có ứng dụng iOS, Android và web. Sau bốn năm, 9 người làm sản phẩm và 22 kỹ sư đã xây hơn 180 màn hình. Mọi con số dưới đây là giả định để minh hoạ.
| Cấp độ | Là gì | Ví dụ ở ChợGần | PM, BA cần để ý gì |
|---|---|---|---|
| Atom | Phần nhỏ nhất còn có nghĩa trên giao diện; tách nhỏ hơn thì mất chức năng | Nút, ô nhập, nhãn, biểu tượng, huy hiệu "Freeship", ô đánh dấu, giá tiền định dạng 129.000đ | Trạng thái: mặc định, đang bấm, vô hiệu, đang tải, lỗi. Spec thiếu trạng thái là chỗ mỗi kỹ sư tự đoán |
| Molecule | Vài atom ghép lại để làm một việc | Ô tìm kiếm (ô nhập, biểu tượng, nút xoá), bộ chọn số lượng (nút trừ, con số, nút cộng), dòng giá (giá bán, giá gốc gạch ngang, phần trăm giảm) | Quy tắc nghiệp vụ hay nằm ở đây: số lượng tối đa, cách làm tròn, khi nào hiện giá gốc |
| Organism | Một khối giao diện hoàn chỉnh, đứng riêng được, thường lặp lại ở nhiều màn | Thẻ sản phẩm, thanh đầu trang, giỏ hàng thu gọn, khối chọn địa chỉ giao, khối chọn phương thức thanh toán | Đơn vị hợp lý để viết yêu cầu và ước lượng; phần lớn thảo luận sản phẩm diễn ra ở cấp này |
| Template | Bố cục trang với chỗ trống cho nội dung, chưa có dữ liệu thật | Khuôn trang danh mục: thanh lọc bên trái, lưới thẻ sản phẩm, phân trang | Thứ tự và độ ưu tiên của các khối — đây chính là wireframe |
| Page | Template đổ dữ liệu thật vào | Trang "Nồi chiên không dầu" với 340 sản phẩm; trang giỏ hàng có một món vừa hết hàng | Nơi kiểm trường hợp biên: tên sản phẩm 120 ký tự, danh mục rỗng, giá 0đ |
Ranh giới giữa các cấp không cần chính xác. Bộ chọn số lượng là molecule hay organism? Câu trả lời không quan trọng bằng việc cả đội gọi nó cùng một tên và chỉ có một phiên bản. Dùng năm cấp độ như một cái kệ để sắp đồ, không phải như luật.
Cấp page hay bị bỏ qua nhất khi viết yêu cầu, dù đó là nơi lỗi thật xuất hiện. Thẻ sản phẩm đẹp trong bản thiết kế với tên ngắn "Chảo chống dính 26cm" sẽ vỡ dòng khi gặp tên thật "Chảo chống dính đáy từ vân đá 26cm tặng kèm xẻng gỗ, dùng được bếp từ". Template chứng minh bố cục đúng; page chứng minh nó chịu được dữ liệu thật. Tiêu chí chấp nhận nên có ít nhất một dòng cho dữ liệu xấu nhất.
Design system là bộ thành phần dùng chung (thường tổ chức theo atomic design), cộng với design token, tài liệu hướng dẫn dùng, và một quy trình để thêm, sửa, bỏ thành phần. Bốn lợi ích dưới đây là lý do bạn nên ủng hộ nó trong buổi lập kế hoạch — và cũng là bốn thứ bạn nên đo.
| Lợi ích | Không có hệ thống | Có hệ thống | Người làm sản phẩm được gì |
|---|---|---|---|
| Nhất quán | Người dùng ChợGần gặp 14 kiểu nút; nút "Mua ngay" màu cam ở trang sản phẩm, xanh lá ở trang khuyến mãi | Một nút chính, một màu, một vị trí quen | Người dùng không phải đoán đâu là hành động chính; ít bấm nhầm, ít ticket |
| Tốc độ | Mỗi màn hình mới mất 3–4 ngày thiết kế và code lại những phần đã có | Màn hình ghép từ thành phần sẵn có mất khoảng một ngày; thời gian dồn vào phần thật sự mới | Ước lượng nhỏ hơn và dễ đoán hơn; sprint có chỗ cho việc mới |
| Khả năng tiếp cận | Mỗi kỹ sư tự làm ô nhập; một nửa thiếu nhãn cho trình đọc màn hình, chữ xám nhạt không đủ tương phản | Sửa một lần ở thành phần, mọi màn hình dùng nó được sửa theo | Đạt chuẩn tiếp cận thành mặc định, không phải một dự án riêng |
| Ít màn hình dùng một lần | Mỗi đợt Tết, 11.11 sinh một bộ màn hình riêng, xong rồi không ai dám xoá | Chiến dịch dùng lại template, chỉ đổi nội dung | Ít code chết, ít chỗ phải test hồi quy khi đổi luồng thanh toán |
Cái giá cần nói thẳng: design system tốn người. Ở ChợGần, ước tính ban đầu là một designer và hai kỹ sư front-end dành khoảng nửa thời gian trong hai quý, sau đó một người giữ thường trực. Nếu sản phẩm còn đang tìm thị trường, tuần nào cũng xoay hướng, chi phí đó thường chưa đáng — một bộ thành phần nhỏ và một file màu dùng chung là đủ. Hệ thống đáng đầu tư khi bạn đã có nhiều màn hình, nhiều đội cùng sửa giao diện, và thấy rõ chi phí của sự trùng lặp bằng số.
Mỗi thành phần trong file thiết kế nên có đúng một component tương ứng trong code, cùng tên, cùng các biến thể. Khi tên khác nhau — designer gọi là "Thẻ sản phẩm nhỏ", code gọi là ItemCardV2 — mỗi lần trao đổi lại mất một bước dịch, và sớm muộn sẽ có người dịch sai. PM và BA hưởng lợi trực tiếp: một tên dùng được trong spec, trong ticket, trong buổi review và trong báo lỗi.
Design token là những giá trị thiết kế nhỏ nhất được đặt tên: màu, khoảng cách, cỡ chữ, bo góc, đổ bóng. Thay vì viết thẳng mã màu #F26B1D ở 60 chỗ, mọi chỗ dùng tên color.action.primary. Đổi màu thương hiệu thì đổi một dòng. Token thường chia ba lớp:
| Lớp | Ví dụ | Ai dùng | Vì sao tách lớp |
|---|---|---|---|
| Giá trị gốc | orange.500 = #F26B1D; space.4 = 16px; font.size.300 = 16px | Người giữ hệ thống | Bảng màu và thang đo đầy đủ, chưa mang nghĩa sử dụng |
| Token theo ý nghĩa | color.action.primary = orange.500; color.text.danger = red.600; space.inset.card = space.4 | Designer và kỹ sư khi dựng thành phần | Làm giao diện tối hay đổi thương hiệu chỉ cần trỏ lại lớp này |
| Token của thành phần | button.primary.background = color.action.primary | Kỹ sư dựng thành phần | Chỉnh riêng một thành phần mà không ảnh hưởng chỗ khác |
Ba nhóm token người làm sản phẩm nên đọc được:
Bạn không cần tự viết token. Bạn cần đọc được chúng trong spec và trong thảo luận, và nhận ra khi một yêu cầu đòi một giá trị nằm ngoài hệ thống — "chữ đỏ đậm hơn một chút cho dòng khuyến mãi" — để hỏi: đây là token mới cho cả hệ thống, hay một ngoại lệ chúng ta không cần?
Interface inventory (kiểm kê giao diện) là bước đầu tiên khi áp dụng atomic design cho một sản phẩm đã chạy: chụp lại mọi thành phần đang có, gom theo loại, xếp theo cấp độ, và đếm số biến thể. Mục đích không phải làm tài liệu đẹp, mà là cho mọi người cùng nhìn thấy mức trùng lặp. Một slide ghi "giao diện chưa nhất quán" không thuyết phục được ai; một trang đặt 14 kiểu nút cạnh nhau thì có.
Khi ChợGần kiểm kê lần đầu hai luồng mua hàng và sau mua, đội đếm được 14 kiểu nút, 9 bộ chọn ngày khác nhau (ngày giao hàng, lọc đơn theo ngày, ngày sinh, lịch lắp đặt, kỳ hạn trả góp...), 6 kiểu thông báo lỗi và 4 cách viết giá. Không ai cố ý thiết kế 9 bộ chọn ngày; mỗi cái ra đời hợp lý trong một sprint riêng, vì người viết spec không biết cái trước đã tồn tại.
Kết quả không phải một bản tài liệu mà là một danh sách việc: mỗi biến thể được quyết giữ, gộp hay bỏ, và năm đến bảy thành phần được chọn chuẩn hoá trước, có chủ. Làm theo từng bước trong hướng dẫn Kiểm kê giao diện theo atomic design, và ghi kết quả vào mẫu Bảng kiểm kê giao diện.
Khi đã có hệ thống, cách viết yêu cầu nên đổi theo. Thay vì đính kèm một màn hình vẽ lại từ đầu và mô tả từng chi tiết nhìn thấy, spec gọi tên thành phần đã có, chỉ ra biến thể, và chỉ mô tả kỹ phần thật sự mới. Spec ngắn hơn; kỹ sư biết ngay phần nào có sẵn; QA biết phần nào đã được test ở cấp thành phần; designer không phải vẽ lại thứ đã vẽ.
TRƯỚC — spec vẽ lại màn hình Màn hình Đổi trả: xem ảnh đính kèm (thiết kế mới). Nút gửi màu cam, bo góc, cao 48px. Có ô chọn ngày lấy hàng. Hiện chữ đỏ nếu chưa chọn lý do. SAU — spec tham chiếu thành phần Màn hình Đổi trả, ghép từ template "Biểu mẫu một cột". - Organism: Thẻ đơn hàng (biến thể rút gọn), chỉ đọc - Molecule: Nhóm lựa chọn (Radio group) cho lý do, bắt buộc - Molecule: Bộ chọn ngày (Date picker), chế độ một ngày; chỉ cho chọn từ ngày mai đến 7 ngày sau, bỏ Chủ nhật - Atom: Nút chính (Button primary, full-width): "Gửi yêu cầu" - Lỗi: dùng Field error chuẩn, không tạo kiểu mới PHẦN MỚI (cần thiết kế): khối tải ảnh sản phẩm lỗi, tối đa 4 ảnh, mỗi ảnh dưới 5 MB.
Dòng "phần mới" cho mọi người biết công sức thiết kế thật sự nằm ở đâu. Tiêu chí chấp nhận cũng nên viết theo cách đó, để kiểm mà không phải so pixel với ảnh:
Khi thành phần có sẵn không đủ: đừng viết "giống bộ chọn ngày nhưng thêm chọn giờ". Ghi rõ cần một biến thể mới hay thành phần mới, và đưa nó vào quy trình đóng góp ở phần dưới. Nếu không, đó chính là cách bộ chọn ngày thứ mười ra đời.
Design system ít khi hỏng vì thiết kế xấu; nó hỏng vì không ai quyết được ai được thêm gì. Có ba mô hình phổ biến:
| Mô hình | Cách chạy | Hợp khi | Rủi ro |
|---|---|---|---|
| Đội trung tâm | Một nhóm nhỏ sở hữu và tự xây mọi thành phần | Công ty lớn, nhiều đội sản phẩm, cần nhất quán cao | Đội trung tâm thành nút thắt; đội sản phẩm chờ không nổi rồi tự làm bên ngoài |
| Phân tán | Mỗi đội sản phẩm tự thêm vào thư viện chung | Công ty nhỏ, ít đội, tin nhau | Không ai giữ chất lượng; một năm sau lại có 9 bộ chọn ngày, lần này nằm ngay trong thư viện |
| Lai | Một người hoặc nhóm nhỏ giữ chuẩn và duyệt; các đội đề xuất và đóng góp | Phần lớn công ty cỡ vừa | Cần quy trình đóng góp rõ; nếu không sẽ trượt về một trong hai mô hình trên |
Quy trình đóng góp gợi ý cho mô hình lai:
Phiên bản. Thư viện code nên đánh số kiểu major.minor.patch (semantic versioning): sửa lỗi tăng số cuối, thêm biến thể tăng số giữa, thay đổi làm vỡ chỗ đang dùng — đổi tên, bỏ thuộc tính — tăng số đầu. Với PM, nghĩa thực tế là: nâng một bản major là một việc có ước lượng, phải nằm trong kế hoạch sprint, không phải "cập nhật thư viện tiện tay".
Khai tử. Bỏ một thành phần theo ba bước: đánh dấu không khuyến khích dùng và chỉ ra thành phần thay thế; đặt hạn, ví dụ một quý; xoá khi số chỗ dùng về 0. Không xoá đột ngột — đội đang chạy chiến dịch sẽ phát hiện vào đúng ngày ra mắt.
Hệ thống không ai dùng là chi phí không có lợi ích. Đo để biết nó có được dùng thật không, và để có bằng chứng khi xin tiếp nguồn lực.
| Chỉ số | Đo thế nào | ChợGần sau hai quý (giả định) |
|---|---|---|
| Tỉ lệ phủ | Số chỗ dùng thành phần hệ thống / tổng số chỗ dùng loại thành phần đó, quét code tự động | Nút: 81%; bộ chọn ngày: 15/17 chỗ đã chuyển |
| Số biến thể còn lại | Đếm lại theo bảng kiểm kê mỗi quý, cùng phạm vi | Nút từ 14 xuống 5; bộ chọn ngày từ 9 xuống 3 |
| Giá trị ngoài token | Số mã màu, khoảng cách viết thẳng trong code | Từ 1.240 xuống 410 |
| Thời gian làm màn hình mới | Từ thiết kế đến code xong, với màn hình chủ yếu ghép từ thành phần có sẵn | Trung bình từ 6 xuống 3,5 ngày |
| Lỗi giao diện | Ticket lỗi hiển thị và lỗi tiếp cận mỗi tháng | Từ 38 xuống 21 |
| Sức khoẻ đóng góp | Số đề xuất mới, thời gian duyệt trung bình | 11 đề xuất, duyệt trung bình 2,5 ngày |
Đừng biến tỉ lệ phủ thành chỉ tiêu ép 100%. Một số màn hình — trang chiến dịch dùng một lần, công cụ nội bộ ít người dùng — không đáng chuyển. Đặt mục tiêu cho những luồng quan trọng nhất (tìm kiếm, giỏ hàng, thanh toán) trước.
| Lỗi | Vì sao xảy ra | Làm thay bằng |
|---|---|---|
| Xây hệ thống trước khi có sản phẩm | Muốn "làm đúng ngay từ đầu" | Xây màn hình thật trước; rút thành phần từ những gì đã lặp lại ít nhất hai, ba lần |
| Coi design system là dự án một lần | Được giao như một đầu việc có ngày kết thúc | Coi nó là sản phẩm nội bộ: có người giữ, có backlog, có người dùng là các đội sản phẩm |
| Chia atom quá nhỏ, quá trừu tượng | Muốn mọi thứ đều tái sử dụng được | Chỉ tách khi có ít nhất hai nơi dùng; một nút có 25 thuộc tính khó dùng hơn ba nút rõ ràng |
| Không có người chịu trách nhiệm | "Ai cũng dùng thì ai cũng giữ" | Một người có tên, có thời gian được cấp, quyết việc duyệt và khai tử |
| Thiết kế và code lệch nhau | Hai thư viện, hai nhóm cập nhật riêng | Cùng tên, cùng biến thể; một thay đổi chỉ xong khi cả hai phía đã cập nhật |
| Spec vẫn vẽ lại màn hình từ đầu | Thói quen, hoặc không biết thư viện có gì | PM, BA mở thư viện trước khi viết; spec gọi tên thành phần, chỉ mô tả kỹ phần mới |
| Tranh cãi molecule hay organism | Hiểu năm cấp độ như luật | Dùng cấp độ để sắp xếp; thứ cần thống nhất là tên và phiên bản |
Bài kiểm tra của một khóa dạy kỹ năng này.
Làm bài nàyBài kiểm tra của một khóa dạy kỹ năng này.
Làm bài nàyBài kiểm tra của một khóa dạy kỹ năng này.
Làm bài nàyBài kiểm tra của một khóa dạy kỹ năng này.
Làm bài nàyHọc kỹ năng này ở đâu?
Có 1 khóa dạy đúng phần này, miễn phí và bằng tiếng Việt.
Thảo luận & tài liệu thêm 0
Chia sẻ kinh nghiệm, đặt câu hỏi, hoặc đính kèm tài liệu/YouTube giúp người khác học kỹ năng này.