
บทความชุดนี้ผมตั้งใจอยากให้คนที่เป็นนักพัฒนาโปรแกรม เห็นถึงคุณค่าของการออกแบบโปรแกรม ก่อนที่จะเริ่มเขียนโปรแกรม ส่วนตัวแล้วผมมองว่าการพัฒนาโปรแกรมเป็นเรื่องที่ไม่ยากนัก ทุกคนสามารถศึกษาได้ด้วยตนเอง แต่การออกแบบโปรแกรมที่ดีนั้นจะต้องอาศัยทั้งประสบการณ์ เวลา และความใสใจในคำแนะนำของผู้ใช้อย่างมากมาย
ผมต้องการให้บทความนี้เป็นพื้นฐานในการออกแบบโปรแกรม ไม่อยากให้นักพัฒนารุ่นใหม่ต้องเริ่มต้นจากศูนย์
ถ้าเห็นว่าอะไร ขาดตกบกพร่องก็ช่วยกันเติมนะครับ ผมจะได้ไม่ต้องเริ่มจาก 0 ด้วยคน
ตัวบทความจะเน้นเรื่องการออกแบบ โปรแกรมทั้ง 5 ด้าน

การออกแบบก่อนพัฒนา จะช่วยลดระยะเวลาในการพัฒนา ลดการพัฒนาที่เปล่าประโยชน์ และช่วยให้ความตั้งใจในการพัฒนาโปรแกรมของเราสามารถส่งไปถึงผู้ใช้ได้
บ่น: นักพัฒนาที่ผมเจอมา มักจะมุ่งไปที่การ coding เพียงอย่างเดียว และพยายามไม่สนใจผู้ใช้ เพราะไม่สนุกเลยที่จะไปพยายามเข้าใจ สิ่งที่เราไม่สนใจ แต่ถ้าเราต้องการพัฒนาโปรแกรมให้ดี เราคงต้องเปลี่ยนแนวคิด และทำให้การเข้าใจการทำงานของผู้ใช้เป็นเรื่องน่าสนใจ เพราะการเข้าใจผู้ใช้เป็นสิ่งที่ช่วยให้การพัฒนาโปรแกรมสนุกขึ้นเป็นสองเท่า
ขอให้สนุกกับการออกแบบ ก่อนเริ่มพัฒนานะครับ
ผมชอบเรื่อง interface design มานานแล้ว ก็เลยมีเอกสารพวกนี้มากอยู่เหมือนกัน แต่เอกสารที่ชอบที่สุดคงเป็น presentation ของ John Geleynse (Manager, Software Technology Evangelist & User Experience Evangelist from Apple) เป็น presentation ที่พูดในงาน WWDC ปี 2006
นาย John เปรียบเทียบ application กับอาหารสองแบบ คือ

ประสบการณ์ที่ได้จาก Fast Food

ประสบการณ์ที่ได้จาก Fine Dining
การออกแบบโปรแกรม ก็ไม่ต่างจากการทำอาหารขึ้นอยู่กับว่าเราต้องการเขียนโปรแกรมแบบ fast food หรือโปรแกรม Fine Dining ทั้งสองแบบก็มี business model ที่ไม่เหมือนกัน แต่ถ้าเราต้องการสร้างโปรแกรมที่ดี ให้กับกลุ่มเป้าหมายของเรา สิ่งที่เราต้องการคือการออกแบบ

john แบ่งสิ่งที่ต้องคิดตอนที่ออกแบบโปรแกรมเป็น 5 อย่าง
สำหรับรายละเอียดในแต่ละตัว ผมจะค่อยๆ เล่าผ่านทางนี้ไปเรื่อยๆ นะครับ
ผมจะมีเว้นวรรคมากหน่อย เพราะน่าจะมีหลายคนที่อ่านด้วย browser ที่ไม่ตัดคำภาษาไทย ถ้าเห็นว่าอันไหนไม่เหมาะสมก็แก้ไขกันได้เลยนะครับ
สิ่งแรกที่ต้องเริ่มสำหรับการออกแบบคือการ plaining โดยเน้นว่าจะสร้างไปทำไม และจะสร้างไปเพื่อใคร

เราต้องบอกได้ว่ากลุ่มผู้ใช้มีพื้นฐานอย่างไร มีประสบการณ์อย่างไร เคยใช้งานคอมพิวเตอร์หรือเปล่า มีความรู้ความเชียวชาญในสายงานใด มากน้อยแค่ไหน ยกตัวอย่างเช่น โปรแกรม iphoto ออกแบบมาสำหรับคนทั่วไป ไม่ได้มุ่งเน้นไปที่กลุ่มผู้เชียวชาญ (pro) ดังนั้นคำศัพท์ที่ใช้ ขนาดของ icon รูปร่างและสีสัน จะไม่เหมือนกับ aperture ที่ออกแบบสำหรับ pro

Aperture

iPhoto
จะเห็นว่าหน้าจอปกติของ iphoto ไม่ได้เป็นสีดำโดยพื้นฐาน และไม่มี menu ที่ใช้งานได้เอนกประสงค์แต่เน้นว่าทำความเข้าใจได้ง่ายๆ
ถ้ามาดูว่าสิ่งที่ต้องคำนึงในการวางแผนมีอะไรบ้าง ก็คงเรียงออกมาตามนี้
เข้าใจคนที่จะใช้ว่าอะไรที่เค้าให้ความสำคัญ
ไม่มีประสบการณ์
มีประสบการณ์มาก่อน
เข้าใจว่าโปรแกรมของเราเอาไว้แก้ปัญหาอะไรเป็นสำคัญ โดยให้วิเคระห์สิ่งที่เราช่วยผู้ใช้ เอาสิ่งที่เป็น value-add และเป็นจุดเข็งของโปรแกรมของเรา (core strength) ออกมาชัดๆ จากนั้นก็ออกแบบให้เหมาะกับการใช้งาน โดยคำนึงถึงการใช้งาน (Design for usability)
workflow ว่ากระบวนการคิดของผู้ใช้เป็นอย่างไร โปรแกรมก็ควรจะช่วยลดเวลา หรือเพิ่มประสิทธิภาพแต่ไม่ใช่พยายามไปเปลี่ยน flow
การเชื่อมต่อกับโปรแกรมอื่นๆ (ผ่าน file, ผ่าน framework) เพราะไม่มีโปรแกรมรองรับความต้องการได้ทุกรูปแบบ แต่โปรแกรมจะสามารถรองรับได้มากขึ้นถ้าสามารถคุยกับโปรแกรมอื่นได้ เช่นการเปิด web services ของ google map หรือ การที่เรา เรียกใช้ totem ผ่านทาง command line ได้ หรือการที่โปรแกรมมากมายบน apple พยายามให้สร้าง function ให้โปรแกรมอื่นๆ เรียกผ่าน automator หรือ apple script เป็นต้น
ให้นำเสนอ solution แทนที่จะเป็น feature
พึงระลึกว่า โปรแกรมที่ดีจะทำให้เราไม่รู้สึกว่ากำลังต้องใช้โปรแกรมอยู่
เข้าใจความต้องการของตลาด (market’s need) รู้ว่าผู้ใช้ต้องการใช้โปรแกรมของเราไปทำแก้ปัญหาอะไร และอะไรเป็นปัญหาที่เราต้องการจะแก้ให้เค้า ถ้าโปรแกรมของเราทำออกมาสำหรับตกแต่งภาพทางการแพทย์ ก็ต้องเข้าใจว่าปัจจุบันผู้ใช้มีปัญหาอะไรที่ photoshop, gimp, acdsee แก้ให้เค้าไม่ได้
เข้าใจลำดับความสำคัญของตลาด (market’s priority) การพยายามเขียนโปรแกรมที่สามารถแก้ได้ทุกปัญหาจะทำให้โปรแกรมซับซ้อน หรืออาจใช้งานไม่ได้เลย ถ้าอยากให้โปรแกรมขายออกก็ให้แก้ปัญหาใหญ่ที่สุดที่คนส่วนมากเจอก่อน

