Выберите направление

Набор открыт

Бэкенд

Занимайтесь инфраструктурными и продуктовыми задачами нагруженных систем

Набор открыт

Фронтенд

Улучшайте интерфейсы сервисов, присоединившись к одной из фронтенд-команд в Яндексе

Набор открыт

Мобильная разработка

Участвуйте в создании приложений на Android и iOS и Flutter для продуктов Яндекса

Набор открыт

DevOps

Освойте инструменты для создания отказоустойчивых распределённых систем

Набор открыт

Аналитика данных

Прогнозируйте события на основе данных, занимайтесь их сбором и интерпретацией

Набор открыт

ML

Обучайте нейросети и улучшайте алгоритмы машинного обучения для сервисов Яндекса

Набор открыт

Yandex ML Residency

Принимайте участие в исследованиях мирового уровня в сфере машинного обучения

Набор закрыт

Защита приватности

Развивайте приватность и помогайте обеспечивать защиту персональных данных

Набор закрыт

SOC

Ищите аномалии и разбирайтесь в современных системах защиты

Набор закрыт

SOC в Yandex Cloud

Помогайте улучшать мониторинг безопасности Yandex Cloud

Набор закрыт

Сompliance

Минимизируйте риски в области защиты данных

Набор закрыт

Security Engineering

Участвуйте в архитектурных ревью и защищайте пользовательские данные

Не нашли подходящую стажировку?
Посмотрите здесь
Мы постоянно открываем новые стажировки!
Если вакансий пока нет, загляните сюда через пару дней или подпишитесь на новости

Набор закрыт

Ручное тестирование

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

Набор открыт

Автоматизированное тестирование

Создавайте и применяйте скрипты для автоматической проверки продукта, чтобы ускорить выпуск версий и повысить надёжность системы

Управление проектами

Занимайтесь проектами от инициации до успешного завершения

Подать заявку

Управление продуктами

Ищите баланс между интересами бизнеса, потребностями пользователя и техническими возможностями

Подать заявку

Технический менеджмент

Занимайтесь автоматизацией и разработкой, анализируйте большие массивы данных

Подать заявку
Не нашли подходящую стажировку?
Посмотрите здесь
Мы постоянно открываем новые стажировки!
Если вакансий пока нет, загляните сюда через пару дней или подпишитесь на новости

Финансы

Обеспечивайте финансовую стабильность и эффективность компании, управляя денежными потоками, отчётностью и стратегией

Подать заявку

Юриспруденция и GR

Обеспечивайте правовую безопасность бизнеса и выстраивайте конструктивные отношения с государственными органами

Подать заявку

Аналитика

Превращайте данные о рынке и бизнес-процессах в конкретные выводы и рекомендации для принятия управленческих решений

Подать заявку

Закупки

Организуйте эффективные и выгодные закупки товаров и услуг, необходимых для стабильной работы компании

Подать заявку

HR

Формируйте и развивайте сплочённые команды, контролируя все этапы карьеры каждого сотрудника

Подать заявку

Развитие бизнеса и продажи

Находите новых клиентов и партнеров, развивайте отношения и увеличивайте доходы компании

Подать заявку
Мы постоянно открываем новые стажировки!
Если вакансий пока нет, загляните сюда через пару дней или подпишитесь на новости

Маркетолог

Создавайте и внедряйте эффективные комплексные стратегии продвижения продукта на рынок, анализируя аудиторию и конкурентов

Подать заявку

PR-менеджер

Формируйте и поддерживайте позитивный образ бренда в медиа и публичном поле

Подать заявку

Ивент-менеджер

Организуйте и проводите запоминающиеся мероприятия, которые вдохновняют аудиторию и укрепляют ее лояльность к бренду

Подать заявку

SMM-менеджер

Создавайте и ведите стратегию присутствия бренда в соцсетях, вовлекая аудиторию через контент и взаимодействие

Подать заявку

Комьюнити-менеджер

Выстраивайте и укрепляйте сообщество лояльных пользователей бренда, управляя их интересами и активностью

Подать заявку

Креативный менеджер

Отвечайте за генерацию и воплощение ярких идей и концепций для рекламных кампаний и продуктового позиционирования

Подать заявку
Не нашли подходящую стажировку?
Посмотрите здесь
Мы постоянно открываем новые стажировки!
Если вакансий пока нет, загляните сюда через пару дней или подпишитесь на новости

Дизайнер

Создавайте визуальную концепцию продукта — от макетов и интерфейсов до графики, обеспечивая его эстетику и удобство

Подать заявку

UX-дизайнер

Создавайте удобный, интуитивно понятный и визуально привлекательный интерфейс для сайтов, приложений и других цифровых продуктов

Подать заявку
Не нашли подходящую стажировку?
Посмотрите здесь
Мы постоянно открываем новые стажировки!
Если вакансий пока нет, загляните сюда через пару дней или подпишитесь на новости

Инженер

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

