KT Kotlin  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Серверный Kotlin

Серверный Kotlin проверяется на маршрутах, корутинах, доступе к данным и границах транзакций в Ktor или Spring. Нужно замечать блокирующие участки, потерю контекста запроса и архитектурные решения, которые усложняют тестирование и восстановление после сбоя.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 6 тематических шкал.
Вопрос 1 из 30
Какое свойство нельзя вывести только из слова `suspend`?
KotlinДоступ к данным · Suspend-функция внутри транзакции
// Проследите фактическое выполнение без изменения кода.
suspend fun transfer(from: Id, to: Id, amount: Money) = database.transaction {
    debit(from, amount)
    credit(to, amount)
}
Вопрос 2 из 30
Что точнее описывает механику фрагмента «In-process HTTP-тест»?
KotlinТестирование и инструменты · In-process HTTP-тест
// На ревью требуется объяснить причину поведения.
testApplication {
    application { module(fakeRepo) }
    client.get("/users/42").apply {
        assertEquals(HttpStatusCode.OK, status)
    }
}
Вопрос 3 из 30
Что изменить в «Транзакционный outbox», чтобы скрытое допущение стало явным контрактом?
KotlinАрхитектура и конкурентность · Транзакционный outbox
// Сохраните назначение фрагмента, но укрепите его контракт.
class OrderService(
    private val repo: OrderRepository,
    private val outbox: Outbox
) {
    suspend fun place(cmd: PlaceOrder) = repo.transaction {
        val order = Order.create(cmd)
        save(order)
        outbox.add(OrderPlaced(order.id))
        order.id
    }
}
Вопрос 4 из 30
Что изменить в «Маршрут как малая часть выбора», чтобы скрытое допущение стало явным контрактом?
KotlinKtor или Spring · Маршрут как малая часть выбора
// Сохраните назначение фрагмента, но укрепите его контракт.
// Ktor
fun Application.healthModule() {
    routing {
        get("/health") { call.respondText("ok") }
    }
}
Вопрос 5 из 30
Какой редкий случай способен сломать наивную трактовку «Три HTTP-исхода»?
Вопрос 6 из 30
В «Параллельная агрегация запросов» выбрали решение: Ограничить параллелизм, задать timeout и выбрать fail-fast либо частичный результат как явный доменный контракт. Какова его реальная цена?
Вопрос 7 из 30
Какое изменение лучше всего защищает границу «In-process HTTP-тест»?
KotlinТестирование и инструменты · In-process HTTP-тест
// Сохраните назначение фрагмента, но укрепите его контракт.
testApplication {
    application { module(fakeRepo) }
    client.get("/users/42").apply {
        assertEquals(HttpStatusCode.OK, status)
    }
}
Вопрос 8 из 30
Где упрощённое объяснение «Транзакционный outbox» перестаёт работать?
Вопрос 9 из 30
Где упрощённое объяснение «Маршрут как малая часть выбора» перестаёт работать?
Вопрос 10 из 30
Что может усложниться в сопровождении после изменения «Три HTTP-исхода»: Вынести проверку параметров в typed request/validation и централизовать единый формат ошибок?
Вопрос 11 из 30
Как поведёт себя функция при ошибке одного `load`?
KotlinКорутины · Параллельная агрегация запросов
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
suspend fun aggregate(ids: List<String>): List<Item> = coroutineScope {
    ids.map { id -> async { client.load(id) } }.awaitAll()
}
Вопрос 12 из 30
Какой контракт определяет наблюдаемый результат «Suspend-функция внутри транзакции»?
KotlinДоступ к данным · Suspend-функция внутри транзакции
// На ревью требуется объяснить причину поведения.
suspend fun transfer(from: Id, to: Id, amount: Money) = database.transaction {
    debit(from, amount)
    credit(to, amount)
}
Вопрос 13 из 30
Решение для «Транзакционный outbox»: Добавить ключ идемпотентности, статус/lease публикации, метрики отставания и безопасную повторную обработку. Что в нём остаётся не бесплатным?
Вопрос 14 из 30
Решение для «Маршрут как малая часть выбора»: Собрать тонкий вертикальный прототип с реальной авторизацией, базой, метриками и deployment, а не сравнивать учебные маршруты. Что в нём остаётся не бесплатным?
Вопрос 15 из 30
Какие три исхода явно разделены?
KotlinМаршруты · Три HTTP-исхода
// Проследите фактическое выполнение без изменения кода.
get("/users/{id}") {
    val id = call.parameters["id"] ?: return@get call.respond(HttpStatusCode.BadRequest)
    val user = service.find(id) ?: return@get call.respond(HttpStatusCode.NotFound)
    call.respond(user)
}
Вопрос 16 из 30
Какой контракт снимает спор о причине поведения «Параллельная агрегация запросов»?
KotlinКорутины · Параллельная агрегация запросов
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
suspend fun aggregate(ids: List<String>): List<Item> = coroutineScope {
    ids.map { id -> async { client.load(id) } }.awaitAll()
}
Вопрос 17 из 30
Какую правку выбрать, чтобы сохранить назначение «Suspend-функция внутри транзакции» и убрать хрупкость?
KotlinДоступ к данным · Suspend-функция внутри транзакции
// Сохраните назначение фрагмента, но укрепите его контракт.
suspend fun transfer(from: Id, to: Id, amount: Money) = database.transaction {
    debit(from, amount)
    credit(to, amount)
}
Вопрос 18 из 30
Какой дополнительный сценарий нужен для «In-process HTTP-тест»?
Вопрос 19 из 30
Что определяет выбор Ktor или Spring сильнее синтаксиса маршрута?
KotlinKtor или Spring · Маршрут как малая часть выбора
// Проследите фактическое выполнение без изменения кода.
// Ktor
fun Application.healthModule() {
    routing {
        get("/health") { call.respondText("ok") }
    }
}
Вопрос 20 из 30
Какое правило нужно применить, чтобы объяснить «Три HTTP-исхода»?
KotlinМаршруты · Три HTTP-исхода
// На ревью требуется объяснить причину поведения.
get("/users/{id}") {
    val id = call.parameters["id"] ?: return@get call.respond(HttpStatusCode.BadRequest)
    val user = service.find(id) ?: return@get call.respond(HttpStatusCode.NotFound)
    call.respond(user)
}
Вопрос 21 из 30
Какое изменение лучше всего защищает границу «Параллельная агрегация запросов»?
KotlinКорутины · Параллельная агрегация запросов
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
suspend fun aggregate(ids: List<String>): List<Item> = coroutineScope {
    ids.map { id -> async { client.load(id) } }.awaitAll()
}
Вопрос 22 из 30
Какой контрпример точнее всего показывает границу «Suspend-функция внутри транзакции»?
Вопрос 23 из 30
Какое ограничение сохранится после правки «In-process HTTP-тест»: Проверить успешный, validation, auth и сценарии отказа; для базы поднимать совместимый контейнер и накатывать реальные migrations?
Вопрос 24 из 30
Какой сбой предотвращает outbox в той же транзакции?
KotlinАрхитектура и конкурентность · Транзакционный outbox
// Проследите фактическое выполнение без изменения кода.
class OrderService(
    private val repo: OrderRepository,
    private val outbox: Outbox
) {
    suspend fun place(cmd: PlaceOrder) = repo.transaction {
        val order = Order.create(cmd)
        save(order)
        outbox.add(OrderPlaced(order.id))
        order.id
    }
}
Вопрос 25 из 30
Какая небольшая правка заметно повышает надёжность «Три HTTP-исхода»?
KotlinМаршруты · Три HTTP-исхода
// Сохраните назначение фрагмента, но укрепите его контракт.
get("/users/{id}") {
    val id = call.parameters["id"] ?: return@get call.respond(HttpStatusCode.BadRequest)
    val user = service.find(id) ?: return@get call.respond(HttpStatusCode.NotFound)
    call.respond(user)
}
Вопрос 26 из 30
Что добавить в регрессионный набор для «Параллельная агрегация запросов»?
Вопрос 27 из 30
В «Suspend-функция внутри транзакции» выбрали решение: Использовать поддерживаемый транзакционный оператор, не запускать параллельные запросы внутри одной connection-транзакции без гарантии драйвера. Какова его реальная цена?
Вопрос 28 из 30
Что даёт такой тест по сравнению с прямым вызовом service?
KotlinТестирование и инструменты · In-process HTTP-тест
// Проследите фактическое выполнение без изменения кода.
testApplication {
    application { module(fakeRepo) }
    client.get("/users/42").apply {
        assertEquals(HttpStatusCode.OK, status)
    }
}
Вопрос 29 из 30
На какой контракт языка или библиотеки опирается «Транзакционный outbox»?
KotlinАрхитектура и конкурентность · Транзакционный outbox
// На ревью требуется объяснить причину поведения.
class OrderService(
    private val repo: OrderRepository,
    private val outbox: Outbox
) {
    suspend fun place(cmd: PlaceOrder) = repo.transaction {
        val order = Order.create(cmd)
        save(order)
        outbox.add(OrderPlaced(order.id))
        order.id
    }
}
Вопрос 30 из 30
Что в семантике Kotlin или используемого API объясняет «Маршрут как малая часть выбора»?
KotlinKtor или Spring · Маршрут как малая часть выбора
// На ревью требуется объяснить причину поведения.
// Ktor
fun Application.healthModule() {
    routing {
        get("/health") { call.respondText("ok") }
    }
}

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу