มางาน meetup แรกของปีกับงาน Kotlin Meetup 2020.1 กับโลกของ Kotlin Multiplatform
ปีที่แล้วก็ตั้งชื่อบล็อกแบบนี้555 ปีนี้เพิ่มอีกนิดนึงเดี๋ยวงง
กำหนดการงานอยู่ในนี้เน้อ
งานนี้มีไลฟ์ดีมีคุณภาพ ดูย้อนหลังได้ที่นี่จ้า ไถไป 1 ชั่วโมง 22 นาที โดยประมาณ พอเอามาแปะใน ghost เอ้ออออ กดดูวิดีโอได้เลยจ้า ไม่เหมือน medium
ซึ่งทางเราใช้เวลาเดินทางจากออฟฟิคมาที่ True Digital Park เป็นเวลาทั้งสิ้น 1 ชั่วโมงด้วยกัน มาถึงจะงงๆหน่อย มาดูใกล้จะเริ่มแล้ว เลยเดินหาที่นั่งแบบงงๆ ไปหลังสุดเลย ดีที่เจอพี่เอก สบายใจหล่ะ 55555555
ในงานมีลงทะเบียนแจกของ พร้อมแอบขอ Resume กันเนียนๆ รายชื่อที่ได้นำมาจับสลากแจกกล่อง TrueId จ้า
ในระหว่างนั้นพี่เอกก็ถามหาคนอื่นๆ ซึ่งทุกคนที่พี่เอกถามหา มีพี่ป็อปมาคนเดียว ซึ่งเป็นพิธีกรในงานนี้ ฮ่าาาๆ สรุปเป็นดังภาพ เพราะ มีคนนึงไม่มาเพราะไปกินเนื้อย่างอ่า นึกว่าจะชักภาพ droid dev talk เทปที่จะถึงนี้สักหน่อย ;P
Opening Remark from True Digital
ด้วยตอนแรกนั่งแล้วโดนป้ายบัง เลยไม่ค่อยได้จดจ้า 5555555 ระหว่างนั้นก็ง่วงๆด้วยแหละ
เลยเอาอันที่เขาพูดแบบจับจิตจับใจมาสรุปกันดีกว่า
- ในทีมยังกะจักรวาล Marvel ในทีมใหญ่ เป็นทีมชื่อ super hero แบ่งเป็นทีมย่อย 8 ทีม แล้ว developer เยอะมาก ครึ่งร้อยได้ บริหารแบบ scrum team
- ในทีม super hero ใหญ่ๆ มีทีมทำ feature 6 ทีม มีทีมตรงกลางคือ The Flash ทำ Integration ถ้าแต่ละทีมเอาเข้า Integration แล้วไม่ผ่าน ก็เอากลับไปแก้ให้ผ่านให้ได้ ซึ่งในส่วน Integration จะทำเป็น Automate Test ส่วน Valkyrie เป็นทีมใหม่ทำ App Modularization กันอยู่ เพราะแอพใหญ่มาก ต้องการลดเวลาบิ้วให้สั้นลง
- แล้วปัญหาการ PR หล่ะ? ที่นี่มี Main Reviewer App แล้วมีการแจ้งเตือนว่ามี PR เข้ามา และจะวนคนตาม sprint อันไหนที่ฝาก PR ไว้ซึ่งเป็นท่าไม้ตายของ developer ที่นี่ จะมีคำพูดน่ารักๆว่า “ฝากเอาไว้ในอ้อมใจของทุกท่านด้วยนะคับ”
- developer ที่นี่เขียน medium ด้วยนะเออ เข้าไปดูได้ที่
Going Multiplatform with Kotlin
เป็น Panel Discussion คุ้นๆไหมฮะ ฮ่าาาๆ จะมีคำถามจากทางบ้านมาก่อน และตามด้วยคำถามคนในงานจ้า
ในที่นี้ตั้งแต่ต้น ด้วยความง่วงนอน มีความเสียงจุกๆจิกๆ เสียงไมค์พี่เบิร์ดเบา และต่างๆนานา จึงทำให้เรานั้น จดได้ไม่ครบและไม่ทัน เลยดูไลฟ์ย้อนหลังไป จดสรุปไปจ้า ฮือออ แต่ก็ยังไม่ทันอยู่ดี555
ส่วนคำถามใน slido อันไหนตอบไปแล้วเขาลบออก เลยไม่มีคำถามให้อ่านย้อนหลังนะจ๊ะ ตามดูในไลฟ์อย่างเดียวเน้อ
คำถามทางบ้านที่ทางทีมงานเลือกมา
Kotlin คือ?
ภาษาที่พัฒนาขึ้นที่ต่อยอดจาก Java ทำให้พัฒนาแอพได้อย่างสะดวกรวดเร็วมากขึ้น
ทำไมต้องใช้ Kotlin ในการพัฒนา คำถามจากมือใหม่สุดๆ
Java มี lacacy หลายๆอย่าง และทีมพัฒนาเผลี่ยนมือ ทำให้เกิดการพัฒนาได้ช้าลง ส่วน Kotlin พัฒนาด้วย Jetbrain ซึ่งเป็นทีมที่ทำ IDE อย่าง Android Studio, PyCharm และถูก adopt ด้วย Google และนำทีม developer ตัวท้อปเป็นทีมพัฒนาภาษา Kotlin และพัฒนาหรือ evolve ไปในทางไหน ให้พัฒนาไปได้เร็วมากขึ้น
มีอะไรที่ Kotlin ยังด้อยกว่า Java บ้าง
พวก library บางอันไม่ friendly กับ Kotlin เช่น Dagger เปลี่ยนมาใช้ Koin แทน หรือพวก Annotation ต่างๆ static แล้ว string บางอย่าง (จดไม่ทัน555)
สงสัยว่าทำไม Kotlin ยังแซง Java ไม่ได้ ทั้งที่หลายคนบอกว่ามีอะไรดีๆมากกว่า 2020 แล้ว Java ก็ยังแรงไม่สร่าง
Java ถูกใช้ในระดับ enterprise และหลายๆบริษัทใช้กันอยู่แล้ว จึงมี legacy code ต้องใช้เวลาแปลงนานในการเปลี่ยน และเรื่อง effort หรือ bugger ที่ทำแล้วอาจจะไม่คุ้ม ตามแต่ในแต่ละองค์กร Kotlin จึงพยายามปรับให้คนใช้ Java สามารถใช้ร่วมกันได้ เลยทำให้ developer ไม่ต้องไปใช้เวลายุ่งกับ legacy code พวกนั้น
เขียน Function Call API ที่ Kotlin Multiplatform ที่เดียว สามารถใช้ได้ทั้ง 2 platform เลยไหมครับ, Kotlin มีแบบว่าชี้โค้ดไปที่ Android ที่เดียวแต่ build เป็น iOS Android Web จะมีสักเมื่อไหร่ดีครับ
เมื่อจาก 2 คำถามนี้คล้ายๆกัน จึงมีสไลด์เล็กๆมาให้ดูกัน
ฝั่งหน้าบ้านจะมี iOS Android Web แบ่งทีมไปตาม platform สมมุติมี feature A ซึ่งทุก platform ต้องมี และแต่ละฝั่งก็ทำ business logic เหมือนกันทั้ง 3 platform ถ้ามีการเปลี่ยนแปลงใน business logic นั้นๆก็ต้องแก้หมดทุก platform โดย assign คนลงมาทำ
จะดีกว่าไหมถ้ามี business logic ที่เดียวและสามารถแชร์กันได้ในทุกๆ platform
Kotlin Multiplatform เป็น framework ที่ช่วยครอบโค้ด Kotlin ของเราและเลือก compiler ที่ถูกต้องในแต่ละ platform ให้เรา ตาม Architecture ของ platform นั้น
Kotlin vs Flutter พ่อเดียวกัน ใครลูกเมียหลวง เมียน้อย ถ้าเลือกข้าง ควรใช้หลักอะไรเป็นตัวพิจารณา
Kotlin กับ Flutter ไม่ได้มีพ่อคนเดียวกัน แต่เป็นคนกลุ่มเดียวกันเนอะ
ขึ้นอยู่กับโปรเจกต์ไปทางไหนมากกว่า เช่น Flutter มีข้อดีคือ UI แอพสวย แต่ถ้าเป็น Kotlin Multiplatform เอาไปเสียบกับ iOS กับ Android จะมีหน้าตา UI ไม่เหมือนกันตาม platform อย่างใน Android ก็จะมี support version ที่ทำให้หน้าตาไม่เหมือนกัน แต่ถ้าไม่แคร์เรื่องความสวยงามของ UI ก็เลือก Kotlin ได้ ซึ่งคนตอบมองว่าการเขียน Kotlin สนุกกว่า Dart แม้ Dart จะดีกว่าการเขียน Java ก็ตาม
ถ้าเลือกไม่ได้ว่าจะเอา UI ตาม platform ไหนก็ใช้ควบคู่ด้วยกันได้
การนำ Kotlin Multiplatform กับ Flutter เข้ามาใช้ในโปรเจกต์ที่มีอยู่แล้ว คิดว่าคุ้มมั้ย มี trade off ข้อดี ข้อเสีย อะไรมั่ง เทียบกับการขึ้นโปรเจกต์ใหม่ครับ
ต้องดูสเกลของโปรเจกต์และคนในทีมเห็นด้วยหรือไม่ ต่อให้มันดีแค่ไหนแต่คนในทีมไม่เอาด้วยก็ไม่ work
ถ้าในเรื่องสเกล ในโปรเจกต์ที่มีอยู่แล้ว มองว่าไม่ค่อยคุ้มเท่าไหร่ เพราะว่า Kotlin Multiplatform มันค่อนข้าง setup เยอะในช่วงแรกๆ พอ setup เสร็จแล้วมันจะง่ายไปเลย และมีการจัดการบริหารจัดการ module แบบใหม่ จึงใช้เวลากับมันค่อนข้างมาก ถ้าจะทำจริงๆก็ลองศึกษาดูก่อนว่าเหมาะกับเราหรือกับทีมไหม
ถ้าโปรเจกต์ใหม่ก็ setup และ run ต่อได้เลย
ถ้าเอา Flutter เข้ามา และทำ feature เพิ่ม อาจจะทำเป็น module แยกแล้วเอามาเสียบ
ถ้าเอาเร็ว Flutter เพียวๆก็ตอบโจทย์
ปัญหาคือ seting ยาก จึงไม่แนะนำในการนำโปรเจกต์ที่มีอยู่แล้วมาทำ ควรลองกับโปรเจกต์ใหม่หรือ side project จะดีกว่า
ใช้ Design Pattern ไหนกันบ้าง แล้วแบบไหนเหมาะกับงานประเภทไหน
ทำคล้ายๆ MVVM แต่ละ platform ทำถึงระดับ ViewModel เป็นของตัวเอง แล้ว reject เข้า platform นั้นๆเพื่อใช้ ViewModel เดียวกัน และมี state ที่ ViewModel เพื่อ observe แล้วให้ UI ของ Native อาจจะเป็น Fragment ของ Android หรือ View Controller ของ iOS เพื่อ render UI
พวกของต่างๆ เช่น model, API สามารถเขียนครั้งเดียวและสามารถใช้ได้ทั้ง 2 platform
ใน Flutter มี platform channel ต่อกับ native และ Kotlin Multiplatform
ซึ่งรูปมันคุ้นๆไหมนะ คุ้นมากว่าจากงาน Mobile Conf 2019 นี่นา session แรกเลยอยากรู้เพิ่มเติมสามารถดูได้ที่นี่
หรือขี้เกียจดูจริงๆก็อ่านบล็อกเราจากงาน Mobile Conf 2019 ก็ได้เหมือนกันนะ
ส่วนการเดินทางของทีม Fastwork ในการใช้ Kotlin Multiplatfrom สามารถอ่านคร่าวๆแบบขออนุญาติรวบตึงไปที่
ที่ Fastwork ใช้งานทั้ง Flutter และ Kotlin Multiplatform ใน production อยากรู้ถึง structure แล้วจุดที่ต้องคิดว่าต้อง concern ในการนำมาใช้งาน production จากประสบการณ์ที่เจอกันมา
แนะนำให้เปิดฟังเอาเน้อ รายละเอียดเยอะ จดไม่ไหวจ้า
- จุดที่ concern ที่เจอบ่อยๆคือ Architecture ของ iOS และ Android ในเรื่องของ Lifecycler ที่ไม่เหมือนกัน เช่น ใน Android ก็ต้องลุ้นว่า ViewModel ตายไม่ตายตอนไหน แล้วบางทีจะมีเคสว่า อันนี้เรียกเฉพาะ Android นะ ฝั่ง iOS ยังเห็นอยู่
- pain point เรื่องทำ logic เช่นมี data task นึง ใช้ได้ทั้ง 2 platform แต่ฝั่ง iOS ไม่สวย และมีช่วงนึงที่ generic parameter มองไม่เห็น
- default parameter ฝั่ง Swift เห็นไม่สมบูรณ์
- ยังไม่ support multi-thread เต็มตัว
- ต้อง duplicate model เพื่อให้ Dart ได้รู้จัก ซึ่งมันก็เยอะประมาณนึง (เพิ่มไฟล์ dart interface) เพื่อให้ฝั่ง Flutter รู้จัก
- setup CI ค่อนข้างยุ่งยาก
- ถ้าเจอปัญหาหรือมี issue อะไร จะไปถามใน Slack ทางเราขอแปะลิ้งไว้ด้านล่างเน้อ
Community
Every day there is more and more activity around Kotlin, and we want to help foster and grow the community in any way…kotlinlang.org
ส่วน roadmap ภาษา Kotlin เข้าไปจิ้มดูได้ที่นี่
เมื่อหมดคำถามทางบ้านแล้ว มาต่อด้วยคำถามจากคนในงานบ้างดีกว่า เราขอรวบตึงเท่าที่จดได้แล้วกันเนอะ ขี้เกียจดูไลฟ์ย้อนหลังแล้วง่ะ เดี๋ยวงานเสร็จไม่ทัน
- Kotlin Multiplatform ต่างจาก Kotlin ยังไง : Native Kotlin Native เป็น subset ของ Kotlin Multiplatform ซึ่งจะมี JVM, JS, Native
- เกาะ Kotlin น่าเที่ยวไหม : Kotlin ชื่อมาจากเกาะแห่งหนึ่ง
- Kotlin Multiplatform ใช้แล้วเจอปัญหา platform compatibility เยอะไหม : Kotlin Multiplatform เจอปัญหาบาง library ใช้ไม่ได้ เช่น Retrofit, Fuel, RxJava, OkHttp แต่ทาง Jetbrain มี solution ให้ด้วย ชื่อว่า ktor ช่วยเรื่องในให้ทำ API ได้ทีเดียวเลย ในนั้นมี co-routine ด้วยนะ และก็เรื่อง memory management ที่ฝั่ง iOS ไม่เหมือน Android ถ้าสนใจอยากถามก็ถามทีม Fastwork ได้เลย ฮ่าๆ
- Kotlin Multiplatform สามารถใช้ Kotlin Native ในการช่วยสร้าง share UI ได้มั้ย หรือมีวิธีอื่นมั้ยในการสร้าง UI ที่ใช้ร่วมกันได้ : สำหรับ Kotlin Native สามารถเขียน UI iOS ได้ด้วย code มี library platform API ให้ใช้อยู่ / เรื่อง share UI คิดว่าไม่ได้แต่ก็คุ้นๆอยู่ว่ามีคนทำ และยังไม่เป็นที่นิยม และคนยังไม่ค่อยรู้ ถ้าอยากแชร์ใช้ Flutter ดีกว่า
- Build นานไหมครัช : build นานไหม ฝั่ง Android จะมี gradle ติดมาอยู่แล้ว เท่าที่เราจดทัน clean build 2–3 นาที ส่วนฝั่ง iOS จะใช้เวลานานกว่า เพราะเป็น framework ตัวนึง ถ้า build แบบ debug ไม่นานมาก ส่วน release 8–10 นาที
- สมมุติว่าเราเป็น Android Developer ถ้าเราจะเริ่มทำ Kotlin Multiplatform ต้องรู้อะไรเกี่ยวกับ iOS บ้าง : อันนี้เด็ดจริง คำถามจากคุณบ้านวิวนะฮะ ถ้า Android Developer ทำ Multiplatform อาจจะไม่ต้องรู้เกี่ยวกับ iOS มากขนาดนั้น และทีมควรมี expert iOS สักคนนึง เวลาเจอ bad access หรืออะไรแปลกๆที่ Android Developer ไม่เคยเจอ จะมี iOS Developer ช่วยดูช่วยแก้ให้ ที่ควรต้องรู้จริงๆคือเรื่อง Memory Management ต้องรู้ลึกและรู้จักวิธีการ และการจัดการ queue และ thread ต่างๆ แล้วก็คำว่า descpirtion ด้วยต้องระวัง
- ปัญหาที่เคยเจอ ที่ยากที่สุดหรือติดปัญหายาวนานที่สุดของการทำ Kotlin Multiplatform คืออะไร : ปัญหาที่ยากสุด คือ setup project ใช้แล้วทำไมไม่เหมือนใน document ที่อ่านมาเลยนะ และปัญหายากสุด คือ การเอา Flutter มาใส่แอพที่มีอยู่แล้ว ตอนสมัยที่ยังเป็น preview อยู่
- Manager source code ยังๆง เพราะมันน่าจะต้องมร code ที่ทำงานได้เฉพาะ platform ปนอยู่แน่ๆ : การจัดการ source code จะแบ่งตาม folder แยกแต่ละ platform สำหรับหน้าบ้าน ถ้าหลังบ้านจะมีส่วน data layer ว่า map กับ logic ยังไง
- Kotlin Functional Reactive น่าสนใจไหม : น่าสนใจน้อยลง เพราะ Kotlin มี co-routine ทำ frequency parallel ให้อยู่แล้ว
- โดน Break Change จาก Android/iOS ในเวอร์ชั่นใหม่ๆบ้างไหม : โดนของบางอย่างที่ delicate ออกไปแล้ว
- Koin Multiplatform support iOS ด้วยไหมครับ : ยังไม่ support iOS (อ่านแล้วอย่างงนะ เขาถาม Koin ไม่ใช่ Kotlin เน้อ)
- เข้าใจว่าตอนนี้มันต้องไปแยก module ของ iOS แล้วสร้าง xcode project ข้างใน แล้วแบบนี้แยก git repository แบบไหนสะดวกสุดครับ : git repo รวมกันสะดวกกว่า เพราะทีมคนไม่เยอะ (จากงาน Android Developer Meetup 1.0 พี่เบิร์ดเล่าว่าทีมมี 4 คน ก็คือ speaker วันนี้บวกกับ iOS คนนึง) ตอนแรกเคยแยก sub-module ออกมาก็ตาม แต่สุดท้ายก็รวมกัน ทำให้ทำ CI ง่ายขึ้น
- Developer Experience ดีไหมสำหรับการใช้ Kotlin Multiplatform : สำหรับ developer จะได้ความสนุกและความท้าทาย แต่ก็ขึ้นอยู่กับทีมว่าเขาสนุกด้วยไหม ฮ่าๆ
- เป็นไปได้มั้ยที่ในอนาคตจะเขียน Kotlin ใน Fliutter แทน Dart : ยังไม่มีความเป็นไปได้หรือความชัดเจนมากๆในเรื่องเขียน Kotlin แทน Dart ใน Flutter
- ถ้าใช้ Multiplatform ไม่จำเป็นต้องใช้ Native UI ใช้ของ Flutter ก็ได้
- Android Architecture work กับ Kotlin ไหม : Android Architecture มันจะ work กับ Kotlin บางส่วน ดีสุดคือ ViewModel
- มีตัวไหนที่เป็นคู่แข่ง Kotlin Multiplatform แบบศูสีกันบ้าง : Flutter, C++
- ถ้าเทียบ effort การ dev native ล้วน 2 platforms กับการใช้ Kotlin Multiplatform สามารถลดเวลาในการ dev ลดลงได้ประมาณกี่เปบ์เซนต์ครับ : effort Native กับ Multiplatform : ลดได้ 200% เหลือ 150% หลัง setup
- ถ้าอยากเริ่มต้น shate code บางอย่าง เช่น Analytics Lib กับโปรเจกต์ที่มีอยู่แล้ว ซึ่งโปรเจกต์ใหญ่มาก แทนที่จะรวม code ไว้ที่เดียวกัน ทำเป็น lib แทน จะเริ่มต้นยังไงดี : เมื่อจะ share code บางอย่างกัน สามารถใช้ Multiplatform ครอบได้เลย
- ในการติดต่อ hardware สามารถทำที่ common code ได้ไหม เช่น nfc reader : ข้อจำกัดคือ ติดต่อ hardwate ไม่ได้ และ common code อาจจะไม่รู้จัก platform ใดๆ ต้องดูตัว support
- Performance (speed, รองรับ traffic) ระหว่าง Flutter กับ Kotlin Multiplatform อันไหนดีกว่ากัน สำหรับ web backend : performance สำหรับ web backend ถ้าทำ server service ใช้ Kotlin จะตอบโจทย์กว่า
Closing Remark and Networking
คร่าวๆก็จะมีแจกของรางวัลคนถามคำถามได้ถูกใจ 3 ท่าน และจากที่ลงทะเบียนใน QR Code 1 ท่าน
จากนั้นเขาพาไปที่ร้านอาหารหลังตึกเพื่อทำกิจกรรม Networking ซึ่งทางนี้ง่วงมาก กลับบ้านก่อนเดี๋ยวหลับ 5555555555 จึงขอจบบล็อกตรงนี้เลยแล้วกันนะ
ปล. ข้อเสียของงานนี้คือจัดไกลไปหน่อย ไปกลับเป็นชั่วโมงรวมเป็นสองชั่วโมงเลยจ้า ฮือออออ
สุดท้ายฝากร้านกันสักนิด ฝากเพจด้วยนะจ๊ะ