เคยนำบทความต่าง ๆ ของการพัฒนาระบบ Instagram มาแปลและสรุป
ในครั้งนี้เป็นเรื่องราวสำหรับการพัฒนา Android app
ว่าในช่วง 4 ปีที่ผ่านมานั้น ได้ทำอะไรมาบ้าง ?
ผ่านร้อนผ่านหนาวอะไรมาบ้าง ?
ตั้งแต่ version แรกที่พัฒนาด้วย engineer 2 คน ใช้เวลาไป 4 เดือน
จนตอนนี้ทีมมีจำนวน 30 คนแล้ว
ทำการแปลและสรุปจากบทความเรื่อง Instagram + Android: Four Years Later
มาไว้นิดหน่อย น่าจะเป็นประโยชน์ต่อนักพัฒนากันบ้าง
ทั้งการรับมือเรื่องขยายทีม
ทั้งการรับมือเรื่องการดูแลรักษาระบบ
ทั้งการเพิ่มความสามารถต่าง ๆ
ทั้งการดูเรื่องขนาดของ APK
ทั้งการดูเรื่อง performance ที่ขึ้นชื่อว่าเร็วมาก ๆ
เริ่มต้นด้วยข้อมูลและสถิติต่าง ๆ ก่อน
- 30 คือ จำนวนสมาชิกของทีม Android
- 19.3 MB คือ ขนาดของ APK แบบ raw size (ใช้ข้อมูลล่าสุดวันที่ 20 กันยายน 2556)
- 15.4 MB คือ ขนาดของ APK แบบที่ผู้ใช้งานต้อง download และ ติดตั้ง
- ถูกติดตั้งมากกว่า 1 พันล้านครั้ง
- 4.5 คือคะแนนของการ review บน Google Play
- 38 ล้านคือจำนวนคน review
จาก Core Value ของทีมพัฒนา Instagram คือ Do the Simple Thing First
โดยจะทำการสร้าง feature ที่คนใช้ต้องการใช้ หรือ ใช้อยู่แล้วก่อนเสมอ รวมทั้งให้ความสนใจในเรื่อง performance ของระบบอย่างมาก ซึ่งจะแยกส่วนการทำงานต่าง ๆ ออกจากกันอย่างชัดเจน (Component) เพื่อทำให้สามารถแก้ไขและปรับปรุงระบบได้ง่าย ตัวอย่างเช่น Android app ทำหน้าที่ render ข้อมูลที่ได้รับจาก server ทำหน้าที่เหมือน Web browser การประมวลผล business logic ที่ซับซ้อนทำงานที่ server side ทำให้ง่ายต่อการแก้ไข bug และ เพิ่ม feature ใหม่ ในฝั่ง server จะต้องทำการส่งข้อมูลที่จำเป็นต่าง ๆ ให้ครบ ดังนั้นจึงต้องมีระบบ Continuous Integration Testing เพื่อทำให้มั่นใจว่าสิ่งที่สร้างทำงานดังที่หวัง และ feature เก่า ๆ ยังคงทำงานได้เหมือนเดิม ผลที่ตามมาก็คือ ฝั่ง Android app แทบจะไม่ต้อง ทำการตรวจสอบค่าว่าเป็น Null หรือไม่ ? ทำการตรวจสอบว่าข้อมูลใช้ได้หรือไม่ ? เนื่องจาก Android app ส่วนใหญ่ที่ crash ก็มาจากเรื่องเหล่านี้แหละนะ ดังนั้นจึงทำการแก้ไขปัญหาที่ต้นเหตุกันดีกว่า ยังไม่พอนะ ยังมีระบบ Automated Crash Report ให้อีก ซึ่งจะแจ้งสาเหตุของการ crash มาให้ แน่นอนว่ามี stack trace มาให้ เพื่อช่วยทำให้การแก้ไขง่ายขึ้น จะได้ช่วยลด ละ เลิก การ debug app !!เมื่อ Android app มีขนาดใหญ่ขึ้น
แน่นอนว่า จำนวน source code ต้องเยอะขึ้น ดังนั้นสิ่งที่ต้องดูแลรักษาอย่างหนักก็คือ- Source code ต้องง่ายและทำความเข้าใจได้ง่าย
- Source code สามารถอธิบายตัวมันเองได้
- Source code ต้อง debug ได้ง่าย
- ทำการ generate source code ให้น้อยที่สุด
- ลดการใช้ runtime annotation ลงไป
- รวมทั้งลดการใช้พวก maagic library ต่าง ๆ
มาดูการ Optimize App กันบ้าง !!
โดยจะทำการปรับปรุง performance ใน feature ที่มีคนใช้งานเยอะ ๆ เป็นหลัก ตัวอย่างเช่น การจัดการกับข้อมูล JSON โดยใน version ที่ 1 นั้นใช้งาน library Jackson Data Binding ซึ่งพบปัญหาว่า ทำงานช้ามาก ๆ บนมือถือกลุ่ม Low-end (เครื่องที่ CPU และ RAM น้อย ๆ) ดังนั้นจึงทำการเขียน library ขึ้นมาใช้เอง เพื่อให้ตรงกับความต้องการ สามารถอ่านเพิ่มได้ที่ Fast, auto-generated streaming JSON parsing for Android การจัดการกับ Activity Screen โดยใน version แรก ๆ นั้นจะทำการแสดง activity ต่าง ๆ เช่นการ like และ comment ผ่าน App ด้วย WebView !!! เนื่องจากทำให้ง่ายต่อการเพิ่มชนิดของข้อมูลต่าง ๆ แต่กลับพบว่า การใช้งาน WebView นั้นทำให้ App ช้าลงไป 30% ดังนั้นจึงทำการเขียน code ขึ้นมาใหม่ สามารถอ่านเพิ่มได้ที่ Building a better Instagram app for Androidจะเห็นได้ว่า ทีมพัฒนาก็ต้องมีเครื่องมือในการวิเคราะห์ข้อมูลต่าง ๆ ของ App เพื่อทำให้เห็นว่า ส่วนไหนของ App ที่มีปัญหา ทั้ง performance, startup time, data usage รวมทั้งรายงานเกี่ยวกับ bug ต่าง ๆ อีกด้วยปล. ลองกลับมาดู App ของเราสิว่า ยังขาดอะไรไปบ้าง ?
มาถึงเรื่อง Effienct UI สรุปสั้น ๆ ได้ว่า
เป้าหมายก็คือ สร้าง App ที่ทำงานได้อย่างรวดเร็ว และ สวยงาม แน่นอนว่า อ่านแล้วมันดูขัดแย้งกันพอสมควร ทางทีมพัฒนา App ของ Instragram สรุปไว้ดังนี้ ในช่วง Startup time ของ App ต้องน้อย ๆ ดังนั้นพวกขนาดของรูปต้องลด ทั้งขนาด ทั้ง texture ทั้ง color ที่ไม่จำเป็นออกไป รวมทั้งพวก asset ต่าง ๆ อีก รวมไปถึงเวลาในการเปิดหน้าอื่น ๆ อีกด้วย ส่งผลทำให้ขนาดของ App เล็กลงไปด้วย ซึ่งมีผลอย่างมากต่อผู้ใช้งาน สิ่งที่ต้องใส่ใจอย่างมาก คือ UI ต้องเรียบง่าย นั่นคือง่ายต่อการสร้างมันขึ้นมา และต้องมีการกำหนดมาตรฐานต่าง ๆ ขึ้นมา เพื่อสรุปข้อตกลงในการทำงานร่วมกัน ทำให้เราสามารถสร้าง library กลางเพื่อให้คนอื่น ๆ นำไปใช้ได้ นั่นแสดงว่าทั้ง UI designer และ Developer จำเป็นต้องพูดคุยกัน เพื่อทำให้ App โตไปอย่างยั่งยืน แถมทำให้ทั้ง App มันเข้ากัน ไม่ใช่ว่า แต่ละหน้า แต่ละ feature ไปกันคนละทาง !!มาถึงเรื่องที่ชอบมาก ๆ ก็คือ เรื่องของ Code
เป้าหมายของทีมพัฒนา คือ พยายามที่จะลด จะตัด dependency ต่าง ๆ ออกไป ให้เหลือเฉพาะสิ่งที่จำเป็นหรือใช้งานเท่านั้น โดยในแต่ละ component จะมีหน้าที่การทำงานเฉพาะเจาะจงตาม use case ทำให้เกิดการเขียน code หรือ library ขึ้นมาใช้เอง เช่น JSON parser ไม่ใช้ Dependency Injection library เนื่องจากทำให้ขนาดของ App ใหญ่ขึ้น แถมซับซ้อนขึ้นอีก และกระทบต่อ performance แน่นอน ยังไม่พอนะ ใน App จะไม่มี Google Play Library อีกด้วย เนื่องจากเขียน code ขึ้นมา เพื่อจัดการกับ GCM เอง สิ่งที่นักพัฒนาต้องเรียนรู้คือ หลีกเลี่ยง MultiDex โดยมันคือปัญหาของ App ขนาดใหญ่ทุก App แน่นอนว่า ส่งผลต่อขนาดและ performance อย่างแรง หนัก ๆ เลยก็คือ เวลาในการ build แต่ละครั้งนานมาก !! ใช้ memory เยอะมาก !! ซึ่งนักพัฒนาทุกคนน่าจะกำลังประสบภัยกันปัญหานี้อยู่ ดังนั้นทีมพัฒนา App ของ Instagram จะใส่ใจเรื่องนี้มาก ๆ จะไม่ให้เกิด multidex ขึ้นมาใน App เลย ดังนั้นสิ่งที่ต้องทำก็คือ ดูแลการใช้งาน dependency library ต่าง ๆ อย่างใกล้ชิด ในแต่ละ library ที่เขียนหรือนำมาใช้ ต้องมีชุดการทดสอบครอบคลุม มิเช่นนั้น จะไม่ยอมรับในการเปลี่ยนแปลงนั้น ๆ รวมทั้งจัดการเรื่องจำนวนของ method count ซึ่งเราต้องทั้งสนใจและใส่ใจในสิ่งที่กำลังสร้างอยู่เสมอ ลองนำไฟล์ APK ของ Instagram App มาเปิดด้วย Analyze APK แสดงดังรูปสุดท้ายแล้ว ประโยคที่ผมชอบมาก ๆ ก็คือ The average engineer spends 20–40% of her day on various code review and mentorship activities.