💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 85 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 30
В чём ключ к разбору строки «local ok,result=xpcall(function() return vm:call(request) end,»? Ответ должен описывать основной механизм раздела «Трассировка».
Lua Lua · Трассировка · разбор 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
Строку из раздела «Трассировка» нужно читать так: Высокая нагрузка GC бывает следствием аллокаций или сохранённых объектов.
Строку из раздела «Трассировка» нужно читать так: Время сборки, объём памяти и профиль ссылок нужно анализировать вместе.
Строку из раздела «Трассировка» нужно читать так: Временный адаптер без срока превращается в постоянный второй путь.
Строку из раздела «Трассировка» нужно читать так: Повторное создание VM может маскировать причину, но не объясняет владельца ссылки.
Строку из раздела «Трассировка» нужно читать так: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста.
Вопрос 3 из 30
Что должно пережить замену вспомогательных функций и имён переменных? Выберите гарантию, определяющую раздел «Трассировка».
Lua Lua · Трассировка · разбор 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
Эквивалентный рефакторинг раздела «Трассировка» сохраняет следующее: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста.
Эквивалентный рефакторинг раздела «Трассировка» сохраняет следующее: Временный адаптер без срока превращается в постоянный второй путь.
Эквивалентный рефакторинг раздела «Трассировка» сохраняет следующее: Высокая нагрузка GC бывает следствием аллокаций или сохранённых объектов.
Эквивалентный рефакторинг раздела «Трассировка» сохраняет следующее: Время сборки, объём памяти и профиль ссылок нужно анализировать вместе.
Эквивалентный рефакторинг раздела «Трассировка» сохраняет следующее: Повторное создание VM может маскировать причину, но не объясняет владельца ссылки.
Вопрос 6 из 30
Что нельзя заменить привычкой из другого языка при чтении этого кода? Ответ должен описывать основной механизм раздела «Утечка состояния».
Lua Lua · Утечка состояния · разбор 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"))
Поведение строки из раздела «Утечка состояния» определяется правилом: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
Поведение строки из раздела «Утечка состояния» определяется правилом: Технический долг описывают конкретным нарушенным контрактом, последствиями и владельцем, а не словом «старое».
Поведение строки из раздела «Утечка состояния» определяется правилом: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста.
Поведение строки из раздела «Утечка состояния» определяется правилом: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
Поведение строки из раздела «Утечка состояния» определяется правилом: Утечка состояния проявляется как рост package.loaded, registry references, подписок или таблиц между задачами.
Вопрос 8 из 30
Какой смысл фрагмента нельзя спрятать в комментарии вместо проверки? Речь идёт о центральном правиле раздела «Утечка состояния».
Lua Lua · Утечка состояния · разбор 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
Контракт рефакторинга раздела «Утечка состояния»: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
Контракт рефакторинга раздела «Утечка состояния»: Утечка состояния проявляется как рост package.loaded, registry references, подписок или таблиц между задачами.
Контракт рефакторинга раздела «Утечка состояния»: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста.
Контракт рефакторинга раздела «Утечка состояния»: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
Контракт рефакторинга раздела «Утечка состояния»: Технический долг описывают конкретным нарушенным контрактом, последствиями и владельцем, а не словом «старое».
Вопрос 11 из 30
Что именно объясняет поведение строки «local before={kb=collectgarbage("count"),time=clock()}»? Ответ должен описывать основной механизм раздела «Нагрузка GC».
Lua Lua · Нагрузка 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)
В показанном фрагменте раздела «Нагрузка GC» важно следующее: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста; одна строка ошибки без контекста редко восстанавливает цепочку событий.
В показанном фрагменте раздела «Нагрузка GC» важно следующее: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест; тотальная перепись во время аварии повышает риск.
В показанном фрагменте раздела «Нагрузка GC» важно следующее: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
В показанном фрагменте раздела «Нагрузка GC» важно следующее: Высокая нагрузка GC бывает следствием аллокаций или сохранённых объектов; время сборки, объём памяти и профиль ссылок нужно анализировать вместе.
В показанном фрагменте раздела «Нагрузка GC» важно следующее: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
Вопрос 12 из 30
Что здесь важнее проверить, чем само отсутствие ошибки? Выберите именно проверяемую границу раздела «Нагрузка GC».
Lua Lua · Нагрузка 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()
Второй запуск раздела «Нагрузка GC» нужен, чтобы увидеть: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста; одна строка ошибки без контекста редко восстанавливает цепочку событий.
Второй запуск раздела «Нагрузка GC» нужен, чтобы увидеть: Высокая нагрузка GC бывает следствием аллокаций или сохранённых объектов; время сборки, объём памяти и профиль ссылок нужно анализировать вместе.
Второй запуск раздела «Нагрузка GC» нужен, чтобы увидеть: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
Второй запуск раздела «Нагрузка GC» нужен, чтобы увидеть: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест; тотальная перепись во время аварии повышает риск.
Второй запуск раздела «Нагрузка GC» нужен, чтобы увидеть: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
Вопрос 13 из 30
После рефакторинга тесты должны защищать одно правило. Какое? Выберите гарантию, определяющую раздел «Нагрузка GC».
Lua Lua · Нагрузка 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
После упрощения кода раздела «Нагрузка GC» по-прежнему верно: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста; одна строка ошибки без контекста редко восстанавливает цепочку событий.
После упрощения кода раздела «Нагрузка GC» по-прежнему верно: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест; тотальная перепись во время аварии повышает риск.
После упрощения кода раздела «Нагрузка GC» по-прежнему верно: Высокая нагрузка GC бывает следствием аллокаций или сохранённых объектов; время сборки, объём памяти и профиль ссылок нужно анализировать вместе.
После упрощения кода раздела «Нагрузка GC» по-прежнему верно: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
После упрощения кода раздела «Нагрузка GC» по-прежнему верно: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
Вопрос 21 из 30
Какое правило останется верным на другом входе этого же фрагмента? Нужна именно центральная гарантия раздела «Технический долг».
Lua Lua · Технический долг · разбор 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"})
Для этого кода в разделе «Технический долг» нужно учитывать: Технический долг описывают конкретным нарушенным контрактом, последствиями и владельцем, а не словом «старое».
Для этого кода в разделе «Технический долг» нужно учитывать: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
Для этого кода в разделе «Технический долг» нужно учитывать: Утечка состояния проявляется как рост package.loaded, registry references, подписок или таблиц между задачами.
Для этого кода в разделе «Технический долг» нужно учитывать: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста.
Для этого кода в разделе «Технический долг» нужно учитывать: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
Вопрос 22 из 30
Где этот код может повести себя иначе на границе? Нужен отрицательный сценарий для раздела «Технический долг».
Lua Lua · Технический долг · разбор 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()
Для раздела «Технический долг» отдельным тестом подтверждают: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест; тотальная перепись во время аварии повышает риск.
Для раздела «Технический долг» отдельным тестом подтверждают: Технический долг описывают конкретным нарушенным контрактом, последствиями и владельцем, а не словом «старое»; такой долг можно приоритизировать рядом с функциональной работой.
Для раздела «Технический долг» отдельным тестом подтверждают: Утечка состояния проявляется как рост package.loaded, registry references, подписок или таблиц между задачами; повторное создание VM может маскировать причину, но не объясняет владельца ссылки.
Для раздела «Технический долг» отдельным тестом подтверждают: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста; одна строка ошибки без контекста редко восстанавливает цепочку событий.
Для раздела «Технический долг» отдельным тестом подтверждают: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию; временный адаптер без срока превращается в постоянный второй путь.
Вопрос 23 из 30
Какое требование стоит закрепить тестом до начала рефакторинга? Речь идёт о центральном правиле раздела «Технический долг».
Lua Lua · Технический долг · разбор 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
В разделе «Технический долг» нельзя потерять правило: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
В разделе «Технический долг» нельзя потерять правило: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
В разделе «Технический долг» нельзя потерять правило: Утечка состояния проявляется как рост package.loaded, registry references, подписок или таблиц между задачами.
В разделе «Технический долг» нельзя потерять правило: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста.
В разделе «Технический долг» нельзя потерять правило: Технический долг описывают конкретным нарушенным контрактом, последствиями и владельцем, а не словом «старое».
Вопрос 26 из 30
Почему этот фрагмент ведёт себя именно так? Выберите основное правило раздела «Эволюция архитектуры».
Lua Lua · Эволюция архитектуры · разбор 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)
Центральный механизм раздела «Эволюция архитектуры»: Высокая нагрузка GC бывает следствием аллокаций или сохранённых объектов; время сборки, объём памяти и профиль ссылок нужно анализировать вместе.
Центральный механизм раздела «Эволюция архитектуры»: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
Центральный механизм раздела «Эволюция архитектуры»: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
Центральный механизм раздела «Эволюция архитектуры»: Технический долг описывают конкретным нарушенным контрактом, последствиями и владельцем, а не словом «старое».
Центральный механизм раздела «Эволюция архитектуры»: Утечка состояния проявляется как рост package.loaded, registry references, подписок или таблиц между задачами.
Вопрос 28 из 30
Что нельзя считать деталью реализации в этом коде? Выберите гарантию, определяющую раздел «Эволюция архитектуры».
Lua Lua · Эволюция архитектуры · разбор 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
После правки раздела «Эволюция архитектуры» должно оставаться верным: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию.
После правки раздела «Эволюция архитектуры» должно оставаться верным: Утечка состояния проявляется как рост package.loaded, registry references, подписок или таблиц между задачами.
После правки раздела «Эволюция архитектуры» должно оставаться верным: Высокая нагрузка GC бывает следствием аллокаций или сохранённых объектов; время сборки, объём памяти и профиль ссылок нужно анализировать вместе.
После правки раздела «Эволюция архитектуры» должно оставаться верным: Технический долг описывают конкретным нарушенным контрактом, последствиями и владельцем, а не словом «старое».
После правки раздела «Эволюция архитектуры» должно оставаться верным: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест.
Вопрос 30 из 30
Какое утверждение о разделе «Эволюция архитектуры» полезно и при чтении кода, и при ревью? Выберите описание, объединяющее механизм и границу раздела «Эволюция архитектуры».
Для раздела «Эволюция архитектуры» верно: Эволюция архитектуры должна уменьшать общие состояния, делать границы версионируемыми и позволять поэтапную миграцию; временный адаптер без срока превращается в постоянный второй путь.
Для раздела «Эволюция архитектуры» верно: Утечка состояния проявляется как рост package.loaded, registry references, подписок или таблиц между задачами; повторное создание VM может маскировать причину, но не объясняет владельца ссылки.
Для раздела «Эволюция архитектуры» верно: Технический долг описывают конкретным нарушенным контрактом, последствиями и владельцем, а не словом «старое»; такой долг можно приоритизировать рядом с функциональной работой.
Для раздела «Эволюция архитектуры» верно: Трассировка должна связывать Lua traceback с запросом, версией chunk и вызовом хоста; одна строка ошибки без контекста редко восстанавливает цепочку событий.
Для раздела «Эволюция архитектуры» верно: План исправления сначала ограничивает ущерб и добавляет наблюдаемость, затем устраняет корень и включает регрессионный тест; тотальная перепись во время аварии повышает риск.