ตารางนี้เป็นเหมือนแผนที่ ซึ่งจะบอกว่าเราน่าจะแบ่งกลุ่มผู้ใช้อย่างไร และช่วยบอกด้วยว่าผู้ใช้แต่ละกลุ่มต้องการอะไร เช่น สิ่งที่ผู้ใช้กลุ่มธุรกิจต้องการ ไม่ใช่เรื่องความเร็วในการใชงาน แต่เค้ามองว่าเรื่องการเข้ากันได้กับโปรแกรมอื่นๆ มีความสำคัญมากที่สุด ถ้าโปรแกรมเราสร้างเอกสารออกมาแล้วส่งไปให้ลูกค้า แต่ลูกค้าดันเปิดไม่ออกก็ถือว่าโปรแกรมของเราสอบตกในฐานะโปรแกรมสำหรับธุรกิจ นั่นคือเหตุผลว่าทำไม Open office ถึงยังไม่ถูกใช้ในธุรกิจ และเป็นเหตุผลว่าทำไมถึงต้องพยายามดัน Open Document ให้เป็นมาตรฐานโดยเร็วที่สุด
ก่อนเริ่มพัฒนาให้พิจารณาแล้วสำรวจตัวเองเป็นข้อๆ
แผนที่ดีช่วยลดเวลาในการพัฒนาและสร้างความพึงพอใจให้กับผู้ใช้ แต่เวลาที่เราไปจีบสาวถึงแม้ว่าจริงๆ เราจะเป็นคนดีมาก แต่ถ้าเจอกันครั้งแรกแล้วเค้าไม่ชอบเราซะแล้ว การจะให้เค้ามาเห็นความดีของเราก็เป็นเรื่องยาก คงมีหลายๆครั้งที่เราเห็นบางโปรแกรมแค่ screen short ก็เมินซะแล้ว ถ้าไม่อยากให้เหตุการณ์นั้นเกิดกับโปรแกรมของเราก็ลองมาดูกันครับว่าทำอย่างไรได้บ้าง

ตอนนี้เราจะพูดเรื่องการออกแบบประสบการณ์ครั้งแรกให้ประทับใจคนใช้ ที่ใช้คำว่าออกแบบประสบการณ์เพราะเราเป็นคนดำเนินเรื่องครับ ต้องรับบทผู้กำกับที่ทำให้ผู้ใช้ประทับใจให้ได้
ความสวยงาม เป็นเรื่องหนึ่งที่สร้างความประทับใจได้มาก พยายามให้เค้ารู้สึกว่าโปรแกรมของเราสวย ตรงนี้จะเริ่มทำให้เค้ามีความพยายามที่จะสนใจโปรแกรมของเรา จากนั้นก็ต่อด้วยความ ง่าย สามารถเริ่มต้นกับโปรแกรมของเราได้ทันที ผมเคยติดตั้ง driver สำหรับ scaner ตัวนึ่ง (บน windows) หลังจากการติดตั้งที่ยาวนาน ผมเจอโปรแกรมประมาณ 5 ตัว อยู่บน desktop ของเครื่อง สิ่งนี้ไม่ได้สร้างความประทับใจให้ผมเลย แต่กลับสร้างความสับสนให้อย่างมาก ผมไม่รู้ว่าจะใช้โปรแกรมไหนสำหรับการ scan รูปและผมก็ไม่ได้ขอให้ติดตั้งโปรแกรมเหล่านี้ลงไป สิ่งที่ผมต้องการจากการติดตั้ง driver คือโปรแกรมง่ายๆ ที่ติดตั้งไปแล้วทำให้เครื่อง scaner ใช้งานได้ ไม่จำเป็นต้องสร้างความสับสนให้ผู้ใช้
ในกรณีที่ผู้ผลิตต้องการแถมโปรแกรมอื่นๆ ก็เป็นเรื่องที่ดีครับ แต่ไม่ควรติดตั้งมาให้เลย ควรให้ผู้ใช้เลือกลงจะดีกว่า (ให้ auto boot แล้วเลือกติดตั้งก็ได้) เพราะนอกจากช่วยให้ผู้ใช้ไม่สับสนแล้ว การที่ผู้ใช้ได้เลือกเองก็ทำให้โอกาสที่จะลองใช้โปรแกรมนั้นๆ มีสูงขึ้น
นี่เป็นตัวอย่างของความประทับใจครั้งแรกของผมกับโปรแกรม driver ของ scaner เจ้าหนึ่ง ดังนั้นถ้าไม่อยากให้ผู้ใช้งานโปรแกรมของเรารู้สึกไม่ดี ลองดูเทคนิด 4 ข้อนี้ครับ
เรามาดูรายละเอียดในแต่ละตัว
เริ่มกันตั้งแต่กล่องเลยครับ


ของ windows หาไม่เจอ ใครรู้ช่วยเพิ่มเติมเลยนะครับ
ยังไงก็ต้องให้เค้าได้ลองใช้โปรแกรมของเราให้ได้ก่อน หลังจากนั้นกระบวนการ register หรือการจ่ายเงินค่อยตามๆ กันมา
สุดท้ายหัวใจของ first impression คือทำอย่างไรก็ได้ให้ผู้ใช้เริ่มใช้งานโปรแกรมของเราให้เร็วที่สุด โดยมีปัญหาน้อยที่สุด
มาถึงช่วงที่สำคัญที่สุดในการออกแบบโปรแกรม เพราะกุญแจในการเข้าถึงผู้ใช้คือการปรับตัวเข้ากับสภาพแวดล้อมที่ผู้ใช้อยู่ เช่น เมื่อโปรแกรมของเราอยู่ในระบบ windows ซึ่งผู้ใช้คุ้นเคยกับการทำงานแบบหน้าต่างเดียวโปรแกรมก็ควรแสดงแบบหน้าต่างเดียว

โปรแกรม Adobe Photoshop แสดงแบบหน้าต่างเดียวบน windows แต่เมื่อทำงานบน mac ที่ผู้ใช้คุ้นเคยแบบหน้าหน้าต่าง

โปรแกรม Adobe Photoshop ก็จะแสดงเป็นแบบหลายหน้าต่าง
เพราะในสภาพแวดล้อมที่ผู้ใช้คุ้นเคย ผู้ใช้จะนำประสบการณ์ของเค้ามาตีความโปรแกรมของเรา และพยายามทำในสิ่งที่คุ้นเคยเสมอ ยกตัวอย่างโปรแกรม Adobe Photoshop บนระบบ Windows ผมจะคุยคุยที่จะย่อขนาดจอทีเดียวแล้วทุกอย่างหายไปหมด ถ้าโปรแกรมแสดงเป็นหน้าต่างๆ และไม่สามารถปิดได้ในทีเดียว ผมจะรู้สึกไม่ดีแน่ๆ ตรงข้ามกันถ้าทำงานบน OS X พฤติกรรมปกติคือผมจะเปิดโปรแกรม Finder ไว้อีกตัวเพื่อใช้ดึงรูปที่ต้องการมาเปิดใน Photoshop และคงรู้สึกไม่ดีถ้ามีฉากมาบังไว้
เข้าเมืองตาหลิวก็ต้องหลิ่วตาตามครับ มันจะดีหรือไม่ดีอย่างน้อยคนรอบข้างก็เข้าใจเราได้ง่ายขึ้น หลังจากนั้นถ้าผู้ใช้เห็นว่าแบบไหนง่ายกว่า ก็ให้แก้ property เอา

ในแต่ละ platform ก็มีสิ่งที่ต้องคิดไม่เหมือนกัน การได้ลองเปรียบเทียบหลายๆ แบบน่าจะทำให้เราเข้าใจใน platform ที่เราจะสร้างมากขึ้น

