"You are not perfect..., that's why you are perfect."
ประสบการณ์พัฒนาแอพฯบน Windows Phone ภาคปฏิบัติ
24 Apr 2013 19:41   [9213 views]

ก่อนหน้านี้เคยเขียนโปรแกรมบน Windows Phone มาบ้าง แต่ไม่ได้จริงจังอะไร ก็เป็นพวกงาน Research เสียมากกว่า เช่นระบบสั่งงานในบ้านผ่านมือถือ Windows Phone 8 หรือพวกการเชื่อมเฟสบุ๊ค การทำงานกับ IAP พวกนี้ ก็ถือว่าพอเขียนเป็น

แต่สองอาทิตย์ที่ผ่านมา ก็เรียกว่ามีโอกาสได้เขียนแบบจริงๆจังๆ มีแอพฯเป็นตัวเป็นตน มีประสบการณ์ขึ้นมาอีก 4 ขีด ก็เลยขอจดบันทึกเรื่องราวเสียหน่อย ทั้งเรื่องดีและเรื่องไม่ดี ตามแบบฉบับคนหน้าตาดีเสมอต้นเสมอปลาย ... โหะๆๆๆ (ชินกันยัง)

เริ่มเลยละกันนะ


การเขียน UI ทำได้ง่าย แต่ UX ดิ้นมากไม่ได้

XAML ถือเป็นอาวุธที่ทาง Microsoft ทำการบ้านมาได้ดีระดับหนึ่ง UI ทั้งดุ้นสามารถเขียนได้ง่ายๆด้วยภาษา XML ที่ถูกสร้างมาโดยเฉพาะอย่าง XAML โดย XAML แท้จริงแล้วเป็นส่วนสร้าง UI แบบลากวางได้เลย เพื่อประกบคู่กับส่วน Business Logic ที่เขียนด้วยภาษา C# ซึ่งจะถูกสร้างมาพร้อมกันทั้ง XAML และ .cs ทำงานคู่กันดั่งคู่รัก ห่างกันไม่ได้


อย่างไรก็ตาม XAML มีจุดอ่อนที่ใช้ชื่อคลาสที่เข้าใจยาก ไม่ค่อยสื่อ และโครงสร้างภาษาที่เยอะ ซับซ้อนเกินไป จนกว่าจะเข้าใจก็เล่นเอาเหนื่อยเหมือนกัน โดยเฉพาะอย่างยิ่งการทำ Style ทำ Transition Effect ต้องเขียนกันร่วม 50 บรรทัด เพื่อทำอย่างอย่างเดียว ส่วนตัวเห็นแล้วเชื่อว่ามันทำให้ง่ายกว่านี้ได้ ถือว่าไม่ประทับใจเรื่องความซับซ้อนจนเกินไปของมัน


ส่วนจุดแข็งของ XAML นอกจากความง่ายในการทำ UI แล้ว ยังมีส่วนของการ Binding ที่ทำให้ตัวแปรแต่ละตัวเชื่อมค่าเข้าหากันได้ เช่น Component นี้ต้องกว้างเท่า Component อีกตัวนึงนะ บลาๆๆ ... แต่ถามว่าง่ายมั้ย ผมว่ามันโคดจะยากเลย ต้องเขียนด้วยโครงสร้างภาษาที่ดูประหลาด เข้าใจยาก Track กลับไม่ได้ ฯลฯ แต่ถ้าชินแล้วก็คงไม่รู้สึกอะไรมาก (ไปๆมาๆพูดข้อเสียอีกละ)


ทางด้าน UX เนื่องจากรู้ๆกันอยู่ว่า Windows Phone ออกแบบมาอินดี้ ทำให้แอพฯทุกตัวหน้าเหมือนกันหมด ข้อดีคือเขียนง่าย ทุกอย่างเขียนแปะโป้งๆๆๆ ก็ออกมาเป็น UI (ที่เหมือนชาวบ้านเค้า) แล้ว แต่ข้อเสียคือ มันเหมือนชาวบ้านนั่นแหละ ... จุดนี้เคยพูดด้วยปากเปล่าไปแล้วว่ามันเป็นข้อเสีย แอพฯทุกตัวหน้าตาเหมือนกันหมด วันนี้มาขอ "ยืนยัน" ว่าประโยคนี้เป็นจริงครับ


