Talking Kotlin

← Talking Kotlin5 mrt · 1 u 39 min

How Major Metros Run on KMP

How Major Metros Run on KMP5 mrt1 u 39 min

<p>Every time you tap through a subway gate in New York City, you’re using Kotlin Multiplatform! In this episode, we sit down with Paweł Kwieciński from Masabi to explore how they brought a decade-old Java codebase to KMP, powering ticket validation across mobile apps, embedded devices, and backend systems for public transit agencies worldwide.</p><p><strong>Resources:</strong></p><ul> <li><a href="https://www.masabi.com/" rel="ugc noopener noreferrer" target="_blank">Masabi</a></li> <li><a href="https://developers.google.com/j2objc" rel="ugc noopener noreferrer" target="_blank">J2ObjC (Java to Objective-C translator)</a></li> <li><a href="https://www.youtube.com/watch?v=5sOXv-X43vc" rel="ugc noopener noreferrer" target="_blank">Google Workspace Migration to Kotlin</a></li> <li><a href="https://www.youtube.com/watch?v=K2PN03AepC0" rel="ugc noopener noreferrer" target="_blank">Large Scale Changes with AI – Uber | Ty Smith</a></li> <li><a href="https://github.com/Kotlin/kotlinx-datetime" rel="ugc noopener noreferrer" target="_blank">KotlinX DateTime</a></li> <li><a href="https://ktor.io/" rel="ugc noopener noreferrer" target="_blank">Ktor (Client & Server)</a></li> <li><a href="https://github.com/square/burst" rel="ugc noopener noreferrer" target="_blank">Burst library (archived)</a></li> <li><a href="https://en.wikipedia.org/wiki/Java_Platform,_Micro_Edition" rel="ugc noopener noreferrer" target="_blank">Java ME (Micro Edition)</a></li> <li><a href="https://www.wolfssl.com/" rel="ugc noopener noreferrer" target="_blank">Mbed TLS</a></li> <li><a href="https://sqldelight.github.io/sqldelight/" rel="ugc noopener noreferrer" target="_blank">SQLDelight</a></li> <li><a href="https://www.jetbrains.com/lp/compose-multiplatform/" rel="ugc noopener noreferrer" target="_blank">Compose Multiplatform</a></li> <li><a href="https://www.jetbrains.com/ai/" rel="ugc noopener noreferrer" target="_blank">JetBrains AI Assistant & Junie</a></li></ul><p><strong>Hosts:</strong></p><ul> <li> Sebastian Aigner – <a href="https://sebi.io/" rel="ugc noopener noreferrer" target="_blank">Website</a> | <a href="https://bsky.app/profile/sebi.io" rel="ugc noopener noreferrer" target="_blank">Bluesky</a> </li> <li> Márton Braun – <a href="https://zsmb.co" rel="ugc noopener noreferrer" target="_blank">Website</a> | <a href="https://bsky.app/profile/zsmb.co" rel="ugc noopener noreferrer" target="_blank">Bluesky</a> </li></ul><p><strong>Guest:</strong></p><ul> <li>Paweł Kwieciński</li></ul><p><strong>Timeline:</strong><br />(0:00) Introduction<br />(1:12) What is Masabi?<br />(3:03) How does Kotlin fit into this?<br />(6:30) System architecture overview<br />(8:33) Embedded SDK and mobile apps<br />(10:33) Ticket inspectors and validators<br />(13:22) Offline operation<br />(16:29) The KMP decision<br />(24:42) Evaluating alternatives<br />(27:21) Planning the migration<br />(33:28) First lines of Kotlin<br />(43:45) Translating Java to Kotlin<br />(53:22) AI-assisted code translation<br />(56:39) Early AI era challenges<br />(1:05:01) Testing challenges<br />(1:08:22) KMP dependencies<br />(1:11:34) Domain-specific dependencies<br />(1:16:55) Java ME and C interop<br />(1:23:22) Backend-client sharing<br />(1:26:59) Current status<br />(1:31:48) Future plans: CMP<br />(1:36:26) Wrap-up</p>