ผู้ใช้ mac คุ้นเคยกับการที่ menu ของโปรแกรมอยู่ด้านบนของจอภาพ

ผู้ใช้ windows คุ้นเคยกับการที่ menu อยู่ติดกับโปรแกรม ใต้ title bar
เหมือนในตัวอย่าง Adobe Photoshop ถ้าเป็น mac จะเน้นให้ทุกอย่างเป็นหน้าต่างย่อยๆ ถ้ากดย่อก็จะย่อเฉพาะหน้าต่างนั้นๆ และขณะที่โปรแกรมไม่ Active จะแสดงเฉพาะหน้าต่างหลักเท่านั้นพวก tools bar จะหายไป ในส่วนของ windows จะให้หนึ่งโปรแกรมเป็นหนึ่งหน้าต่างถ้าย่อก็จะย่อหมด
ผู้ใช้บน mac จะสังเกตุ message ที่เกิดขึ้นบน dock เช่นการกระโดษ หรือการที่มีตัวเลขบน icon โปรแกรมที่ดีจะสื่อสารกับผู้ใช้ผ่านทาง Dock หรือ Title bar ในแบบที่ผู้ใช้บน platform นั้นคุ้นเคย

ดังนั้นถ้าคุณพัฒนาโปรแกรมบน mac
ถ้าคุณพัฒนาโปรแกรมบน windows ก็พยายามอย่าให้ผู้ใช้ต้อง reboot แต่ถ้าจำเป็นผู้ใช้ก็ให้อภัยได้เพราะทำอยู่เป็นประจำ
ส่วนนี้เป็น concept ที่ไม่ว่าคุณพัฒนาโปรแกรมบน mac หรือ windows ก็ควรพยายามทำให้ได้แต่พึงระลึกว่าถ้าคุณพัฒนาโปรแกรมในปัจจุบัน พฤติกรรมของผู้ใช้จะถอดๆ เสียบๆ อุปกรณ์อยู่ตลอดเวลา ถ้าโปรแกรมของคุณต้องเชื่อมต่อกับระบบเหล่างนี้ก็ควรเขียนโปรแกรมให้รองรับไว้ด้วย
อุปกรณ์สำคัญๆ ก็เช่น
เดี๋ยวนี้ OS เป็นระบบผู้ใช้หลายคนกันหมดแล้ว แถมยังสามารถเปลี่ยนผู้ใช้ได้ on the fly อีกต่างหากดังนั้นเราจึงควร
OSX = /Users/apirak
Windows = C:\Documennt&Setting\apirak
Linux = /Home/apirak

ให้โปรแกรมของเราสามารถทำได้เหมือนโปรแกรมอื่นๆ บน platform นั้นๆ เช่น Drag and Drop ผู้ใช้สามารถเปิด Address book แล้วลากชื่อผู้ใช้มาใส่ในโปรแกรมเราได้, ใช้ panel ที่ผู้ใช้คุ้นเคย เช่นตัวเลือก font หรือตัวเลือกสี ยกเว้นว่าโปรแกรมของเราสามารถทำได้ดีกว่า
เทคนิค.. พยายามใช้ของที่ platform นั้นๆ มีมาให้อยู่แล้วเพื่อประหยัดเวลาในการพัฒนาและทำให้ผู้ใช้คุ้นเคยกับโปรแกรมของเราได้ง่ายขึ้นด้วย
สิ่งที่เราควรออกแบบคือตัว core value ของโปรแกรม ไม่ต้องเสียเวลาออกแบบ color panel ใหม่ถ้ามันไม่ใช่ core value ของเรา
OS X และ Windows ต่างเตรียมระบบที่ทำให้โปรแกรมของเราสามารถรองรับผู้ใช้ได้ตามข้อจำกัดของเค้า โดยนักพัฒนาเพียงแค่ใส่ใจในรายละเอียดของโปรแกรม เช่นกำหนดชื่อให้กับรูปภาพและช่องกรอกข้อมูล เพื่อให้ OS อ่านตัวหนังสือดังกล่าวกับให้ผู้ใช้ที่มีปัญหาทางสายตา เป็นต้น ระบบที่มีมาให้ไม่ต้องการ การติดตั้งเพิ่มสามารถใช้งานได้เลย

นักพัฒนาโปรแกรมสามารถทำให้โปรแกรมรองรับได้หลายภาษาโดยอาศัย framework ที่มีอยู่แล้วใน International Technology ทำให้นักพัฒนาไม่ต้องเขียนโปรแกรมเพื่อวาดตัวอักษรเอง สามารถใช้งาน Unicode ได้ทันที และสามารถใช้กับหลายๆภาษาได้โดยไม่ต้องแก้โคต

นักพัฒนาควรใช้พลังของ Spotlight ให้เต็มที่โดยการใส่ Metadata ให้กับเอกสาร หรือสร้าง plugin ให้ Spotlight เพื่อให้มันสามารถค้นหาเอกสารของโปรแกรมให้กับผู้ใช้ได้ ซึ่งทาง Apple ได้จัดเตรียมเครื่องมือในการทำให้แล้ว (ใน Vista ไม่รู้ว่ามี feature นี้มาด้วยหรือเปล่า ถ้าทำให้ compatible กับ google desktop แทนละกัน)
เราใช้ตัวอย่างการออกแบบจาก OS X นะครับ สำหรับ Gnome, KDE, Vista, XP etx. ไว้ค่อยๆ เขียน
การออกแบบ GUI ของเค้ามีแนวคิดในการออกแบบที่เหลือเชื่อมากครับ เก็บรายละเอียดตามทฤษฏีได้ครบมากๆ ตอนที่ไป WWDC เค้าบอกว่า John Geleynse นี่เหมือนพ่อมดเลย สามารถเสกโปรแกรมที่ดูใช้งานยากๆ ให้กลายเป็นโปรแกรมชั้นดีได้เลย ในบทนี้เราจะมาดูกันละส่วนๆ เลยครับ

การออกแบบบน Aqua มีหลักอยู่ 5 อย่าง
วันนี้ก็พูดถึงตอนแรกสุดครับ คือ design principle จริงๆ พวกนี้มีอยู่ในหนังสือเรียน Application Design อยู่แล้วผมก็คัดเอาที่สำคัญๆ มาบอกให้ฟังว่ามีอะไรที่เราต้องใส่ใจบ้าง
อย่างที่บอกตอนแรกว่า Apple เก็บรายละเอียดดีมากๆ ก็หมายถึงเค้าเก็บรายละเอียดตาม Design Principle ได้ดีมาๆจริง ถ้าเราต้องการให้ผู้ใช้เข้าใจโปรแกรมของเราง่ายๆ ก็ห้ามลืมพื้นฐานเหล่านี้เด็จขาด
ใช้ความรู้ที่ติดตัวผู้ใช้มาให้เป็นประโยชน์ พยายามใช้สัญลักษณ์หรือคำพูดที่ผู้ใช้คุ้นเคยเพื่อเปรียบเทียบถึงการทำงานของโปรแกรม ยกตัวอย่างง่ายๆ ก็เช่น คนรูู้จักว่า Trash (ขยะ) คือถังขยะเอาไว้ทิ้งของที่ไม่ใช้ เราจึงนำมาเป็นสัญลักษณ์แทนที่ลบ file และใช้ในการกู้คืนไฟล์ข้อมูล

ใช้สื่อว่าเป็นที่ทิ้งขยะ สามารถนำไฟล์ต่างๆมาใส่ในนี้ และรูปถังขยะเต็มแทนความหมายอีกนัยว่าถ้าเราเผลอทิ้งอะไรลงไปมันจะยังอยู่ในถังขยะ ซึ่งคล้ายๆกับ Recycle bin ของ Windows