ระบบ Get Set Property ออกแบบมาดี

ในโลกของ OOP ตัวแปรที่ดีต้องถูกซ่อนไว้และใช้ Get Set ในการเข้าถึง ปรากฎว่า C# ทำตรงนี้มาดีมาก เพราะสามารถประกาศตัวแปรพร้อม Get Set ได้ในเวลาเดียวกัน ไม่ต้องประกาศ Function ให้ซับซ้อนลำบากเหมือน Java และด้วยความง่ายและ Flexible ของมันตรงนี้ ทำให้การเขียนโปรแกรมทำได้ง่ายขึ้นและมีโครงสร้างที่สวยงามขึ้นครับ


Library มีค่อนข้างพร้อม

ถึง API จะมีอยู่อย่างจำกัด บางอย่างก็ทำได้ บางอย่างก็ทำไม่ได้ แต่ส่วนใหญ่ ถ้ามันไม่แปลกมาก (เช่นการ Parse JSON) มันก็จะมี Library ให้โหลดมาใช้ได้อย่างง่ายดาย หลักๆทั้งจาก NuGet และ CodePlex ทำให้การเขียนโปรแกรมบนนี้ก็ง่ายขึ้นไปอีก Library ค่อนข้างพร้อมทีเดียว


Handle Screen Fragmentation ได้ดีมาก

ปัญหาเรื่องหน้าจอหลายขนาดไม่ใช่ปัญหาบน Platform นี้ เขียนทีเดียว ใช้ได้ทุกเครื่องแน่นอน ! ... แต่ปัญหาเรื่อง Memory แต่ละเครื่องมีไม่เท่ากัน ยังคงเป็นปัญหาอยู่บ้าง เพราะบางแอพฯใช้แรมเยอะ (ถ้าเขียนมาไม่ดี) ก็ต้องทดสอบด้วยเครื่องที่กากที่สุดที่คิดว่าจะรองรับกับปล่อยแอพฯสู่สาธาณะครับ


แอพฯโหลดเร็ว คอมไพล์เร็ว Deploy เร็ว Debug ง่าย

สิ่งที่น่าปลื้มใจและ Visual Studio ไม่เคยทำให้ผิดหวังคือตัว Dev Tools มันทำมาได้ดีมาก ทุกอย่างเร็ว คอมไพล์เร็ว Deploy รวดเร็ว ไม่ต้องมานั่งรอเป็นนาทีๆเหมือนบาง Platform และที่สำคัญคือ Debug ง่าย เนื่องจากมันเป็น C# ซึ่งสามารถดู Stack Trace ได้นั่นเอง แต่หลายๆครั้งเปิดแอพฯแล้วรู้สึกว่าทำไมมันช้าๆ หลังจากทดสอบแล้วก็พบว่า Transition Effect มันทำมาได้น่ารำคาญและเป็นตัวที่ทำให้แอพฯ "ดูเหมือน" จะโหลดช้า รู้สึกว่า Transition Effect แทนที่จะเป็นจุดแข็ง แต่กลับเป็นจุดอ่อนแฮะ ใครจะทำแอพฯบนนี้ไม่ค่อยแนะนำให้ใช้ นอกจากอยากได้ความสวยมากกว่า Performance


การสลับระหว่าง Page ทำได้ช้าถ้ามี ListBox อยู่

ถึงแอพฯจะเปิดเร็ว แต่ User Experiene หนึ่งที่ทำให้รู้สึกอึดอัดคือ การสลับระหว่าง Page ถ้ามี ListBox ก็จะจังหวะ Delay เป็นวิๆทำให้การใช้งานไม่ลื่นเลย


Reuse Code จาก Platform อื่นไม่ได้เลย

