Как автор книг по Kotlin проверял мой проект: разбор ошибок в Coroutines и архитектуре

Как автор книг по Kotlin проверял мой проект: разбор ошибок в Coroutines и архитектуре

Меня зовут Шамиль, и я хочу рассказать, как стремление разобраться в корутинах привело к детальному аудиту моего проекта Марчином Москале. По итогам проверки архитектурные решения в моём приложении GeminiAI были признаны качественным примером реализации Structured Concurrency.

Все началось с вызова

Я всегда считал, что если браться за дело, то делать это на максимум возможностей. Моей целью было показать разработчикам, как устроены AI-агенты под капотом, и создать собственную версию Gemini.

Я решил реализовать аналог Gemini с акцентом на архитектуру взаимодействия нейросетей и бесшовную интеграцию AI-функционала в мобильную среду.

Перед стартом я проанализировал GitHub. К моему удивлению, полноценных реализаций Gemini-клиента с современным Android-стеком не было. Существующие проекты представляли собой обрывки кода или устаревшие примеры.

Это стало дополнительным стимулом — стать первым, кто опубликует архитектурно выверенную и доступную для изучения копию Gemini.

Так появился GeminiAI — умный ассистент на современном стеке: Navigation 3, Jetpack Compose и глубокая работа с асинхронностью.

Ранее я сталкивался со сложными вопросами на собеседованиях, требующими лучшего понимания архитектуры. После нескольких отказов я решил создать проект, который закроет все пробелы.

Я стремился к архитектуре, минимизирующей утечки памяти и логические ошибки. Именно это желание привело меня на воркшоп к Марчину Москале.

Воркшоп у легенды

В декабре 2025 года я попал на воркшоп к Марчину Москале — автору книг по Kotlin, чьи издания есть у каждого второго senior-разработчика.

Это был не обычный курс, а технический аудит в реальном времени. Марчин проверял буквально каждую строчку кода GeminiAI.

Представьте: вы защищаете архитектуру своего AI-агента перед человеком, официально сертифицированным JetBrains для обучения профессионалов. Это был сильный стресс, но именно в таких условиях формируется инженерное мышление.

Архитектура GeminiAI

Я не экономил на архитектуре:

  • Navigation 3: самый свежий подход к навигации.
  • Coroutines & Flow: вся логика построена на реактивных потоках с обработкой сложных состояний. Никаких init{} в ViewModel — только Flow.
  • DI (Dagger-Hilt) и Room: классические решения, реализованные для масштабируемости.

Результаты и признание

Проект был доведён до состояния, которое Марчин назвал эталонным.

  1. Совместная работа: Марчин официально указан в разделе Contributors репозитория GeminiAI. Для меня это лучшая верификация качества.
  2. AI-агент в действии: реализована не просто чат-система, а полноценная обработка стриминговых ответов от Gemini, грамотное управление контекстом и мгновенная очистка ресурсов при отмене задач.

Вердикт эксперта

После завершения работы я получил не просто сертификат. Марчин написал в своей статье:

"Gemini client by Shamil Giylmetov was a very ambitious project, with many edge-cases to cover. Code is solid and well-structured, making it a great example for learning coroutines in Android development."

Услышать, что твой код — "эталонный пример для изучения", от сертифицированного тренера JetBrains — это момент, когда понимаешь: бессонные ночи стоили того.

Наше сотрудничество не закончилось финальным коммитом. Мы продолжаем обмениваться опытом. Сейчас я углублённо изучаю Jetpack Compose в рамках новых образовательных программ Марчина, чтобы поддерживать высокую планку в своих проектах.

Совместная статья: Structured Concurrency

После реализации GeminiAI я в соавторстве с Марчином (в рамках рецензирования) подготовил статью по асинхронному программированию.

Идея статьи — показать, что современное асинхронное программирование проходит тот же путь эволюции, что и классическое программирование в 1960-х: от спагетти-кода к строгой структуре.

Я провожу аналогию между оператором GOTO и неструктурированной конкурентностью:

  • Проблема в 1960-х: в языках вроде FLOW-MATIC логика могла прыгать в любое место, создавая нечитаемый "спагетти-код".
  • Связь с асинхронностью: запуск корутины без привязки к области видимости — это аналог GOTO. Мы теряем контроль над выполнением.

Ключевой риск: утечки задач. Если родительский процесс завершён, а "забытая" задача продолжает работать, она потребляет ресурсы впустую.

Манифест Эдсгера Дейкстры

Статья опирается на классическую работу Дейкстры 1968 года "Go To Statement Considered Harmful".

  • Суть: программа должна быть предсказуемой.
  • Решение в конкурентности: Structured Concurrency — концепция, при которой любая асинхронная операция имеет чёткие границы входа и выхода.

Механика Structured Concurrency в Kotlin

В статье выделяются три "золотых правила" родительско-дочерних отношений в Kotlin Coroutines:

  1. Наследование контекста: дочерние корутины автоматически получают параметры родителя, например, диспетчер.
  2. Ожидание завершения: родительский scope не закроется, пока все запущенные внутри launch или async не завершатся.
  3. Автоматическая отмена: если родитель отменяется или падает с ошибкой, всё дерево дочерних задач отменяется автоматически.

Практическое применение в Android

Статья демонстрирует реализацию на примере ViewModel и Repository — критически важный момент для Android-разработки:

  • viewModelScope: идеальный пример структурированного подхода. Как только экран закрывается и ViewModel уничтожается, все запросы к API и базе данных отменяются автоматически.
  • Инкапсуляция: в Gemini реализован ChatRepository, который выполняет тяжёлую работу, но контроль над отменой остаётся у вызывающего — ViewModel.

Совместная работа над статьёй показала, что теория computer science (в частности, идеи Дейкстры) отлично связывается с повседневной практикой современных разработчиков, включая Android-инженеров.

Вместо эпилога

Мы живём в эпоху, когда AI-инструменты становятся повседневностью. Но требования к архитектуре остаются прежними: чистота, тестируемость и надёжность.

Надеюсь, мой разбор связки Gemini и Kotlin Coroutines поможет вам по-новому взглянуть на привычные инструменты Android-стека.

Читать оригинал