บน Windows ไม่ได้ใช้คำที่หมายถึงที่ทิ่งขยะ แต่ให้ความหมายว่าที่กู้ข้อมูลแทน น่าจะเพราะใน windows รุ่นแรกๆ ไม่ได้มี concept ของถังขยะดังนั้นคนจึงไม่ได้ใช้ Recycle bin ในการลบ แต่ใช้ในการกู้ข้อมูลมากกว่า หรือไม่ช่วงแรกอาจจะใช้ชื่อว่า bin แต่กลัวซ้ำกับคำว่า binary ก็เลยใส่ Recycle เข้าไป :D (ส่วนตัวผมว่าตั้งชื่อ garbage น่าจะง่าย)
จะเห็นว่า ถังขยะไม่ได้ให้ความหมายที่ถูกต้องจริงๆ แต่เราใช้อุปมาอุปมัย ถึง function ในโปรแกรม ดังนั้นสิ่งสำคัญคือเราต้องหาสมดุลย์ระหว่างความหมายจริงและความหมายในทาง function ให้กับโปรแกรม และพยายามใช้ความเข้าใจเก่าๆ ของผู้ใช้ให้มากที่สุด
ระบบที่ใช้ Mouse จะอยู่บนพื้นฐานสองอย่าง โดยมีสมติฐานว่าผู้ใช้ต้องเห็นทุกสิ่งที่ตัวเองทำบนจอตลอดเวลาและสามารถใช้ mouse ชี้ได้ทุกอย่างที่เห็น (ไม่ใช่ว่าบางบริเวณเลื่อน mouse เข้าไปไม่ได้)
พื้นฐานแรกคือ การเรียงลำดับการสั่งงาน ผู้ใช้เลือกจะเป็นประธาน (the noun) ก่อนจากนั้นจึงเลือกกริยา (the verb) ให้กับประธาน เช่น ในโปรแกรม iTune ผู้ใช้จะต้องเลือกเพลงก่อน จากนั้นจึงกดปุ่มเล่นเพลง ไม่ใช่กดปุ่มเล่นเพลง แล้วค่อยเลือกเพลง เป็นต้น เมื่อผู้ใช้เลือกสิ่งที่ต้องการ ฟังก์ชั้นที่สามารถใช้งานได้ก็จะเปิด (enable) และที่ไม่ใช่ก็จะปิด (disable) ผู้ใช้แค่ดูไปรอบๆ ว่าทำอะไรกับสิ่งนี้ได้บ้าง และเลือกเฉพาะฟังก์ชันที่เปิดอยู่ แทนที่จะต้องจำว่าใช้อะไรได้บ้าง
อย่างที่สองคือ การเลือกประธาน และกริยา สามารถทำได้ในขั้นตอนเดียว เช่น การการลากเอกสารไปใส่ใน folder เป็นต้น ในกรณีนี้ผู้ใช้ไม่ได้เลือก copy paste จาก menu แต่ใช้วิธีสั่งงานโดยตรงซึ่งตรงไปตรงมากว่า แต่ในกรณีนี้ผู้ใช้ต้องจำได้ว่าสิ่งที่กำลังลากไปจะทำอะไรกับสิ่งที่รออยู่ เช่นเมื่อลากไฟล์ไปใส่ถังขยะหมายถึงลบไฟล์ หรือเมื่อลากรูปภาพไปใส่ printer มันจะ print ให้ หรือลาก ไฟล์ไปใส่ใน Terminal มันจะแปลงเป็น part ของไฟล์นั้นๆ เป็นต้น

ทำให้ผู้ใช้รูปสึกว่าสามารถควบคุมโปรแกรมของเราได้ การกระทำของผู้ใช้ควรได้ผลทันที ยกตัวอย่างเช่การ drag and drop เมื่อผู้ใช้ click แล้ว drag ในเสี้ยววินาทีนั้นสิ่งที่ผู้ใช้ลากไว้ก็ควรติด mouse ขึ้นมาด้วย เป็นต้น
พยายามเขียนโปรแกรมให้รองรับการทำ Direct manipulate เช่นถ้าเราพัฒนาโปรแกรม fax เมื่อผู้ใช้ลาก เอกสามาใส่ในโปรแกรมของเราบน dock (task bar) โปรแกรมก็ควรเริ่มกระบวนการส่ง fax แทนที่ผู้ใช้จะต้องเปิดโปรแกรมแล้วกดปุ่ม Fax
อย่าให้คอมพิวเตอร์คิดแทนคน ต้องให้ผู้ใช้เป็นคนกำหนดค่าต่างๆ หรือควบคุมโปรแกรมด้วยตนเอง บางโปรแกรมพยายามกำหนดตัวเลือกให้กับผู้ใช้ ซึ่งเป็นเรื่องที่ดีแต่ต้องระวังว่าจะเป็นการจำกัดทางเลือกของผู้ใช้และการทำแบบนี้จะเป็น Computer control ไม่ใช่ User control
ตัวอย่างเช่นโปรแกรม MS Excel

ออกแบบตัวเลือกสีเป็น computer control โดยบังคับให้เลือกสีเท่าที่มี น่าจะเป็นความพยายามของ excel ที่เลือกสีที่ควรเหมาะสมให้กับผู้ใช้ หรือช่วยให้ผู้ใช้เลือกสีให้เหมือนกันได้ง่ายๆ
หัวใจของการสร้างสมดุลย์ของการกำหนดทางเลือก คือการเปิดโอกาสให้ผู้ใช้ทำอะไรก็ได้ที่จะทำให้งานเร็จ และช่วยเตือนผู้ใช้เมื่อกำลังจะทำผิดพลาด เช่นถ้าผู้ใช้กำลังจะทำลายข้อมูลตัวเอง เราควรจะเตือนผู้แต่ต้องเปิดโอกาสให้ทำได้ถ้าต้องการจริงๆ

ตัวอย่างโปรแกรมที่เป็น user control จะแนะนำผู้ใช้และเปิดให้ผู้ใช้เลือกสิ่งที่ต้องการ