ประเด็นเซ็งๆของชีวิตที่ทาง Microsoft ดันมีภาษาไม่เหมือนชาวบ้านเค้า หากใครมีแอพฯอยู่แล้ว ต้องการจะ Port มา บอกได้ว่าสองสิ่งที่ Port มาได้มีแค่ Concept และ Graphic Resources (ที่ต้องออกแบบใหม่อยู่ดี)เท่านั้น เป็นอุปสรรคที่ใหญ่ที่สุดสำหรับ Platform นี้เลย เขียนใหม่ลูกเดียวจ้าลวกเพี่ย !


คำสั่งบางคำสั่งทำให้เครื่องเปิดไม่ติดได้

สิ่งที่ไม่น่าจะเกิดขึ้นได้ก็มีบนนี้ เพราะบางคำสั่งหากเขียนไม่ดี แทนที่จะแค่แอพฯ Crash แต่มันทำได้มากกว่านั้น ... มันทำให้จอดับเปิดไม่ติดอีกเลยได้ด้วยจ้าาาา หากใช้พวก ATIV S ที่ถอดแบตได้ก็คงสบายหน่อย แต่ถ้าใช้ Lumia หากทำอะไรไม่ถูกก็เข้าศูนย์อย่างเดียวอ่ะ ... สำหรับคำสั่งขอสงวนไว้ว่าคือคำสั่งอะไร แค่บอกว่า OS ยัง Handle พวกนี้ได้ไม่ดีพอ


หากมีปัญหา ค้นใน Google ลำบาก

Windows Phone 8 และ Windows 8 ใช้ WPF และ Silverlight (ที่ตายไปแล้ว) ในการเขียนโปรแกรมเหมือนกัน แต่ในแง่รายละเอียดแล้ว WPF บน WP8 และ Windows 8 มันต่างกัน ไม่ใช่ทุกอย่างจะใช้บน WP8 ได้ ทำให้เวลาติดปัญหาอะไร หลวงพ่อกูเกิ้ลก็จะแนะนำทางแก้มาให้แบบเหมารวม คือชอบแนะนำทางแก้ของการเขียนโปรแกรมสำหรับ Windows 8 มา ส่วนทางแก้ของ WP8 อยู่ไหนก็ไม่รู้ กว่าจะหาเจอก็เปิดอย่างต่ำ 4-5 เว็บหละ


ระบบจัดการ ListBox ไม่มีประสิทธิภาพและเป็นระบบปิดมาก

ข้อนี้คือสิ่งที่ทำให้หงุดหงิดและเป็นจุดอ่อนก้อนใหญ่ของระบบปฏิบัติการนี้เลย เพราะ ListBox คือทุกสิ่งบนระบบปฏิบัติการสำหรับโทรศัพท์มือถือ เนื่องจากมันช่วยจัดการเรื่อง Memory และทำให้การ Scroll ดู Content เป็นไปอย่างราบรื่น บน iOS ทำมาได้ดีมาก บน Android ทำมาได้ค่อนข้างดี (เหลือแค่เรื่องความช้าในการจัดการรูป) แม้แต่บน QML ก็ยังทำมาดีเลย แต่บน Windows Phone กลับทำมาได้แย่ที่สุด


ย้อนหลังไปสมัย Windows Phone 7 ออกมา สิ่งที่เป็นจุดอ่อนของเจ้าระบบปฏิบัติการนี้คือ ListBox Scroll แบบติดๆขัดๆ มีปัญหาอย่างเห็นได้ชัด ตอน Windows Phone 7.5 (Mango) ทาง Microsoft จึงจัดการ Optimize การ Scroll ของ ListBox ด้วยการปิดทุก Event ระหว่าง Scroll ลง แล้วทำทุกอย่างในตัวเองแบบระบบปิด ส่งผลให้เกิดผลลัพธ์สองอย่างคือ (1) ไม่มี Event ใดๆส่งออกมาระหว่าง Scroll เช่น Scroll ถึงไหนแล้ว (2) ตอน Scroll เร็วๆแล้วมันโหลดไม่ทัน หน้าจอจะกลายเป็นสีขาวจนกว่ามันจะโหลดทันแล้วถึงจะกลับมา


