Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlin/Multiplatform — your shortest (nope) and...

Kotlin/Multiplatform — your shortest (nope) and pain(-ful/-less) way to becoming a Fullstack Developer

Stanislav Talanov, New Cloud Technologies at #MOSDROID 17 Chlorine

Поговорим о том, является ли K/N product-ready solution и почему, а также расскажем о нашем опыте внедрения его в релиз.

Бонус для жаждущих хлеба и зрелищ: мое горение

MOSDROID

May 30, 2019
Tweet

More Decks by MOSDROID

Other Decks in Programming

Transcript

  1. Kotlin/Multiplatform What have we been doing for a month without

    development experience How we suffered done
  2. DISCLAIMER Я вообще смузи iOS разработчик, права на мнение не

    имею, как и права тут выступать. Вас предупреждали — вы сами пришли. Тут будет rant не то, что джуна, а вообще трэйни. Еще раз, внимательно, вы слушаете сейчас доклад человека, который еле-еле Gradle осилил (как он тогда думал) за неделю коллективными силами чатика на 50 человек, о чем вообще идет речь? Это абсолютно многострадальная презентация и должна она была выйти еще полгода назад, поэтому тут Франкенштейн из первоначальной версии презентации (Internal), той самой (с) и добавлений в последний момент за день до МосДроида. Если ты джун с горящими глазами — не лезб, оно тебя сожретб!
  3. React Native Main thread Общая незрелость экосистемы Архитектура в разы

    сложнее Хороший, качественный код Отсутствие возможности работы с Accessibility JSCore — iOS / Android — ВИРТУАЛЬНАЯ МАШИНА LLVM-несовместимый? “Свой компонент” — даже TextView Royalty? GroundBreaking Changes Future-Proof? Security? Возможность писать без участия Native разработчиков Не может в сторонние библиотеки Ограничения использования API Быстродействие Актуализация кодовой базы – React Native Immaturity - непредсказуемые задержки из-за сырости – Maintaining a Fork of React Native - пришлось делать форк RN и дорого его поддерживать – JavaScript Tooling - сложно масштабировать написанное на JS – Refactoring - тяжело рефакторить RN код – JavaScriptCore inconsistencies - нет JSCore на Android – React Native Open Source Libraries - кривые либы – Parallel Infrastructure and Feature Work - пришлось с нуля наводить мосты между компонентами на RN
  4. React Native – React Native Immaturity - непредсказуемые задержки из-за

    сырости – Maintaining a Fork of React Native - пришлось делать форк RN и дорого его поддерживать – JavaScript Tooling - сложно масштабировать написанное на JS – Refactoring - тяжело рефакторить RN код – JavaScriptCore inconsistencies - нет JSCore на Android – React Native Open Source Libraries - недостаточная поддержка – Parallel Infrastructure and Feature Work - пришлось с нуля наводить мосты между компонентами на RN – Crash Monitoring - не все креши приходили в систему и тяжело дебажились – Native Bridge - не стабильна интеграция с нейтивом – Initialization Time - долго запускается аппа – Initial Render Time - рендер дольше из-за чего мигает UI – App Size - бинарник тяжелее – 64-bit - 64бита на андроиде пока невозомжно – Gestures - приходится отключать сложные жесты – Long Lists - лагают длинные списки – Upgrading React Native - тяжелый апдейт с версии на версию – Accessibility - слабо поддерживаются режимы для инвалидов – Troublesome Crashes - невозпроизводимые креши – SavedInstanceState Across Processes on Android - невозможность сохранить стейт при выключении из фона
  5. Scade React/Native Kotlin/Native Flutter Xamarin No third-party IDE for Code

    / Build ⛔ ⛔ ⚠ ⛔ ⛔ Vendor Independence ⛔ ⚠ ⚠ ⚠ ⛔ Native UI ⚠ ⛔ ✅ ⛔ ⚠ Bridge -> Native ⛔ ✅ ✅ ✅ ⛔ Native for both platforms (iOS/Android) ⛔ ⛔ ✅ ⛔ ⛔
  6. Kotlin/Native * Kotlin — Boilerplate-free * iOS/Android native support *

    Kotlin круто * Linux * MacOS * Web Assembly * Windows * and so on…
  7. Kotlin/Multiplatform Sources Kotlin IR LLVM Bitcode LLVM Native binary *

    Kotlin-frontend * Kotlin Native-backend * Machine Code * System Linker Xcode / Android Studio Gradle LLDB
  8. Code example protocol RoomProfile { var profileID: String { get

    } var title: String { get } var abbreviation: String { get } var colorIndex: Int { get } var type: Type { get } } enum Type { case unknown case user(_ id: String) case group } interface RoomProfile {
 val profileID: String
 val title: String
 val abbreviation: String
 val colorIndex: Int
 val type: Type
 } sealed class Type {
 object Unknown: Type()
 class User(val id: String): Type()
 object Group: Type()
 }
  9. Code example // Syntax sugar from Swift fun List<String>.joined(separator: String):

    String { val string = StringBuilder() for (s in this) { if (string.isNotEmpty()) { string.append(separator) } string.append(s) } return string.toString() } fun String.replacingOccurrences(of: String, with: String) = replace(of, with)
  10. * Immutability * Fast pace / Beta * Painful migrations

    * Android Studio & IDEA have different behaviour * Lack of documentation * Examples don’t match documentation * Heisenbugs, Bohrbugs, Mandelbugs * And more…
  11. Cons — Fast-paced beta — You need to participate —

    There’s no better solution for native*