อีกหนึ่งตัวอย่างที่เป็น user control และแนะนำผู้ใช้เมื่อทำผิดพลาดแต่ถ้าต้องการทำจริงๆ ก็สามารถทำได้ด้วย
ส่วนตัวแล้วเวลาที่ออกแบบครั้งแรกควรกำหนดให้ผู้ใช้ทำได้ทุกอย่างเป็นสำคัญ จากนั้นค่อยๆ เพิ่มความสะดวกให้กับผู้ใช้โดยไม่ลดความยืดหยุ่นที่เรามีในครั้งแรก เพราะการโดนจำกัดทางเลือกหงุดหงิดกว่า การทำผิดครับ
การให้ Feedback และ communication เป็นอะไรที่มากกว่าการส่ง error message ให้กับผู้ใช้ จริงๆแล้วมันคือการที่ให้ผู้ใช้ได้รับรู้ถึงสิ่งเกิดขึ้นและเริ่มที่จะสื่อสารกับโปรแกรมของเรา
เมื่อผู้ใช้เริ่มต้นทำอะไรซักอย่าง โปรแกรมจะต้องสื่อสารว่าได้รับรู้การกระทำนั้นๆ แล้วและแสดงให้เห็นว่ากำลังดำเนินการอยู่ ผู้ใช้จะได้รู้ว่าสั่งแล้วโปรแกรมรับรู้หรือเปล่าหรือว่าต้องสั่งใหม่ การใช้ภาพแสดงการทำงานของโปรแกรมเป็นวิธีที่ดี ที่จะทำให้ผู้ใช้รู้ว่าโปรแกรมรับรู้การสั่งการแล้ว และกำลังดำเนินการอยู่ (โปรแกรมส่วนมากจะเงียบและบอกผู้ใช้อีกทีเหมือนทำเสร็จแล้ว โดยเฉพาะ web application) ตัวอย่างที่ดีอย่างหนึ่งคือตอนที่ double click บน application แล้ว icon กระโดดขึ้นลงแสดงให้เห็นว่ากำลังเปิด application นี้อยู่
ผู้ใช้ส่วนใหญ่ไม่ชอบรอถ้าไม่เห็น feedback จากโปรแกรม จะเริ่มบ่นและอาจจะปิดโปรแกรมไปเลยก็ได้ อย่างน้อยถ้ามี animation ว่ากำลังทำงานอยู่ น่าจะดีกว่า
ช่วยๆ กันเติมเต็มได้นะครับ ผมคนเดียวคงนานเลย
ทุกข้อมีความสำคัญในตัวเอง ถ้าใครอยากจะศึกษาการออกแบบโปรแกรมบน Aqua ก็แนะนำให้อ่านที่นี่ครับ Human Interface Design Principles ในนี้มีหลักการคิดของแต่ละหัวข้ออยู่ครบเลย ถ้าสงสัยตรงไหนก็คุยกันได้ครับ คิดว่า อ.เดฟ สอนวิชานี้อยู่น่าจะช่วยให้คำตอบชัดๆ กับเราได้
โปรแกรมที่จะพยายามตอบสนองผู้ใช้ส่วนใหญ่ให้ได้ก่อน การที่เราพยายามออกแบบให้รองรับกับความต้องการของทุกคน จะทำให้ผู้ใช้ส่วนใหญ่ลำบากไปด้วย ยกตัวอย่าง toolbar ของโปรแกรม MS Word เครื่องมือส่วนมากเป็นเครื่องมือที่ผู้ใช้ส่วนมากไม่ได้ใช้ แต่กลับมีอยู่บน tools bar เพราะต้องการให้โปรแกรมรองรับการทำงานของทุกคน
ผู้ใช้ส่วนใหญ่จะเคยชินกับการใช้งานโปรแกรมอื่นๆ อยู่แล้ว ไม่ได้เริ่มต้นจากศูนย์ การจัดระเบียบโปรแกรมให้ทุกไปในแนวเดียวกันกับโปรแกรมอื่นๆ เป็นสิ่งหนึ่งที่ทำให้ผู้ใช้ส่วนใหญ๋เข้าใจโปรแกรมของเราทันทีจากจิตใต้สำนึก สิ่งเล็กๆ น้อยๆ อย่าง ลำดับบน Menu, การจัดวาง layout ของหน้าต่างหลัก, Toolbars หรือ Utility windows เป็นสื่งที่ผู้ใช้ไม่ได้คิด แต่ผู้ใช้รู้สึกได้
Affordances: ให้ใส่คำบอกใบ้ในการใช้งานส่วนต่างๆ ในโปรแกรม ไม่ว่าจะเป็นรูปใน icon การเคลื่อนที่ของมัน ลองนึกถึง genie effect ที่โปรแกรมของเราถูกสูบลงไปบน dock แทนที่จะหายไปอยู่บน dock เฉยๆ ทำให้คนมองตามแล้วรู้ว่าโปรแกรมของเค้าไปอยู่ที่ไหน และสามารถคาดหวังได้ว่าถ้ากดที่ dock แล้วโปรแกรมจะกลับมาเหมือนเดิม
Simplicity: มีให้ใช้ตอนที่ต้องใช้มัน เช่นปุ่ม stop บน safari หรืออย่างโปรแกรม driver ทันทีที่ผมติดตั้งโปรแกรมก็หายไป และผมก็สามารถใช้งานอุปกรณ์ของผมได้เลย driver ไม่ควรทิ้งอะไรไว้บน Desktop ไม่ควรติดตั้งโปรแกรมที่เราไม่ต้องการ
Familiarity: ความรู้สึก หรือแนวคิดของคนมีพื้่นฐานมาจากประสบการณ์ในอดีต ผู้ใช้เคยใช้โปรแกรมอย่างไรก็จะใช้อย่างนั้น พยายามใช้สิ่งที่ OS X มีใว้ให้แล้วเพราะผู้ใช้จะคาดหวังอย่างนั้นเช่นระบบ text to speech หรือการพิมพ์แล้วสั่งบันทึกเป็น pdf ได้ ผู้ใช้คาดหวังจะได้รับสิ่งเหล่านี้จากโปรแกรมของเรา
Availability: ให้สิ่งที่ผู้ใช้ต้องการจะใช้อยู่บนหน้าจอ หรืออยู่บน toolbar ซึ่งง่ายแก่การใช้งานมากกว่าที่จะอยู่ใน menu ที่ต้องจำถึงสองต่อ (File -> Save) แต่ต้องแน่ใจว่าเป็นสิ่งที่ผู้ใช้ต้องการใช้อยู่บ่อยๆ จริงๆ
Feedback: ให้ผู้ใช้รู้ว่าตัวเองได้ทำไปแล้วไม่ใช่ทำแล้วนิ่งไปเลย เช่น progress bar, แสดงความเปลี่ยนแปลงที่เกิดขึ้น เป็นต้น เราจะสังเกตว่า OS X มีสิ่งเหล่านี้อยู่ตลอดเช่นตอนที่กดโปรแกรมบน dock ก็ไม่ใช่ว่าหน้าจอจะอยู่นิ่งๆ ไม่มีอะไรเกิดขึ้น แต่ icon บน dock จะกระโดดขึ้นลงตอบสนองต่อการกดของเรา หรือตอน double click บน icon แล้วรูป icon ขยายขึ้นจนหายไปก็เป็นการให้ Feedback กับผู้ใช้เช่นกัน
จะยกตัวอย่างให้ดูนะครับ
ตัวอย่างอันแรก อันแรกก็เป็น itune จุดประสงค์ของมัน (สิ่งที่ผู้ใช้ส่วนใหญ่ต้องการ) คือเป็นโปรแกรม music management ทำอย่างไรให้ผู้ใช้สามารถบริหารจัดการเพลงของตัวเองได้

เราแบ่งส่วนประกอบหลักๆ ของโปรแกรมได้เป็น
ผู้ใช้ส่วนใหญ่สามารถที่จะใช้งานโปรแกรมได้อย่างรวดเร็ว แทบจะไม่ต้องเรียนรู้อะไรเลย “Just get it” ในขณะที่คนที่มีความต้องการเฉพาะก็จะต้องเรียนรู้เพิ่มเช่น หน้าต่าง equalizer ไม่ได้ขึ้นมาในหน้าแรก เพราะผู้ใช้ส่วนใหญ่ไม่ได้ใช้ ถ้าต้องการก็ต้องเลือก menu bar กลับกันถ้าไม่ใช่โปรแกรม iTune แต่เป็นโปรแกรม pro logic ซึ่งที่คนส่วนใหญ่ต้องการกำหนดคุณภาพเสียงอย่างละเอียด ก็ควรมี equalizer ขึ้นมาบนหน้าจอเลย ไม่ต้องให้ผู้ใช้กลุ่มใหญ่ของโปรแกรมต้องศึกษา
ตัวอย่างอันที่สอง เป็นโปรแกรม Unison เป็นโปรแกรมที่ใช้ในการดึงข้อมูลจาก uninet แหล่งความรู้ขนาดใหญ่เลยละครับ

ทันทีที่เห็นโปรแกรมเราก็เข้าใจถึงการเก็บข้อมูลเป็นชั้นๆ ได้ทันทีโดยอาศัยว่าผู้ใช้คุ้นเคยกับการใช้ file & folder ใน Finder อยู่แล้ว (เมื่อดูความสัมพันธ์ของ menu ก็ทำให้เราเข้าใจโปรแกรมได้มากขึ้นและพอจะคาดได้ว่ากด group แล้วจะมีอะไรออกมา) เราจะสังเกตุว่า icon ที่อยู่ในแต่ละกลุ่มแสดงให้เราเห็นว่าจะมีอะไรอยู่ด้านในบ้าง เมือเรา double click ไปที่ icon นั้นๆ

