บันทึกการย้าย SDK ที่เป็น Java ไป Kotlin ของทีม MapBox

Minseo Chayabanjonglerd
Black Lens
Published in
5 min readApr 12, 2020

--

พอดีว่างๆเบื่อๆเลยเอามาสรุปหน่อยแล้วกันเนอะ อันนี้พี่เอกแชร์มาให้นักเขียนแว่นดำเอาไปอ่านกัน

เนื่องจากเราผ่านจุดที่เปลี่ยนแปลง Android Project ของเราจาก Java มา Kotlin ได้มาสักสองปีแล้ว แต่บางที่พบว่ามันมีความยากอยู่ที่จะเปลี่ยนทั้งโปรเจกมาเป็น Kotlin ทั้งหมด เนื่องด้วยอะไรหลายๆอย่างตามแต่ปัจจัยของทีมและองค์กร เลยคิดว่าการนำสไลด์เขามาสรุปน่าจะสร้างแรงบันดาลใจ (จริงๆไม่ชอบคำว่าสร้างแรงบันดาลใจเท่าไหร่เลยแหะ) ในกับชาว Android Developer ที่อยากมูฟออนจาก Java มา Kotlin

https://speakerdeck.com/guardiola31337/our-journey-from-java-to-kotlin-first

ซึ่งที่นำมาสรุปในบล็อกนี้นั้น นำมาจาก session ที่ชื่อว่า “Our Journey from Java to Kotlin-first!” ของ Pablo Guardiola, Software Engineer @ MapBox ในงาน Droidcon Madrid ในวันที่ 20 ธันวาคม 2019

จริงๆงานนี้ก็มีคนเขียนข่าวเกี่ยวกับงานนี้ด้วยนะเออ อุตส่าห์ค้นเจอด้วยความสงสัย ว่ามีคนเขียนบล็อกสรุปงานไหมน้าาาา ฮ่าๆ

ก่อนอื่นมาทำความรู้จักกับ MapBox กันก่อน

MapBox เป็นบริษัทที่ทำ SDK สำหรับแผนที่ การนำทางต่างๆ และมีข้อมูลแบบ Real-Time เกี่ยวกับการจราจรด้วยนะเออ

ที่เจ๋งๆก็มีการนำทางด้วย AR เช่น ขับไปร้านอาหารร้านนี้ มันก็ขีดเส้นเลยว่าไปทางไหน ใกล้ถึงหรือยัง และเขาทำ Image Processing อีกด้วยนะ

และทำเป็น SDK ให้ Mobile Developer อย่างเราได้นำไปใช้ด้วย

การเดินทางจาก Java ไปยัง Kotlin ด้วยหยาดเหงื่อและนํ้าตา

อ่านจากใน description ล้วนๆเลย ฮ่าๆ ซึ่งข้อมูลที่เราได้มาเพิ่มเติมก่อนอ่านสไลด์ของเขาคือ เขาทำ Mapbox Navigation SDK for Android from 0.x Java to 1.0

ซึ่งในที่นี้เขาจะเปลี่ยน SDK ที่เขียนด้วย Java มาเป็น Kotlin นั่นแหละ

แล้วทำไมถึงทำหล่ะ?

ด้วยความที่ Google เขาได้ประกาศว่าภาษา Kotlin จะเป็น first citizen หรืออาจจะเรียกสั้นๆว่า kotlin-first ก็คือมีอะไรใหม่ๆเราจะ support ภาษา Kotlin ก่อนนะสำหรับ Android ซึ่งแน่นอนว่า ใครอยากจะตกขบวนรถไฟ เอ้ยยย ตกเทรน หล่ะเนอะ ทุกคนก็อยากเล่นของใหม่ๆกันทั้งแหละ

และแน่นอนว่าภาษา Kotlin นั้น ดูคลีนกว่า Java เป็นไหนๆ จากโค้ดที่ดูจะไม่ยาวแต่ยาวก็สั้นลง ใครใช้ก็ติดใจจนป้ายยาคนอื่นให้มาลองใช้กันทุกคน จริงม่ะ

ตอนที่ 1 : Kotlin

เมื่อเปลี่ยนมาใช้ Kotlin พบว่า มีการเพิ่มขนาดของ apk เพียง 380 kb และมีการเพิ่ม method ทั้งสิ้น 6,000 methods แต่ได้ชีวิตที่ดีขึ้นของหลายๆฝ่าย เช่น

developer ที่ชีวิตการ Coding ดีขึ้นแบบเห็นๆ ไม่ว่าจะเป็นเรื่องของ type ต่างๆ ที่เราไม่ต้องประกาศประเภทตัวแปรทุกตัวแปร เพียงแค่มี val กับ var เท่านั้น เรื่องของ functional และมีความเป็น OOP อยู่ รวมไปถึงแก้ pain point ที่ crash ทีสะดุ้งทีอย่าง null ก็สามารถ safe มันได้มากขึ้นว่าถ้า null แล้วจะจัดการอย่างไรต่อ

