В 2022 г. осенью я решил, что я хочу поменять профессию и стать Android-разработчиком. К тому моменту я имел более 6 лет опыта работы в области охраны труда, в основном, на производственных предприятиях.
Мой друг в тоже время начал учиться на курсах Яндекс Практикума, также на Android-разработчика и объяснил как устроено обучение. Я начал обучение в Практикума в конце октября 2022 г. и закончил его в декабре 2023 г.
Это было непростое время. Я приезжал на работу каждый день к 7:00 и тратил 2 часа на обучение, после начинался мой рабочий день. После работы я приезжал домой, ужинал и остаток времени до сна я посвящал обучению.
В декабре 2023 г. я решил, что я готов начинать искать полноценную работу Android-разработчиком. Я откликался только на те вакансии, в которых было написано, что не требуется опыт. Если кратко: 19 откликов (сюда не входят отклики на стажировки крупных компаний), 5 тестовых заданий, 3 оффера. Из 3 офферов: от одного я отказался из-за условий (черная небольшая з/п, я – единственный андроид-разработчик и т.п.).
Первый адекватный оффер я принял и перед выходом на него я получил второй оффер. В итоге на месте по первому офферу я проработал 2,5 дня (с 01 апреля по 03 апреля 2024 г.) и по собственному желанию ушёл в компанию приславшую второй оффер.
Возможно позже я напишу про обучение на курсах Практикума и о дополнительном самостоятельном обучении, но сейчас я бы хотел написать про тестовые задания, которые я выполнял.
-
Два списка с табами на Compose. 2 запроса данных с сети
Stack: Kotlin, MVVM, Realm, Ktor, Coroutines, LiveData, Jetpack Compose + Material Design (Jetpack Сompose обязательно, хорошо если xml знаете)
Описание:
-
Сохранение данных в БД;
-
Изменение (имя) производим в БД;
-
При открытии раздела если в базе данных нет, то делаем запрос на сервер, если данные в базе есть, то отображаем их + функция принудительного обновления через PullRefresh.
Это задание смотивировало попробовать Ktor и Realm. В целом задание, я считаю, хорошее для джуновской вакансии. Тут и не совсем стандартные инструменты (Ktor и Realm), и хороший объём – не много и не мало, достаточно, чтобы оценить код начинающего разработчика. Я также дополнительно реализовал добавление в избранное (звездочка на макетах).
На это выполненное задание я не получил никакого ответа.
-
-
Список карточек компаний на Compose с показом всплывающего сообщения при клике.
Stack: Compose, Coil для загрузки изображений, Jetpack Compose Navigation, AndroidX Paging3 для пагинации и базу данных AndroidX Room для кэширования карт компаний, Retrofit. Приложение должно соответствовать ахитектурному паттерну MVVM и реализовывать внедрение завимостей (DI). В качестве фреймворка для этого необходимо использовать Koin.
Достаточно подробное описание, также были в презентации powerpoint указаны все размеры отступов и текста, картинки .png.
Я получил приглашение на собеседование и на собеседовании оффер, но отказался.
-
Самое сложное тестовое задание, которое я выполнял.
Выполненное задание и подробное описание задачи есть у меня на гитхаб.
Был дан репозиторий с приложением и нужно было выполнить задание – добавить второй экран со списком, чтобы пользователь мог выбрать для каждого элемента списка первого экрана элемент списка второго.
В приложении использовался Decompose, и оно отличалось по структуре от тех приложений, которые я видел до этого. В задании также была дана ссылка на открытый проект главного андроид приложения (что очень помогло). Идея задачи, как я её понял, была хранить данные только во вью модели, чтобы пережить изменение конфигурации. В общем я решил, сделать больше описанного в задании (как я всегда старался делать выполняя каждое из заданий) и сделал сохранение в базе данных, причём базу данных я сделал по аналогии с кодом из основного приложения: я сделал 2 отдельных модуля базы данных api и impl.
Выполнение задания, вместе с изучением decompose, заняло около 10 дней.
В результате со мной связался hr задал пару вопросов и предложил встречу. Пообещал вернуться с предполагаемыми датами.
Но дальше что-то пошло не по плану и мне пришло вот такое сообщение:
Пришел ответ по вашему тестовому, и к сожалению на данный момент мы не готовы предложить пройти техническое интервью, так как тестовое задание оказалось слабее, чем мы ожидали.
Мне очень жаль и я желаю найти самую лучшую команду! Фидбек от технической команды, как мы и обещали прикладываю:
-
Повторяется два раза версия Kotlin в version catalog
-
Цвет статус бара и боттом бара меняется программно во время рекомпозиции, что может нестабильно работать в случае перехода между страницами в разных конфигурациях, тут ожидалось использовать edge to edge и рисовать статусбары на экране
-
Зависимости указаны в settings.gradle.kts отличным способом от того что используется в проекте
-
Добавлен ненужный "androidDynamicFeature"
-
Пустые тесты, в которых не было необходимости" (я не удалил автоматически создаваемы в новых модулях тестовые директории)
Это меня на тот момент сильно расстроило. Я не понял фидбек от технической команды, все перечисленные моменты мне казались не настолько серьёзными недочётами для разработчика без опыта (а я напомню откликался только на вакансии без требования к опыту и честно отвечал, что я такого опыта не имею). Тогда я подумал, что возможно у меня не получится ничего со сменой рода деятельности, т.к. на дворе был март, а это значит шёл третий месяц поиска работы. Я устал физически: я работал, мониторил вакансии и откликался на них, готовился к собеседованиям и выполнял тестовые задания.
-
-
Показать список ресторанов на карте
Описание: Необходимо написать приложение, которое отображает на карте список ресторанов в округе № 87 Санкт-Петербурга, а также реализовать возможность посмотреть более подробную информацию о каждом месте. сервис для получения данных.
Можно использовать любой удобный SDK карт. Все решения по UI/UX на усмотрение
кандидата, в том числе отображение деталей ресторана (можно сделать как
отдельный экран, так и, например, Bottom sheet). -
Требования к коду:
-
соблюдение Clean Architecture
-
применение паттерна MVVM,
-
использование StateFlow в presentation слое.
Рекомендуемый стек:
-
UI: Views
-
Работа с сетью на выбор: Retrofit, OkHttp, (бонус за выбор Ktor + Serialiazation)
-
DI: Hilt
-
Kotlin Coroutines
Я получил приглашение на собеседование и в дальнейшем оффер, который принял (тот самый на который я ушёл из компании, в которой принял первый оффер).
-
-
Тестовое на стажировку в ВК
У меня, к сожалению, не сохранилось оригинального описания поэтому я напишу, как помню.
Описание: сделать простое приложение по хранению паролей, пароли должны храниться в зашифрованном виде.
Stack: нет требований.
На мой взгляд – это моё самое качественно выполненное тестовое задание (и последнее). Я сделал многомодульный проект с отдельным модулем для шифрования с Android Key Store.
Мне настолько понравился результат, что в конечном счёте (на январских праздниках после длительного перерыва) я доделал приложение и в феврале 2025 загрузил первую версию в RuStore – называется Менеджер паролей PassMan (название PassMan было уже занято).
Какие выводы я сделал для себя:
Делать больше, чем указано в задании – работает не всегда, и иногда воспринимается как отхождение от требований.
Качественно выполненное задание не гарантирует приглашения на собеседование, но сильно увеличивает шансы.
Выполнять максимальное количество тестовых заданий для поиска первой работы – сложный, но рабочий способ.
Автор: bm9