โปรแกรมก็แสดงอย่างชัดเจนว่าคนดูสามารถดูอะไรได้บ้าง (Message, File, Image, Music) และแน่นอนเราจะเห็นถึงความสัมพันธ์กับ menu ด้านบน
ตัวอย่างต่อไปเป็นโปรแกรมบริหารจัดการ RAID ซึ่งใช้ในการดูว่า Harddisk แต่ละก้อนของเราถูกเชื่อมกันอย่างไร และช่วยกันทำงานอย่างไร

จะเห็นว่าโปรแกรมพยายามสื่อสารให้ผู้ใช้เข้าใจการทำงานของโปรแกรม RAID พอเรามองเราก็จะพอเดาได้ว่า Harddisk สามก้อนที่เชื่อมกันด้วยสีแดงมันทำงานร่วมกันโดยมีข้อมูลการทำงานของมันอยู่ที่ด้านขวามือ และแน่นอนเราจะสังเกตุเห็นว่า menu ด้านบนมีความสัมพันธ์กับตัว application ด้วย (ส่วนนี้หลายๆ คนอาจจะไม่สังเกตุแต่มันช่วยในการใช้งานจริงๆครับ)
ตัวอย่างต่อไปเป็นโปรแกรม Bike Route เราสามารถ load แผนที่ขี้นไปได้เองแล้วสร้าง route map ของตัวเองขึ้นมาถ้าในชอบขี่จักรยานที่นั้นโปรแกรมนี้คงโดนครับ

จะเป็นว่าภาพที่สื่อออกไปบอกถึงลำดับการใช้งาน โดยมีตัว File อยู่นอกสุด ต่อมาด้วย Zone และด้านในเป็น Route ซึ่งเป็นชั้นๆ ตามการใช้งานของ object ในโปรแกรม ทำให้ผู้ใช้เข้าใจได้ทันทีว่าจะใช้งานอย่างไร นอกจากนี้อยากให้สังเกตความสัมพันธ์ระหว่าง menu ตัวแต่ตัวอย่างแรกจนถึงตัวอย่างนี้ว่า menu จะถูกจัดเรียงตามความลำดับเช่นกัน
ตอนที่ 6 เราพูดถึงการจัดลำดับของ menu จึงขอยกตัวอย่างอีกสักตัว

โปรแกรม Mac Journal ที่เคยได้รับรางวับ Apple Design award แต่ก็ยังมีความผิดพลาดเล็กๆ ในเรื่อง menu

โปรแกรมนี้เป็นโปรแกรมสำหรับเขียนบทความดังนั้นส่วนที่เป็น “Journal” จึงเป็นส่วนที่อยู่บนสุดของ Hierarchy (ความสัมพันธ์แบบแผนภูมิต้นไม้) แล้วมี “Entry” ต่างๆ เป็นเนื้อหาอยู่ด้านใน

Journal เป็น parent controler object และ มี Entry เป็น sub class ดังรูปด้านล่าง

จากตัวอย่างที่ผ่านๆ มาในตอนที่ 6 จะเห็นว่า menu ควรจัดวางตามลำดับชั้นของความสัมพันธ์ของ Object ในโปรแกรม แต่โปรแกรม Mac Journal กลับนำเอา Entry มาไว้ด้านหน้า Journal ก็ควรที่จะจัดการสลับที่กัน

จะเห็นว่าการออกแบบที่ถูกต้องไม่ใช่เรื่องที่ยาก แต่ต้องอาศัยความละเอียดอ่อนในการออกแบบ เพราะมันมีผลต่อการทำความเข้าใจของผู้ใช้ด้วย เราอาจจะนึกว่าจริงๆ พวกเราไม่ได้ดู menu เพื่ออ้างอิงความสัมพันธ์ของ object ซะหน่อย แต่จริงๆ แล้วพวกเราอ้างอิงโดยไม่รู้ตัวครับ และเราจะรู้สึกว่า ต้องพยายามทำความเข้าใจ ถ้ามันเรียงสลับกันอยู่
เคยคิดเหมือนกันว่า windows user จะรู้สึกแบบนี้หรือเปล่า เพราะ menu บน windows ไม่ได้อยู่ที่เดิมตลอดเวลา และโปรแกรมส่วนมากก็เรียง menu กันตามใจชอบ ทำให้ผู้ใช้ไม่เกิดระบบการคิดแบบนี้ในหัว (mental model) แต่จริงๆ ไม่ใช่ครับ แทบทุกระบบปฏิบัติการจะมี File Edit … อยู่และนี่เป็นจุดเริ่มต้นของการเรียงลำดับ ถ้าโปรแกรมเน้นจัดการกับไฟล์ ก็จะเอาไฟล์ไว้ด้านหน้า แต่ถ้าไม่มี File ในกรณีของ MacJournal ก็ควรจะเป็น journal แทน เพราะเมื่อผมต้องการเปิดไฟล์ Journal อื่นๆ ผมควรจะกด Journal -> Open ไม่ใช่ Extry -> Open
แต่อย่างไรก็ตามถือแม้ว่าโปรแกรมของเราจะไม่สามารถสื่อสารผ่าน menu ได้ ส่วนอื่นๆของโปรแกรมก็ควรบ่งบอกถึงความสัมพันธ์ของแต่ละ object เป็นหลักเพราะมันเป็นสิ่งที่ทำให้ผู้ใช้เข้าใจโปรแกรมของเราตั้งแต่ครั้งแรกที่ใช้งาน
ตัวอย่างต่อไปเป็นโปรแกรมบริหารจัดการ todo list