client หรือ user อันนี้เราคิดว่าน่าจะหมายถึง developer ที่ใช้ product นี้ต่อนะ คือชาว Android Developer เขียน Kotlin กันหมดแล้ว ดังนั้นมันก็ดีกว่าสำหรับคนเอาไปใช้ SDK ต่อ จากประโยชน์ที่ได้จากฝั่ง developer ก็เลยสะท้อนมายัง client ด้วยเช่นกัน ที่โค้ดมีความทันสมัยมากขึ้น มีความปลอดภัยมากขึ้น อย่างน้อยๆก็เรื่อง null เนอะ ไม่ต้องจัดการอะไรเยอะแยะเท่าตัวที่เป็น Java และมีขนาดที่เล็กลงด้วยนะ

เมื่อเดือนธันวาคม ปี 2017 นั้น ทาง Realm ได้ปล่อย SDK library ออกมา และมี code sample เป็น Kotlin ด้วยนะ

จากนั้นเขาก็กล่าวถึงบล็อกนี้

สถิติที่ยกมาให้ดูน้าน แน่นอนว่า Kotlin ชาว Android Developer นำไปใช้มากที่สุด และเขาบอกว่า 30.5% เอามาเขียน SDK หรือ library ด้วยหล่ะ ตามตัวเลขน้อยกว่าเอาไปทำฝั่งหลังบ้านนิดนึง

และใช้ extension functions ต่างๆถึง 77% เลยทีเดียว แต่จากกราฟในสไลด์ที่หนึ่งเลยคือ null safety หล่ะนะ

ส่วนของปี 2019 เราเองก็เจอของ Jetbrains มา เลยมาแปะให้ดูกัน

ในปี 2018 นั้น Okio 2 ได้ออก library ที่ support Kotlin ด้วยนะ

แล้วคุณ speaker เขาก็ reply ถามด้วยนะ เรื่องขนาด แต่ทางนี้หาทวิตต้นทางไม่เจอ เลยแปะรูปแบบนี้ไปก่อนแล้วกันนะ

เจ้า 7KiB ที่เพิ่มมานั้น คือเจ้า stdlib ที่ใส่เจ้า shrinker มาแล้วว

พอเขาพิจารณาแล้วว่า เอ้อออ มันโอเคนะ คุ้มที่จะเปลี่ยนเป็น Kotlin ทีมเลยตัดสินใจที่จะเปลี่ยนเป็น Kotlin โดยทำเป็น beta version ก่อน จากคำในสไลด์ว่า young และ excitement พอจะเดาได้ว่า น่ายังเพิ่งเคยเขียน Kotlin แบบครั้งยิ่งใหญ่สุดตื่นเต้นก็รอบนี้แหละนะ (และไม่กล้าอนุมานไปว่าแบบ Kotlin first time กันหรือไม่) แล้วเขาจะทำ client app เป็น Kotlin อีกด้วย

ซึ่งเขาคงแพลนมาแล้วว่าต้องทำอะไรบ้าง (นี่ขอมโน เขาอาจจะแบ่งเป็น sprint ก็ได้นะ) และเส้นตายของทีมเขาคือ เดือนกันยายน 2019 จะทำได้ไหม ทำได้หรือเปล่า (นี่คิดว่าไม่ทันเสร็จทันทั้งหมด)

แน่นอนว่ามีการชั่งนํ้าหนักดูก่อนว่าอะไรคือข้อดีและข้อเสีย ซึ่งทางนี้อ่านแล้วยังมีความงงๆว่าถูกบริบทไหมนะ แต่คิดว่าไม่ใช่ว่าอะไรได้ไม่ได้มากกว่า

ข้อเสียหรอ?

  • stdlib ทำให้ขนาดของ binary เพิ่ม เราว่า 7KiB ก็ไม่น่าซีเรียสมากขนาดนั้นนะ
  • Kotlin version บางรุ่นยังเข้ากันไม่ได้ อันนี้แอบงงๆ หรืออาจจะเป็นเรื่อง feature ใน Kotlin มั้งนะ
  • คนที่ใช้ SDK ที่เขียน Java เขาต้องปรับตัวเยอะไหมน้าาาา มันจะเฟรนลี่ในการใช้กับเขาไหมนะ

แล้วข้อดีหล่ะ?

  • แน่นอนว่า Google support Kotlin อย่างสุดพลังสำหรับชาว Android
  • มี productivity ที่ดีย์
  • Java version ใหม่ๆที่ออกมาทำงานยังช้าอยู่
  • support OkHttp version ใหม่ๆ แน่นอนว่าการเชื่อมต่อต่างๆต้องมีความปลอดภัยอะเนอะ ดังนั้นใช้ของใหม่ๆน่าจะดีกว่า
  • แน่นอนว่ามันสอดคล้องกับ Android Developer ในยุคนี้
  • hiring อันนี้ตีความได้หลายอย่างเลยแหะ เดาว่าน่าจะหาคนมาทำงานในทีมได้ง่ายขึ้นมั้ง เพราะใครๆก็ใช้ Kotlin เขียน Android กันแล้วเนอะ

สรุป วันที่เรียบร้อยคือวันที่ 8 ตุลาคม 2019 จ้า

ตอนที่ 2 : Conversation