จริงๆพวกนี้เราสามารถสั่ง Disable การ Handle ด้วยระบบ แล้วควบคุมดักจับ Event เองทั้งหมดได้เช่นกัน รวมถึงการปิดระบบ Virtualizing ของ ListBox ก็ทำได้ [1] แต่ผลลัพธ์ที่ตามมาคือ Scroll กระตุกเป็นพากินสัน หรือไม่ก็ Insufficient Memory ใช้จริงแทบไม่ได้ ถ้าจะใช้จริงได้ก็จะได้เฉพาะ ListBox ที่แต่ละ Row มีโครงสร้างไม่ซับซ้อนเท่านั้น เช่นมี TextBlock ตัวเดียว เป็นต้น


ทั้งหมดทั้งมวลทำให้มันกลายเป็น ListBox ระบบปิดไป ยุ่งอะไรกับมันมากไม่ได้ และแน่นอน Pull to Refresh (แบบดีๆ) จึงไม่สามารถใช้งานได้บน Platform นี้ จะได้ก็ต้องเป็น ListBox ที่ไม่ซับซ้อน เช่น Twitter Client อาจจะทำได้ แต่แอพฯที่ทำอะไรได้มากหน่อยก็คงต้องก้มหน้าก้มตารับกรรมไป พลาดสิ่งดีๆไปอีกหลายอย่างจากการนี้


เรื่อง Pull to Refresh นี่ หลังจากไปค้นหาข้อมูลอยู่เยอะ ได้ข้อสรุปว่า Microsoft ไม่แนะนำให้ทำ เพราะมันไม่เหมาะกับ UX ของ Windows Phone แนะนำให้ใช้ปุ่ม Refresh บน Application Bar ด้านล่างจอไป ... ซึ่ง ... เป็นวิธีที่โบราณมากกกกก หวังว่า Microsoft จะแก้ไขตรงนี้


ListBox Scroll ช้า

ใช้มาตั้งนาน แต่ไม่ทันได้สังเกต เพิ่งมาเห็นหลังจากเริ่ม Dev แอพฯเอง ... ListBox บน Windows Phone มัน Scroll ช้ามากกกกก ช้าจนน่าตกใจ ไถกันจนนิ้วด้านกว่าจะถึงจุดที่ต้องการ แถมเพิ่ม Speed ก็ไม่ได้ ทำให้ออกแบบอะไรลำบากขึ้นเยอะมากเลยหละ


DirectX เขียนยาก(มาก)

การเขียนโปรแกรมโดยใช้ GPU ถือเป็นอาวุธลับหนึ่งของการเขียนโปรแกรมบนโทรศัพท์มือถือที่ชิพประมวลผลภาพอชักจะมีบทบาทมากขึ้นทุกวัน แต่ Microsoft เลือกจะไม่ใช้ OpenGL แต่ใช้ลูกรักของตัวเองอย่าง DirectX 11 บน Windows Phone 8


คราวนี้อาวุธลับก็กลายเป็นสิ่งที่เข้าถึง "ยากมากกกกก" ไปซะงั้น เพราะการจะเขียน DirectX ได้ ต้องลงไปดิบที่ C++ ถึงจะทำงานได้อย่างมีประสิทธิภาพ และภาษาก็ดิบซะเหลือเกิน เคยเขียนสมัย DirectX 6 ตอนนั้นดิบยังไง ตอนนี้ก็ยังดิบอย่างงั้น แค่อาจจะซับซ้อนน้อยลงเท่านั้นเอง เพราะมีการ Manage พวกคลาสและ Object ต่างๆได้ดีขึ้น