โปรแกรมพยายามยัด feature มากมายอยู่บน menubar ซึ่งน่าจะดี แต่ลองคิดดูว่าผู้ใช้จะรู้ได้อย่างไรว่าควรเริ่มต้นที่ไหน เพราะโปรแกรมไม่พยายามสื่อถึงลำดับความสัมพันธ์ของ object ผ่าน toolbar หรือส่วนอื่นๆ ของโปรแกรมและตอนนี้โปรแกรมดูหนักมากๆ เพราะมีอะไรให้เราใช้ ให้เราปรับแต่งมากมาย
แต่!!!
ลองนึกดูดีดีว่าเราต้องการอะไรจากโปรแกรม todo list คืออะไร สิ่งที่เราต้องการน่าจะเป็นโปรแกรมเล็กๆ ทำงานเร็วๆ
“be there when i need and go away when i don’t need it”
ไม่ต้องมี feature มากมายเพราะ todo เป็นสิ่งที่เราต้องเรียกใช้บ่อยๆ และ ไม่ต้องการเปิดให้มันใหญ่มากๆ เพราะบางทีเราก็ต้องการเปิดมันทิ้งเอาไว้ (สุดท้ายกลายเป็น dashboard) ใครคันไม้คันมือจะหยิบ Photoshop หรือ OmniGraffle มาออกแบบโปรแกรม todo list แบบใหม่ แล้วส่งมาให้ดูกันบ้่างก็ได้นะครับ :)
ตอนที่ 8 สื่อสารกับผู้ใช้
ถ้าโปรแกรมที่ออกแบบมาไม่สอดคล้องกับความเข้าใจของผู้ใช้ ขอให้กลับไปดูว่าเรามัวกังวลเรื่อง feature หรือเปล่า สิ่งที่เราจะต้องใส่ลงไปในโปรแกรมคือ solution ไม่ใช่ feature เพราะสิ่งที่ผู้ใช้ 80% ต้องการคือสิ่งที่เป็นตัวหลักของโปรแกรม ไม่ใช่ feature ถ้าโปรแกรมของเราเต็มไปด้วย feature มันยิ่งจะทำให้ผู้ใช้สับสนว่าจริงๆ แล้วโปรแกรมของเราเข้ามาช่วยลูกค้าแก้ปัญหาอะไร เช่น โปรแกรมสำหรับ ftp ควรจะเป็นโปรแกรมที่ส่งไฟล์หรืออ่านไฟล์ที่ server ได้ง่ายที่สุด การที่เราใส่ text editor ลงไปในโปรแกรม ftp อาจจะเป็นเรื่องดีเพราะมีคนต้องการ แต่ถ้าโปรแกรมนั้นทำให้ขั้นตอนของการใช้งานยุ่งยากขึ้นหรือ ทำให้หน้าจอดูสับสน เราควรจะพิจารณาใหม่ เพราะผู้ใช้ 80% ไม่ได้ใช้ feature “text editor”
การสื่อสารกับผู้ใช้ มีสิ่งที่ต้องคำนึงถึงดังนี้
Parallel with good human interactions ระหว่างที่ผู้ใช้กำลังใช้งานโปรแกรมของเรา โปรแกรมควรที่จะสื่อสารกับผู้ใช้อยู่ตลอดเวลา เช่นระหว่างการ search บนหน้าจอควรมี icon ที่เคลื่อนไหวเพื่อบอกกับผู้ใช้ว่า “ฉันกำลังพยายามอย่างเต็มที่เพื่อคนหาข้อมูลให้คุณ” อาจเป็น icon เล็กๆ หรือเป็น progress bar ก็ยังดีกว่าการนิ่งไปเฉยๆ เพราะนั่นคือการปลอยให้ผู้ใช้เดาเอาเองว่าโปรแกรมพังไปแล้ว หรือว่าผู้ใช้ยังไม่ได้สั่งงาน
Be non-intrusive, non-interruptive เช่น error message ของ safari ก่อนหน้านี้ทุกครั้งที่มี error มันจะแสดงหน้าต่างขึ้นมาแจ้งปัญหา และมีปุ่ม OK ให้เรากดเพื่อรับทราบ มันขัดจังหวะการใช้งานมากๆ ครับ เมื่อผมทราบในสิ่งที่ผิด สิ่งที่ผมต้องการทำต่อคือการแก้ไขความผิดพลาด แต่โปรแกรมดันขึ้นมาขัดจังหวะโดยการให้ผมกด OK ก่อนทั้งๆ ที่การกด OK ของผม ไม่ได้มีผลอะไรกับโปรแกรมเลย ตอนนี้ดีแล้วครับที่เค้าปรับปรุงให้ไม่มีหน้าแต่งแจ้งความผิดพลาดขึ้นมา แต่จะแสดงความผิดพลาดลงไปบนหน้าจอ ให้เรารับทราบอย่างเดียว ลดขั้นตอนไปได้อีกหนึ่งขั้นตอน สำหรับนักออกแบบทุกคนอย่าคิดว่านี่เป็นแค่ขั้นตอนเดียวลูกค้าน่าจะรับได้ ลองนึกถึงว่าลูกค้าต้องใช้โปรแกรมนี้ทั้งวัน เข้าจะต้องกด OK กี่รอบ
Only communicate status that matters ไม่ต้องแสดงสถานะไปซะทุกอย่างครับ เพราะอย่าลืมว่าทุกข้อความที่แสดงบนหน้าจอ ผู้ใช้จะต้องใช้สมองในการทำความเข้าใจ และถ้ามันมันหลายอย่าง สุดท้ายเค้าจะไม่พยายามทำความเข้าใจกับอะไรเลย ทำให้การสื่อสารกับผู้ใช้ล้มเหลว นอกจากนี้พยายามให้ข้อความแสดงสถานะอยู่ที่เดียวกันตลอดผู้ใช้จะได้ไม่ต้องหา
ในตอนนี้เราจะพูดถึงสองเรื่องสุดท้าย คือการสื่อสารผ่าน error message เราควรแสดง error ครับ แต่ไม่ใช่แบบนี้แน่นอน

หรือแบบนี้

การที่บอกผู้ใช้ว่า feedbag error 0 ไม่ได้ช่วยให้ชีวิตของผู้ใช้ดีขึ้นเลยครับ ไม่บอกน่าจะดีกว่า อย่างน้อยก็อ่านน้อยลง (และต้องตรวจสอบคำผิดด้วย อันนี้โดน… ใน blog ผมก็นั่งแก้คำผิดในกระทู้เก่าๆ อยู่เหมือนกัน)
ลองมาดูอีก error นึงครับ error อันนี้เกิดขึ้นตอนที่ drag รูปต้นฉบับจากด้านซ้ายมือมาใส่โปรแกรมด้านขวามือแล้ว แล้วโปรแกรมแจ้ง error ว่าไฟล์ของรูปใหญ่เกินไป

ผมแค่ต้องการเลือกรูปมาใส่ในโปรแกรม และผมไม่ต้องการ Extend ไม่ได้ต้องการ crop เพราะไม่รู้ว่าจะมีผลกับรูปต้นฉบับของผมหรือเปล่า แล้วก็ไม่รู้ว่าเมื่อกด Distort แล้วโปรแกรมจะทำอะไร ที่สำคัญคือผมเลือกได้แค่ 3 อย่าง!! ซวยเลยทีนี้ cancel ก็ไม่ได้ด้วย
error message ควรบอกปัญหาที่เกิดขึ้น และอย่าให้มีตัวเลือกที่น่าสงสัยเกิดขึ้น วิธีการรายงานปัญหาที่เกิดขึ้นให้มีประโยชน์สูงสุดควรบอกตามลำดับดังนี้
หลีกเลี่ยงปุ่ม Yes/No เพราะผู้ใช้จะสับสนไม่รู้ว่าควรทำอะไร ให้เราดูว่า error ที่เราเขียนมี keyword อะไร แล้วใช้ keyword นั้นในปุ่มที่จะให้ผู้ใช้กด แบบนี้จะเข้าใจง่ายกว่าเพราะผู้ใช้พยายามหาทางแก้ปัญหาจากข้อความของเราอยู่แล้ว
ดู error อันตอนไปนะครับ

error อันนี้ดูเหมือนจะดีเพราะอ่านรู้เรื่อง แต่ไม่ได้บอกสาเหตุของปัญหา

อันนี้ปรับปรุงขึ้น โดยบอกปัญหาและสาเหตุ แต่ก็จังไม่ได้บอกทางแก้ให้กับผู้ใช้

อันนี้สมบูรณ์ครับ บอกสิ่งที่เกิดขึ้นอย่างชัดเจน บอกสาเหตุของปัญหาอย่างเฉพาะเจาะจง แถมบอกวิธีแก้ปัญหาให้ผู้ใช้อีกด้วย
The document “Trip Request” could not be saved บอกว่าเกิดอะไรขึ้น โดยระบุให้ชัดเจนว่าเกิดที่เอกสาร Trip Request
because the disk “Work Stuff” is full. เกิดขึ้นเพราะ disk เต็ม และรบุไปเลยว่า disk ที่ชื่อ Work Stuff เต็ม
Try deleting document from “Work Stuff” or saving the document on another disk ชี้ทางสว่างให้กับผู้ใช้ว่าควรแก้ปัญหาที่เกิดขึ้นอย่างไร
สิ่งเหล่านี้จะเพิ่มงานให้กับนักพัฒนาโปรแกรมแต่ขอบอกเลยครับ ว่ามันจะสร้างประสบการณ์ที่ดีให้กับผู้ใช้(ลูกค้า) ของโปรแกรมของเรา
สุดท้ายให้เราพยายามป้องกันก่อนที่ปัญหาจะเกิด