Не нашли подходящую стажировку?
Посмотрите здесь
Мы постоянно открываем новые стажировки!
Если вакансий пока нет, загляните сюда через пару дней или подпишитесь на новости
Контест обновился

мобильная
разработка

Android
iOS
Москва, Санкт-Петербург, Екатеринбург, Нижний Новгород

Стажировка для начинающих специалистов

Развивайтесь в мобильной разработке и создавайте приложения с заботой о пользователях
ANDROID
IOS
MOBILE
APPS
ANDROID
IOS
APPS
MOBILE
ANDROID
IOS
APPS
MOBILE
ANDROID
IOS

Примеры задач, которые решают стажёры

Работайте наравне с командой над приложениями с миллионами пользователей
Разрабатывают новые фичи и экраны для приложений смарт‑девайсов
Работают над экраном кинотеатра в Кинопоиске на SwiftUI
Интегрируют LiveActivity для отслеживания поездки на поезде в Яндекс Путешествиях

Что нужно уметь

Базово знать Swift, Kotlin и Java
Иметь опыт написания приложений под iOS или Android, в том числе учебный
Знать классические алгоритмы и структуры данных
Понимать принципы работы с базами данных и организации клиент-серверных приложений

В каких сервисах есть стажировка по стеку

Стажёры работают практически в каждом продукте Яндекса, где есть мобильное приложение: от B2C- и B2B-сервисов до внутренних сервисов Яндекса

Как проходит отбор

Всё получится!
Шаг 1
Тестовое задание в системе Яндекс Контест
Вам предстоит решить несколько алгоритмических задачи за 4 часа. Их можно решать на языках Swift, Kotlin. Рекомендуем убедиться, что у вас стабильное интернет‑соединение и минимум отвлекающих факторов.

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

Перед тем, как начать, рекомендуем пройти тренировочный контест — в нём собраны тестовые задания прошлых лет.

Шаг 2
Секция на платформу и код
Это техническое интервью с разработчиком. Вас попросят рассказать о вашем опыте, учебных или продакшн-проектах, если они есть. Будьте готовы ответить на несколько вопросов и рассказать о технологиях выбранной вами платформы — Android или iOS. Освежите в памяти жизненный цикл работы приложения, основы работы с UI, сетью, многопоточностью.

Если вы хотите пройти стажировку по направлению iOS — вас ждут вопросы об особенностях языка Swift. Для Android-направления — Kotlin и Java. Будьте готовы к задачам с написанием кода, в том числе алгоритмическим.

Шаг 3
Секция с алгоритмическими задачами
Это важный этап отбора: Вам предстоит решить одну алгоритмическую задачу уровня Easy за полчаса. Реализовать алгоритм можно на любом языке программирования, написав код в совместном онлайн-редакторе.

Чтобы получше подготовиться, рекомендуем изучить материалы в нашем блоге на Habr, набить руку на задачах с Codeforces, LeetCode, а также ознакомиться с материалами тренировок по алгоритмам 1.0 и 2.0.

Шаг 4
Разговор с рекрутером
Рекрутер задаст вам несколько вопросов про вашу занятость, опыт и проекты, пожелания по задачам. Чем подробнее вы расскажете о вашем видении стажировки мечты, тем быстрее получится подобрать для вас команды и устроить с ними финальные интервью.

Познакомиться с приложениями, которые развивает Яндекс, можно здесь.

Шаг 5
Финальные интервью с командами
Это встречи-знакомства с вашими будущими коллегами. Они расскажут, как устроена работа в Яндексе, чем они занимаются и какую роль предполагается отвести вам, а вы сможете задать все интересующие вопросы.

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

Что вас ждёт

Оплачиваемая стажировка

Доступ к корпоративным фичам

Компенсация обедов

Оплата проезда и проживания в Москве

Официальное оформление на стажировку или практику от вуза

Гибкий и гибридный график 20, 30 или 40 часов в неделю

Советы по подготовке

Александр Щавровский
Руководитель Apple-разработки Кинопоиска
Ценно, когда кандидат стремится глубже изучить технологию перед её применением. Например, он может заглянуть в исходный код библиотеки или прочитать документацию. Такой подход делает разработку более осмысленной и помогает ответить на вопрос: «Почему я реализовал функционал так, а не иначе?»

Кроме того, всегда приятно видеть, как кандидат, даже не зная ответа на вопрос, старается логически прийти к правильному решению.

Сергей Кольцов
Руководитель группы мобильной разработки Яндекс Про
Собеседование можно рассматривать как набор реальных рабочих задач, даже если это теоретические вопросы по языку или фреймворку. В рабочих обсуждениях тоже часто всплывают теоретические моменты, поэтому на вопрос интервьюера можно отвечать так, как если бы это был обычный рабочий диалог о нюансах технологии, а не просто зазубренные определения для экзамена.

Особенно это касается практических задач. Глядя на то, как вы решаете практическую задачу, собеседующий может понять ваши реальные навыки и опыт. Как вы подходите к решению задач? Поэтому любую задачу стоит решать так, как будто вы получили её в реальной работе, даже если она сводится к объяснению теории.

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

