กลับมาอีกครั้งในรอบ 4 ปี กับ Kotlin Meetup 2024.1
เรียกได้ว่าเป็น dev event meetup แบบด่วน ๆ อาทิตย์ก่อนประกาศดึก ๆ วันพฤหัส ไม่ถึง 24 ชั่วโมงบัตรหมดแล้ว คนมากันล้มหลามมาก กับหัวข้อ Kotlin Multiplatform in Production
รอบนี้จัดที่ Fastwork ซึ่งก็เป็นสถานที่เดียวกันกับ Kotlin Meetup 2019.1 ที่ไม่นับเลข version ของ Kotlin ห้อยท้ายเป็นครั้งแรก ก็ 5 ปีมาแล้วเนอะ
ก่อนงานเริ่มมากินพิซซ่ากันก่อน พร้อมนํ้าอัดลมเย็น ๆ ข้างนอกมีฝนนิดหน่อยไม่มาก
Opening Remark from Fastwork
เป็น session ที่แนะนำ sponsor ในงานอย่าง Fastwork ที่ให้สถานที่จัดงาน และอาหารต่าง ๆ อย่างพิซซ่า และนํ้าอัดลม
Fastwork เป็น freelance marketplace ชั้นนำ มีมากกว่า 120+ บริการด้วยกัน
ให้บริการใน 3 ประเทศด้วยกัน คือ ไทย อินโดนีเซีย และเวียดนาม
เป็น freelance hub ที่ user เข้ามาหา freelance ได้ง่ายขึ้น ซึ่งเดฟแบบเรา ๆ ก็หางานในนั้นได้นะ เว็บเน้น SEO ให้คนหางานได้ง่ายขึ้นด้วย และยังมี feature ใหม่ ประกาศคนหางานอีกด้วย
ในส่วน end to end เขาทำแบบรวมทุกอย่างในที่เดียว มีแชทคุยกัน แล้วก็มีการโทรหากันในระบบ และออกเอกสารต่าง ๆ ที่เกี่ยวข้องกับการจ้างงาน freelance อีกด้วย
และมี partner การันตีว่าจ่ายจริง Fastwork การันตีว่า freelance ได้เงิน และคนจ้างงานได้งานแน่นอน
และแน่นอนถ้าเดฟคนไหนอยากเปลี่ยนงาน Fastwork ก็มีตำแหน่งงานว่างอยู่นะ หรือถ้าอยากหางานเสริม ก็เข้ามาเป็น freelance ในระบบได้จ้า
Panel Discussion: Kotlin Multiplatform in Production
ในที่นี้เราย่อ Kotlin Multiplatform เป็น kmp นะ
ถ้าบางส่วนอ่านแล้วงง ๆ ต้องขออภัยด้วย
ทางนี้พยายามทำให้อ่านเข้าใจง่ายที่สุดล่ะ
แชร์ประสบการณ์เอาขึ้น production ยันตอนนี้ แล้วตอนนั้นและตอนนี้ต่างกันยังไง?
ในตอนนั้นก็ 4 ปีมาแล้วเนอะ ดู poster สิ
อันนี้บล็อกงานในตอนนั้น
ก่อนอื่นแนะนำ speaker กันก่อน
- Verachad Wongsawangtham หรือพี่เบิร์ด ตอนนี้ยังอยู่ที่ Fastwork
- Travis Subannaphong หรือพี หลาย ๆ คนคงจะเห็น content ของเขาไม่มากก็น้อย กับเรื่องมิตรที่ทำงานของเขา และยังเป็นผู้เชี่ยวชาญ Clean Architecture อีกด้วย แถมงานนี้เขาได้บินตรงจากญี่ปุ่นมาด้วย
- Tipatai Puthanukunkit หรือจู ตอนนี้อยู่ MuvMi
ปัจจุบันมีพีคนเดียวที่ยังทำ kmp ส่วนพี่เบิร์ดและจู ทำ Flutter
Q1: ถ้าเราเริ่มทำ kmp ควรเริ่มจากตรงไหนดี?
- ก่อนอื่นเราต้องรู้ก่อนว่า Kotlin Multiplatform หรือ kmp คืออะไร ทำความเข้าใจ และเราจะใช้ kmp กี่ layer (data, domain หรือ share กับ view model ด้วย)
- ถ้าเป็น financial app ที่พีทำอยู่ (บอกว่าเป็นแอพคล้าย TrueMoney ในประเทศนั้น) อาจจะทำ data layer แล้ว export repository ไปให้ iOS และ Android ใช้
- ตัว Viewmodel ให้ UI เป็นคน call ให้ kmp เขียน และ inject ทำได้ เมื่อใกล้ชิดกับ iOS มาก ๆ และขึ้นโปรเจคพร้อมกัน เพื่อความง่ายในความเหมือนกัน เน้น usecase และ business logic
- คุยในทีมก่อนว่าแต่ละทีม แต่ละคน เขียนโค้ดกันในแนวทางไหน ยังไง แล้วค่อยคุยเรื่อง structure ต่อ
Q2:
sorry ถ่ายรูปคำถามมาไม่ทัน อ่านแล้วประมวณผลไม่ทัน อิ้งล้วนเลย555
- ปัจจุบันมี Compose Multiplatform share กับ iOS ด้วย ใด ๆ คือขึ้นอยู่กับทีมแหลพ
- และถ้าย้อนกลับไปได้ อยากแชรึถึง layer ไหนกัน? ตอนนั้นไม่มี Compose Multiplatform เลยไม่มี UI ดังนั้นใช้ถึง presentation ลงมา ตอนนั้นที่เลือก kmp เพราะเรื่องของเวลาเวลา ขึ้นแอพให้ได้ใน 4 เดือน กับคน 3 คน และต้องได้แอพ iOS และ Android ออกมา
Q3: การใช้ hardware ในเครื่อง เหมือนเราเขียนฝั่ง native ปกติ ไหมนะ?
กล่าวถึงการ access hardware
- kmp ไม่ต่อ 3rd party เพราะการทำ hardware sdk ไม่ได้ทำง่าย วิธีคือ ประกาศ Kotlin แล้วประกาศ option ให้เอาไปใช้ต่อ
- Check thread-safe and memory
- ดังนั้นทำอันที่มั่นใจใน Native แล้วส่งไปให้ kmp จะดีกว่า
- Native → kmp: กล้อง stream bite array คอขวดไหม? ส่งเข้าออกไม่มีปัญหา และ iOS Android kmp รู้จักกัน แต่ยังไม่เคยเห็นถึงขั้นนั้น
Q4: พอใช้ KMP แล้วมีของที่ต้องลง ไปเขียน Low Level เพื่อต่อกับ KMP อีกทีมั้ย ยกตัวอย่างการ ทำงานที่ว่าด้วยก็ดีนะ
- มีเคสต่อ low level เอง ต่อ data layer ไป network ด้วย Ktor
- iOS ใช้ Darwin ขึ้นมา 5 ปีแล้ว ตอนนี้มี Darwin และ legacy Darwin ปกติสุขดีจนมาต่อ web socket ไม่ support เลยเปลี่ยน legacy แต่ตัว legacy ติด infinity loop ตรง multi part ทำให้ใช้ไม่ได้ ทำให้ต่อ แล้วห่อ เรียก web socket เอง
- SDK ทั้งหลาย support โดยตรงน้อยมาก ขนาด Firebase ยังต้องห่อเอง (ดูเศร้าเนอะ)
Q5: อยากให้เล่าปัญหาที่พบ, ความเจ็บปวด, Native specific issue ที่ ต้องจัดการ หรือ Concern ต่าง ๆ หากอยากนำ KMP ไปใช้
- เมื่อ 4-5 ปีที่แล้ว documents ไม่ดีเท่าปัจจุบัน งงว่าอะไรคืออะไร แล้วต้องบิ้ว kmp ให้ iOS ใช้ เปิด Xcode ซึ่งก็ตามสภาพ
- เมื่อก่อนเขียน kotlin ทำ MVVM ใช้ lambda แต่รันบน iOS แล้ว crash แก้โดย var บน callback ตอนนี้ไม่มีถือ lambda แล้วไม่รู้จักแล้วนะ
- Network, Coroutines, thread-safe ทำกันเอง ตอนนี้ดีขึ้นจากตอนนั้นถ้าดูจาก document มีตัวช่วยประมาณนึง แต่ก็มี limitation อย่าง freeze ของข้าม thread ดังนั้น freeze เองก่อนส่งข้าม thread จะ mutate ใด ๆ ไม่ได้
- kmp Objective-C limitation ตัวเอง ไม่ได้สนับสนุน generic type, seal data และ enum ถูกเจนเป็น class โง่ๆ, data class equal เหล่านี้เป็น Swift stuck และก็อะไรที่เอื้อความง่ายความสบาย มันจะหายไป
Q6: เล่าประสบการณ์ในการ debug issue บน iOS ให้ฟัง หน่อย
- Debug บน iOS ยากมาก สมัยนั้นไม่มี line บอก บอกว่า class ประมาณนี้ เลยดูว่า crash เกิดจากอะไรบ้างแล้วไล่กลับมา
- จริง ๆ แล้วมันดีขึ้นด้วยตัวมันเอง มีการใช้ library ช่วยของ Touchlab ที่สนับสนุน kmp แต่แรก crash ios สักอย่าง (เท่าที่ค้นน่าจะเป็น Kermit ไหมนะ) แล้วตัว logging สามารถ integrate กับทุก platform ได้ดี เช่น Android ขึ้น logcat, ios สามารถ filter ได้
Q7: จะ convince ให้ทีมกับ management อย่างไรเพื่อมาใช้ KMP เพื่อแชร์โค้ดบางส่วนระหว่าง Android กับ iOS ในโปรเจคที่มีอยู่แล้ว
- ศึกษาและตัดสินใจคร่าว ๆ ว่าใช้ได้กี่ layer แล้วเอาไปขายดี พร้อมข้อดี พร้อมกับมี option ได้ว่าแชร์ยังไง แต่ละแบบเพิ่ม speed ได้แค่ไหน
- ความโชคดีคือเริ่ม project ใหม่ เลยคุยง่าย ยังไม่ได้เปลี่ยน stack
- top level manager มองหา quality ของงาน และทำตาม timeline ได้ไหม แตก timeline ออกมา ว่าจะทำอะไร ใช้คนเท่าไหร่ ระหว่าง native กับ kmp
- Nature ของทีม strong kotlin แล้วทำให้ iOS ไม่ฝืนมาก ให้เขาสบายใจที่สุด แล้วอันไหนเหมาะสมกับทีม
Q8: ถ้ามีการเขียน logic คนทำ ios หรือ android จะแบ่งงานกันยังไง?
- Onboard เรื่อง syntax ให้เขารู้สึกเขียนได้ง่าย ทำ pair programing ความต่าง จะต่างที่ memory ในส่วน syntax จะคล้ายอยู่ ถ้าได้ใช้เขาอาจจะติดใจ
- UI ต่างคนต่างทำ ส่วน ViewModel มีคนทำ 1 คน หรือแบ่ง layer กันทำก็ได้
- คนเป็น iOS Developer ใช้ kmp แล้วเขาชอบอะไร? อย่างทีมของพีมี iOS 2 Android 6 บางอย่าง kotlin มี swift ไม่มี ไม่แชร์โค้ดด้วย inheritance (video gucode ตอน scoping function แต่ใด ๆ คือหาไม่เจอ) และมี swift feature ที่อยากใช้ สร้าง protocol แล้ว conform ได้ (ใน Rust มี) แรก ๆ workload ไม่ balance ต้องช่วยกันทำ แก้โดยมีทีม delicate มาเลย ถ้าเป็นทีมเล็กแบ่งคน เช่น front-end back-end ในทีมใหญ่มีคนรับผิดชอบโดยเฉพาะ
- การ setup onboarding ใช้เวลาค่อนข้างเยอะ
- ได้ยินด้านเจ็บปวดแล้ว มีด้านดีไหม? Logic เหมือนกัน แต่บางอย่างมีข้อควรระวัง เป็น edge case, ทำคนเดียวได้ 2 platform มีอะไรต้องแก้ spend dev 1 คนแทนที่เป็น 2 คน, community ไปในทิศทางไหน ช่วยให้เราทำงานได้ง่ายขึ้น, ตัดสินใจว่าเราจะแชร์กี่ layer ถ้าพัง ถอย logic แล้วกลับมาทำ UI เดิมได้
- kmp ขายง่ายสุด เพราะไม่ต้องเสียเวลาเรียนใหม่ ตัดเรื่องภาษาออกไป
- ถ้า iOS ที่ถนัด swift มาเขียน Objective-C: ให้เขา focus งานแค่บางส่วน มีการ generate บางส่วนให้ ใช้ kmp swift multi-opt หรือ Touchlab SKIE (อ่านว่า sky นะ) เช่น ทำ absorptive enum ให้ เมื่อก่อนเสียเงิน ตอนนี้ open source
Q9: KMP พร้อมสำหรับ Production รึยัง? Stable แค่ไหนแล้ว?
- พร้อมบน production ทั้งหมดแล้ว เราจะ adopt อะไรเข้า kmp
- ลอง test ว่า available กับทีมเราไหม พี่เบิร์ดตอบว่าตอนนั้นได้ทีมมี passion เหมือนกัน มีพี มีจู เลยไปด้วยกันได้
- แน่นอนว่าคำตอบกล่าวถึง kmp ไม่รวม compose multiplatform ที่เพิ่งมาใหม่
Q10: ประสบการณ์หลังจากใช้ งานจริง สามารถลดเวลา development ได้ไหม
- ในเคส Fastwork คือ ได้! ใน 4 เดือน มีเวลาเทสเต็มที่
- สิ่งที่ต้องคำนึง คือ แล้วเราแชร์กันขนาดไหนใน layer นั้น ๆ ได้
- ในเคสของพี ได้มั้ง ขึ้นอยู่กับทีม บางคนมองเราเป็น 3rd-party ทั้ง ๆ เราน่าจะเป็น 1st-party โดนบอกให้ห่อทุกอย่าง mapper repo ใด ๆ caching สุดท้ายลดเวลาด้วย code generator เป็น plug-in บน Android studio
Q11: คิดยังไงกับ Compose Multiplatform (mobile, web, desktop)
แน่นอนคนที่ตอบได้ คือคนที่ลองมาแล้ว อย่างพี่เอก ที่ไปลอง conpose multiplatform มา 4 เดือน
- ทำ desktop app ไม่ต้องเขียน JavaScript (js) แล้ว pod ไปบนที่ต่าง ๆ ข้อดีคือ native (คือมัน compile เป็น native)
- compose ไม่ render UI แต่ละ platform เจ้าพ่อคือ canvas ซึ่งเป็นข้อจำกัดบนเว็บที่มี tag เดียว และยังมีข้อจำกัดบางอย่าง
- เขียน animation ดีมาก บนเว็บ require WebAssembly (WASM) size 4MB ชาวเว็บไม่ happy แล้วโหลดช้าด้วย เลยกลับไป native web
- สำหรับ web ไม่เชียร์บน prod เพราะยังมีข้อจำกัดอยู่ ส่วน desktop พอได้อยู่
Kotlin เห็น code Objective-C บางเคสอาจจะห่อด้วย view ของฝั่ง Native เอง
Q13: Compose Multiplatforms Flutter (จะฆ่า flutter ได้ไหม)
ก่อนอื่นเราจะบรีฟสั้น ๆ ก่อนว่า ทีม Flutter กับ Android เป็นคนละทีมกัน ถึงแม้อยู่ภายใต้บอเดียวกัน ดังนั้นคำถามแนวนี้ก็จะมาตลอดอยู่ล่ะ
มีถามด้วยว่าใครจะชนะ ระหว่าง kmp กับ Flutter นี่ที่ไม่ยกเพราะคิดว่ายังแบ่บไม่ได้ชนะขาดขนาดนั้นอ่ะ
- Flutter หา position ตัวเองได้ ส่วน kmp ต้องหา position ว่าจะแทนที่อะไร ถึงวางตัวได้อาจจะไม่ได้ฆ่ากันจริง ๆ ขนาดนั้น
- ถ้าขึ้น product ใหม่ ขึ้นด้วย Flutter ง่ายสุด
- kmp อาจจะมี learning curve ที่สูง ตัว library ก็กระจัดกระจาย ไม่มีศูนย์กลางที่รวม library อย่าง pub.dev แบบ Flutter และยังไม่มั่งคงแบบที่ทางการอัพเดต ในส่วนของ UI Flutter มี ecosystem ดีกว่า kmp แถมในฝั่งของ kmp ต้องดูว่า lib support ไหม อาจจะไม่ทุก platform ใด ๆ คือ kmp flutter dart มีหลาย ๆ อย่างที่ pain อยู่ เพราะ kotlin ทำงานสะดวกกว่า
- บางอย่างบน Dart ยังไม่มีให้ เช่น data class
Q and A
- พี่เอก มองว่า Flutter ค่อนข้างเป็นกลาง ส่วน Compose Multiplatform ค่อนข้าง biias กับ Android เยอะมาก เช่น data store, viewmodel ซึ่งเจ้า Compose Multiplatform ทำงานแยกกัน เจอ issue ที่ platform ไหน แจ้งบัคที่อันนั้น มีความ bias
- ใน 4 เดือนนั้นมี Flutter เป็นตัวเลือก (สามารถอ่านเพิ่มจากบทสัมภาษณ์กับ jetbrain) blocker ในตอนนั้นคือเรื่องภาษาไทย ในส่วน logic ฝั่ง Android มี interface swift ให้ iOS ใช้ด้วย
บทสัมภาษณ์ของทาง Fastwork ในตอนนั้น
และคลิปที่พีเคยเป็น speaker พูดเรื่อง Flutter
- มีคำถามจาก iOS dev ฟังแล้วงง ๆ นิดหน่อย พอดีเป็น Android dev 555 เป็นไปได้อย่าใช้ Swift package manager (SPM)
ในงานก็เพิ่งรู้ว่า ฝั่ง iOS เป็น Objective-C แหะ ก็ว่าทำไมฝั่งนั้นมัน pain เพราะตัว Swift อ่ะมันคล้าย Kotlin ไง
Closing Remark and Networking
ก่อนงานเริ่มมีให้กินพิซซ่ากันก่อนล่ะ แต่ทางนี้คือไปหมํ่า ๆ กู้ดบอย ขนมงาน Binance TH มาแหละ ซึ่งจริง ๆ เป็นงานเกี่ยวกับการลงทุนแหละ (ถ้าฝั่ง crypto ที่เป็น dev ก็มีงานของ Bitkub ที่จัดชนตี้เคนชินของพี่เอก เลยไม่ไปทั้งสองงานเลย555)
มางาน #BinanceTHBULLiever แปปนึงคนับ pic.twitter.com/8CGaNpQQxY
— Minseo ⚡ (@mikkipastel) July 24, 2024
ก่อนจบงานถ่ายภาพที่ระลึก
รอบหน้าจะมีงาน meetup อีกเมื่อไหร่ไม่รู้ รู้แต่พี่เบิร์ดตามหา speaker หน้าใหม่ประดับวงการเราในรอบถัดไปนะ
ส่วนสตาฟในงาน พี่เอกงงเหมือนนี่เลย คือตอนมาเจอไม้เอกข้างล่างตรงทางเข้าตึก เข้าไปเจอแอน scan ticket ซึ่งทางงานไม่ได้ประกาศหาสตาฟเลย อันนี้เรื่อง connection ล้วน ๆ และมีการหาสตาฟที่งานตี้เคนชินของพี่เอกด้วยล่ะ
ในงานได้พบเจอหลากหลายบุคคลด้วยกัน นอกจากบุคคลที่ได้กล่าวไปเมื่อกี้ อย่างไม้เอก แอน speaker ทั้งสาม พี่เอก แล้ว ยังเจอพี่หนุ่ม (ตอนแรกดูว่าต่อ WiFi อะไรได้บ้าง เอ๊ะเห็นชื่อ narze เอ๋พี่เขามาหรอ555 แล้วสรุปมาจีง) ที่มากับวี แล้วก็พี่เบ็บ น้องโอ้ต เจ้าแบม ประมาณเน้ ช่วง networking คือรวมตัวเดฟที่ไม่ได้เจอกันมานานของแทร่ 🤣
บรรยากาศงานรวม ๆ เราทำคลิป short-form ออกมา ดูได้จากบนเพจ (embedded reel ไม่ได้ งงมาก) และบน TikTok ได้เลย
@mikkipastel เมื่อคืนฝั่ง developer มีงาน Kotlin Meetup 2024.1 กับหัวข้อ Kotlin Multiplatform (kmp) in Production ที่ Fastwork กัน โดยแก๊งค์ 3 ช่า พี่เบิร์ด พี จู ผู้นำแอพ Fastwork ที่เป็น kmp ขึ้น production มาแล้ว และจากตอนนั้นในตอนนี้มีอะไรที่อัพเดตขึ้นด้วยนะ มาดูบรรยากาศงานกัน #CapCut #kotlin #kotlinmultiplatform #fastwork #developer ♬ Everyday songs with a warm and cute atmosphere(1383581) - Sumochi
แล้วก็บนเพจจริง ๆ ส่ง star ได้นะ แต่ส่งได้ในโพสที่เป็น reel และใน comment ของบางโพสเลย หรืออีกวิธีที่ง่ายกว่านั้นก็คือ engage post บนเพจเรา ทำให้เราได้ค่าขนมจาก Facebook ได้นะ ถ้า engage เดือนนั้นดี ๆ เราก็ได้ค่าตี๋น้อยมา
ส่วนเรื่องเกี่ยวกับคริปโตอาจจะมีคนงง ๆ อยู่ ว่าไปทำอะไรในวงการนั้น เดี๋ยวเล่าให้ฟังทีหลังเนอะ เพราะเรื่องมันยาวววววววววมากกกกกกกกกก
สำหรับบล็อกนี้ก็ประมาณนี้แหละ
ติดตามข่าวสารตามช่องทางต่าง ๆ และทุกช่องทางโดเนทกันไว้ที่นี่เลย แนะนำให้ใช้ tipme เน้อ ผ่าน promptpay ได้เต็มไม่หักจ้า
ติดตามข่าวสารแบบไว ๆ มาที่ Twitter เลย บางอย่างไม่มีในบล็อก และหน้าเพจนะ