การพูดคุยกันภายในทีมแหละ

  • เรื่อง code style เราจะต้องตกลงกันก่อนว่าเอาแบบไหน ซึ่งวิธีตรวจจะใช้ ktlint ซึ่งสามารถ install ได้ดังนี้ (ถ้ามีโอกาสได้ใช้จะเขียนบล็อกนะ ;__;)
  • เรื่องพวก null ต่างๆ มีบางตัวที่ null ได้ และบางตัวที่ห้าม null ดังนั้นฝากให้เขาใส่ @NonNull และ @Nullable กันด้วย โดยวิธีส่องสามารถไปที่ Analyze > Infer Nullify ได้จ้า
  • แปลง Java ไป Kotlin ด้วยปุ่มลับ Option + Shift + Command + K (ไอเราตอนแรกคิดว่าสร้างไฟล์ Kotlin แล้วเอาไฟล์ Java มาแปะใหม่ แต่อันนี้เราไม่เคยใช้ แหะๆ)
  • ขัดสีฉวีวรรณโค้ดที่ได้จากการแปลงสักหน่อย เช่น

สำหรับ condition if ที่เอามา check ค่า null เปลี่ยนมาใช้ let กับ elvis operator (?:) แทน

ในมุมมองของเรา คิดว่า ถ้าตัว condition บางอย่างที่เป็น true/false ก็มาทางพี่เอลวิสได้เช่นกัน

เปลี่ยนจาก switch มาเป็น when แทน

การใช้ when บาง condition นั้น อาจจะไม่ต้องมี else ก็ได้ แล้วแต่กรณี)

ส่วนเรา อันเดิมที่เป็น if ไว้ check true หรือ false เราก็เปลี่ยนเป็น when true or false ก็ได้นะ

พวก Callback ต่างๆใช้เป็น Unit return type แทน และมีการใช้ lambda มาร่วมด้วย

รู้สึกสนุกกับ Kotlin เพราะสามารถใส่ Callback แบบนี้แหละ (จริงๆแอบร่างบล็อกไว้แต่ยังไม่เสร็จจ้า)

พวก Utils ต่างๆก็จะมีการใช้ inline function และ generics type ด้วย ไม่ว่าจะเป็น type อะไรก็ไม่ต้องสร้าง function เดียวกันแต่เปลี่ยน type ขึ้นมาเยอะๆแล้วหล่ะ

Special attention

  • แน่นอนว่าพวก null บางที่เราจะใส่ ? ต่อไปกันยาวๆ ตัวท้ายก็ต้องใส่ !! เพื่อยืนยันว่าจะไม่ null นะ (แต่ null ไหมว่ากันอีกที)
  • สิ่งที่ต่างจาก Java ก็คงเป็นเรื่อง lateinit ที่เราบอกว่าตัวแปรนี้เราจะ assign ค่าให้ทีหลังนะจ๊ะ (ถ้าลืมแอพก็แคลชแค่นั้นเองเนอะ) แล้วก็ lazy คือ เป็นการประกาศตัวแปรและค่า โดยที่เก็บ memory ของตัวแปรนี้ไว้ก่อน และถ้ามีการใช้ก็ค่อย init ค่า ถ้าอยากอ่านต่อสามารถอ่านบล็อกตอนไป Kotlin Workshop ได้ด้านล่างนี้จ้า
  • ในบาง parameter ในบาง function มีเจ้า @NotNull ซึ่งห้าม null แน่ๆ อาจจะเปลี่ยนเป็นใส่ type ที่ไม่ใช่ nullable อ่ะ
  • JVM annotated อ่านจากบล็อกพี่เอกด้านล่างได้เลย ของดีย์
  • พวก throws ของต่างๆ
  • เขียน Java ใน Kotlin เข้าใจว่าบางอย่างอาจจะไม่คุ้มเปลี่ยนอาจจะคงไว้ก่อน
  • การทำ test จะใช้ Mockk กัน ซึ่งเราขอแอบข้ามๆนะ ;___;

ถึงเราจะใช้ Kotlin มาร่วมๆ 2 ปี บางตัวต้องลองกลับไปศึกษาและนำไปใช้ต่อไปแล้วหล่ะ

ตอนที่ 3 : 1.0

สิ่งที่ฝากไว้สำหรับการทำ public APIs หรือในที่นี้ ก็น่าจะ SDK แหละมั้ง

  • อย่าเปิดเผย Kotlin types
  • สามารถใช้ได้ทั้งโปรเจกที่เป็น Java และ Kotlin และควรมีตัวอย่างการใช้งานทั้งสองภาษานี้ด้วย
  • ใช้ @Jvm annotations เพื่อการเรียกใช้ที่ราบรื่นและ happy ทั้ง Java และ Kotlin
  • ให้โค้ดบางส่วนเป็น internal สำหรับบางอย่างที่ไม่ต้องการให้คนที่เอาไปใช้งาน custom ได้

สุดท้ายฝากร้านกันสักนิด ฝากเพจด้วยนะจ๊ะ

--

--

Minseo Chayabanjonglerd
Black Lens

Android Developer | Content Creator AKA. MikkiPastel | Web2 & Web3 Contributor