การขัด UI
(blog.jim-nielsen.com)- ความสมบูรณ์ของ UI ไม่ได้ดีขึ้นทันทีหลังลงมือทำเสร็จ แต่จะดีขึ้นจาก กระบวนการคลิกซ้ำๆ อย่างต่อเนื่องในการใช้งานจริง และบทความนี้เปรียบสิ่งนั้นกับการขัดไม้
- การเปลี่ยนหน้าและการนำทางควรถูกตรวจสอบผ่าน หลายเส้นทางในการเข้าถึง เช่น การคลิก ปุ่มย้อนกลับของเบราว์เซอร์ การคลิกขวาแล้วเลือก “Back” ปุ่มย้อนกลับภายในแอป และคีย์ลัดบนคีย์บอร์ด
- เมื่อนำ
labelและinput type="radio"มาเรียงด้วย flexbox แล้วใส่gapจะพบ dead zone ที่คลิกไม่ได้อยู่ระหว่างปุ่มวิทยุกับ label - วิธีแก้คือเอา
gapออกแล้วใส่ padding ให้labelแทน ซึ่งยังคงระยะห่างในเชิงภาพไว้ได้ พร้อมกับขยาย พื้นที่ที่คลิกได้ - แม้ข้อบกพร่องเล็กๆ ในการโต้ตอบจะดูไม่สำคัญ แต่เมื่อสะสมมากขึ้นก็ทำลายประสบการณ์ใช้งานได้ จึงควรใช้งาน UI ซ้ำๆ และขัดเกลามันจนไม่เหลือ “เสี้ยน” ให้สะดุดอีก
ค้นหาจุดหยาบของ UI ด้วยการคลิกซ้ำ
- งานทำ UI คือการสร้างบางอย่างขึ้นมา แล้ว คลิกมันให้มาก แก้ไข จากนั้นก็กลับไปคลิกอีกครั้ง เป็นวงจรแบบนี้ซ้ำๆ
- การตรวจสอบการเปลี่ยนหน้าโดยดูแค่ flow เดียวไม่เพียงพอ ต้องลองย้อนกลับและตรวจสอบด้วยหลายวิธี
- คลิกแล้วใช้ปุ่มย้อนกลับของเบราว์เซอร์
- คลิกแล้วใช้ “Back” จากเมนู context menu ที่ได้จากการคลิกขวา
- ใช้การนำทางย้อนกลับภายในแอป
- ใช้คีย์ลัดบนคีย์บอร์ดเพื่อย้อนกลับ
- กระบวนการนี้คล้าย QA แบบ “ลองคลิกให้พังดู” แต่ความรู้สึกจริงๆ ใกล้เคียงกับการใช้กระดาษทรายขัดงานไม้เพื่อหา จุดหยาบและเสี้ยน มากกว่า
- UI ของซอฟต์แวร์อาจมี สถานะและตัวแปรมากเกินไป จึงต้องขัดเกลาผ่านการใช้งานซ้ำๆ จนไม่เหลือ “เสี้ยน” ให้จับได้อีก
dead zone จาก gap ของ flexbox
- ในรายการตัวเลือกแบบ radio มีการวาง
<label>และ<input type="radio">ที่เชื่อมกันไว้ในแถวเดียวกัน - CSS เป็นโครงสร้างง่ายๆ ที่กำหนด
display: flex,flex-direction: row,align-items: center,gap: .5remให้กับคอนเทนเนอร์ - ระหว่างการคลิกซ้ำๆ พบว่าเมื่อกดพื้นที่ระหว่างปุ่มวิทยุกับ label คอนโทรลจะไม่สลับสถานะ เกิดเป็น dead spot
- สาเหตุมาจาก
gapของ flexboxgapช่วยสร้างระยะห่างในเชิงภาพได้ง่าย- แต่ไม่ได้รวมอยู่ในพื้นที่คลิกของ label หรือ input จึงกลายเป็นช่องว่างที่โต้ตอบไม่ได้
- วิธีแก้คือเอา
gapออกแล้วใส่ padding ให้labelแทน- ระยะห่างยังคงอยู่
- พื้นที่คลิกของ label กว้างขึ้น ทำให้ dead zone หายไป
- ข้อบกพร่องเล็กๆ เพียงอย่างเดียวอาจดูไม่สำคัญ แต่ถ้า “เสี้ยนเล็กๆ” แบบนี้มีมากขึ้น ประสบการณ์ของ UI ก็อาจกลายเป็นเรื่องน่าทรมานได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ถ้าเป็นนักพัฒนาที่เป็น ผู้ใช้ตัวยงของผลิตภัณฑ์ที่ตัวเองกำลังสร้าง ด้วย ก็จะได้เปรียบมากในการหาปัญหาเล็ก ๆ แบบนี้
เพราะก่อนที่ผู้ใช้จะสะดุดเอง นักพัฒนาจะสังเกตเห็นความขัดใจเล็กน้อยได้ด้วยตัวเอง และก็อยู่ในตำแหน่งที่จะแก้ได้ทันทีด้วย
เพราะแบบนี้ ทีมเล็กที่มี ownership สูง จึงดูมีประสิทธิภาพมาก ถ้ามีความเป็นเจ้าของผลิตภัณฑ์ ก็จะรู้สึกว่าความไม่สะดวกเล็กน้อยที่ผู้ใช้เจอเป็นเรื่องของตัวเอง และการทำให้ UX ลื่นไหลที่สุดก็กลายเป็นเรื่องของศักดิ์ศรี
ถ้าไม่ใช่กรณีอย่างผลิตภัณฑ์สำหรับองค์กรที่ใช้งานภายในได้ยาก อย่างน้อยถึง ownership โดยตรงจะอ่อนกว่า แต่ก็ยังมีส่วนได้ส่วนเสียกับความสำเร็จของผลิตภัณฑ์
สงสัยว่า UI ที่ขัดเกลามาดีที่สุดคืออะไร
ระดับ FAANG น่าจะมีเงินมากพอจนดูเหมือน UI/UX คงดีพอตัว แต่คนที่เคยใช้ Amazon.com, AWS, GCP หรือ Azure น่าจะรู้สึกต่างออกไป
ส่วนตัวคิดว่า mcmaster.com คือ UI/UX ที่ขัดเกลามาดีที่สุด หาสิ่งที่ต้องการได้ภายในไม่กี่นาที
ตรงกันข้าม เว็บร้านใหญ่ ๆ อย่าง Home Depot หรือ Lowe’s ใช้เวลาหาอย่างพวกสกรูหรือไม้ให้ได้ขนาดตรงเป๊ะทีละ 10–15 นาที และบนมือถือยิ่งแย่กว่า
มันเรียบง่ายและใช้งานได้จริงจนน่าเหลือเชื่อ แต่ก็ทรงพลังมาก สามารถค่อย ๆ ไล่กรองชิ้นส่วนหรือค้นหาได้ การเทียบราคาก็ทำให้อัตโนมัติ และยังจัดกลุ่มช่วงราคา/คุณภาพได้มีประโยชน์
ถ้าเจอหมายเลขชิ้นส่วนแล้ว ก็จะดูความเข้ากันได้กับปี/ผู้ผลิต/รุ่น คำอธิบายสั้น ๆ รูปภาพ และยังดูได้ด้วยว่าจัดส่งจากคลังเดียวกับชิ้นส่วนอื่นในตะกร้าหรือไม่ ทั้งหมดนี้ทำได้ในหน้าเดียวแบบแทบไม่มีแรงเสียดทาน และทำงานได้เร็วมากบนทุกแพลตฟอร์ม
ตอบสนองเร็วมาก และไม่เคยเจอบั๊กระหว่างใช้งานเลย มันยกระดับมาตรฐานในหัวว่าควรคาดหวังอะไรจากเว็บแอปได้บ้าง
ถึงขั้นเคยมีช่วงเวลาที่ตั้งใจไว้เพื่อแก้เฉพาะปัญหาด้านการใช้งานจริง ๆ
https://linear.app/changelog/2022-12-01-polishing-season-202...
https://web.archive.org/web/20231003205004/https://linear.ap...
โดยเฉพาะ รูปโปรไฟล์ชั่วคราว ที่น่าหงุดหงิดที่สุด มันทำงานไม่ถูกต้องมาเกือบปีแล้ว และไม่กลับไปเป็นรูปเดิม
ดูเหมือนว่าจะไม่มีใครคอยขัดเกลาอะไรอยู่ตรงนั้นเลย
https://littlebigdetails.com ก็เป็นสถานที่แบบนั้นพอดี
วิธีแก้พื้นฐานของปัญหาเฉพาะนี้คือ ใส่องค์ประกอบ input ไว้ข้างใน label
ตอนแรกก็สงสัยว่าทำไม แต่เดาว่าน่าจะเพราะทำให้การใส่ธีมง่ายขึ้นเวลาอยากปรับตำแหน่ง/padding ของ label หรือ input
[1] https://getbootstrap.com/docs/5.3/forms/checks-radios/
for/idเพื่อการเข้าถึงสำหรับ ซอฟต์แวร์สั่งงานด้วยเสียง ทั่วไป: https://www.tpgi.com/should-form-labels-be-wrapped-or-separa...radio หรือ checkbox ไม่ควรถูกสลับสถานะได้แค่ที่กล่องกับ padding เท่านั้น แต่ควรกดที่ ข้อความ label ทั้งหมด ได้ด้วย
Flexbox ดูจะเกินความจำเป็นไปหน่อย ต่อให้เป็นไวยากรณ์แบบไม่ซ้อนกันก็น่าจะวางแบบ inline อยู่แล้ว และแค่เพิ่ม padding ในแบบเดียวกันก็น่าจะพอ
ถ้าจะบรรเทา ก็ควรห่อ
Fooด้วยองค์ประกอบแยกต่างหากเรื่องแบบนี้หายไปมากเกินใน Agile
วิศวกรควรมีเวลาเกลาผลิตภัณฑ์ แต่ความเป็นจริงคือไม่มีเลย ถ้า QA ไม่เปิด ticket เรื่องช่องว่างผิดเพี้ยน มันก็จะไม่มีวันถูกแก้
ลูกค้าอาจสังเกตเห็นเรื่องพวกนี้ แต่การที่พวกเขาจะรายงานเข้ามาก็แทบเป็นปาฏิหาริย์ แล้วการที่มันจะกลายเป็น ticket ก็เป็นอีกปาฏิหาริย์หนึ่ง และการที่ใครสักคนจะให้ลำดับความสำคัญจนได้แก้ก็เป็นปาฏิหาริย์อีกต่อ
ในความเป็นจริง issue board ของบริษัทส่วนใหญ่ทึบแสงเกินไปจากมุมมองของลูกค้า จนถ้าเจอปัญหาเล็กๆ หรือบั๊ก ก็ต้องเสียเวลาไปๆ มาๆ เป็น 50 ชั่วโมงเพื่อพิสูจน์ว่ามันเป็นบั๊กและใส่ ticket เข้า tracker ซึ่งน่าหงุดหงิดมาก
คุณคิดว่า waterfall model ระบุเวลาให้ทดสอบและเกลา UI ไว้อย่างชัดเจนงั้นเหรอ?
ปกตินี่เป็นกระบวนการที่ผู้จัดการผลิตภัณฑ์ต้องจัดลำดับความสำคัญ แล้วทำงานร่วมกับ UX engineer หรือดีไซเนอร์ที่เก่งพอ ถ้าต้องการ คุณก็ใส่ลำดับความสำคัญนี้เข้าไปในวิธีพัฒนาแบบไหนก็ได้ ดังนั้น Agile ไม่เกี่ยวในที่นี้
ผมรายงานเรื่องนี้มาหลายครั้งตลอด 3 ปีที่ผ่านมา เพราะการแก้ไขข้อความขณะเขียนนั้นยากและน่าหงุดหงิดสุดๆ
ในฐานะนักพัฒนาเว็บ ผมสงสัยมาตั้งแต่แรกว่าของแบบนี้พังได้ยังไง ไม่รู้ว่าต้องไร้ความสามารถระดับไหนถึงทำให้สิ่งที่ควรทำงานได้ตามปกติพังลงได้ นี่เป็นการแก้ที่ไม่น่าใช้เวลาเกิน 30 นาที และจะทำให้ประสบการณ์ผู้ใช้ของทุกคนดีขึ้น 1000 เท่า แต่ผ่านไป 3 ปีหลังจากรายงานแล้วก็ยังเหมือนเดิม
ใน Teams ผมก็เคยรายงานบั๊กที่ช่องกรอกหมายเลขโทรศัพท์ใช้ปุ่ม HOME/END ไม่ได้ ผ่าน Microsoft Premiere Support แต่คำตอบที่ได้คือ “ทำงานตามที่ออกแบบไว้”
ไม่น่าแปลกใจเลยที่ลูกค้าจะเลิกรายงานบั๊กพวกนี้ เพราะทั้งพนักงาน/นักพัฒนาและบริษัทเองก็ไม่ได้สนใจอยู่ดี
ผมเป็นหัวหน้านักพัฒนาของผลิตภัณฑ์ และมีปัญหาเล็กๆ น้อยๆ อยู่เต็มไปหมด ความรู้สึกที่ต้องรับผิดชอบบางอย่างแต่ไม่มีอำนาจจะแก้มัน ไม่ใช่ความรู้สึกที่ดีเลย
จากมุมมองธุรกิจ มันกลายเป็นตรรกะว่า ถ้าไม่กระทบรายได้หรือแบรนด์โดยตรง จะเสียเวลาและเงินไปแก้ทำไม แม้ระยะยาวมันจะกระทบแบรนด์ก็ตาม แต่คนส่วนใหญ่ก็ย้ายบทบาทหรือย้ายบริษัทภายใน 5 ปี เลยไม่สนใจ
แค่ได้คำตอบกลับมาก็ยังถือว่าดีกว่าหลายกรณีแล้ว
เห็นได้ชัดว่ามีกระบวนการบางอย่างที่ไม่ตอบโจทย์ความต้องการของลูกค้า ก็แก้มันร่วมกับทีมได้เลย
ถ้ามีพิธีการแบบ Scrum ก็อาจหยิบขึ้นมาใน retrospective ได้ แต่จริงๆ แล้วทำได้ทุกเมื่อ retrospective เป็นแค่ช่วงเวลาที่ตั้งใจทบทวนหลายสัปดาห์ที่ผ่านมา ส่วนสิ่งที่สังเกตเห็นระหว่างทางก็ควรพยายามแก้ระหว่างทาง
การมีคนที่มีเซนส์พอจะรายงานและแก้ปัญหา UX เล็กๆ น้อยๆ ได้นั้นสำคัญมาก
ในงานออกแบบ UX มักเปรียบสิ่งนี้กับแผลกระดาษบาดที่เกิดกับผู้ใช้ มันไม่ถึงตาย แต่ค่อยๆ บั่นทอนความพึงพอใจของผู้ใช้
ขอเสริมผู้เขียนว่า radio button นั้นไม่ทำตามธรรมเนียมที่ใช้จุดแทนเครื่องหมายถูกเพื่อบอกสถานะที่ถูกเลือก ผู้ใช้อาจเข้าใจผิดตั้งแต่แรกเห็นว่าเลือกได้หลายข้อ หรือไม่เลือกเลยก็ได้
น่าจะเป็นผลข้างเคียงของฟีเจอร์ที่ตั้งให้คลิกข้างนอกแล้วปิด
ถ้าฝั่งลบมี “Papercuts” ฝั่งบวกก็มีJuice ซึ่งเพิ่งมีพูดถึงใน HN เมื่อไม่นานนี้
บทความนี้แสดงให้เห็นชัดว่าทำไมผมถึงเกลียดการเขียนโปรแกรม UI
มันมีเรื่องที่คาดเดาไม่ได้และเพี้ยนเล็กๆ น้อยๆ ได้มากเกินกว่าความอดทนของผม ผมยังพอสนุกกับการคิดว่าบางอย่างจะล้มเหลวได้อย่างไรแล้วเขียนเทสต์ แต่การคลิกสุ่มๆ ไปเรื่อยเพื่อดูว่ามันพังไหมนั้นทั้งเสียสมาธิและน่ารำคาญ
ผมสงสัยว่าการทำ UI นั้นซับซ้อนโดยเนื้อแท้จริงๆ หรือว่าเรายังหาโมเดลการเขียนโปรแกรมที่ถูกต้องไม่เจอ บางครั้งผมก็สงสัยว่าการคาดหวังให้มันแสดงผลและทำงานตามที่ตั้งใจตั้งแต่แรกนั้น unreasonable ไหม?
การเกลา UI ควรทำแค่ตอนสร้างคอมโพเนนต์ครั้งแรก บางครั้งอาจต้องเอาคอมโพเนนต์ไปประกอบกันในรูปแบบอื่น หรือมีงานทำครั้งเดียวเฉพาะกิจบ้าง
พูดตามตรง ถ้ารู้ว่ากำลังทำอะไรอยู่ มันไม่ได้ใช้เวลานานขนาดนั้น design engineer ที่เก่งคือผู้เชี่ยวชาญของงานลักษณะนี้
มันมีอิสระมากเกินไป และองค์ประกอบพื้นฐานอย่างฟอร์มก็ควรทำงานได้ดีด้วยค่าปริยายอยู่แล้ว
วิธีแสดง UI ให้ดีผ่านโค้ดมีอยู่แล้ว ปัญหาคือเกมผลรวมเป็นศูนย์ฝั่งธุรกิจ UI ข้ามแพลตฟอร์มมีต้นทุนแพงเกินไปถ้าไม่ทำด้วยสแตก UI ที่ดูแย่ที่สุดอย่างHTML/CSS/JS
แต่แพลตฟอร์มเว็บนั้นพอใช้กับเอกสารได้โอเค ทว่าระดับนามธรรมไม่เหมาะกับแอป เลยทำให้ UI บนเว็บถูกประดิษฐ์ใหม่ซ้ำๆ ทุกปีด้วย abstraction ที่รั่วแบบใหม่เสมอ
แค่ตามให้ทันก็มีงานมากเกินพอแล้ว
ด้านอื่นก็คล้ายกัน ถ้าไม่มีวิธีง่ายๆ ในการส่ง request หรือใส่พารามิเตอร์ลงใน query ผู้คนก็จะถูกแรงกดดันตามธรรมชาติบีบให้ประดิษฐ์วิธีครึ่งๆ กลางๆ สารพัดขึ้นมา ต่อให้พยายามระวังแล้วก็ตาม
แพลตฟอร์มเว็บนั้นล้ำหน้ามากในด้านกราฟิก แต่แย่มากในฐานะ UI และไม่มีใครยอมรับแล้วลงมือเปลี่ยน คนเชื่อแค่ส่วนหน้า ขณะที่ legacy และความซับซ้อนของเบราว์เซอร์ขัดขวางการเปลี่ยนแปลง ถ้าทำเป็นไลบรารี มันก็ “ไม่ใช่มาตรฐาน” เลยไม่มีใครสนใจ
ขณะเดียวกัน UI บางแบบก็ใช้radio button เป็นกล่องสี่เหลี่ยม
มีปุ่มที่ถูกเน้นอยู่แต่กด Enter แล้วไม่ทำงาน
แล้วยังมีเมนูอีกสามชุดที่ซ่อนอยู่หลังสัญลักษณ์คนละแบบกัน ทั้งจุดไข่ปลา แฮมเบอร์เกอร์ และเคบับ
คุณภาพต่างกันมาก คนที่คอยเกลา UI เป็นคนที่น่าขอบคุณจริงๆ
แม้แต่ Apple ก็ยังทำแบบนี้ :(
ไม่เข้าใจว่าทำไมวิธีเอาองค์ประกอบ input ไปไว้ข้างใน label ถึงไม่ค่อยได้รับความนิยม
ถ้าทำแบบนี้ปัญหาก็หายไปหมด และไม่ต้องสร้าง
idที่ไม่ซ้ำไว้ใช้กับforด้วยเพียงแต่ยังมีเทคโนโลยีช่วยการเข้าถึงบางตัวที่ขึ้นชื่อว่ายังตีความแพตเทิร์นมาตรฐานแบบใหม่ที่ใช้ได้ไม่ออก ดังนั้นการยึดตาม มาตรฐานยุคสำริด จึงกลายเป็นแนวปฏิบัติที่ดีที่สุด [1]
เฟรมเวิร์กอื่นก็น่าจะคล้ายกัน ถ้าเอา input สองตัวนั้นไปครอบด้วยองค์ประกอบ
labelก็จะไม่เป็น HTML ที่ valid อีกต่อไปกับ radio button ไม่ใช่ปัญหา แต่บางคนเหมือนจะเจอเรื่องนี้แล้วเลยทำแบบนั้นเพื่อ “ให้ชัวร์ไว้ก่อน” คล้ายการใส่ semicolon ท้ายบรรทัดใน JavaScript คือแทบไม่จำเป็น แต่เพราะไม่รู้แน่ชัดว่าตอนไหนจำเป็น ก็เลยใส่มันไปทุกที่
สำหรับกรณีใช้งานทั่วไปของ checkbox/radio button ไวยากรณ์ก็ดูสะอาดกว่ามาก
ครอบ input ด้วย label แล้วถ้าอยากใส่สไตล์ให้ข้อความก็แค่เอาข้อความไปไว้ใน
spanจะทำlabelเป็นdisplay:flexและจัดตำแหน่งข้อความแบบนั้นก็ได้ตอน bug bash เราใช้วิธีนี้ แล้วได้ ticket มากกว่าคนที่ทำเมทริกซ์ชุดกรณีทดสอบแบบผลคูณคาร์ทีเซียนหลายมิติเสียอีก
การรู้จักเทสต์เคสแบบนั้นเป็นจุดเริ่มต้นก็ดี แต่ถ้าจะหาปัญหาเล็กๆ การทดสอบแบบสุ่ม จะทิ้งการทดสอบตามแผนไว้ข้างหลังอย่างรวดเร็ว
การทดสอบตามแผนมักหยุดอยู่ที่ happy path หรือข้อผิดพลาดที่คาดไว้ วิธีขัดเกลาแบบนี้หา bug ตามขอบมุมได้เร็วกว่ามาก
สุดท้ายก็จะเจอปัญหาหรือจุดปรับปรุงเล็กๆ อยู่เสมอ ซึ่งเป็นสิ่งที่การทดสอบตามแผนคงไม่ได้เจอบ่อยนัก
ผมขัดเกลาเว็บไซต์ส่วนตัว(https://dustinbrett.com) มาเกือบ 4 ปีแล้ว และรู้สึกว่ามันอาจจะไม่มีวันจบก็ได้
โชคดีที่ผมยังสนุกกับการทำมันอยู่
หวังว่าคงทั้งหมดนะ :-)
เวลาเห็น “เดสก์ท็อป OS บนเว็บเพจ” ส่วนใหญ่จะให้ความรู้สึกว่าทำค้างไว้ครึ่งๆ กลางๆ และพูดตรงๆ ว่ามันเริ่มมีเยอะเกินไปแล้ว แต่นี่กลับตรงกันข้าม คือแน่นมากและขัดเกลามาดีมาก
ทำออกมาได้ดีจริงๆ และสร้างแรงบันดาลใจด้วย แค่คิดว่าทำทุกอย่างนี้ขึ้นมายังไงก็น่าสนุกมากแล้ว
นั่นคือความอยากใช้ OS แบบมีหน้าต่าง บนมือถือ
ถ้าจะหาสิ่งที่ขาดไปอย่างหนึ่งก็คือใน explorer ใช้ mouse4/mouse5 ไม่ได้ “การขัดเกลา” นี่มันดำเนินต่อไปได้ตลอดกาลจริงๆ