Меня зовут Шамиль, и я хочу рассказать, как стремление разобраться в корутинах привело к детальному аудиту моего проекта Марчином Москале. По итогам проверки архитектурные решения в моём приложении 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: классические решения, реализованные для масштабируемости.
Результаты и признание
Проект был доведён до состояния, которое Марчин назвал эталонным.
- Совместная работа: Марчин официально указан в разделе Contributors репозитория GeminiAI. Для меня это лучшая верификация качества.
- 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:
- Наследование контекста: дочерние корутины автоматически получают параметры родителя, например, диспетчер.
- Ожидание завершения: родительский scope не закроется, пока все запущенные внутри launch или async не завершатся.
- Автоматическая отмена: если родитель отменяется или падает с ошибкой, всё дерево дочерних задач отменяется автоматически.
Практическое применение в Android
Статья демонстрирует реализацию на примере ViewModel и Repository — критически важный момент для Android-разработки:
- viewModelScope: идеальный пример структурированного подхода. Как только экран закрывается и ViewModel уничтожается, все запросы к API и базе данных отменяются автоматически.
- Инкапсуляция: в Gemini реализован ChatRepository, который выполняет тяжёлую работу, но контроль над отменой остаётся у вызывающего — ViewModel.
Совместная работа над статьёй показала, что теория computer science (в частности, идеи Дейкстры) отлично связывается с повседневной практикой современных разработчиков, включая Android-инженеров.
Вместо эпилога
Мы живём в эпоху, когда AI-инструменты становятся повседневностью. Но требования к архитектуре остаются прежними: чистота, тестируемость и надёжность.
Надеюсь, мой разбор связки Gemini и Kotlin Coroutines поможет вам по-новому взглянуть на привычные инструменты Android-стека.