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

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

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

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

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

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

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

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

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

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

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

Что под капотом GeminiAI?

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

  • Navigation3: Максимально свежий подход к навигации.

  • Coroutines & Flow: Вся логика построена на реактивных потоках с обработкой самых сложных состояний. Никакой реализации init{} в ViewModel, только Flow

  • DI (Dagger-Hilt) и Room: Классика в идеальном исполнении для масштабируемости.

Результат в цифрах и фактах

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

  1. Совместная работа: Марчин официально указан в Contributors репозитория GeminiAI — для меня это лучшая верификация качества.

  2. AI-агент в действии: Я реализовал не просто чат, а систему, которая на лету обрабатывает стриминг ответов от Gemini, грамотно управляет контекстом и мгновенно очищает ресурсы при отмене задач.

Contributors проекта Gemini
Contributors проекта Gemini

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

В декабре 2025 года я получил сертификат.

Kotlin Expert Workshop | Certified by JetBrains
Kotlin Expert Workshop | Certified by JetBrains

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

"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 — это тот момент, когда понимаешь: бессонные ночи стоили того.

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

Статья An Overview of Structured Concurrency

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

Идея статьи — доказать, что современное асинхронное программирование проходит тот же путь эволюции, что и обычное программирование в 60-х годах: от неконтролируемых прыжков (спагетти-код) к строгой структуре. В статье я провожу аналогию между оператором GOTO и "неструктурированной" конкурентностью.

  • В чем была проблема: В 1950-60-х годах (пример на FLOW-MATIC) логика программы могла прыгать в любое место. Это создавало "спагетти-код", где невозможно было отследить жизненный цикл переменной или логическую цепочку.

  • Связь с асинхронностью: Запуск корутины или потока без привязки к области видимости (scope) — это тот же GOTO. Мы "прыгаем" в фоновый поток и теряем над ним контроль.

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

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

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

  • Суть: Программа должна быть предсказуемой.

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

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

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

  1. Наследование контекста: Дочерние корутины автоматически получают параметры родителя (например, диспетчер).

  2. Ожидание завершения: Родительский scope не закроется, пока все запущенные внутри него launch или async не завершат работу.

  3. Автоматическая отмена (Cancellation): Если родитель отменяется или падает с ошибкой, дерево дочерних задач "схлопывается" автоматически.

Пример из статьи:

coroutineScope {
    launch { /* Задача 1 */ }
    launch { /* Задача 2 */ }
}
// Код пойдет дальше только тогда, когда обе задачи внутри завершатся

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

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

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

  • Инкапсуляция: В Gemini реализован ChatRepository, который выполняет тяжелую работу, но контроль над отменой остается на стороне вызывающего (ViewModel).

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

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

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

GitHub

Medium