ถึงจะมี SharpDX ซึ่งเป็น Wrapper ของ DirectX บน C# ให้ใช้งาน แต่มันก็เป็น 3rd Party Library ที่อุดมไปด้วยบั๊กมากมาย บางทีก็ทำให้เกมเปิดไม่ได้ บางทีก็ทำให้เปิดเกมได้ครั้งเดียวแล้วเปิดไม่ขึ้นอีกเลย กว่าจะแก้ก็ครึ่งปี แล้วแต่ว่าพี่เค้าว่างตอนไหน ไม่งั้นก็ต้องโหลด Source มาคอมไพล์เอง ยุ่งยากอีก (ก่อนหน้านี้ก็คอมไพล์เองเพื่อแก้ไขปัญหาเฉพาะหน้าไปรอบนึงละ) ตอนนี้ก็ใช้ SharpDX อยู่ แต่กำลังจะพิจารณาไปเขียนด้วย C++ แบบดิบๆละ ปัญหาเยอะเกิ๊น


โดยรวม DirectX ควรจะเขียนง่ายกว่านี้ เสียดายโอกาสทำอะไรดีๆ


มีปัญหากับการ Unlock Device

ก่อนจะทดสอบแอพฯบนเครื่องจริงได้ เราต้อง Unlock เครื่องเสียก่อน คราวนี้เจอปัญหาที่ไม่ควรจะเจออย่างการที่ไม่สามารถ Unlock Device ได้ โดยให้เหตุผลว่า Account เรายังไม่ Active (ซึ่งแน่นอน มัน Active แล้ว) ติดต่อ Microsoft ก็ไม่ได้รับการติดต่อกลับ ตอนนี้ก็ยังแก้ปัญหาไม่ได้ เดี๋ยวคงดิ้นรนหาทางกันต่อไป


อีกอย่างคือ 1 Account Unlock ได้แค่ 3 เครื่องเอง อยากจะเปลี่ยนเครื่องทดสอบก็ต้องมา Lock เครื่องเก่าและ Unlock เครื่องใหม่ ซึ่ง ... ตอนนี้ทำไม่ได้แล้วเพราะเหตุผลจากย่อหน้าด้านบน Lock กลับได้อย่างเดียว แต่ Unlock ไม่ได้ ฮ่วย ! ไม่ควรจะเกิดขึ้นจริงๆปัญหาและข้อจำกัดแบบนี้ - -


สรุปโดยรวม "มันยังไม่ดีพอ"

หลังจากเขียนโปรแกรมมาสองอาทิตย์ ทดสอบทั้งเรื่องการเขียนโปรแกรมและประสิทธิภาพ เรียกว่าได้ทั้งมุมผู้ใช้และนักพัฒนา ขอสรุปความพอใจบน Platform นี้ว่า "ดีแล้ว แต่ยังไม่ดีพอ" ยังต้องได้รับการแก้ไขอีกมาก ถึงจะตามชาวบ้านทันได้ นาทีนี้เอาจริงๆ มันยังไม่สามารถขึ้นเป็นระบบปฏิบัติการเบอร์ 3 ได้ด้วยซ้ำ ก็น่ารอดูว่า Microsoft จะทำได้หรือไม่ กับการนำเสนอ "ความแปลกใหม่" มาให้ผู้ใช้ ... และจะติดตลาดทันมั้ย หรือว่า iOS และ Android จะก็อปจุดเด่นไปก่อน จน Platform นี้ไม่มีค่าอะไร ... น่าสนใจและน่าติดตามมากมาย


เทียบดัชนีความสุขการเขียนโปรแกรม: iOS > Windows Phone > Android > BB10

เทียบดัชนีความสุขในการใช้งาน: Android > iOS > BB10 > Windows Phone

เทียบดัชนีการอยากลงแรงในแพลตฟอร์มนั้นๆ: iOS > Android > Windows Phone > BB10


จบครับ ขออภัยที่อัพบล็อคได้ไม่บ่อย มีโอกาสก็จะมาแบ่งปันมุมมองอะไรเรื่อยๆนะครับ


Reference

[1] - WP7 Silverlight Perf Demo 1: VirtualizingStackPanel vs. StackPanel as a ListBox ItemsPanel

บทความที่เกี่ยวข้อง

Mar 25, 2013, 14:10
22779 views
บันทึก เมื่อเนยต้องเขียน BB10 Cascade
Mar 13, 2013, 01:25
17784 views
ประตูรถไฟฟ้าเปิดกลางราง เคสตัวอย่าง User & Engineer
0 Comment(s)
Loading