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

Расследование сбоя Lua-подсистемы

Тест по теме «Расследование сбоя Lua-подсистемы» проверяет чтение кода, поиск скрытых допущений и выбор решения для обычных и граничных сценариев. В нём 30 вопросов, из них 18 содержат фрагменты Lua. Условия отдельно отмечают случаи, зависящие от версии языка или внешней библиотеки.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 85 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 30
В чём ключ к разбору строки «local ok,result=xpcall(function() return vm:call(request) end,»? Ответ должен описывать основной механизм раздела «Трассировка».
LuaLua · Трассировка · разбор 1
local function run_traced(request)
  local span=trace:start("lua.run",{request=request.id,script=release.id})
  local ok,result=xpcall(function() return vm:call(request) end,
    function(err) return debug.traceback(err,2) end)
  span:finish({ok=ok,error=not ok and result or nil})
  return ok,result
end
Вопрос 2 из 30
Какое допущение здесь опасно оставлять без повторного запуска? Ищется граничное следствие правила из раздела «Трассировка».
LuaLua · Трассировка · разбор 2
local function reproduce_case()
  local function run_traced(request)
    local span=trace:start("lua.run",{request=request.id,script=release.id})
    local ok,result=xpcall(function() return vm:call(request) end,
      function(err) return debug.traceback(err,2) end)
    span:finish({ok=ok,error=not ok and result or nil})
    return ok,result
  end
end
reproduce_case()
Вопрос 3 из 30
Что должно пережить замену вспомогательных функций и имён переменных? Выберите гарантию, определяющую раздел «Трассировка».
LuaLua · Трассировка · разбор 3
do
  local function run_traced(request)
    local span=trace:start("lua.run",{request=request.id,script=release.id})
    local ok,result=xpcall(function() return vm:call(request) end,
      function(err) return debug.traceback(err,2) end)
    span:finish({ok=ok,error=not ok and result or nil})
    return ok,result
  end
end
Вопрос 4 из 30
Новый интерфейс скрывает детали раздела «Трассировка». Что всё равно должно быть явно проверяемо? Ответ должен выражать проверяемое следствие раздела «Трассировка».
Вопрос 5 из 30
Что отличает корректное понимание раздела «Трассировка» от правдоподобного заблуждения? Выберите описание, объединяющее механизм и границу раздела «Трассировка».
Вопрос 6 из 30
Что нельзя заменить привычкой из другого языка при чтении этого кода? Ответ должен описывать основной механизм раздела «Утечка состояния».
LuaLua · Утечка состояния · разбор 1
metrics.gauge("lua_registry_refs",registry_ref_count())
metrics.gauge("lua_package_loaded",count(package.loaded))
for i=1,10000 do run_request(sample) end
assert_stable(metrics.history("lua_registry_refs"))
Вопрос 7 из 30
Что здесь важнее проверить, чем само отсутствие ошибки? Нужен отрицательный сценарий для раздела «Утечка состояния».
LuaLua · Утечка состояния · разбор 2
local function reproduce_case()
  metrics.gauge("lua_registry_refs",registry_ref_count())
  metrics.gauge("lua_package_loaded",count(package.loaded))
  for i=1,10000 do run_request(sample) end
  assert_stable(metrics.history("lua_registry_refs"))
end
reproduce_case()
Вопрос 8 из 30
Какой смысл фрагмента нельзя спрятать в комментарии вместо проверки? Речь идёт о центральном правиле раздела «Утечка состояния».
LuaLua · Утечка состояния · разбор 3
do
  metrics.gauge("lua_registry_refs",registry_ref_count())
  metrics.gauge("lua_package_loaded",count(package.loaded))
  for i=1,10000 do run_request(sample) end
  assert_stable(metrics.history("lua_registry_refs"))
end
Вопрос 9 из 30
Для раздела «Утечка состояния» выбирают между коротким трюком и ясным контрактом. Что предпочтительнее? Выберите практическое следствие раздела «Утечка состояния».
Вопрос 10 из 30
Какое правило раздела «Утечка состояния» стоит закрепить в тестах? Нужна полная формулировка раздела «Утечка состояния».
Вопрос 11 из 30
Что именно объясняет поведение строки «local before={kb=collectgarbage("count"),time=clock()}»? Ответ должен описывать основной механизм раздела «Нагрузка GC».
LuaLua · Нагрузка GC · разбор 1
local before={kb=collectgarbage("count"),time=clock()}
collectgarbage("collect")
local full={kb=collectgarbage("count"),time=clock()-before.time}
profile_allocations(workload)
print(before.kb,full.kb,full.time)
Вопрос 12 из 30
Что здесь важнее проверить, чем само отсутствие ошибки? Выберите именно проверяемую границу раздела «Нагрузка GC».
LuaLua · Нагрузка GC · разбор 2
local function reproduce_case()
  local before={kb=collectgarbage("count"),time=clock()}
  collectgarbage("collect")
  local full={kb=collectgarbage("count"),time=clock()-before.time}
  profile_allocations(workload)
  print(before.kb,full.kb,full.time)
end
reproduce_case()
Вопрос 13 из 30
После рефакторинга тесты должны защищать одно правило. Какое? Выберите гарантию, определяющую раздел «Нагрузка GC».
LuaLua · Нагрузка GC · разбор 3
do
  local before={kb=collectgarbage("count"),time=clock()}
  collectgarbage("collect")
  local full={kb=collectgarbage("count"),time=clock()-before.time}
  profile_allocations(workload)
  print(before.kb,full.kb,full.time)
end
Вопрос 14 из 30
После переноса кода раздел «Нагрузка GC» стал работать иначе. На какое правило опереться при исправлении? Нужна эксплуатационная граница раздела «Нагрузка GC».
Вопрос 15 из 30
Какое правило лучше всего описывает границы раздела «Нагрузка GC»? Нужна полная формулировка раздела «Нагрузка GC».
Вопрос 16 из 30
Какое утверждение объясняет результат без скрытых допущений? Нужна именно центральная гарантия раздела «План исправления».
LuaLua · План исправления · разбор 1
if error_rate>threshold then route_to_previous_release() end
enable_extra_metrics(case_id)
reproduce_with_snapshot(snapshot)
patch=smallest_safe_change(root_cause)
run_regression(patch)
Вопрос 17 из 30
Что здесь важнее проверить, чем само отсутствие ошибки? Выберите именно проверяемую границу раздела «План исправления».
LuaLua · План исправления · разбор 2
local function reproduce_case()
  if error_rate>threshold then route_to_previous_release() end
  enable_extra_metrics(case_id)
  reproduce_with_snapshot(snapshot)
  patch=smallest_safe_change(root_cause)
  run_regression(patch)
end
reproduce_case()
Вопрос 18 из 30
Что здесь является частью контракта, а не случайностью текущей записи? Выберите гарантию, определяющую раздел «План исправления».
LuaLua · План исправления · разбор 3
do
  if error_rate>threshold then route_to_previous_release() end
  enable_extra_metrics(case_id)
  reproduce_with_snapshot(snapshot)
  patch=smallest_safe_change(root_cause)
  run_regression(patch)
end
Вопрос 19 из 30
Команда сокращает код в разделе «План исправления». Как не потерять важное граничное поведение? Ответ должен выражать проверяемое следствие раздела «План исправления».
Вопрос 20 из 30
Какое правило лучше всего описывает границы раздела «План исправления»? Нужна полная формулировка раздела «План исправления».
Вопрос 21 из 30
Какое правило останется верным на другом входе этого же фрагмента? Нужна именно центральная гарантия раздела «Технический долг».
LuaLua · Технический долг · разбор 1
debt:add({contract="VM returned to pool with active subscriptions",
 impact="cross-request callbacks and memory growth",owner="runtime",
 evidence=incident_id,exit="reset verifies zero subscriptions"})
Вопрос 22 из 30
Где этот код может повести себя иначе на границе? Нужен отрицательный сценарий для раздела «Технический долг».
LuaLua · Технический долг · разбор 2
local function reproduce_case()
  debt:add({contract="VM returned to pool with active subscriptions",
   impact="cross-request callbacks and memory growth",owner="runtime",
   evidence=incident_id,exit="reset verifies zero subscriptions"})
end
reproduce_case()
Вопрос 23 из 30
Какое требование стоит закрепить тестом до начала рефакторинга? Речь идёт о центральном правиле раздела «Технический долг».
LuaLua · Технический долг · разбор 3
do
  debt:add({contract="VM returned to pool with active subscriptions",
   impact="cross-request callbacks and memory growth",owner="runtime",
   evidence=incident_id,exit="reset verifies zero subscriptions"})
end
Вопрос 24 из 30
Решение по разделу «Технический долг» должно пережить обновление зависимости. Что фиксировать в контракте? Нужна эксплуатационная граница раздела «Технический долг».
Вопрос 25 из 30
Что нельзя вывести из одного удачного примера, но нужно знать о разделе «Технический долг»? Ответ должен охватывать весь раздел «Технический долг».
Вопрос 26 из 30
Почему этот фрагмент ведёт себя именно так? Выберите основное правило раздела «Эволюция архитектуры».
LuaLua · Эволюция архитектуры · разбор 1
local adapter=v1_to_v2(old_api)
registry:publish("v2",new_api)
traffic:shift({v1=90,v2=10})
compare_results()
traffic:shift({v1=0,v2=100})
remove_adapter_before(deadline)
Вопрос 27 из 30
Что должен поймать отрицательный тест для этого фрагмента? Ищется граничное следствие правила из раздела «Эволюция архитектуры».
LuaLua · Эволюция архитектуры · разбор 2
local function reproduce_case()
  local adapter=v1_to_v2(old_api)
  registry:publish("v2",new_api)
  traffic:shift({v1=90,v2=10})
  compare_results()
  traffic:shift({v1=0,v2=100})
  remove_adapter_before(deadline)
end
reproduce_case()
Вопрос 28 из 30
Что нельзя считать деталью реализации в этом коде? Выберите гарантию, определяющую раздел «Эволюция архитектуры».
LuaLua · Эволюция архитектуры · разбор 3
do
  local adapter=v1_to_v2(old_api)
  registry:publish("v2",new_api)
  traffic:shift({v1=90,v2=10})
  compare_results()
  traffic:shift({v1=0,v2=100})
  remove_adapter_before(deadline)
end
Вопрос 29 из 30
Какой принцип сделает реализацию «Эволюция архитектуры» устойчивой, а не просто удачной на одном примере? Выберите практическое следствие раздела «Эволюция архитектуры».
Вопрос 30 из 30
Какое утверждение о разделе «Эволюция архитектуры» полезно и при чтении кода, и при ревью? Выберите описание, объединяющее механизм и границу раздела «Эволюция архитектуры».

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

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

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

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