พอดีเห็นกระทู้นำเสนอมุมมองของ Programmer ที่มีต่อ iOS และ Android ในห้อง MBK วันก่อน เลยลองเข้าไปอ่านดูครับ แต่เนื้อหาไม่ค่อยจะเป็นเรื่องประสบการณ์การโปรแกรมมิ่งเท่าไร เลยอยากจะลองนำเสนอบ้างในฐานะที่เป็นโปรแกรมเมอร์เหมือนกัน เผื่อมีใครสนใจอยากจะลองเริ่มทำแอพดูบ้าง ไม่ว่าจะทำเป็นอาชีพหรือทำเล่นๆเป็นงานอดิเรก ซึ่งผมอาจจะไม่ได้ลงรายละเอียดลึกมากนะครับ เพราะถ้าลงลึกจริงๆ เขียนเป็น Blog series อาจจะเหมาะกว่า
เนื้องานในปัจจุบันของผมคือการพัฒนาฟีเจอร์ลงบน iOS ก่อน และทำลง Android ในช่วงที่ iOS App ยังอยู่ในขั้นตอนการตรวจสอบ เพื่อที่จะได้ปล่อยออกมาทั้ง 2 แพลทฟอร์มพร้อมๆกัน จนถึงเวลานี้ ผมเขียน iOS App มาตั้งแต่ iOS 4.3 ส่วน Android เขียนมาตั้งแต่ 4.0.3 (API 15)
(แอพที่อัพโหลดทั้งหมด ไม่ใช่ผลงานของผมเอง แต่เป็นลูกค้ามาจ้างให้ทำและงานประจำที่บริษัท ซึ่งเซ็น NDA ไว้ จึงขอสงวนชื่อแอพนะครับ)
1. การเริ่มต้นเขียน
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้สิ่งนึงที่ผมรู้สึกจากการเขียน iOS คือมันค่อนข้างง่าย ใครที่ต้องการจะเริ่มเขียนแอพผมอยากแนะนำให้เริ่มที่ iOS เพราะจะมี Tutorial ให้อ่านเยอะมาก รวมถึง Apple เองก็พยายามจะทำให้การเขียนง่ายขึ้นเรื่อยๆ แต่ ... สิ่งนึงที่ผมรู้สึกและพบเจอคือมันง่ายเกินไป กล่าวคือพอเวลาโปรแกรมเมอร์ได้ทำอะไรที่ง่ายๆ หรือมีรูปแบบวิธีการทำงานที่กำหนดตายตัว มันอาจจะไปจำกัดจินตนาการของตัวโปรแกรมเมอร์เอง
ยกตัวอย่างทุกวันนี้เวลาเริ่มโปรเจคใหม่ ผมจะสร้าง blank project เสมอแม้ Apple จะพยายามผลักดันให้ developer ใช้ Storyboard ก็ตาม ด้วยเหตุผลจริงๆข้อเดียวคือชอบที่จะเขียนเองมากกว่า
ส่วน Android เรื่องแรกที่จะทำให้มือใหม่ปวดหัวก็คือ Context, Intent และ Activity Life Cycle ซึ่งเป็นเรื่องที่ค่อนข้างเข้าใจได้ยากซักเล็กน้อยสำหรับโปรแกรมเมอร์ที่ชินกับ single instance application แต่เมื่อไรที่เข้าใจแล้ว จะพบว่ามันค่อนข้างทรงพลังมาก
2. ตัวภาษาที่ใช้เขียนเอง
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้สำหรับ iOS ผมยังไม่ขอพูดถึง Swift นะครับ เพราะประสบการณ์ที่ผ่านมาสอนผมว่า "อย่าลองอะไรที่ Apple พึ่งเข็นออกมา" และ developer หลายๆท่านที่ผม follow เองก็ยังเลือกที่จะอยู่กับ Objective-C ไปก่อนซักพัก เลยขอรอเช่นกันดีกว่า
สำหรับ Objective-C ที่ใช้ใน Cocoa Touch นั้น ผมมีความรู้สึกเดียวกับข้อแรก คือมันเหมาะมากกับผู้เริ่มต้น เพราะทุกสิ่งสามารถเข้าใจได้ในทันที เช่น
[NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(submitUserData) userInfo:nil repeats:YES];
ชื่อ method และ parameter ของ Objective-C ค่อนข้างจะบอกชัดเจนเสมอว่าทำอะไร ต้องการอะไร และให้อะไรกลับมาจึงทำให้เวลาเราอ่านเจอ method ใดๆ มักจะไม่ค่อยงง อีกอย่างคือการที่ Objective-C นั้นเบสมาจากภาษา C เลยทำให้มันทำงานได้ค่อนข้างเร็วมาก แต่ก็ต้องมาจัดการเรื่อง memory กันเอง ซึ่งผมเองมาในช่วงที่มี ARC แล้ว เลยไม่ได้ไปยุ่งอะไรกับ memory เท่าไร ปล่อยให้ ARC ทำงานของมันไป ก็นับว่าสะดวกดีครับ ช่วงแรกๆของมือใหม่อาจจะมีบ้างบางครั้งที่เขียนผิดพลาดแล้วทำให้เกิด SIGABRT หรือ object ถูก ARC release พอจะใช้อีกทีมันไม่อยู่แล้ว แต่พอเขียนไปซักพักจะชินจนไม่เป็นปัญหาไปเองครับ ส่วนข้อเสียที่ผมไม่ค่อยชอบมีเรื่องเดียวคือ id หรือ memory pointer object ซึ่งผมมองว่ามันเป็น การเขียนโปรแกรมที่ไม่ค่อยดีเท่าไร
ส่วน Android นั้น เขียนด้วย Java ซึ่งเป็น OOP ที่แข็งที่สุดแล้ว ผมเองเขียน Java สมัยเรียนมหาลัย จากนั้นจบมาก็ไปเขียน PHP, Ruby on Rails กลับมา Objective-C แล้วถึงมาเจอ Java อีกครั้ง ซึ่งการเจอ Java รอบนี้ ผมประทับใจมันมากกว่าสมัยมหาลัยเยอะ อาจจะเป็นเพราะสมัยเรียนผมไม่ค่อยเข้าใจก็ได้ พอจบมาแล้ว ทำงานแล้วได้เจอมันอีกรอบนึง ได้เข้าใจมันมากขึ้น
ตัวภาษา Java เองอาจจะอ่านเข้าใจยากกว่า Objective-C แต่ก็ไม่ถึงกับจะลำบากซะทีเดียว เช่น
new Timer("Submit User Data Timer", true).scheduleAtFixedRate(new TimerTask() {
public void run() {
submitUserData()
}
}, 0, 18000);
(ทำแบบเดียวกัข Objective-C ข้างบน แต่ code จะเยอะกว่าเล็กน้อย)
Java อาจจะเข้าใจยากนิดนึงสำหรับผู้เริ่มใหม่ แต่ถ้าเมื่อไรที่คุณเข้าใจแล้ว และเขียนด้วย Design Pattern ที่ถูกต้อง Code ของคุณจะสะอาดมาก น่าอ่าน เป็นระเบียบ ซึ่งหลังจากที่ผมได้เริ่มเขียน Android สิ่งนึงที่เกิดขึ้นตอนที่ผมย้อนกลับไปเขียน iOS คือผมรื้อโค๊ดเขียนใหม่แทบทั้งโปรเจค อาจจะเป็นเพราะตอนที่ผมทำ iOS ผมเขียน Code ไม่ค่อยจะ OOP เท่าไรด้วย เลยตัดสินใจรื้อเขียนใหม่ดีกว่า เวลาอ่านจะได้สบายใจ
3. IDE
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้iOS App จะต้องเขียนด้วย XCode เท่านั้น ซึ่ง XCode จะลงได้เฉพาะบน Mac OSX เลยทำให้ iOS Developer ทุกคนถูกบังคับให้ใช้ Mac ไปโดยปริยาย
ผมเริ่มต้นเขียนด้วย XCode 4.2 โดยใช้ Mac Mini ตัวแรก ซึ่งมันทำให้ผมประทับใจมาก เพราะแม้จะเปิดคอมและ IDE ไว้ 3 อาทิตย์ก็ไม่เคยมีปัญหาอะไรเลย ทำงานได้ดีเสมอ แต่หลังจากนั้น ความประทับใจมันเริ่มลดลงๆเมื่อ Apple ออก XCode 5 เพราะเริ่มเจอ force quit มากขึ้น จนกระทั่ง เร็วๆนี้ผมโหลด XCode 6 มาหลังจากที่ Apple ออก iOS 8 ที่ซึ่งนำพามาซึ่งความผิดหวังมากขึ้น จากที่แทบไม่เคย force quit เลย เดี๋ยวนี้ force quite บ่อยขึ้นเยอะ แถมหน่วงขึ้นเรื่อยๆ บางอย่างที่ไม่ควรจะขาดก็เอาออกไป เช่นเวลาเลือก Simulator ใน XCode version เก่าๆสามารถ scroll magic mouse เลือกได้ แต่เดี๋ยวนี้ต้องขยับเอาเอง ซึ่งยังคาใจว่าเอาออกไปทำไม
แต่โดยรวมๆแล้ว ผมถือว่า XCode เป็น IDE ที่ดีมากๆ และเหมาะมากๆ ถ้าคุณจะเริ่มต้นเขียน mobile app เพราะแค่มี xcode คือจบเลย คุณสามารถพัฒนาแอพ ทดสอบ รวมถึงอัพโหลดได้เลย โดยเฉพาะข้อดีที่สุดข้อนึงคือ iOS Simulator ที่ทำงานได้ดีมากๆ (เทียบกับของ ADT ที่ง่อยๆและกินทรัพยากรค่อนข้างสูง)
ส่วน Android นั้นจะมี IDE 2 ตัวให้เลือกคือ Eclipse + ADT และ Android Studio ซึ่งปัจจุบันนี้ผมยังใช้เฉพาะ Eclipse + ADT อยู่เนื่องจาก Android Studio ยังเป็น beta และตามที่ผมเข้าใจ (ล่าสุด) Android Studio ยังไม่รองรับ Library Project ที่แชร์กันระหว่างหลายๆโปรเจค
วันแรกที่ผมได้ลองเขียน Android นั้นจำได้เลยว่าปวดตับมาก จากคนที่เคยจับแต่ XCode ซึ่งเป็นอารฒณ์ "คลิกเดียวจบ" มาเจอ Eclipse ซึ่งเป็นลักษณะ "คลิกเดียวไม่จบ" เลยเจอปัญหาหลายๆอย่าง รวมถึงช่วงแรกๆ Eclipse crash บ่อยมาก วันนึงน่าจะเกิน 10 รอบ แต่พอเวลาผ่านไป มีการอัพเดทเพิ่มเติมออกมา ปัญหามันน้อยลง จนทุกวันนี้แทบไม่ crash อีกแล้ว (กลายเป็นผมมีปัญหากับ XCode แทน)
โดยสรุปแล้ว IDE ทั้งสองตัวมีข้อดีที่แตกต่างกัน แต่ XCode จะค่อนข้าง developer friendly มากกว่า แต่ถ้าใครอยากลองเขียนไม่ว่าจะภาษาไหนก็ตาม ผมแนะนำให้ใช้ SSD ครับ ความเร็วที่ได้มากมันเปลี่ยนชีวิตมากๆ ส่วน Ram และ CPU ไม่ค่อยมีผลเท่าไร
4. การทำ Interface
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้จริงๆประเด็นนี้เป็นเรื่องที่ดูจะลงลึกไปนิดนึง แต่เชื่อว่าเป็นสิ่งที่หลายๆคนเชื่อว่าทำ layout บน iOS ง่ายกว่า Android เลยอยากจะถ่ายทอดประสบการณ์เรื่องนี้ด้วย
iOS เมื่อก่อน (ก่อน iPhone 6) นั้นเป็น static ทุกๆอย่างมีการกำหนดค่าที่แน่นอน และตัว iOS เองจะปรับลดหรือขยายให้ตามที่จำเป็น การออกแบบนั้นก็ทำเพียง 3 device ก็เพียงพอคือ iPhone 3.5", iPhone 4" และ iPad
การที่จะทำ interface ตาม design ที่ได้มานั้นค่อนข้างง่ายเช่นหากว่าคุณต้องการจะแสดงรูปที่มีความกว้างครึ่งจอ สูง 100px ก็สามารถกำหนดได้เลย โดยไม่ต้องคำนวนอะไรเพิ่มเติม หลังจากนั้นเวลาแสดงผลบนจอ Retina Display ที่ละเอียดเป็น 2 เท่าของจอปรกติมันก็จะถูก apply factor ไปเอง ซึ่งการ apply factor นี้ยังคงมีผลอยู่จนถึง iPhone 6 และ 6+ และจุดแข็งอีกอย่างที่เหมาะสำหรับมือใหม่คือ เราสามารถทำ layout ด้วย visual editor ได้ สามารถเห็นภาพ ลากและวาง พร้อมทั้งปรับ property ต่างๆและเห็นผลการเปลี่ยนแปลงได้ทันที
สำหรับ Android การทำ layout จะต้องทำหลักๆ 3 device เช่นกันคือ phone, 7" tablet และ 10" tablet แต่จะยากกว่า iOS และมีเรื่องที่ต้องเข้าใจมากกว่าเยอะ โดยเฉพาะเรื่องของ DP, SP และ screen density ซึ่งเป็นเรื่องที่จะทำให้มือใหม่งงมากๆ เราไม่สามารถจะไปกำหนดได้ว่า ImageView อันนี้ให้มีขนาด 60px เพราะ 60px มันแสดงผลไม่เท่ากันบนแต่ลง device แต่เมื่อไรที่เข้าใจแล้ว การจะทำให้ Application ดูสวยบน 4-5 พัน device นั้น ไม่ได้ยากเลย
ปัญหาอีกอย่างนึงของ Android คือการที่ visual editor ใช้งานค่อยข้างยาก ผมเองเลยเลือกที่จะเขียน xml 100% แทน (แต่ได้ยินว่าใน Android Studio นั้น visual editor ดีขึ้น)
โดยสรุปแล้ว ก็ขอยืนยันตามที่เคยได้ยินกันมาว่า layout บน iOS ง่ายกว่าจริงๆ แต่ android มันก็ไม่ได้ยากจนเกินไปนัก
5. การอัพโหลดขึ้น App Store, Google Play
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้สำหรับ iOS นั้น การอัพโหลดขึ้น App Store จะค่อนข้างมีขั้นตอนมากกว่า และใช้เวลาในการรีวิวประมาณ 7-10 วัน ซึ่งกฎในการส่ง App ขึ้น App Store นั้นมีระเบียบค่อนข้างเยอะ แต่เท่าที่ผมเจอมา คนรีวิวเองก็ไม่ได้รีวิวอะไรละเอียดมากมายนัก เหมือนดูผ่านๆแล้วปล่อยเหมือนกัน
บางครั้งผมส่งแอพไป ก็ขึ้น "Waiting for review" หรือเข้าคิวรอรับการรีวิวอยู๋ 6-7 วัน พอตอนรีวิวจริงๆ สถานะของแอพจะเปลี่ยนเป็น "In Review" แต่แค่ 1 ชม. หลังจากนั้นก็ Approve และ Processing for App Store
ในความรู้สึกผมมันเหมือน 6-7 วันแรกเป็นการเอาไปดองให้ใช้เวลานานซะมากกว่า พอตอนรีวิวจริงๆกลับใช้เวลา ชม. เดียว (ไม่ได้รีวิวกันละเอียดยาวนานถึง 7 วัน) ซึ่งการรีวิว ชม. มันไม่ได้ละเอียดอะไรเท่าไร อีกอย่างคือ App Store ก็ใช้คนรีวิว มีผิดพลาดได้เช่นกัน ผมเคยส่งแอพนึงไปแล้วโดน reject เพราะมีบั๊ก 3 จุด ผมแก้บั๊กไป 2 จุด โดยลืมจุดสุดท้ายไป จากนั้นส่งไปใหม่ และได้รับการ approve จาก reviewer อีกคนนึง
แต่อย่างไรก็ดี การอัพแอพของ iOS ยังดีกว่าแอนดรอย์ เพราะอย่างน้อยยังมีการรีวิวบ้าง เพราะ Android ไม่มีรีวิวอะไรเลย อยากอัพอะไรก็อัพ และใช้เวลาเพียง 2-3 ชม. ก่อนจะออกสู่สายตาชาวโลก
แต่อย่างนึงที่ผมอยากให้ App Store เปลี่ยนแปลงคือการเอาไปดอง "Waiting for Review" 6-7 วันมันนานเกินไป ผมเข้าใจว่าการรีวิวนานๆมันมีผลดีอย่างนึงคือมันทำให้ developer พิถีพิถันในการทำงานมากขึ้น เพราะการอัพแต่ละครั้งต้องรอ 1 อาทิตย์ เพราะฉะนั้นต้องทดสอบให้ชัวร์จริงๆก่อนจะอัพ แต่ในบางครั้ง มันก็มีปัญหาฉุกเฉินที่เราอยากจะแก้ไขให้ไวที่สุด ซึ่งเราก็จะต้องโดนดอง 6-7 วันเหมือนกัน
ส่วน Android ถ้าเอาคนมานั่งรีวิวบ้าง คงไมต้องทุกแอพ แต่สุ่มๆบ้างก็ยังดี ก็คงทำให้แอพขยะมันลดน้อยลงไปได้เยอะเลย
6. รายได้
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้เนื่องจากผมไม่ได้ทำแอพขาย แต่เป็นการรับจ้างลูกค้าทำแอพ จึงไม่ขอพูดถึงรายได้จากการขายแอพนะครับ แต่ยืนยันได้อย่างนึงอย่างที่หลายๆคนเข้าใจคือ iOS App แบบเสียเงินมักจะขายได้ดีกว่า Android ส่วนเหตุผลคงหาอ่านได้ตาม Google ทั่วๆไปครับ (แต่ไม่ใช่เพราะแอพ iOS มันดีกว่าซะทีเดียว)
สำหรับค่าจ้างในการทำแอพ จากที่เคยทำมา mobile developer หากรับงานนอกสามารถหารายได้จากการรับจ้างได้ตั้งแต่ 200 บาทต่อ ชม. ขึ้นไป ซึ่งขึ้นอยู่กับการเรียกราคาของตัว developer เอง ความยากง่ายของงาน ความสามารถในการจ่ายของผู้ว่าจ้าง ฯลฯ ซึ่งอาจจะขึ้นไปได้ถึงหลักพันบาทต่อ ชม. ซึ่งนับว่าสูงมากเหมือนกัน ใครขยันๆหน่อย เดือนนึงอาจจะมีรายได้เสริมได้มากถึง 3-4 หมื่นบาทเลย
สิ่งที่ได้พบเจอมาจากการทำงานทั้ง 2 platform ส่วนตัวผมมองว่าทั้งสอง platform มีความยากง่ายและผลลัพท์ที่ได้แตกต่างกัน แต่มันไม่ได้ดีหรือแย่กว่ากันชัดเจน ขึ้นอยู่กับว่าชอบที่ทำให้กับ platform ใหนเสียมากกว่า ถ้าใครสนใจที่จะลองศึกษา ทุกวันนี้มีเว็บที่สอน Tutorial อยู่มากมาย ไม่แน่นะครับ อาจจะเป็นช่องทางหารายได้ใหม่ของคุณก็ได้ ^^
ประสบการณ์ที่ได้รับจากการพัฒนา Application ทั้ง iOS และ Android
เนื้องานในปัจจุบันของผมคือการพัฒนาฟีเจอร์ลงบน iOS ก่อน และทำลง Android ในช่วงที่ iOS App ยังอยู่ในขั้นตอนการตรวจสอบ เพื่อที่จะได้ปล่อยออกมาทั้ง 2 แพลทฟอร์มพร้อมๆกัน จนถึงเวลานี้ ผมเขียน iOS App มาตั้งแต่ iOS 4.3 ส่วน Android เขียนมาตั้งแต่ 4.0.3 (API 15)
(แอพที่อัพโหลดทั้งหมด ไม่ใช่ผลงานของผมเอง แต่เป็นลูกค้ามาจ้างให้ทำและงานประจำที่บริษัท ซึ่งเซ็น NDA ไว้ จึงขอสงวนชื่อแอพนะครับ)
1. การเริ่มต้นเขียน
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
2. ตัวภาษาที่ใช้เขียนเอง
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
3. IDE
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
4. การทำ Interface
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
5. การอัพโหลดขึ้น App Store, Google Play
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
6. รายได้
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
สิ่งที่ได้พบเจอมาจากการทำงานทั้ง 2 platform ส่วนตัวผมมองว่าทั้งสอง platform มีความยากง่ายและผลลัพท์ที่ได้แตกต่างกัน แต่มันไม่ได้ดีหรือแย่กว่ากันชัดเจน ขึ้นอยู่กับว่าชอบที่ทำให้กับ platform ใหนเสียมากกว่า ถ้าใครสนใจที่จะลองศึกษา ทุกวันนี้มีเว็บที่สอน Tutorial อยู่มากมาย ไม่แน่นะครับ อาจจะเป็นช่องทางหารายได้ใหม่ของคุณก็ได้ ^^