search icon search icon ВЕРСИЯ ДЛЯ СЛАБОВИДЯЩИХ

Инженерный тур. 1 этап

В профиле Разработка мобильных приложений через всю Олимпиаду проходит «Деловая Стажировка». Итак, представим, что участник Олимпиады хочет летом попасть на стажировку в компанию S-Mobile на должность Android-разработчика, а для этого ему предстоит пройти конкурсный отбор. Отбор будет состоять из двух этапов: индивидуальное собеседование и практическое задание.

Вначале предстоит пройти индивидуальное собеседование. У компании S-Mobile есть свой онлайн-магазин с названием S-Store. Кандидату на должность предстоит разобраться в его устройстве и ответить на вопросы. Начнем...

SQL

Любой онлайн-магазин обязательно хранит много информации: о товарах, продавцах, покупателях и многом другом. Такая информация чаще всего содержится в реляционной базе данных. В нашем случае — в базе данных SQLite. Дан фрагмент схемы базы данных магазина S-Store: https://drawsql.app/teams/myteam-1108/diagrams/e-store-database.

Задача: продемонстрировать навыки работы с реляционной базой данных с помощью SQL (https://en.wikipedia.org/wiki/SQL), а именно, базовые CRUD-операции (https://en.wikipedia.org/wiki/Create,_read,_update_and_delete).

Задача 1.1.(1 балл)
Запрос на выборку данных. Перетаскивание
Тема: SQL

Условие

Составьте SQL-запрос на выборку названия товара с первичным ключом, равным 5.

Элементы для заполнения пропусков: SELECT, UPDATE, INSERT, FROM, WHERE, name, products, id, 5.

products.

.id =

Решение

Запрос на выборку осуществляется с помощью команды SELECT.

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

Указания условий, которым должны удовлетворять выбираемые записи, осуществляется с помощью ключевого слова WHERE.

Таким образом, запрос должен выглядеть так:
SQL
    SELECT products.name
    FROM products
    WHERE products.id = 5
Задача 1.2.(10 баллов)
Запрос на выборку данных. Ввод текста
Тема: SQL

Условие

Определите количество товаров с ценой в диапазоне от A до B.

Решение

Запрос на выборку осуществляется с помощью команды SELECT.

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

Указания условий, которым должны удовлетворять выбираемые записи, осуществляется с помощью ключевого слова WHERE.

Для объединения условий используются логические операции AND, OR, NOT.

Таким образом, запрос может выглядеть так:
SQL
SELECT *
FROM products
WHERE products.price >= A AND products.price <= B

После этого можно посчитать количество строк, которые вернул запрос.

Также можно воспользоваться агрегирующей функцией COUNT. Тогда запрос будет выглядеть так:
SQL
SELECT COUNT(*)
FROM products
WHERE products.price >= A AND products.price <= B
Задача 1.3.(10 баллов)
Запрос на добавление данных. Ввод и выполнение запроса
Тема: SQL

Условие

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

  • Название продукта: NAME (задается случайно).
  • Описание продукта: DESC (задается случайно).
  • Цена: PRICE (задается случайно).
  • Категория товара: CATEGORY_NAME (задается случайно).

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

Решение

Вначале необходимо узнать первичный ключ категории товара, для этого можно воспользоваться запросом:
SQL
SELECT *
FROM CATEGORY_NAME
WHERE name = CATEGORY_NAME

Здесь уточнение условий, которым должны удовлетворять выбираемые записи, осуществляется с помощью ключевого слова WHERE.

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

Значения полей указывается после команды VALUES.

SQL
INSERT INTO product (name, description, price, category_id)
VALUES(NAME, DESC, PRICE, category_id);
Задача 1.4.(10 баллов)
Запрос на обновление данных. Ввод и выполнение запроса
Тема: SQL

Условие

Составьте SQL-запрос на изменение в базе данных цены продукта, который создали в прошлом задании. Новая цена продукта должна стать NEW_PRICE.

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

Решение

Запрос на обновление данных осуществляется с помощью команды UPDATE.

Поля и их новые значения указываются после команды SET.

Указания условий, которым должны удовлетворять обновляемые записи, осуществляется с помощью ключевого слова WHERE.
SQL
UPDATE products
SET price = NEW_PRICE
WHERE id = ID
Задача 1.5.(10 баллов)
Запрос на удаление данных. Ввод и выполнение запроса
Тема: SQL

Условие

Составьте SQL-запрос на удаление из базы данных продукта, который создали ранее в задаче 1.3.

Решение

Запрос на удаление данных осуществляется с помощью команды DELETE FROM.

Указания условий, которым должны удовлетворять обновляемые записи, осуществляется с помощью ключевого слова WHERE.
SQL
DELETE FROM product
WHERE id = ID
JSON

Бэкенд онлайн-магазина S-Store предоставляет данные клиентскому Android-приложению в формате JSON (https://en.wikipedia.org/wiki/JSON). Поэтому следующий блок вопросов нашего собеседования будет посвящен именно этому стандарту обмена данными.

Задача 2.1.(1 балл)
JSON продукта. Перетаскивание
Темы: JSON, SQL

Условие

Представьте информацию о товаре с ID, равным 70, из базы данных в формате JSON.

Элементы для перемещения: 1, 2, name, inventory_id, 799.99, 899.99, 2024-08-09T12:00:00, created_at, 2025-08-09T12:00:00.

 

{
  "___": 70,
  "___": "Smartphone XYZ",
  "description": "Latest model with advanced features.",
  "SKU": "ELEC-001",
  "category_id": 1,
  "___": 1,
  "price": ___,
  "discount_id": null,
  "___": "___",
  "modified_at": "2024-08-09T12:00:00"
}

Решение

Получаем информацию аналогично решению в задании 1.1 и составляем JSON этого объекта.

Ответ

{
    "id": 70,
    "name": "Smartphone XYZ",
    "description": "Latest model with advanced features.",
    "SKU": "ELEC-001",
    "category_id": 1,
    "inventory_id": 1,
    "price": 799.99,
    "discount_id": null,
    "created_at": "2024-08-09T12:00:00",
    "modified_at": "2024-08-09T12:00:00"
}
Задача 2.2.(5 баллов)
JSON продукта. Ввод JSON
Темы: JSON, Kotlin

Условие

Android-приложение S-Store написано на языке программирования Kotlin с использованием Android SDK. Ниже представлен data-класс, представляющий ИМЯ_СУЩНОСТИ (рандомно). Составьте JSON-описание, соответствующее этому классу. Значения свойств задать произвольно.

Пример одного из вариантов.

Kotlin
data class User(
    val id: Int,
    val username: String?,
    val password: String?,
    val firstName: String?,
    val lastName: String?,
    val telephone: Int?,
    val createdAt: LocalDateTime?,
    val modifiedAt: LocalDateTime?,
    val createdBy: Int
)

Решение

В соответствии с кодом класса выбираем необходимые типы данных и составляем JSON.

Ответ

{
  "id": 1,
  "username": "johndoe",
  "password": "securepassword123",
  "firstName": "John",
  "lastName": "Doe",
  "telephone": 1234567890,
  "createdAt": "2024-08-09T12:00:00",
  "modifiedAt": "2024-08-09T12:30:00",
  "createdBy": 100
}
Задача 2.3.(5 баллов)
Класс из JSON. Ввод кода класса
Темы: JSON, Java

Условие

Бэкенд магазина разработан на языке Java с использованием фреймворка Spring Boot. Вот JSON, представляющий ИМЯ_СУЩНОСТИ (задается случайно). Составьте класс на языке программирования Java, соответствующий этому JSON. Все поля должны быть с модификатором доступа private. Каждому полю должен соответствовать getter и setter с модификатором доступа public.

Далее пример одного из вариантов.

{
  "id": 1,
  "username": "johndoe",
  "password": "securepassword123",
  "firstName": "John",
  "lastName": "Doe",
  "telephone": 1234567890,
  "createdAt": "2024-08-09T12:00:00",
  "modifiedAt": "2024-08-09T12:30:00",
  "createdBy": 100
}

Решение

В соответствии с кодом JSON выбираем необходимые типы данных и составляем код класса на языке Java.

Ниже представлено решение на языке Java.

Java
public class User {

    private int id;
    private String username;
    private String password;
    private String firstName;
    private String lastName;
    private Integer telephone;
    private LocalDateTime createdAt;
    private LocalDateTime modifiedAt;
    private int createdBy;

    // Default constructor
    public User() {
    }

    // Constructor with all fields
    public User(int id, String username, String password, String firstName, String lastName, Integer telephone, LocalDateTime createdAt, LocalDateTime modifiedAt, int createdBy) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
        this.telephone = telephone;
        this.createdAt = createdAt;
        this.modifiedAt = modifiedAt;
        this.createdBy = createdBy;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getTelephone() {
        return telephone;
    }

    public void setTelephone(Integer telephone) {
        this.telephone = telephone;
    }

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(LocalDateTime createdAt) {
        this.createdAt = createdAt;
    }

    public LocalDateTime getModifiedAt() {
        return modifiedAt;
    }

    public void setModifiedAt(LocalDateTime modifiedAt) {
        this.modifiedAt = modifiedAt;
    }

    public int getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(int createdBy) {
        this.createdBy = createdBy;
    }

    // toString method
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", telephone=" + telephone +
                ", createdAt=" + createdAt +
                ", modifiedAt=" + modifiedAt +
                ", createdBy=" + createdBy +
                '}';
    }
}
Запросы на сервер

Бэкенд магазина S-Store предоставляет клиентскому Android-приложению API. По ссылке можно найти Swagger (https://en.wikipedia.org/wiki/Swagger_(software)) документацию API для работы с пользователями. Изучив документацию, составьте HTTP-запросы, которые реализуют CRUD-операции. Эти запросы можно составлять и отправлять, например, с помощью Postman: https://www.postman.com.

Задача 3.1.(1 балл)
Запрос получение данных. Ввод текста
Тема: API

Условие

Составить HTTP-запрос на выборку пользователя с первичным ключом, равным ID (задается случайно). В качестве ответа укажите фамилию пользователя.

Решение

Анализируем документацию API, находим соответствующий запрос и составляем его.

Ответ

Зависит от случайно сгенерированного параметра ID.

Общий ответ для всех вариантов:

ФАМИЛИЯ

Например, если ID=1, то ответ будет:

Doe

Задача 3.2.(10 баллов)
Запрос на добавление данных. Ввод и выполнение запроса
Тема: API

Условие

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

  • Название продукта: name.
  • Описание продукта: desc.
  • Цена: price.
  • Категория товара: category_name.

Решение

Анализируем документацию API, находим соответствующий запрос, составляем его и отправляем с помощью Postman.

Критерии оценивания

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

Задача 3.3.(10 баллов)
Запрос на обновление данных. Ввод и выполнение запроса
Тема: API

Условие

Измените в базе данных контактный телефон пользователя, который создали в задаче 3.2. Новый телефон должен стать new_telephone (рандомно).

Решение

Анализируем документацию API, находим соответствующий запрос, составляем его и отправляем с помощью Postman.

Критерии оценивания

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

Задача 3.4.(10 баллов)
Запрос на удаление данных. Ввод и выполнение запроса
Тема: API

Условие

Удалите из базы данных пользователя, которого создали ранее в задаче 3.2.

Решение

Анализируем документацию API, находим соответствующий запрос, составляем его и отправляем с помощью Postman.

Критерии оценивания

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

IDE, гит, анализ ошибки
Задача 4.1.(1 балл)
Ввод github аккаунта. Ввод текста
Тема: git

Условие

Составить HTTP-запрос на выборку пользователя с первичным ключом, равным id (задается случайно). В качестве ответа укажите фамилию пользователя.

Критерии оценивания

Проверяется автоматически, что в профиле пользователя заполнено нужное поле и оно содержит ссылку на github-аккаунт.

Задача 4.2.(0 баллов)
Клонирование репозитория
Тема: git

Методика проверки

Баллы не зачисляются.

Условие

Склонируйте ветку BRANCH_NAME (задается случайно) репозитория, в котором находится код мобильного приложения S-Store в свой аккаунт и откройте код в Android Studio.

Критерии оценивания

Данное задание не проверяется и не оценивается. Это руководство к действию.

Задача 4.3.(5 баллов)
Анализ ошибки. Выбор пропущенных слов
Тема: анализ кода

Условие

Попробуем запустить приложение. Очевидно, что программа завершилась ошибкой. Так и было задумано!

При программировании под Android ошибки можно увидеть в специальном журнале (LogCat). По нему программист определяет, какая произошла ошибка и в какой строке.

Укажите файл, строку, в которой произошла ошибка и вид ошибки.

Ошибка содержалась в файле (MainActivity.kt, AndroidManifest.xml, buil.gradle.kts) в строке (одно число).

Причиной этого стало (арифметическая операция, переполнение стека, нехватка памяти, зависание программы, обращение к несуществующему объекту).

Решение

В зависимости от BRANCH_NAME, которую надо было клонировать, возможны разные ошибки.

Ответ

Ошибка содержалась в файле MainActivity.kt в строке 34. Причиной этого стало (арифметическая операция, переполнение стека, нехватка памяти, зависание программы, обращение к несуществующему объекту).

XML

Android SDK активно использует XML для хранения различных данных приложения, например, разметку интерфейса, темы интерфейса, систему навигации, иконки, строковые ресурсы, информацию, которую приложение предоставляет операционной системе Android (манифест приложения) и многое другое. В этом блоке нужно найти в xml-файлах приложения S-Store необходимую информацию о приложении.

Задача 5.1.(1 балл)
Разрешения приложения. На соответствие
Тема: xml

Условие

Определите, какие разрешения может запросить у операционной системы приложение S-Store. В качестве ответа сопоставьте название разрешения с его описанием. Если разрешение отсутствует в манифесте, укажите это.

Варианты зависят от BRANCH_NAME, которую нужно было клонировать. Здесь представлен вариант для ветки BRANCH_NAME=var1.

Разрешения Варианты описания разрешений (порядок в учебной системе будет рандомный)
BLUETOOTH Позволяет приложениям подключаться к сопряженным устройствам Bluetooth
ACCESS_NETWORK_STATE Позволяет приложениям получать доступ к информации о сетях
ACTIVITY_RECOGNITION Позволяет приложению распознавать физическую активность
INTERNET Позволяет приложениям открывать сетевые сокеты
READ_CONTACTS Позволяет приложению считывать контактные данные пользователя
Разрешение отсутствует в манифесте

Решение

Надо открыть файл манифеста и определить, какие разрешение запрашивает приложение. В разных BRANCH_NAME будут разные разрешения.

Ответ

Разрешения Описание разрешения
BLUETOOTH Позволяет приложениям подключаться к сопряженным устройствам Bluetooth
ACCESS_NETWORK_STATE Позволяет приложениям получать доступ к информации о сетях
ACTIVITY_RECOGNITION Позволяет приложению распознавать физическую активность
INTERNET Разрешение отсутствует в манифесте
READ_CONTACTS Разрешение отсутствует в манифесте
Задача 5.2.(5 баллов)
Цвет. Ввод текста
Темы: XML, представление цветов в формате RGB в шестнадцатеричной и десятичной системах счисления

Условие

Определите цвет основного ELEMENT (задается случайно) приложения в THEME_COLOR теме (задается случайно). Ответ представьте в виде четырех чисел, введенных через пробел, представляющих компоненты Red, Green, Blue и Alpha соответственно. Каждое число должно быть в десятичной системе счисления, в диапазоне от 0 до 255.

Решение

Надо открыть XML-файлы темы и цветов, сопоставить их и определить цвет, после чего перевести его в десятичную систему счисления.

Ответ

Зависит от случайно сгенерированной пары (ELEMENT, THEME_COLOR).

Общий ответ для всех вариантов:

R G B A

Например, если (ELEMENT, THEME_COLOR)=(Action bar, Dark), то ответ для BRANCH_NAME=var1 будет:

47 91 237 0

Задача 5.3.(5 баллов)
Интернационализация. Ввод XML
Темы: XML, представление цветов в формате RGB в шестнадцатеричной и десятичной системах счисления

Условие

Интерфейс Android приложение магазина S-Store может отображаться на двух языках: русском и английском. Однако перевод приложения на английский язык еще не завершен. Составьте фрагмент XML, который бы позволил отображаться на английском языке строковый ресурс RESOURCE_NAME (задается случайно).

Решение

Надо открыть XML строковых ресурсов и перевести на английский язык соответствующий элемент, после чего составить необходимый XML-элемент для этого же ресурса на английском языке.

Ответ

Зависит от случайно сгенерированного параметра RESOURCE_NAME.

Общий ответ для всех вариантов:

<string name="RESOURCE_NAME"> RESOURCE_NAME_TRANSLATION</string>

Например, если RESOURCE_NAME=security, то ответ будет:

<string name="security">Security</string>
text slider background image text slider background image
text slider background image text slider background image text slider background image text slider background image