Круто, если можно оценить ваши труды в виде кода на GitHub или аналогичной платформе.

Полезные материалы

Чтобы успешно пройти собеседование на Android‑разработчика в Яндекс, нужно хорошо разбираться в нескольких ключевых областях. Мы проанализировали успешные и не очень успешные прохождения собеседований и выделили основные маркеры знаний и типичные пробелы. Вот что вам нужно знать и уметь:
    • Inline/noinline/crossinline:

      • inline — инлайнинг лямбд для снижения аллокаций и вызовов; полезно в часто вызываемых утилитах.
      • noinline — запрет инлайна для отдельных параметров‑лямбд.
      • crossinline — запрет нелокального return внутри лямбды.
    • Reified type parameters:

      • позволяют работать с типом‑параметром во время выполнения (is, when, Class<T>, старт Activity<T>).
      • работают только в inline‑функциях; помогают обойти стирание типов JVM.
    • Коллекции под капотом:

      • Kotlin‑коллекции на JVM — обертки над java.util.*. Понимайте различия ArrayList vs LinkedList, HashSet/LinkedHashSet/TreeSet, HashMap/LinkedHashMap/TreeMap.
      • Сложности операций: поиск в HashMap/HashSet — амортизированно O(1), в TreeMap/TreeSet — O(log n), вставка в ArrayList — амортизированно O(1), в середину — O(n).
      • equals/hashCode: корректность ключей в HashMap/HashSet; не меняйте поля, влияющие на hashCode/equals, после помещения в коллекцию.
      • Порядок обхода: Hash* — не гарантирует порядок, LinkedHash* — порядок вставки, Tree* — сортировка по компаратору.
      • Capacity/growth: издержки перераспределения у ArrayList/HashMap.
      • Последовательности (Sequence) vs коллекции: ленивые цепочки против немедленных; профит на больших пайплайнах, но возможны лишние аллокации итераторов — профилируйте.
      • Иммутабельные структуры (kotlinx.collections.immutable) — persistent‑коллекции: меньше копий при изменениях состояния UI.
    Раздел 1. Синтаксис Kotlin, классы, коллекции, ООП — углубления
    • Практическая задача: параллельная загрузка по нескольким ссылкам

      • within coroutineScope { val results = urls.map { async(Dispatchers.IO) { load(it) } }.awaitAll() } и затем отображение на Main.
      • Обработка ошибок: supervisorScope для изоляции падений отдельных задач; retry с ограничением; timeout с withTimeout.
      • Отмена: propagate cancellation, не блокируйте UI (не используйте runBlocking в UI).
      • Structured concurrency: не используйте GlobalScope; передавайте scope из ViewModel.
      • Синхронизация: Mutex/Semaphore для rate limiting/"защиты от двойного клика".
      • Не блокируйте корутины: используйте suspend API, а не блокирующие вызовы.
    Раздел 2. Многопоточность, Coroutines — практическая задача и нюансы
    • Изучите Clean Architecture (наши задачи часто на ней построены):

      • Слои: Presentation (ViewModel/Compose), Domain (use cases, бизнес‑правила), Data (репозитории, источники).
      • Зависимости направлены внутрь: Presentation → Domain ← Data (через интерфейсы репозиториев).
      • Репозитории инкапсулируют сети/БД/кэш, use case — единица бизнес‑логики; DI (Hilt/Koin) для провайдинга зависимостей.
      • Преимущества: тестируемость, изоляция платформенного кода, удобное масштабирование.
      • Потоки/диспатчеры: переключение контекстов в use case или репозитории, UI остаётся «чистым».
    Раздел 3. Android SDK, архитектура, жизненный цикл — Clean Architecture
    • View-пайплайн:

      • Фазы: measure → layout → draw. requestLayout инициирует measure/layout, invalidate — перерисовку (draw).
      • Кастомные View: переопределяйте onMeasure/onLayout/onDraw корректно; избегайте аллокаций в onDraw.
      • RecyclerView: диффинг (ListAdapter/DiffUtil), пулы вьюхолдеров, payloads.
    • Compose: что происходит при изменении state

      • Снапшоты состояния → планируется recomposition для затронутых композов.
      • Recomposition не всегда тянет remeasure/relayout — только если размеры/ограничения изменились.
      • remember кэширует значения в composition; rememberSaveable — через SavedStateHandle/Bundle.
      • Стабильность и равенство: используйте data/val, immutability, equals — меньше бесполезных рекомпозиций.
      • Keys: стабильные ключи в Lazy*; derivedStateOf для вычисляемых значений, зависящих от других state.
    Раздел 4–5. UI (View/Compose) — жизненный цикл отрисовки и реакция на состояние
  • До подготовки 1 неделя
    • Добавьте: inline/noinline/crossinline, reified type parameters и ограничения JVM type erasure.

    • Практика: написать inline‑функцию с reified T (например, generic навигация/парсинг JSON), показать отличие с Class<T>

    День 1: Kotlin, ООП, inline/reified
    • Разберите внутренние структуры: HashMap/TreeMap/LinkedHashMap; сложности операций; equals/hashCode контракты. erasure.

    • Практика: профилировать цепочки map/filter для List vs Sequence; посмотреть влияние больших коллекций и промежуточных копий.

    День 2: Коллекции — «под капотом»
    • Реализуйте: параллельную загрузку по списку URL через async/awaitAll + отображение на UI.

    • Добавьте: supervisorScope, retry/backoff, withTimeout, отмена по событию UI, защита от двойного клика через Mutex/Semaphore.

    День 3: Корутины — параллельная загрузка
    • Помимо базовых компонентов, добавьте: схема слоев CA (Presentation/Domain/Data), интерфейсы репозиториев, один use case.

    • Практика: маленький модуль — ViewModel → UseCase → Repository → fake datasource; внедрите через Hilt/Koin.

    День 4: Android SDK, ЖЦ, Clean Architecture
    • View: показать, когда дергаются measure/layout/draw, чем requestLayout отличается от invalidate.

    • Compose: продемонстрировать цепочку state → recomposition → (re)measure/layout/draw, применить derivedStateOf, стабильные ключи в LazyColumn.

    День 5: UI View/Compose — фазы отрисовки и стейт
    • Включите в чек‑лист: нарушения equals/hashCode в ключах коллекций, лишние рекомпозиции из‑за мутабельных моделей, GlobalScope, блокирующие вызовы в suspend.

    • Объясняйте решения через принципы CA и последствия для тестирования и поддержки.

    День 6: Код‑ревью и архитектурные обоснования
    • Соберите демо: экран списка (Compose), загрузка данных параллельно (корутины), хранение состояния, слой UseCase/Repository, ошибки/ретраи.

    • Подготовьте устные ответы: почему CA, где переключаете диспатчеры, как избегаете лишних рекомпозиций, почему Sequence/почему нет.

    День 7: Итоговая мини‑работа
    • Kotlin inline и reified: docs.kotl.in → Inline functions; Reified type parameters.

    • Коллекции под капотом: официальные Kotlin docs + Java Collections Framework (Oracle), статьи о HashMap internals.

    • Coroutines: Structured concurrency, Cancellation, Exception handling, Channels/Flow (kotlinlang.org + Android Developers).

    • View rendering pipeline: Android Rendering and View Lifecycle (developer.android.com).

    • Compose state и recomposition: State and Jetpack Compose, Thinking in Compose, Performance best practices.

    Полезные материалы к добавленным темам
    • Лекции Школы мобильной разработки, Android — 2024 / перейти

    • Лекции Школы мобильной разработки — 2023 / перейти

    • Лекции Школы мобильной разработки — 2022 / перейти

    • Видеоэнциклопедия Android-разработки. Ф. Вальтер / перейти

    Видеоматериалы
    • Что важно знать:

      • понимать принципы отличия value и reference типов(ИЛИ понимать value и reference семантику, знать примеры value/ref типов), механизм Copy-on-Write для коллекций(понимать, что стандартные коллекции (Array, Dictionary, String) имеют семантику типа-значения (value semantics), а Copy-on-Write — это механизм оптимизации, который лежит в основе их эффективной работы)
      • знать, зачем нужны Optionals, правила их безопасного использования и разворачивания(владеть техниками безопасного разворачивания (if let, guard let, optional chaining, nil-coalescing operator ??) понимать, почему force unwrap (!) — плохая практика в большинстве случаев);
      • разбираться в основах работы с замыканиями, понимать разницу между escaping и non-escaping(знать примеры, когда использование @escaping обязательно).
    • Типичные проблемы:

      • поверхностное понимание разницы между value и reference (например, ошибки при работе с массивами классов и структур, неверные рассуждения о Copy-on-Write);
      • некорректное использование Optionals (force unwrap без проверки), путаница в ошибках компиляции и рантайма; формальное знание терминов (retain cycle), но слабое применение на практике (например, неумение определить, где он возникает).
      • Формальное знание термина @escaping, но неумение объяснить на практике, когда он необходим (например, в асинхронных операциях или при сохранении замыкания в свойство для последующего вызова).
    • Как практиковаться:

      • написать и сравнить два куска кода: с массивами структур и с массивами классов, отслеживать изменения при внесении данных по ссылке;
      • написать пример кода, который демонстрирует поведение Copy-on-Write для массива, и с помощью функции isKnownUniquelyReferenced проверить, когда происходит копирование
      • практиковать различные способы разворачивания Optionals (if let, guard let, optional chaining, ?? ); Попробовать написать функцию, которая принимает опциональное значение и безопасно с ним работает.
      • выполнять упражнения на понимание escaping: объяснить, где он нужен (например, при сохранении closure в свойствах класса).
    • Полезные ресурсы:

      • Hacking with Swift: Swift fundamentals / перейти

      • The Swift Programming Languages / перейти

      • книги и статьи, посвящённые основам языка и продвинутым концепциям.
    Язык Swift: основы синтаксиса, Optionals, Value/Reference semantics
    • Что важно знать:

      • механику ARC, различия между strong, weak и unowned ссылками;
      • жизненный цикл объектов, типичные ситуации возникновения retain cycles (например, два объекта, ссылающихся друг на друга (например, через делегаты)), и замыкание, захватившее self, которое хранится в свойстве этого же self;
      • возможные побочные эффекты при захвате (strong/weak) self и случаи использования [weak self].
    • Типичные проблемы:

      • неумение обнаружить цикл сильных ссылок в коде, несмотря на знание его определения
      • непонимание различий между weak и unowned (например, что weak всегда optional, а unowned требует гарантии существования объекта).
    • Как практиковаться:

      • нарисовать схему retain cycle между двумя классами через свойства и проанализировать, как это влияет на работу ARC(нарисовать схему взаимодействия двух классов, которые создают retain cycle. Проследить, как меняется счетчик ссылок);
      • использовать Memory Graph Debugger в Xcode для поиска retain cycles в проекте;
      • создать небольшое приложение с двумя классами, имеющими сильные ссылки друг на друга, и проверить, освобождается ли память после удаления объектов.
    • Полезные ресурсы:

      • Официальная документация про ARC / перейти

      • Swift Memory Management (Ray Wenderlich) / перейти

      • вебинары и видеокурсы на платформах вроде Pluralsight

    Управление памятью: ARC, retain cycles, ссылки
    • Что важно знать:

      • жизненный цикл UIViewController, различия между UIView и UIViewController, работу с view hierarchy и lazy loading;
      • механизм повторного использования ячеек в таблицах и коллекциях (register/dequeueReusableCell);
      • ограничения работы с UI (только из main thread). Уметь переключиться на главный поток из фонового (DispatchQueue.main.async)
      • различия между frame и bounds, роль методов setNeedsLayout, layoutIfNeeded и layoutSubviews.
    • Типичные проблемы:

      • краши или некорректное поведение из-за обращения к UI вне main thread;
      • непонимание механики register/dequeue, попытки ручного инстанцирования ячеек, что приводит к утечкам памяти и подтормаживаниям(непонимание механики dequeueReusableCell, что ведет к созданию лишних ячеек, утечкам памяти и тормозам при скроллинге);
      • неверные представления о жизненном цикле UIViewController и различиях между frame и bounds.
    • Как практиковаться:

      • Сверстать экран кодом: Создать простой экран полностью в коде, без Storyboard/XIB. Для позиционирования элементов использовать Auto Layout anchors и ручной подсчет фреймов(два альтернативных подхода).
      • создать проект с кастомной таблицей и ячейками, наблюдать за их переиспользованием и ставить точки останова(лучше: в методе cellForRowAt выводить в консоль адрес ячейки, чтобы наглядно увидеть, как они переиспользуются при скроллинге);
      • поэкспериментировать с переопределением pointInside и hitTest, чтобы увеличить область нажатия кнопки;
      • попробовать обращаться к subviews в конструкторе UIViewController и отслеживать, когда они становятся доступными.
    • Полезные ресурсы:

      • Официальная документация Apple по UIKit; / перейти

      • документация по обработке жестов в UIKit / перейти

      • видеоуроки и статьи на YouTube, например, плейлист по ссылке

    Работа с UI: UIKit и основы layout
    • Что важно знать:

      • View как struct: Понимать, что View в SwiftUI — это легковесная структура, а не класс. Они постоянно создаются и уничтожаются.
      • Управление состоянием (State Management):
      • Знать базовые property wrappers для управления данными:
        • @State — для локального, «приватного» состояния внутри View.
        • @Binding — для создания двусторонней связи с состоянием, которое «живет» в другом месте.
        • @StateObject / @ObservedObject — для работы с состоянием, вынесенным в отдельный класс (Reference Type).
        • @Binding — для создания двусторонней связи с состоянием, которое «живет» в другом месте.
      • Компоновка интерфейса: Знать базовые контейнеры для компоновки: VStack, HStack, ZStack.
      • Списки: Уметь создавать динамические списки с помощью List или ScrollView + ForEach.
      • Интеграция с UIKit: Знать, что SwiftUI и UIKit могут сосуществовать. Иметь представление о существовании UIViewRepresentable и UIViewControllerRepresentable для встраивания UIKit-компонентов в SwiftUI.
    • Типичные проблемы:

      • Попытка изменить UI «императивно», как в UIKit (например, найти кнопку и поменять ей цвет), вместо изменения состояния (@State), от которого зависит цвет.
      • Путаница в выборе property wrappers: использование @State там, где нужен @Binding, или непонимание разницы между @StateObject (создает и владеет объектом) и @ObservedObject (просто наблюдает за существующим).
    • Как практиковаться:

      • Создать простой экран (например, счетчик с кнопками «+» и «-») с использованием @State.
      • Разделить экран на два View: родительский (с @State) и дочерний. Передать состояние в дочерний View через @Binding.
      • Сверстать простой список элементов (например, контактов) с помощью List и ForEach.
    • Полезные ресурсы:

      • Apple SwiftUI Tutorials — лучший официальный старт / перейти

      • 100 Days of SwiftUI — бесплатный курс от Пола Хадсона / перейти

      • Официальная документация по SwiftUI / перейти

    Работа с UI: основы SwiftUI
    • Что важно знать:

      • основы многопоточности в iOS (main, serial, concurrent очереди, async/await);
      • GCD (Grand Central Dispatch):
        • Различать sync (блокирует текущий поток) и async (не блокирует).
        • Знать основные типы очередей: main (серийная, для UI), global (параллельные, для фоновых задач), кастомные serial/concurrent.
      • Modern Swift Concurrency:
        • Понимать синтаксис async/await и как он упрощает написание асинхронного кода (избавляет от «пирамиды ада» из колбэков).
        • Знать, что такое Task для запуска асинхронной работы и как TaskGroup помогает выполнять несколько задач параллельно.
      • что такое race conditions и deadlocks, как они возникают и как их избегать;
      • современный стек инструментов (async/await, Task, TaskGroup)
    • Типичные проблемы:

      • непонимание разницы между async и sync в GCD, например, возникновение deadlock при использовании main.sync в main thread;
      • неспособность объяснить, в каком потоке выполняется callback из сетевого запроса, если не гарантирован main thread(непонимание, в каком потоке будет выполнен completion блок асинхронной операции (например, сетевого запроса) и, как следствие, краши из-за обновления UI в фоновом потоке.);
      • поверхностные знания о race conditions без реального опыта их обнаружения.
    • Как практиковаться:

      • написать пример deadlock, используя main.sync внутри main.async в main thread;
      • реализовать длительную операцию в фоновом режиме (через GCD или global queue) и попытаться обновить UI — обратить внимание на возникающие ошибки и предупреждения;
      • Async/Await: Переписать код с «пирамидой колбэков» (например, загрузка данных -> их парсинг -> обновление UI) на async/await.
    • Полезные ресурсы:

      • GCD и основы многопоточности / перейти

      • Выпуски WWDC, посвящённые многопоточности и современным подходам к concurrency в Swift; / перейти

      • Официальная документация по Swift concurrency / перейти

      • Swift Concurrency by Example / перейти

    Многопоточность: GCD, OperationQueue, modern Swift Concurrency
    • Что важно знать:

      • Нужно знать две буквы:
        • S (Single Responsibility): У класса должна быть только одна причина для изменения. Главный пример — борьба с «Massive View Controller», когда сетевая логика, форматирование данных и управление UI свалены в одну кучу.
        • D (Dependency Inversion): Зависеть от абстракций (протоколов), а не от конкретных классов. Практическая реализация этого принципа — Dependency Injection (DI), то есть передача зависимостей (например, сетевого сервиса) в класс извне.
      • способы организации зависимостей без создания retain cycles (например, в связке View — Service — ViewController — замыкания);
      • основные антипаттерны в MVC (раздувание ViewController, tight coupling, god object).
      • Архитектурные паттерны:
        • MVC: Понимать роль каждого компонента (Model, View, Controller) и его главный недостаток в UIKit — склонность к «раздуванию» контроллера.
        • DMVVM: Иметь представление, что это такое и какую проблему MVC он решает (выносит логику и состояние из View Controller в ViewModel).
    • Типичные проблемы:

      • Весь код написан во ViewController (сетевые запросы, обработка данных и т.д.).
      • «Жесткое» создание зависимостей внутри класса (let networkService = NetworkService()), что делает код нетестируемым и негибким.
      • Неумение объяснить своими словами, что такое «принцип единственной ответственности» на примере ViewController.
    • Как практиковаться:

      • Провести простой рефакторинг: создать класс Model, в котором есть сетевой запрос, и вынести этот запрос в отдельный класс NetworkService.
      • Сделать следующий шаг: создать для NetworkService протокол и заставить Model зависеть от этого протокола, а не от конкретного класса. Передавать сервис в контроллер через инициализатор.
      • Написал тест на Model и написать мок для NetworkService
    ООП, SOLID, архитектура.** — если останется время
    • Что важно знать:

      • понимать и уметь объяснять сложность алгоритмов (O(N), O(1) и т. д.);
      • использовать стандартные коллекции, не изобретать собственные решения без необходимости;
      • уметь решать алгоритмические задачи, связанные с обработкой строк и массивов.
    • Практические задания:

      • решать задачи на LeetCode, уделяя внимание оценке сложности и использованию памяти;

      • практиковаться в решении задач на HackerRank и CodeSignal

      • изучать алгоритмы и структуры данных по книгам и онлайн-курсам, например, «Introduction to Algorithms» (Томас К. Кормен и др.).

    Алгоритмы и задачи
      • пройти базовые курсы на SwiftBook или HackingWithSwift

      • смотреть разборы собеседований на YouTube;

      • практиковать мини-проекты: работа с таблицами, layout, сетевыми запросами;

      • регулярно решать задачи на LeetCode;

      • просматривать выпуски WWDC, например, «What’s new in Swift» и «Modern concurrency in Swift»;

      • изучать официальную документацию Apple.

    Общие рекомендации
  • Полезные ссылки для подготовки
  • До интервью 1 неделя: план подготовки
    • Язык Swift: основы синтаксиса, Optionals, Value/Reference semantics.

      • освежить знания основ синтаксиса Swift, повторить базовые конструкции языка;
      • изучить и попрактиковать работу с Optionals: разобраться в правилах безопасного использования и разворачивания (if let, guard let, optional chaining, ??);
    • Теория:

      • Основы: синтаксис, типы данных.
      • Optionals: if let, guard let, ??, !.
      • Value/Reference семантика (struct vs class). Понятие Copy-on-Write.
      • Замыкания: синтаксис, @escaping.
    • Практика:

      • Написать функцию, которая безопасно работает с опционалами.
      • Написать два примера: с изменением массива структур и массива классов, чтобы увидеть разницу.
      • Объяснить вслух, в чем разница между struct и class.
    • Ресурсы:

      • Hacking with Swift, официальные туториалы по Swift.

    День 1–2
      • углубиться в понимание разницы между value и reference типами, попрактиковаться с массивами структур и классов;
      • выполнить упражнение: написать и сравнить два куска кода — с массивами структур и с массивами классов, отслеживать изменения при внесении данных по ссылке;
      • прочитать про механизм Copy-on-Write для коллекций.
    • Управление памятью: ARC, retain cycles, ссылки.

      • изучить механику ARC, различия между strong, weak и unowned ссылками;
      • ознакомиться с официальной документацией про ARC;
      • понять, как возникают retain cycles и как их избегать.
    • Теория:

      • ARC: strong, weak, unowned.
      • Retain Cycles: как возникают (делегаты, замыкания).
      • Принципы S и D из SOLID. Dependency Injection (DI).
      • Антипаттерн «Massive View Controller».
    • Практика:

      • Создать два класса с сильными ссылками, увидеть утечку через deinit, исправить с помощью weak.
      • Взять простой проект и вынести сетевой код из ViewController в отдельный NetworkService. Передать его в контроллер через инициализатор (это и есть DI).
      • Написать простой Unit-тест для этого сервиса с помощью «мока».
    День 3–4
    • UI и Многопоточность

      Теория:

      • Жизненный цикл UIViewController (viewDidLoad, viewWillAppear и т.д.).
      • UITableView и переиспользование ячеек (dequeueReusableCell).
      • Основы GCD: DispatchQueue.main.async, global(). Правило «UI обновляется в главном потоке».
      • Основы async/await: как более современная альтернатива GCD.
    • Практика:

      • Создать таблицу, которая загружает данные из сети.
      • Сначала сделать «неправильно»: выполнить сетевой запрос в главном потоке и увидеть, как UI «зависает».
      • Затем «исправить»: вынести запрос в фоновый поток (global queue или Task), а обновление таблицы (массива данных и tableView.reloadData()) вернуть в главный (main queue).
    День 5-6
      • попрактиковаться в использовании Memory Graph Debugger в Xcode для поиска retain cycles;
      • создать небольшое приложение с двумя классами, имеющими сильные ссылки друг на друга, и проверить, освобождается ли память после удаления объектов;
      • почитать Swift Memory Management (Ray Wenderlich).
    День 5
    • Работа с UI: UIKit и основы layout.

      • повторить жизненный цикл UIViewController, различия между UIView и UIViewController;
      • разобраться в механизме повторного использования ячеек в таблицах и коллекциях (register/dequeueReusableCell);
      • ознакомиться с официальной документацией по UIKit.
    День 6
      • посмотреть несколько видеоуроков на YouTube по теме UIKit и layout, например, из плейлиста;
      • начать проект с кастомной таблицей и ячейками, понаблюдать за их переиспользованием.
    • Многопоточность: GCD, OperationQueue, modern Swift Concurrency.

    Вечер дня 6
    • Повторить то, что изучали до этого, и отдохнуть перед собеседованием!

    Утро дня 7
      • каждый день выделять время на решение задач на LeetCode или HackerRank — это поможет держать ум в тонусе и улучшит алгоритмическое мышление;
      • просмотреть 1–2 выпуска WWDC, посвящённых темам, которые вызывают затруднения;
      • если остаётся время, уделить внимание принципам ООП, SOLID и архитектуре приложений — это добавит вам уверенности в понимании общей картины разработки.
      • Такой план позволит вам систематизировать знания и сосредоточиться на самых важных аспектах, которые часто проверяют на собеседованиях. Удачи в подготовке!
    Дополнительные рекомендации
  • До интервью 2 недели.
    Общая рекомендация — делать небольшой пет проект на 30-60 минут в день (например, приложение для поиска рецептов или фильмов), а теперь по дням!
    • Язык Swift: основы синтаксиса, Optionals, Value/Reference semantics.

      • тщательно повторить основы синтаксиса Swift, уделить внимание сложным конструкциям и нюансам языка;
      • подробно изучить работу с Optionals: все способы разворачивания, типичные ошибки и способы их избежать;
    • Ресурсы:

      • Hacking with Swift, официальные туториалы по Swift.

    День 1–2
      • глубоко разобраться в различиях между value и reference типами, понять механизм Copy-on-Write для коллекций;
      • выполнить ряд упражнений: сравнить поведение массивов со структурами и классами, попробовать вручную реализовать Copy-on-Write для собственного типа;
      • попрактиковать различные способы работы с массивами и другими коллекциями.
    День 3–4
    • Управление памятью: ARC, retain cycles, ссылки.

      • детально изучить механику ARC, разобраться в различиях между strong, weak и unowned ссылками;
      • ознакомиться с официальной документацией про ARC;
      • понять, как возникают и как устраняются retain cycles.
    День 5
      • активно использовать Memory Graph Debugger в Xcode для анализа и поиска retain cycles в проектах;
      • создать несколько приложений с разными сценариями использования ссылок, проверить, как ведёт себя память;
      • прочитать Swift Memory Management (Ray Wenderlich) и разобрать примеры.
    День 6-7
    • Работа с UI: UIKit и основы layout.

      • подробно разобрать жизненный цикл UIViewController, понять различия между UIView и UIViewController;
      • изучить механизмы работы с view hierarchy и lazy loading, разобраться в register/dequeueReusableCell;
      • ознакомиться с официальной документацией по UIKit и обработке жестов.
    День 8-9
      • посмотреть серию видеоуроков на YouTube по теме UIKit и layout, например, из плейлиста;
      • начать и завершить проект с кастомной таблицей и ячейками, понаблюдать за их 
      • переиспользованием, поэкспериментировать с pointInside и hitTest.
    День 10
    • Многопоточность: GCD, OperationQueue, modern Swift Concurrency.

      • глубоко изучить основы многопоточности в iOS, разобраться в различиях между main, serial, concurrent очередями;
      • ознакомиться с официальной документацией по Swift concurrency и GCD;
      • просмотреть выпуски WWDC, посвящённые многопоточности и modern concurrency.
    День 11-12
      • реализовать несколько задач с использованием GCD и modern Swift Concurrency, обновить UI из фонового потока;
      • пройти туториал по modern concurrency;
      • порешать задачи, связанные с многопоточностью, чтобы выявить и устранить пробелы в знаниях.
    День 13
    • Дополнительные темы: работа с коллекциями, ООП, SOLID, архитектура.

      • разобраться в различиях семантики value и reference для коллекций, понять типичные ошибки при копировании массивов;
      • прочитать материалы о работе с коллекциями на Hacking with Swift.
    День 14
      • изучить принципы ООП и SOLID, понять, как они применяются в iOS-разработке;
      • разобрать примеры чистой архитектуры для iOS, подумать, как разделить приложение на слои;
      • попробовать разработать простое приложение с учётом принципов SOLID.
    День 15
      • повторить ключевые моменты всех тем;
      • порешать задачи на LeetCode и HackerRank, чтобы освежить алгоритмическое мышление;
      • просмотреть ещё раз сложные моменты и темы, которые вызвали затруднения.
    День 16
      • каждый день выделять время на решение алгоритмических задач и практику кодирования;
      • вести заметки по сложным темам и регулярно их пересматривать;
      • участвовать в онлайн-сообществах и форумах, задавать вопросы, если что-то непонятно;
      • попробовать объяснить сложные концепции кому-нибудь (или самому себе вслух) — это поможет лучше усвоить материал.
    Дополнительные рекомендации
    • Лекции Школы мобильной разработки, Flutter — 2024 / перейти

    • Плейлисты DartUp — 2020 / перейти

    Видеоматериалы
    • Dart / перейти

    • Flutter / перейти

    • Блог didierboelens.com. Особенно рекомендуем статьи о дереве виджетов, асинхронном программировании в Dart и изолятах / перейти

    • Awesome Flutter / перейти

    • Основы управления состояниями во Flutter / перейти

    • Подходы по управлению состояниями / перейти

    Материалы

Начните карьеру со стажировки в Young&&Yandex

Больше половины стажёров получают офер и продолжают работу в Яндексе.
БЭКЕНД
DEVOPS
ML
тестирование
БЭКЕНД
DEVOPS
ML
тестирование
БЭКЕНД
DEVOPS
ML
тестирование
БЭКЕНД
DEVOPS
ML
тестирование
БЭКЕНД

FAQ

Будем на связи

Подписывайтесь на рассылку
Присоединяйтесь к телеграм-каналу
Mon Dec 01 2025 19:34:47 GMT+0300 (Moscow Standard Time)