Инженерный тур. 3 этап
Задание инженерного тура заключительного этапа максимально приближено к реальной разработке мобильных приложений, предоставляя участникам возможность испытать свои навыки в этой сфере.
В компании S контроль доступа в офис осуществляется с помощью СКУД (системы контроля управления доступом). На данный момент у каждого сотрудника есть карта-пропуск с NFC-меткой, а у каждой входной двери — считыватель с обеих ее сторон. При поднесении карты к считывателю дверь открывается, и информация о времени входа или выхода сотрудника фиксируется в базе данных.
Администрации компании S требуется мобильное приложение (как для рядовых сотрудников, так и для администрации) с возможностью просмотра посещений и работой электронного пропуска как временной замены обычного (при помощи сканировании QR-кода, который находится на считывателе). В приложении есть возможность использовать телефон как пропуск, поэтому к безопасности данных, находящихся внутри него, предъявляются повышенные требования.
Сервер и клиент разрабатываются на основе командного решения второго этапа.
Количество участников в команде: 2–3 человека.
Роли:
Android-разработчик: отвечает за разработку клиентской части программного продукта (Android-приложение), которое будет взаимодействовать с сервером. Необходимые hard-скиллы:
- Язык программирования: знание Java и/или Kotlin как основных языков для разработки приложений под Android.
- Android SDK: понимание и умение работать с Android Software Development Kit, включая библиотеки, инструменты и различные API, с помощью которых создаются нативные Android-приложения.
- Инструменты разработки: умение использовать Android Studio и Gradle для разработки, сборки и развертывания приложений.
- Архитектура приложений: знание архитектурных паттернов (MV*, Clean Architecture) для организации кода и улучшения его читаемости и поддерживаемости.
- Работа с данными: опыт работы с SQLite, библиотекой Room или другими базами данных, а также навыки работы с RESTful API и JSON для обмена данными с сервером.
- Тестирование: опыт написания unit-тестов с использованием соответствующих фреймворков для обеспечения надежности и стабильности кода.
UI/UX-дизайнер: проектирование интерфейса, создающего комфортный пользовательский опыт Android-приложения. Необходимые hard-скиллы (роли «Android-разработчик» и «UI/UX-дизайнер» могут совмещаться):
- Инструменты дизайна: умение работать с инструментами для создания дизайна и прототипов, такими как Figma или Sketch.
- Платформенные гайды: знание Android Material Design Guidelines или One UI, что позволяет создавать интерфейсы, соответствующие стандартам и рекомендациям платформы.
- Верстка интерфейсов: владение XML или библиотекой JetPack Compose для создания макетов пользовательского интерфейса и определения ресурсов.
- Инструменты для создания графики: владение Gimp и Inkscape или другими аналогичными растровыми и векторными редакторами для создания графических элементов и иконок, необходимых для приложений.
Бэкенд-разработчик: реализация серверной части программного продукта, которая будет предоставлять необходимую информацию Android-приложению. Необходимые hard-скиллы:
- Языки программирования: владение языками программирования, такими как Java, Kotlin или другими популярными языками, которые используются для написания серверной логики.
- Базы данных: знание реляционных баз данных (например, PostgreSQL, MySQL) и нереляционных баз данных (например, MongoDB), а также умение создавать запросы.
- API-разработка: опыт разработки и интеграции RESTful, включая создание и документирование эндпоинтов, а также обеспечение безопасности и производительности.
- Фреймворки и библиотеки: знание Spring Boot, который упрощает разработку серверной части и управление зависимостями в Spring-приложениях.
- Архитектура приложений: понимание принципов архитектуры приложений, включая микросервисную, модульную и монолитную архитектуру. Способность проектировать системы с учетом масштабируемости и отказоустойчивости. Знание архитектурных паттернов.
- Тестирование: опыт написания unit-тестов с использованием соответствующих фреймворков для проверки корректности серверной логики.
Тимлид (один из членов команды): координация работы команды, а также коммуницирование с организаторами профиля. Необходимые hard-скиллы:
- Обзорное представление обо всем, что описано выше.
- Управление проектами и Agile: опыт работы с инструментами управления проектами (JIRA, Kaiten). Умение знать и применять Agile-методологии (Scrum, Kanban).
В команде не может быть человека ТОЛЬКО с ролью тимлида, эта роль всегда совмещается с перечисленными выше ролями Android-разработчика, UI/UX-дизайнера, бэкенд-разработчика.
Рекомендации по взаимодействию в команде можно найти в мастер-классе Samsung Android Bootcamp 2025: https://vkvideo.ru/video-226950057_456239557?list=ln-MJ9lFnFzNXnSU4jA4n (для просмотра видео необходимо подписаться).
| Наименование | Описание |
|---|---|
| JDK 11 | Java Development Kit — все, что нужно для разработки на языке Java |
| JetBrains IntelliJ IDEA Community Edition Ladybug Feature Drop 2024.2.2 | Среда разработки на языке Java; для разработки бэкэнда |
| Android Studio Ladybug Feature Drop 2024.2.2 (minimum sdk 28, target sdk 34) и встроенным эмулятором | Среда разработки для Android; для разработки фронтэнда |
| Postman 11.31.4 | Приложение для работы с API |
| Insomnia 10.3.0 | Приложение для работы с API |
| MySQL 9.2.0 | СУБД |
| PostgreSQL 17.2 | СУБД |
| DBeaver Community 24.3.4 | Приложение с графическим интерфейсом для работы с СУБД |
| Docker Desktop | Приложение для контейнеризации |
| Git | Система контроля версий |
Системные требования к приложению:
- Минимальная версия ОС: Android 9.0 (API 28).
- Целевая версия ОС: Android 14 (API 34).
- Работоспособность приложения для платформ: mobile (смартфоны), tablet (планшеты).
- Поддерживаемая ориентация: портретная, альбомная.
- Поддержка языков: русский, английский.
- Разрешения: доступ к интернету, камера (только при необходимости).
Требуется доработать нативное мобильное приложение, которое было выполнено командой на втором этапе Олимпиады. За основу следует взять приложение предыдущего этапа, доработать его и добавить следующий функционал в экраны:
- Экран авторизации: доработать авторизацию, добавив поле пароля; при успешной аутентификации необходимо реализовать Basic-авторизацию.
Главный экран: дополнить прокручиваемым списком (на основе компонента RecyclerView), в каждом элементе которого содержится информация:
- время сканирования считывателя,
- идентификатор или название считывателя,
- тип прохода (карта или вход через смартфон).
- Экран администратора: разработать новый экран, доступ к которому будет только у пользователей с правами администратора; на нем должно содержаться поле ввода логина сотрудника (после успешного ввода он может просмотреть информацию о сотруднике), а также кнопка блокировки и разблокировки пропуска с помощью смартфона сотрудника.
Доработать сервер. Реализовать ролевую модель, разделив права доступа к эндпоинтам. Данные обо всех сотрудниках, с детализацией их посещений офиса, должны быть доступны только пользователям с ролью «Администратор». Остальные эндпоинты, кроме аутентификации, должны быть у всех авторизованных пользователей.
Сведения, необходимые для аутентификации и авторизации, сохраняются в базе данных. Пароль обязательно хранится в зашифрованном виде. Для реализации аутентификации и авторизации рекомендовано использовать Spring Security.
Серверное приложение должно быть развернуто и протестировано локально на одном из рабочих мест участников команды.
Оценка решения задачи проводится в два этапа:
- техническая экспертиза;
- защита перед жюри.
Оба этапа проходят по завершении работы над заданием. Техническая экспертиза заочно оценивает код представленного решения. На очной защите оценивается работоспособность приложения и его соответствие техническому заданию.
Критерии технической экспертизы представлены ниже.
| Название | Описание | Балл | |
|---|---|---|---|
| K1 | Нормализация данных в БД | Оценивается структура базы данных, ее соответствие принципам нормализации. Проверяется, избегаются ли дублирующиеся данные, эффективно ли используются связи между таблицами, а также грамотно ли выбраны типы данных для столбцов:
|
20 |
| К2 | Архитектура микросервиса | Оценивается модульность и согласованность компонентов микросервиса. Проверяется соблюдение принципов SOLID, четкое разделение слоев (Controller, Service, Repository) и использование Dependency Injection. Учитывается, насколько удобно расширять и модифицировать микросервис, а также соответствие архитектуры задачам. Дополнительным плюсом будет использование паттернов проектирования, таких как DTO, Factory, Builder и т. д.:
|
24 |
| К3 | Обработка исключений | Оценивается, насколько эффективно и полно обрабатываются возможные исключения. Проверяется, есть ли централизованный механизм обработки ошибок (например,
|
16 |
| К4 | Аутентификация и авторизация | Оценивается реализация безопасной аутентификации и авторизации, включая использование современных протоколов (например, JWT, OAuth2 или Basic). Проверяется корректность настройки цепочки фильтров безопасности (Spring Security):
|
16 |
| К5 | Реализация ролевой модели | Оценивается, насколько гибко и полноценно реализована ролевая модель в системе. Проверяется, существует ли разграничение прав доступа к ресурсам в зависимости от ролей, корректность проверки привилегий и удобство добавления новых ролей (плюсом считается наличие документации, описывающей права каждой роли, и тестов):
|
14 |
| К6 | Оптимизация | Оценивается оптимизация запросов к БД:
|
8 |
| К7 | Тесты | Более 30% логики покрыто unit-тестами. Подключены механизмы анализа покрытия кода тестами (например: JaCoCo):
|
2 |
| К8 | Объем самостоятельной работы | Оценка самостоятельной работы каждого участника | 0–100% |
Итоговый балл рассчитывается по формуле: \[(K1 + K2 + K3 + K4 + K5 + K6 + K7) \times K8.\]
Максимальный балл — 100.
| Название | Описание | Балл | |
|---|---|---|---|
| K1 | Наличие всех базовых элементов интерфейса | Приложение должно включать следующие интерфейсы:
|
10 |
| К2 | Основной функционал |
|
40 |
| К3 | Наличие дополнительного функционала (если К2 = 0 — не оценивается) |
Выбрать одно:
|
10 |
| К4 | UX-приложения | В приложении должны быть реализованы следующие механики:
|
5 |
| К5 | Архитектура |
|
6 |
| К6 | Код |
|
8 |
| К7 | Тесты | Более 30% логики покрыто unit-тестами | 7 |
| К8 | Использование технологий |
|
4 |
| К9 | Работоспособность приложения | Приложение работает и запускается без сбоев на всех поддерживаемых версиях Android: если да — полный балл, иначе — 0. | 10 |
| К10 | Объем самостоятельной работы | Оценка самостоятельной работы каждого участника | 0–100% |
Формула для расчета итогового балла: \[(K1 + K2 + \cdots + K8 + K9) \times K10.\]
Максимальный балл — 100.
| Название | Описание | Балл | |
|---|---|---|---|
| K1 | Соответствие UI-гайдлайнам | Экранные формы приложения выполнены в соответствии с гайдлайнами Material Design 3 / One UI:
|
15 |
| К2 | Основной функционал | Экранные формы полностью реализуют заявленный функционал:
|
10 |
| К3 | Единая визуальная стилистика и согласованность элементов | Экранные формы приложения:
|
5 |
| К4 | Качество проработки цветовой палитры и типографики | Выбрать одно:
|
5 |
| К5 | Использование графики и иллюстраций | Выбрать одно:
|
5 |
| К6 | Логичность и интуитивность навигации | Выбрать одно:
|
10 |
| К7 | Проработанность пользовательских сценариев | Выбрать одно:
|
5 |
| К8 | Удобство ввода данных и обработки ошибок | Выбрать одно:
|
5 |
| К9 | Адаптивность | Выбрать одно:
|
10 |
| К10 | Оптимизация производительности | Выбрать одно:
|
5 |
| К11 | Наличие и качество макета | Выбрать одно:
|
15 |
| К12 | Соответствие макетам | Выбрать одно:
|
10 |
| К13 | Объем самостоятельной работы | Оценка самостоятельной работы каждого участника | 0-100% |
Формула расчета итогового балла: \[(K1 + K2 + \cdots + K11 + K12) \times K13.\]
Максимальный балл — 100.
Ссылка с исходным кодом: https://gitnto.innovationcampus.ru/Bugdroid/Bugdroid-Back.
Серверная часть реализована с использованием Spring Boot. Написанный микросервис обернут в Docker-контейнер. Все миграции БД осуществляются при помощи liquibase, что при необходимости позволяет легко перенести схему и данные из одной базы в другую. В качестве основной реляционной СУБД выбрана PostgreSQL. Серверная часть, реализованная backend-разработчиком, полностью удовлетворяет ТЗ финального этапа.
В разработанной схеме база данных (далее БД) все данные атомарны и исключены транзитивные зависимости. Корректно расставлены связи между таблицами.
Код серверной части грамотно разделен на три слоя:
- Controller,
- Service,
- Repository.
Используются принципы SOLID.
Существует разделение на сущности (классы слоя работы с БД) и DTO (классы слоя общения с клиентской частью).
Описанное выше позволяет легко модифицировать и расширять полученное решение.
Реализована централизованная обработка ошибок, возникающих на стороне сервера.
Созданы кастомные исключения, что показывает осознанное принятие решения об обработке исключительных ситуаций.
Все исключения содержат точное описание, которое позволит на стороне клиентской части сформировать понятное пользователю сообщение об ошибке.
В качестве аутентификации и авторизации выбрана Basic Spring Security.
Данные о пользователе хранятся в базе в зашифрованном виде.
Реализовано разделение ролей (USER, ADMIN).
Роли вынесены в отдельную таблицу БД, что упрощает расширение ролевой модели в случае необходимости.
Реализована пагинация, что позволяет осуществить постраничную выгрузку данных.
В проекте написаны интеграционные тесты, которые проверяют все три слоя (Controller, Service, Repository).
Присутствует Swagger-документация с расширенным описанием API.
Ссылка с исходным кодом: https://gitnto.innovationcampus.ru/Bugdroid/Bugdroid-Front.
Android приложение реализовано на языке Kotlin с использованием технологий:
- XML для создания верстки;
- RecyclerView для отрисовки списков;
- Paging 3 для реализации пагинации;
- Ktor client для реализации клиент-серверного взаимодействия.
Проект разделен на слои: data, domain, ui (presentation), что позволяет масштабировать его в дальнейшем и соответствует современным стандартам индустрии в архитектуре Android-приложений.
Согласно техническому заданию, команда успешно выполнила:
- авторизацию с паролем и применила ее для всех запросов в приложении;
- постраничную загрузку списка с информацией о последних входах, в котором было обработано сохранение состояния позиции, а также наличие всей информации, согласно техническому заданию; элементы переиспользовались;
- экран администратора, на котором есть возможность осуществить поиск сотрудника по логину с возможностью блокировки пропуска.
Интерфейс пользователя
Разработанное приложение полностью соответствует требованиям по наличию всех базовых элементов интерфейса. Экран авторизации предоставляет понятный интерфейс для входа с использованием логина и пароля. Главный экран реализует отображение списка проходов с использованием RecyclerView, а встроенный функционал сканирования QR-кода обеспечивает основной механизм идентификации пользователей. Все элементы интерфейса логично связаны между собой, имеют единообразный дизайн и обеспечивают интуитивно понятную навигацию.
Авторизация и безопасность
Команда реализовала механизм Basic-авторизации, который применяется ко всем сетевым запросам в приложении. Система авторизации также интегрирована с функционалом разграничения доступа, что позволяет корректно определять и ограничивать возможности обычных пользователей и администраторов.
Список проходов и работа с данными
Одной из сильнейших сторон проекта является эффективная реализация списка проходов с использованием технологии Paging 3. Этот подход обеспечивает оптимизацию сетевого трафика и памяти устройства благодаря загрузке только необходимых данных при прокрутке списка.
Команда позаботилась о сохранении позиции прокрутки при смене конфигурации устройства, что значительно улучшает пользовательский опыт. Все элементы списка содержат полную информацию в соответствии с требованиями (время сканирования, идентификатор считывателя, тип прохода) и эффективно переиспользуются благодаря правильной реализации адаптера RecyclerView.
Функциональность администратора
Экран администратора реализует все необходимые функции согласно техническому заданию. Интерфейс позволяет осуществлять поиск сотрудников по логину и предоставляет доступ к информации о каждом пользователе.
Особенно стоит отметить функциональность блокировки и разблокировки пропуска, которая не только изменяет статус в системе, но и корректно обрабатывается при последующих попытках сканирования QR-кода.
Реализована также защита от несанкционированного доступа — раздел администратора визуально скрыт для обычных пользователей, что повышает безопасность и улучшает пользовательский опыт.
Обработка ошибок и сетевых проблем
Приложение демонстрирует высокий уровень устойчивости к сбоям благодаря продуманной системе обработки ошибок. На экране авторизации выводятся сообщения в случае проблем с входом. Реализована корректная обработка отсутствия интернет-соединения как на главном экране.
Архитектура и код
В архитектуре приложения применен паттерн MVVM, что обеспечивает четкое разделение бизнес-логики и пользовательского интерфейса. Это решение существенно упрощает тестирование и дальнейшую поддержку кода.
Команда правильно выстроила зависимости между слоями, что минимизирует связанность компонентов. Код хорошо декомпозирован на классы и методы с четким разделением ответственности.
Весь проект написан с использованием современных библиотек и API, без применения устаревших решений, что обеспечивает производительность и совместимость с новыми версиями Android.
Буткемпы IT-школы
- Буткемп IT школы Samsung 2023 г. [Электронный ресурс]: видеокурс / YouTube. — URL: https://www.youtube.com/playlist?list=PLa2T1zmZ6w5IEH3toqEA8wXPXzvNhkmQ2.
- Буткемп IT-школы Samsung 2024 г. [Электронный ресурс]: видеокурс / YouTube. — URL: https://www.youtube.com/playlist?list=PLa2T1zmZ6w5LvGpFM9whAqkHB9Iq38cSn.
Курс по Java
- Курс по Java [Электронный ресурс]: обучающие материалы / Яндекс.Диск.
- Модуль 1. — URL: https://disk.yandex.ru/i/w6y7vcEfpygzZg.
- Модуль 2. — URL: https://disk.yandex.ru/i/TR4Ubr1HWkqqMw.
- Модуль 3. — URL: https://disk.yandex.ru/i/n1U7ISb6EzZ6_w.
- Модуль 4. — URL: https://disk.yandex.ru/i/CbXW6VygzLqeaQ.
- Модуль 5. — URL: https://disk.yandex.ru/i/X9nuXVJG5eLakw.
- Модуль 6. — URL: https://disk.yandex.ru/i/WP3gV5nBb4ksvg.
- Модуль 7. — URL: https://disk.yandex.ru/i/OIO-L5ZPQ74_Rg.
- Модуль 8. — URL: https://disk.yandex.ru/i/nWrw9nYtdX-Crg.
- Модуль 9. — Ч. 1: https://disk.yandex.ru/i/01C71e2PKx2Htw; Ч. 2: https://disk.yandex.ru/i/mQHYwTy12aHC-A.
- Модуль 10. — URL: https://disk.yandex.ru/i/RfmOYylnVr3RhQ.
- Модуль 11. — URL: https://disk.yandex.ru/i/Pg0bhPANFsjtKQ.
Курс по Spring Framework
- Курс по Spring Framework [Электронный ресурс]: обучающие материалы / Яндекс.Диск.
- Модуль 1. — Ч. 1: https://disk.yandex.ru/i/q4Df2mH-0KI2Ug; Ч. 2: https://disk.yandex.ru/i/gb2RK9L7BOC89w.
- Модуль 2. — Ч. 1: https://disk.yandex.ru/i/E34JfcAK8nA4Vw; Ч. 2: https://disk.yandex.ru/i/9TNQ8D5V3cPjrg.
- Модуль 3. — Ч. 1: https://disk.yandex.ru/i/-pBq185elh1a9Q; Ч. 2: https://disk.yandex.ru/i/3WpYIOxD-26GiQ.
- Модуль 4. — Ч. 1: https://disk.yandex.ru/i/Yn5EWPLotD7EPg; Ч. 2: https://disk.yandex.ru/i/wJR4SB2fVxMhLA; Ч. 3: https://disk.yandex.ru/i/UgHtBE-hS64Img.
- Модуль 5. — Ч. 1: https://disk.yandex.ru/i/YnjoEBPRF9htHQ; Ч. 2: https://disk.yandex.ru/i/5_V2B5qIimFyJg.
- Модуль 6. — URL: https://disk.yandex.ru/i/hM_Jhiw2OZw0CA.
- Модуль 7. — Ч. 1: https://disk.yandex.ru/i/840Kmro-SBRK_Q; Ч. 2: https://disk.yandex.ru/i/_ASfB9ZxtMnADA; Ч. 3: https://disk.yandex.ru/i/Q0UXf700ycN8zQ.
Курсы по Kotlin
- Kotlin Bootcamp for programmers [Электронный ресурс]: онлайн-курс / Android Developers. — URL: https://developer.android.com/courses/kotlin-bootcamp/overview.
- Developing Android Apps with Kotlin [Электронный ресурс]: онлайн-курс / Udacity. — URL: https://www.udacity.com/course/developing-android-apps-with-kotlin--ud9012.