ตัวอย่างนี้บอกว่า “เราไม่สามารถ print ได้ถ้ายังไม่ได้เลือก student ซักคน” วิธีที่ดีกว่าการทำ error message คือการปิดไม่ให้ผู้ใช้ click ปุ่ม print ก็จะไม่มี error เกิดขึ้นครับ และผู้ใช้ไม่ต้องเสียเวลาอ่าน error ด้วย
เรื่อง feedback เป็นเรื่องสำคัญที่นักพัฒนาโปรแกรมควรจะให้ความสำคัญ ไม่เฉพาะเจาะจงว่าต้องเป็นบน OS X เท่านั้น เราควรให้ความสำคัญกับโปรแกรมของเราในทุก platform แม้แต่บน web ก็ตาม
เรื่องของการจัด Layout ก็เป็นอีกเรื่องที่น่าสนใจครับ เพราะการออกแบบ layout ที่ดีจะช่วยให้ผู้ใช้เข้าใจ form ของเราเร็วขึ้น ใช้สมองน้อยลง แต่ไม่ควรจะ ออกแบบแต่ละ form ให้แตกต่างกัน ถึงแม้ว่าการออกแบบใหม่สำหรับแต่ละฟอร์มจะทำให้ใช้ form นั้นได้ง่ายกว่า แต่โดยภาพรวมแล้วผู้ใช้ต้องเรียนรู้การใช้งานใหม่ทุกฟอร์มแทนที่จะทำความเข้าใจทีเดียว
บน OS X มีการกำหนดนโยบายว่าแต่ละ form ควรออกแบบมาอย่างไร ใครที่พัฒนาบน platform อื่น สามารถนำไปประยุกต์ใช้ได้นะครับ

Center Equalize ไม่ได้หมายความว่าจะจัดทุกอย่างให้อยู่ตรงกลาง ถ้าเราพิจารณาจากรูปจะเห็นว่า layout ที่จัดขึ้นจะออกแบบให้สมดุลกันระหว่างด้านซ้ายและด้านขวาดังรูป

เมื่อเราใส่สีลงไปจะยิ่งทำให้ดูชัดมากขึ้น
ลองดูตัวอย่างต่อมา

แล้วลองระบายสีลงไป จะเห็นถึงความสมดุลย์

การจัด Labels ชื่อกลุ่ม โดยยึดเส้นด้านขวา

การจัด Control โดยยึดเส้นด้านซ้าย

จัดข้อความด้านหลัง Control ให้เท่ากัน

จัดขอบด้านข้าง และระยะห่างของ Control ทุกตัวให้เป็นระบบเดียวกัน ไม่อึดอัด




สุดท้ายเป็นส่วนของ Action Buttons จะต้องอยู่ด้านขวามือเท่านั้น ปุ่ม OK จะต้องอยู่ด้ายขวามือด้วย และจะต้องเขียนด้วยคำว่า OK ไม่ใช่ Okey หรือ Ok

หลัง Checkbox/Radio ควรตามด้วยคำกริยา เพื่อให้ง่ายแก่การทำความเข้าใจ และลดความผิดพลาดต่างๆ ที่อาจจะเกิดขึ้น

นอกจากนี้ยังมีอีกหลายส่วนที่ควรจะดูแต่คงไม่ได้รวมอยู่ในบทความนี้ อย่าง
สามารถหาอ่านได้จาก Human interface guideline ของ apple ครับ
เป็นอันจบเรื่อง Designing for Aqua หากเราสามารถออกแบบได้ตามนี้อย่างน้อยโปรแกรมของเราก็จะเป็นโปรแกรมที่แตกต่างจากโปรแกรมของคู่แข่งแน่นอน
เรื่องประสิทธิภาพการทำงาน (Performance) เป็นเรื่องที่ผู้ใช้ให้ความสำคัญโดยไม่รู้ตัวแต่รู้สึกได้ โดยเฉพาะผู้ใช้กลุ่ม Pro เพราะเป็นกลุ่มที่ต้องใช้โปรแกรมของเราซ้ำๆ ไม่ใช่นานๆ ที ดังนั้นสิ่งที่ผู้ใช้ต้องการคือการตอบสนองที่รวดเร็ว และ/หรือ การประมวลผลที่รวดเร็ว

แต่ก็ไม่ใช่พยายามปรับแต่งกันแบบตะบี้ตะบัน เพราะเวลาของเรา ทีมงานของเรา คู่แข่งของเรา จะเป็นตัวบีบให้เราต้องเลือกที่จะปรับแต่ง performance ของโปรแกรมเฉพาะในจุดที่ผู้ใช้ของเราสนใจ เช่นโปรแกรมตัดต่อหนังจุดที่ผู้ใช้สนใจน่าจะเป็นเรื่องการตอบสนองทันทีที่แก้ไข สามารถดูผลได้ทันที แต่ผู้ใช้อาจจะไม่สนใจช่วงเวลาแปลงข้อมูลเป็นไฟล์มากนัก เพราะสามารถสั่งงานให้คอมพิวเตอร์ทำได้โดยที่ไม่ต้องนั่งอยู่หน้าคอมพิวเตอร์ ตรงกันข้ามกับโปรแกรมทางวิทยาศาสตร์บางตัวที่การปรับแต่งผ่านหน้าจอไม่ต้องตอบสนองเร็วมากก็ได้ แต่ขอให้เวลาประมวลผลทำได้เร็วๆ เพราะสั่งให้ทำงานทีนึ่งใช้เวลาหลายเดือน ถ้าเราลดเวลาลงมาเหลือครึ่งหนึ่ง ถึงโปรแกรมของเราจะมีส่วนปรับแต่งที่ช้ากว่าของคู่แข่ง ผู้ใช้ก็คงซื้อโปรแกรมของเราอยู่ดี

Apple เตรียมเครื่องมือต่างๆ ให้เราใช้มากมาย เพื่อช่วยตรวจสอบว่าโปรแกรมของเราทำงานได้ดีหรือยัง มีส่วนไหนที่สามารถปรับแก้ได้อีก เราสามารถตรวจสอบการจอง memory ได้เลยว่าแต่ละ process ของโปรแกรมเราจองหน่วยความจำอย่างไร และมีขั้นตอนไหนที่มีการเรียกใช้บ่อยที่สุด เพื่อให้เรารู้ว่าส่วนไหนที่ควรปรับแต่งก่อน
สำหรับการพัฒนาบนภาษาอื่น ผมคิดว่าชุมชนนักพัฒนาสำหรับภาษานั้นๆ น่าจะมีเครื่องมีเหล่านี้อยู่แล้ว อยากให้ลองหามาใช้กันครับ เพื่อผู้ใช้ของเรา
เคล็ดลับการปรับแต่งประสิทธิภาพ
ข้อที่เหลือคงทิ้งไว้แค่หัวข้อให้ลองไปศึกษาดูครับ แต่อยากให้คนที่จะพัฒนาโปรแกรมบนแต่ละ platform คิดถึงการปรับแต่งตัวโปรแกรมให้มาก โดยเฉพาะส่วนที่เป็นจุดเด่นของโปรแกรมเราจะต้องทำงานได้เร็วที่สุด และในจุดที่ไม่ใช่จุดเด้นของโปรแกรม ถ้าให้ดึงเอา lib ที่มีคนพัฒนาไว้แล้วมาใช้ได้จะดีกว่า

สิ่งเหล่านี้ (ทั้ง 10 ตอนที่ผ่านมา) คือส่วนประกอบสำคัญในการพัฒนาโปรแกรมของเราให้ดี คุณอาจจะคิดว่าโปรแกรมของเราตอนนี้มีส่วนแบ่งการตลาดน้อยมาก ไม่น่าจะต้องคิดอะไรให้วุ่นวายแต่อยากให้รู้ไว้เลยว่าทันทีที่โปรแกรมของเราตอบปัญหาให้ผู้ใช้คนหนึ่งได้ดี คนที่มีปัญหาแบบเดียวกันจะมี network ของเค้าอยู่แล้ว ซึ่งช่วยให้โปรแกรมของเรากระจายได้เร็วกว่าที่คุณคาดไว้
ผมหวังว่าบทความนี้จะเป็นประโยชน์สำหรับคนที่เริ่มต้นพัฒนาอะไรก็ตาม และหวังว่าจะมีโปรแกรมดีๆ ที่เกิดจากคนไทยมากขึ้นเรื่อยๆครับ
เอกสารอ้างอิง — Apple User Experience